@jbpark/live-editor 1.5.0 → 1.7.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.
@@ -1,4 +1,4 @@
1
- import { S as __toESM, _ as DATA_ATTR, b as REGEX, c as generateCode, d as createBoundedCache, f as require_lib$2, g as CONFIG, h as BINDING_PROP, l as unwrap, m as require_lib, p as require_lib$1, s as attrValue, u as wrap } from "./document-BGG0pNR2.mjs";
1
+ import { b as __toESM, c as createBoundedCache, d as require_lib$2, f as require_lib$1, h as DATA_ATTR, l as require_lib$3, m as CONFIG, p as BINDING_PROP, u as require_lib, v as REGEX } from "./document-kU_tXfS_.mjs";
2
2
  import { z } from "zod";
3
3
  import crypto from "crypto";
4
4
 
@@ -18,10 +18,39 @@ const BINDING_TYPES = [
18
18
  "asset-picker"
19
19
  ];
20
20
 
21
+ //#endregion
22
+ //#region src/utils/ast/helpers.ts
23
+ var import_lib$1 = /* @__PURE__ */ __toESM(require_lib(), 1);
24
+ var import_lib$2 = require_lib$1();
25
+ var import_lib$3 = /* @__PURE__ */ __toESM(require_lib$2(), 1);
26
+ const wrap = (code) => {
27
+ return `<>${code}</>`;
28
+ };
29
+ const unwrap = (generated) => {
30
+ return generated.replace(/^<>\s*/g, "").replace(/\s*<\/>\s*;?\s*$/g, "").trim();
31
+ };
32
+ const attrValue = ({ value, isStringLiteral }) => {
33
+ if (value === null) return null;
34
+ if (isStringLiteral) return import_lib$3.stringLiteral(value);
35
+ const trimmed = value.trim();
36
+ if (REGEX.NUMBER.test(trimmed)) return import_lib$3.jsxExpressionContainer(import_lib$3.numericLiteral(parseFloat(trimmed)));
37
+ if (REGEX.BOOLEAN_OR_NULL.test(trimmed)) {
38
+ const expr = (0, import_lib$2.parseExpression)(trimmed, { plugins: ["jsx", "typescript"] });
39
+ return import_lib$3.jsxExpressionContainer(expr);
40
+ }
41
+ try {
42
+ const expr = (0, import_lib$2.parseExpression)(trimmed, { plugins: ["jsx", "typescript"] });
43
+ return import_lib$3.jsxExpressionContainer(expr);
44
+ } catch {
45
+ return import_lib$3.stringLiteral(trimmed);
46
+ }
47
+ };
48
+ const generateCode = (node) => {
49
+ return (0, import_lib$1.default)(node, { jsescOption: { minimal: true } }).code;
50
+ };
51
+
21
52
  //#endregion
22
53
  //#region src/utils/ast/value.ts
23
- var import_lib$1 = require_lib();
24
- var import_lib$2 = /* @__PURE__ */ __toESM(require_lib$1(), 1);
25
54
  const dedent = (str) => {
26
55
  const lines = str.replace(/^\n/, "").replace(/\n\s*$/, "").split("\n");
27
56
  const indent = lines.reduce((min, line) => {
@@ -32,23 +61,23 @@ const dedent = (str) => {
32
61
  return indent === Infinity ? str.trim() : lines.map((line) => line.slice(indent)).join("\n");
33
62
  };
34
63
  const evaluateLiteral = (node) => {
35
- if (import_lib$2.isStringLiteral(node)) return node.value;
36
- if (import_lib$2.isNumericLiteral(node)) return node.value;
37
- if (import_lib$2.isBooleanLiteral(node)) return node.value;
38
- if (import_lib$2.isNullLiteral(node)) return null;
39
- if (import_lib$2.isIdentifier(node) && node.name === "undefined") return;
40
- if (import_lib$2.isUnaryExpression(node) && node.operator === "-" && import_lib$2.isNumericLiteral(node.argument)) return -node.argument.value;
41
- if (import_lib$2.isTemplateLiteral(node) && node.expressions.length === 0) return node.quasis[0]?.value.cooked ?? node.quasis[0]?.value.raw ?? "";
42
- if (import_lib$2.isJSXElement(node) || import_lib$2.isJSXFragment(node)) return generateCode(node);
43
- if (import_lib$2.isArrayExpression(node)) return node.elements.map((element) => element ? evaluateLiteral(element) : null);
44
- if (import_lib$2.isObjectExpression(node)) {
64
+ if (import_lib$3.isStringLiteral(node)) return node.value;
65
+ if (import_lib$3.isNumericLiteral(node)) return node.value;
66
+ if (import_lib$3.isBooleanLiteral(node)) return node.value;
67
+ if (import_lib$3.isNullLiteral(node)) return null;
68
+ if (import_lib$3.isIdentifier(node) && node.name === "undefined") return;
69
+ if (import_lib$3.isUnaryExpression(node) && node.operator === "-" && import_lib$3.isNumericLiteral(node.argument)) return -node.argument.value;
70
+ if (import_lib$3.isTemplateLiteral(node) && node.expressions.length === 0) return node.quasis[0]?.value.cooked ?? node.quasis[0]?.value.raw ?? "";
71
+ if (import_lib$3.isJSXElement(node) || import_lib$3.isJSXFragment(node)) return generateCode(node);
72
+ if (import_lib$3.isArrayExpression(node)) return node.elements.map((element) => element ? evaluateLiteral(element) : null);
73
+ if (import_lib$3.isObjectExpression(node)) {
45
74
  const result = {};
46
75
  for (const prop of node.properties) {
47
- if (!import_lib$2.isObjectProperty(prop)) continue;
76
+ if (!import_lib$3.isObjectProperty(prop)) continue;
48
77
  let key = null;
49
- if (import_lib$2.isIdentifier(prop.key)) key = prop.key.name;
50
- else if (import_lib$2.isStringLiteral(prop.key)) key = prop.key.value;
51
- else if (import_lib$2.isNumericLiteral(prop.key)) key = String(prop.key.value);
78
+ if (import_lib$3.isIdentifier(prop.key)) key = prop.key.name;
79
+ else if (import_lib$3.isStringLiteral(prop.key)) key = prop.key.value;
80
+ else if (import_lib$3.isNumericLiteral(prop.key)) key = String(prop.key.value);
52
81
  if (key === null) continue;
53
82
  result[key] = evaluateLiteral(prop.value);
54
83
  }
@@ -68,27 +97,27 @@ const parseValue = (value) => {
68
97
  }
69
98
  if (trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]")) {
70
99
  try {
71
- const ast = (0, import_lib$1.parseExpression)(trimmed, { plugins: ["jsx", "typescript"] });
72
- if (import_lib$2.isObjectExpression(ast) || import_lib$2.isArrayExpression(ast)) return evaluateLiteral(ast);
100
+ const ast = (0, import_lib$2.parseExpression)(trimmed, { plugins: ["jsx", "typescript"] });
101
+ if (import_lib$3.isObjectExpression(ast) || import_lib$3.isArrayExpression(ast)) return evaluateLiteral(ast);
73
102
  } catch {}
74
103
  return value;
75
104
  }
76
105
  return value;
77
106
  };
78
107
  const extractNodeValue = (node) => {
79
- if (import_lib$2.isBooleanLiteral(node)) return {
108
+ if (import_lib$3.isBooleanLiteral(node)) return {
80
109
  type: "boolean",
81
110
  value: node.value
82
111
  };
83
- if (import_lib$2.isNumericLiteral(node)) return {
112
+ if (import_lib$3.isNumericLiteral(node)) return {
84
113
  type: "number",
85
114
  value: node.value
86
115
  };
87
- if (import_lib$2.isStringLiteral(node)) return {
116
+ if (import_lib$3.isStringLiteral(node)) return {
88
117
  type: "string",
89
118
  value: node.value
90
119
  };
91
- if (import_lib$2.isTemplateLiteral(node)) {
120
+ if (import_lib$3.isTemplateLiteral(node)) {
92
121
  if (node.expressions.length === 0 && node.quasis.length === 1) return {
93
122
  type: "string",
94
123
  value: dedent(node.quasis[0].value.cooked ?? node.quasis[0].value.raw)
@@ -98,19 +127,19 @@ const extractNodeValue = (node) => {
98
127
  value: generateCode(node)
99
128
  };
100
129
  }
101
- if (import_lib$2.isNullLiteral(node)) return {
130
+ if (import_lib$3.isNullLiteral(node)) return {
102
131
  type: "null",
103
132
  value: null
104
133
  };
105
- if (import_lib$2.isArrayExpression(node)) return {
134
+ if (import_lib$3.isArrayExpression(node)) return {
106
135
  type: "array",
107
136
  value: generateCode(node)
108
137
  };
109
- if (import_lib$2.isObjectExpression(node)) return {
138
+ if (import_lib$3.isObjectExpression(node)) return {
110
139
  type: "object",
111
140
  value: generateCode(node)
112
141
  };
113
- if (import_lib$2.isJSXElement(node) || import_lib$2.isJSXFragment(node)) return {
142
+ if (import_lib$3.isJSXElement(node) || import_lib$3.isJSXFragment(node)) return {
114
143
  type: "string",
115
144
  value: generateCode(node)
116
145
  };
@@ -121,10 +150,10 @@ const extractNodeValue = (node) => {
121
150
  };
122
151
  const createNodeFromValue = (type, value) => {
123
152
  switch (type) {
124
- case "boolean": return import_lib$2.booleanLiteral(value === true);
125
- case "number": return import_lib$2.numericLiteral(Number(value));
126
- case "string": return import_lib$2.stringLiteral(String(value));
127
- case "null": return import_lib$2.nullLiteral();
153
+ case "boolean": return import_lib$3.booleanLiteral(value === true);
154
+ case "number": return import_lib$3.numericLiteral(Number(value));
155
+ case "string": return import_lib$3.stringLiteral(String(value));
156
+ case "null": return import_lib$3.nullLiteral();
128
157
  case "array":
129
158
  case "object":
130
159
  case "unknown": return null;
@@ -133,8 +162,8 @@ const createNodeFromValue = (type, value) => {
133
162
  };
134
163
  const parseArrayExpression = (value) => {
135
164
  try {
136
- const ast = (0, import_lib$1.parseExpression)(value, { plugins: ["jsx", "typescript"] });
137
- if (!import_lib$2.isArrayExpression(ast)) return null;
165
+ const ast = (0, import_lib$2.parseExpression)(value, { plugins: ["jsx", "typescript"] });
166
+ if (!import_lib$3.isArrayExpression(ast)) return null;
138
167
  return ast;
139
168
  } catch (error) {
140
169
  console.error("❌ Array parsing error:", error);
@@ -144,7 +173,7 @@ const parseArrayExpression = (value) => {
144
173
  const extractObjectProperties = (element) => {
145
174
  const properties = {};
146
175
  element.properties.forEach((prop) => {
147
- if (import_lib$2.isObjectProperty(prop) && import_lib$2.isIdentifier(prop.key)) {
176
+ if (import_lib$3.isObjectProperty(prop) && import_lib$3.isIdentifier(prop.key)) {
148
177
  const key = prop.key.name;
149
178
  if (key === "children") return;
150
179
  properties[key] = {
@@ -156,7 +185,7 @@ const extractObjectProperties = (element) => {
156
185
  return properties;
157
186
  };
158
187
  const arrayExpressionToCode = (elements) => {
159
- return generateCode(import_lib$2.arrayExpression(elements));
188
+ return generateCode(import_lib$3.arrayExpression(elements));
160
189
  };
161
190
 
162
191
  //#endregion
@@ -247,12 +276,12 @@ const getCurrentValue = (node, property) => {
247
276
  case BINDING_PROP.INNER_HTML: {
248
277
  const dsiAttr = node.attributes.find((a) => a.name === "dangerouslySetInnerHTML");
249
278
  if (dsiAttr?.value) try {
250
- const expr = (0, import_lib$1.parseExpression)(dsiAttr.value, { plugins: ["jsx", "typescript"] });
251
- if (import_lib$2.isObjectExpression(expr)) {
252
- const htmlProp = expr.properties.find((p) => import_lib$2.isObjectProperty(p) && import_lib$2.isIdentifier(p.key) && p.key.name === "__html");
279
+ const expr = (0, import_lib$2.parseExpression)(dsiAttr.value, { plugins: ["jsx", "typescript"] });
280
+ if (import_lib$3.isObjectExpression(expr)) {
281
+ const htmlProp = expr.properties.find((p) => import_lib$3.isObjectProperty(p) && import_lib$3.isIdentifier(p.key) && p.key.name === "__html");
253
282
  if (htmlProp) {
254
- if (import_lib$2.isStringLiteral(htmlProp.value)) return htmlProp.value.value;
255
- if (import_lib$2.isTemplateLiteral(htmlProp.value) && htmlProp.value.expressions.length === 0) return htmlProp.value.quasis[0]?.value.cooked ?? htmlProp.value.quasis[0]?.value.raw ?? "";
283
+ if (import_lib$3.isStringLiteral(htmlProp.value)) return htmlProp.value.value;
284
+ if (import_lib$3.isTemplateLiteral(htmlProp.value) && htmlProp.value.expressions.length === 0) return htmlProp.value.quasis[0]?.value.cooked ?? htmlProp.value.quasis[0]?.value.raw ?? "";
256
285
  }
257
286
  }
258
287
  } catch {}
@@ -308,33 +337,33 @@ let nanoid = (size = 21) => {
308
337
 
309
338
  //#endregion
310
339
  //#region src/utils/ast/extract.ts
311
- var import_lib = /* @__PURE__ */ __toESM(require_lib$2(), 1);
340
+ var import_lib = /* @__PURE__ */ __toESM(require_lib$3(), 1);
312
341
  const collectText = (children) => {
313
- return children.filter((c) => import_lib$2.isJSXText(c)).map((c) => c.value.trim()).filter((v) => v.length).join(" ");
342
+ return children.filter((c) => import_lib$3.isJSXText(c)).map((c) => c.value.trim()).filter((v) => v.length).join(" ");
314
343
  };
315
344
  const getTagName = (opening) => {
316
- if (import_lib$2.isJSXIdentifier(opening.name)) return opening.name.name;
317
- if (import_lib$2.isJSXMemberExpression(opening.name)) return resolveMemberName(opening.name);
345
+ if (import_lib$3.isJSXIdentifier(opening.name)) return opening.name.name;
346
+ if (import_lib$3.isJSXMemberExpression(opening.name)) return resolveMemberName(opening.name);
318
347
  return "";
319
348
  };
320
349
  const resolveMemberName = (expr) => {
321
350
  const parts = [];
322
351
  const collectMemberParts = (node) => {
323
- if (import_lib$2.isJSXIdentifier(node)) parts.push(node.name);
324
- else if (import_lib$2.isJSXMemberExpression(node)) {
352
+ if (import_lib$3.isJSXIdentifier(node)) parts.push(node.name);
353
+ else if (import_lib$3.isJSXMemberExpression(node)) {
325
354
  collectMemberParts(node.object);
326
- if (import_lib$2.isJSXIdentifier(node.property)) parts.push(node.property.name);
355
+ if (import_lib$3.isJSXIdentifier(node.property)) parts.push(node.property.name);
327
356
  }
328
357
  };
329
358
  collectMemberParts(expr.object);
330
- if (import_lib$2.isJSXIdentifier(expr.property)) parts.push(expr.property.name);
359
+ if (import_lib$3.isJSXIdentifier(expr.property)) parts.push(expr.property.name);
331
360
  return parts.join(".");
332
361
  };
333
362
  const parseJSXName = (tagName) => {
334
363
  const parts = tagName.split(".");
335
- if (parts.length === 1) return import_lib$2.jsxIdentifier(parts[0]);
336
- let expr = import_lib$2.jsxIdentifier(parts[0]);
337
- for (let i = 1; i < parts.length; i++) expr = import_lib$2.jsxMemberExpression(expr, import_lib$2.jsxIdentifier(parts[i]));
364
+ if (parts.length === 1) return import_lib$3.jsxIdentifier(parts[0]);
365
+ let expr = import_lib$3.jsxIdentifier(parts[0]);
366
+ for (let i = 1; i < parts.length; i++) expr = import_lib$3.jsxMemberExpression(expr, import_lib$3.jsxIdentifier(parts[i]));
338
367
  return expr;
339
368
  };
340
369
  const extractCache = createBoundedCache(CONFIG.CACHE_LIMIT);
@@ -342,15 +371,15 @@ const extractAttributes = (attributes) => {
342
371
  const allAttrs = [];
343
372
  const dataAttrs = [];
344
373
  for (const attr of attributes) {
345
- if (!import_lib$2.isJSXAttribute(attr) || !import_lib$2.isJSXIdentifier(attr.name)) continue;
374
+ if (!import_lib$3.isJSXAttribute(attr) || !import_lib$3.isJSXIdentifier(attr.name)) continue;
346
375
  const name = attr.name.name;
347
376
  let value = null;
348
377
  let isStringLiteral = false;
349
378
  if (attr.value) {
350
- if (import_lib$2.isStringLiteral(attr.value)) {
379
+ if (import_lib$3.isStringLiteral(attr.value)) {
351
380
  value = attr.value.value;
352
381
  isStringLiteral = true;
353
- } else if (import_lib$2.isJSXExpressionContainer(attr.value)) try {
382
+ } else if (import_lib$3.isJSXExpressionContainer(attr.value)) try {
354
383
  value = generateCode(attr.value.expression);
355
384
  isStringLiteral = false;
356
385
  } catch {
@@ -372,7 +401,7 @@ const extractAttributes = (attributes) => {
372
401
  };
373
402
  const buildChildElements = (node) => {
374
403
  const childElements = [];
375
- if (node.textContent) childElements.push(import_lib$2.jsxText(node.textContent));
404
+ if (node.textContent) childElements.push(import_lib$3.jsxText(node.textContent));
376
405
  node.children?.forEach((child) => {
377
406
  const childJSX = nodeToJSX(child);
378
407
  if (childJSX) childElements.push(childJSX);
@@ -383,22 +412,22 @@ const nodeToJSX = (node) => {
383
412
  try {
384
413
  if (node.isFragment) {
385
414
  const childElements = buildChildElements(node);
386
- return import_lib$2.jsxFragment(import_lib$2.jsxOpeningFragment(), import_lib$2.jsxClosingFragment(), childElements);
415
+ return import_lib$3.jsxFragment(import_lib$3.jsxOpeningFragment(), import_lib$3.jsxClosingFragment(), childElements);
387
416
  }
388
417
  if (node.tagName === "div" && node.dataAttributes.some((attr) => attr.name === "data-item")) {
389
418
  if (node.children) return nodeToJSX(node.children[0]);
390
419
  return null;
391
420
  }
392
421
  const attributes = node.attributes.map((attr) => {
393
- const attrName = import_lib$2.jsxIdentifier(attr.name);
394
- if (!attr.value) return import_lib$2.jsxAttribute(attrName, null);
395
- return import_lib$2.jsxAttribute(attrName, attrValue(attr));
422
+ const attrName = import_lib$3.jsxIdentifier(attr.name);
423
+ if (!attr.value) return import_lib$3.jsxAttribute(attrName, null);
424
+ return import_lib$3.jsxAttribute(attrName, attrValue(attr));
396
425
  });
397
426
  const elementName = parseJSXName(node.tagName);
398
- const openingElement = import_lib$2.jsxOpeningElement(elementName, attributes);
399
- const closingElement = import_lib$2.jsxClosingElement(elementName);
427
+ const openingElement = import_lib$3.jsxOpeningElement(elementName, attributes);
428
+ const closingElement = import_lib$3.jsxClosingElement(elementName);
400
429
  const children = buildChildElements(node);
401
- return import_lib$2.jsxElement(openingElement, closingElement, children, false);
430
+ return import_lib$3.jsxElement(openingElement, closingElement, children, false);
402
431
  } catch (error) {
403
432
  console.error("❌ DataAttrNode to JSX conversion error:", error);
404
433
  return null;
@@ -428,21 +457,21 @@ const createFragmentNode = (textContent, children) => ({
428
457
  isFragment: true
429
458
  });
430
459
  const processChildrenBinding = (jsxElement, processedNodes, shouldWrap = true) => {
431
- const jsxChildren = jsxElement.children.filter((child) => import_lib$2.isJSXElement(child) || import_lib$2.isJSXFragment(child));
460
+ const jsxChildren = jsxElement.children.filter((child) => import_lib$3.isJSXElement(child) || import_lib$3.isJSXFragment(child));
432
461
  if (!jsxChildren.length) return;
433
462
  const childrenNodes = [];
434
463
  jsxChildren.forEach((child) => {
435
- if (import_lib$2.isJSXElement(child)) {
464
+ if (import_lib$3.isJSXElement(child)) {
436
465
  const childResults = extractFromNode(child, processedNodes);
437
466
  if (shouldWrap) {
438
467
  const wrapperNode = createWrapperNode(collectText(child.children), childResults);
439
468
  childrenNodes.push(wrapperNode);
440
469
  } else childrenNodes.push(...childResults);
441
- } else if (import_lib$2.isJSXFragment(child)) {
470
+ } else if (import_lib$3.isJSXFragment(child)) {
442
471
  processedNodes?.add(child);
443
472
  const fragmentChildren = [];
444
473
  child.children.forEach((fragmentChild) => {
445
- if (import_lib$2.isJSXElement(fragmentChild)) {
474
+ if (import_lib$3.isJSXElement(fragmentChild)) {
446
475
  const childResults = extractFromNode(fragmentChild, processedNodes);
447
476
  fragmentChildren.push(...childResults);
448
477
  }
@@ -456,21 +485,21 @@ const processChildrenBinding = (jsxElement, processedNodes, shouldWrap = true) =
456
485
  return childrenNodes.length ? childrenNodes : void 0;
457
486
  };
458
487
  const skipItemsChildren = (jsxElement, processedNodes, propertyName = "items") => {
459
- const itemsAttr = jsxElement.openingElement.attributes.find((attr) => import_lib$2.isJSXAttribute(attr) && import_lib$2.isJSXIdentifier(attr.name) && attr.name.name === propertyName);
460
- if (!itemsAttr || !import_lib$2.isJSXAttribute(itemsAttr)) return;
461
- if (itemsAttr.value && import_lib$2.isJSXExpressionContainer(itemsAttr.value) && import_lib$2.isArrayExpression(itemsAttr.value.expression)) itemsAttr.value.expression.elements.forEach((element) => {
462
- if (import_lib$2.isObjectExpression(element)) element.properties.forEach((prop) => {
463
- if (import_lib$2.isObjectProperty(prop) && import_lib$2.isIdentifier(prop.key) && import_lib$2.isJSXElement(prop.value)) markProcessedJSX(prop.value, processedNodes);
488
+ const itemsAttr = jsxElement.openingElement.attributes.find((attr) => import_lib$3.isJSXAttribute(attr) && import_lib$3.isJSXIdentifier(attr.name) && attr.name.name === propertyName);
489
+ if (!itemsAttr || !import_lib$3.isJSXAttribute(itemsAttr)) return;
490
+ if (itemsAttr.value && import_lib$3.isJSXExpressionContainer(itemsAttr.value) && import_lib$3.isArrayExpression(itemsAttr.value.expression)) itemsAttr.value.expression.elements.forEach((element) => {
491
+ if (import_lib$3.isObjectExpression(element)) element.properties.forEach((prop) => {
492
+ if (import_lib$3.isObjectProperty(prop) && import_lib$3.isIdentifier(prop.key) && import_lib$3.isJSXElement(prop.value)) markProcessedJSX(prop.value, processedNodes);
464
493
  });
465
494
  });
466
495
  };
467
496
  const markProcessedJSX = (node, processedNodes) => {
468
- if (import_lib$2.isJSXElement(node) || import_lib$2.isJSXFragment(node)) {
497
+ if (import_lib$3.isJSXElement(node) || import_lib$3.isJSXFragment(node)) {
469
498
  processedNodes.add(node);
470
499
  node.children.forEach((child) => markProcessedJSX(child, processedNodes));
471
500
  return;
472
501
  }
473
- if (import_lib$2.isJSXExpressionContainer(node) || import_lib$2.isParenthesizedExpression(node)) markProcessedJSX(node.expression, processedNodes);
502
+ if (import_lib$3.isJSXExpressionContainer(node) || import_lib$3.isParenthesizedExpression(node)) markProcessedJSX(node.expression, processedNodes);
474
503
  };
475
504
  const readNodeBindingInfo = (node) => {
476
505
  const opening = node.openingElement;
@@ -494,7 +523,7 @@ const readNodeBindingInfo = (node) => {
494
523
  };
495
524
  };
496
525
  const parseToNodes = (raw) => {
497
- const ast = (0, import_lib$1.parse)(wrap(raw), {
526
+ const ast = (0, import_lib$2.parse)(wrap(raw), {
498
527
  sourceType: "module",
499
528
  plugins: ["jsx", "typescript"],
500
529
  errorRecovery: true
@@ -560,13 +589,13 @@ function clearExtractCache() {
560
589
  //#region src/utils/ast/update.ts
561
590
  const updateInnerText = (path, value) => {
562
591
  const jsxChildren = path.node.children;
563
- for (let i = jsxChildren.length - 1; i >= 0; i--) if (import_lib$2.isJSXText(jsxChildren[i])) jsxChildren.splice(i, 1);
564
- jsxChildren.push(import_lib$2.jsxText(value));
592
+ for (let i = jsxChildren.length - 1; i >= 0; i--) if (import_lib$3.isJSXText(jsxChildren[i])) jsxChildren.splice(i, 1);
593
+ jsxChildren.push(import_lib$3.jsxText(value));
565
594
  return true;
566
595
  };
567
596
  const injectPlaceholder = (prefix, value, placeholders, { asRawContent = false } = {}) => {
568
597
  const name = `__${prefix}_${nanoid(6)}__`;
569
- const container = import_lib$2.jsxExpressionContainer(import_lib$2.identifier(name));
598
+ const container = import_lib$3.jsxExpressionContainer(import_lib$3.identifier(name));
570
599
  placeholders.set(asRawContent ? `{${name}}` : name, value);
571
600
  return container;
572
601
  };
@@ -591,15 +620,15 @@ const updateChildren = (path, value) => {
591
620
  const updateRichtext = (path, value) => {
592
621
  path.node.children = [];
593
622
  const opening = path.node.openingElement;
594
- const htmlObject = import_lib$2.objectExpression([import_lib$2.objectProperty(import_lib$2.identifier("__html"), import_lib$2.stringLiteral(value))]);
595
- const existingAttr = opening.attributes.find((a) => import_lib$2.isJSXAttribute(a) && import_lib$2.isJSXIdentifier(a.name) && a.name.name === "dangerouslySetInnerHTML");
596
- if (existingAttr && import_lib$2.isJSXAttribute(existingAttr)) existingAttr.value = import_lib$2.jsxExpressionContainer(htmlObject);
597
- else opening.attributes.push(import_lib$2.jsxAttribute(import_lib$2.jsxIdentifier("dangerouslySetInnerHTML"), import_lib$2.jsxExpressionContainer(htmlObject)));
623
+ const htmlObject = import_lib$3.objectExpression([import_lib$3.objectProperty(import_lib$3.identifier("__html"), import_lib$3.stringLiteral(value))]);
624
+ const existingAttr = opening.attributes.find((a) => import_lib$3.isJSXAttribute(a) && import_lib$3.isJSXIdentifier(a.name) && a.name.name === "dangerouslySetInnerHTML");
625
+ if (existingAttr && import_lib$3.isJSXAttribute(existingAttr)) existingAttr.value = import_lib$3.jsxExpressionContainer(htmlObject);
626
+ else opening.attributes.push(import_lib$3.jsxAttribute(import_lib$3.jsxIdentifier("dangerouslySetInnerHTML"), import_lib$3.jsxExpressionContainer(htmlObject)));
598
627
  return true;
599
628
  };
600
629
  const updateAttribute = (opening, propertyName, value) => {
601
- const customAttr = opening.attributes.find((attr) => import_lib$2.isJSXAttribute(attr) && import_lib$2.isJSXIdentifier(attr.name) && attr.name.name === propertyName);
602
- if (customAttr && import_lib$2.isJSXAttribute(customAttr)) {
630
+ const customAttr = opening.attributes.find((attr) => import_lib$3.isJSXAttribute(attr) && import_lib$3.isJSXIdentifier(attr.name) && attr.name.name === propertyName);
631
+ if (customAttr && import_lib$3.isJSXAttribute(customAttr)) {
603
632
  const trimmed = value.trim();
604
633
  customAttr.value = attrValue({
605
634
  name: propertyName,
@@ -612,7 +641,7 @@ const updateAttribute = (opening, propertyName, value) => {
612
641
  };
613
642
  const update = (code, dataId, label, value) => {
614
643
  try {
615
- const ast = (0, import_lib$1.parse)(wrap(code), {
644
+ const ast = (0, import_lib$2.parse)(wrap(code), {
616
645
  sourceType: "module",
617
646
  plugins: ["jsx", "typescript"]
618
647
  });
@@ -621,13 +650,13 @@ const update = (code, dataId, label, value) => {
621
650
  (0, import_lib.default)(ast, { JSXElement(path) {
622
651
  const opening = path.node.openingElement;
623
652
  if (!opening.attributes.find((attr) => {
624
- return import_lib$2.isJSXAttribute(attr) && import_lib$2.isJSXIdentifier(attr.name) && attr.name.name === DATA_ATTR.ID && attr.value && import_lib$2.isStringLiteral(attr.value) && attr.value.value === dataId;
653
+ return import_lib$3.isJSXAttribute(attr) && import_lib$3.isJSXIdentifier(attr.name) && attr.name.name === DATA_ATTR.ID && attr.value && import_lib$3.isStringLiteral(attr.value) && attr.value.value === dataId;
625
654
  })) return;
626
- const bindingAttr = opening.attributes.find((attr) => import_lib$2.isJSXAttribute(attr) && import_lib$2.isJSXIdentifier(attr.name) && attr.name.name === DATA_ATTR.BINDING);
655
+ const bindingAttr = opening.attributes.find((attr) => import_lib$3.isJSXAttribute(attr) && import_lib$3.isJSXIdentifier(attr.name) && attr.name.name === DATA_ATTR.BINDING);
627
656
  if (!bindingAttr?.value) return;
628
657
  let bindingValue = "";
629
- if (import_lib$2.isStringLiteral(bindingAttr.value)) bindingValue = bindingAttr.value.value;
630
- else if (import_lib$2.isJSXExpressionContainer(bindingAttr.value)) try {
658
+ if (import_lib$3.isStringLiteral(bindingAttr.value)) bindingValue = bindingAttr.value.value;
659
+ else if (import_lib$3.isJSXExpressionContainer(bindingAttr.value)) try {
631
660
  bindingValue = generateCode(bindingAttr.value.expression);
632
661
  } catch {
633
662
  return;
@@ -647,8 +676,8 @@ const update = (code, dataId, label, value) => {
647
676
  break;
648
677
  default:
649
678
  if (propertyBinding.type === "jsx") {
650
- const attr = opening.attributes.find((a) => import_lib$2.isJSXAttribute(a) && import_lib$2.isJSXIdentifier(a.name) && a.name.name === propertyBinding.property);
651
- if (attr && import_lib$2.isJSXAttribute(attr)) {
679
+ const attr = opening.attributes.find((a) => import_lib$3.isJSXAttribute(a) && import_lib$3.isJSXIdentifier(a.name) && a.name.name === propertyBinding.property);
680
+ if (attr && import_lib$3.isJSXAttribute(attr)) {
652
681
  attr.value = injectPlaceholder("JSX", value.trim(), jsxPlaceholders);
653
682
  changed = true;
654
683
  }
@@ -701,7 +730,7 @@ const fillIds = (code, generateId = () => nanoid(6)) => {
701
730
  });
702
731
  };
703
732
  const clone = (element, generateId = () => nanoid(6)) => {
704
- return (0, import_lib$1.parseExpression)(replaceIds(generateCode(import_lib$2.cloneNode(element, true)), generateId), { plugins: ["jsx", "typescript"] });
733
+ return (0, import_lib$2.parseExpression)(replaceIds(generateCode(import_lib$3.cloneNode(element, true)), generateId), { plugins: ["jsx", "typescript"] });
705
734
  };
706
735
 
707
736
  //#endregion
@@ -755,5 +784,5 @@ const validateBindingValue = (binding, value) => {
755
784
  };
756
785
 
757
786
  //#endregion
758
- export { parseArrayExpression as _, bulkUpdate as a, 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, parseValue as v };
759
- //# sourceMappingURL=ast-DyDLUN5F.mjs.map
787
+ export { parseArrayExpression as _, bulkUpdate as a, 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, parseValue as v, generateCode as y };
788
+ //# sourceMappingURL=ast-DxgO-X_f.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-DxgO-X_f.mjs","names":["t","t","t","t","t","t"],"sources":["../src/utils/ast/types.ts","../src/utils/ast/helpers.ts","../src/utils/ast/value.ts","../src/utils/ast/binding.ts","../node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/url-alphabet/index.js","../node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/index.js","../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\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 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 (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","let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nexport { urlAlphabet }\n","import crypto from 'crypto'\nimport { urlAlphabet } from './url-alphabet/index.js'\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nlet fillPool = bytes => {\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n crypto.randomFillSync(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n crypto.randomFillSync(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nlet random = bytes => {\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) => {\n fillPool((size |= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","import { parse } from '@babel/parser';\nimport traverse from '@babel/traverse';\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 { 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 traverse, { 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 { 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\nexport const update = (\n code: string,\n dataId: string,\n label: string,\n value: 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 const propertyBinding = bindings.find(\n binding => binding.label === label,\n );\n\n if (!propertyBinding) {\n return;\n }\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: { dataId: string; label: string; value: string }[],\n): UpdateResult => {\n let current = raw;\n let allSucceeded = true;\n\n for (const entry of entries) {\n const result = update(current, entry.dataId, entry.label, entry.value);\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 if (typeof value === 'number') {\n if (binding.min !== undefined && value < binding.min) {\n return { valid: false, message: `Must be at least ${binding.min}.` };\n }\n if (binding.max !== undefined && value > 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"],"x_google_ignoreList":[4,5],"mappings":"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"}