infographic-for-react 0.2.0 → 0.3.0

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/README.md CHANGED
@@ -27,9 +27,92 @@ npm install infographic-for-react @antv/infographic
27
27
 
28
28
  ## Quick Start
29
29
 
30
- ### Basic Usage
30
+ ### String DSL (Recommended for Static Templates)
31
31
 
32
- The simplest way to use `Infographic` is to pass a `dsl` prop with the template name and data configuration.
32
+ Use the native infographic string DSL syntax for a concise, template-based approach.
33
+
34
+ ```tsx
35
+ import { Infographic } from 'infographic-for-react';
36
+
37
+ function App() {
38
+ const dslString = `
39
+ infographic sales-dashboard
40
+ theme
41
+ palette #f00 #0f0 #00f
42
+ data
43
+ title Q1 Growth Highlights
44
+ items
45
+ - label MAU
46
+ value 12.3
47
+ - label Revenue
48
+ value 4.5
49
+ `;
50
+
51
+ return (
52
+ <Infographic
53
+ dsl={dslString}
54
+ width={600}
55
+ height={400}
56
+ />
57
+ );
58
+ }
59
+ ```
60
+
61
+ > **Note**: When using string DSL, the `overrides` and `beforeRender` props are ignored. Use object DSL if you need these features.
62
+
63
+ ### Children DSL (Recommended for Most Use Cases)
64
+
65
+ For a more declarative and React-like syntax, pass DSL as the component's children. This is particularly useful for static templates and provides better readability with preserved formatting.
66
+
67
+ > **⚠️ Important**: When using children DSL, you **must** wrap DSL content in a template literal `{}` to preserve newlines and indentation. This prevents React from collapsing whitespace.
68
+
69
+ ```tsx
70
+ import { Infographic } from 'infographic-for-react';
71
+
72
+ function App() {
73
+ return (
74
+ <Infographic width={600} height={400}>
75
+ {`infographic list-row-simple-horizontal-arrow
76
+ data
77
+ items
78
+ - label Step 1
79
+ desc Start
80
+ - label Step 2
81
+ desc In Progress
82
+ - label Step 3
83
+ desc Complete
84
+ `}
85
+ </Infographic>
86
+ );
87
+ }
88
+ ```
89
+
90
+ ```tsx
91
+ // You can also use template literals for dynamic content with variable interpolation
92
+ function App() {
93
+ const title = 'My Dashboard';
94
+ const items = [
95
+ { label: 'MAU', value: 12.3 },
96
+ { label: 'Revenue', value: 4.5 },
97
+ ];
98
+
99
+ return (
100
+ <Infographic>
101
+ {`infographic sales-dashboard
102
+ data
103
+ title ${title}
104
+ items
105
+ ${items.map((item) => ` - label ${item.label}\n value ${item.value}`).join('\n')}`}
106
+ </Infographic>
107
+ );
108
+ }
109
+ ```
110
+
111
+ > **Note**: When using children DSL, the `overrides` and `beforeRender` props are ignored. Use object DSL if you need these features. The `dsl` prop is also ignored when children are provided (children take precedence).
112
+
113
+ ### Basic Usage (Object DSL)
114
+
115
+ Use object DSL for full TypeScript type safety and access to advanced features like `overrides` and `beforeRender` hooks.
33
116
 
34
117
  ```tsx
35
118
  import { Infographic } from 'infographic-for-react';
@@ -69,7 +152,7 @@ function App() {
69
152
 
70
153
  ### DSL Overrides
71
154
 
72
- Use the `overrides` prop to selectively modify DSL values by path without recreating the entire DSL object. This is useful for dynamic updates or theming.
155
+ Use the `overrides` prop to selectively modify DSL values by path without recreating entire DSL object. This is useful for dynamic updates or theming. **Only works with object DSL**.
73
156
 
74
157
  ```tsx
75
158
  import { Infographic } from 'infographic-for-react';
@@ -152,7 +235,7 @@ function App() {
152
235
 
153
236
  ### Pre/Post Render Hooks
154
237
 
155
- Use `beforeRender` to preprocess the DSL before rendering, and `afterRender` to perform actions after the infographic is rendered (e.g., logging, analytics, custom post-processing).
238
+ Use `beforeRender` to preprocess DSL before rendering, and `afterRender` to perform actions after infographic is rendered (e.g., logging, analytics, custom post-processing). **Only works with object DSL**.
156
239
 
157
240
  ```tsx
158
241
  import { Infographic } from 'infographic-for-react';
package/README.zh-CN.md CHANGED
@@ -27,9 +27,92 @@ npm install infographic-for-react @antv/infographic
27
27
 
28
28
  ## 快速开始
29
29
 
30
- ### 基础用法
30
+ ### 字符串 DSL
31
31
 
32
- 使用 `Infographic` 最简单的方式是传入包含模板名称和数据配置的 `dsl` 属性。
32
+ 使用原生信息图表的字符串 DSL 语法,这种方式更简洁,适合基于模板的配置。
33
+
34
+ ```tsx
35
+ import { Infographic } from 'infographic-for-react';
36
+
37
+ function App() {
38
+ const dslString = `
39
+ infographic 销售仪表盘
40
+ theme
41
+ palette #f00 #0f0 #00f
42
+ data
43
+ title 第一季度增长亮点
44
+ items
45
+ - label 月活跃用户
46
+ value 12.3
47
+ - label 营收
48
+ value 4.5
49
+ `;
50
+
51
+ return (
52
+ <Infographic
53
+ dsl={dslString}
54
+ width={600}
55
+ height={400}
56
+ />
57
+ );
58
+ }
59
+ ```
60
+
61
+ > **注意**:使用字符串 DSL 时,`overrides` 和 `beforeRender` 属性会被忽略。如需使用这些功能,请使用对象 DSL。
62
+
63
+ ### Children DSL(推荐大多数场景)
64
+
65
+ 为了获得更符合 React 风格的语法,你可以将 DSL 作为组件的 children 传递。这种方式特别适合静态模板,并且能更好地保留格式和缩进。
66
+
67
+ > **⚠️ 重要提示**:使用 children DSL 时,**必须**使用模板字符串 `{}` 包裹 DSL 内容,以保留换行和缩进。这样可以防止 React 合并空白字符。
68
+
69
+ ```tsx
70
+ import { Infographic } from 'infographic-for-react';
71
+
72
+ function App() {
73
+ return (
74
+ <Infographic width={600} height={400}>
75
+ {`infographic list-row-simple-horizontal-arrow
76
+ data
77
+ items
78
+ - label 步骤 1
79
+ desc 开始
80
+ - label 步骤 2
81
+ desc 进行中
82
+ - label 步骤 3
83
+ desc 完成
84
+ `}
85
+ </Infographic>
86
+ );
87
+ }
88
+ ```
89
+
90
+ ```tsx
91
+ // 你也可以使用模板字符串来动态生成内容,支持变量插值
92
+ function App() {
93
+ const title = '我的仪表盘';
94
+ const items = [
95
+ { label: '月活跃用户', value: 12.3 },
96
+ { label: '营收', value: 4.5 },
97
+ ];
98
+
99
+ return (
100
+ <Infographic>
101
+ {`infographic 销售仪表盘
102
+ data
103
+ title ${title}
104
+ items
105
+ ${items.map((item) => ` - label ${item.label}\n value ${item.value}`).join('\n')}`}
106
+ </Infographic>
107
+ );
108
+ }
109
+ ```
110
+
111
+ > **注意**:使用 children DSL 时,`overrides` 和 `beforeRender` 属性会被忽略。如需使用这些功能,请使用对象 DSL。当提供 children 时,`dsl` 属性也会被忽略(children 优先级更高)。
112
+
113
+ ### 基础用法(对象 DSL)
114
+
115
+ 使用对象 DSL 获得完整的 TypeScript 类型支持和 `overrides`、`beforeRender` 钩子等高级功能。
33
116
 
34
117
  ```tsx
35
118
  import { Infographic } from 'infographic-for-react';
@@ -69,7 +152,34 @@ function App() {
69
152
 
70
153
  ### DSL 覆盖
71
154
 
72
- 使用 `overrides` 属性可以通过路径选择性地修改 DSL 值,而无需重新创建整个 DSL 对象。这对于动态更新或主题切换非常有用。
155
+ 使用 `overrides` 属性可以通过路径选择性地修改 DSL 值,而无需重新创建整个 DSL 对象。这对于动态更新或主题切换非常有用。**仅适用于对象 DSL**。
156
+
157
+ ```tsx
158
+ import { Infographic } from 'infographic-for-react';
159
+
160
+ function App() {
161
+ const overrides = [
162
+ { path: 'data.items[0].value', value: 200 },
163
+ ];
164
+
165
+ return (
166
+ <Infographic>
167
+ {`infographic 销售仪表盘
168
+ data
169
+ title ${title}
170
+ items
171
+ ${items.map((item) => ` - label ${item.label}\n value ${item.value}`).join('\n')}`}
172
+ </Infographic>
173
+ );
174
+ }
175
+ ```
176
+
177
+ > **注意**:使用 children DSL 时,`overrides` 和 `beforeRender` 属性会被忽略。如需使用这些功能,请使用对象 DSL。当提供 children 时,`dsl` 属性也会被忽略(children 优先级更高)。
178
+
179
+
180
+ ### DSL 覆盖
181
+
182
+ 使用 `overrides` 属性可以通过路径选择性地修改 DSL 值,而无需重新创建整个 DSL 对象。这对于动态更新或主题切换非常有用。**仅适用于对象 DSL**。
73
183
 
74
184
  ```tsx
75
185
  import { Infographic } from 'infographic-for-react';
@@ -152,7 +262,7 @@ function App() {
152
262
 
153
263
  ### 渲染前/后钩子
154
264
 
155
- 使用 `beforeRender` 在渲染前预处理 DSL,使用 `afterRender` 在信息图表渲染后执行操作(如日志记录、分析、自定义后处理)。
265
+ 使用 `beforeRender` 在渲染前预处理 DSL,使用 `afterRender` 在信息图表渲染后执行操作(如日志记录、分析、自定义后处理)。**仅适用于对象 DSL**。
156
266
 
157
267
  ```tsx
158
268
  import { Infographic } from 'infographic-for-react';
package/dist/index.d.mts CHANGED
@@ -26,7 +26,7 @@ interface DSLObject extends Partial<InfographicOptions> {
26
26
  palette?: Palette;
27
27
  themeConfig?: ThemeConfig;
28
28
  }
29
- type DSLInput = DSLObject;
29
+ type DSLInput = string | DSLObject;
30
30
  interface DSLOverride {
31
31
  path: string;
32
32
  value: unknown;
@@ -48,6 +48,7 @@ interface ComposeTemplateOptions {
48
48
  overrides?: DSLOverride[];
49
49
  }
50
50
  interface InfographicProps {
51
+ children?: string;
51
52
  dsl?: DSLInput;
52
53
  overrides?: DSLOverride[];
53
54
  theme?: string;
@@ -69,8 +70,8 @@ interface InfographicRef {
69
70
  destroy: () => void;
70
71
  }
71
72
  interface RendererInstance {
72
- render: (options?: Partial<InfographicOptions>) => void;
73
- update: (options: Partial<InfographicOptions>) => void;
73
+ render: (options?: string | Partial<InfographicOptions>) => void;
74
+ update: (options: string | Partial<InfographicOptions>) => void;
74
75
  toDataURL: (options?: ExportOptions) => Promise<string>;
75
76
  getTypes: () => string | undefined;
76
77
  destroy: () => void;
@@ -101,8 +102,8 @@ declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryS
101
102
  declare function useInfographic(containerRef: React.RefObject<HTMLElement>, props: InfographicProps): InfographicRef;
102
103
 
103
104
  declare function useRenderer(containerRef: React.RefObject<HTMLElement>): {
104
- render: (options: Partial<InfographicOptions>) => Promise<void>;
105
- update: (options: Partial<InfographicOptions>) => void;
105
+ render: (options: string | Partial<InfographicOptions>) => Promise<void>;
106
+ update: (options: string | Partial<InfographicOptions>) => void;
106
107
  toDataURL: (options?: ExportOptions) => Promise<string>;
107
108
  getTypes: () => string | undefined;
108
109
  destroy: () => void;
package/dist/index.d.ts CHANGED
@@ -26,7 +26,7 @@ interface DSLObject extends Partial<InfographicOptions> {
26
26
  palette?: Palette;
27
27
  themeConfig?: ThemeConfig;
28
28
  }
29
- type DSLInput = DSLObject;
29
+ type DSLInput = string | DSLObject;
30
30
  interface DSLOverride {
31
31
  path: string;
32
32
  value: unknown;
@@ -48,6 +48,7 @@ interface ComposeTemplateOptions {
48
48
  overrides?: DSLOverride[];
49
49
  }
50
50
  interface InfographicProps {
51
+ children?: string;
51
52
  dsl?: DSLInput;
52
53
  overrides?: DSLOverride[];
53
54
  theme?: string;
@@ -69,8 +70,8 @@ interface InfographicRef {
69
70
  destroy: () => void;
70
71
  }
71
72
  interface RendererInstance {
72
- render: (options?: Partial<InfographicOptions>) => void;
73
- update: (options: Partial<InfographicOptions>) => void;
73
+ render: (options?: string | Partial<InfographicOptions>) => void;
74
+ update: (options: string | Partial<InfographicOptions>) => void;
74
75
  toDataURL: (options?: ExportOptions) => Promise<string>;
75
76
  getTypes: () => string | undefined;
76
77
  destroy: () => void;
@@ -101,8 +102,8 @@ declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryS
101
102
  declare function useInfographic(containerRef: React.RefObject<HTMLElement>, props: InfographicProps): InfographicRef;
102
103
 
103
104
  declare function useRenderer(containerRef: React.RefObject<HTMLElement>): {
104
- render: (options: Partial<InfographicOptions>) => Promise<void>;
105
- update: (options: Partial<InfographicOptions>) => void;
105
+ render: (options: string | Partial<InfographicOptions>) => Promise<void>;
106
+ update: (options: string | Partial<InfographicOptions>) => void;
106
107
  toDataURL: (options?: ExportOptions) => Promise<string>;
107
108
  getTypes: () => string | undefined;
108
109
  destroy: () => void;
package/dist/index.js CHANGED
@@ -11,9 +11,14 @@ function useRenderer(containerRef) {
11
11
  const pendingListenersRef = react.useRef(/* @__PURE__ */ new Map());
12
12
  const attachedListenersRef = react.useRef(/* @__PURE__ */ new Map());
13
13
  const createRenderer = react.useCallback(
14
- async (options) => {
14
+ async (options, container) => {
15
15
  const { Infographic: InfographicClass } = await import('@antv/infographic');
16
- const renderer = new InfographicClass(options);
16
+ let renderer;
17
+ if (typeof options === "string") {
18
+ renderer = new InfographicClass(options);
19
+ } else {
20
+ renderer = new InfographicClass({ ...options, container });
21
+ }
17
22
  renderer.on("rendered", () => {
18
23
  rendererRef.current = renderer;
19
24
  isInitializedRef.current = true;
@@ -27,7 +32,11 @@ function useRenderer(containerRef) {
27
32
  renderer.on("error", (error) => {
28
33
  console.error("[Infographic-for-React] Renderer error:", error);
29
34
  });
30
- renderer.render();
35
+ if (typeof options === "string") {
36
+ renderer.render({ container });
37
+ } else {
38
+ renderer.render();
39
+ }
31
40
  return renderer;
32
41
  },
33
42
  []
@@ -38,11 +47,14 @@ function useRenderer(containerRef) {
38
47
  if (!container) {
39
48
  throw new Error("Container element not found");
40
49
  }
41
- const renderOptions = { ...options, container };
42
50
  if (rendererRef.current) {
43
- rendererRef.current.update(renderOptions);
51
+ if (typeof options === "string") {
52
+ rendererRef.current.update(options);
53
+ } else {
54
+ rendererRef.current.update({ ...options, container });
55
+ }
44
56
  } else {
45
- await createRenderer(renderOptions);
57
+ await createRenderer(options, container);
46
58
  }
47
59
  },
48
60
  [containerRef, createRenderer]
@@ -356,41 +368,52 @@ var RENDER_DEBOUNCE_DELAY = 100;
356
368
  function useRenderController(containerRef, rendererRender, props, processDSL, onError) {
357
369
  const propsRef = react.useRef(props);
358
370
  const dslCacheRef = react.useRef(null);
371
+ const stringDslCacheRef = react.useRef(null);
359
372
  propsRef.current = props;
360
373
  const render = react.useCallback(async () => {
361
374
  const { dsl, width, height, theme, editable, className } = propsRef.current;
362
375
  if (!dsl) {
363
376
  throw new Error("DSL prop is required");
364
377
  }
365
- const processedDSL = await processDSL(dsl);
366
- const dslString = JSON.stringify(processedDSL);
367
- if (dslCacheRef.current !== dslString) {
368
- dslCacheRef.current = dslString;
369
- const { palette, ...restDSL } = processedDSL;
370
- const renderOptions = { ...restDSL, data: processedDSL.data };
371
- if (processedDSL.theme) {
372
- renderOptions.theme = processedDSL.theme;
373
- } else if (theme) {
374
- renderOptions.theme = theme;
375
- }
376
- if (palette) {
377
- const existingThemeConfig = processedDSL.themeConfig || {};
378
- renderOptions.themeConfig = {
379
- ...existingThemeConfig,
380
- palette
381
- };
382
- }
383
- if (editable !== void 0) {
384
- renderOptions.editable = editable;
378
+ if (containerRef.current && className) {
379
+ containerRef.current.className = className;
380
+ }
381
+ if (typeof dsl === "string") {
382
+ const trimmedDsl = dsl.trim();
383
+ if (!trimmedDsl) {
384
+ throw new Error("String DSL cannot be empty or contain only whitespace");
385
385
  }
386
- if (width || height) {
387
- renderOptions.width = width;
388
- renderOptions.height = height;
386
+ if (stringDslCacheRef.current !== trimmedDsl) {
387
+ stringDslCacheRef.current = trimmedDsl;
388
+ rendererRender(trimmedDsl);
389
389
  }
390
- if (containerRef.current && className) {
391
- containerRef.current.className = className;
390
+ } else {
391
+ const processedDSL = await processDSL(dsl);
392
+ const dslString = JSON.stringify(processedDSL);
393
+ if (dslCacheRef.current !== dslString) {
394
+ dslCacheRef.current = dslString;
395
+ const { palette, ...restDSL } = processedDSL;
396
+ const renderOptions = {
397
+ ...restDSL,
398
+ data: processedDSL.data,
399
+ width,
400
+ height,
401
+ editable
402
+ };
403
+ if (processedDSL.theme) {
404
+ renderOptions.theme = processedDSL.theme;
405
+ } else if (theme) {
406
+ renderOptions.theme = theme;
407
+ }
408
+ if (palette) {
409
+ const existingThemeConfig = processedDSL.themeConfig || {};
410
+ renderOptions.themeConfig = {
411
+ ...existingThemeConfig,
412
+ palette
413
+ };
414
+ }
415
+ rendererRender(renderOptions);
392
416
  }
393
- rendererRender(renderOptions);
394
417
  }
395
418
  }, [containerRef, rendererRender, processDSL]);
396
419
  const debouncedRender = react.useCallback(
@@ -408,6 +431,10 @@ function useRefMethods(update, { processDSL, theme }) {
408
431
  themeRef.current = theme;
409
432
  const refUpdate = react.useCallback(
410
433
  async (options) => {
434
+ if (typeof options === "string") {
435
+ update(options);
436
+ return;
437
+ }
411
438
  const processed = await processDSL(options);
412
439
  const { palette, ...restProcessed } = processed;
413
440
  const themeConfig = processed.themeConfig || {};
@@ -455,7 +482,7 @@ function useInfographic(containerRef, props) {
455
482
  props.onError?.(infographicError);
456
483
  }
457
484
  );
458
- const { refUpdate } = useRefMethods(update, { processDSL, theme: props.theme });
485
+ const { refUpdate } = useRefMethods((options) => update(options), { processDSL, theme: props.theme });
459
486
  react.useEffect(() => {
460
487
  on("rendered", handleRendered);
461
488
  on("loaded", handleRendered);
@@ -541,11 +568,19 @@ var defaultError = {
541
568
  message: "An error occurred while rendering the infographic."
542
569
  };
543
570
  function InfographicComponent(props, ref) {
571
+ const { children, dsl: dslProp, ...restProps } = props;
544
572
  const containerRef = react.useRef(null);
545
573
  const [error, setError] = react.useState(null);
546
574
  const [errorKey, setErrorKey] = react.useState(0);
575
+ console.log("children--------------", children);
576
+ const childrenDsl = children ? String(children).trim() : void 0;
577
+ const finalDsl = childrenDsl || dslProp;
578
+ if (!finalDsl) {
579
+ throw new Error("Either children or dsl prop must be provided");
580
+ }
547
581
  const infographicRef = useInfographic(containerRef, {
548
- ...props,
582
+ ...restProps,
583
+ dsl: finalDsl,
549
584
  onError: (err) => {
550
585
  setError(err);
551
586
  props.onError?.(err);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useRenderer.ts","../src/utils/path.ts","../src/utils/dsl/merge.ts","../src/utils/dsl/compose.ts","../src/utils/error.ts","../src/hooks/useDSLProcessor.ts","../src/hooks/useRenderCallback.ts","../src/constants/index.ts","../src/hooks/useRenderController.ts","../src/hooks/useRefMethods.ts","../src/hooks/useInfographic.ts","../src/components/styles.ts","../src/components/Infographic.tsx","../src/components/ErrorBoundary.tsx"],"names":["useRef","useCallback","listeners","useEffect","debounce","useState","useImperativeHandle","jsxs","Fragment","jsx","forwardRef","Component"],"mappings":"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","file":"index.js","sourcesContent":["import { useEffect, useRef, useCallback } from 'react';\nimport type {\n InfographicOptions,\n RendererInstance,\n ExportOptions,\n} from '../types';\n\nexport function useRenderer(containerRef: React.RefObject<HTMLElement>) {\n const rendererRef = useRef<RendererInstance | null>(null);\n const isInitializedRef = useRef(false);\n const pendingListenersRef = useRef<Map<string, Set<(...args: any[]) => void>>>(new Map());\n const attachedListenersRef = useRef<Map<string, Set<(...args: any[]) => void>>>(new Map());\n\n const createRenderer = useCallback(\n async (options: Partial<InfographicOptions>): Promise<RendererInstance> => {\n const { Infographic: InfographicClass } = await import('@antv/infographic');\n const renderer = new InfographicClass(options);\n\n renderer.on('rendered', () => {\n rendererRef.current = renderer;\n isInitializedRef.current = true;\n\n pendingListenersRef.current.forEach((listeners, event) => {\n listeners.forEach((listener) => {\n renderer.on(event, listener);\n });\n });\n pendingListenersRef.current.clear();\n });\n\n renderer.on('error', (error) => {\n console.error('[Infographic-for-React] Renderer error:', error);\n });\n\n renderer.render();\n\n return renderer;\n },\n [],\n );\n\n const render = useCallback(\n async (options: Partial<InfographicOptions>) => {\n const container = containerRef.current;\n if (!container) {\n throw new Error('Container element not found');\n }\n\n const renderOptions = { ...options, container };\n\n if (rendererRef.current) {\n rendererRef.current.update(renderOptions);\n } else {\n await createRenderer(renderOptions);\n }\n },\n [containerRef, createRenderer],\n );\n\n const update = useCallback((options: Partial<InfographicOptions>) => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized. Call render first.');\n }\n rendererRef.current.update(options);\n }, []);\n\n const toDataURL = useCallback(\n (options?: ExportOptions): Promise<string> => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized');\n }\n return rendererRef.current.toDataURL(options);\n },\n [],\n );\n\n const getTypes = useCallback(() => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized');\n }\n return rendererRef.current.getTypes();\n }, []);\n\n const destroy = useCallback(() => {\n if (rendererRef.current) {\n attachedListenersRef.current.forEach((listeners, event) => {\n listeners.forEach((listener) => {\n rendererRef.current?.off(event, listener);\n });\n });\n attachedListenersRef.current.clear();\n\n rendererRef.current.destroy();\n rendererRef.current = null;\n }\n isInitializedRef.current = false;\n }, []);\n\n const on = useCallback((event: string, listener: (...args: any[]) => void) => {\n if (!rendererRef.current) {\n const listeners = pendingListenersRef.current.get(event) || new Set();\n listeners.add(listener);\n pendingListenersRef.current.set(event, listeners);\n return;\n }\n const listeners = attachedListenersRef.current.get(event) || new Set();\n listeners.add(listener);\n attachedListenersRef.current.set(event, listeners);\n rendererRef.current.on(event, listener);\n }, []);\n\n const off = useCallback((event: string, listener: (...args: any[]) => void) => {\n if (!rendererRef.current) {\n const listeners = pendingListenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n pendingListenersRef.current.delete(event);\n }\n }\n return;\n }\n rendererRef.current.off(event, listener);\n const listeners = attachedListenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n attachedListenersRef.current.delete(event);\n }\n }\n }, []);\n\n useEffect(() => {\n return () => {\n destroy();\n };\n }, [destroy]);\n\n return {\n render,\n update,\n toDataURL,\n getTypes,\n destroy,\n on,\n off,\n isReady: isInitializedRef.current,\n };\n}\n","export interface PathSegment {\n type: 'key' | 'index';\n value: string | number;\n}\n\nfunction parsePath(path: string): PathSegment[] {\n const segments: PathSegment[] = [];\n const regex = /([^.[\\]]+)|\\[(\\d+)\\]/g;\n let match;\n\n while ((match = regex.exec(path)) !== null) {\n if (match[1] !== undefined) {\n segments.push({ type: 'key', value: match[1] });\n } else if (match[2] !== undefined) {\n segments.push({ type: 'index', value: parseInt(match[2], 10) });\n }\n }\n\n return segments;\n}\n\nexport function setByPath(obj: Record<string, unknown>, path: string, value: unknown): void {\n const segments = parsePath(path);\n\n if (segments.length === 0) {\n throw new Error(`Invalid path: ${path}`);\n }\n\n let current: unknown = obj;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const isLast = i === segments.length - 1;\n\n if (typeof current !== 'object' || current === null) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n\n if (segment.type === 'key') {\n const currentObj = current as Record<string, unknown>;\n if (isLast) {\n currentObj[segment.value] = value;\n } else {\n const nextValue = currentObj[segment.value];\n if (nextValue !== undefined && (typeof nextValue !== 'object' || nextValue === null)) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n if (typeof nextValue !== 'object' || nextValue === null) {\n currentObj[segment.value] = {};\n }\n current = currentObj[segment.value];\n }\n } else {\n const currentArray = current as unknown[];\n if (!Array.isArray(currentArray)) {\n throw new Error(`Cannot access array index at path \"${path}\": parent is not an array`);\n }\n const index = segment.value as number;\n if (isLast) {\n currentArray[index] = value;\n } else {\n const nextValue = currentArray[index];\n if (nextValue !== undefined && (typeof nextValue !== 'object' || nextValue === null)) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n if (typeof nextValue !== 'object' || nextValue === null) {\n currentArray[index] = {};\n }\n current = currentArray[index];\n }\n }\n }\n}\n\nexport function getByPath(obj: Record<string, unknown>, path: string): unknown {\n const segments = parsePath(path);\n\n if (segments.length === 0) {\n return undefined;\n }\n\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (typeof current !== 'object' || current === null) {\n return undefined;\n }\n\n if (segment.type === 'key') {\n current = (current as Record<string, unknown>)[segment.value];\n } else {\n if (!Array.isArray(current)) {\n return undefined;\n }\n const index = segment.value as number;\n current = current[index];\n }\n }\n\n return current;\n}\n","import type { DSLOverride, DSLObject } from '../../types';\nimport { setByPath } from '../path';\n\nexport function applyOverrides(base: DSLObject, overrides: DSLOverride[]): DSLObject {\n if (overrides.length === 0) return base;\n\n const result = { ...base };\n\n for (const override of overrides) {\n setByPath(result as Record<string, unknown>, override.path, override.value);\n }\n\n return result;\n}\n\nexport function mergeDSL(dsl1: DSLObject, dsl2: DSLObject): DSLObject {\n const merged = deepMerge(dsl1 as unknown as Record<string, unknown>, dsl2 as unknown as Record<string, unknown>);\n return merged as unknown as DSLObject;\n}\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = { ...target };\n\n for (const key in source) {\n if (source[key] === undefined) {\n continue;\n }\n\n const value = source[key];\n\n if (value === null) {\n result[key] = null;\n continue;\n }\n\n const targetValue = result[key];\n\n if (typeof value === 'object' && !Array.isArray(value) && targetValue && typeof targetValue === 'object' && !Array.isArray(targetValue)) {\n result[key] = deepMerge(targetValue as Record<string, unknown>, value as Record<string, unknown>);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n","import type { ComposeTemplateOptions, DSLObject } from '../../types';\nimport { applyOverrides } from './merge';\n\ninterface DSLNode {\n type?: string;\n data?: unknown;\n props?: Record<string, unknown>;\n children?: DSLNode[];\n [key: string]: unknown;\n}\n\nfunction isContainerNode(node: unknown): node is DSLNode {\n return (\n typeof node === 'object' &&\n node !== null &&\n 'children' in node &&\n Array.isArray((node as DSLNode).children)\n );\n}\n\nexport function composeTemplates(options: ComposeTemplateOptions): DSLObject {\n const { templates, overrides = [] } = options;\n\n if (templates.length === 0) {\n throw new Error('At least one template is required');\n }\n\n if (templates.length === 1) {\n const base = templates[0];\n if (overrides.length > 0) {\n return applyOverrides(base, overrides);\n }\n return base;\n }\n\n const root = templates[0] as DSLNode;\n\n if (!isContainerNode(root)) {\n throw new Error('Root template must be a container node with children');\n }\n\n let currentChildren = root.children || [];\n\n for (let i = 1; i < templates.length; i++) {\n const template = templates[i] as DSLNode;\n\n if (isContainerNode(template) && template.children) {\n currentChildren = [...currentChildren, ...template.children];\n } else {\n currentChildren.push(template);\n }\n }\n\n root.children = currentChildren;\n\n let composed = root as DSLObject;\n\n if (overrides.length > 0) {\n composed = applyOverrides(composed, overrides);\n }\n\n return composed;\n}\n","import type { InfographicError } from '../types';\n\nexport function createInfographicError(\n type: InfographicError['type'],\n message: string,\n dsl?: string,\n details?: Error | unknown,\n): InfographicError {\n return {\n type,\n message,\n dsl,\n details,\n };\n}\n\nexport function isInfographicError(error: unknown): error is InfographicError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'type' in error &&\n 'message' in error &&\n ['syntax', 'render', 'runtime'].includes((error as InfographicError).type)\n );\n}\n\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { useCallback, useRef } from 'react';\nimport { applyOverrides } from '../utils/dsl';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type {\n InfographicError,\n DSLObject,\n PreRenderHook,\n DSLOverride,\n} from '../types';\n\ninterface DSLProcessorOptions {\n overrides?: DSLOverride[];\n beforeRender?: PreRenderHook;\n onError?: (error: InfographicError) => void;\n}\n\nexport function useDSLProcessor(options: DSLProcessorOptions) {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const processDSL = useCallback(\n async (input: DSLObject): Promise<DSLObject> => {\n let processed: DSLObject = input;\n const { overrides, beforeRender } = optionsRef.current;\n\n if (overrides && overrides.length > 0) {\n try {\n processed = applyOverrides(processed, overrides);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'syntax',\n `Failed to apply overrides: ${formatErrorMessage(error)}`,\n JSON.stringify(processed),\n error,\n );\n optionsRef.current.onError?.(infographicError);\n throw infographicError;\n }\n }\n\n if (beforeRender) {\n try {\n processed = await beforeRender(processed);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'runtime',\n `beforeRender hook failed: ${formatErrorMessage(error)}`,\n JSON.stringify(processed),\n error,\n );\n optionsRef.current.onError?.(infographicError);\n throw infographicError;\n }\n }\n\n return processed;\n },\n [],\n );\n\n return { processDSL };\n}\n","import { useCallback, useRef } from 'react';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type { InfographicError, InfographicRenderResult, PostRenderHook } from '../types';\n\ninterface RenderCallbackOptions {\n afterRender?: PostRenderHook;\n onRender?: (result: InfographicRenderResult) => void;\n onLoad?: (result: InfographicRenderResult) => void;\n onError?: (error: InfographicError) => void;\n}\n\nexport function useRenderCallback(options: RenderCallbackOptions) {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const handleRendered = useCallback(\n async (result: InfographicRenderResult) => {\n const { afterRender, onRender, onLoad } = optionsRef.current;\n\n if (afterRender) {\n try {\n await afterRender(result);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'runtime',\n `afterRender hook failed: ${formatErrorMessage(error)}`,\n undefined,\n error,\n );\n optionsRef.current.onError?.(infographicError);\n return;\n }\n }\n\n onRender?.(result);\n onLoad?.(result);\n },\n [],\n );\n\n return { handleRendered };\n}\n","export const RENDER_DEBOUNCE_DELAY = 100;\n","import { useCallback, useRef } from 'react';\nimport { debounce } from 'lodash-es';\nimport { RENDER_DEBOUNCE_DELAY } from '../constants';\nimport type {\n DSLInput,\n DSLObject,\n InfographicOptions,\n ThemeConfig,\n} from '../types';\n\ninterface RenderControllerProps {\n dsl?: DSLInput;\n width?: number | string;\n height?: number | string;\n theme?: string;\n editable?: boolean;\n className?: string;\n}\n\nexport function useRenderController(\n containerRef: React.RefObject<HTMLElement>,\n rendererRender: (options: Partial<InfographicOptions>) => void,\n props: RenderControllerProps,\n processDSL: (input: DSLObject) => Promise<DSLObject>,\n onError?: (error: unknown) => void,\n) {\n const propsRef = useRef(props);\n const dslCacheRef = useRef<string | null>(null);\n\n propsRef.current = props;\n\n const render = useCallback(async () => {\n const { dsl, width, height, theme, editable, className } = propsRef.current;\n\n if (!dsl) {\n throw new Error('DSL prop is required');\n }\n\n const processedDSL: DSLObject = await processDSL(dsl);\n\n const dslString = JSON.stringify(processedDSL);\n if (dslCacheRef.current !== dslString) {\n dslCacheRef.current = dslString;\n\n const { palette, ...restDSL } = processedDSL;\n\n const renderOptions: Partial<InfographicOptions> = { ...restDSL, data: processedDSL.data };\n\n if (processedDSL.theme) {\n renderOptions.theme = processedDSL.theme;\n } else if (theme) {\n renderOptions.theme = theme;\n }\n\n if (palette) {\n const existingThemeConfig = (processedDSL.themeConfig || {}) as ThemeConfig;\n renderOptions.themeConfig = {\n ...existingThemeConfig,\n palette,\n };\n }\n\n if (editable !== undefined) {\n renderOptions.editable = editable;\n }\n\n if (width || height) {\n renderOptions.width = width;\n renderOptions.height = height;\n }\n\n if (containerRef.current && className) {\n containerRef.current.className = className;\n }\n\n rendererRender(renderOptions);\n }\n }, [containerRef, rendererRender, processDSL]);\n\n const debouncedRender = useCallback(\n debounce(() => {\n render().catch((error) => {\n onError?.(error);\n });\n }, RENDER_DEBOUNCE_DELAY),\n [render, onError],\n );\n\n return { debouncedRender };\n}\n","import { useCallback, useRef } from 'react';\nimport type { DSLInput, DSLObject, InfographicOptions, Palette, ThemeConfig } from '../types';\n\ninterface RefMethodsProps {\n processDSL: (input: DSLObject) => Promise<DSLObject>;\n theme?: string;\n}\n\nexport function useRefMethods(\n update: (options: Partial<InfographicOptions>) => void,\n { processDSL, theme }: RefMethodsProps,\n) {\n const themeRef = useRef(theme);\n themeRef.current = theme;\n\n const refUpdate = useCallback(\n async (options: DSLInput) => {\n const processed: DSLObject = await processDSL(options);\n const { palette, ...restProcessed } = processed;\n const themeConfig = (processed.themeConfig || {}) as ThemeConfig;\n\n if (palette) {\n themeConfig.palette = palette as Palette;\n }\n\n const renderOptions: Partial<InfographicOptions> = {\n ...restProcessed,\n theme: processed.theme ?? themeRef.current,\n themeConfig,\n };\n\n update(renderOptions);\n },\n [update, processDSL],\n );\n\n return { refUpdate };\n}\n","import { useEffect } from 'react';\nimport { useRenderer } from './useRenderer';\nimport { useDSLProcessor } from './useDSLProcessor';\nimport { useRenderCallback } from './useRenderCallback';\nimport { useRenderController } from './useRenderController';\nimport { useRefMethods } from './useRefMethods';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type {\n InfographicProps,\n InfographicRef,\n InfographicError,\n} from '../types';\n\nexport function useInfographic(\n containerRef: React.RefObject<HTMLElement>,\n props: InfographicProps,\n) {\n const { render: rendererRender, update, toDataURL, getTypes, destroy, on, off } = useRenderer(containerRef);\n\n const { processDSL } = useDSLProcessor({\n overrides: props.overrides,\n beforeRender: props.beforeRender,\n onError: props.onError,\n });\n\n const { handleRendered } = useRenderCallback({\n afterRender: props.afterRender,\n onRender: props.onRender,\n onLoad: props.onLoad,\n onError: props.onError,\n });\n\n const { debouncedRender } = useRenderController(\n containerRef,\n rendererRender,\n props,\n processDSL,\n (error) => {\n const infographicError: InfographicError = createInfographicError(\n 'render',\n formatErrorMessage(error),\n undefined,\n error,\n );\n props.onError?.(infographicError);\n },\n );\n\n const { refUpdate } = useRefMethods(update, { processDSL, theme: props.theme });\n\n useEffect(() => {\n on('rendered', handleRendered);\n on('loaded', handleRendered);\n\n return () => {\n off('rendered', handleRendered);\n off('loaded', handleRendered);\n };\n }, [on, off, handleRendered]);\n\n useEffect(() => {\n debouncedRender();\n return debouncedRender.cancel;\n }, [debouncedRender]);\n\n const ref: InfographicRef = {\n toDataURL,\n getTypes,\n update: refUpdate,\n destroy,\n };\n\n return ref;\n}\n","export const errorOverlayStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.05)',\n color: '#d32f2f',\n padding: '20px',\n zIndex: 1,\n textAlign: 'center',\n};\n\nexport const errorTitleStyles: React.CSSProperties = {\n fontSize: '1.2em',\n fontWeight: 'bold',\n marginBottom: '10px',\n};\n\nexport const errorMessageStyles: React.CSSProperties = {\n marginBottom: '15px',\n};\n\nexport const retryButtonStyles: React.CSSProperties = {\n padding: '8px 16px',\n backgroundColor: '#1976d2',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '14px',\n};\n\nexport const errorBoundaryContainerStyles: React.CSSProperties = {\n padding: '20px',\n backgroundColor: '#fee',\n border: '1px solid #fcc',\n borderRadius: '4px',\n color: '#c33',\n};\n\nexport const errorBoundaryTitleStyles: React.CSSProperties = {\n marginTop: 0,\n};\n\nexport const errorBoundaryStackStyles: React.CSSProperties = {\n marginTop: '10px',\n padding: '10px',\n backgroundColor: 'white',\n borderRadius: '4px',\n overflow: 'auto',\n};\n\nexport const errorBoundaryRetryButtonStyles: React.CSSProperties = {\n marginTop: '15px',\n padding: '8px 16px',\n backgroundColor: '#c33',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n};\n","import React, { forwardRef, useImperativeHandle, useRef, useState } from 'react';\nimport { useInfographic } from '../hooks';\nimport type { InfographicProps, InfographicRef, InfographicError } from '../types';\nimport {\n errorOverlayStyles,\n errorTitleStyles,\n errorMessageStyles,\n retryButtonStyles,\n} from './styles';\n\nconst defaultError: InfographicError = {\n type: 'render',\n message: 'An error occurred while rendering the infographic.',\n};\n\nfunction InfographicComponent(\n props: InfographicProps,\n ref: React.Ref<InfographicRef>,\n) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<InfographicError | null>(null);\n const [errorKey, setErrorKey] = useState(0);\n\n const infographicRef = useInfographic(containerRef, {\n ...props,\n onError: (err) => {\n setError(err);\n props.onError?.(err);\n },\n });\n\n useImperativeHandle(ref, () => infographicRef, [infographicRef]);\n\n const handleRetry = () => {\n setError(null);\n setErrorKey((prev) => prev + 1);\n };\n\n const containerStyle: React.CSSProperties = {\n width: props.width ?? '100%',\n height: props.height ?? 'auto',\n overflow: 'hidden',\n };\n\n return (\n <>\n <div\n key={`infographic-container-${errorKey}`}\n ref={containerRef}\n className={props.className}\n style={containerStyle}\n data-infographic-container\n />\n {error && (\n <div style={errorOverlayStyles}>\n <div style={errorTitleStyles}>Infographic Render Error</div>\n <div style={errorMessageStyles}>{error.message || defaultError.message}</div>\n <button type=\"button\" onClick={handleRetry} style={retryButtonStyles}>\n Retry\n </button>\n </div>\n )}\n </>\n );\n}\n\nexport const Infographic = forwardRef(InfographicComponent);\n","import { Component, ErrorInfo, ReactNode } from 'react';\nimport {\n errorBoundaryContainerStyles,\n errorBoundaryTitleStyles,\n errorBoundaryStackStyles,\n errorBoundaryRetryButtonStyles,\n} from './styles';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error, errorInfo: ErrorInfo) => ReactNode);\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error?: Error;\n errorInfo?: ErrorInfo;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.setState({ errorInfo });\n this.props.onError?.(error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: undefined, errorInfo: undefined });\n };\n\n render() {\n const { hasError, error, errorInfo } = this.state;\n const { children, fallback } = this.props;\n\n if (!hasError || !error) {\n return children;\n }\n\n if (fallback) {\n if (typeof fallback === 'function') {\n return fallback(error, errorInfo!);\n }\n return fallback;\n }\n\n return (\n <div style={errorBoundaryContainerStyles}>\n <h2 style={errorBoundaryTitleStyles}>Something went wrong</h2>\n <p>{error.message}</p>\n {errorInfo && (\n <details style={{ marginTop: '10px' }}>\n <summary>Stack trace</summary>\n <pre style={errorBoundaryStackStyles}>{errorInfo.componentStack}</pre>\n </details>\n )}\n <button type=\"button\" onClick={this.handleReset} style={errorBoundaryRetryButtonStyles}>\n Try again\n </button>\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useRenderer.ts","../src/utils/path.ts","../src/utils/dsl/merge.ts","../src/utils/dsl/compose.ts","../src/utils/error.ts","../src/hooks/useDSLProcessor.ts","../src/hooks/useRenderCallback.ts","../src/constants/index.ts","../src/hooks/useRenderController.ts","../src/hooks/useRefMethods.ts","../src/hooks/useInfographic.ts","../src/components/styles.ts","../src/components/Infographic.tsx","../src/components/ErrorBoundary.tsx"],"names":["useRef","useCallback","listeners","useEffect","debounce","useState","useImperativeHandle","jsxs","Fragment","jsx","forwardRef","Component"],"mappings":"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","file":"index.js","sourcesContent":["import { useEffect, useRef, useCallback } from 'react';\nimport type {\n InfographicOptions,\n RendererInstance,\n ExportOptions,\n} from '../types';\n\nexport function useRenderer(containerRef: React.RefObject<HTMLElement>) {\n const rendererRef = useRef<RendererInstance | null>(null);\n const isInitializedRef = useRef(false);\n const pendingListenersRef = useRef<Map<string, Set<(...args: any[]) => void>>>(new Map());\n const attachedListenersRef = useRef<Map<string, Set<(...args: any[]) => void>>>(new Map());\n\n const createRenderer = useCallback(\n async (options: string | Partial<InfographicOptions>, container: HTMLElement): Promise<RendererInstance> => {\n const { Infographic: InfographicClass } = await import('@antv/infographic');\n\n let renderer: RendererInstance;\n\n if (typeof options === 'string') {\n renderer = new InfographicClass(options);\n } else {\n renderer = new InfographicClass({ ...options, container });\n }\n\n renderer.on('rendered', () => {\n rendererRef.current = renderer;\n isInitializedRef.current = true;\n\n pendingListenersRef.current.forEach((listeners, event) => {\n listeners.forEach((listener) => {\n renderer.on(event, listener);\n });\n });\n pendingListenersRef.current.clear();\n });\n\n renderer.on('error', (error) => {\n console.error('[Infographic-for-React] Renderer error:', error);\n });\n\n if (typeof options === 'string') {\n renderer.render({ container });\n } else {\n renderer.render();\n }\n\n return renderer;\n },\n [],\n );\n\n const render = useCallback(\n async (options: string | Partial<InfographicOptions>) => {\n const container = containerRef.current;\n if (!container) {\n throw new Error('Container element not found');\n }\n\n if (rendererRef.current) {\n if (typeof options === 'string') {\n rendererRef.current.update(options);\n } else {\n rendererRef.current.update({ ...options, container });\n }\n } else {\n await createRenderer(options, container);\n }\n },\n [containerRef, createRenderer],\n );\n\n const update = useCallback((options: string | Partial<InfographicOptions>) => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized. Call render first.');\n }\n rendererRef.current.update(options);\n }, []);\n\n const toDataURL = useCallback(\n (options?: ExportOptions): Promise<string> => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized');\n }\n return rendererRef.current.toDataURL(options);\n },\n [],\n );\n\n const getTypes = useCallback(() => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized');\n }\n return rendererRef.current.getTypes();\n }, []);\n\n const destroy = useCallback(() => {\n if (rendererRef.current) {\n attachedListenersRef.current.forEach((listeners, event) => {\n listeners.forEach((listener) => {\n rendererRef.current?.off(event, listener);\n });\n });\n attachedListenersRef.current.clear();\n\n rendererRef.current.destroy();\n rendererRef.current = null;\n }\n isInitializedRef.current = false;\n }, []);\n\n const on = useCallback((event: string, listener: (...args: any[]) => void) => {\n if (!rendererRef.current) {\n const listeners = pendingListenersRef.current.get(event) || new Set();\n listeners.add(listener);\n pendingListenersRef.current.set(event, listeners);\n return;\n }\n const listeners = attachedListenersRef.current.get(event) || new Set();\n listeners.add(listener);\n attachedListenersRef.current.set(event, listeners);\n rendererRef.current.on(event, listener);\n }, []);\n\n const off = useCallback((event: string, listener: (...args: any[]) => void) => {\n if (!rendererRef.current) {\n const listeners = pendingListenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n pendingListenersRef.current.delete(event);\n }\n }\n return;\n }\n rendererRef.current.off(event, listener);\n const listeners = attachedListenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n attachedListenersRef.current.delete(event);\n }\n }\n }, []);\n\n useEffect(() => {\n return () => {\n destroy();\n };\n }, [destroy]);\n\n return {\n render,\n update,\n toDataURL,\n getTypes,\n destroy,\n on,\n off,\n isReady: isInitializedRef.current,\n };\n}\n","export interface PathSegment {\n type: 'key' | 'index';\n value: string | number;\n}\n\nfunction parsePath(path: string): PathSegment[] {\n const segments: PathSegment[] = [];\n const regex = /([^.[\\]]+)|\\[(\\d+)\\]/g;\n let match;\n\n while ((match = regex.exec(path)) !== null) {\n if (match[1] !== undefined) {\n segments.push({ type: 'key', value: match[1] });\n } else if (match[2] !== undefined) {\n segments.push({ type: 'index', value: parseInt(match[2], 10) });\n }\n }\n\n return segments;\n}\n\nexport function setByPath(obj: Record<string, unknown>, path: string, value: unknown): void {\n const segments = parsePath(path);\n\n if (segments.length === 0) {\n throw new Error(`Invalid path: ${path}`);\n }\n\n let current: unknown = obj;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const isLast = i === segments.length - 1;\n\n if (typeof current !== 'object' || current === null) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n\n if (segment.type === 'key') {\n const currentObj = current as Record<string, unknown>;\n if (isLast) {\n currentObj[segment.value] = value;\n } else {\n const nextValue = currentObj[segment.value];\n if (nextValue !== undefined && (typeof nextValue !== 'object' || nextValue === null)) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n if (typeof nextValue !== 'object' || nextValue === null) {\n currentObj[segment.value] = {};\n }\n current = currentObj[segment.value];\n }\n } else {\n const currentArray = current as unknown[];\n if (!Array.isArray(currentArray)) {\n throw new Error(`Cannot access array index at path \"${path}\": parent is not an array`);\n }\n const index = segment.value as number;\n if (isLast) {\n currentArray[index] = value;\n } else {\n const nextValue = currentArray[index];\n if (nextValue !== undefined && (typeof nextValue !== 'object' || nextValue === null)) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n if (typeof nextValue !== 'object' || nextValue === null) {\n currentArray[index] = {};\n }\n current = currentArray[index];\n }\n }\n }\n}\n\nexport function getByPath(obj: Record<string, unknown>, path: string): unknown {\n const segments = parsePath(path);\n\n if (segments.length === 0) {\n return undefined;\n }\n\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (typeof current !== 'object' || current === null) {\n return undefined;\n }\n\n if (segment.type === 'key') {\n current = (current as Record<string, unknown>)[segment.value];\n } else {\n if (!Array.isArray(current)) {\n return undefined;\n }\n const index = segment.value as number;\n current = current[index];\n }\n }\n\n return current;\n}\n","import type { DSLOverride, DSLObject } from '../../types';\nimport { setByPath } from '../path';\n\nexport function applyOverrides(base: DSLObject, overrides: DSLOverride[]): DSLObject {\n if (overrides.length === 0) return base;\n\n const result = { ...base };\n\n for (const override of overrides) {\n setByPath(result as Record<string, unknown>, override.path, override.value);\n }\n\n return result;\n}\n\nexport function mergeDSL(dsl1: DSLObject, dsl2: DSLObject): DSLObject {\n const merged = deepMerge(dsl1 as unknown as Record<string, unknown>, dsl2 as unknown as Record<string, unknown>);\n return merged as unknown as DSLObject;\n}\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = { ...target };\n\n for (const key in source) {\n if (source[key] === undefined) {\n continue;\n }\n\n const value = source[key];\n\n if (value === null) {\n result[key] = null;\n continue;\n }\n\n const targetValue = result[key];\n\n if (typeof value === 'object' && !Array.isArray(value) && targetValue && typeof targetValue === 'object' && !Array.isArray(targetValue)) {\n result[key] = deepMerge(targetValue as Record<string, unknown>, value as Record<string, unknown>);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n","import type { ComposeTemplateOptions, DSLObject } from '../../types';\nimport { applyOverrides } from './merge';\n\ninterface DSLNode {\n type?: string;\n data?: unknown;\n props?: Record<string, unknown>;\n children?: DSLNode[];\n [key: string]: unknown;\n}\n\nfunction isContainerNode(node: unknown): node is DSLNode {\n return (\n typeof node === 'object' &&\n node !== null &&\n 'children' in node &&\n Array.isArray((node as DSLNode).children)\n );\n}\n\nexport function composeTemplates(options: ComposeTemplateOptions): DSLObject {\n const { templates, overrides = [] } = options;\n\n if (templates.length === 0) {\n throw new Error('At least one template is required');\n }\n\n if (templates.length === 1) {\n const base = templates[0];\n if (overrides.length > 0) {\n return applyOverrides(base, overrides);\n }\n return base;\n }\n\n const root = templates[0] as DSLNode;\n\n if (!isContainerNode(root)) {\n throw new Error('Root template must be a container node with children');\n }\n\n let currentChildren = root.children || [];\n\n for (let i = 1; i < templates.length; i++) {\n const template = templates[i] as DSLNode;\n\n if (isContainerNode(template) && template.children) {\n currentChildren = [...currentChildren, ...template.children];\n } else {\n currentChildren.push(template);\n }\n }\n\n root.children = currentChildren;\n\n let composed = root as DSLObject;\n\n if (overrides.length > 0) {\n composed = applyOverrides(composed, overrides);\n }\n\n return composed;\n}\n","import type { InfographicError } from '../types';\n\nexport function createInfographicError(\n type: InfographicError['type'],\n message: string,\n dsl?: string,\n details?: Error | unknown,\n): InfographicError {\n return {\n type,\n message,\n dsl,\n details,\n };\n}\n\nexport function isInfographicError(error: unknown): error is InfographicError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'type' in error &&\n 'message' in error &&\n ['syntax', 'render', 'runtime'].includes((error as InfographicError).type)\n );\n}\n\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { useCallback, useRef } from 'react';\nimport { applyOverrides } from '../utils/dsl';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type {\n InfographicError,\n DSLObject,\n PreRenderHook,\n DSLOverride,\n} from '../types';\n\ninterface DSLProcessorOptions {\n overrides?: DSLOverride[];\n beforeRender?: PreRenderHook;\n onError?: (error: InfographicError) => void;\n}\n\nexport function useDSLProcessor(options: DSLProcessorOptions) {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const processDSL = useCallback(\n async (input: DSLObject): Promise<DSLObject> => {\n let processed: DSLObject = input;\n const { overrides, beforeRender } = optionsRef.current;\n\n if (overrides && overrides.length > 0) {\n try {\n processed = applyOverrides(processed, overrides);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'syntax',\n `Failed to apply overrides: ${formatErrorMessage(error)}`,\n JSON.stringify(processed),\n error,\n );\n optionsRef.current.onError?.(infographicError);\n throw infographicError;\n }\n }\n\n if (beforeRender) {\n try {\n processed = await beforeRender(processed);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'runtime',\n `beforeRender hook failed: ${formatErrorMessage(error)}`,\n JSON.stringify(processed),\n error,\n );\n optionsRef.current.onError?.(infographicError);\n throw infographicError;\n }\n }\n\n return processed;\n },\n [],\n );\n\n return { processDSL };\n}\n","import { useCallback, useRef } from 'react';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type { InfographicError, InfographicRenderResult, PostRenderHook } from '../types';\n\ninterface RenderCallbackOptions {\n afterRender?: PostRenderHook;\n onRender?: (result: InfographicRenderResult) => void;\n onLoad?: (result: InfographicRenderResult) => void;\n onError?: (error: InfographicError) => void;\n}\n\nexport function useRenderCallback(options: RenderCallbackOptions) {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const handleRendered = useCallback(\n async (result: InfographicRenderResult) => {\n const { afterRender, onRender, onLoad } = optionsRef.current;\n\n if (afterRender) {\n try {\n await afterRender(result);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'runtime',\n `afterRender hook failed: ${formatErrorMessage(error)}`,\n undefined,\n error,\n );\n optionsRef.current.onError?.(infographicError);\n return;\n }\n }\n\n onRender?.(result);\n onLoad?.(result);\n },\n [],\n );\n\n return { handleRendered };\n}\n","export const RENDER_DEBOUNCE_DELAY = 100;\n","import { useCallback, useRef } from 'react';\nimport { debounce } from 'lodash-es';\nimport { RENDER_DEBOUNCE_DELAY } from '../constants';\nimport type {\n DSLInput,\n DSLObject,\n InfographicOptions,\n ThemeConfig,\n} from '../types';\n\ninterface RenderControllerProps {\n dsl?: DSLInput;\n width?: number | string;\n height?: number | string;\n theme?: string;\n editable?: boolean;\n className?: string;\n}\n\nexport function useRenderController(\n containerRef: React.RefObject<HTMLElement>,\n rendererRender: (options: string | Partial<InfographicOptions>) => void,\n props: RenderControllerProps,\n processDSL: (input: DSLObject) => Promise<DSLObject>,\n onError?: (error: unknown) => void,\n) {\n const propsRef = useRef(props);\n const dslCacheRef = useRef<string | null>(null);\n const stringDslCacheRef = useRef<string | null>(null);\n\n propsRef.current = props;\n\n const render = useCallback(async () => {\n const { dsl, width, height, theme, editable, className } = propsRef.current;\n\n if (!dsl) {\n throw new Error('DSL prop is required');\n }\n\n if (containerRef.current && className) {\n containerRef.current.className = className;\n }\n\n if (typeof dsl === 'string') {\n const trimmedDsl = dsl.trim();\n if (!trimmedDsl) {\n throw new Error('String DSL cannot be empty or contain only whitespace');\n }\n if (stringDslCacheRef.current !== trimmedDsl) {\n stringDslCacheRef.current = trimmedDsl;\n rendererRender(trimmedDsl);\n }\n } else {\n const processedDSL: DSLObject = await processDSL(dsl);\n\n const dslString = JSON.stringify(processedDSL);\n if (dslCacheRef.current !== dslString) {\n dslCacheRef.current = dslString;\n\n const { palette, ...restDSL } = processedDSL;\n\n const renderOptions: Partial<InfographicOptions> = {\n ...restDSL,\n data: processedDSL.data,\n width,\n height,\n editable,\n };\n\n if (processedDSL.theme) {\n renderOptions.theme = processedDSL.theme;\n } else if (theme) {\n renderOptions.theme = theme;\n }\n\n if (palette) {\n const existingThemeConfig = (processedDSL.themeConfig || {}) as ThemeConfig;\n renderOptions.themeConfig = {\n ...existingThemeConfig,\n palette,\n };\n }\n\n rendererRender(renderOptions);\n }\n }\n }, [containerRef, rendererRender, processDSL]);\n\n const debouncedRender = useCallback(\n debounce(() => {\n render().catch((error) => {\n onError?.(error);\n });\n }, RENDER_DEBOUNCE_DELAY),\n [render, onError],\n );\n\n return { debouncedRender };\n}\n","import { useCallback, useRef } from 'react';\nimport type { DSLInput, DSLObject, InfographicOptions, Palette, ThemeConfig } from '../types';\n\ninterface RefMethodsProps {\n processDSL: (input: DSLObject) => Promise<DSLObject>;\n theme?: string;\n}\n\nexport function useRefMethods(\n update: (options: string | Partial<InfographicOptions>) => void,\n { processDSL, theme }: RefMethodsProps,\n) {\n const themeRef = useRef(theme);\n themeRef.current = theme;\n\n const refUpdate = useCallback(\n async (options: DSLInput) => {\n if (typeof options === 'string') {\n update(options);\n return;\n }\n\n const processed: DSLObject = await processDSL(options);\n const { palette, ...restProcessed } = processed;\n const themeConfig = (processed.themeConfig || {}) as ThemeConfig;\n\n if (palette) {\n themeConfig.palette = palette as Palette;\n }\n\n const renderOptions: Partial<InfographicOptions> = {\n ...restProcessed,\n theme: processed.theme ?? themeRef.current,\n themeConfig,\n };\n\n update(renderOptions);\n },\n [update, processDSL],\n );\n\n return { refUpdate };\n}\n","import { useEffect } from 'react';\nimport { useRenderer } from './useRenderer';\nimport { useDSLProcessor } from './useDSLProcessor';\nimport { useRenderCallback } from './useRenderCallback';\nimport { useRenderController } from './useRenderController';\nimport { useRefMethods } from './useRefMethods';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type {\n InfographicProps,\n InfographicRef,\n InfographicError,\n} from '../types';\n\nexport function useInfographic(\n containerRef: React.RefObject<HTMLElement>,\n props: InfographicProps,\n) {\n const { render: rendererRender, update, toDataURL, getTypes, destroy, on, off } = useRenderer(containerRef);\n\n const { processDSL } = useDSLProcessor({\n overrides: props.overrides,\n beforeRender: props.beforeRender,\n onError: props.onError,\n });\n\n const { handleRendered } = useRenderCallback({\n afterRender: props.afterRender,\n onRender: props.onRender,\n onLoad: props.onLoad,\n onError: props.onError,\n });\n\n const { debouncedRender } = useRenderController(\n containerRef,\n rendererRender,\n props,\n processDSL,\n (error) => {\n const infographicError: InfographicError = createInfographicError(\n 'render',\n formatErrorMessage(error),\n undefined,\n error,\n );\n props.onError?.(infographicError);\n },\n );\n\n const { refUpdate } = useRefMethods((options) => update(options), { processDSL, theme: props.theme });\n\n useEffect(() => {\n on('rendered', handleRendered);\n on('loaded', handleRendered);\n\n return () => {\n off('rendered', handleRendered);\n off('loaded', handleRendered);\n };\n }, [on, off, handleRendered]);\n\n useEffect(() => {\n debouncedRender();\n return debouncedRender.cancel;\n }, [debouncedRender]);\n\n const ref: InfographicRef = {\n toDataURL,\n getTypes,\n update: refUpdate,\n destroy,\n };\n\n return ref;\n}\n","export const errorOverlayStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.05)',\n color: '#d32f2f',\n padding: '20px',\n zIndex: 1,\n textAlign: 'center',\n};\n\nexport const errorTitleStyles: React.CSSProperties = {\n fontSize: '1.2em',\n fontWeight: 'bold',\n marginBottom: '10px',\n};\n\nexport const errorMessageStyles: React.CSSProperties = {\n marginBottom: '15px',\n};\n\nexport const retryButtonStyles: React.CSSProperties = {\n padding: '8px 16px',\n backgroundColor: '#1976d2',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '14px',\n};\n\nexport const errorBoundaryContainerStyles: React.CSSProperties = {\n padding: '20px',\n backgroundColor: '#fee',\n border: '1px solid #fcc',\n borderRadius: '4px',\n color: '#c33',\n};\n\nexport const errorBoundaryTitleStyles: React.CSSProperties = {\n marginTop: 0,\n};\n\nexport const errorBoundaryStackStyles: React.CSSProperties = {\n marginTop: '10px',\n padding: '10px',\n backgroundColor: 'white',\n borderRadius: '4px',\n overflow: 'auto',\n};\n\nexport const errorBoundaryRetryButtonStyles: React.CSSProperties = {\n marginTop: '15px',\n padding: '8px 16px',\n backgroundColor: '#c33',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n};\n","import React, { forwardRef, useImperativeHandle, useRef, useState } from 'react';\nimport { useInfographic } from '../hooks';\nimport type { InfographicProps, InfographicRef, InfographicError } from '../types';\nimport {\n errorOverlayStyles,\n errorTitleStyles,\n errorMessageStyles,\n retryButtonStyles,\n} from './styles';\n\nconst defaultError: InfographicError = {\n type: 'render',\n message: 'An error occurred while rendering the infographic.',\n};\n\nfunction InfographicComponent(\n props: InfographicProps,\n ref: React.Ref<InfographicRef>,\n) {\n const { children, dsl: dslProp, ...restProps } = props;\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<InfographicError | null>(null);\n const [errorKey, setErrorKey] = useState(0);\n console.log('children--------------', children)\n const childrenDsl = children ? String(children).trim() : undefined;\n const finalDsl = childrenDsl || dslProp;\n\n if (!finalDsl) {\n throw new Error('Either children or dsl prop must be provided');\n }\n\n const infographicRef = useInfographic(containerRef, {\n ...restProps,\n dsl: finalDsl,\n onError: (err) => {\n setError(err);\n props.onError?.(err);\n },\n });\n\n useImperativeHandle(ref, () => infographicRef, [infographicRef]);\n\n const handleRetry = () => {\n setError(null);\n setErrorKey((prev) => prev + 1);\n };\n\n const containerStyle: React.CSSProperties = {\n width: props.width ?? '100%',\n height: props.height ?? 'auto',\n overflow: 'hidden',\n };\n\n return (\n <>\n <div\n key={`infographic-container-${errorKey}`}\n ref={containerRef}\n className={props.className}\n style={containerStyle}\n data-infographic-container\n />\n {error && (\n <div style={errorOverlayStyles}>\n <div style={errorTitleStyles}>Infographic Render Error</div>\n <div style={errorMessageStyles}>{error.message || defaultError.message}</div>\n <button type=\"button\" onClick={handleRetry} style={retryButtonStyles}>\n Retry\n </button>\n </div>\n )}\n </>\n );\n}\n\nexport const Infographic = forwardRef(InfographicComponent);\n","import { Component, ErrorInfo, ReactNode } from 'react';\nimport {\n errorBoundaryContainerStyles,\n errorBoundaryTitleStyles,\n errorBoundaryStackStyles,\n errorBoundaryRetryButtonStyles,\n} from './styles';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error, errorInfo: ErrorInfo) => ReactNode);\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error?: Error;\n errorInfo?: ErrorInfo;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.setState({ errorInfo });\n this.props.onError?.(error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: undefined, errorInfo: undefined });\n };\n\n render() {\n const { hasError, error, errorInfo } = this.state;\n const { children, fallback } = this.props;\n\n if (!hasError || !error) {\n return children;\n }\n\n if (fallback) {\n if (typeof fallback === 'function') {\n return fallback(error, errorInfo!);\n }\n return fallback;\n }\n\n return (\n <div style={errorBoundaryContainerStyles}>\n <h2 style={errorBoundaryTitleStyles}>Something went wrong</h2>\n <p>{error.message}</p>\n {errorInfo && (\n <details style={{ marginTop: '10px' }}>\n <summary>Stack trace</summary>\n <pre style={errorBoundaryStackStyles}>{errorInfo.componentStack}</pre>\n </details>\n )}\n <button type=\"button\" onClick={this.handleReset} style={errorBoundaryRetryButtonStyles}>\n Try again\n </button>\n </div>\n );\n }\n}\n"]}
package/dist/index.mjs CHANGED
@@ -9,9 +9,14 @@ function useRenderer(containerRef) {
9
9
  const pendingListenersRef = useRef(/* @__PURE__ */ new Map());
10
10
  const attachedListenersRef = useRef(/* @__PURE__ */ new Map());
11
11
  const createRenderer = useCallback(
12
- async (options) => {
12
+ async (options, container) => {
13
13
  const { Infographic: InfographicClass } = await import('@antv/infographic');
14
- const renderer = new InfographicClass(options);
14
+ let renderer;
15
+ if (typeof options === "string") {
16
+ renderer = new InfographicClass(options);
17
+ } else {
18
+ renderer = new InfographicClass({ ...options, container });
19
+ }
15
20
  renderer.on("rendered", () => {
16
21
  rendererRef.current = renderer;
17
22
  isInitializedRef.current = true;
@@ -25,7 +30,11 @@ function useRenderer(containerRef) {
25
30
  renderer.on("error", (error) => {
26
31
  console.error("[Infographic-for-React] Renderer error:", error);
27
32
  });
28
- renderer.render();
33
+ if (typeof options === "string") {
34
+ renderer.render({ container });
35
+ } else {
36
+ renderer.render();
37
+ }
29
38
  return renderer;
30
39
  },
31
40
  []
@@ -36,11 +45,14 @@ function useRenderer(containerRef) {
36
45
  if (!container) {
37
46
  throw new Error("Container element not found");
38
47
  }
39
- const renderOptions = { ...options, container };
40
48
  if (rendererRef.current) {
41
- rendererRef.current.update(renderOptions);
49
+ if (typeof options === "string") {
50
+ rendererRef.current.update(options);
51
+ } else {
52
+ rendererRef.current.update({ ...options, container });
53
+ }
42
54
  } else {
43
- await createRenderer(renderOptions);
55
+ await createRenderer(options, container);
44
56
  }
45
57
  },
46
58
  [containerRef, createRenderer]
@@ -354,41 +366,52 @@ var RENDER_DEBOUNCE_DELAY = 100;
354
366
  function useRenderController(containerRef, rendererRender, props, processDSL, onError) {
355
367
  const propsRef = useRef(props);
356
368
  const dslCacheRef = useRef(null);
369
+ const stringDslCacheRef = useRef(null);
357
370
  propsRef.current = props;
358
371
  const render = useCallback(async () => {
359
372
  const { dsl, width, height, theme, editable, className } = propsRef.current;
360
373
  if (!dsl) {
361
374
  throw new Error("DSL prop is required");
362
375
  }
363
- const processedDSL = await processDSL(dsl);
364
- const dslString = JSON.stringify(processedDSL);
365
- if (dslCacheRef.current !== dslString) {
366
- dslCacheRef.current = dslString;
367
- const { palette, ...restDSL } = processedDSL;
368
- const renderOptions = { ...restDSL, data: processedDSL.data };
369
- if (processedDSL.theme) {
370
- renderOptions.theme = processedDSL.theme;
371
- } else if (theme) {
372
- renderOptions.theme = theme;
373
- }
374
- if (palette) {
375
- const existingThemeConfig = processedDSL.themeConfig || {};
376
- renderOptions.themeConfig = {
377
- ...existingThemeConfig,
378
- palette
379
- };
380
- }
381
- if (editable !== void 0) {
382
- renderOptions.editable = editable;
376
+ if (containerRef.current && className) {
377
+ containerRef.current.className = className;
378
+ }
379
+ if (typeof dsl === "string") {
380
+ const trimmedDsl = dsl.trim();
381
+ if (!trimmedDsl) {
382
+ throw new Error("String DSL cannot be empty or contain only whitespace");
383
383
  }
384
- if (width || height) {
385
- renderOptions.width = width;
386
- renderOptions.height = height;
384
+ if (stringDslCacheRef.current !== trimmedDsl) {
385
+ stringDslCacheRef.current = trimmedDsl;
386
+ rendererRender(trimmedDsl);
387
387
  }
388
- if (containerRef.current && className) {
389
- containerRef.current.className = className;
388
+ } else {
389
+ const processedDSL = await processDSL(dsl);
390
+ const dslString = JSON.stringify(processedDSL);
391
+ if (dslCacheRef.current !== dslString) {
392
+ dslCacheRef.current = dslString;
393
+ const { palette, ...restDSL } = processedDSL;
394
+ const renderOptions = {
395
+ ...restDSL,
396
+ data: processedDSL.data,
397
+ width,
398
+ height,
399
+ editable
400
+ };
401
+ if (processedDSL.theme) {
402
+ renderOptions.theme = processedDSL.theme;
403
+ } else if (theme) {
404
+ renderOptions.theme = theme;
405
+ }
406
+ if (palette) {
407
+ const existingThemeConfig = processedDSL.themeConfig || {};
408
+ renderOptions.themeConfig = {
409
+ ...existingThemeConfig,
410
+ palette
411
+ };
412
+ }
413
+ rendererRender(renderOptions);
390
414
  }
391
- rendererRender(renderOptions);
392
415
  }
393
416
  }, [containerRef, rendererRender, processDSL]);
394
417
  const debouncedRender = useCallback(
@@ -406,6 +429,10 @@ function useRefMethods(update, { processDSL, theme }) {
406
429
  themeRef.current = theme;
407
430
  const refUpdate = useCallback(
408
431
  async (options) => {
432
+ if (typeof options === "string") {
433
+ update(options);
434
+ return;
435
+ }
409
436
  const processed = await processDSL(options);
410
437
  const { palette, ...restProcessed } = processed;
411
438
  const themeConfig = processed.themeConfig || {};
@@ -453,7 +480,7 @@ function useInfographic(containerRef, props) {
453
480
  props.onError?.(infographicError);
454
481
  }
455
482
  );
456
- const { refUpdate } = useRefMethods(update, { processDSL, theme: props.theme });
483
+ const { refUpdate } = useRefMethods((options) => update(options), { processDSL, theme: props.theme });
457
484
  useEffect(() => {
458
485
  on("rendered", handleRendered);
459
486
  on("loaded", handleRendered);
@@ -539,11 +566,19 @@ var defaultError = {
539
566
  message: "An error occurred while rendering the infographic."
540
567
  };
541
568
  function InfographicComponent(props, ref) {
569
+ const { children, dsl: dslProp, ...restProps } = props;
542
570
  const containerRef = useRef(null);
543
571
  const [error, setError] = useState(null);
544
572
  const [errorKey, setErrorKey] = useState(0);
573
+ console.log("children--------------", children);
574
+ const childrenDsl = children ? String(children).trim() : void 0;
575
+ const finalDsl = childrenDsl || dslProp;
576
+ if (!finalDsl) {
577
+ throw new Error("Either children or dsl prop must be provided");
578
+ }
545
579
  const infographicRef = useInfographic(containerRef, {
546
- ...props,
580
+ ...restProps,
581
+ dsl: finalDsl,
547
582
  onError: (err) => {
548
583
  setError(err);
549
584
  props.onError?.(err);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useRenderer.ts","../src/utils/path.ts","../src/utils/dsl/merge.ts","../src/utils/dsl/compose.ts","../src/utils/error.ts","../src/hooks/useDSLProcessor.ts","../src/hooks/useRenderCallback.ts","../src/constants/index.ts","../src/hooks/useRenderController.ts","../src/hooks/useRefMethods.ts","../src/hooks/useInfographic.ts","../src/components/styles.ts","../src/components/Infographic.tsx","../src/components/ErrorBoundary.tsx"],"names":["listeners","useRef","useCallback","useEffect","jsxs","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["import { useEffect, useRef, useCallback } from 'react';\nimport type {\n InfographicOptions,\n RendererInstance,\n ExportOptions,\n} from '../types';\n\nexport function useRenderer(containerRef: React.RefObject<HTMLElement>) {\n const rendererRef = useRef<RendererInstance | null>(null);\n const isInitializedRef = useRef(false);\n const pendingListenersRef = useRef<Map<string, Set<(...args: any[]) => void>>>(new Map());\n const attachedListenersRef = useRef<Map<string, Set<(...args: any[]) => void>>>(new Map());\n\n const createRenderer = useCallback(\n async (options: Partial<InfographicOptions>): Promise<RendererInstance> => {\n const { Infographic: InfographicClass } = await import('@antv/infographic');\n const renderer = new InfographicClass(options);\n\n renderer.on('rendered', () => {\n rendererRef.current = renderer;\n isInitializedRef.current = true;\n\n pendingListenersRef.current.forEach((listeners, event) => {\n listeners.forEach((listener) => {\n renderer.on(event, listener);\n });\n });\n pendingListenersRef.current.clear();\n });\n\n renderer.on('error', (error) => {\n console.error('[Infographic-for-React] Renderer error:', error);\n });\n\n renderer.render();\n\n return renderer;\n },\n [],\n );\n\n const render = useCallback(\n async (options: Partial<InfographicOptions>) => {\n const container = containerRef.current;\n if (!container) {\n throw new Error('Container element not found');\n }\n\n const renderOptions = { ...options, container };\n\n if (rendererRef.current) {\n rendererRef.current.update(renderOptions);\n } else {\n await createRenderer(renderOptions);\n }\n },\n [containerRef, createRenderer],\n );\n\n const update = useCallback((options: Partial<InfographicOptions>) => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized. Call render first.');\n }\n rendererRef.current.update(options);\n }, []);\n\n const toDataURL = useCallback(\n (options?: ExportOptions): Promise<string> => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized');\n }\n return rendererRef.current.toDataURL(options);\n },\n [],\n );\n\n const getTypes = useCallback(() => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized');\n }\n return rendererRef.current.getTypes();\n }, []);\n\n const destroy = useCallback(() => {\n if (rendererRef.current) {\n attachedListenersRef.current.forEach((listeners, event) => {\n listeners.forEach((listener) => {\n rendererRef.current?.off(event, listener);\n });\n });\n attachedListenersRef.current.clear();\n\n rendererRef.current.destroy();\n rendererRef.current = null;\n }\n isInitializedRef.current = false;\n }, []);\n\n const on = useCallback((event: string, listener: (...args: any[]) => void) => {\n if (!rendererRef.current) {\n const listeners = pendingListenersRef.current.get(event) || new Set();\n listeners.add(listener);\n pendingListenersRef.current.set(event, listeners);\n return;\n }\n const listeners = attachedListenersRef.current.get(event) || new Set();\n listeners.add(listener);\n attachedListenersRef.current.set(event, listeners);\n rendererRef.current.on(event, listener);\n }, []);\n\n const off = useCallback((event: string, listener: (...args: any[]) => void) => {\n if (!rendererRef.current) {\n const listeners = pendingListenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n pendingListenersRef.current.delete(event);\n }\n }\n return;\n }\n rendererRef.current.off(event, listener);\n const listeners = attachedListenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n attachedListenersRef.current.delete(event);\n }\n }\n }, []);\n\n useEffect(() => {\n return () => {\n destroy();\n };\n }, [destroy]);\n\n return {\n render,\n update,\n toDataURL,\n getTypes,\n destroy,\n on,\n off,\n isReady: isInitializedRef.current,\n };\n}\n","export interface PathSegment {\n type: 'key' | 'index';\n value: string | number;\n}\n\nfunction parsePath(path: string): PathSegment[] {\n const segments: PathSegment[] = [];\n const regex = /([^.[\\]]+)|\\[(\\d+)\\]/g;\n let match;\n\n while ((match = regex.exec(path)) !== null) {\n if (match[1] !== undefined) {\n segments.push({ type: 'key', value: match[1] });\n } else if (match[2] !== undefined) {\n segments.push({ type: 'index', value: parseInt(match[2], 10) });\n }\n }\n\n return segments;\n}\n\nexport function setByPath(obj: Record<string, unknown>, path: string, value: unknown): void {\n const segments = parsePath(path);\n\n if (segments.length === 0) {\n throw new Error(`Invalid path: ${path}`);\n }\n\n let current: unknown = obj;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const isLast = i === segments.length - 1;\n\n if (typeof current !== 'object' || current === null) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n\n if (segment.type === 'key') {\n const currentObj = current as Record<string, unknown>;\n if (isLast) {\n currentObj[segment.value] = value;\n } else {\n const nextValue = currentObj[segment.value];\n if (nextValue !== undefined && (typeof nextValue !== 'object' || nextValue === null)) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n if (typeof nextValue !== 'object' || nextValue === null) {\n currentObj[segment.value] = {};\n }\n current = currentObj[segment.value];\n }\n } else {\n const currentArray = current as unknown[];\n if (!Array.isArray(currentArray)) {\n throw new Error(`Cannot access array index at path \"${path}\": parent is not an array`);\n }\n const index = segment.value as number;\n if (isLast) {\n currentArray[index] = value;\n } else {\n const nextValue = currentArray[index];\n if (nextValue !== undefined && (typeof nextValue !== 'object' || nextValue === null)) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n if (typeof nextValue !== 'object' || nextValue === null) {\n currentArray[index] = {};\n }\n current = currentArray[index];\n }\n }\n }\n}\n\nexport function getByPath(obj: Record<string, unknown>, path: string): unknown {\n const segments = parsePath(path);\n\n if (segments.length === 0) {\n return undefined;\n }\n\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (typeof current !== 'object' || current === null) {\n return undefined;\n }\n\n if (segment.type === 'key') {\n current = (current as Record<string, unknown>)[segment.value];\n } else {\n if (!Array.isArray(current)) {\n return undefined;\n }\n const index = segment.value as number;\n current = current[index];\n }\n }\n\n return current;\n}\n","import type { DSLOverride, DSLObject } from '../../types';\nimport { setByPath } from '../path';\n\nexport function applyOverrides(base: DSLObject, overrides: DSLOverride[]): DSLObject {\n if (overrides.length === 0) return base;\n\n const result = { ...base };\n\n for (const override of overrides) {\n setByPath(result as Record<string, unknown>, override.path, override.value);\n }\n\n return result;\n}\n\nexport function mergeDSL(dsl1: DSLObject, dsl2: DSLObject): DSLObject {\n const merged = deepMerge(dsl1 as unknown as Record<string, unknown>, dsl2 as unknown as Record<string, unknown>);\n return merged as unknown as DSLObject;\n}\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = { ...target };\n\n for (const key in source) {\n if (source[key] === undefined) {\n continue;\n }\n\n const value = source[key];\n\n if (value === null) {\n result[key] = null;\n continue;\n }\n\n const targetValue = result[key];\n\n if (typeof value === 'object' && !Array.isArray(value) && targetValue && typeof targetValue === 'object' && !Array.isArray(targetValue)) {\n result[key] = deepMerge(targetValue as Record<string, unknown>, value as Record<string, unknown>);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n","import type { ComposeTemplateOptions, DSLObject } from '../../types';\nimport { applyOverrides } from './merge';\n\ninterface DSLNode {\n type?: string;\n data?: unknown;\n props?: Record<string, unknown>;\n children?: DSLNode[];\n [key: string]: unknown;\n}\n\nfunction isContainerNode(node: unknown): node is DSLNode {\n return (\n typeof node === 'object' &&\n node !== null &&\n 'children' in node &&\n Array.isArray((node as DSLNode).children)\n );\n}\n\nexport function composeTemplates(options: ComposeTemplateOptions): DSLObject {\n const { templates, overrides = [] } = options;\n\n if (templates.length === 0) {\n throw new Error('At least one template is required');\n }\n\n if (templates.length === 1) {\n const base = templates[0];\n if (overrides.length > 0) {\n return applyOverrides(base, overrides);\n }\n return base;\n }\n\n const root = templates[0] as DSLNode;\n\n if (!isContainerNode(root)) {\n throw new Error('Root template must be a container node with children');\n }\n\n let currentChildren = root.children || [];\n\n for (let i = 1; i < templates.length; i++) {\n const template = templates[i] as DSLNode;\n\n if (isContainerNode(template) && template.children) {\n currentChildren = [...currentChildren, ...template.children];\n } else {\n currentChildren.push(template);\n }\n }\n\n root.children = currentChildren;\n\n let composed = root as DSLObject;\n\n if (overrides.length > 0) {\n composed = applyOverrides(composed, overrides);\n }\n\n return composed;\n}\n","import type { InfographicError } from '../types';\n\nexport function createInfographicError(\n type: InfographicError['type'],\n message: string,\n dsl?: string,\n details?: Error | unknown,\n): InfographicError {\n return {\n type,\n message,\n dsl,\n details,\n };\n}\n\nexport function isInfographicError(error: unknown): error is InfographicError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'type' in error &&\n 'message' in error &&\n ['syntax', 'render', 'runtime'].includes((error as InfographicError).type)\n );\n}\n\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { useCallback, useRef } from 'react';\nimport { applyOverrides } from '../utils/dsl';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type {\n InfographicError,\n DSLObject,\n PreRenderHook,\n DSLOverride,\n} from '../types';\n\ninterface DSLProcessorOptions {\n overrides?: DSLOverride[];\n beforeRender?: PreRenderHook;\n onError?: (error: InfographicError) => void;\n}\n\nexport function useDSLProcessor(options: DSLProcessorOptions) {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const processDSL = useCallback(\n async (input: DSLObject): Promise<DSLObject> => {\n let processed: DSLObject = input;\n const { overrides, beforeRender } = optionsRef.current;\n\n if (overrides && overrides.length > 0) {\n try {\n processed = applyOverrides(processed, overrides);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'syntax',\n `Failed to apply overrides: ${formatErrorMessage(error)}`,\n JSON.stringify(processed),\n error,\n );\n optionsRef.current.onError?.(infographicError);\n throw infographicError;\n }\n }\n\n if (beforeRender) {\n try {\n processed = await beforeRender(processed);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'runtime',\n `beforeRender hook failed: ${formatErrorMessage(error)}`,\n JSON.stringify(processed),\n error,\n );\n optionsRef.current.onError?.(infographicError);\n throw infographicError;\n }\n }\n\n return processed;\n },\n [],\n );\n\n return { processDSL };\n}\n","import { useCallback, useRef } from 'react';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type { InfographicError, InfographicRenderResult, PostRenderHook } from '../types';\n\ninterface RenderCallbackOptions {\n afterRender?: PostRenderHook;\n onRender?: (result: InfographicRenderResult) => void;\n onLoad?: (result: InfographicRenderResult) => void;\n onError?: (error: InfographicError) => void;\n}\n\nexport function useRenderCallback(options: RenderCallbackOptions) {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const handleRendered = useCallback(\n async (result: InfographicRenderResult) => {\n const { afterRender, onRender, onLoad } = optionsRef.current;\n\n if (afterRender) {\n try {\n await afterRender(result);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'runtime',\n `afterRender hook failed: ${formatErrorMessage(error)}`,\n undefined,\n error,\n );\n optionsRef.current.onError?.(infographicError);\n return;\n }\n }\n\n onRender?.(result);\n onLoad?.(result);\n },\n [],\n );\n\n return { handleRendered };\n}\n","export const RENDER_DEBOUNCE_DELAY = 100;\n","import { useCallback, useRef } from 'react';\nimport { debounce } from 'lodash-es';\nimport { RENDER_DEBOUNCE_DELAY } from '../constants';\nimport type {\n DSLInput,\n DSLObject,\n InfographicOptions,\n ThemeConfig,\n} from '../types';\n\ninterface RenderControllerProps {\n dsl?: DSLInput;\n width?: number | string;\n height?: number | string;\n theme?: string;\n editable?: boolean;\n className?: string;\n}\n\nexport function useRenderController(\n containerRef: React.RefObject<HTMLElement>,\n rendererRender: (options: Partial<InfographicOptions>) => void,\n props: RenderControllerProps,\n processDSL: (input: DSLObject) => Promise<DSLObject>,\n onError?: (error: unknown) => void,\n) {\n const propsRef = useRef(props);\n const dslCacheRef = useRef<string | null>(null);\n\n propsRef.current = props;\n\n const render = useCallback(async () => {\n const { dsl, width, height, theme, editable, className } = propsRef.current;\n\n if (!dsl) {\n throw new Error('DSL prop is required');\n }\n\n const processedDSL: DSLObject = await processDSL(dsl);\n\n const dslString = JSON.stringify(processedDSL);\n if (dslCacheRef.current !== dslString) {\n dslCacheRef.current = dslString;\n\n const { palette, ...restDSL } = processedDSL;\n\n const renderOptions: Partial<InfographicOptions> = { ...restDSL, data: processedDSL.data };\n\n if (processedDSL.theme) {\n renderOptions.theme = processedDSL.theme;\n } else if (theme) {\n renderOptions.theme = theme;\n }\n\n if (palette) {\n const existingThemeConfig = (processedDSL.themeConfig || {}) as ThemeConfig;\n renderOptions.themeConfig = {\n ...existingThemeConfig,\n palette,\n };\n }\n\n if (editable !== undefined) {\n renderOptions.editable = editable;\n }\n\n if (width || height) {\n renderOptions.width = width;\n renderOptions.height = height;\n }\n\n if (containerRef.current && className) {\n containerRef.current.className = className;\n }\n\n rendererRender(renderOptions);\n }\n }, [containerRef, rendererRender, processDSL]);\n\n const debouncedRender = useCallback(\n debounce(() => {\n render().catch((error) => {\n onError?.(error);\n });\n }, RENDER_DEBOUNCE_DELAY),\n [render, onError],\n );\n\n return { debouncedRender };\n}\n","import { useCallback, useRef } from 'react';\nimport type { DSLInput, DSLObject, InfographicOptions, Palette, ThemeConfig } from '../types';\n\ninterface RefMethodsProps {\n processDSL: (input: DSLObject) => Promise<DSLObject>;\n theme?: string;\n}\n\nexport function useRefMethods(\n update: (options: Partial<InfographicOptions>) => void,\n { processDSL, theme }: RefMethodsProps,\n) {\n const themeRef = useRef(theme);\n themeRef.current = theme;\n\n const refUpdate = useCallback(\n async (options: DSLInput) => {\n const processed: DSLObject = await processDSL(options);\n const { palette, ...restProcessed } = processed;\n const themeConfig = (processed.themeConfig || {}) as ThemeConfig;\n\n if (palette) {\n themeConfig.palette = palette as Palette;\n }\n\n const renderOptions: Partial<InfographicOptions> = {\n ...restProcessed,\n theme: processed.theme ?? themeRef.current,\n themeConfig,\n };\n\n update(renderOptions);\n },\n [update, processDSL],\n );\n\n return { refUpdate };\n}\n","import { useEffect } from 'react';\nimport { useRenderer } from './useRenderer';\nimport { useDSLProcessor } from './useDSLProcessor';\nimport { useRenderCallback } from './useRenderCallback';\nimport { useRenderController } from './useRenderController';\nimport { useRefMethods } from './useRefMethods';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type {\n InfographicProps,\n InfographicRef,\n InfographicError,\n} from '../types';\n\nexport function useInfographic(\n containerRef: React.RefObject<HTMLElement>,\n props: InfographicProps,\n) {\n const { render: rendererRender, update, toDataURL, getTypes, destroy, on, off } = useRenderer(containerRef);\n\n const { processDSL } = useDSLProcessor({\n overrides: props.overrides,\n beforeRender: props.beforeRender,\n onError: props.onError,\n });\n\n const { handleRendered } = useRenderCallback({\n afterRender: props.afterRender,\n onRender: props.onRender,\n onLoad: props.onLoad,\n onError: props.onError,\n });\n\n const { debouncedRender } = useRenderController(\n containerRef,\n rendererRender,\n props,\n processDSL,\n (error) => {\n const infographicError: InfographicError = createInfographicError(\n 'render',\n formatErrorMessage(error),\n undefined,\n error,\n );\n props.onError?.(infographicError);\n },\n );\n\n const { refUpdate } = useRefMethods(update, { processDSL, theme: props.theme });\n\n useEffect(() => {\n on('rendered', handleRendered);\n on('loaded', handleRendered);\n\n return () => {\n off('rendered', handleRendered);\n off('loaded', handleRendered);\n };\n }, [on, off, handleRendered]);\n\n useEffect(() => {\n debouncedRender();\n return debouncedRender.cancel;\n }, [debouncedRender]);\n\n const ref: InfographicRef = {\n toDataURL,\n getTypes,\n update: refUpdate,\n destroy,\n };\n\n return ref;\n}\n","export const errorOverlayStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.05)',\n color: '#d32f2f',\n padding: '20px',\n zIndex: 1,\n textAlign: 'center',\n};\n\nexport const errorTitleStyles: React.CSSProperties = {\n fontSize: '1.2em',\n fontWeight: 'bold',\n marginBottom: '10px',\n};\n\nexport const errorMessageStyles: React.CSSProperties = {\n marginBottom: '15px',\n};\n\nexport const retryButtonStyles: React.CSSProperties = {\n padding: '8px 16px',\n backgroundColor: '#1976d2',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '14px',\n};\n\nexport const errorBoundaryContainerStyles: React.CSSProperties = {\n padding: '20px',\n backgroundColor: '#fee',\n border: '1px solid #fcc',\n borderRadius: '4px',\n color: '#c33',\n};\n\nexport const errorBoundaryTitleStyles: React.CSSProperties = {\n marginTop: 0,\n};\n\nexport const errorBoundaryStackStyles: React.CSSProperties = {\n marginTop: '10px',\n padding: '10px',\n backgroundColor: 'white',\n borderRadius: '4px',\n overflow: 'auto',\n};\n\nexport const errorBoundaryRetryButtonStyles: React.CSSProperties = {\n marginTop: '15px',\n padding: '8px 16px',\n backgroundColor: '#c33',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n};\n","import React, { forwardRef, useImperativeHandle, useRef, useState } from 'react';\nimport { useInfographic } from '../hooks';\nimport type { InfographicProps, InfographicRef, InfographicError } from '../types';\nimport {\n errorOverlayStyles,\n errorTitleStyles,\n errorMessageStyles,\n retryButtonStyles,\n} from './styles';\n\nconst defaultError: InfographicError = {\n type: 'render',\n message: 'An error occurred while rendering the infographic.',\n};\n\nfunction InfographicComponent(\n props: InfographicProps,\n ref: React.Ref<InfographicRef>,\n) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<InfographicError | null>(null);\n const [errorKey, setErrorKey] = useState(0);\n\n const infographicRef = useInfographic(containerRef, {\n ...props,\n onError: (err) => {\n setError(err);\n props.onError?.(err);\n },\n });\n\n useImperativeHandle(ref, () => infographicRef, [infographicRef]);\n\n const handleRetry = () => {\n setError(null);\n setErrorKey((prev) => prev + 1);\n };\n\n const containerStyle: React.CSSProperties = {\n width: props.width ?? '100%',\n height: props.height ?? 'auto',\n overflow: 'hidden',\n };\n\n return (\n <>\n <div\n key={`infographic-container-${errorKey}`}\n ref={containerRef}\n className={props.className}\n style={containerStyle}\n data-infographic-container\n />\n {error && (\n <div style={errorOverlayStyles}>\n <div style={errorTitleStyles}>Infographic Render Error</div>\n <div style={errorMessageStyles}>{error.message || defaultError.message}</div>\n <button type=\"button\" onClick={handleRetry} style={retryButtonStyles}>\n Retry\n </button>\n </div>\n )}\n </>\n );\n}\n\nexport const Infographic = forwardRef(InfographicComponent);\n","import { Component, ErrorInfo, ReactNode } from 'react';\nimport {\n errorBoundaryContainerStyles,\n errorBoundaryTitleStyles,\n errorBoundaryStackStyles,\n errorBoundaryRetryButtonStyles,\n} from './styles';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error, errorInfo: ErrorInfo) => ReactNode);\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error?: Error;\n errorInfo?: ErrorInfo;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.setState({ errorInfo });\n this.props.onError?.(error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: undefined, errorInfo: undefined });\n };\n\n render() {\n const { hasError, error, errorInfo } = this.state;\n const { children, fallback } = this.props;\n\n if (!hasError || !error) {\n return children;\n }\n\n if (fallback) {\n if (typeof fallback === 'function') {\n return fallback(error, errorInfo!);\n }\n return fallback;\n }\n\n return (\n <div style={errorBoundaryContainerStyles}>\n <h2 style={errorBoundaryTitleStyles}>Something went wrong</h2>\n <p>{error.message}</p>\n {errorInfo && (\n <details style={{ marginTop: '10px' }}>\n <summary>Stack trace</summary>\n <pre style={errorBoundaryStackStyles}>{errorInfo.componentStack}</pre>\n </details>\n )}\n <button type=\"button\" onClick={this.handleReset} style={errorBoundaryRetryButtonStyles}>\n Try again\n </button>\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useRenderer.ts","../src/utils/path.ts","../src/utils/dsl/merge.ts","../src/utils/dsl/compose.ts","../src/utils/error.ts","../src/hooks/useDSLProcessor.ts","../src/hooks/useRenderCallback.ts","../src/constants/index.ts","../src/hooks/useRenderController.ts","../src/hooks/useRefMethods.ts","../src/hooks/useInfographic.ts","../src/components/styles.ts","../src/components/Infographic.tsx","../src/components/ErrorBoundary.tsx"],"names":["listeners","useRef","useCallback","useEffect","jsxs","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["import { useEffect, useRef, useCallback } from 'react';\nimport type {\n InfographicOptions,\n RendererInstance,\n ExportOptions,\n} from '../types';\n\nexport function useRenderer(containerRef: React.RefObject<HTMLElement>) {\n const rendererRef = useRef<RendererInstance | null>(null);\n const isInitializedRef = useRef(false);\n const pendingListenersRef = useRef<Map<string, Set<(...args: any[]) => void>>>(new Map());\n const attachedListenersRef = useRef<Map<string, Set<(...args: any[]) => void>>>(new Map());\n\n const createRenderer = useCallback(\n async (options: string | Partial<InfographicOptions>, container: HTMLElement): Promise<RendererInstance> => {\n const { Infographic: InfographicClass } = await import('@antv/infographic');\n\n let renderer: RendererInstance;\n\n if (typeof options === 'string') {\n renderer = new InfographicClass(options);\n } else {\n renderer = new InfographicClass({ ...options, container });\n }\n\n renderer.on('rendered', () => {\n rendererRef.current = renderer;\n isInitializedRef.current = true;\n\n pendingListenersRef.current.forEach((listeners, event) => {\n listeners.forEach((listener) => {\n renderer.on(event, listener);\n });\n });\n pendingListenersRef.current.clear();\n });\n\n renderer.on('error', (error) => {\n console.error('[Infographic-for-React] Renderer error:', error);\n });\n\n if (typeof options === 'string') {\n renderer.render({ container });\n } else {\n renderer.render();\n }\n\n return renderer;\n },\n [],\n );\n\n const render = useCallback(\n async (options: string | Partial<InfographicOptions>) => {\n const container = containerRef.current;\n if (!container) {\n throw new Error('Container element not found');\n }\n\n if (rendererRef.current) {\n if (typeof options === 'string') {\n rendererRef.current.update(options);\n } else {\n rendererRef.current.update({ ...options, container });\n }\n } else {\n await createRenderer(options, container);\n }\n },\n [containerRef, createRenderer],\n );\n\n const update = useCallback((options: string | Partial<InfographicOptions>) => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized. Call render first.');\n }\n rendererRef.current.update(options);\n }, []);\n\n const toDataURL = useCallback(\n (options?: ExportOptions): Promise<string> => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized');\n }\n return rendererRef.current.toDataURL(options);\n },\n [],\n );\n\n const getTypes = useCallback(() => {\n if (!rendererRef.current) {\n throw new Error('Renderer not initialized');\n }\n return rendererRef.current.getTypes();\n }, []);\n\n const destroy = useCallback(() => {\n if (rendererRef.current) {\n attachedListenersRef.current.forEach((listeners, event) => {\n listeners.forEach((listener) => {\n rendererRef.current?.off(event, listener);\n });\n });\n attachedListenersRef.current.clear();\n\n rendererRef.current.destroy();\n rendererRef.current = null;\n }\n isInitializedRef.current = false;\n }, []);\n\n const on = useCallback((event: string, listener: (...args: any[]) => void) => {\n if (!rendererRef.current) {\n const listeners = pendingListenersRef.current.get(event) || new Set();\n listeners.add(listener);\n pendingListenersRef.current.set(event, listeners);\n return;\n }\n const listeners = attachedListenersRef.current.get(event) || new Set();\n listeners.add(listener);\n attachedListenersRef.current.set(event, listeners);\n rendererRef.current.on(event, listener);\n }, []);\n\n const off = useCallback((event: string, listener: (...args: any[]) => void) => {\n if (!rendererRef.current) {\n const listeners = pendingListenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n pendingListenersRef.current.delete(event);\n }\n }\n return;\n }\n rendererRef.current.off(event, listener);\n const listeners = attachedListenersRef.current.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n attachedListenersRef.current.delete(event);\n }\n }\n }, []);\n\n useEffect(() => {\n return () => {\n destroy();\n };\n }, [destroy]);\n\n return {\n render,\n update,\n toDataURL,\n getTypes,\n destroy,\n on,\n off,\n isReady: isInitializedRef.current,\n };\n}\n","export interface PathSegment {\n type: 'key' | 'index';\n value: string | number;\n}\n\nfunction parsePath(path: string): PathSegment[] {\n const segments: PathSegment[] = [];\n const regex = /([^.[\\]]+)|\\[(\\d+)\\]/g;\n let match;\n\n while ((match = regex.exec(path)) !== null) {\n if (match[1] !== undefined) {\n segments.push({ type: 'key', value: match[1] });\n } else if (match[2] !== undefined) {\n segments.push({ type: 'index', value: parseInt(match[2], 10) });\n }\n }\n\n return segments;\n}\n\nexport function setByPath(obj: Record<string, unknown>, path: string, value: unknown): void {\n const segments = parsePath(path);\n\n if (segments.length === 0) {\n throw new Error(`Invalid path: ${path}`);\n }\n\n let current: unknown = obj;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const isLast = i === segments.length - 1;\n\n if (typeof current !== 'object' || current === null) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n\n if (segment.type === 'key') {\n const currentObj = current as Record<string, unknown>;\n if (isLast) {\n currentObj[segment.value] = value;\n } else {\n const nextValue = currentObj[segment.value];\n if (nextValue !== undefined && (typeof nextValue !== 'object' || nextValue === null)) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n if (typeof nextValue !== 'object' || nextValue === null) {\n currentObj[segment.value] = {};\n }\n current = currentObj[segment.value];\n }\n } else {\n const currentArray = current as unknown[];\n if (!Array.isArray(currentArray)) {\n throw new Error(`Cannot access array index at path \"${path}\": parent is not an array`);\n }\n const index = segment.value as number;\n if (isLast) {\n currentArray[index] = value;\n } else {\n const nextValue = currentArray[index];\n if (nextValue !== undefined && (typeof nextValue !== 'object' || nextValue === null)) {\n throw new Error(`Cannot set property at path \"${path}\": cannot navigate through non-object`);\n }\n if (typeof nextValue !== 'object' || nextValue === null) {\n currentArray[index] = {};\n }\n current = currentArray[index];\n }\n }\n }\n}\n\nexport function getByPath(obj: Record<string, unknown>, path: string): unknown {\n const segments = parsePath(path);\n\n if (segments.length === 0) {\n return undefined;\n }\n\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (typeof current !== 'object' || current === null) {\n return undefined;\n }\n\n if (segment.type === 'key') {\n current = (current as Record<string, unknown>)[segment.value];\n } else {\n if (!Array.isArray(current)) {\n return undefined;\n }\n const index = segment.value as number;\n current = current[index];\n }\n }\n\n return current;\n}\n","import type { DSLOverride, DSLObject } from '../../types';\nimport { setByPath } from '../path';\n\nexport function applyOverrides(base: DSLObject, overrides: DSLOverride[]): DSLObject {\n if (overrides.length === 0) return base;\n\n const result = { ...base };\n\n for (const override of overrides) {\n setByPath(result as Record<string, unknown>, override.path, override.value);\n }\n\n return result;\n}\n\nexport function mergeDSL(dsl1: DSLObject, dsl2: DSLObject): DSLObject {\n const merged = deepMerge(dsl1 as unknown as Record<string, unknown>, dsl2 as unknown as Record<string, unknown>);\n return merged as unknown as DSLObject;\n}\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = { ...target };\n\n for (const key in source) {\n if (source[key] === undefined) {\n continue;\n }\n\n const value = source[key];\n\n if (value === null) {\n result[key] = null;\n continue;\n }\n\n const targetValue = result[key];\n\n if (typeof value === 'object' && !Array.isArray(value) && targetValue && typeof targetValue === 'object' && !Array.isArray(targetValue)) {\n result[key] = deepMerge(targetValue as Record<string, unknown>, value as Record<string, unknown>);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n","import type { ComposeTemplateOptions, DSLObject } from '../../types';\nimport { applyOverrides } from './merge';\n\ninterface DSLNode {\n type?: string;\n data?: unknown;\n props?: Record<string, unknown>;\n children?: DSLNode[];\n [key: string]: unknown;\n}\n\nfunction isContainerNode(node: unknown): node is DSLNode {\n return (\n typeof node === 'object' &&\n node !== null &&\n 'children' in node &&\n Array.isArray((node as DSLNode).children)\n );\n}\n\nexport function composeTemplates(options: ComposeTemplateOptions): DSLObject {\n const { templates, overrides = [] } = options;\n\n if (templates.length === 0) {\n throw new Error('At least one template is required');\n }\n\n if (templates.length === 1) {\n const base = templates[0];\n if (overrides.length > 0) {\n return applyOverrides(base, overrides);\n }\n return base;\n }\n\n const root = templates[0] as DSLNode;\n\n if (!isContainerNode(root)) {\n throw new Error('Root template must be a container node with children');\n }\n\n let currentChildren = root.children || [];\n\n for (let i = 1; i < templates.length; i++) {\n const template = templates[i] as DSLNode;\n\n if (isContainerNode(template) && template.children) {\n currentChildren = [...currentChildren, ...template.children];\n } else {\n currentChildren.push(template);\n }\n }\n\n root.children = currentChildren;\n\n let composed = root as DSLObject;\n\n if (overrides.length > 0) {\n composed = applyOverrides(composed, overrides);\n }\n\n return composed;\n}\n","import type { InfographicError } from '../types';\n\nexport function createInfographicError(\n type: InfographicError['type'],\n message: string,\n dsl?: string,\n details?: Error | unknown,\n): InfographicError {\n return {\n type,\n message,\n dsl,\n details,\n };\n}\n\nexport function isInfographicError(error: unknown): error is InfographicError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'type' in error &&\n 'message' in error &&\n ['syntax', 'render', 'runtime'].includes((error as InfographicError).type)\n );\n}\n\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import { useCallback, useRef } from 'react';\nimport { applyOverrides } from '../utils/dsl';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type {\n InfographicError,\n DSLObject,\n PreRenderHook,\n DSLOverride,\n} from '../types';\n\ninterface DSLProcessorOptions {\n overrides?: DSLOverride[];\n beforeRender?: PreRenderHook;\n onError?: (error: InfographicError) => void;\n}\n\nexport function useDSLProcessor(options: DSLProcessorOptions) {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const processDSL = useCallback(\n async (input: DSLObject): Promise<DSLObject> => {\n let processed: DSLObject = input;\n const { overrides, beforeRender } = optionsRef.current;\n\n if (overrides && overrides.length > 0) {\n try {\n processed = applyOverrides(processed, overrides);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'syntax',\n `Failed to apply overrides: ${formatErrorMessage(error)}`,\n JSON.stringify(processed),\n error,\n );\n optionsRef.current.onError?.(infographicError);\n throw infographicError;\n }\n }\n\n if (beforeRender) {\n try {\n processed = await beforeRender(processed);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'runtime',\n `beforeRender hook failed: ${formatErrorMessage(error)}`,\n JSON.stringify(processed),\n error,\n );\n optionsRef.current.onError?.(infographicError);\n throw infographicError;\n }\n }\n\n return processed;\n },\n [],\n );\n\n return { processDSL };\n}\n","import { useCallback, useRef } from 'react';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type { InfographicError, InfographicRenderResult, PostRenderHook } from '../types';\n\ninterface RenderCallbackOptions {\n afterRender?: PostRenderHook;\n onRender?: (result: InfographicRenderResult) => void;\n onLoad?: (result: InfographicRenderResult) => void;\n onError?: (error: InfographicError) => void;\n}\n\nexport function useRenderCallback(options: RenderCallbackOptions) {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const handleRendered = useCallback(\n async (result: InfographicRenderResult) => {\n const { afterRender, onRender, onLoad } = optionsRef.current;\n\n if (afterRender) {\n try {\n await afterRender(result);\n } catch (error) {\n const infographicError: InfographicError = createInfographicError(\n 'runtime',\n `afterRender hook failed: ${formatErrorMessage(error)}`,\n undefined,\n error,\n );\n optionsRef.current.onError?.(infographicError);\n return;\n }\n }\n\n onRender?.(result);\n onLoad?.(result);\n },\n [],\n );\n\n return { handleRendered };\n}\n","export const RENDER_DEBOUNCE_DELAY = 100;\n","import { useCallback, useRef } from 'react';\nimport { debounce } from 'lodash-es';\nimport { RENDER_DEBOUNCE_DELAY } from '../constants';\nimport type {\n DSLInput,\n DSLObject,\n InfographicOptions,\n ThemeConfig,\n} from '../types';\n\ninterface RenderControllerProps {\n dsl?: DSLInput;\n width?: number | string;\n height?: number | string;\n theme?: string;\n editable?: boolean;\n className?: string;\n}\n\nexport function useRenderController(\n containerRef: React.RefObject<HTMLElement>,\n rendererRender: (options: string | Partial<InfographicOptions>) => void,\n props: RenderControllerProps,\n processDSL: (input: DSLObject) => Promise<DSLObject>,\n onError?: (error: unknown) => void,\n) {\n const propsRef = useRef(props);\n const dslCacheRef = useRef<string | null>(null);\n const stringDslCacheRef = useRef<string | null>(null);\n\n propsRef.current = props;\n\n const render = useCallback(async () => {\n const { dsl, width, height, theme, editable, className } = propsRef.current;\n\n if (!dsl) {\n throw new Error('DSL prop is required');\n }\n\n if (containerRef.current && className) {\n containerRef.current.className = className;\n }\n\n if (typeof dsl === 'string') {\n const trimmedDsl = dsl.trim();\n if (!trimmedDsl) {\n throw new Error('String DSL cannot be empty or contain only whitespace');\n }\n if (stringDslCacheRef.current !== trimmedDsl) {\n stringDslCacheRef.current = trimmedDsl;\n rendererRender(trimmedDsl);\n }\n } else {\n const processedDSL: DSLObject = await processDSL(dsl);\n\n const dslString = JSON.stringify(processedDSL);\n if (dslCacheRef.current !== dslString) {\n dslCacheRef.current = dslString;\n\n const { palette, ...restDSL } = processedDSL;\n\n const renderOptions: Partial<InfographicOptions> = {\n ...restDSL,\n data: processedDSL.data,\n width,\n height,\n editable,\n };\n\n if (processedDSL.theme) {\n renderOptions.theme = processedDSL.theme;\n } else if (theme) {\n renderOptions.theme = theme;\n }\n\n if (palette) {\n const existingThemeConfig = (processedDSL.themeConfig || {}) as ThemeConfig;\n renderOptions.themeConfig = {\n ...existingThemeConfig,\n palette,\n };\n }\n\n rendererRender(renderOptions);\n }\n }\n }, [containerRef, rendererRender, processDSL]);\n\n const debouncedRender = useCallback(\n debounce(() => {\n render().catch((error) => {\n onError?.(error);\n });\n }, RENDER_DEBOUNCE_DELAY),\n [render, onError],\n );\n\n return { debouncedRender };\n}\n","import { useCallback, useRef } from 'react';\nimport type { DSLInput, DSLObject, InfographicOptions, Palette, ThemeConfig } from '../types';\n\ninterface RefMethodsProps {\n processDSL: (input: DSLObject) => Promise<DSLObject>;\n theme?: string;\n}\n\nexport function useRefMethods(\n update: (options: string | Partial<InfographicOptions>) => void,\n { processDSL, theme }: RefMethodsProps,\n) {\n const themeRef = useRef(theme);\n themeRef.current = theme;\n\n const refUpdate = useCallback(\n async (options: DSLInput) => {\n if (typeof options === 'string') {\n update(options);\n return;\n }\n\n const processed: DSLObject = await processDSL(options);\n const { palette, ...restProcessed } = processed;\n const themeConfig = (processed.themeConfig || {}) as ThemeConfig;\n\n if (palette) {\n themeConfig.palette = palette as Palette;\n }\n\n const renderOptions: Partial<InfographicOptions> = {\n ...restProcessed,\n theme: processed.theme ?? themeRef.current,\n themeConfig,\n };\n\n update(renderOptions);\n },\n [update, processDSL],\n );\n\n return { refUpdate };\n}\n","import { useEffect } from 'react';\nimport { useRenderer } from './useRenderer';\nimport { useDSLProcessor } from './useDSLProcessor';\nimport { useRenderCallback } from './useRenderCallback';\nimport { useRenderController } from './useRenderController';\nimport { useRefMethods } from './useRefMethods';\nimport { createInfographicError, formatErrorMessage } from '../utils/error';\nimport type {\n InfographicProps,\n InfographicRef,\n InfographicError,\n} from '../types';\n\nexport function useInfographic(\n containerRef: React.RefObject<HTMLElement>,\n props: InfographicProps,\n) {\n const { render: rendererRender, update, toDataURL, getTypes, destroy, on, off } = useRenderer(containerRef);\n\n const { processDSL } = useDSLProcessor({\n overrides: props.overrides,\n beforeRender: props.beforeRender,\n onError: props.onError,\n });\n\n const { handleRendered } = useRenderCallback({\n afterRender: props.afterRender,\n onRender: props.onRender,\n onLoad: props.onLoad,\n onError: props.onError,\n });\n\n const { debouncedRender } = useRenderController(\n containerRef,\n rendererRender,\n props,\n processDSL,\n (error) => {\n const infographicError: InfographicError = createInfographicError(\n 'render',\n formatErrorMessage(error),\n undefined,\n error,\n );\n props.onError?.(infographicError);\n },\n );\n\n const { refUpdate } = useRefMethods((options) => update(options), { processDSL, theme: props.theme });\n\n useEffect(() => {\n on('rendered', handleRendered);\n on('loaded', handleRendered);\n\n return () => {\n off('rendered', handleRendered);\n off('loaded', handleRendered);\n };\n }, [on, off, handleRendered]);\n\n useEffect(() => {\n debouncedRender();\n return debouncedRender.cancel;\n }, [debouncedRender]);\n\n const ref: InfographicRef = {\n toDataURL,\n getTypes,\n update: refUpdate,\n destroy,\n };\n\n return ref;\n}\n","export const errorOverlayStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.05)',\n color: '#d32f2f',\n padding: '20px',\n zIndex: 1,\n textAlign: 'center',\n};\n\nexport const errorTitleStyles: React.CSSProperties = {\n fontSize: '1.2em',\n fontWeight: 'bold',\n marginBottom: '10px',\n};\n\nexport const errorMessageStyles: React.CSSProperties = {\n marginBottom: '15px',\n};\n\nexport const retryButtonStyles: React.CSSProperties = {\n padding: '8px 16px',\n backgroundColor: '#1976d2',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '14px',\n};\n\nexport const errorBoundaryContainerStyles: React.CSSProperties = {\n padding: '20px',\n backgroundColor: '#fee',\n border: '1px solid #fcc',\n borderRadius: '4px',\n color: '#c33',\n};\n\nexport const errorBoundaryTitleStyles: React.CSSProperties = {\n marginTop: 0,\n};\n\nexport const errorBoundaryStackStyles: React.CSSProperties = {\n marginTop: '10px',\n padding: '10px',\n backgroundColor: 'white',\n borderRadius: '4px',\n overflow: 'auto',\n};\n\nexport const errorBoundaryRetryButtonStyles: React.CSSProperties = {\n marginTop: '15px',\n padding: '8px 16px',\n backgroundColor: '#c33',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n};\n","import React, { forwardRef, useImperativeHandle, useRef, useState } from 'react';\nimport { useInfographic } from '../hooks';\nimport type { InfographicProps, InfographicRef, InfographicError } from '../types';\nimport {\n errorOverlayStyles,\n errorTitleStyles,\n errorMessageStyles,\n retryButtonStyles,\n} from './styles';\n\nconst defaultError: InfographicError = {\n type: 'render',\n message: 'An error occurred while rendering the infographic.',\n};\n\nfunction InfographicComponent(\n props: InfographicProps,\n ref: React.Ref<InfographicRef>,\n) {\n const { children, dsl: dslProp, ...restProps } = props;\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<InfographicError | null>(null);\n const [errorKey, setErrorKey] = useState(0);\n console.log('children--------------', children)\n const childrenDsl = children ? String(children).trim() : undefined;\n const finalDsl = childrenDsl || dslProp;\n\n if (!finalDsl) {\n throw new Error('Either children or dsl prop must be provided');\n }\n\n const infographicRef = useInfographic(containerRef, {\n ...restProps,\n dsl: finalDsl,\n onError: (err) => {\n setError(err);\n props.onError?.(err);\n },\n });\n\n useImperativeHandle(ref, () => infographicRef, [infographicRef]);\n\n const handleRetry = () => {\n setError(null);\n setErrorKey((prev) => prev + 1);\n };\n\n const containerStyle: React.CSSProperties = {\n width: props.width ?? '100%',\n height: props.height ?? 'auto',\n overflow: 'hidden',\n };\n\n return (\n <>\n <div\n key={`infographic-container-${errorKey}`}\n ref={containerRef}\n className={props.className}\n style={containerStyle}\n data-infographic-container\n />\n {error && (\n <div style={errorOverlayStyles}>\n <div style={errorTitleStyles}>Infographic Render Error</div>\n <div style={errorMessageStyles}>{error.message || defaultError.message}</div>\n <button type=\"button\" onClick={handleRetry} style={retryButtonStyles}>\n Retry\n </button>\n </div>\n )}\n </>\n );\n}\n\nexport const Infographic = forwardRef(InfographicComponent);\n","import { Component, ErrorInfo, ReactNode } from 'react';\nimport {\n errorBoundaryContainerStyles,\n errorBoundaryTitleStyles,\n errorBoundaryStackStyles,\n errorBoundaryRetryButtonStyles,\n} from './styles';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error, errorInfo: ErrorInfo) => ReactNode);\n onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error?: Error;\n errorInfo?: ErrorInfo;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n this.setState({ errorInfo });\n this.props.onError?.(error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: undefined, errorInfo: undefined });\n };\n\n render() {\n const { hasError, error, errorInfo } = this.state;\n const { children, fallback } = this.props;\n\n if (!hasError || !error) {\n return children;\n }\n\n if (fallback) {\n if (typeof fallback === 'function') {\n return fallback(error, errorInfo!);\n }\n return fallback;\n }\n\n return (\n <div style={errorBoundaryContainerStyles}>\n <h2 style={errorBoundaryTitleStyles}>Something went wrong</h2>\n <p>{error.message}</p>\n {errorInfo && (\n <details style={{ marginTop: '10px' }}>\n <summary>Stack trace</summary>\n <pre style={errorBoundaryStackStyles}>{errorInfo.componentStack}</pre>\n </details>\n )}\n <button type=\"button\" onClick={this.handleReset} style={errorBoundaryRetryButtonStyles}>\n Try again\n </button>\n </div>\n );\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infographic-for-react",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "React components for @antv/infographic - a declarative, component-based wrapper for infographic generation",
5
5
  "keywords": [
6
6
  "antv",