@bettercms-ai/convert 0.20.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/cli.js +117 -15
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +115 -13
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @bettercms-ai/convert
|
|
2
2
|
|
|
3
|
+
## 0.21.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- a99b2c3: A site's own section root can now declare that it applies the section's style. `sectionRootAttrs(block)` from `@bettercms-ai/astro` and `@bettercms-ai/next` returns `data-bcms-block`, `data-bcms-style` and the block's `blockStyleToCss(block.style)` as `style`. Spread it on the root: `<section {...sectionRootAttrs(block)}>`. When the block has no style there is no `style` attribute, but the marker is still there. The BetterCMS editor shows a section's spacing handles on a site-rendered page only when every section root it finds carries the marker. `bettercms-convert --componentize` now stamps the marker and the placement's style on every section root it extracts: the helper (v10) inlines the same declarations, and the registry passes each placement's `block.style` down as `blockStyle`. A root that already has its own `style` attribute, or a spread, is left unmarked.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [d84d241]
|
|
12
|
+
- @bettercms-ai/types@1.29.0
|
|
13
|
+
|
|
14
|
+
## 0.20.1
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 12147f7: The x-ray counts a bare number (a `49` price, a `5` rating) as copy. Only a zero-padded (`01`) or punctuated (`2.`, `3 /`) step marker is an ornament.
|
|
19
|
+
|
|
3
20
|
## 0.20.0
|
|
4
21
|
|
|
5
22
|
### Minor Changes
|
package/dist/cli.js
CHANGED
|
@@ -4190,7 +4190,7 @@ async function bindImages(ctx, targets) {
|
|
|
4190
4190
|
|
|
4191
4191
|
// src/helper.ts
|
|
4192
4192
|
import { createHash as createHash2 } from "crypto";
|
|
4193
|
-
var HELPER_VERSION =
|
|
4193
|
+
var HELPER_VERSION = 10;
|
|
4194
4194
|
var HEADER = "// @bettercms-ai/convert helper v";
|
|
4195
4195
|
var HELPER_PATH = Object.fromEntries(
|
|
4196
4196
|
Object.keys(DIALECT_RULES).map((d) => [d, DIALECT_RULES[d].helper])
|
|
@@ -4514,6 +4514,85 @@ export function bcmsFields(
|
|
|
4514
4514
|
return (own ? undefined : moved(key, rest.slice(key?.length ?? 0))) ?? lane + rest;
|
|
4515
4515
|
};
|
|
4516
4516
|
}
|
|
4517
|
+
|
|
4518
|
+
/**
|
|
4519
|
+
* C3/C4 \u2014 a section's \`block.style\` as the inline CSS the BetterCMS SDK draws for it.
|
|
4520
|
+
*
|
|
4521
|
+
* A converted section root carries \`data-bcms-style\` beside \`data-bcms-block\`, which is the
|
|
4522
|
+
* site's promise to the editor that "this root's inline style is \`blockStyleToCss(block.style)\`"
|
|
4523
|
+
* \u2014 and the editor only offers a section's spacing handles where every stamped root makes it.
|
|
4524
|
+
* This is \`blockStyleToCss\` from \`@bettercms-ai/types\`, INLINED for the same reason \`readPath\`
|
|
4525
|
+
* is (zero dependencies); \`helper.test.ts\` runs it against the original over a token table.
|
|
4526
|
+
*/
|
|
4527
|
+
const STYLE_SPACE_PX: Record<string, string> = { none: "0", xs: "4px", sm: "8px", md: "16px", lg: "32px", xl: "64px" };
|
|
4528
|
+
const STYLE_FONT_SIZE_REM: Record<string, string> = {
|
|
4529
|
+
sm: "0.875rem",
|
|
4530
|
+
base: "1rem",
|
|
4531
|
+
lg: "1.25rem",
|
|
4532
|
+
xl: "1.5rem",
|
|
4533
|
+
"2xl": "2rem",
|
|
4534
|
+
"3xl": "2.25rem",
|
|
4535
|
+
"4xl": "3rem",
|
|
4536
|
+
"5xl": "4rem",
|
|
4537
|
+
};
|
|
4538
|
+
const STYLE_WEIGHT: Record<string, number> = { normal: 400, medium: 500, semibold: 600, bold: 700 };
|
|
4539
|
+
const STYLE_RADIUS_PX: Record<string, string> = { none: "0", sm: "4px", md: "8px", lg: "16px", full: "9999px" };
|
|
4540
|
+
const STYLE_COLOR_HEX: Record<string, string> = { white: "#ffffff", black: "#111111", muted: "#6b7280", mutedBg: "#f3f4f6", primary: "#111111", accent: "#4f46e5" };
|
|
4541
|
+
const STYLE_SPACE_TOKEN_PX: Record<string, string> = {
|
|
4542
|
+
"section-space-none": "0px",
|
|
4543
|
+
"section-space-small": "32px",
|
|
4544
|
+
"section-space-medium": "64px",
|
|
4545
|
+
"section-space-large": "96px",
|
|
4546
|
+
"section-space-xlarge": "144px",
|
|
4547
|
+
"section-space-nav-overlap": "-72px",
|
|
4548
|
+
"space-none": "0px",
|
|
4549
|
+
"space-s": "8px",
|
|
4550
|
+
"space-m": "16px",
|
|
4551
|
+
"space-l": "32px",
|
|
4552
|
+
"space-xl": "64px",
|
|
4553
|
+
};
|
|
4554
|
+
|
|
4555
|
+
function styleSpaceToken(token: unknown): string {
|
|
4556
|
+
const px = typeof token === "string" ? STYLE_SPACE_TOKEN_PX[token] : undefined;
|
|
4557
|
+
return px ? "var(--bcms-" + token + "," + px + ")" : "";
|
|
4558
|
+
}
|
|
4559
|
+
|
|
4560
|
+
/** The declarations as a React-style object (camelCase), or undefined when there are none. */
|
|
4561
|
+
export function bcmsSectionStyle(style: unknown): Record<string, string | number> | undefined {
|
|
4562
|
+
if (!style || typeof style !== "object") return undefined;
|
|
4563
|
+
const s = style as Record<string, string>;
|
|
4564
|
+
const css: Record<string, string | number> = {};
|
|
4565
|
+
if (s.paddingY && STYLE_SPACE_PX[s.paddingY] != null) { css.paddingTop = STYLE_SPACE_PX[s.paddingY]!; css.paddingBottom = STYLE_SPACE_PX[s.paddingY]!; }
|
|
4566
|
+
if (s.paddingX && STYLE_SPACE_PX[s.paddingX] != null) { css.paddingLeft = STYLE_SPACE_PX[s.paddingX]!; css.paddingRight = STYLE_SPACE_PX[s.paddingX]!; }
|
|
4567
|
+
const top = styleSpaceToken(s.spaceTop);
|
|
4568
|
+
// A negative band that pulls content under the nav makes sense at the TOP only (SPACE_BOTTOM_TOKENS).
|
|
4569
|
+
const bottom = /^section-space-(none|small|medium|large|xlarge)$/.test(String(s.spaceBottom)) ? styleSpaceToken(s.spaceBottom) : "";
|
|
4570
|
+
const sides = styleSpaceToken(s.spaceSides);
|
|
4571
|
+
const navOverlap = s.spaceTop === "section-space-nav-overlap";
|
|
4572
|
+
if (top && !navOverlap) css.paddingTop = top;
|
|
4573
|
+
if (bottom) css.paddingBottom = bottom;
|
|
4574
|
+
if (sides) { css.paddingLeft = sides; css.paddingRight = sides; }
|
|
4575
|
+
if (s.marginTop && STYLE_SPACE_PX[s.marginTop] != null) css.marginTop = STYLE_SPACE_PX[s.marginTop]!;
|
|
4576
|
+
if (top && navOverlap) { css.marginTop = top; css.paddingTop = "calc(-1 * " + top + ")"; }
|
|
4577
|
+
if (s.marginBottom && STYLE_SPACE_PX[s.marginBottom] != null) css.marginBottom = STYLE_SPACE_PX[s.marginBottom]!;
|
|
4578
|
+
if (s.background && STYLE_COLOR_HEX[s.background]) css.background = STYLE_COLOR_HEX[s.background]!;
|
|
4579
|
+
if (s.textColor && STYLE_COLOR_HEX[s.textColor]) css.color = STYLE_COLOR_HEX[s.textColor]!;
|
|
4580
|
+
if (s.align === "left" || s.align === "center" || s.align === "right") css.textAlign = s.align;
|
|
4581
|
+
if (s.fontSize && STYLE_FONT_SIZE_REM[s.fontSize]) css.fontSize = STYLE_FONT_SIZE_REM[s.fontSize]!;
|
|
4582
|
+
if (s.weight && STYLE_WEIGHT[s.weight] != null) css.fontWeight = STYLE_WEIGHT[s.weight]!;
|
|
4583
|
+
if (s.radius && STYLE_RADIUS_PX[s.radius] != null) css.borderRadius = STYLE_RADIUS_PX[s.radius]!;
|
|
4584
|
+
if ((style as { border?: unknown }).border === true) css.border = "1px solid currentColor";
|
|
4585
|
+
return Object.keys(css).length ? css : undefined;
|
|
4586
|
+
}
|
|
4587
|
+
|
|
4588
|
+
/** The same declarations as an Astro \`style\` string (kebab-case, \`;\`-joined), or undefined. */
|
|
4589
|
+
export function bcmsSectionStyleText(style: unknown): string | undefined {
|
|
4590
|
+
const css = bcmsSectionStyle(style);
|
|
4591
|
+
if (!css) return undefined;
|
|
4592
|
+
return Object.entries(css)
|
|
4593
|
+
.map(([k, v]) => k.replace(/[A-Z]/g, (m) => "-" + m.toLowerCase()) + ":" + v)
|
|
4594
|
+
.join(";");
|
|
4595
|
+
}
|
|
4517
4596
|
`;
|
|
4518
4597
|
}
|
|
4519
4598
|
var HISTORICAL = {
|
|
@@ -4525,7 +4604,8 @@ var HISTORICAL = {
|
|
|
4525
4604
|
5: "0472fe3ffdcfa49e719c7b9da9cb63b6eba637cc22783bb00c3c2cadd3d800da",
|
|
4526
4605
|
6: "c907e7245578d947c6541b1ab2c5c6659ea7789a1519e895b4a4aed122c6f649",
|
|
4527
4606
|
7: "f22514ef48c50230985e605bea6cf9bf41756384a7dc80603e347baba9b65d93",
|
|
4528
|
-
8: "484e72852d2b496e016a1f2a2b1a77bb993f8a163b290781522d6114b6519bb9"
|
|
4607
|
+
8: "484e72852d2b496e016a1f2a2b1a77bb993f8a163b290781522d6114b6519bb9",
|
|
4608
|
+
9: "d6441db2ff4578c3c5d4b7d461f3374b89247ef6ba9e0d535791e840d803e4f3"
|
|
4529
4609
|
},
|
|
4530
4610
|
"src/lib/bcms-content.ts": {
|
|
4531
4611
|
1: "ae72ae14d706943d481c880d70da5789b4816ba1ba319a10fbc63ded4d0b42f2",
|
|
@@ -4535,7 +4615,8 @@ var HISTORICAL = {
|
|
|
4535
4615
|
5: "c8c93655320fa65664611ba84541f3fa7bfa292cc9a2fd655373440b99049fba",
|
|
4536
4616
|
6: "63f1fa29e47e70c5193b81ee24addb238ba100247124d55bc17713102d587df5",
|
|
4537
4617
|
7: "ed92fb88de953d9951abbe6a1edae1d048f4050eaf6fb607ac08167f94d8bcc7",
|
|
4538
|
-
8: "1a6f669d76d42effe77f082436e9d21c0efa6fc499e919e3d116bc3a27a7f3d5"
|
|
4618
|
+
8: "1a6f669d76d42effe77f082436e9d21c0efa6fc499e919e3d116bc3a27a7f3d5",
|
|
4619
|
+
9: "eee9fb1635ae7d6f8f33676a1f390600ca24a62ee992775252273c73a011c494"
|
|
4539
4620
|
},
|
|
4540
4621
|
"composables/bcms-content.ts": {
|
|
4541
4622
|
1: "c272412532efed7db64b6cf313b2bed4291f9951430412289c8a588b7f565407",
|
|
@@ -4545,7 +4626,8 @@ var HISTORICAL = {
|
|
|
4545
4626
|
5: "0472fe3ffdcfa49e719c7b9da9cb63b6eba637cc22783bb00c3c2cadd3d800da",
|
|
4546
4627
|
6: "c907e7245578d947c6541b1ab2c5c6659ea7789a1519e895b4a4aed122c6f649",
|
|
4547
4628
|
7: "f22514ef48c50230985e605bea6cf9bf41756384a7dc80603e347baba9b65d93",
|
|
4548
|
-
8: "484e72852d2b496e016a1f2a2b1a77bb993f8a163b290781522d6114b6519bb9"
|
|
4629
|
+
8: "484e72852d2b496e016a1f2a2b1a77bb993f8a163b290781522d6114b6519bb9",
|
|
4630
|
+
9: "d6441db2ff4578c3c5d4b7d461f3374b89247ef6ba9e0d535791e840d803e4f3"
|
|
4549
4631
|
}
|
|
4550
4632
|
};
|
|
4551
4633
|
var sha256 = (value) => createHash2("sha256").update(value, "utf8").digest("hex");
|
|
@@ -7100,7 +7182,7 @@ var CONTEXT_TAGS = /* @__PURE__ */ new Set([
|
|
|
7100
7182
|
var BOUND_ATTRS = ["data-bcms-field", "data-bcms-layout-field"];
|
|
7101
7183
|
var isDecorativeGlyph = (text) => {
|
|
7102
7184
|
const t = flat2(text);
|
|
7103
|
-
return t === "" || !/[\p{L}\p{N}]/u.test(t) || new RegExp("
|
|
7185
|
+
return t === "" || !/[\p{L}\p{N}]/u.test(t) || new RegExp("^(?:0\\p{Nd}|\\p{Nd}{1,2}\\s*[/.)\\-\u2013\u2014])$", "u").test(t);
|
|
7104
7186
|
};
|
|
7105
7187
|
var PLATFORM_BADGE = /^made with\b/iu;
|
|
7106
7188
|
var MAX_BUCKETS = 12;
|
|
@@ -8303,7 +8385,9 @@ function componentFile(dialect, path, fromFile, content, parsed, resolved, pathP
|
|
|
8303
8385
|
]);
|
|
8304
8386
|
const fieldsName = introduced.get("bcmsFields");
|
|
8305
8387
|
const fieldName = introduced.get("bcmsField");
|
|
8306
|
-
const
|
|
8388
|
+
const styleReader = dialect === "astro" ? "bcmsSectionStyleText" : "bcmsSectionStyle";
|
|
8389
|
+
const styled = rootStyleIsFree(content, resolved.root) && !reserved.has("blockStyle") && !reserved.has(styleReader);
|
|
8390
|
+
const { markup, bound, duplicates } = sectionMarkup(content, resolved.root, fieldName, styled ? styleReader : null);
|
|
8307
8391
|
if (duplicates.length > 0) return { content: "", free: [], duplicates, unconvertible: [] };
|
|
8308
8392
|
const groupKey = resolved.section.groupKey;
|
|
8309
8393
|
const locals = helperLocals(parsed, dialect, fromFile);
|
|
@@ -8314,7 +8398,8 @@ function componentFile(dialect, path, fromFile, content, parsed, resolved, pathP
|
|
|
8314
8398
|
.../* @__PURE__ */ new Set([
|
|
8315
8399
|
...helperNames.map((h) => alias(h.name, h.local)),
|
|
8316
8400
|
flat3 ? "bcmsSectionPaths" : "bcmsSection",
|
|
8317
|
-
...bound > 0 ? [alias("bcmsFields", fieldsName)] : []
|
|
8401
|
+
...bound > 0 ? [alias("bcmsFields", fieldsName)] : [],
|
|
8402
|
+
...styled ? [styleReader] : []
|
|
8318
8403
|
])
|
|
8319
8404
|
].sort();
|
|
8320
8405
|
const helperSpecifier = relativeImport(path, HELPER_PATH[dialect]).replace(/\.tsx?$/, "");
|
|
@@ -8363,9 +8448,11 @@ interface Props {
|
|
|
8363
8448
|
/** The instance's own copy, when an editor gave it any. Wins over the bound group. */
|
|
8364
8449
|
overrides?: Record<string, unknown>;
|
|
8365
8450
|
/** The page snapshot, so one component can serve every page whose group has this shape. */
|
|
8366
|
-
page?: unknown
|
|
8451
|
+
page?: unknown;${styled ? `
|
|
8452
|
+
/** The placement's \`block.style\` \u2014 painted on the root, which says so with \`data-bcms-style\`. */
|
|
8453
|
+
blockStyle?: Record<string, unknown>;` : ""}
|
|
8367
8454
|
}
|
|
8368
|
-
const { blockId, bind, bindPaths, overrides, page } = Astro.props;
|
|
8455
|
+
const { blockId, bind, bindPaths, overrides, page${styled ? ", blockStyle" : ""} } = Astro.props;
|
|
8369
8456
|
${carriedDeclarations}${declared}
|
|
8370
8457
|
---
|
|
8371
8458
|
${markup}
|
|
@@ -8377,7 +8464,7 @@ ${styles}
|
|
|
8377
8464
|
${[...carried, `import { ${helpers.join(", ")} } from "${helperSpecifier}";`, `import type { BcmsSectionProps } from "${relativeImport(path, SECTIONS_LIB).replace(/\.tsx?$/, "")}";`].join("\n")}
|
|
8378
8465
|
${carriedDeclarations === "" ? "" : `
|
|
8379
8466
|
${carriedDeclarations}`}
|
|
8380
|
-
export default function ${resolved.name}({ blockId, bind, bindPaths, overrides, page }: BcmsSectionProps) {
|
|
8467
|
+
export default function ${resolved.name}({ blockId, bind, bindPaths, overrides, page${styled ? ", blockStyle" : ""} }: BcmsSectionProps) {
|
|
8381
8468
|
${declared.split("\n").join("\n ")}
|
|
8382
8469
|
return (
|
|
8383
8470
|
${markup}
|
|
@@ -8385,13 +8472,21 @@ export default function ${resolved.name}({ blockId, bind, bindPaths, overrides,
|
|
|
8385
8472
|
}
|
|
8386
8473
|
` };
|
|
8387
8474
|
}
|
|
8388
|
-
function
|
|
8475
|
+
function rootStyleIsFree(content, root) {
|
|
8476
|
+
return root.attrs.every((attr) => {
|
|
8477
|
+
if (attr.name === "style") return false;
|
|
8478
|
+
const open = attr.expressionRange ? content.slice(attr.expressionRange.start, attr.expressionRange.end).trimStart() : "";
|
|
8479
|
+
return !open.startsWith("{...");
|
|
8480
|
+
});
|
|
8481
|
+
}
|
|
8482
|
+
function sectionMarkup(content, root, fieldName, styleReader = null) {
|
|
8389
8483
|
const slice = new MagicString5(content.slice(root.start, root.end));
|
|
8390
8484
|
const at = (offset) => offset - root.start;
|
|
8485
|
+
const stamp = styleReader ? `data-bcms-block={blockId} data-bcms-style="" style={${styleReader}(blockStyle)}` : "data-bcms-block={blockId}";
|
|
8391
8486
|
const stamps = root.attrs.filter((attr) => attr.name === "data-bcms-block");
|
|
8392
|
-
if (stamps.length === 0) slice.appendLeft(at(root.attrInsertAt),
|
|
8487
|
+
if (stamps.length === 0) slice.appendLeft(at(root.attrInsertAt), ` ${stamp}`);
|
|
8393
8488
|
else {
|
|
8394
|
-
slice.overwrite(at(stamps[0].range.start), at(stamps[0].range.end),
|
|
8489
|
+
slice.overwrite(at(stamps[0].range.start), at(stamps[0].range.end), stamp);
|
|
8395
8490
|
for (const extra of stamps.slice(1)) {
|
|
8396
8491
|
let from = extra.range.start;
|
|
8397
8492
|
while (from > root.start && /\s/.test(content[from - 1])) from--;
|
|
@@ -8742,6 +8837,8 @@ export interface BcmsSectionProps {
|
|
|
8742
8837
|
bindPaths?: Record<string, string>;
|
|
8743
8838
|
overrides?: Record<string, unknown>;
|
|
8744
8839
|
page?: unknown;
|
|
8840
|
+
/** The placement's \`block.style\`, which the section root paints (\`data-bcms-style\`). */
|
|
8841
|
+
blockStyle?: Record<string, unknown>;
|
|
8745
8842
|
}
|
|
8746
8843
|
|
|
8747
8844
|
/** One placement on one page: which component, bound to which page field group. */
|
|
@@ -8752,6 +8849,8 @@ export interface BcmsPlacement {
|
|
|
8752
8849
|
/** A locale copy's own field path for each prop, when its keys differ from the component's. */
|
|
8753
8850
|
bindPaths?: Record<string, string>;
|
|
8754
8851
|
overrides?: Record<string, unknown>;
|
|
8852
|
+
/** The placement's \`block.style\` \u2014 what the editor's section spacing and style controls write. */
|
|
8853
|
+
style?: Record<string, unknown>;
|
|
8755
8854
|
}
|
|
8756
8855
|
|
|
8757
8856
|
/** The page's own snapshot \u2014 the copy every placement on it reads through \`bind\`. */
|
|
@@ -8813,6 +8912,7 @@ export function pageSections(pageSlug: string): BcmsPlacement[] {
|
|
|
8813
8912
|
bind: typeof props.bind === "string" ? props.bind : undefined,
|
|
8814
8913
|
bindPaths: isRecord(props.bindPaths) ? (props.bindPaths as Record<string, string>) : undefined,
|
|
8815
8914
|
overrides: isRecord(props.overrides) ? props.overrides : undefined,
|
|
8915
|
+
style: isRecord(block.style) ? block.style : undefined,
|
|
8816
8916
|
});
|
|
8817
8917
|
}
|
|
8818
8918
|
return out;
|
|
@@ -8879,6 +8979,7 @@ const snapshot = pageSnapshot(page);
|
|
|
8879
8979
|
bind={placement.bind}
|
|
8880
8980
|
bindPaths={placement.bindPaths}
|
|
8881
8981
|
overrides={placement.overrides}
|
|
8982
|
+
blockStyle={placement.style}
|
|
8882
8983
|
page={snapshot}
|
|
8883
8984
|
/>
|
|
8884
8985
|
) : null;
|
|
@@ -8902,6 +9003,7 @@ export default function Sections({ page }: { page: string }) {
|
|
|
8902
9003
|
bind={placement.bind}
|
|
8903
9004
|
bindPaths={placement.bindPaths}
|
|
8904
9005
|
overrides={placement.overrides}
|
|
9006
|
+
blockStyle={placement.style}
|
|
8905
9007
|
page={snapshot}
|
|
8906
9008
|
/>
|
|
8907
9009
|
) : null;
|
|
@@ -10176,7 +10278,7 @@ function styleEdits(before, after) {
|
|
|
10176
10278
|
// package.json
|
|
10177
10279
|
var package_default = {
|
|
10178
10280
|
name: "@bettercms-ai/convert",
|
|
10179
|
-
version: "0.
|
|
10281
|
+
version: "0.21.0",
|
|
10180
10282
|
type: "module",
|
|
10181
10283
|
description: "Deterministic codemod that turns an imported site's text-matched bindings into declared ones \u2014 parser offsets in, one magic-string pass out, plus a receipt of everything it could not do.",
|
|
10182
10284
|
bin: {
|
|
@@ -10209,7 +10311,7 @@ var package_default = {
|
|
|
10209
10311
|
dependencies: {
|
|
10210
10312
|
"@astrojs/compiler": "^2.13.1",
|
|
10211
10313
|
"@babel/parser": "^7.29.2",
|
|
10212
|
-
"@bettercms-ai/types": "^1.
|
|
10314
|
+
"@bettercms-ai/types": "^1.29.0",
|
|
10213
10315
|
"@vue/compiler-sfc": "^3.5.0",
|
|
10214
10316
|
"magic-string": "^0.30.21",
|
|
10215
10317
|
parse5: "^7.3.0",
|