@meonode/canvas 2.0.5 → 3.0.1

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 (84) hide show
  1. package/CONTRIBUTING.md +11 -9
  2. package/README.md +9 -21
  3. package/dist/cjs/canvas/canvas.helper.d.ts +1 -1
  4. package/dist/cjs/canvas/canvas.type.d.ts +9 -4
  5. package/dist/cjs/canvas/canvas.type.d.ts.map +1 -1
  6. package/dist/cjs/canvas/chart.canvas.d.ts +7 -3
  7. package/dist/cjs/canvas/chart.canvas.d.ts.map +1 -1
  8. package/dist/cjs/canvas/chart.canvas.js +3 -4
  9. package/dist/cjs/canvas/chart.canvas.js.map +1 -1
  10. package/dist/cjs/canvas/grid.canvas.d.ts +2 -2
  11. package/dist/cjs/canvas/grid.canvas.d.ts.map +1 -1
  12. package/dist/cjs/canvas/grid.canvas.js +2 -10
  13. package/dist/cjs/canvas/grid.canvas.js.map +1 -1
  14. package/dist/cjs/canvas/image.canvas.d.ts +2 -2
  15. package/dist/cjs/canvas/image.canvas.js +2 -2
  16. package/dist/cjs/canvas/image.canvas.js.map +1 -1
  17. package/dist/cjs/canvas/layout.canvas.d.ts +5 -1
  18. package/dist/cjs/canvas/layout.canvas.d.ts.map +1 -1
  19. package/dist/cjs/canvas/layout.canvas.js +59 -68
  20. package/dist/cjs/canvas/layout.canvas.js.map +1 -1
  21. package/dist/cjs/canvas/root.canvas.d.ts +9 -16
  22. package/dist/cjs/canvas/root.canvas.d.ts.map +1 -1
  23. package/dist/cjs/canvas/root.canvas.js +56 -43
  24. package/dist/cjs/canvas/root.canvas.js.map +1 -1
  25. package/dist/cjs/canvas/text.canvas.d.ts +7 -3
  26. package/dist/cjs/canvas/text.canvas.d.ts.map +1 -1
  27. package/dist/cjs/canvas/text.canvas.js +25 -85
  28. package/dist/cjs/canvas/text.canvas.js.map +1 -1
  29. package/dist/cjs/index.d.ts +2 -2
  30. package/dist/cjs/index.d.ts.map +1 -1
  31. package/dist/cjs/index.js +1 -1
  32. package/dist/cjs/util/disk.cache.d.ts +5 -0
  33. package/dist/cjs/util/disk.cache.d.ts.map +1 -1
  34. package/dist/cjs/util/disk.cache.js +51 -24
  35. package/dist/cjs/util/disk.cache.js.map +1 -1
  36. package/dist/cjs/worker/canvas-handlers.d.ts +14 -0
  37. package/dist/cjs/worker/canvas-handlers.d.ts.map +1 -0
  38. package/dist/cjs/worker/canvas-handlers.js +42 -0
  39. package/dist/cjs/worker/canvas-handlers.js.map +1 -0
  40. package/dist/cjs/worker/comlink.pool.d.ts +1 -1
  41. package/dist/cjs/worker/comlink.pool.d.ts.map +1 -1
  42. package/dist/cjs/worker/comlink.pool.js +3 -0
  43. package/dist/cjs/worker/comlink.pool.js.map +1 -1
  44. package/dist/cjs/worker/comlink.setup.d.ts.map +1 -1
  45. package/dist/cjs/worker/comlink.setup.js +1 -1
  46. package/dist/cjs/worker/comlink.setup.js.map +1 -1
  47. package/dist/cjs/worker/render.worker.js +9 -32
  48. package/dist/cjs/worker/render.worker.js.map +1 -1
  49. package/dist/esm/canvas/canvas.helper.d.ts +1 -1
  50. package/dist/esm/canvas/canvas.type.d.ts +9 -4
  51. package/dist/esm/canvas/canvas.type.d.ts.map +1 -1
  52. package/dist/esm/canvas/chart.canvas.d.ts +7 -3
  53. package/dist/esm/canvas/chart.canvas.d.ts.map +1 -1
  54. package/dist/esm/canvas/chart.canvas.js +3 -4
  55. package/dist/esm/canvas/grid.canvas.d.ts +2 -2
  56. package/dist/esm/canvas/grid.canvas.d.ts.map +1 -1
  57. package/dist/esm/canvas/grid.canvas.js +1 -9
  58. package/dist/esm/canvas/image.canvas.d.ts +2 -2
  59. package/dist/esm/canvas/image.canvas.js +2 -2
  60. package/dist/esm/canvas/layout.canvas.d.ts +5 -1
  61. package/dist/esm/canvas/layout.canvas.d.ts.map +1 -1
  62. package/dist/esm/canvas/layout.canvas.js +59 -69
  63. package/dist/esm/canvas/root.canvas.d.ts +9 -16
  64. package/dist/esm/canvas/root.canvas.d.ts.map +1 -1
  65. package/dist/esm/canvas/root.canvas.js +57 -43
  66. package/dist/esm/canvas/text.canvas.d.ts +7 -3
  67. package/dist/esm/canvas/text.canvas.d.ts.map +1 -1
  68. package/dist/esm/canvas/text.canvas.js +25 -85
  69. package/dist/esm/index.d.ts +2 -2
  70. package/dist/esm/index.d.ts.map +1 -1
  71. package/dist/esm/index.js +2 -2
  72. package/dist/esm/util/disk.cache.d.ts +5 -0
  73. package/dist/esm/util/disk.cache.d.ts.map +1 -1
  74. package/dist/esm/util/disk.cache.js +51 -25
  75. package/dist/esm/worker/canvas-handlers.d.ts +14 -0
  76. package/dist/esm/worker/canvas-handlers.d.ts.map +1 -0
  77. package/dist/esm/worker/canvas-handlers.js +39 -0
  78. package/dist/esm/worker/comlink.pool.d.ts +1 -1
  79. package/dist/esm/worker/comlink.pool.d.ts.map +1 -1
  80. package/dist/esm/worker/comlink.pool.js +3 -0
  81. package/dist/esm/worker/comlink.setup.d.ts.map +1 -1
  82. package/dist/esm/worker/comlink.setup.js +1 -1
  83. package/dist/esm/worker/render.worker.js +9 -32
  84. package/package.json +17 -21
@@ -2,12 +2,20 @@ import { createHash } from 'crypto';
2
2
  import { promises } from 'fs';
3
3
  import { join } from 'path';
4
4
 
5
- const CACHE_DIR = join(process.cwd(), '.cache', 'files');
5
+ let _cacheDir = join(process.cwd(), '.cache', 'files');
6
6
  let _dirEnsured = false;
7
+ /**
8
+ * Override the default disk cache directory.
9
+ * Must be called before any cache read/write operations.
10
+ */
11
+ function setDiskCacheDir(dir) {
12
+ _cacheDir = dir;
13
+ _dirEnsured = false;
14
+ }
7
15
  async function ensureDir() {
8
16
  if (_dirEnsured)
9
17
  return;
10
- await promises.mkdir(CACHE_DIR, { recursive: true });
18
+ await promises.mkdir(_cacheDir, { recursive: true });
11
19
  _dirEnsured = true;
12
20
  }
13
21
  function hashBuffer(buf) {
@@ -16,7 +24,7 @@ function hashBuffer(buf) {
16
24
  async function readDiskCache(key) {
17
25
  try {
18
26
  await ensureDir();
19
- return await promises.readFile(join(CACHE_DIR, key));
27
+ return await promises.readFile(join(_cacheDir, key));
20
28
  }
21
29
  catch {
22
30
  return null;
@@ -25,7 +33,7 @@ async function readDiskCache(key) {
25
33
  async function writeDiskCache(key, data) {
26
34
  try {
27
35
  await ensureDir();
28
- await promises.writeFile(join(CACHE_DIR, key), data);
36
+ await promises.writeFile(join(_cacheDir, key), data);
29
37
  }
30
38
  catch {
31
39
  // best-effort — cache write failures are non-fatal
@@ -33,10 +41,13 @@ async function writeDiskCache(key, data) {
33
41
  }
34
42
  async function deleteDiskCache(key) {
35
43
  try {
36
- await promises.unlink(join(CACHE_DIR, key));
44
+ await promises.unlink(join(_cacheDir, key));
37
45
  }
38
- catch {
46
+ catch (err) {
39
47
  // non-fatal — file may not exist if write failed earlier
48
+ if (err.code !== 'ENOENT') {
49
+ console.warn(`[disk.cache] Failed to delete cache entry "${key}":`, err.message);
50
+ }
40
51
  }
41
52
  }
42
53
  /**
@@ -46,27 +57,42 @@ async function deleteDiskCache(key) {
46
57
  async function clearDiskCache() {
47
58
  _dirEnsured = false;
48
59
  try {
49
- await promises.rm(CACHE_DIR, { recursive: true, force: true });
60
+ await promises.rm(_cacheDir, { recursive: true, force: true });
50
61
  }
51
- catch {
62
+ catch (err) {
52
63
  // non-fatal — directory may not exist
64
+ if (err.code !== 'ENOENT') {
65
+ console.warn('[disk.cache] Failed to clear cache directory:', err.message);
66
+ }
53
67
  }
54
68
  }
55
- // Clean up disk cache on process exit to handle crashes mid-render.
56
- // Guard prevents re-entry: clearDiskCache() is async, so without this the
57
- // beforeExit schedule I/O → idle → beforeExit cycle loops forever.
58
- let _exitCleanupStarted = false;
59
- process.on('beforeExit', () => {
60
- if (_exitCleanupStarted)
61
- return;
62
- _exitCleanupStarted = true;
63
- void clearDiskCache();
64
- });
65
- // Also clean up on SIGINT/SIGTERM for graceful shutdowns
66
- const cleanupOnExit = () => {
67
- clearDiskCache().finally(() => process.exit(0));
68
- };
69
- process.on('SIGINT', cleanupOnExit);
70
- process.on('SIGTERM', cleanupOnExit);
69
+ const globalForExit = globalThis;
70
+ function registerExitListeners() {
71
+ const prev = globalForExit.__diskCacheExit;
72
+ const lifecycle = prev?.lifecycle ?? { cleanupStarted: false };
73
+ if (prev) {
74
+ process.removeListener('beforeExit', prev.onBeforeExit);
75
+ process.removeListener('SIGINT', prev.onSignals);
76
+ process.removeListener('SIGTERM', prev.onSignals);
77
+ }
78
+ const onBeforeExit = () => {
79
+ if (lifecycle.cleanupStarted)
80
+ return;
81
+ lifecycle.cleanupStarted = true;
82
+ void clearDiskCache();
83
+ };
84
+ const onSignals = () => {
85
+ clearDiskCache().finally(() => process.exit(0));
86
+ };
87
+ globalForExit.__diskCacheExit = {
88
+ lifecycle,
89
+ onBeforeExit,
90
+ onSignals,
91
+ };
92
+ process.on('beforeExit', onBeforeExit);
93
+ process.on('SIGINT', onSignals);
94
+ process.on('SIGTERM', onSignals);
95
+ }
96
+ registerExitListeners();
71
97
 
72
- export { clearDiskCache, deleteDiskCache, hashBuffer, readDiskCache, writeDiskCache };
98
+ export { clearDiskCache, deleteDiskCache, hashBuffer, readDiskCache, setDiskCacheDir, writeDiskCache };
@@ -0,0 +1,14 @@
1
+ import type { RootProps } from '../canvas/canvas.type.js';
2
+ import type { Canvas } from 'skia-canvas';
3
+ import type { RenderResult } from './worker.types.js';
4
+ export interface CanvasHandlerDeps {
5
+ canvases: Map<number, Canvas>;
6
+ getNextCanvasId: () => number;
7
+ renderRoot: (props: RootProps) => Promise<Canvas>;
8
+ }
9
+ export declare function createCanvasHandlers(deps: CanvasHandlerDeps): {
10
+ render(props: RootProps): Promise<RenderResult>;
11
+ callOnCanvas(canvasId: number, method: string, args: unknown[]): Promise<Buffer | string | void>;
12
+ releaseCanvas(canvasId: number): void;
13
+ };
14
+ //# sourceMappingURL=canvas-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-handlers.d.ts","sourceRoot":"","sources":["../../../src/worker/canvas-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,eAAe,EAAE,MAAM,MAAM,CAAA;IAC7B,UAAU,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAClD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB;kBAEpC,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;2BAYxB,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;4BAoB9E,MAAM,GAAG,IAAI;EAIxC"}
@@ -0,0 +1,39 @@
1
+ function createCanvasHandlers(deps) {
2
+ return {
3
+ async render(props) {
4
+ const canvas = await deps.renderRoot(props);
5
+ const canvasId = deps.getNextCanvasId();
6
+ deps.canvases.set(canvasId, canvas);
7
+ return {
8
+ canvasId,
9
+ buffer: canvas.toBufferSync('png'),
10
+ width: canvas.width,
11
+ height: canvas.height,
12
+ };
13
+ },
14
+ async callOnCanvas(canvasId, method, args) {
15
+ const canvas = deps.canvases.get(canvasId);
16
+ if (!canvas) {
17
+ throw new Error(`[render.worker] Canvas ${canvasId} not found`);
18
+ }
19
+ switch (method) {
20
+ case 'toBuffer':
21
+ return canvas.toBuffer(...args);
22
+ case 'toURL':
23
+ return canvas.toURL(...args);
24
+ case 'toFile':
25
+ await canvas.toFile(...args);
26
+ return;
27
+ case 'toSharp':
28
+ return await canvas.toSharp(...args).toBuffer();
29
+ default:
30
+ throw new Error(`[render.worker] Unknown method: ${method}`);
31
+ }
32
+ },
33
+ releaseCanvas(canvasId) {
34
+ deps.canvases.delete(canvasId);
35
+ },
36
+ };
37
+ }
38
+
39
+ export { createCanvasHandlers };
@@ -1,4 +1,4 @@
1
- import type { RenderResult } from '../worker/worker.types.js';
1
+ import type { RenderResult } from './worker.types.js';
2
2
  import type { RootProps } from '../canvas/canvas.type.js';
3
3
  export interface PoolRenderResult extends RenderResult {
4
4
  workerIdx: number;
@@ -1 +1 @@
1
- {"version":3,"file":"comlink.pool.d.ts","sourceRoot":"","sources":["../../../src/worker/comlink.pool.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAa,YAAY,EAAU,MAAM,0BAA0B,CAAA;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,SAAS,EAAE,MAAM,CAAA;CAClB;AASD,oFAAoF;AACpF,eAAO,MAAM,SAAS,kBAAkB,CAAA;AAExC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,EAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC,CAuB7H;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAuB3G;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,KAAK,CAAmB;gBAEpB,IAAI,EAAE,MAAM;IAYxB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,KAAK;YAQC,aAAa;IAiBrB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuDzD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAInH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIxD,SAAS;CAOV"}
1
+ {"version":3,"file":"comlink.pool.d.ts","sourceRoot":"","sources":["../../../src/worker/comlink.pool.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAa,YAAY,EAAU,MAAM,0BAA0B,CAAA;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,SAAS,EAAE,MAAM,CAAA;CAClB;AASD,oFAAoF;AACpF,eAAO,MAAM,SAAS,kBAAkB,CAAA;AAExC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,EAAE,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC,CAuB7H;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAuB3G;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,KAAK,CAAmB;gBAEpB,IAAI,EAAE,MAAM;IAYxB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,KAAK;YAQC,aAAa;IAiBrB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2DzD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAInH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIxD,SAAS;CAOV"}
@@ -114,6 +114,9 @@ class ComlinkPool {
114
114
  }
115
115
  }
116
116
  async render(props) {
117
+ if (this.endpoints.length === 0) {
118
+ throw new Error('[ComlinkPool] Pool has been terminated');
119
+ }
117
120
  // Extract functions from props, replacing them with serializable sentinels.
118
121
  // A single Comlink.proxy() callback is created at the top level so Comlink
119
122
  // can correctly transfer it via its proxy transfer handler.
@@ -1 +1 @@
1
- {"version":3,"file":"comlink.setup.d.ts","sourceRoot":"","sources":["../../../src/worker/comlink.setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAKlC,OAAO,YAAY,MAAM,mCAAmC,CAAA;AA4B5D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"comlink.setup.d.ts","sourceRoot":"","sources":["../../../src/worker/comlink.setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAIlC,OAAO,YAAY,MAAM,mCAAmC,CAAA;AA4B5D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -21,7 +21,7 @@ function installNodeProxyHandler() {
21
21
  return [port2, [port2]];
22
22
  },
23
23
  deserialize: (port) => {
24
- port.start?.();
24
+ port.start();
25
25
  return Comlink.wrap(nodeEndpoint(port));
26
26
  },
27
27
  });
@@ -1,6 +1,7 @@
1
1
  import { parentPort } from 'node:worker_threads';
2
2
  import './comlink.setup.js';
3
3
  import { restoreFunctions } from './comlink.pool.js';
4
+ import { createCanvasHandlers } from './canvas-handlers.js';
4
5
  import { RootNode } from '../canvas/root.canvas.js';
5
6
  import * as Comlink from 'comlink';
6
7
  import nodeEndpoint from 'comlink/dist/esm/node-adapter.mjs';
@@ -10,41 +11,17 @@ if (!parentPort) {
10
11
  }
11
12
  const canvases = new Map();
12
13
  let nextCanvasId = 0;
14
+ const handlers = createCanvasHandlers({
15
+ canvases,
16
+ getNextCanvasId: () => nextCanvasId++,
17
+ renderRoot: async (props) => new RootNode(props).render(),
18
+ });
13
19
  const api = {
14
20
  async render(props, callFn) {
15
21
  const resolved = callFn ? restoreFunctions(props, callFn) : props;
16
- const canvas = await new RootNode(resolved).render();
17
- const canvasId = nextCanvasId++;
18
- canvases.set(canvasId, canvas);
19
- const result = {
20
- canvasId,
21
- buffer: canvas.toBufferSync('png'),
22
- width: canvas.width,
23
- height: canvas.height,
24
- };
25
- return result;
26
- },
27
- async callOnCanvas(canvasId, method, args) {
28
- const canvas = canvases.get(canvasId);
29
- if (!canvas) {
30
- throw new Error(`[render.worker] Canvas ${canvasId} not found`);
31
- }
32
- switch (method) {
33
- case 'toBuffer':
34
- return canvas.toBuffer(...args);
35
- case 'toURL':
36
- return canvas.toURL(...args);
37
- case 'toFile':
38
- await canvas.toFile(...args);
39
- return;
40
- case 'toSharp':
41
- return await canvas.toSharp(...args).toBuffer();
42
- default:
43
- throw new Error(`[render.worker] Unknown method: ${method}`);
44
- }
45
- },
46
- releaseCanvas(canvasId) {
47
- canvases.delete(canvasId);
22
+ return handlers.render(resolved);
48
23
  },
24
+ callOnCanvas: handlers.callOnCanvas.bind(handlers),
25
+ releaseCanvas: handlers.releaseCanvas.bind(handlers),
49
26
  };
50
27
  Comlink.expose(api, nodeEndpoint(parentPort));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meonode/canvas",
3
- "version": "2.0.5",
3
+ "version": "3.0.1",
4
4
  "description": "A declarative, component-based library for server-side canvas image generation. Write complex visuals with simple functions, similar to the composition style of @meonode/ui.",
5
5
  "keywords": [
6
6
  "canvas",
@@ -37,17 +37,19 @@
37
37
  }
38
38
  },
39
39
  "scripts": {
40
- "build": "rm -rf ./dist && rollup -c --bundleConfigAsCjs && tsc-alias -p tsconfig.esm.json && tsc-alias -p tsconfig.cjs.json",
41
- "test": "node --no-experimental-webstorage --experimental-vm-modules $(yarn bin jest)",
42
- "lint": "eslint . --ext .ts,.tsx,.js,.jsx,.mjs --fix",
40
+ "build": "bun -e \"fs.rmSync('./dist', {recursive:true, force:true})\" && rollup -c --bundleConfigAsCjs && bun scripts/rewrite-dts-aliases.ts",
41
+ "test": "vitest run --coverage",
42
+ "test:ci": "node ./node_modules/vitest/vitest.mjs run --coverage",
43
+ "test:integration": "vitest run --config vitest.integration.config.ts",
44
+ "typecheck": "tsc --noEmit",
45
+ "lint": "eslint . --ext .ts,.tsx,.js,.jsx,.mjs --fix && bun run typecheck",
43
46
  "format": "prettier --write .",
44
47
  "generate:samples": "npx tsx scripts/generate_sample_charts.ts && npx tsx scripts/generate_sample_grids.ts && npx tsx scripts/generate_sample_nested_grids.ts",
45
48
  "check:memory": "npx tsx --expose-gc scripts/check_memory.ts",
46
49
  "prepare": "husky"
47
50
  },
48
51
  "devDependencies": {
49
- "@eslint/js": "^9.39.4",
50
- "@jest/globals": "^30.3.0",
52
+ "@eslint/js": "^10.0.1",
51
53
  "@rollup/plugin-commonjs": "^29.0.2",
52
54
  "@rollup/plugin-node-resolve": "^16.0.3",
53
55
  "@rollup/plugin-typescript": "^12.3.0",
@@ -56,37 +58,31 @@
56
58
  "@semantic-release/gitlab": "^13.3.2",
57
59
  "@semantic-release/npm": "^13.1.5",
58
60
  "@semantic-release/release-notes-generator": "^14.1.0",
59
- "@types/jest": "^30.0.0",
60
- "@types/lodash-es": "^4.17.12",
61
61
  "@types/node": "^25.5.0",
62
- "@types/sharp": "^0.32.0",
63
- "@types/tinycolor2": "^1.4.6",
62
+ "@types/pngjs": "^6.0.5",
64
63
  "@typescript-eslint/eslint-plugin": "^8.57.2",
65
64
  "@typescript-eslint/parser": "^8.57.2",
66
- "eslint": "^9.39.4",
65
+ "@vitest/coverage-v8": "^4.1.7",
66
+ "eslint": "^10.4.0",
67
67
  "eslint-config-prettier": "^10.1.8",
68
- "eslint-plugin-jsdoc": "^62.8.1",
68
+ "eslint-plugin-jsdoc": "^63.0.0",
69
69
  "eslint-plugin-prettier": "^5.5.5",
70
70
  "eslint-plugin-unused-imports": "^4.4.1",
71
71
  "husky": "^9.1.7",
72
- "jest": "^30.3.0",
72
+ "pixelmatch": "^7.2.0",
73
+ "pngjs": "^7.0.0",
73
74
  "prettier": "^3.8.1",
74
75
  "rollup": "^4.60.0",
75
76
  "rollup-plugin-tsconfig-paths": "^1.5.2",
76
- "semantic-release": "^25.0.3",
77
- "ts-jest": "^29.4.6",
78
- "tsc-alias": "^1.8.16",
77
+ "semantic-release": "25.0.3",
79
78
  "typescript": "^6.0.2",
80
- "typescript-eslint": "^8.57.2"
79
+ "typescript-eslint": "^8.57.2",
80
+ "vitest": "^4.1.7"
81
81
  },
82
- "packageManager": "yarn@4.11.0",
83
82
  "dependencies": {
84
83
  "comlink": "^4.4.2",
85
84
  "file-type": "^22.0.0",
86
- "lodash-es": "^4.17.23",
87
- "sharp": "^0.34.5",
88
85
  "skia-canvas": "^3.0.8",
89
- "tinycolor2": "^1.6.0",
90
86
  "tslib": "^2.8.1",
91
87
  "yoga-layout": "^3.2.1"
92
88
  },