@superdoc-dev/cli 0.4.0-next.2 → 0.4.0-next.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 (2) hide show
  1. package/dist/index.js +206 -40
  2. package/package.json +8 -8
package/dist/index.js CHANGED
@@ -41059,7 +41059,7 @@ var init_remark_gfm_z_sDF4ss_es = __esm(() => {
41059
41059
  emptyOptions2 = {};
41060
41060
  });
41061
41061
 
41062
- // ../../packages/superdoc/dist/chunks/SuperConverter-V-8WDjnK.es.js
41062
+ // ../../packages/superdoc/dist/chunks/SuperConverter-BMUaGImr.es.js
41063
41063
  function getExtensionConfigField(extension$1, field, context = { name: "" }) {
41064
41064
  const fieldValue = extension$1.config[field];
41065
41065
  if (typeof fieldValue === "function")
@@ -50688,6 +50688,18 @@ function buildPath(existingPath = [], node3, branch) {
50688
50688
  path2.push(branch);
50689
50689
  return path2;
50690
50690
  }
50691
+ function isInlineNode(node3, schema) {
50692
+ if (!node3 || typeof node3 !== "object" || typeof node3.type !== "string")
50693
+ return false;
50694
+ const nodeType = schema?.nodes?.[node3.type];
50695
+ if (nodeType) {
50696
+ if (typeof nodeType.isInline === "boolean")
50697
+ return nodeType.isInline;
50698
+ if (nodeType.spec?.group && typeof nodeType.spec.group === "string")
50699
+ return nodeType.spec.group.split(" ").includes("inline");
50700
+ }
50701
+ return INLINE_FALLBACK_TYPES.has(node3.type);
50702
+ }
50691
50703
  function getTableStyleId(path2) {
50692
50704
  const tbl = path2.find((ancestor) => ancestor.name === "w:tbl");
50693
50705
  if (!tbl)
@@ -50700,6 +50712,76 @@ function getTableStyleId(path2) {
50700
50712
  return;
50701
50713
  return tblStyle.attributes?.["w:val"];
50702
50714
  }
50715
+ function cloneParagraphAttrsForFragment(attrs, { keepSectPr = false } = {}) {
50716
+ if (!attrs)
50717
+ return {};
50718
+ const nextAttrs = { ...attrs };
50719
+ if (attrs.paragraphProperties && typeof attrs.paragraphProperties === "object") {
50720
+ nextAttrs.paragraphProperties = { ...attrs.paragraphProperties };
50721
+ if (!keepSectPr)
50722
+ delete nextAttrs.paragraphProperties.sectPr;
50723
+ }
50724
+ if (!keepSectPr)
50725
+ delete nextAttrs.pageBreakSource;
50726
+ return nextAttrs;
50727
+ }
50728
+ function hasSectionBreakAttrs(attrs) {
50729
+ return Boolean(attrs?.paragraphProperties?.sectPr);
50730
+ }
50731
+ function cloneWrapperParagraphAttrs(attrs) {
50732
+ return cloneParagraphAttrsForFragment(attrs, { keepSectPr: true });
50733
+ }
50734
+ function normalizeParagraphChildren(children, schema, textblockAttrs) {
50735
+ const normalized = [];
50736
+ let pendingInline = [];
50737
+ const flushInline = () => {
50738
+ if (!pendingInline.length)
50739
+ return;
50740
+ normalized.push({
50741
+ type: "paragraph",
50742
+ attrs: null,
50743
+ content: pendingInline,
50744
+ marks: []
50745
+ });
50746
+ pendingInline = [];
50747
+ };
50748
+ for (const child of children || []) {
50749
+ if (isInlineNode(child, schema)) {
50750
+ pendingInline.push(child);
50751
+ continue;
50752
+ }
50753
+ flushInline();
50754
+ if (child != null)
50755
+ normalized.push(child);
50756
+ }
50757
+ flushInline();
50758
+ const lastNodeIndex = normalized.length - 1;
50759
+ const isSingleBlockResult = normalized.length === 1 && normalized[0] != null && normalized[0]?.type !== "paragraph";
50760
+ const paragraphIndexes = normalized.reduce((indexes, node3, index2) => {
50761
+ if (node3?.type === "paragraph")
50762
+ indexes.push(index2);
50763
+ return indexes;
50764
+ }, []);
50765
+ const lastParagraphIndex = paragraphIndexes.length ? paragraphIndexes[paragraphIndexes.length - 1] : -1;
50766
+ const shouldAttachWrapperParagraph = isSingleBlockResult || hasSectionBreakAttrs(textblockAttrs) && lastNodeIndex !== lastParagraphIndex;
50767
+ paragraphIndexes.forEach((index2) => {
50768
+ normalized[index2] = {
50769
+ ...normalized[index2],
50770
+ attrs: cloneParagraphAttrsForFragment(textblockAttrs, { keepSectPr: !shouldAttachWrapperParagraph && index2 === lastParagraphIndex })
50771
+ };
50772
+ });
50773
+ if (shouldAttachWrapperParagraph) {
50774
+ const lastNode = normalized[lastNodeIndex];
50775
+ normalized[lastNodeIndex] = {
50776
+ ...lastNode,
50777
+ attrs: {
50778
+ ...lastNode?.attrs || {},
50779
+ wrapperParagraph: cloneWrapperParagraphAttrs(textblockAttrs)
50780
+ }
50781
+ };
50782
+ }
50783
+ return normalized;
50784
+ }
50703
50785
  function generateParagraphProperties(params) {
50704
50786
  const { node: node3 } = params;
50705
50787
  const { attrs = {} } = node3;
@@ -50784,6 +50866,21 @@ function translateParagraphNode(params) {
50784
50866
  attributes
50785
50867
  };
50786
50868
  }
50869
+ function partitionEncodedParagraphAttrs(encodedAttrs = {}) {
50870
+ const identityAttrs = {};
50871
+ const shareableAttrs = {};
50872
+ Object.entries(encodedAttrs).forEach(([key, value]) => {
50873
+ if (IDENTITY_ATTR_NAMES.has(key)) {
50874
+ identityAttrs[key] = value;
50875
+ return;
50876
+ }
50877
+ shareableAttrs[key] = value;
50878
+ });
50879
+ return {
50880
+ identityAttrs,
50881
+ shareableAttrs
50882
+ };
50883
+ }
50787
50884
  function generateDocxRandomId(length = 8) {
50788
50885
  return Math.floor(Math.random() * 2147483648).toString(16).toUpperCase().padStart(length, "0").slice(0, length);
50789
50886
  }
@@ -50934,7 +51031,6 @@ function normalizeTableCellContent(content$2, editor) {
50934
51031
  return content$2;
50935
51032
  const normalized = [];
50936
51033
  const pendingForNextBlock = [];
50937
- const schema = editor?.schema;
50938
51034
  const cloneBlock = (node3) => {
50939
51035
  if (!node3)
50940
51036
  return node3;
@@ -50949,28 +51045,12 @@ function normalizeTableCellContent(content$2, editor) {
50949
51045
  node3.content = [];
50950
51046
  return node3.content;
50951
51047
  };
50952
- const isInlineNode = (node3) => {
50953
- if (!node3 || typeof node3.type !== "string")
50954
- return false;
50955
- if (node3.type === "text")
50956
- return true;
50957
- if (node3.type === "bookmarkStart" || node3.type === "bookmarkEnd")
50958
- return true;
50959
- const nodeType = schema?.nodes?.[node3.type];
50960
- if (nodeType) {
50961
- if (typeof nodeType.isInline === "boolean")
50962
- return nodeType.isInline;
50963
- if (nodeType.spec?.group && typeof nodeType.spec.group === "string")
50964
- return nodeType.spec.group.split(" ").includes("inline");
50965
- }
50966
- return false;
50967
- };
50968
51048
  for (const node3 of content$2) {
50969
51049
  if (!node3 || typeof node3.type !== "string") {
50970
51050
  normalized.push(node3);
50971
51051
  continue;
50972
51052
  }
50973
- if (!isInlineNode(node3)) {
51053
+ if (!isInlineNode(node3, editor?.schema)) {
50974
51054
  const blockNode = cloneBlock(node3);
50975
51055
  if (pendingForNextBlock.length) {
50976
51056
  const blockContent = ensureArray(blockNode);
@@ -50984,7 +51064,7 @@ function normalizeTableCellContent(content$2, editor) {
50984
51064
  pendingForNextBlock.push(node3);
50985
51065
  else {
50986
51066
  const lastNode = normalized[normalized.length - 1];
50987
- if (!lastNode || typeof lastNode.type !== "string" || isInlineNode(lastNode)) {
51067
+ if (!lastNode || typeof lastNode.type !== "string" || isInlineNode(lastNode, editor?.schema)) {
50988
51068
  pendingForNextBlock.push(node3);
50989
51069
  continue;
50990
51070
  }
@@ -50997,7 +51077,7 @@ function normalizeTableCellContent(content$2, editor) {
50997
51077
  if (pendingForNextBlock.length) {
50998
51078
  if (normalized.length) {
50999
51079
  const lastNode = normalized[normalized.length - 1];
51000
- if (lastNode && typeof lastNode.type === "string" && !isInlineNode(lastNode)) {
51080
+ if (lastNode && typeof lastNode.type === "string" && !isInlineNode(lastNode, editor?.schema)) {
51001
51081
  ensureArray(lastNode).push(...pendingForNextBlock);
51002
51082
  pendingForNextBlock.length = 0;
51003
51083
  }
@@ -66848,13 +66928,38 @@ function translateDocumentPartObj(params) {
66848
66928
  ...params,
66849
66929
  nodes: node3.content
66850
66930
  });
66851
- return {
66931
+ const result = {
66852
66932
  name: "w:sdt",
66853
66933
  elements: [generateSdtPrForDocPartObj(attrs), {
66854
66934
  name: "w:sdtContent",
66855
66935
  elements: childContent
66856
66936
  }]
66857
66937
  };
66938
+ if (!attrs.wrapperParagraph)
66939
+ return result;
66940
+ return wrapDocumentPartInParagraph(result, attrs.wrapperParagraph);
66941
+ }
66942
+ function wrapDocumentPartInParagraph(sdtNode, wrapperParagraphAttrs) {
66943
+ const elements = [];
66944
+ const pPr = generateParagraphProperties({ node: {
66945
+ type: "paragraph",
66946
+ attrs: wrapperParagraphAttrs
66947
+ } });
66948
+ if (pPr)
66949
+ elements.push(pPr);
66950
+ elements.push(sdtNode);
66951
+ const attributes = {
66952
+ ...extractRawParagraphXmlAttributes(wrapperParagraphAttrs),
66953
+ ...translator.decodeAttributes({ node: { attrs: wrapperParagraphAttrs } })
66954
+ };
66955
+ return {
66956
+ name: "w:p",
66957
+ elements,
66958
+ ...Object.keys(attributes).length ? { attributes } : {}
66959
+ };
66960
+ }
66961
+ function extractRawParagraphXmlAttributes(attrs = {}) {
66962
+ return Object.fromEntries(Object.entries(attrs).filter(([key]) => key.includes(":")));
66858
66963
  }
66859
66964
  function sanitizeId(id) {
66860
66965
  if (typeof id === "string" && id.trim() !== "")
@@ -77195,8 +77300,8 @@ var isRegExp = (value) => {
77195
77300
  }
77196
77301
  }
77197
77302
  return css;
77198
- }, SUPPORTED_ALTERNATE_CONTENT_REQUIRES, XML_NODE_NAME$36 = "mc:AlternateContent", SD_NODE_NAME$32, validXmlAttributes$12, config$35, translator$31, translator$37, translator$39, translator$40, translator$208, translator$51, translator$54, translator$57, translator$65, translator$80, translator$85, translator$86, translator$87, translator$89, translator$102, translator$78, translator$111, propertyTranslators$16, translator$113, translator$118, translator$119, translator$45, translator$209, translator$48, translator$201, translator$103, translator$203, translator$133, translator$204, translator$169, translator$206, propertyTranslators$15, translator$121, translator$127, translator$120, translator$144, translator$145, translator$146, translator$147, propertyTranslators$14, translator$151, translator$190, translator$183, translator$191, translator$192, translator$195, translator$196, propertyTranslators$13, translator$126, handleParagraphNode$1 = (params) => {
77199
- const { nodes, nodeListHandler, filename } = params;
77303
+ }, SUPPORTED_ALTERNATE_CONTENT_REQUIRES, XML_NODE_NAME$36 = "mc:AlternateContent", SD_NODE_NAME$32, validXmlAttributes$12, config$35, translator$31, translator$37, translator$39, translator$40, translator$208, translator$51, translator$54, translator$57, translator$65, translator$80, translator$85, translator$86, translator$87, translator$89, translator$102, translator$78, translator$111, propertyTranslators$16, translator$113, translator$118, translator$119, translator$45, translator$209, translator$48, translator$201, translator$103, translator$203, translator$133, translator$204, translator$169, translator$206, propertyTranslators$15, translator$121, translator$127, translator$120, translator$144, translator$145, translator$146, translator$147, propertyTranslators$14, translator$151, translator$190, translator$183, translator$191, translator$192, translator$195, translator$196, propertyTranslators$13, translator$126, INLINE_FALLBACK_TYPES, handleParagraphNode$1 = (params) => {
77304
+ const { nodes, nodeListHandler, filename, editor } = params;
77200
77305
  const node3 = carbonCopy(nodes[0]);
77201
77306
  let schemaNode;
77202
77307
  const pPr = node3.elements?.find((el) => el.name === "w:pPr");
@@ -77240,17 +77345,27 @@ var isRegExp = (value) => {
77240
77345
  schemaNode.attrs.paragraphProperties = inlineParagraphProperties;
77241
77346
  schemaNode.attrs.rsidRDefault = node3.attributes?.["w:rsidRDefault"];
77242
77347
  schemaNode.attrs.filename = filename;
77243
- if (schemaNode && schemaNode.content)
77244
- schemaNode = {
77245
- ...schemaNode,
77246
- content: mergeTextNodes(schemaNode.content)
77247
- };
77248
77348
  const sectPr = pPr?.elements?.find((el) => el.name === "w:sectPr");
77249
77349
  if (sectPr) {
77250
77350
  schemaNode.attrs.paragraphProperties.sectPr = sectPr;
77251
77351
  schemaNode.attrs.pageBreakSource = "sectPr";
77252
77352
  }
77253
- return schemaNode;
77353
+ const normalizedNodes = normalizeParagraphChildren(schemaNode.content, editor?.schema, schemaNode.attrs).map((node$1) => {
77354
+ if (node$1?.type !== "paragraph" || !Array.isArray(node$1.content))
77355
+ return node$1;
77356
+ return {
77357
+ ...node$1,
77358
+ content: mergeTextNodes(node$1.content)
77359
+ };
77360
+ });
77361
+ if (!normalizedNodes.length)
77362
+ return {
77363
+ ...schemaNode,
77364
+ content: mergeTextNodes(schemaNode.content || [])
77365
+ };
77366
+ if (normalizedNodes.length === 1 && normalizedNodes[0]?.type === "paragraph")
77367
+ return normalizedNodes[0];
77368
+ return normalizedNodes;
77254
77369
  }, encode$62 = (attributes) => {
77255
77370
  return attributes["w:rsidDel"];
77256
77371
  }, decode$64 = (attrs) => {
@@ -77279,15 +77394,36 @@ var isRegExp = (value) => {
77279
77394
  return attributes["w14:textId"];
77280
77395
  }, decode$58 = (attrs) => {
77281
77396
  return attrs.textId;
77282
- }, attributes_default$5, XML_NODE_NAME$35 = "w:p", SD_NODE_NAME$31 = "paragraph", encode$55 = (params, encodedAttrs = {}) => {
77397
+ }, attributes_default$5, XML_NODE_NAME$35 = "w:p", SD_NODE_NAME$31 = "paragraph", IDENTITY_ATTR_NAMES, encode$55 = (params, encodedAttrs = {}) => {
77283
77398
  const node3 = handleParagraphNode$1(params);
77284
77399
  if (!node3)
77285
77400
  return;
77286
- if (encodedAttrs && Object.keys(encodedAttrs).length)
77401
+ if (encodedAttrs && Object.keys(encodedAttrs).length) {
77402
+ if (Array.isArray(node3)) {
77403
+ const { identityAttrs, shareableAttrs } = partitionEncodedParagraphAttrs(encodedAttrs);
77404
+ let appliedIdentityAttrs = false;
77405
+ return node3.map((child) => {
77406
+ if (child?.type !== "paragraph")
77407
+ return child;
77408
+ const attrs = {
77409
+ ...child.attrs || {},
77410
+ ...shareableAttrs
77411
+ };
77412
+ if (!appliedIdentityAttrs) {
77413
+ Object.assign(attrs, identityAttrs);
77414
+ appliedIdentityAttrs = true;
77415
+ }
77416
+ return {
77417
+ ...child,
77418
+ attrs
77419
+ };
77420
+ });
77421
+ }
77287
77422
  node3.attrs = {
77288
77423
  ...node3.attrs,
77289
77424
  ...encodedAttrs
77290
77425
  };
77426
+ }
77291
77427
  return node3;
77292
77428
  }, decode$57 = (params, decodedAttrs = {}) => {
77293
77429
  const translated = translateParagraphNode(params);
@@ -88989,7 +89125,7 @@ var isRegExp = (value) => {
88989
89125
  };
88990
89126
  const schemaNode = translator.encode(params);
88991
89127
  return {
88992
- nodes: schemaNode ? [schemaNode] : [],
89128
+ nodes: Array.isArray(schemaNode) ? schemaNode : schemaNode ? [schemaNode] : [],
88993
89129
  consumed: 1
88994
89130
  };
88995
89131
  }, paragraphNodeHandlerEntity, handleSdtNode = (params) => {
@@ -91154,7 +91290,7 @@ var isRegExp = (value) => {
91154
91290
  state.kern = kernNode.attributes["w:val"];
91155
91291
  }
91156
91292
  }, SuperConverter;
91157
- var init_SuperConverter_V_8WDjnK_es = __esm(() => {
91293
+ var init_SuperConverter_BMUaGImr_es = __esm(() => {
91158
91294
  init_rolldown_runtime_B2q5OVn9_es();
91159
91295
  init_jszip_ChlR43oI_es();
91160
91296
  init_xml_js_DLE8mr0n_es();
@@ -106225,6 +106361,34 @@ var init_SuperConverter_V_8WDjnK_es = __esm(() => {
106225
106361
  translator$129
106226
106362
  ];
106227
106363
  translator$126 = NodeTranslator.from(createNestedPropertiesTranslator("w:pPr", "paragraphProperties", propertyTranslators$13));
106364
+ INLINE_FALLBACK_TYPES = new Set([
106365
+ "text",
106366
+ "run",
106367
+ "bookmarkStart",
106368
+ "bookmarkEnd",
106369
+ "tab",
106370
+ "lineBreak",
106371
+ "hardBreak",
106372
+ "commentRangeStart",
106373
+ "commentRangeEnd",
106374
+ "commentReference",
106375
+ "permStart",
106376
+ "permEnd",
106377
+ "footnoteReference",
106378
+ "endnoteReference",
106379
+ "fieldAnnotation",
106380
+ "structuredContent",
106381
+ "passthroughInline",
106382
+ "page-number",
106383
+ "total-page-number",
106384
+ "pageReference",
106385
+ "crossReference",
106386
+ "citation",
106387
+ "authorityEntry",
106388
+ "sequenceField",
106389
+ "indexEntry",
106390
+ "tableOfContentsEntry"
106391
+ ]);
106228
106392
  attrConfig$22 = Object.freeze({
106229
106393
  xmlName: "w:rsidDel",
106230
106394
  sdName: "rsidDel",
@@ -106275,6 +106439,7 @@ var init_SuperConverter_V_8WDjnK_es = __esm(() => {
106275
106439
  attrConfig$25,
106276
106440
  attrConfig$22
106277
106441
  ];
106442
+ IDENTITY_ATTR_NAMES = new Set(["paraId", "textId"]);
106278
106443
  config$34 = {
106279
106444
  xmlName: XML_NODE_NAME$35,
106280
106445
  sdNodeOrKeyName: SD_NODE_NAME$31,
@@ -154303,7 +154468,7 @@ var init_remark_gfm_CjV8kaUy_es = __esm(() => {
154303
154468
  init_remark_gfm_z_sDF4ss_es();
154304
154469
  });
154305
154470
 
154306
- // ../../packages/superdoc/dist/chunks/src-D3H7T1qq.es.js
154471
+ // ../../packages/superdoc/dist/chunks/src-BGYOfW0n.es.js
154307
154472
  function deleteProps(obj, propOrProps) {
154308
154473
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
154309
154474
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -233872,9 +234037,9 @@ var Node$13 = class Node$14 {
233872
234037
  return;
233873
234038
  console.log(...args$1);
233874
234039
  }, HEADER_FOOTER_INIT_BUDGET_MS = 200, MAX_ZOOM_WARNING_THRESHOLD = 10, MAX_SELECTION_RECTS_PER_USER = 100, SEMANTIC_RESIZE_DEBOUNCE_MS = 120, MIN_SEMANTIC_CONTENT_WIDTH_PX = 1, GLOBAL_PERFORMANCE, PresentationEditor, ICONS, TEXTS, tableActionsOptions;
233875
- var init_src_D3H7T1qq_es = __esm(() => {
234040
+ var init_src_BGYOfW0n_es = __esm(() => {
233876
234041
  init_rolldown_runtime_B2q5OVn9_es();
233877
- init_SuperConverter_V_8WDjnK_es();
234042
+ init_SuperConverter_BMUaGImr_es();
233878
234043
  init_jszip_ChlR43oI_es();
233879
234044
  init_uuid_qzgm05fK_es();
233880
234045
  init_constants_CMPtQbp7_es();
@@ -236368,7 +236533,8 @@ ${err.toString()}`);
236368
236533
  },
236369
236534
  id: {},
236370
236535
  docPartGallery: {},
236371
- docPartUnique: { default: true }
236536
+ docPartUnique: { default: false },
236537
+ wrapperParagraph: { default: null }
236372
236538
  };
236373
236539
  }
236374
236540
  });
@@ -267194,8 +267360,8 @@ var init_zipper_DqXT7uTa_es = __esm(() => {
267194
267360
 
267195
267361
  // ../../packages/superdoc/dist/super-editor.es.js
267196
267362
  var init_super_editor_es = __esm(() => {
267197
- init_src_D3H7T1qq_es();
267198
- init_SuperConverter_V_8WDjnK_es();
267363
+ init_src_BGYOfW0n_es();
267364
+ init_SuperConverter_BMUaGImr_es();
267199
267365
  init_jszip_ChlR43oI_es();
267200
267366
  init_xml_js_DLE8mr0n_es();
267201
267367
  init_constants_CMPtQbp7_es();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superdoc-dev/cli",
3
- "version": "0.4.0-next.2",
3
+ "version": "0.4.0-next.4",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "superdoc": "./dist/index.js"
@@ -22,19 +22,19 @@
22
22
  "typescript": "^5.9.2",
23
23
  "@superdoc/document-api": "0.0.1",
24
24
  "@superdoc/super-editor": "0.0.1",
25
- "@superdoc/pm-adapter": "0.0.0",
26
- "superdoc": "1.21.0"
25
+ "superdoc": "1.21.0",
26
+ "@superdoc/pm-adapter": "0.0.0"
27
27
  },
28
28
  "module": "src/index.ts",
29
29
  "publishConfig": {
30
30
  "access": "public"
31
31
  },
32
32
  "optionalDependencies": {
33
- "@superdoc-dev/cli-darwin-arm64": "0.4.0-next.2",
34
- "@superdoc-dev/cli-linux-x64": "0.4.0-next.2",
35
- "@superdoc-dev/cli-linux-arm64": "0.4.0-next.2",
36
- "@superdoc-dev/cli-darwin-x64": "0.4.0-next.2",
37
- "@superdoc-dev/cli-windows-x64": "0.4.0-next.2"
33
+ "@superdoc-dev/cli-darwin-x64": "0.4.0-next.4",
34
+ "@superdoc-dev/cli-darwin-arm64": "0.4.0-next.4",
35
+ "@superdoc-dev/cli-linux-x64": "0.4.0-next.4",
36
+ "@superdoc-dev/cli-linux-arm64": "0.4.0-next.4",
37
+ "@superdoc-dev/cli-windows-x64": "0.4.0-next.4"
38
38
  },
39
39
  "scripts": {
40
40
  "predev": "node scripts/ensure-superdoc-build.js",