@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.
- package/dist/cjs/canvas/canvas.helper.js +0 -230
- package/dist/cjs/canvas/canvas.helper.js.map +1 -1
- package/dist/cjs/canvas/chart.canvas.js +70 -144
- package/dist/cjs/canvas/chart.canvas.js.map +1 -1
- package/dist/cjs/canvas/grid.canvas.js.map +1 -1
- package/dist/cjs/canvas/image.canvas.js +2 -2
- package/dist/cjs/canvas/image.canvas.js.map +1 -1
- package/dist/cjs/canvas/layout.canvas.js +23 -16
- package/dist/cjs/canvas/layout.canvas.js.map +1 -1
- package/dist/cjs/canvas/root.canvas.js +23 -117
- package/dist/cjs/canvas/root.canvas.js.map +1 -1
- package/dist/cjs/canvas/text.canvas.js +2 -2
- package/dist/cjs/canvas/text.canvas.js.map +1 -1
- package/dist/cjs/constant/common.const.js.map +1 -1
- package/dist/cjs/{canvas → src/canvas}/canvas.helper.d.ts +1 -20
- package/dist/cjs/src/canvas/canvas.helper.d.ts.map +1 -0
- package/dist/{esm → cjs/src}/canvas/canvas.type.d.ts +1 -12
- package/dist/cjs/src/canvas/canvas.type.d.ts.map +1 -0
- package/dist/cjs/{canvas → src/canvas}/chart.canvas.d.ts +1 -1
- package/dist/cjs/src/canvas/chart.canvas.d.ts.map +1 -0
- package/dist/cjs/src/canvas/grid.canvas.d.ts.map +1 -0
- package/dist/{esm → cjs/src}/canvas/image.canvas.d.ts +1 -1
- package/dist/cjs/src/canvas/image.canvas.d.ts.map +1 -0
- package/dist/{esm → cjs/src}/canvas/layout.canvas.d.ts +2 -2
- package/dist/cjs/src/canvas/layout.canvas.d.ts.map +1 -0
- package/dist/{esm → cjs/src}/canvas/root.canvas.d.ts +3 -2
- package/dist/cjs/src/canvas/root.canvas.d.ts.map +1 -0
- package/dist/cjs/{canvas → src/canvas}/text.canvas.d.ts +1 -1
- package/dist/cjs/src/canvas/text.canvas.d.ts.map +1 -0
- package/dist/cjs/src/constant/common.const.d.ts +18 -0
- package/dist/cjs/src/constant/common.const.d.ts.map +1 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/util/disk.cache.d.ts.map +1 -0
- package/dist/cjs/src/worker/comlink.pool.d.ts +30 -0
- package/dist/cjs/src/worker/comlink.pool.d.ts.map +1 -0
- package/dist/cjs/src/worker/comlink.setup.d.ts +4 -0
- package/dist/cjs/src/worker/comlink.setup.d.ts.map +1 -0
- package/dist/cjs/src/worker/render.worker.d.ts.map +1 -0
- package/dist/cjs/src/worker/worker.types.d.ts +13 -0
- package/dist/cjs/src/worker/worker.types.d.ts.map +1 -0
- package/dist/cjs/util/disk.cache.js.map +1 -1
- package/dist/cjs/worker/comlink.pool.js +164 -0
- package/dist/cjs/worker/comlink.pool.js.map +1 -0
- package/dist/cjs/worker/comlink.setup.js +53 -0
- package/dist/cjs/worker/comlink.setup.js.map +1 -0
- package/dist/cjs/worker/render.worker.js +58 -61
- package/dist/cjs/worker/render.worker.js.map +1 -1
- package/dist/esm/canvas/canvas.helper.js +1 -230
- package/dist/esm/canvas/chart.canvas.js +71 -145
- package/dist/esm/canvas/image.canvas.js +2 -2
- package/dist/esm/canvas/layout.canvas.js +23 -16
- package/dist/esm/canvas/root.canvas.js +23 -116
- package/dist/esm/canvas/text.canvas.js +2 -2
- package/dist/esm/{canvas → src/canvas}/canvas.helper.d.ts +1 -20
- package/dist/esm/src/canvas/canvas.helper.d.ts.map +1 -0
- package/dist/{cjs → esm/src}/canvas/canvas.type.d.ts +1 -12
- package/dist/esm/src/canvas/canvas.type.d.ts.map +1 -0
- package/dist/esm/{canvas → src/canvas}/chart.canvas.d.ts +1 -1
- package/dist/esm/src/canvas/chart.canvas.d.ts.map +1 -0
- package/dist/esm/src/canvas/grid.canvas.d.ts.map +1 -0
- package/dist/{cjs → esm/src}/canvas/image.canvas.d.ts +1 -1
- package/dist/esm/src/canvas/image.canvas.d.ts.map +1 -0
- package/dist/{cjs → esm/src}/canvas/layout.canvas.d.ts +2 -2
- package/dist/esm/src/canvas/layout.canvas.d.ts.map +1 -0
- package/dist/{cjs → esm/src}/canvas/root.canvas.d.ts +3 -2
- package/dist/esm/src/canvas/root.canvas.d.ts.map +1 -0
- package/dist/esm/{canvas → src/canvas}/text.canvas.d.ts +1 -1
- package/dist/esm/src/canvas/text.canvas.d.ts.map +1 -0
- package/dist/esm/src/constant/common.const.d.ts +18 -0
- package/dist/esm/src/constant/common.const.d.ts.map +1 -0
- package/dist/esm/src/index.d.ts.map +1 -0
- package/dist/esm/src/util/disk.cache.d.ts.map +1 -0
- package/dist/esm/src/worker/comlink.pool.d.ts +30 -0
- package/dist/esm/src/worker/comlink.pool.d.ts.map +1 -0
- package/dist/esm/src/worker/comlink.setup.d.ts +4 -0
- package/dist/esm/src/worker/comlink.setup.d.ts.map +1 -0
- package/dist/esm/src/worker/render.worker.d.ts.map +1 -0
- package/dist/esm/src/worker/worker.types.d.ts +13 -0
- package/dist/esm/src/worker/worker.types.d.ts.map +1 -0
- package/dist/esm/worker/comlink.pool.js +139 -0
- package/dist/esm/worker/comlink.setup.js +30 -0
- package/dist/esm/worker/render.worker.js +38 -60
- package/package.json +9 -8
- package/dist/cjs/canvas/canvas.helper.d.ts.map +0 -1
- package/dist/cjs/canvas/canvas.type.d.ts.map +0 -1
- package/dist/cjs/canvas/chart.canvas.d.ts.map +0 -1
- package/dist/cjs/canvas/grid.canvas.d.ts.map +0 -1
- package/dist/cjs/canvas/image.canvas.d.ts.map +0 -1
- package/dist/cjs/canvas/layout.canvas.d.ts.map +0 -1
- package/dist/cjs/canvas/root.canvas.d.ts.map +0 -1
- package/dist/cjs/canvas/text.canvas.d.ts.map +0 -1
- package/dist/cjs/constant/common.const.d.ts +0 -37
- package/dist/cjs/constant/common.const.d.ts.map +0 -1
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/util/disk.cache.d.ts.map +0 -1
- package/dist/cjs/worker/render.worker.d.ts.map +0 -1
- package/dist/cjs/worker/worker.types.d.ts +0 -76
- package/dist/cjs/worker/worker.types.d.ts.map +0 -1
- package/dist/esm/canvas/canvas.helper.d.ts.map +0 -1
- package/dist/esm/canvas/canvas.type.d.ts.map +0 -1
- package/dist/esm/canvas/chart.canvas.d.ts.map +0 -1
- package/dist/esm/canvas/grid.canvas.d.ts.map +0 -1
- package/dist/esm/canvas/image.canvas.d.ts.map +0 -1
- package/dist/esm/canvas/layout.canvas.d.ts.map +0 -1
- package/dist/esm/canvas/root.canvas.d.ts.map +0 -1
- package/dist/esm/canvas/text.canvas.d.ts.map +0 -1
- package/dist/esm/constant/common.const.d.ts +0 -37
- package/dist/esm/constant/common.const.d.ts.map +0 -1
- package/dist/esm/index.d.ts.map +0 -1
- package/dist/esm/util/disk.cache.d.ts.map +0 -1
- package/dist/esm/worker/render.worker.d.ts.map +0 -1
- package/dist/esm/worker/worker.types.d.ts +0 -76
- package/dist/esm/worker/worker.types.d.ts.map +0 -1
- /package/dist/cjs/{canvas → src/canvas}/grid.canvas.d.ts +0 -0
- /package/dist/cjs/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/cjs/{util → src/util}/disk.cache.d.ts +0 -0
- /package/dist/cjs/{worker → src/worker}/render.worker.d.ts +0 -0
- /package/dist/esm/{canvas → src/canvas}/grid.canvas.d.ts +0 -0
- /package/dist/esm/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/esm/{util → src/util}/disk.cache.d.ts +0 -0
- /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 {
|
|
213
|
+
export { drawBorders, drawRoundedRectPath, parseBorderRadius, parsePercentage };
|