@jbpark/live-editor 1.16.3 → 1.16.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/{ast-DK9INzeu.js → ast-B8j1_KHl.js} +3 -13
  2. package/dist/ast-B8j1_KHl.js.map +1 -0
  3. package/dist/{boundary-BWBdNmNi.js → boundary-D4D9lTGj.js} +2 -2
  4. package/dist/{boundary-BWBdNmNi.js.map → boundary-D4D9lTGj.js.map} +1 -1
  5. package/dist/{context-DrqO0VVu.js → context-Dp9_x2pr.js} +3 -3
  6. package/dist/{context-DrqO0VVu.js.map → context-Dp9_x2pr.js.map} +1 -1
  7. package/dist/{core-B7igZRDs.js → core-J-1gMmiH.js} +2 -2
  8. package/dist/{core-B7igZRDs.js.map → core-J-1gMmiH.js.map} +1 -1
  9. package/dist/dnd/index.d.ts +1 -1
  10. package/dist/dnd/index.js +1 -1
  11. package/dist/{dnd-A3lFh7yx.js → dnd-BLt8M5Ku.js} +102 -110
  12. package/dist/dnd-BLt8M5Ku.js.map +1 -0
  13. package/dist/{document-CSIscFpL.js → document-B5jioCvf.js} +43 -5
  14. package/dist/document-B5jioCvf.js.map +1 -0
  15. package/dist/{document-DXOwpvWM.d.ts → document-J9Lo9p81.d.ts} +3 -2
  16. package/dist/editor/index.js +2 -2
  17. package/dist/{editor-DmgTeTcG.js → editor-BquxydTJ.js} +3 -3
  18. package/dist/{editor-DmgTeTcG.js.map → editor-BquxydTJ.js.map} +1 -1
  19. package/dist/error/index.js +2 -2
  20. package/dist/{error-ClMPS96R.js → error-qjC08--G.js} +2 -2
  21. package/dist/{error-ClMPS96R.js.map → error-qjC08--G.js.map} +1 -1
  22. package/dist/{index-CfuDi3An.d.ts → index-C880EB6c.d.ts} +3 -3
  23. package/dist/{index-rlgLRNsK.d.ts → index-DB_TAhtd.d.ts} +2 -2
  24. package/dist/index.d.ts +2 -2
  25. package/dist/index.js +5 -5
  26. package/dist/preview/index.js +1 -1
  27. package/dist/{preview-j-rIHbDN.js → preview-DS80nl6F.js} +4 -4
  28. package/dist/{preview-j-rIHbDN.js.map → preview-DS80nl6F.js.map} +1 -1
  29. package/dist/provider/index.js +1 -1
  30. package/dist/{use-dynamic-tailwind-D-EEKBIy.js → use-dynamic-tailwind-Biw9EHLI.js} +2 -2
  31. package/dist/{use-dynamic-tailwind-D-EEKBIy.js.map → use-dynamic-tailwind-Biw9EHLI.js.map} +1 -1
  32. package/dist/utils/ast/index.d.ts +3 -3
  33. package/dist/utils/ast/index.js +3 -3
  34. package/dist/utils/index.d.ts +1 -1
  35. package/dist/utils/index.js +2 -2
  36. package/dist/{utils-BzfDKU6y.js → utils-DPdkZJ4i.js} +2 -2
  37. package/dist/{utils-BzfDKU6y.js.map → utils-DPdkZJ4i.js.map} +1 -1
  38. package/package.json +1 -1
  39. package/dist/ast-DK9INzeu.js.map +0 -1
  40. package/dist/dnd-A3lFh7yx.js.map +0 -1
  41. package/dist/document-CSIscFpL.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { d as require_lib, f as require_lib$2, g as DATA_ATTR, h as CONFIG, l as traverse, m as BINDING_PROP, p as require_lib$1, u as createBoundedCache, x as __toESM, y as REGEX } from "./document-CSIscFpL.js";
1
+ import { C as __toESM, _ as CONFIG, d as createBoundedCache, f as nanoid, g as BINDING_PROP, h as require_lib$1, m as require_lib$2, p as require_lib, u as traverse, v as DATA_ATTR, x as REGEX } from "./document-B5jioCvf.js";
2
2
  import { z } from "zod";
3
3
  //#region src/utils/ast/types.ts
4
4
  var import_lib$1 = require_lib$1();
@@ -354,16 +354,6 @@ const findEditableChildren = (node) => {
354
354
  return editableChildren;
355
355
  };
356
356
  //#endregion
357
- //#region node_modules/.pnpm/nanoid@3.3.18/node_modules/nanoid/index.browser.js
358
- let nanoid = (size = 21) => crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {
359
- byte &= 63;
360
- if (byte < 36) id += byte.toString(36);
361
- else if (byte < 62) id += (byte - 26).toString(36).toUpperCase();
362
- else if (byte > 62) id += "-";
363
- else id += "_";
364
- return id;
365
- }, "");
366
- //#endregion
367
357
  //#region src/utils/ast/extract.ts
368
358
  const collectText = (children) => {
369
359
  return children.filter((c) => import_lib$2.isJSXText(c)).map((c) => c.value.trim()).filter((v) => v.length).join(" ");
@@ -813,6 +803,6 @@ const validateBindingValue = (binding, value) => {
813
803
  return VALID;
814
804
  };
815
805
  //#endregion
816
- export { flattenEditableValue as _, bulkUpdate as a, setEditableValue as b, extract as c, getCurrentValue as d, parseBinding as f, extractObjectProperties as g, extractNodeValue as h, replaceIds as i, nanoid as l, createNodeFromValue as m, clone as n, update as o, arrayExpressionToCode as p, fillIds as r, clearExtractCache as s, validateBindingValue as t, findEditableChildren as u, parseArrayExpression as v, generateCode as x, parseValue as y };
806
+ export { parseArrayExpression as _, bulkUpdate as a, generateCode as b, extract as c, parseBinding as d, arrayExpressionToCode as f, flattenEditableValue as g, extractObjectProperties as h, replaceIds as i, findEditableChildren as l, extractNodeValue as m, clone as n, update as o, createNodeFromValue as p, fillIds as r, clearExtractCache as s, validateBindingValue as t, getCurrentValue as u, parseValue as v, setEditableValue as y };
817
807
 
818
- //# sourceMappingURL=ast-DK9INzeu.js.map
808
+ //# sourceMappingURL=ast-B8j1_KHl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-B8j1_KHl.js","names":["_generate","t","parseExpression","t","parseExpression","parseExpression","t","t","parse","t","parse","t","parseExpression"],"sources":["../src/utils/ast/types.ts","../src/utils/ast/helpers.ts","../src/utils/ast/value.ts","../src/utils/ast/binding.ts","../src/utils/ast/extract.ts","../src/utils/ast/update.ts","../src/utils/ast/tree.ts","../src/utils/ast/validate.ts"],"sourcesContent":["export interface Attribute {\n name: string;\n value: string | null;\n isStringLiteral?: boolean;\n}\n\nexport interface DataAttrNode {\n id?: string;\n tagName: string;\n attributes: Attribute[];\n dataAttributes: Attribute[];\n textContent: string;\n rawChildren?: string;\n loc?: {\n start: { line: number; column: number };\n end: { line: number; column: number };\n };\n children?: DataAttrNode[];\n isFragment?: boolean;\n bindings?: BindingItem[];\n}\n\nexport interface BindingOption {\n label: string;\n value: string;\n}\n\nexport const BINDING_TYPES = [\n 'array',\n 'object',\n 'string',\n 'number',\n 'boolean',\n 'color',\n 'jsx',\n 'richtext',\n 'date',\n 'url',\n 'icon-picker',\n 'asset-picker',\n] as const;\n\nexport type BindingType = (typeof BINDING_TYPES)[number];\n\nexport interface BindingRenderLeaf {\n type: BindingType;\n property?: string;\n render?: BindingRenderMap;\n}\n\nexport interface BindingRenderMap {\n [key: string]: BindingRenderLeaf | BindingRenderMap;\n}\n\nexport interface BindingItem {\n label: string;\n property: string;\n type?: BindingType;\n options?: BindingOption[];\n render?: BindingRenderMap;\n min?: number;\n max?: number;\n pattern?: string;\n required?: boolean;\n}\n\nexport type NodeValueType =\n | 'boolean'\n | 'number'\n | 'string'\n | 'null'\n | 'array'\n | 'object'\n | 'unknown';\n\nexport type EditableNodeValueType = 'boolean' | 'number' | 'string' | 'null';\n\nexport interface ExtractedNodeValue {\n type: NodeValueType;\n value: string | number | boolean | null;\n}\n","import _generate from '@babel/generator';\nimport { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\n\nimport { REGEX } from '../../constants';\nimport type { Attribute } from './types';\n\n// Same @babel/* CJS/ESM interop issue as document.ts's traverse import:\n// @babel/generator's CJS build re-exports itself as `{ default: generate,\n// generate, CodeGenerator }`, and Vite's browser dependency pre-bundling\n// doesn't unwrap that inner `.default` again — `generate` resolved to the\n// whole exports object, not the function. Every generateCode() call threw,\n// which extract.ts's extractAttributes() silently swallows into a `null`\n// attribute value, and update.ts's callers surface as \"Failed to parse/\n// update this section\" toasts.\nconst generate =\n typeof _generate === 'function'\n ? _generate\n : (_generate as unknown as { default: typeof _generate }).default;\n\nexport const wrap = (code: string) => {\n return `<>${code}</>`;\n};\n\nexport const unwrap = (generated: string) => {\n return generated\n .replace(/^<>\\s*/g, '')\n .replace(/\\s*<\\/>\\s*;?\\s*$/g, '')\n .trim();\n};\n\nexport const attrValue = ({\n value,\n isStringLiteral,\n}: Attribute): t.JSXAttribute['value'] => {\n if (value === null) {\n return null;\n }\n\n if (isStringLiteral) {\n return t.stringLiteral(value);\n }\n\n const trimmed = value.trim();\n\n if (REGEX.NUMBER.test(trimmed)) {\n return t.jsxExpressionContainer(t.numericLiteral(parseFloat(trimmed)));\n }\n\n if (REGEX.BOOLEAN_OR_NULL.test(trimmed)) {\n const expr = parseExpression(trimmed, {\n plugins: ['jsx', 'typescript'],\n });\n return t.jsxExpressionContainer(expr);\n }\n\n try {\n const expr = parseExpression(trimmed, {\n plugins: ['jsx', 'typescript'],\n });\n return t.jsxExpressionContainer(expr);\n } catch {\n return t.stringLiteral(trimmed);\n }\n};\n\nexport const generateCode = (node: t.Node): string => {\n return generate(node, { jsescOption: { minimal: true } }).code;\n};\n","import { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\n\nimport { REGEX } from '../../constants';\nimport { generateCode } from './helpers';\nimport type { ExtractedNodeValue, NodeValueType } from './types';\n\nconst dedent = (str: string): string => {\n const lines = str\n .replace(/^\\n/, '')\n .replace(/\\n\\s*$/, '')\n .split('\\n');\n\n const indent = lines.reduce((min, line) => {\n if (!line.trim()) {\n return min;\n }\n const match = line.match(/^(\\s*)/);\n return Math.min(min, match?.[1]?.length ?? 0);\n }, Infinity);\n\n return indent === Infinity\n ? str.trim()\n : lines.map(line => line.slice(indent)).join('\\n');\n};\n\n// AST 노드를 코드 실행(new Function/eval) 없이 순수 리터럴 구조만 재귀적으로\n// 실제 JS 값으로 변환한다. 함수 호출, 변수 참조 등 리터럴이 아닌 표현식은\n// 평가하지 않고 undefined를 반환한다 — 사용자 코드는 iframe 안에서만 실행한다는\n// 이 저장소의 원칙(AGENTS.md)을 이 패널 UI(메인 문서에서 렌더링됨)에서도 지키기 위함.\nexport const evaluateLiteral = (node: t.Node): unknown => {\n if (t.isStringLiteral(node)) {\n return node.value;\n }\n\n if (t.isNumericLiteral(node)) {\n return node.value;\n }\n\n if (t.isBooleanLiteral(node)) {\n return node.value;\n }\n\n if (t.isNullLiteral(node)) {\n return null;\n }\n\n if (t.isIdentifier(node) && node.name === 'undefined') {\n return undefined;\n }\n\n if (\n t.isUnaryExpression(node) &&\n node.operator === '-' &&\n t.isNumericLiteral(node.argument)\n ) {\n return -node.argument.value;\n }\n\n if (t.isTemplateLiteral(node) && node.expressions.length === 0) {\n return node.quasis[0]?.value.cooked ?? node.quasis[0]?.value.raw ?? '';\n }\n\n if (t.isJSXElement(node) || t.isJSXFragment(node)) {\n return generateCode(node);\n }\n\n if (t.isArrayExpression(node)) {\n return node.elements.map(element =>\n element ? evaluateLiteral(element) : null,\n );\n }\n\n if (t.isObjectExpression(node)) {\n const result: Record<string, unknown> = {};\n\n for (const prop of node.properties) {\n if (!t.isObjectProperty(prop)) {\n continue;\n }\n\n let key: string | null = null;\n\n if (t.isIdentifier(prop.key)) {\n key = prop.key.name;\n } else if (t.isStringLiteral(prop.key)) {\n key = prop.key.value;\n } else if (t.isNumericLiteral(prop.key)) {\n key = String(prop.key.value);\n }\n\n if (key === null) {\n continue;\n }\n\n result[key] = evaluateLiteral(prop.value);\n }\n\n return result;\n }\n\n return undefined;\n};\n\nexport const parseValue = (value: unknown): unknown => {\n if (typeof value !== 'string') {\n return value;\n }\n\n const trimmed = value.trim();\n\n if (!trimmed) {\n return value;\n }\n\n if (REGEX.NUMBER.test(trimmed)) {\n return parseFloat(trimmed);\n }\n\n if (REGEX.BOOLEAN_OR_NULL.test(trimmed)) {\n if (trimmed === 'true') {\n return true;\n }\n if (trimmed === 'false') {\n return false;\n }\n if (trimmed === 'null') {\n return null;\n }\n if (trimmed === 'undefined') {\n return undefined;\n }\n }\n\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n const ast = parseExpression(trimmed, {\n plugins: ['jsx', 'typescript'],\n });\n\n if (t.isObjectExpression(ast) || t.isArrayExpression(ast)) {\n return evaluateLiteral(ast);\n }\n } catch {\n /* ignore */\n }\n\n return value;\n }\n\n return value;\n};\n\nexport type EditablePathSegment = string | number;\nexport type EditablePrimitive = string | number | boolean;\n\nexport interface EditableValueEntry {\n path: EditablePathSegment[];\n value: EditablePrimitive;\n}\n\nconst MAX_FLATTEN_DEPTH = 20;\n\nconst isEditablePrimitive = (value: unknown): value is EditablePrimitive =>\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean';\n\n// A binding's data-binding declaration is one way to know a value is\n// structured (`type: 'object'` + a `render` map — see #225), but most\n// existing content declares neither; it's just an object/array-shaped\n// string because that's what the bound prop actually is (e.g. `style`).\n// This recovers editable leaves from the *parsed value's own shape*\n// instead, so it works on content authored without a renderPanel in mind\n// — including an array of objects whose own members embed further JSX\n// (Live Editor's shipped Stats/FAQ sections both look like this: an\n// `items` array of `{ key, children }`, where `children` is itself a\n// nested, separately data-bound element). A JSX-bearing string is never\n// parsed further here — `parseValue` already reduced it to plain text\n// (see `evaluateLiteral`'s JSXElement case), and this function only ever\n// recurses into genuine object/array structure, treating every string,\n// number, and boolean as a leaf regardless of what the string contains.\n// Depth is capped defensively (pathological/deeply-recursive input\n// shouldn't be able to blow the stack); anything past that depth is\n// treated as a leaf-less dead end and simply omitted, not thrown.\nexport const flattenEditableValue = (\n value: string,\n): EditableValueEntry[] | null => {\n const parsed = parseValue(value);\n\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n Object.keys(parsed).length === 0\n ) {\n return null;\n }\n\n const entries: EditableValueEntry[] = [];\n\n const walk = (node: unknown, path: EditablePathSegment[], depth: number) => {\n if (depth > MAX_FLATTEN_DEPTH) {\n return;\n }\n\n if (isEditablePrimitive(node)) {\n entries.push({ path, value: node });\n return;\n }\n\n if (Array.isArray(node)) {\n node.forEach((item, index) => walk(item, [...path, index], depth + 1));\n return;\n }\n\n if (typeof node === 'object' && node !== null) {\n Object.entries(node).forEach(([key, item]) =>\n walk(item, [...path, key], depth + 1),\n );\n }\n\n // null/undefined/function/symbol values have no editable leaf form —\n // silently omitted rather than represented as, say, an empty string,\n // which would misrepresent what's actually stored there.\n };\n\n walk(parsed, [], 0);\n\n return entries.length ? entries : null;\n};\n\n// Companion to `flattenEditableValue`: replaces the single leaf at `path`\n// and re-serializes the whole structure — the result is a plain string\n// suitable for `PanelBinding.onChange`/`Dnd`'s AST-update pipeline, same\n// as any other committed value. Fails safe: an out-of-range index, a\n// missing key, or a `value` that didn't parse to an object/array in the\n// first place returns `value` unchanged rather than throwing or silently\n// writing to the wrong place.\nexport const setEditableValue = (\n value: string,\n path: EditablePathSegment[],\n next: EditablePrimitive,\n): string => {\n if (!path.length) {\n return value;\n }\n\n const parsed = parseValue(value);\n\n if (typeof parsed !== 'object' || parsed === null) {\n return value;\n }\n\n const root: unknown = Array.isArray(parsed) ? [...parsed] : { ...parsed };\n let cursor: Record<EditablePathSegment, unknown> | unknown[] = root as\n Record<EditablePathSegment, unknown> | unknown[];\n\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i]!;\n const child = (cursor as Record<EditablePathSegment, unknown>)[key];\n\n if (typeof child !== 'object' || child === null) {\n return value;\n }\n\n const clonedChild = Array.isArray(child) ? [...child] : { ...child };\n (cursor as Record<EditablePathSegment, unknown>)[key] = clonedChild;\n cursor = clonedChild as Record<EditablePathSegment, unknown> | unknown[];\n }\n\n const lastKey = path[path.length - 1]!;\n\n if (!(lastKey in (cursor as object))) {\n return value;\n }\n\n (cursor as Record<EditablePathSegment, unknown>)[lastKey] = next;\n\n return JSON.stringify(root);\n};\n\nexport const extractNodeValue = (node: t.Node): ExtractedNodeValue => {\n if (t.isBooleanLiteral(node)) {\n return { type: 'boolean', value: node.value };\n }\n\n if (t.isNumericLiteral(node)) {\n return { type: 'number', value: node.value };\n }\n\n if (\n t.isUnaryExpression(node) &&\n node.operator === '-' &&\n t.isNumericLiteral(node.argument)\n ) {\n return { type: 'number', value: -node.argument.value };\n }\n\n if (t.isStringLiteral(node)) {\n return { type: 'string', value: node.value };\n }\n\n if (t.isTemplateLiteral(node)) {\n if (node.expressions.length === 0 && node.quasis.length === 1) {\n return {\n type: 'string',\n value: dedent(\n node.quasis[0]!.value.cooked ?? node.quasis[0]!.value.raw,\n ),\n };\n }\n return { type: 'string', value: generateCode(node) };\n }\n\n if (t.isNullLiteral(node)) {\n return { type: 'null', value: null };\n }\n\n if (t.isArrayExpression(node)) {\n return { type: 'array', value: generateCode(node) };\n }\n\n if (t.isObjectExpression(node)) {\n return { type: 'object', value: generateCode(node) };\n }\n\n if (t.isJSXElement(node) || t.isJSXFragment(node)) {\n return { type: 'string', value: generateCode(node) };\n }\n\n return { type: 'unknown', value: null };\n};\n\nexport const createNodeFromValue = (\n type: NodeValueType,\n value: unknown,\n): t.Expression | null => {\n switch (type) {\n case 'boolean': {\n return t.booleanLiteral(value === true);\n }\n case 'number': {\n return t.numericLiteral(Number(value));\n }\n case 'string': {\n return t.stringLiteral(String(value));\n }\n case 'null': {\n return t.nullLiteral();\n }\n case 'array':\n case 'object':\n case 'unknown': {\n return null;\n }\n default: {\n return null;\n }\n }\n};\n\nexport const parseArrayExpression = (value: string) => {\n try {\n const ast = parseExpression(value, {\n plugins: ['jsx', 'typescript'],\n });\n\n if (!t.isArrayExpression(ast)) {\n return null;\n }\n\n return ast;\n } catch (error) {\n console.error('❌ Array parsing error:', error);\n return null;\n }\n};\n\nexport const extractObjectProperties = (\n element: t.ObjectExpression,\n): Record<string, ExtractedNodeValue & { astNode: t.Node }> => {\n const properties: Record<string, ExtractedNodeValue & { astNode: t.Node }> =\n {};\n\n element.properties.forEach(prop => {\n if (t.isObjectProperty(prop) && t.isIdentifier(prop.key)) {\n const key = prop.key.name;\n\n if (key === 'children') {\n return;\n }\n\n const extracted = extractNodeValue(prop.value);\n\n properties[key] = {\n ...extracted,\n astNode: prop.value,\n };\n }\n });\n\n return properties;\n};\n\nexport const arrayExpressionToCode = (\n elements: t.ObjectExpression[],\n): string => {\n const nextAst = t.arrayExpression(elements);\n return generateCode(nextAst);\n};\n","import { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { z } from 'zod';\n\nimport { BINDING_PROP, DATA_ATTR } from '../../constants';\nimport {\n BINDING_TYPES,\n type BindingItem,\n type BindingOption,\n type BindingRenderMap,\n type DataAttrNode,\n} from './types';\nimport { evaluateLiteral, parseArrayExpression } from './value';\n\nconst bindingTypeSchema = z.enum(BINDING_TYPES);\n\nconst bindingOptionSchema = z.object({\n label: z.string(),\n value: z.string(),\n});\n\nconst bindingRenderLeafSchema = z.object({\n type: bindingTypeSchema,\n property: z.string().optional(),\n});\n\nconst rawBindingItemSchema = z.object({\n label: z.string(),\n property: z.string().optional(),\n type: bindingTypeSchema.optional(),\n options: z.array(bindingOptionSchema).optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n pattern: z.string().optional(),\n required: z.boolean().optional(),\n});\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\n// A render map entry is either a \"leaf\" (has its own `type`) or a nested\n// map of further entries — recurse into whichever it looks like, and drop\n// anything that matches neither instead of failing the whole map.\nconst sanitizeRenderMap = (value: unknown): BindingRenderMap | undefined => {\n if (!isPlainObject(value)) {\n return undefined;\n }\n\n const map: BindingRenderMap = {};\n\n for (const [key, raw] of Object.entries(value)) {\n if (!isPlainObject(raw)) {\n continue;\n }\n\n if ('type' in raw) {\n const leaf = bindingRenderLeafSchema.safeParse(raw);\n\n if (leaf.success) {\n const render = sanitizeRenderMap(raw.render);\n map[key] = render ? { ...leaf.data, render } : leaf.data;\n }\n continue;\n }\n\n const nested = sanitizeRenderMap(raw);\n\n if (nested) {\n map[key] = nested;\n }\n }\n\n return Object.keys(map).length > 0 ? map : undefined;\n};\n\nexport const parseBinding = (bindingValue: string | null): BindingItem[] => {\n if (!bindingValue) {\n return [];\n }\n\n const ast = parseArrayExpression(bindingValue);\n\n if (!ast) {\n return [];\n }\n\n const raw = evaluateLiteral(ast);\n\n if (!Array.isArray(raw)) {\n return [];\n }\n\n const items: BindingItem[] = [];\n\n for (const rawItem of raw) {\n if (!isPlainObject(rawItem)) {\n continue;\n }\n\n // Drop an unrecognized `type` instead of rejecting the whole item — an\n // authored binding with a typo'd/future type string still works as an\n // untyped field rather than disappearing entirely.\n const sanitizedType = bindingTypeSchema.safeParse(rawItem.type);\n\n // Drop individually malformed options instead of rejecting the whole\n // item — a select field with 3 valid options and 1 malformed one should\n // still work with the 3 valid ones.\n const sanitizedOptions = Array.isArray(rawItem.options)\n ? rawItem.options\n .map(option => {\n const parsed = bindingOptionSchema.safeParse(option);\n return parsed.success ? parsed.data : null;\n })\n .filter((option): option is BindingOption => option !== null)\n : undefined;\n\n const parsed = rawBindingItemSchema.safeParse({\n ...rawItem,\n type: sanitizedType.success ? sanitizedType.data : undefined,\n options: sanitizedOptions?.length ? sanitizedOptions : undefined,\n });\n\n if (!parsed.success) {\n continue;\n }\n\n const { label, property, type, options, min, max, pattern, required } =\n parsed.data;\n\n if (property === undefined && type !== 'richtext') {\n continue;\n }\n\n const render = sanitizeRenderMap(rawItem.render);\n\n items.push({\n label,\n property: property ?? BINDING_PROP.INNER_HTML,\n ...(type !== undefined && { type }),\n ...(options?.length && { options }),\n ...(render && { render }),\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max }),\n ...(pattern !== undefined && { pattern }),\n ...(required !== undefined && { required }),\n });\n }\n\n return items;\n};\n\nexport const getCurrentValue = (\n node: DataAttrNode,\n property: string,\n): string => {\n switch (property) {\n case BINDING_PROP.INNER_TEXT: {\n return node.textContent || '';\n }\n\n case BINDING_PROP.INNER_HTML: {\n // richtext 타입: dangerouslySetInnerHTML={{ __html }} 에서 읽기\n const dsiAttr = node.attributes.find(\n a => a.name === 'dangerouslySetInnerHTML',\n );\n if (dsiAttr?.value) {\n try {\n const expr = parseExpression(dsiAttr.value, {\n plugins: ['jsx', 'typescript'],\n });\n if (t.isObjectExpression(expr)) {\n const htmlProp = expr.properties.find(\n p =>\n t.isObjectProperty(p) &&\n t.isIdentifier(p.key) &&\n p.key.name === '__html',\n ) as t.ObjectProperty | undefined;\n if (htmlProp) {\n if (t.isStringLiteral(htmlProp.value)) {\n return htmlProp.value.value;\n }\n if (\n t.isTemplateLiteral(htmlProp.value) &&\n htmlProp.value.expressions.length === 0\n ) {\n return (\n htmlProp.value.quasis[0]?.value.cooked ??\n htmlProp.value.quasis[0]?.value.raw ??\n ''\n );\n }\n }\n }\n } catch {\n // ignore\n }\n }\n return node.rawChildren || node.textContent || '';\n }\n\n case BINDING_PROP.CHILDREN: {\n return JSON.stringify(node?.children || []);\n }\n\n default: {\n const customAttr = node.attributes.find(attr => attr.name === property);\n const value = customAttr?.value || '';\n\n return value;\n }\n }\n};\n\nconst hasEditableBindings = (node: DataAttrNode): boolean => {\n const bindingAttr = node.dataAttributes.find(\n attr => attr.name === DATA_ATTR.BINDING,\n );\n\n if (!bindingAttr?.value) {\n return false;\n }\n\n const bindings = node.bindings || parseBinding(bindingAttr.value);\n\n return bindings.length > 0;\n};\n\nexport const findEditableChildren = (node: DataAttrNode): DataAttrNode[] => {\n const editableChildren: DataAttrNode[] = [];\n\n const traverse = (children: DataAttrNode[] | undefined) => {\n if (!children) {\n return;\n }\n\n for (const child of children) {\n if (hasEditableBindings(child)) {\n editableChildren.push(child);\n }\n traverse(child.children);\n }\n };\n\n traverse(node.children);\n\n return editableChildren;\n};\n","import { parse } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { nanoid } from 'nanoid';\n\nimport { BINDING_PROP, CONFIG, DATA_ATTR } from '../../constants';\nimport { createBoundedCache } from '../cache';\nimport { parseBinding } from './binding';\nimport { traverse } from './document';\nimport { attrValue, generateCode, wrap } from './helpers';\nimport type { Attribute, BindingItem, DataAttrNode } from './types';\n\nconst collectText = (\n children: (\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXElement\n | t.JSXFragment\n | t.JSXSpreadChild\n )[],\n) => {\n return children\n .filter(c => t.isJSXText(c))\n .map(c => (c as t.JSXText).value.trim())\n .filter(v => v.length)\n .join(' ');\n};\n\nconst getTagName = (opening: t.JSXOpeningElement): string => {\n if (t.isJSXIdentifier(opening.name)) {\n return opening.name.name;\n }\n\n if (t.isJSXMemberExpression(opening.name)) {\n return resolveMemberName(opening.name);\n }\n\n return '';\n};\n\nconst resolveMemberName = (expr: t.JSXMemberExpression): string => {\n const parts: string[] = [];\n\n const collectMemberParts = (\n node: t.JSXMemberExpression['object'] | t.JSXMemberExpression['property'],\n ): void => {\n if (t.isJSXIdentifier(node)) {\n parts.push(node.name);\n } else if (t.isJSXMemberExpression(node)) {\n collectMemberParts(node.object);\n\n if (t.isJSXIdentifier(node.property)) {\n parts.push(node.property.name);\n }\n }\n };\n\n collectMemberParts(expr.object);\n\n if (t.isJSXIdentifier(expr.property)) {\n parts.push(expr.property.name);\n }\n\n return parts.join('.');\n};\n\nconst parseJSXName = (\n tagName: string,\n): t.JSXIdentifier | t.JSXMemberExpression => {\n const parts = tagName.split('.');\n\n if (parts.length === 1) {\n return t.jsxIdentifier(parts[0]!);\n }\n\n let expr: t.JSXIdentifier | t.JSXMemberExpression = t.jsxIdentifier(\n parts[0]!,\n );\n\n for (let i = 1; i < parts.length; i++) {\n expr = t.jsxMemberExpression(expr, t.jsxIdentifier(parts[i]!));\n }\n\n return expr;\n};\n\nconst extractCache = createBoundedCache<string, DataAttrNode[]>(\n CONFIG.CACHE_LIMIT,\n);\n\nconst extractAttributes = (\n attributes: (t.JSXAttribute | t.JSXSpreadAttribute)[],\n): { allAttrs: Attribute[]; dataAttrs: Attribute[] } => {\n const allAttrs: Attribute[] = [];\n const dataAttrs: Attribute[] = [];\n\n for (const attr of attributes) {\n if (!t.isJSXAttribute(attr) || !t.isJSXIdentifier(attr.name)) {\n continue;\n }\n\n const name = attr.name.name;\n let value: string | null = null;\n let isStringLiteral = false;\n\n if (attr.value) {\n if (t.isStringLiteral(attr.value)) {\n value = attr.value.value;\n isStringLiteral = true;\n } else if (t.isJSXExpressionContainer(attr.value)) {\n try {\n value = generateCode(attr.value.expression);\n isStringLiteral = false;\n } catch {\n value = null;\n }\n }\n }\n\n const entry = { name, value, isStringLiteral };\n\n allAttrs.push(entry);\n\n if (name.startsWith('data-')) {\n dataAttrs.push(entry);\n }\n }\n\n return { allAttrs, dataAttrs };\n};\n\nconst buildChildElements = (\n node: DataAttrNode,\n): (t.JSXText | t.JSXElement | t.JSXFragment)[] => {\n const childElements: (t.JSXText | t.JSXElement | t.JSXFragment)[] = [];\n\n if (node.textContent) {\n childElements.push(t.jsxText(node.textContent));\n }\n\n node.children?.forEach(child => {\n const childJSX = nodeToJSX(child);\n if (childJSX) {\n childElements.push(childJSX);\n }\n });\n\n return childElements;\n};\n\nexport const nodeToJSX = (\n node: DataAttrNode,\n): t.JSXElement | t.JSXFragment | null => {\n try {\n if (node.isFragment) {\n const childElements = buildChildElements(node);\n\n return t.jsxFragment(\n t.jsxOpeningFragment(),\n t.jsxClosingFragment(),\n childElements,\n );\n }\n\n if (\n node.tagName === 'div' &&\n node.dataAttributes.some(attr => attr.name === 'data-item')\n ) {\n if (node.children) {\n return nodeToJSX(node.children[0]!);\n }\n return null;\n }\n\n const attributes = node.attributes.map(attr => {\n const attrName = t.jsxIdentifier(attr.name);\n\n if (!attr.value) {\n return t.jsxAttribute(attrName, null);\n }\n\n return t.jsxAttribute(attrName, attrValue(attr));\n });\n\n const elementName = parseJSXName(node.tagName);\n\n const openingElement = t.jsxOpeningElement(elementName, attributes);\n\n const closingElement = t.jsxClosingElement(elementName);\n const children = buildChildElements(node);\n\n return t.jsxElement(openingElement, closingElement, children, false);\n } catch (error) {\n console.error('❌ DataAttrNode to JSX conversion error:', error);\n return null;\n }\n};\n\nconst createWrapperNode = (\n textContent: string,\n children: DataAttrNode[],\n): DataAttrNode => ({\n tagName: 'div',\n id: nanoid(6),\n attributes: [{ name: DATA_ATTR.ITEM, value: 'true' }],\n dataAttributes: [{ name: DATA_ATTR.ITEM, value: 'true' }],\n textContent,\n children,\n});\n\nconst createFragmentNode = (\n textContent: string,\n children: DataAttrNode[],\n): DataAttrNode => ({\n tagName: '',\n id: nanoid(6),\n attributes: [],\n dataAttributes: [],\n textContent,\n children,\n isFragment: true,\n});\n\nconst processChildrenBinding = (\n jsxElement: t.JSXElement,\n processedNodes?: WeakSet<t.JSXElement | t.JSXFragment>,\n shouldWrap: boolean = true,\n): DataAttrNode[] | undefined => {\n const jsxChildren = jsxElement.children.filter(\n child => t.isJSXElement(child) || t.isJSXFragment(child),\n );\n\n if (!jsxChildren.length) {\n return undefined;\n }\n\n const childrenNodes: DataAttrNode[] = [];\n\n jsxChildren.forEach(child => {\n if (t.isJSXElement(child)) {\n const childResults = extractFromNode(child, processedNodes);\n\n if (shouldWrap) {\n const wrapperNode = createWrapperNode(\n collectText(child.children),\n childResults,\n );\n childrenNodes.push(wrapperNode);\n } else {\n childrenNodes.push(...childResults);\n }\n } else if (t.isJSXFragment(child)) {\n processedNodes?.add(child);\n\n const fragmentChildren: DataAttrNode[] = [];\n\n child.children.forEach(fragmentChild => {\n if (t.isJSXElement(fragmentChild)) {\n const childResults = extractFromNode(fragmentChild, processedNodes);\n fragmentChildren.push(...childResults);\n }\n });\n\n if (fragmentChildren.length) {\n const fragmentNode = createFragmentNode(\n collectText(child.children),\n fragmentChildren,\n );\n childrenNodes.push(fragmentNode);\n }\n }\n });\n\n return childrenNodes.length ? childrenNodes : undefined;\n};\n\nconst skipItemsChildren = (\n jsxElement: t.JSXElement,\n processedNodes: WeakSet<t.JSXElement | t.JSXFragment>,\n propertyName: string = 'items',\n): void => {\n const opening = jsxElement.openingElement;\n\n const itemsAttr = opening.attributes.find(\n attr =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === propertyName,\n );\n\n if (!itemsAttr || !t.isJSXAttribute(itemsAttr)) {\n return;\n }\n\n if (\n itemsAttr.value &&\n t.isJSXExpressionContainer(itemsAttr.value) &&\n t.isArrayExpression(itemsAttr.value.expression)\n ) {\n const arrayExpr = itemsAttr.value.expression;\n\n arrayExpr.elements.forEach(element => {\n if (t.isObjectExpression(element)) {\n element.properties.forEach(prop => {\n if (\n t.isObjectProperty(prop) &&\n t.isIdentifier(prop.key) &&\n t.isJSXElement(prop.value)\n ) {\n markProcessedJSX(prop.value, processedNodes);\n }\n });\n }\n });\n }\n};\n\nconst markProcessedJSX = (\n node: t.Node,\n processedNodes: WeakSet<t.JSXElement | t.JSXFragment>,\n): void => {\n if (t.isJSXElement(node) || t.isJSXFragment(node)) {\n processedNodes.add(node as t.JSXElement | t.JSXFragment);\n node.children.forEach(child => markProcessedJSX(child, processedNodes));\n return;\n }\n\n const expression =\n t.isJSXExpressionContainer(node) || t.isParenthesizedExpression(node);\n\n if (expression) {\n markProcessedJSX(node.expression, processedNodes);\n }\n};\n\ninterface NodeBindingInfo {\n tagName: string;\n allAttrs: Attribute[];\n dataAttrs: Attribute[];\n bindings: BindingItem[];\n childrenBinding: BindingItem | undefined;\n arrayBindings: BindingItem[];\n rawChildren: string | undefined;\n}\n\n// Shared prefix for the top-level traverse() visitor below and the manual\n// recursive descent in extractFromNode: read the tag name, attributes, and\n// parsed bindings off one JSXElement. What differs between the two callers\n// is how childrenNodes gets computed and whether the result is pushed at\n// all — traverse() only records elements with data-* attributes, while\n// extractFromNode always records the children it's asked to (see each call\n// site for details).\nconst readNodeBindingInfo = (node: t.JSXElement): NodeBindingInfo => {\n const opening = node.openingElement;\n const tagName = getTagName(opening);\n const { allAttrs, dataAttrs } = extractAttributes(opening.attributes);\n\n const bindingAttr = dataAttrs.find(attr => attr.name === DATA_ATTR.BINDING);\n const bindings = bindingAttr?.value ? parseBinding(bindingAttr.value) : [];\n\n const childrenBinding = bindings.find(\n b => b.property === BINDING_PROP.CHILDREN,\n );\n const arrayBindings = bindings.filter(\n b => b.property === BINDING_PROP.ITEMS || b.type === 'array',\n );\n\n const innerHtmlBinding = bindings.find(\n b => b.property === BINDING_PROP.INNER_HTML,\n );\n\n let rawChildren: string | undefined;\n if (innerHtmlBinding && node.children.length > 0) {\n rawChildren = node.children\n .map(child => generateCode(child))\n .join('')\n .trim();\n }\n\n return {\n tagName,\n allAttrs,\n dataAttrs,\n bindings,\n childrenBinding,\n arrayBindings,\n rawChildren,\n };\n};\n\nconst parseToNodes = (raw: string): DataAttrNode[] => {\n const wrapped = wrap(raw);\n const ast = parse(wrapped, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n errorRecovery: true,\n });\n\n const results: DataAttrNode[] = [];\n\n // babel's traverse() below visits every JSXElement in the tree, top to\n // bottom, regardless of structure. But some elements are meant to be\n // recorded as *structural* children of another result — e.g. a node\n // wrapped by processChildrenBinding()/extractFromNode() into a parent's\n // `children` array, or an element sitting inside an `items` binding's\n // array literal (skipped via skipItemsChildren()/markProcessedJSX()) —\n // not as their own top-level entry in `results`. Without this WeakSet,\n // traverse() would independently re-visit those same elements once it\n // reaches them in the tree and add a second, duplicate entry for them.\n // Each helper below adds a node here the moment it pulls that node out\n // of the normal top-level flow, and the JSXElement() visitor skips\n // anything already marked.\n const processedNodes = new WeakSet<t.JSXElement | t.JSXFragment>();\n\n traverse(ast, {\n JSXElement(path) {\n if (processedNodes.has(path.node)) {\n return;\n }\n\n const {\n tagName,\n allAttrs,\n dataAttrs,\n bindings,\n childrenBinding,\n arrayBindings,\n rawChildren,\n } = readNodeBindingInfo(path.node);\n\n if (!tagName || !dataAttrs.length) {\n return;\n }\n\n let childrenNodes: DataAttrNode[] | undefined;\n\n if (childrenBinding) {\n childrenNodes = processChildrenBinding(path.node, processedNodes);\n }\n\n for (const arrayBinding of arrayBindings) {\n skipItemsChildren(path.node, processedNodes, arrayBinding.property);\n }\n\n results.push({\n tagName,\n attributes: allAttrs,\n dataAttributes: dataAttrs,\n textContent: collectText(path.node.children),\n rawChildren,\n children: childrenNodes,\n bindings,\n loc: path.node.loc\n ? {\n start: {\n line: path.node.loc.start.line,\n column: path.node.loc.start.column,\n },\n end: {\n line: path.node.loc.end.line,\n column: path.node.loc.end.column,\n },\n }\n : undefined,\n });\n },\n });\n\n return results;\n};\n\nexport function extract(raw: string): DataAttrNode[] {\n if (extractCache.has(raw)) {\n return extractCache.get(raw)!;\n }\n\n const results = parseToNodes(raw);\n\n extractCache.set(raw, results);\n\n return results;\n}\n\nfunction extractFromNode(\n node: t.JSXElement,\n processedNodes?: WeakSet<t.JSXElement | t.JSXFragment>,\n): DataAttrNode[] {\n processedNodes?.add(node);\n\n const {\n tagName,\n allAttrs,\n dataAttrs,\n bindings,\n childrenBinding,\n rawChildren,\n } = readNodeBindingInfo(node);\n\n let childrenNodes: DataAttrNode[] | undefined;\n\n if (childrenBinding) {\n childrenNodes = processChildrenBinding(node, processedNodes);\n }\n\n if (!childrenNodes) {\n childrenNodes = processChildrenBinding(node, processedNodes, false);\n }\n\n return [\n {\n tagName,\n attributes: allAttrs,\n dataAttributes: dataAttrs,\n textContent: collectText(node.children),\n rawChildren,\n children: childrenNodes,\n bindings,\n },\n ];\n}\n\nexport function clearExtractCache() {\n extractCache.clear();\n}\n","import { parse } from '@babel/parser';\nimport type { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { nanoid } from 'nanoid';\n\nimport { BINDING_PROP, DATA_ATTR, REGEX } from '../../constants';\nimport { parseBinding } from './binding';\nimport { traverse } from './document';\nimport { nodeToJSX } from './extract';\nimport { attrValue, generateCode, unwrap, wrap } from './helpers';\nimport type { DataAttrNode } from './types';\n\nconst updateInnerText = (\n path: NodePath<t.JSXElement>,\n value: string,\n): boolean => {\n const jsxChildren = path.node.children;\n\n for (let i = jsxChildren.length - 1; i >= 0; i--) {\n if (t.isJSXText(jsxChildren[i])) {\n jsxChildren.splice(i, 1);\n }\n }\n\n jsxChildren.push(t.jsxText(value));\n return true;\n};\n\n// Injects a `{__PREFIX_<id>__}` JSX expression container as a placeholder,\n// then records how the placeholder's *generated source text* should be\n// string-replaced with the real value once generateCode() has run — used\n// for values (raw HTML, arbitrary JSX/expressions) that can't be\n// represented as AST literals, so we can't just build the real node here.\n//\n// `asRawContent: true` replaces the placeholder *including* its enclosing\n// braces, so the raw value lands as literal children content instead of a\n// JS expression (used for innerHTML). Leaving it false replaces only the\n// identifier inside the braces, so the value is inserted as the expression\n// itself (used for a `type: 'jsx'` attribute value).\nconst injectPlaceholder = (\n prefix: string,\n value: string,\n placeholders: Map<string, string>,\n { asRawContent = false }: { asRawContent?: boolean } = {},\n): t.JSXExpressionContainer => {\n const name = `__${prefix}_${nanoid(6)}__`;\n const container = t.jsxExpressionContainer(t.identifier(name));\n\n placeholders.set(asRawContent ? `{${name}}` : name, value);\n\n return container;\n};\n\nconst updateInnerHTML = (\n path: NodePath<t.JSXElement>,\n value: string,\n placeholders: Map<string, string>,\n): boolean => {\n path.node.children = [\n injectPlaceholder('HTML', value, placeholders, { asRawContent: true }),\n ];\n\n return true;\n};\n\nconst updateChildren = (\n path: NodePath<t.JSXElement>,\n value: string,\n): boolean => {\n try {\n const childrenData = JSON.parse(value) as DataAttrNode[];\n\n path.node.children.length = 0;\n\n childrenData.forEach(childData => {\n const jsxElement = nodeToJSX(childData);\n if (jsxElement) {\n path.node.children.push(jsxElement);\n }\n });\n\n return true;\n } catch (error) {\n console.error('❌ Children update error:', error);\n return false;\n }\n};\n\nconst updateRichtext = (\n path: NodePath<t.JSXElement>,\n value: string,\n): boolean => {\n path.node.children = [];\n\n const opening = path.node.openingElement;\n const htmlObject = t.objectExpression([\n t.objectProperty(t.identifier('__html'), t.stringLiteral(value)),\n ]);\n\n const existingAttr = opening.attributes.find(\n a =>\n t.isJSXAttribute(a) &&\n t.isJSXIdentifier(a.name) &&\n a.name.name === 'dangerouslySetInnerHTML',\n );\n\n if (existingAttr && t.isJSXAttribute(existingAttr)) {\n existingAttr.value = t.jsxExpressionContainer(htmlObject);\n } else {\n opening.attributes.push(\n t.jsxAttribute(\n t.jsxIdentifier('dangerouslySetInnerHTML'),\n t.jsxExpressionContainer(htmlObject),\n ),\n );\n }\n\n return true;\n};\n\nconst updateAttribute = (\n opening: t.JSXOpeningElement,\n propertyName: string,\n value: string,\n): boolean => {\n const customAttr = opening.attributes.find(\n attr =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === propertyName,\n );\n\n if (customAttr && t.isJSXAttribute(customAttr)) {\n const trimmed = value.trim();\n const isExpression =\n trimmed.startsWith('[') ||\n trimmed.startsWith('{') ||\n REGEX.NUMBER.test(trimmed) ||\n REGEX.BOOLEAN_OR_NULL.test(trimmed);\n\n customAttr.value = attrValue({\n name: propertyName,\n value,\n isStringLiteral: !isExpression,\n });\n\n return true;\n }\n\n return false;\n};\n\nexport interface UpdateResult {\n code: string;\n success: boolean;\n}\n\n// `label` is a display string — reworded, duplicated, or translated at\n// authors' whim — so it identifies a binding only as a fallback. `property`\n// (an actual key, unique per element) is the real identity; pass it\n// whenever the caller has it (every internal caller does, via\n// PanelBinding.property). See #240: two bindings sharing a label used to\n// resolve to whichever `.find()` hit first, silently dropping the other's\n// edit while still reporting success.\nexport const update = (\n code: string,\n dataId: string,\n label: string,\n value: string,\n property?: string,\n): UpdateResult => {\n try {\n const wrapped = wrap(code);\n const ast = parse(wrapped, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n let changed = false;\n const jsxPlaceholders = new Map<string, string>();\n\n traverse(ast, {\n JSXElement(path) {\n const opening = path.node.openingElement;\n\n const idAttr = opening.attributes.find(attr => {\n return (\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === DATA_ATTR.ID &&\n attr.value &&\n t.isStringLiteral(attr.value) &&\n attr.value.value === dataId\n );\n });\n\n if (!idAttr) {\n return;\n }\n\n const bindingAttr = opening.attributes.find(\n (attr): attr is t.JSXAttribute =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === DATA_ATTR.BINDING,\n );\n\n if (!bindingAttr?.value) {\n return;\n }\n\n let bindingValue = '';\n\n if (t.isStringLiteral(bindingAttr.value)) {\n bindingValue = bindingAttr.value.value;\n } else if (t.isJSXExpressionContainer(bindingAttr.value)) {\n try {\n bindingValue = generateCode(bindingAttr.value.expression);\n } catch {\n return;\n }\n }\n\n const bindings = parseBinding(bindingValue);\n\n // Prefer `property` (an actual key) over `label` (a display\n // string) — see the module-level comment on `update`. Either way,\n // more than one match on this element is an authoring ambiguity\n // (duplicate labels, or a genuine property collision), not a case\n // to silently resolve by picking the first — see #240.\n const matches = bindings.filter(binding =>\n property !== undefined\n ? binding.property === property\n : binding.label === label,\n );\n\n if (matches.length !== 1) {\n return;\n }\n\n const propertyBinding = matches[0]!;\n\n switch (propertyBinding.property) {\n case BINDING_PROP.INNER_TEXT: {\n changed = updateInnerText(path, value);\n break;\n }\n\n case BINDING_PROP.INNER_HTML: {\n if (propertyBinding.type === 'richtext') {\n changed = updateRichtext(path, value);\n } else {\n changed = updateInnerHTML(path, value, jsxPlaceholders);\n }\n break;\n }\n\n case BINDING_PROP.CHILDREN: {\n changed = updateChildren(path, value);\n break;\n }\n\n default: {\n if (propertyBinding.type === 'jsx') {\n const attr = opening.attributes.find(\n a =>\n t.isJSXAttribute(a) &&\n t.isJSXIdentifier(a.name) &&\n a.name.name === propertyBinding.property,\n );\n\n if (attr && t.isJSXAttribute(attr)) {\n attr.value = injectPlaceholder(\n 'JSX',\n value.trim(),\n jsxPlaceholders,\n );\n changed = true;\n }\n } else {\n changed = updateAttribute(\n opening,\n propertyBinding.property,\n value,\n );\n }\n\n break;\n }\n }\n },\n });\n\n if (!changed) {\n return { code, success: false };\n }\n\n let result = unwrap(generateCode(ast));\n\n for (const [placeholder, original] of jsxPlaceholders) {\n // 두 번째 인자가 문자열이면 $&, $$ 같은 특수 치환 패턴으로 해석되어\n // original 안에 그런 문자가 있으면 결과가 깨진다 — 함수형 치환자로 방지.\n result = result.replace(placeholder, () => original);\n }\n\n return { code: result, success: true };\n } catch (error) {\n console.error('❌ Code update error:', error);\n return { code, success: false };\n }\n};\n\nexport const bulkUpdate = (\n raw: string,\n entries: {\n dataId: string;\n label: string;\n value: string;\n property?: string;\n }[],\n): UpdateResult => {\n let current = raw;\n let allSucceeded = true;\n\n for (const entry of entries) {\n const result = update(\n current,\n entry.dataId,\n entry.label,\n entry.value,\n entry.property,\n );\n current = result.code;\n allSucceeded = allSucceeded && result.success;\n }\n\n return { code: current, success: allSucceeded };\n};\n","import { parseExpression } from '@babel/parser';\nimport * as t from '@babel/types';\nimport { nanoid } from 'nanoid';\n\nimport { DATA_ATTR } from '../../constants';\nimport { generateCode } from './helpers';\n\nexport const replaceIds = (\n code: string,\n generateId: () => string = () => nanoid(6),\n): string => {\n return code.replace(new RegExp(`${DATA_ATTR.ID}=\"[^\"]*\"`, 'g'), () => {\n return `${DATA_ATTR.ID}=\"${generateId()}\"`;\n });\n};\n\nexport const fillIds = (\n code: string,\n generateId: () => string = () => nanoid(6),\n): string => {\n return code.replace(new RegExp(`${DATA_ATTR.ID}=\"\"`, 'g'), () => {\n return `${DATA_ATTR.ID}=\"${generateId()}\"`;\n });\n};\n\nexport const clone = (\n element: t.Node,\n generateId: () => string = () => nanoid(6),\n) => {\n const cloned = t.cloneNode(element, true);\n const generatedCode = generateCode(cloned);\n const code = replaceIds(generatedCode, generateId);\n\n return parseExpression(code, {\n plugins: ['jsx', 'typescript'],\n });\n};\n","import type { BindingItem } from './types';\n\nexport interface ValidationResult {\n valid: boolean;\n message?: string;\n}\n\nconst VALID: ValidationResult = { valid: true };\n\nexport const validateBindingValue = (\n binding: BindingItem,\n value: unknown,\n): ValidationResult => {\n const isEmpty = value === '' || value === null || value === undefined;\n\n if (isEmpty) {\n if (binding.required) {\n return { valid: false, message: 'This field is required.' };\n }\n return VALID;\n }\n\n // `PanelBinding.value` (the value a custom renderPanel gets) is always a\n // string, even for `type: 'number'` bindings — coerce a numeric string\n // the same way the built-in field does today (see field.tsx's ad-hoc\n // `Number(next)`), so min/max apply to both callers instead of silently\n // no-op'ing on the string form. A non-numeric string (`NaN`) or\n // whitespace-only string is left alone; `isEmpty` above already handles\n // the plain empty-string case.\n const numericValue =\n typeof value === 'number'\n ? value\n : typeof value === 'string' &&\n value.trim() !== '' &&\n !Number.isNaN(Number(value))\n ? Number(value)\n : undefined;\n\n if (numericValue !== undefined) {\n if (binding.min !== undefined && numericValue < binding.min) {\n return { valid: false, message: `Must be at least ${binding.min}.` };\n }\n if (binding.max !== undefined && numericValue > binding.max) {\n return { valid: false, message: `Must be at most ${binding.max}.` };\n }\n }\n\n if (typeof value === 'string' && binding.pattern) {\n let regex: RegExp;\n\n try {\n regex = new RegExp(binding.pattern);\n } catch {\n // Malformed pattern authored on the binding itself — don't block the\n // user's input for an authoring mistake that isn't theirs to fix.\n return VALID;\n }\n\n if (!regex.test(value)) {\n return {\n valid: false,\n message: 'Value does not match the required format.',\n };\n }\n }\n\n if (typeof value === 'string' && binding.type === 'url') {\n try {\n new URL(value);\n } catch {\n return { valid: false, message: 'Must be a valid URL.' };\n }\n }\n\n if (typeof value === 'string' && binding.type === 'date') {\n if (Number.isNaN(Date.parse(value))) {\n return { valid: false, message: 'Must be a valid date.' };\n }\n }\n\n return VALID;\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { r as cn } from "./utils-BzfDKU6y.js";
1
+ import { r as cn } from "./utils-DPdkZJ4i.js";
2
2
  import React from "react";
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
4
  //#region src/components/error/error.tsx
@@ -89,4 +89,4 @@ var ErrorBoundary = class extends React.Component {
89
89
  //#endregion
90
90
  export { Error as n, ErrorBoundary as t };
91
91
 
92
- //# sourceMappingURL=boundary-BWBdNmNi.js.map
92
+ //# sourceMappingURL=boundary-D4D9lTGj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"boundary-BWBdNmNi.js","names":[],"sources":["../src/components/error/error.tsx","../src/components/error/boundary.tsx"],"sourcesContent":["import { cn } from '~/utils';\n\nexport interface Props extends React.ComponentPropsWithRef<'div'> {\n message?: string | null;\n title?: string;\n onReset?: () => void;\n}\n\nconst Error = ({\n message,\n title = 'An error occurred',\n className,\n onReset,\n}: Props) => {\n if (!message) {\n return null;\n }\n\n return (\n <div\n className={cn(className)}\n style={{\n padding: '16px',\n backgroundColor: '#fee2e2',\n border: '1px solid #fca5a5',\n borderRadius: '6px',\n color: '#7f1d1d',\n }}\n >\n <h3 style={{ fontSize: '14px', fontWeight: 'bold', margin: 0 }}>\n {title}\n </h3>\n <pre\n style={{\n marginTop: '8px',\n fontSize: '12px',\n whiteSpace: 'pre-wrap',\n margin: '8px 0 0 0',\n }}\n >\n {message}\n </pre>\n {onReset && (\n <button\n style={{\n marginTop: '8px',\n padding: '4px 12px',\n fontSize: '12px',\n color: 'white',\n backgroundColor: '#dc2626',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n onClick={onReset}\n >\n Try Again\n </button>\n )}\n </div>\n );\n};\n\nexport default Error;\n","import React from 'react';\n\nimport Error from './error';\n\ninterface Props {\n children: React.ReactNode;\n fallback?: (message?: string) => React.ReactNode;\n onError?: (e: Error, info: React.ErrorInfo) => void;\n // Values whose identity changing (typically the code/module that produced\n // `children`) should auto-recover a caught error without needing a\n // remount — compared shallowly, one entry at a time, same idea as\n // react-error-boundary's resetKeys. Without this, once tripped, render()\n // never even attempts `children` again (see below), so a fix to the\n // underlying code has no way to reach the screen until this array changes\n // or something remounts the boundary via `key`.\n resetKeys?: readonly unknown[];\n}\n\ninterface State {\n hasError: boolean;\n error?: Error;\n}\n\nclass ErrorBoundary extends React.Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('🚨 [Boundary] Rendering error:', error, errorInfo);\n this.props.onError?.(error, errorInfo);\n }\n\n // Safe to reset unconditionally here (no race with a freshly-thrown\n // error): while hasError is true, render() below never attempts\n // `children` at all, so resetting just schedules a follow-up render where\n // `children` gets its first real chance to run with the new resetKeys —\n // if that throws too, getDerivedStateFromError catches it fresh in that\n // later, separate commit.\n componentDidUpdate(prevProps: Props) {\n if (!this.state.hasError) {\n return;\n }\n\n const prevKeys = prevProps.resetKeys ?? [];\n const nextKeys = this.props.resetKeys ?? [];\n const changed =\n prevKeys.length !== nextKeys.length ||\n nextKeys.some((key, i) => key !== prevKeys[i]);\n\n if (changed) {\n this.setState({ hasError: false, error: undefined });\n }\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback ? (\n <>{this.props.fallback(this.state.error?.message)}</>\n ) : (\n <Error\n message={this.state.error?.message}\n onReset={() => this.setState({ hasError: false, error: undefined })}\n title=\"Rendering Error\"\n />\n );\n }\n\n return this.props.children;\n }\n}\n\nexport default ErrorBoundary;\n"],"mappings":";;;;AAQA,MAAM,SAAS,EACb,SACA,QAAQ,qBACR,WACA,cACW;CACX,IAAI,CAAC,SACH,OAAO;CAGT,OACE,qBAAC,OAAD;EACE,WAAW,GAAG,SAAS;EACvB,OAAO;GACL,SAAS;GACT,iBAAiB;GACjB,QAAQ;GACR,cAAc;GACd,OAAO;EACT;EARF,UAAA;GAUE,oBAAC,MAAD;IAAI,OAAO;KAAE,UAAU;KAAQ,YAAY;KAAQ,QAAQ;IAAE;IAC1D,UAAA;GACC,CAAA;GACJ,oBAAC,OAAD;IACE,OAAO;KACL,WAAW;KACX,UAAU;KACV,YAAY;KACZ,QAAQ;IACV;IAEC,UAAA;GACE,CAAA;GACJ,WACC,oBAAC,UAAD;IACE,OAAO;KACL,WAAW;KACX,SAAS;KACT,UAAU;KACV,OAAO;KACP,iBAAiB;KACjB,QAAQ;KACR,cAAc;KACd,QAAQ;IACV;IACA,SAAS;IACV,UAAA;GAEO,CAAA;EAEP;;AAET;;;ACtCA,IAAM,gBAAN,cAA4B,MAAM,UAAwB;CACxD,YAAY,OAAc;EACxB,MAAM,KAAK;EACX,KAAK,QAAQ,EAAE,UAAU,MAAM;CACjC;CAEA,OAAO,yBAAyB,OAAqB;EACnD,OAAO;GAAE,UAAU;GAAM;EAAM;CACjC;CAEA,kBAAkB,OAAc,WAA4B;EAC1D,QAAQ,MAAM,kCAAkC,OAAO,SAAS;EAChE,KAAK,MAAM,UAAU,OAAO,SAAS;CACvC;CAQA,mBAAmB,WAAkB;EACnC,IAAI,CAAC,KAAK,MAAM,UACd;EAGF,MAAM,WAAW,UAAU,aAAa,CAAC;EACzC,MAAM,WAAW,KAAK,MAAM,aAAa,CAAC;EAK1C,IAHE,SAAS,WAAW,SAAS,UAC7B,SAAS,MAAM,KAAK,MAAM,QAAQ,SAAS,EAAE,GAG7C,KAAK,SAAS;GAAE,UAAU;GAAO,OAAO,KAAA;EAAU,CAAC;CAEvD;CAEA,SAAS;EACP,IAAI,KAAK,MAAM,UACb,OAAO,KAAK,MAAM,WAChB,oBAAA,UAAA,EAAA,UAAG,KAAK,MAAM,SAAS,KAAK,MAAM,OAAO,OAAO,EAAI,CAAA,IAEpD,oBAAC,OAAD;GACE,SAAS,KAAK,MAAM,OAAO;GAC3B,eAAe,KAAK,SAAS;IAAE,UAAU;IAAO,OAAO,KAAA;GAAU,CAAC;GAClE,OAAM;EACP,CAAA;EAIL,OAAO,KAAK,MAAM;CACpB;AACF"}
1
+ {"version":3,"file":"boundary-D4D9lTGj.js","names":[],"sources":["../src/components/error/error.tsx","../src/components/error/boundary.tsx"],"sourcesContent":["import { cn } from '~/utils';\n\nexport interface Props extends React.ComponentPropsWithRef<'div'> {\n message?: string | null;\n title?: string;\n onReset?: () => void;\n}\n\nconst Error = ({\n message,\n title = 'An error occurred',\n className,\n onReset,\n}: Props) => {\n if (!message) {\n return null;\n }\n\n return (\n <div\n className={cn(className)}\n style={{\n padding: '16px',\n backgroundColor: '#fee2e2',\n border: '1px solid #fca5a5',\n borderRadius: '6px',\n color: '#7f1d1d',\n }}\n >\n <h3 style={{ fontSize: '14px', fontWeight: 'bold', margin: 0 }}>\n {title}\n </h3>\n <pre\n style={{\n marginTop: '8px',\n fontSize: '12px',\n whiteSpace: 'pre-wrap',\n margin: '8px 0 0 0',\n }}\n >\n {message}\n </pre>\n {onReset && (\n <button\n style={{\n marginTop: '8px',\n padding: '4px 12px',\n fontSize: '12px',\n color: 'white',\n backgroundColor: '#dc2626',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n onClick={onReset}\n >\n Try Again\n </button>\n )}\n </div>\n );\n};\n\nexport default Error;\n","import React from 'react';\n\nimport Error from './error';\n\ninterface Props {\n children: React.ReactNode;\n fallback?: (message?: string) => React.ReactNode;\n onError?: (e: Error, info: React.ErrorInfo) => void;\n // Values whose identity changing (typically the code/module that produced\n // `children`) should auto-recover a caught error without needing a\n // remount — compared shallowly, one entry at a time, same idea as\n // react-error-boundary's resetKeys. Without this, once tripped, render()\n // never even attempts `children` again (see below), so a fix to the\n // underlying code has no way to reach the screen until this array changes\n // or something remounts the boundary via `key`.\n resetKeys?: readonly unknown[];\n}\n\ninterface State {\n hasError: boolean;\n error?: Error;\n}\n\nclass ErrorBoundary extends React.Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('🚨 [Boundary] Rendering error:', error, errorInfo);\n this.props.onError?.(error, errorInfo);\n }\n\n // Safe to reset unconditionally here (no race with a freshly-thrown\n // error): while hasError is true, render() below never attempts\n // `children` at all, so resetting just schedules a follow-up render where\n // `children` gets its first real chance to run with the new resetKeys —\n // if that throws too, getDerivedStateFromError catches it fresh in that\n // later, separate commit.\n componentDidUpdate(prevProps: Props) {\n if (!this.state.hasError) {\n return;\n }\n\n const prevKeys = prevProps.resetKeys ?? [];\n const nextKeys = this.props.resetKeys ?? [];\n const changed =\n prevKeys.length !== nextKeys.length ||\n nextKeys.some((key, i) => key !== prevKeys[i]);\n\n if (changed) {\n this.setState({ hasError: false, error: undefined });\n }\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback ? (\n <>{this.props.fallback(this.state.error?.message)}</>\n ) : (\n <Error\n message={this.state.error?.message}\n onReset={() => this.setState({ hasError: false, error: undefined })}\n title=\"Rendering Error\"\n />\n );\n }\n\n return this.props.children;\n }\n}\n\nexport default ErrorBoundary;\n"],"mappings":";;;;AAQA,MAAM,SAAS,EACb,SACA,QAAQ,qBACR,WACA,cACW;CACX,IAAI,CAAC,SACH,OAAO;CAGT,OACE,qBAAC,OAAD;EACE,WAAW,GAAG,SAAS;EACvB,OAAO;GACL,SAAS;GACT,iBAAiB;GACjB,QAAQ;GACR,cAAc;GACd,OAAO;EACT;EARF,UAAA;GAUE,oBAAC,MAAD;IAAI,OAAO;KAAE,UAAU;KAAQ,YAAY;KAAQ,QAAQ;IAAE;IAC1D,UAAA;GACC,CAAA;GACJ,oBAAC,OAAD;IACE,OAAO;KACL,WAAW;KACX,UAAU;KACV,YAAY;KACZ,QAAQ;IACV;IAEC,UAAA;GACE,CAAA;GACJ,WACC,oBAAC,UAAD;IACE,OAAO;KACL,WAAW;KACX,SAAS;KACT,UAAU;KACV,OAAO;KACP,iBAAiB;KACjB,QAAQ;KACR,cAAc;KACd,QAAQ;IACV;IACA,SAAS;IACV,UAAA;GAEO,CAAA;EAEP;;AAET;;;ACtCA,IAAM,gBAAN,cAA4B,MAAM,UAAwB;CACxD,YAAY,OAAc;EACxB,MAAM,KAAK;EACX,KAAK,QAAQ,EAAE,UAAU,MAAM;CACjC;CAEA,OAAO,yBAAyB,OAAqB;EACnD,OAAO;GAAE,UAAU;GAAM;EAAM;CACjC;CAEA,kBAAkB,OAAc,WAA4B;EAC1D,QAAQ,MAAM,kCAAkC,OAAO,SAAS;EAChE,KAAK,MAAM,UAAU,OAAO,SAAS;CACvC;CAQA,mBAAmB,WAAkB;EACnC,IAAI,CAAC,KAAK,MAAM,UACd;EAGF,MAAM,WAAW,UAAU,aAAa,CAAC;EACzC,MAAM,WAAW,KAAK,MAAM,aAAa,CAAC;EAK1C,IAHE,SAAS,WAAW,SAAS,UAC7B,SAAS,MAAM,KAAK,MAAM,QAAQ,SAAS,EAAE,GAG7C,KAAK,SAAS;GAAE,UAAU;GAAO,OAAO,KAAA;EAAU,CAAC;CAEvD;CAEA,SAAS;EACP,IAAI,KAAK,MAAM,UACb,OAAO,KAAK,MAAM,WAChB,oBAAA,UAAA,EAAA,UAAG,KAAK,MAAM,SAAS,KAAK,MAAM,OAAO,OAAO,EAAI,CAAA,IAEpD,oBAAC,OAAD;GACE,SAAS,KAAK,MAAM,OAAO;GAC3B,eAAe,KAAK,SAAS;IAAE,UAAU;IAAO,OAAO,KAAA;GAAU,CAAC;GAClE,OAAM;EACP,CAAA;EAIL,OAAO,KAAK,MAAM;CACpB;AACF"}
@@ -1,5 +1,5 @@
1
- import { _ as DEFAULT_TEMPLATE } from "./document-CSIscFpL.js";
2
- import { n as clearCompilationCache } from "./utils-BzfDKU6y.js";
1
+ import { y as DEFAULT_TEMPLATE } from "./document-B5jioCvf.js";
2
+ import { n as clearCompilationCache } from "./utils-DPdkZJ4i.js";
3
3
  import { n as PreviewContext, t as ErrorContext } from "./states-Ci1AvoQ9.js";
4
4
  import { useCallback, useEffect, useMemo, useState } from "react";
5
5
  import { jsx } from "react/jsx-runtime";
@@ -35,4 +35,4 @@ const ContextProvider = ({ children }) => {
35
35
  //#endregion
36
36
  export { ContextProvider as t };
37
37
 
38
- //# sourceMappingURL=context-DrqO0VVu.js.map
38
+ //# sourceMappingURL=context-Dp9_x2pr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-DrqO0VVu.js","names":[],"sources":["../src/components/context/context.tsx"],"sourcesContent":["'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { DEFAULT_TEMPLATE } from '~/constants';\nimport { clearCompilationCache } from '~/utils';\n\nimport type { ErrorContextType, PreviewContextType } from './states';\nimport { ErrorContext, PreviewContext } from './states';\n\nconst ContextProvider = ({ children }: { children?: React.ReactNode }) => {\n const [code, setCodeState] = useState(DEFAULT_TEMPLATE);\n const [error, setError] = useState<ErrorContextType['error']>(null);\n\n // Clears any stale runtime/compile error in the same update batch that\n // changes `code`, rather than in a separate useEffect — a useEffect here\n // would race with componentDidCatch/Guard's onError firing for the *new*\n // code's own errors within the same commit (layout effects run before\n // passive effects, so a passive-effect reset could wipe out an error the\n // new code just threw). Batching setError(null) into the same update as\n // setCode guarantees stale errors are gone by the time the new code even\n // renders, with nothing left afterward that could clobber a fresh one.\n const setCode = useCallback<PreviewContextType['setCode']>(next => {\n setError(null);\n setCodeState(next);\n }, []);\n\n useEffect(() => {\n return () => {\n clearCompilationCache();\n };\n }, []);\n\n // Without this, a new object identity on every ContextProvider render\n // (even ones that don't touch code/error at all, e.g. a parent\n // re-rendering) meant every usePreview()/useError() consumer re-rendered\n // too, regardless of whether the values they care about actually changed.\n const previewValue = useMemo<PreviewContextType>(\n () => ({ code, setCode }),\n [code, setCode],\n );\n\n const errorValue = useMemo<ErrorContextType>(\n () => ({ error, setError }),\n [error, setError],\n );\n\n return (\n <PreviewContext.Provider value={previewValue}>\n <ErrorContext.Provider value={errorValue}>\n {children}\n </ErrorContext.Provider>\n </PreviewContext.Provider>\n );\n};\n\nexport default ContextProvider;\n"],"mappings":";;;;;;AAUA,MAAM,mBAAmB,EAAE,eAA+C;CACxE,MAAM,CAAC,MAAM,gBAAgB,SAAS,gBAAgB;CACtD,MAAM,CAAC,OAAO,YAAY,SAAoC,IAAI;CAUlE,MAAM,UAAU,aAA2C,SAAQ;EACjE,SAAS,IAAI;EACb,aAAa,IAAI;CACnB,GAAG,CAAC,CAAC;CAEL,gBAAgB;EACd,aAAa;GACX,sBAAsB;EACxB;CACF,GAAG,CAAC,CAAC;CAML,MAAM,eAAe,eACZ;EAAE;EAAM;CAAQ,IACvB,CAAC,MAAM,OAAO,CAChB;CAEA,MAAM,aAAa,eACV;EAAE;EAAO;CAAS,IACzB,CAAC,OAAO,QAAQ,CAClB;CAEA,OACE,oBAAC,eAAe,UAAhB;EAAyB,OAAO;EAC9B,UAAA,oBAAC,aAAa,UAAd;GAAuB,OAAO;GAC3B;EACoB,CAAA;CACA,CAAA;AAE7B"}
1
+ {"version":3,"file":"context-Dp9_x2pr.js","names":[],"sources":["../src/components/context/context.tsx"],"sourcesContent":["'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { DEFAULT_TEMPLATE } from '~/constants';\nimport { clearCompilationCache } from '~/utils';\n\nimport type { ErrorContextType, PreviewContextType } from './states';\nimport { ErrorContext, PreviewContext } from './states';\n\nconst ContextProvider = ({ children }: { children?: React.ReactNode }) => {\n const [code, setCodeState] = useState(DEFAULT_TEMPLATE);\n const [error, setError] = useState<ErrorContextType['error']>(null);\n\n // Clears any stale runtime/compile error in the same update batch that\n // changes `code`, rather than in a separate useEffect — a useEffect here\n // would race with componentDidCatch/Guard's onError firing for the *new*\n // code's own errors within the same commit (layout effects run before\n // passive effects, so a passive-effect reset could wipe out an error the\n // new code just threw). Batching setError(null) into the same update as\n // setCode guarantees stale errors are gone by the time the new code even\n // renders, with nothing left afterward that could clobber a fresh one.\n const setCode = useCallback<PreviewContextType['setCode']>(next => {\n setError(null);\n setCodeState(next);\n }, []);\n\n useEffect(() => {\n return () => {\n clearCompilationCache();\n };\n }, []);\n\n // Without this, a new object identity on every ContextProvider render\n // (even ones that don't touch code/error at all, e.g. a parent\n // re-rendering) meant every usePreview()/useError() consumer re-rendered\n // too, regardless of whether the values they care about actually changed.\n const previewValue = useMemo<PreviewContextType>(\n () => ({ code, setCode }),\n [code, setCode],\n );\n\n const errorValue = useMemo<ErrorContextType>(\n () => ({ error, setError }),\n [error, setError],\n );\n\n return (\n <PreviewContext.Provider value={previewValue}>\n <ErrorContext.Provider value={errorValue}>\n {children}\n </ErrorContext.Provider>\n </PreviewContext.Provider>\n );\n};\n\nexport default ContextProvider;\n"],"mappings":";;;;;;AAUA,MAAM,mBAAmB,EAAE,eAA+C;CACxE,MAAM,CAAC,MAAM,gBAAgB,SAAS,gBAAgB;CACtD,MAAM,CAAC,OAAO,YAAY,SAAoC,IAAI;CAUlE,MAAM,UAAU,aAA2C,SAAQ;EACjE,SAAS,IAAI;EACb,aAAa,IAAI;CACnB,GAAG,CAAC,CAAC;CAEL,gBAAgB;EACd,aAAa;GACX,sBAAsB;EACxB;CACF,GAAG,CAAC,CAAC;CAML,MAAM,eAAe,eACZ;EAAE;EAAM;CAAQ,IACvB,CAAC,MAAM,OAAO,CAChB;CAEA,MAAM,aAAa,eACV;EAAE;EAAO;CAAS,IACzB,CAAC,OAAO,QAAQ,CAClB;CAEA,OACE,oBAAC,eAAe,UAAhB;EAAyB,OAAO;EAC9B,UAAA,oBAAC,aAAa,UAAd;GAAuB,OAAO;GAC3B;EACoB,CAAA;CACA,CAAA;AAE7B"}
@@ -1,4 +1,4 @@
1
- import { a as detectTypeScript, r as cn } from "./utils-BzfDKU6y.js";
1
+ import { a as detectTypeScript, r as cn } from "./utils-DPdkZJ4i.js";
2
2
  import { useCallback, useMemo, useRef } from "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { javascript } from "@codemirror/lang-javascript";
@@ -11192,4 +11192,4 @@ const Core = ({ value, theme, height, className, prettierOptions, fragment, raw,
11192
11192
  //#endregion
11193
11193
  export { useFormatCode as n, Core as t };
11194
11194
 
11195
- //# sourceMappingURL=core-B7igZRDs.js.map
11195
+ //# sourceMappingURL=core-J-1gMmiH.js.map