@meonode/canvas 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/cjs/canvas/canvas.helper.js +0 -230
  2. package/dist/cjs/canvas/canvas.helper.js.map +1 -1
  3. package/dist/cjs/canvas/chart.canvas.js +70 -144
  4. package/dist/cjs/canvas/chart.canvas.js.map +1 -1
  5. package/dist/cjs/canvas/grid.canvas.js.map +1 -1
  6. package/dist/cjs/canvas/image.canvas.js +2 -2
  7. package/dist/cjs/canvas/image.canvas.js.map +1 -1
  8. package/dist/cjs/canvas/layout.canvas.js +23 -16
  9. package/dist/cjs/canvas/layout.canvas.js.map +1 -1
  10. package/dist/cjs/canvas/root.canvas.js +23 -117
  11. package/dist/cjs/canvas/root.canvas.js.map +1 -1
  12. package/dist/cjs/canvas/text.canvas.js +2 -2
  13. package/dist/cjs/canvas/text.canvas.js.map +1 -1
  14. package/dist/cjs/constant/common.const.js.map +1 -1
  15. package/dist/cjs/{canvas → src/canvas}/canvas.helper.d.ts +1 -20
  16. package/dist/cjs/src/canvas/canvas.helper.d.ts.map +1 -0
  17. package/dist/{esm → cjs/src}/canvas/canvas.type.d.ts +1 -12
  18. package/dist/cjs/src/canvas/canvas.type.d.ts.map +1 -0
  19. package/dist/cjs/{canvas → src/canvas}/chart.canvas.d.ts +1 -1
  20. package/dist/cjs/src/canvas/chart.canvas.d.ts.map +1 -0
  21. package/dist/cjs/src/canvas/grid.canvas.d.ts.map +1 -0
  22. package/dist/{esm → cjs/src}/canvas/image.canvas.d.ts +1 -1
  23. package/dist/cjs/src/canvas/image.canvas.d.ts.map +1 -0
  24. package/dist/{esm → cjs/src}/canvas/layout.canvas.d.ts +2 -2
  25. package/dist/cjs/src/canvas/layout.canvas.d.ts.map +1 -0
  26. package/dist/{esm → cjs/src}/canvas/root.canvas.d.ts +3 -2
  27. package/dist/cjs/src/canvas/root.canvas.d.ts.map +1 -0
  28. package/dist/cjs/{canvas → src/canvas}/text.canvas.d.ts +1 -1
  29. package/dist/cjs/src/canvas/text.canvas.d.ts.map +1 -0
  30. package/dist/cjs/src/constant/common.const.d.ts +18 -0
  31. package/dist/cjs/src/constant/common.const.d.ts.map +1 -0
  32. package/dist/cjs/src/index.d.ts.map +1 -0
  33. package/dist/cjs/src/util/disk.cache.d.ts.map +1 -0
  34. package/dist/cjs/src/worker/comlink.pool.d.ts +30 -0
  35. package/dist/cjs/src/worker/comlink.pool.d.ts.map +1 -0
  36. package/dist/cjs/src/worker/comlink.setup.d.ts +4 -0
  37. package/dist/cjs/src/worker/comlink.setup.d.ts.map +1 -0
  38. package/dist/cjs/src/worker/render.worker.d.ts.map +1 -0
  39. package/dist/cjs/src/worker/worker.types.d.ts +13 -0
  40. package/dist/cjs/src/worker/worker.types.d.ts.map +1 -0
  41. package/dist/cjs/util/disk.cache.js.map +1 -1
  42. package/dist/cjs/worker/comlink.pool.js +164 -0
  43. package/dist/cjs/worker/comlink.pool.js.map +1 -0
  44. package/dist/cjs/worker/comlink.setup.js +53 -0
  45. package/dist/cjs/worker/comlink.setup.js.map +1 -0
  46. package/dist/cjs/worker/render.worker.js +58 -61
  47. package/dist/cjs/worker/render.worker.js.map +1 -1
  48. package/dist/esm/canvas/canvas.helper.js +1 -230
  49. package/dist/esm/canvas/chart.canvas.js +71 -145
  50. package/dist/esm/canvas/image.canvas.js +2 -2
  51. package/dist/esm/canvas/layout.canvas.js +23 -16
  52. package/dist/esm/canvas/root.canvas.js +23 -116
  53. package/dist/esm/canvas/text.canvas.js +2 -2
  54. package/dist/esm/{canvas → src/canvas}/canvas.helper.d.ts +1 -20
  55. package/dist/esm/src/canvas/canvas.helper.d.ts.map +1 -0
  56. package/dist/{cjs → esm/src}/canvas/canvas.type.d.ts +1 -12
  57. package/dist/esm/src/canvas/canvas.type.d.ts.map +1 -0
  58. package/dist/esm/{canvas → src/canvas}/chart.canvas.d.ts +1 -1
  59. package/dist/esm/src/canvas/chart.canvas.d.ts.map +1 -0
  60. package/dist/esm/src/canvas/grid.canvas.d.ts.map +1 -0
  61. package/dist/{cjs → esm/src}/canvas/image.canvas.d.ts +1 -1
  62. package/dist/esm/src/canvas/image.canvas.d.ts.map +1 -0
  63. package/dist/{cjs → esm/src}/canvas/layout.canvas.d.ts +2 -2
  64. package/dist/esm/src/canvas/layout.canvas.d.ts.map +1 -0
  65. package/dist/{cjs → esm/src}/canvas/root.canvas.d.ts +3 -2
  66. package/dist/esm/src/canvas/root.canvas.d.ts.map +1 -0
  67. package/dist/esm/{canvas → src/canvas}/text.canvas.d.ts +1 -1
  68. package/dist/esm/src/canvas/text.canvas.d.ts.map +1 -0
  69. package/dist/esm/src/constant/common.const.d.ts +18 -0
  70. package/dist/esm/src/constant/common.const.d.ts.map +1 -0
  71. package/dist/esm/src/index.d.ts.map +1 -0
  72. package/dist/esm/src/util/disk.cache.d.ts.map +1 -0
  73. package/dist/esm/src/worker/comlink.pool.d.ts +30 -0
  74. package/dist/esm/src/worker/comlink.pool.d.ts.map +1 -0
  75. package/dist/esm/src/worker/comlink.setup.d.ts +4 -0
  76. package/dist/esm/src/worker/comlink.setup.d.ts.map +1 -0
  77. package/dist/esm/src/worker/render.worker.d.ts.map +1 -0
  78. package/dist/esm/src/worker/worker.types.d.ts +13 -0
  79. package/dist/esm/src/worker/worker.types.d.ts.map +1 -0
  80. package/dist/esm/worker/comlink.pool.js +139 -0
  81. package/dist/esm/worker/comlink.setup.js +30 -0
  82. package/dist/esm/worker/render.worker.js +38 -60
  83. package/package.json +9 -8
  84. package/dist/cjs/canvas/canvas.helper.d.ts.map +0 -1
  85. package/dist/cjs/canvas/canvas.type.d.ts.map +0 -1
  86. package/dist/cjs/canvas/chart.canvas.d.ts.map +0 -1
  87. package/dist/cjs/canvas/grid.canvas.d.ts.map +0 -1
  88. package/dist/cjs/canvas/image.canvas.d.ts.map +0 -1
  89. package/dist/cjs/canvas/layout.canvas.d.ts.map +0 -1
  90. package/dist/cjs/canvas/root.canvas.d.ts.map +0 -1
  91. package/dist/cjs/canvas/text.canvas.d.ts.map +0 -1
  92. package/dist/cjs/constant/common.const.d.ts +0 -37
  93. package/dist/cjs/constant/common.const.d.ts.map +0 -1
  94. package/dist/cjs/index.d.ts.map +0 -1
  95. package/dist/cjs/util/disk.cache.d.ts.map +0 -1
  96. package/dist/cjs/worker/render.worker.d.ts.map +0 -1
  97. package/dist/cjs/worker/worker.types.d.ts +0 -76
  98. package/dist/cjs/worker/worker.types.d.ts.map +0 -1
  99. package/dist/esm/canvas/canvas.helper.d.ts.map +0 -1
  100. package/dist/esm/canvas/canvas.type.d.ts.map +0 -1
  101. package/dist/esm/canvas/chart.canvas.d.ts.map +0 -1
  102. package/dist/esm/canvas/grid.canvas.d.ts.map +0 -1
  103. package/dist/esm/canvas/image.canvas.d.ts.map +0 -1
  104. package/dist/esm/canvas/layout.canvas.d.ts.map +0 -1
  105. package/dist/esm/canvas/root.canvas.d.ts.map +0 -1
  106. package/dist/esm/canvas/text.canvas.d.ts.map +0 -1
  107. package/dist/esm/constant/common.const.d.ts +0 -37
  108. package/dist/esm/constant/common.const.d.ts.map +0 -1
  109. package/dist/esm/index.d.ts.map +0 -1
  110. package/dist/esm/util/disk.cache.d.ts.map +0 -1
  111. package/dist/esm/worker/render.worker.d.ts.map +0 -1
  112. package/dist/esm/worker/worker.types.d.ts +0 -76
  113. package/dist/esm/worker/worker.types.d.ts.map +0 -1
  114. /package/dist/cjs/{canvas → src/canvas}/grid.canvas.d.ts +0 -0
  115. /package/dist/cjs/{index.d.ts → src/index.d.ts} +0 -0
  116. /package/dist/cjs/{util → src/util}/disk.cache.d.ts +0 -0
  117. /package/dist/cjs/{worker → src/worker}/render.worker.d.ts +0 -0
  118. /package/dist/esm/{canvas → src/canvas}/grid.canvas.d.ts +0 -0
  119. /package/dist/esm/{index.d.ts → src/index.d.ts} +0 -0
  120. /package/dist/esm/{util → src/util}/disk.cache.d.ts +0 -0
  121. /package/dist/esm/{worker → src/worker}/render.worker.d.ts +0 -0
@@ -209,234 +209,5 @@ function parsePercentage(value, base) {
209
209
  }
210
210
  return 0;
211
211
  }
212
- /**
213
- * Pre-processes a RootProps descriptor tree on the main thread before postMessage.
214
- * Executes function props against available data, stores results as serializable fields,
215
- * then strips remaining functions as a safety net.
216
- */
217
- class WorkerPreProcessor {
218
- static CHART_COLORS = ['#FF6384', '#36A2EB', '#FFCE56', '#4BC0C0', '#9966FF', '#FF9F40', '#C9CBCF'];
219
- static process(props) {
220
- const cloned = { ...props };
221
- if (cloned.children) {
222
- const childArray = Array.isArray(cloned.children) ? cloned.children : [cloned.children];
223
- cloned.children = childArray.map(child => {
224
- if (child && typeof child === 'object' && '__type' in child) {
225
- return this.processDescriptor(child);
226
- }
227
- return child;
228
- });
229
- }
230
- return this.stripNonSerializable(cloned);
231
- }
232
- static processDescriptor(desc) {
233
- if (desc.__type === 'Chart') {
234
- return this.processChartDescriptor(desc);
235
- }
236
- if ('children' in desc && desc.children) {
237
- return { ...desc, children: desc.children.map(c => this.processDescriptor(c)) };
238
- }
239
- return desc;
240
- }
241
- static processChartDescriptor(desc) {
242
- const props = { ...desc.props };
243
- const options = { ...(props.options || {}) };
244
- const chartType = props.type;
245
- const data = props.data;
246
- // xAxisLabelFormatter
247
- if (typeof options.xAxisLabelFormatter === 'function' && (chartType === 'bar' || chartType === 'line')) {
248
- const cartData = data;
249
- if (cartData.labels) {
250
- options._preComputedXAxisLabels = cartData.labels.map((label, index) => {
251
- try {
252
- return options.xAxisLabelFormatter(label, index);
253
- }
254
- catch (err) {
255
- console.warn(`[WorkerPreProcessor] xAxisLabelFormatter threw for label "${label}" at index ${index}:`, err);
256
- return label;
257
- }
258
- });
259
- }
260
- delete options.xAxisLabelFormatter;
261
- }
262
- // yAxisLabelFormatter
263
- if (typeof options.yAxisLabelFormatter === 'function' && (chartType === 'bar' || chartType === 'line')) {
264
- const cartData = data;
265
- const maxValue = Math.max(...cartData.datasets.flatMap((d) => d.data));
266
- const labels = [];
267
- for (let i = 0; i <= 5; i++) {
268
- const value = maxValue - (maxValue / 5) * i;
269
- try {
270
- labels.push(options.yAxisLabelFormatter(value));
271
- }
272
- catch (err) {
273
- console.warn(`[WorkerPreProcessor] yAxisLabelFormatter threw for value ${value}:`, err);
274
- labels.push(String(value));
275
- }
276
- }
277
- options._preComputedYAxisLabels = labels;
278
- delete options.yAxisLabelFormatter;
279
- }
280
- // renderLegendItem
281
- if (typeof options.renderLegendItem === 'function') {
282
- if (chartType === 'bar' || chartType === 'line') {
283
- const cartData = data;
284
- options._preComputedLegendItems = cartData.datasets.map((item, index) => {
285
- const color = item.color || this.generateColor(index);
286
- try {
287
- const result = options.renderLegendItem({ item, index, color });
288
- return this.nodeToDescriptor(result);
289
- }
290
- catch (err) {
291
- console.warn(`[WorkerPreProcessor] renderLegendItem threw at index ${index}:`, err);
292
- return null;
293
- }
294
- });
295
- }
296
- else {
297
- const pieData = data;
298
- options._preComputedLegendItems = pieData.map((item, index) => {
299
- const color = item.color || this.generateColor(index);
300
- try {
301
- const result = options.renderLegendItem({ item, index, color });
302
- return this.nodeToDescriptor(result);
303
- }
304
- catch (err) {
305
- console.warn(`[WorkerPreProcessor] renderLegendItem threw at index ${index}:`, err);
306
- return null;
307
- }
308
- });
309
- }
310
- delete options.renderLegendItem;
311
- }
312
- // renderLabelItem
313
- if (typeof options.renderLabelItem === 'function') {
314
- if (chartType === 'bar' || chartType === 'line') {
315
- const cartData = data;
316
- options._preComputedLabelItems = cartData.labels.map((label, index) => {
317
- try {
318
- const result = options.renderLabelItem({ item: label, index });
319
- return this.nodeToDescriptor(result);
320
- }
321
- catch (err) {
322
- console.warn(`[WorkerPreProcessor] renderLabelItem threw at index ${index}:`, err);
323
- return null;
324
- }
325
- });
326
- }
327
- else {
328
- const pieData = data;
329
- options._preComputedLabelItems = pieData.map((item, index) => {
330
- try {
331
- const result = options.renderLabelItem({ item, index });
332
- return this.nodeToDescriptor(result);
333
- }
334
- catch (err) {
335
- console.warn(`[WorkerPreProcessor] renderLabelItem threw at index ${index}:`, err);
336
- return null;
337
- }
338
- });
339
- }
340
- delete options.renderLabelItem;
341
- }
342
- // renderValueItem
343
- if (typeof options.renderValueItem === 'function' && (chartType === 'bar' || chartType === 'line')) {
344
- const cartData = data;
345
- options._preComputedValueItems = cartData.datasets.map((dataset, datasetIndex) => dataset.data.map((value, index) => {
346
- try {
347
- const result = options.renderValueItem({ item: value, index, datasetIndex });
348
- return this.nodeToDescriptor(result);
349
- }
350
- catch (err) {
351
- console.warn(`[WorkerPreProcessor] renderValueItem threw at dataset ${datasetIndex}, index ${index}:`, err);
352
- return null;
353
- }
354
- }));
355
- delete options.renderValueItem;
356
- }
357
- props.options = options;
358
- return { ...desc, props };
359
- }
360
- /**
361
- * Converts a BoxNode instance or CanvasElement to a CanvasElement.
362
- * Public API functions (Box(), Text(), etc.) already return CanvasElements,
363
- * but if someone returns an actual class instance, we convert it via initialProps.
364
- */
365
- static nodeToDescriptor(node) {
366
- if (!node)
367
- return node;
368
- // Already a CanvasElement (has __type)
369
- if (typeof node === 'object' && '__type' in node)
370
- return node;
371
- // Class instance (e.g. BoxNode, TextNode, ImageNode) — convert via duck-typing
372
- if (typeof node === 'object' && node.constructor !== Object) {
373
- if ('initialProps' in node && 'name' in node) {
374
- const { children, ...rest } = node.initialProps || {};
375
- const childArray = Array.isArray(children) ? children : children ? [children] : [];
376
- const convertedChildren = childArray
377
- .filter((c) => c)
378
- .map((c) => this.nodeToDescriptor(c))
379
- .filter((c) => !!c);
380
- const name = node.name;
381
- const type = name === 'TextNode'
382
- ? 'Text'
383
- : name === 'Row'
384
- ? 'Row'
385
- : name === 'Image'
386
- ? 'Image'
387
- : rest.flexDirection === Style.FlexDirection.Column
388
- ? 'Column'
389
- : 'Box';
390
- if (type === 'Text') {
391
- // TextNode stores original text in segments — fall back to joined segment text
392
- const text = node.segments?.map((s) => s.text).join('') ?? '';
393
- return { __type: 'Text', text, props: rest };
394
- }
395
- if (type === 'Image') {
396
- return { __type: 'Image', props: rest };
397
- }
398
- return {
399
- __type: type,
400
- props: rest,
401
- ...(convertedChildren.length > 0 ? { children: convertedChildren } : {}),
402
- };
403
- }
404
- console.warn('[WorkerPreProcessor] Render function returned an unrecognized class instance. Use descriptor functions (Box(), Text(), etc.) instead.');
405
- return null;
406
- }
407
- return node;
408
- }
409
- static generateColor(index) {
410
- return this.CHART_COLORS[index % this.CHART_COLORS.length];
411
- }
412
- static stripNonSerializable(obj) {
413
- if (obj === null || obj === undefined)
414
- return obj;
415
- if (typeof obj === 'function')
416
- return undefined;
417
- if (typeof obj === 'symbol')
418
- return undefined;
419
- if (typeof obj !== 'object')
420
- return obj;
421
- // Preserve binary data types
422
- if (Buffer.isBuffer(obj))
423
- return obj;
424
- if (obj instanceof ArrayBuffer)
425
- return obj;
426
- if (ArrayBuffer.isView(obj))
427
- return obj;
428
- if (Array.isArray(obj)) {
429
- return obj.map(item => this.stripNonSerializable(item));
430
- }
431
- const result = {};
432
- for (const key of Object.keys(obj)) {
433
- const value = obj[key];
434
- if (typeof value === 'function' || typeof value === 'symbol')
435
- continue;
436
- result[key] = this.stripNonSerializable(value);
437
- }
438
- return result;
439
- }
440
- }
441
212
 
442
- export { WorkerPreProcessor, drawBorders, drawRoundedRectPath, parseBorderRadius, parsePercentage };
213
+ export { drawBorders, drawRoundedRectPath, parseBorderRadius, parsePercentage };