@superdoc-dev/cli 0.8.0-next.60 → 0.8.0-next.61
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/dist/index.js +90 -37
- package/package.json +6 -6
package/dist/index.js
CHANGED
|
@@ -65823,7 +65823,7 @@ var init_remark_gfm_BhnWr3yf_es = __esm(() => {
|
|
|
65823
65823
|
emptyOptions2 = {};
|
|
65824
65824
|
});
|
|
65825
65825
|
|
|
65826
|
-
// ../../packages/superdoc/dist/chunks/SuperConverter-
|
|
65826
|
+
// ../../packages/superdoc/dist/chunks/SuperConverter-DFi0X147.es.js
|
|
65827
65827
|
function getExtensionConfigField(extension$1, field, context = { name: "" }) {
|
|
65828
65828
|
const fieldValue = extension$1.config[field];
|
|
65829
65829
|
if (typeof fieldValue === "function")
|
|
@@ -86555,8 +86555,8 @@ function rewriteImageSrcsInSliceJsonTree(node3, pathRemap) {
|
|
|
86555
86555
|
for (const child of content$2)
|
|
86556
86556
|
rewriteImageSrcsInSliceJsonTree(child, pathRemap);
|
|
86557
86557
|
}
|
|
86558
|
-
function applySuperdocClipboardMedia(editor, clipboardData, sliceJson = null) {
|
|
86559
|
-
const raw = clipboardData?.getData?.(
|
|
86558
|
+
function applySuperdocClipboardMedia(editor, clipboardData, sliceJson = null, mediaJson = "") {
|
|
86559
|
+
const raw = clipboardData?.getData?.("application/x-superdoc-media") || mediaJson;
|
|
86560
86560
|
if (!editor?.storage?.image || !raw || typeof raw !== "string")
|
|
86561
86561
|
return sliceJson;
|
|
86562
86562
|
let map5;
|
|
@@ -86635,10 +86635,12 @@ function bodySectPrShouldEmbed(bodySectPr) {
|
|
|
86635
86635
|
const cols = getSectPrColumns(bodySectPr);
|
|
86636
86636
|
return !!(cols?.count && cols.count > 1);
|
|
86637
86637
|
}
|
|
86638
|
-
function embedSliceInHtml(html2, sliceJson, bodySectPrJson = "") {
|
|
86638
|
+
function embedSliceInHtml(html2, sliceJson, bodySectPrJson = "", mediaJson = "") {
|
|
86639
86639
|
let out = html2;
|
|
86640
86640
|
if (bodySectPrJson)
|
|
86641
86641
|
out = `<div ${SUPERDOC_BODY_SECT_PR_ATTR} style="display:none">${encodeUtf8Base64(bodySectPrJson)}</div>${out}`;
|
|
86642
|
+
if (mediaJson)
|
|
86643
|
+
out = `<div ${SUPERDOC_MEDIA_ATTR} style="display:none">${encodeUtf8Base64(mediaJson)}</div>${out}`;
|
|
86642
86644
|
if (!sliceJson)
|
|
86643
86645
|
return out;
|
|
86644
86646
|
return `<div ${SUPERDOC_SLICE_ATTR} style="display:none">${encodeUtf8Base64(sliceJson)}</div>${out}`;
|
|
@@ -86670,8 +86672,27 @@ function stripSliceFromHtml(html2) {
|
|
|
86670
86672
|
out = out.replace(/<div[^>]*data-superdoc-slice[^>]*>[\s\S]*?<\/div>/gi, "");
|
|
86671
86673
|
if (out.includes("data-sd-body-sect-pr"))
|
|
86672
86674
|
out = out.replace(/<div[^>]*data-sd-body-sect-pr[^>]*>[\s\S]*?<\/div>/gi, "");
|
|
86675
|
+
if (out.includes("data-sd-superdoc-media"))
|
|
86676
|
+
out = out.replace(/<div[^>]*data-sd-superdoc-media[^>]*>[\s\S]*?<\/div>/gi, "");
|
|
86673
86677
|
return out;
|
|
86674
86678
|
}
|
|
86679
|
+
function extractMediaFromHtml(html2) {
|
|
86680
|
+
if (!html2 || !html2.includes("data-sd-superdoc-media"))
|
|
86681
|
+
return null;
|
|
86682
|
+
if (typeof DOMParser === "undefined")
|
|
86683
|
+
return null;
|
|
86684
|
+
try {
|
|
86685
|
+
const el = new DOMParser().parseFromString(html2, "text/html").querySelector(`[${SUPERDOC_MEDIA_ATTR}]`);
|
|
86686
|
+
if (!el)
|
|
86687
|
+
return null;
|
|
86688
|
+
const b64 = el.textContent?.trim() ?? "";
|
|
86689
|
+
if (!b64)
|
|
86690
|
+
return null;
|
|
86691
|
+
return decodeUtf8Base64(b64) || null;
|
|
86692
|
+
} catch {
|
|
86693
|
+
return null;
|
|
86694
|
+
}
|
|
86695
|
+
}
|
|
86675
86696
|
function extractBodySectPrFromHtml(html2) {
|
|
86676
86697
|
if (!html2 || !html2.includes("data-sd-body-sect-pr"))
|
|
86677
86698
|
return null;
|
|
@@ -86788,7 +86809,7 @@ function annotatePmNodeOnClipboardDom(domEl, pmNode, editor) {
|
|
|
86788
86809
|
function isSuperdocOriginClipboardHtml(html2) {
|
|
86789
86810
|
if (!html2 || typeof html2 !== "string")
|
|
86790
86811
|
return false;
|
|
86791
|
-
if (html2.includes("data-superdoc-slice") || html2.includes("data-sd-body-sect-pr"))
|
|
86812
|
+
if (html2.includes("data-superdoc-slice") || html2.includes("data-sd-body-sect-pr") || html2.includes("data-sd-superdoc-media"))
|
|
86792
86813
|
return true;
|
|
86793
86814
|
if (/data-sd-sect-pr\s*=/i.test(html2))
|
|
86794
86815
|
return true;
|
|
@@ -86988,12 +87009,29 @@ function sanitizeHtml(html2, forbiddenTags = [
|
|
|
86988
87009
|
return container;
|
|
86989
87010
|
}
|
|
86990
87011
|
function handleClipboardPaste({ editor, view }, html2, plainText) {
|
|
87012
|
+
const rawHtml = html2 || "";
|
|
87013
|
+
const isSuperdocHtml = isSuperdocOriginClipboardHtml(rawHtml);
|
|
87014
|
+
const embeddedBodySectPr = isSuperdocHtml ? extractBodySectPrFromHtml(rawHtml) : null;
|
|
87015
|
+
const embeddedMedia = isSuperdocHtml ? extractMediaFromHtml(rawHtml) : "";
|
|
87016
|
+
let pasteHtml = rawHtml;
|
|
87017
|
+
let superdocSliceData = extractSliceFromHtml(rawHtml);
|
|
87018
|
+
if (superdocSliceData) {
|
|
87019
|
+
superdocSliceData = applySuperdocClipboardMedia(editor, null, superdocSliceData, embeddedMedia);
|
|
87020
|
+
try {
|
|
87021
|
+
if (handleSuperdocSlicePaste(superdocSliceData, editor, view, embeddedBodySectPr))
|
|
87022
|
+
return true;
|
|
87023
|
+
} catch (err$1) {
|
|
87024
|
+
console.warn("Failed to paste SuperDoc slice, falling back to HTML:", err$1);
|
|
87025
|
+
}
|
|
87026
|
+
}
|
|
87027
|
+
if (isSuperdocHtml)
|
|
87028
|
+
pasteHtml = stripSliceFromHtml(rawHtml);
|
|
86991
87029
|
let source;
|
|
86992
|
-
if (!
|
|
87030
|
+
if (!pasteHtml)
|
|
86993
87031
|
source = "plain-text";
|
|
86994
|
-
else if (isWordHtml(
|
|
87032
|
+
else if (isWordHtml(pasteHtml))
|
|
86995
87033
|
source = "word-html";
|
|
86996
|
-
else if (isGoogleDocsHtml(
|
|
87034
|
+
else if (isGoogleDocsHtml(pasteHtml))
|
|
86997
87035
|
source = "google-docs";
|
|
86998
87036
|
else
|
|
86999
87037
|
source = "browser-html";
|
|
@@ -87005,13 +87043,26 @@ function handleClipboardPaste({ editor, view }, html2, plainText) {
|
|
|
87005
87043
|
return handlePlainTextUrlPaste(editor, view, plainText, detected);
|
|
87006
87044
|
}
|
|
87007
87045
|
case "word-html":
|
|
87008
|
-
if (editor.options.mode === "docx" && !
|
|
87009
|
-
return handleDocxPaste(
|
|
87010
|
-
|
|
87011
|
-
|
|
87012
|
-
|
|
87013
|
-
|
|
87014
|
-
|
|
87046
|
+
if (editor.options.mode === "docx" && !isSuperdocHtml)
|
|
87047
|
+
return handleDocxPaste(pasteHtml, editor, view);
|
|
87048
|
+
{
|
|
87049
|
+
const ok3 = handleHtmlPaste(pasteHtml, editor);
|
|
87050
|
+
if (ok3 && embeddedBodySectPr)
|
|
87051
|
+
tryApplyEmbeddedBodySectPr(editor, view, embeddedBodySectPr);
|
|
87052
|
+
return ok3;
|
|
87053
|
+
}
|
|
87054
|
+
case "google-docs": {
|
|
87055
|
+
const ok3 = handleGoogleDocsHtml(pasteHtml, editor, view);
|
|
87056
|
+
if (ok3 && embeddedBodySectPr)
|
|
87057
|
+
tryApplyEmbeddedBodySectPr(editor, view, embeddedBodySectPr);
|
|
87058
|
+
return ok3;
|
|
87059
|
+
}
|
|
87060
|
+
case "browser-html": {
|
|
87061
|
+
const ok3 = handleHtmlPaste(pasteHtml, editor);
|
|
87062
|
+
if (ok3 && embeddedBodySectPr)
|
|
87063
|
+
tryApplyEmbeddedBodySectPr(editor, view, embeddedBodySectPr);
|
|
87064
|
+
return ok3;
|
|
87065
|
+
}
|
|
87015
87066
|
}
|
|
87016
87067
|
return false;
|
|
87017
87068
|
}
|
|
@@ -87037,7 +87088,7 @@ function handleCutEvent(view, event, editor) {
|
|
|
87037
87088
|
const html2 = unflattenListsInHtml(div.innerHTML);
|
|
87038
87089
|
const bodySectPr = view.state.doc.attrs?.bodySectPr;
|
|
87039
87090
|
const bodySectPrJson = bodySectPr && bodySectPrShouldEmbed(bodySectPr) ? JSON.stringify(bodySectPr) : "";
|
|
87040
|
-
clipboardData.setData("text/html", embedSliceInHtml(html2, sliceJson, bodySectPrJson));
|
|
87091
|
+
clipboardData.setData("text/html", embedSliceInHtml(html2, sliceJson, bodySectPrJson, mediaJson));
|
|
87041
87092
|
clipboardData.setData("text/plain", fragment2.textBetween(0, fragment2.size, `
|
|
87042
87093
|
|
|
87043
87094
|
`));
|
|
@@ -113637,7 +113688,7 @@ var isRegExp = (value) => {
|
|
|
113637
113688
|
normalizePastedLinks(tr, editor);
|
|
113638
113689
|
dispatch(tr);
|
|
113639
113690
|
return true;
|
|
113640
|
-
}, SUPERDOC_SLICE_MIME = "application/x-superdoc-slice", SUPERDOC_MEDIA_MIME = "application/x-superdoc-media", SUPERDOC_SLICE_ATTR = "data-superdoc-slice", SUPERDOC_BODY_SECT_PR_ATTR = "data-sd-body-sect-pr", PARAGRAPH_CLIPBOARD_ATTRS, InputRule = class {
|
|
113691
|
+
}, SUPERDOC_SLICE_MIME = "application/x-superdoc-slice", SUPERDOC_MEDIA_MIME = "application/x-superdoc-media", SUPERDOC_SLICE_ATTR = "data-superdoc-slice", SUPERDOC_BODY_SECT_PR_ATTR = "data-sd-body-sect-pr", SUPERDOC_MEDIA_ATTR = "data-sd-superdoc-media", PARAGRAPH_CLIPBOARD_ATTRS, InputRule = class {
|
|
113641
113692
|
match;
|
|
113642
113693
|
handler;
|
|
113643
113694
|
constructor(config$40) {
|
|
@@ -113776,9 +113827,10 @@ var isRegExp = (value) => {
|
|
|
113776
113827
|
const rawHtml = clipboard.getData("text/html");
|
|
113777
113828
|
const isSuperdocHtml = isSuperdocOriginClipboardHtml(rawHtml);
|
|
113778
113829
|
const embeddedBodySectPr = isSuperdocHtml ? extractBodySectPrFromHtml(rawHtml) : null;
|
|
113830
|
+
const embeddedMedia = isSuperdocHtml ? extractMediaFromHtml(rawHtml) : "";
|
|
113779
113831
|
let superdocSliceData = clipboard.getData("application/x-superdoc-slice") || extractSliceFromHtml(rawHtml);
|
|
113780
113832
|
if (isSuperdocHtml || superdocSliceData)
|
|
113781
|
-
superdocSliceData = applySuperdocClipboardMedia(editor, clipboard, superdocSliceData || null);
|
|
113833
|
+
superdocSliceData = applySuperdocClipboardMedia(editor, clipboard, superdocSliceData || null, embeddedMedia);
|
|
113782
113834
|
if (superdocSliceData)
|
|
113783
113835
|
try {
|
|
113784
113836
|
if (handleSuperdocSlicePaste(superdocSliceData, editor, view, embeddedBodySectPr))
|
|
@@ -118288,7 +118340,7 @@ var isRegExp = (value) => {
|
|
|
118288
118340
|
state.kern = kernNode.attributes["w:val"];
|
|
118289
118341
|
}
|
|
118290
118342
|
}, SuperConverter;
|
|
118291
|
-
var
|
|
118343
|
+
var init_SuperConverter_DFi0X147_es = __esm(() => {
|
|
118292
118344
|
init_rolldown_runtime_Bg48TavK_es();
|
|
118293
118345
|
init_jszip_C49i9kUs_es();
|
|
118294
118346
|
init_xml_js_CqGKpaft_es();
|
|
@@ -155889,7 +155941,7 @@ var init_SuperConverter_CkLY_4Vz_es = __esm(() => {
|
|
|
155889
155941
|
};
|
|
155890
155942
|
});
|
|
155891
155943
|
|
|
155892
|
-
// ../../packages/superdoc/dist/chunks/create-headless-toolbar-
|
|
155944
|
+
// ../../packages/superdoc/dist/chunks/create-headless-toolbar-C9nvGdZQ.es.js
|
|
155893
155945
|
function parseSizeUnit(val = "0") {
|
|
155894
155946
|
const length3 = val.toString() || "0";
|
|
155895
155947
|
const value = Number.parseFloat(length3);
|
|
@@ -158525,8 +158577,8 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, Extension = class Extension2 {
|
|
|
158525
158577
|
}
|
|
158526
158578
|
};
|
|
158527
158579
|
};
|
|
158528
|
-
var
|
|
158529
|
-
|
|
158580
|
+
var init_create_headless_toolbar_C9nvGdZQ_es = __esm(() => {
|
|
158581
|
+
init_SuperConverter_DFi0X147_es();
|
|
158530
158582
|
init_constants_DrU4EASo_es();
|
|
158531
158583
|
init_dist_B8HfvhaK_es();
|
|
158532
158584
|
CSS_DIMENSION_REGEX = /[\d-.]+(\w+)$/;
|
|
@@ -207212,7 +207264,7 @@ var init_remark_gfm_eZN6yzWQ_es = __esm(() => {
|
|
|
207212
207264
|
init_remark_gfm_BhnWr3yf_es();
|
|
207213
207265
|
});
|
|
207214
207266
|
|
|
207215
|
-
// ../../packages/superdoc/dist/chunks/src-
|
|
207267
|
+
// ../../packages/superdoc/dist/chunks/src-LSTnLsUi.es.js
|
|
207216
207268
|
function deleteProps(obj, propOrProps) {
|
|
207217
207269
|
const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
|
|
207218
207270
|
const removeNested = (target, pathParts, index2 = 0) => {
|
|
@@ -282328,11 +282380,12 @@ var Node$13 = class Node$14 {
|
|
|
282328
282380
|
return;
|
|
282329
282381
|
const { from: from$1, to } = this.view.state.selection;
|
|
282330
282382
|
let sliceJson = "";
|
|
282383
|
+
let mediaJson = "";
|
|
282331
282384
|
if (from$1 !== to) {
|
|
282332
282385
|
const slice2 = this.view.state.doc.slice(from$1, to);
|
|
282333
282386
|
sliceJson = JSON.stringify(slice2.toJSON());
|
|
282334
282387
|
clipboardData.setData("application/x-superdoc-slice", sliceJson);
|
|
282335
|
-
|
|
282388
|
+
mediaJson = collectReferencedImageMediaForClipboard(sliceJson, editor);
|
|
282336
282389
|
if (mediaJson)
|
|
282337
282390
|
clipboardData.setData(SUPERDOC_MEDIA_MIME, mediaJson);
|
|
282338
282391
|
}
|
|
@@ -282340,7 +282393,7 @@ var Node$13 = class Node$14 {
|
|
|
282340
282393
|
const bodySectPr = this.view.state.doc.attrs?.bodySectPr;
|
|
282341
282394
|
const bodySectPrJson = bodySectPr && bodySectPrShouldEmbed(bodySectPr) ? JSON.stringify(bodySectPr) : "";
|
|
282342
282395
|
if (richHtml) {
|
|
282343
|
-
clipboardData.setData("text/html", embedSliceInHtml(richHtml, sliceJson, bodySectPrJson));
|
|
282396
|
+
clipboardData.setData("text/html", embedSliceInHtml(richHtml, sliceJson, bodySectPrJson, mediaJson));
|
|
282344
282397
|
clipboardData.setData("text/plain", getSelectionFromViewRoot(this.view.root)?.toString() ?? "");
|
|
282345
282398
|
return;
|
|
282346
282399
|
}
|
|
@@ -282350,7 +282403,7 @@ var Node$13 = class Node$14 {
|
|
|
282350
282403
|
div$1.appendChild(serializer2.serializeFragment(fragment2));
|
|
282351
282404
|
annotateFragmentDomWithClipboardData(div$1, fragment2, editor);
|
|
282352
282405
|
const html3 = transformListsInCopiedContent(div$1.innerHTML);
|
|
282353
|
-
clipboardData.setData("text/html", embedSliceInHtml(html3, sliceJson, bodySectPrJson));
|
|
282406
|
+
clipboardData.setData("text/html", embedSliceInHtml(html3, sliceJson, bodySectPrJson, mediaJson));
|
|
282354
282407
|
clipboardData.setData("text/plain", this.view.state.doc.textBetween(from$1, to, `
|
|
282355
282408
|
`));
|
|
282356
282409
|
} catch (error3) {
|
|
@@ -298474,12 +298527,12 @@ menclose::after {
|
|
|
298474
298527
|
return;
|
|
298475
298528
|
console.log(...args$1);
|
|
298476
298529
|
}, 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;
|
|
298477
|
-
var
|
|
298530
|
+
var init_src_LSTnLsUi_es = __esm(() => {
|
|
298478
298531
|
init_rolldown_runtime_Bg48TavK_es();
|
|
298479
|
-
|
|
298532
|
+
init_SuperConverter_DFi0X147_es();
|
|
298480
298533
|
init_jszip_C49i9kUs_es();
|
|
298481
298534
|
init_uuid_qzgm05fK_es();
|
|
298482
|
-
|
|
298535
|
+
init_create_headless_toolbar_C9nvGdZQ_es();
|
|
298483
298536
|
init_constants_DrU4EASo_es();
|
|
298484
298537
|
init_dist_B8HfvhaK_es();
|
|
298485
298538
|
init_unified_Dsuw2be5_es();
|
|
@@ -335872,11 +335925,11 @@ function print() { __p += __j.call(arguments, '') }
|
|
|
335872
335925
|
];
|
|
335873
335926
|
});
|
|
335874
335927
|
|
|
335875
|
-
// ../../packages/superdoc/dist/chunks/create-super-doc-ui-
|
|
335928
|
+
// ../../packages/superdoc/dist/chunks/create-super-doc-ui-Cx0pa6em.es.js
|
|
335876
335929
|
var RESERVED_PROXY_PROPERTY_NAMES, ALL_TOOLBAR_COMMAND_IDS, EMPTY_ACTIVE_IDS;
|
|
335877
|
-
var
|
|
335878
|
-
|
|
335879
|
-
|
|
335930
|
+
var init_create_super_doc_ui_Cx0pa6em_es = __esm(() => {
|
|
335931
|
+
init_SuperConverter_DFi0X147_es();
|
|
335932
|
+
init_create_headless_toolbar_C9nvGdZQ_es();
|
|
335880
335933
|
RESERVED_PROXY_PROPERTY_NAMES = new Set([
|
|
335881
335934
|
"register",
|
|
335882
335935
|
"get",
|
|
@@ -335900,16 +335953,16 @@ var init_zipper_BxRAi0_5_es = __esm(() => {
|
|
|
335900
335953
|
|
|
335901
335954
|
// ../../packages/superdoc/dist/super-editor.es.js
|
|
335902
335955
|
var init_super_editor_es = __esm(() => {
|
|
335903
|
-
|
|
335904
|
-
|
|
335956
|
+
init_src_LSTnLsUi_es();
|
|
335957
|
+
init_SuperConverter_DFi0X147_es();
|
|
335905
335958
|
init_jszip_C49i9kUs_es();
|
|
335906
335959
|
init_xml_js_CqGKpaft_es();
|
|
335907
|
-
|
|
335960
|
+
init_create_headless_toolbar_C9nvGdZQ_es();
|
|
335908
335961
|
init_constants_DrU4EASo_es();
|
|
335909
335962
|
init_dist_B8HfvhaK_es();
|
|
335910
335963
|
init_unified_Dsuw2be5_es();
|
|
335911
335964
|
init_DocxZipper_CUX64E5K_es();
|
|
335912
|
-
|
|
335965
|
+
init_create_super_doc_ui_Cx0pa6em_es();
|
|
335913
335966
|
init_ui_CGB3qmy3_es();
|
|
335914
335967
|
init_eventemitter3_UwU_CLPU_es();
|
|
335915
335968
|
init_errors_C_DoKMoN_es();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@superdoc-dev/cli",
|
|
3
|
-
"version": "0.8.0-next.
|
|
3
|
+
"version": "0.8.0-next.61",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"superdoc": "./dist/index.js"
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
"access": "public"
|
|
35
35
|
},
|
|
36
36
|
"optionalDependencies": {
|
|
37
|
-
"@superdoc-dev/cli-darwin-arm64": "0.8.0-next.
|
|
38
|
-
"@superdoc-dev/cli-darwin-x64": "0.8.0-next.
|
|
39
|
-
"@superdoc-dev/cli-
|
|
40
|
-
"@superdoc-dev/cli-
|
|
41
|
-
"@superdoc-dev/cli-linux-arm64": "0.8.0-next.
|
|
37
|
+
"@superdoc-dev/cli-darwin-arm64": "0.8.0-next.61",
|
|
38
|
+
"@superdoc-dev/cli-darwin-x64": "0.8.0-next.61",
|
|
39
|
+
"@superdoc-dev/cli-linux-x64": "0.8.0-next.61",
|
|
40
|
+
"@superdoc-dev/cli-windows-x64": "0.8.0-next.61",
|
|
41
|
+
"@superdoc-dev/cli-linux-arm64": "0.8.0-next.61"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|
|
44
44
|
"predev": "node scripts/ensure-superdoc-build.js",
|