@deot/docs-playground 1.1.5 → 1.1.7
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/README.md +7 -6
- package/dist/index.cjs +160 -93
- package/dist/index.js +161 -94
- package/dist/index.style.css +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { C as normalizeCdnURL, D as NEW_SFC_CODE, E as DEFAULT_ENTRY, S as createBuiltinStyles, T as DEFAULT_CDN_URL, _ as bindPlaygroundScss, a as transformScript, b as whenSassReady, c as createFileIndex, d as isIgnoredFilename, f as isInsideRoot, g as resolveModulePath, i as rewriteImportMeta, l as getCommonRoot, m as normalizeVirtualPath, n as injectStyle, o as collectBareSpecifiers, p as isRelativeSpecifier, r as removeStyle, s as collectReachableFilenames, w as resolveNpmImport, x as createBuiltinImports } from "./css-DleINdoA.js";
|
|
2
2
|
import * as Vue from "vue";
|
|
3
|
-
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent,
|
|
3
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, shallowRef, toDisplayString, unref, vModelText, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
|
|
4
4
|
import * as Vc from "@deot/vc";
|
|
5
5
|
import { Clipboard, Dropdown, DropdownItem, DropdownMenu, Message, Popconfirm, Portal, Scroller, TransitionFade } from "@deot/vc";
|
|
6
6
|
import { provideLocale, useLocale } from "@deot/docs-locale";
|
|
@@ -175,10 +175,10 @@ var icon_default = /* @__PURE__ */ defineComponent({
|
|
|
175
175
|
});
|
|
176
176
|
//#endregion
|
|
177
177
|
//#region packages/playground/src/core/code-preview/github.css?inline
|
|
178
|
-
var github_default = "pre code.hljs{display:block;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{font-weight:700;color:#005cc5}.hljs-bullet{color:#735c0f}.hljs-emphasis{font-style:italic;color:#24292e}.hljs-strong{font-weight:700;color:#24292e}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}[data-doc-theme=dark] .hljs,[data-vc-theme=dark] .hljs{color:#c9d1d9;background:#0d1117}[data-doc-theme=dark] .hljs-doctag,[data-doc-theme=dark] .hljs-keyword,[data-doc-theme=dark] .hljs-meta .hljs-keyword,[data-doc-theme=dark] .hljs-template-tag,[data-doc-theme=dark] .hljs-template-variable,[data-doc-theme=dark] .hljs-type,[data-doc-theme=dark] .hljs-variable.language_,[data-vc-theme=dark] .hljs-doctag,[data-vc-theme=dark] .hljs-keyword,[data-vc-theme=dark] .hljs-meta .hljs-keyword,[data-vc-theme=dark] .hljs-template-tag,[data-vc-theme=dark] .hljs-template-variable,[data-vc-theme=dark] .hljs-type,[data-vc-theme=dark] .hljs-variable.language_{color:#ff7b72}[data-doc-theme=dark] .hljs-title,[data-doc-theme=dark] .hljs-title.class_,[data-doc-theme=dark] .hljs-title.function_,[data-vc-theme=dark] .hljs-title,[data-vc-theme=dark] .hljs-title.class_,[data-vc-theme=dark] .hljs-title.function_{color:#d2a8ff}[data-doc-theme=dark] .hljs-attr,[data-doc-theme=dark] .hljs-literal,[data-doc-theme=dark] .hljs-number,[data-doc-theme=dark] .hljs-variable,[data-vc-theme=dark] .hljs-attr,[data-vc-theme=dark] .hljs-literal,[data-vc-theme=dark] .hljs-number,[data-vc-theme=dark] .hljs-variable{color:#79c0ff}[data-doc-theme=dark] .hljs-regexp,[data-doc-theme=dark] .hljs-string,[data-vc-theme=dark] .hljs-regexp,[data-vc-theme=dark] .hljs-string{color:#a5d6ff}[data-doc-theme=dark] .hljs-code,[data-doc-theme=dark] .hljs-comment,[data-vc-theme=dark] .hljs-code,[data-vc-theme=dark] .hljs-comment{color:#8b949e}[data-doc-theme=dark] .hljs-name,[data-doc-theme=dark] .hljs-selector-tag,[data-vc-theme=dark] .hljs-name,[data-vc-theme=dark] .hljs-selector-tag{color:#7ee787}";
|
|
178
|
+
var github_default = "pre code.hljs{display:block;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{font-weight:700;color:#005cc5}.hljs-bullet{color:#735c0f}.hljs-emphasis{font-style:italic;color:#24292e}.hljs-strong{font-weight:700;color:#24292e}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}@media screen{[data-doc-theme=dark] .hljs,[data-vc-theme=dark] .hljs{color:#c9d1d9;background:#0d1117}[data-doc-theme=dark] .hljs-doctag,[data-doc-theme=dark] .hljs-keyword,[data-doc-theme=dark] .hljs-meta .hljs-keyword,[data-doc-theme=dark] .hljs-template-tag,[data-doc-theme=dark] .hljs-template-variable,[data-doc-theme=dark] .hljs-type,[data-doc-theme=dark] .hljs-variable.language_,[data-vc-theme=dark] .hljs-doctag,[data-vc-theme=dark] .hljs-keyword,[data-vc-theme=dark] .hljs-meta .hljs-keyword,[data-vc-theme=dark] .hljs-template-tag,[data-vc-theme=dark] .hljs-template-variable,[data-vc-theme=dark] .hljs-type,[data-vc-theme=dark] .hljs-variable.language_{color:#ff7b72}[data-doc-theme=dark] .hljs-title,[data-doc-theme=dark] .hljs-title.class_,[data-doc-theme=dark] .hljs-title.function_,[data-vc-theme=dark] .hljs-title,[data-vc-theme=dark] .hljs-title.class_,[data-vc-theme=dark] .hljs-title.function_{color:#d2a8ff}[data-doc-theme=dark] .hljs-attr,[data-doc-theme=dark] .hljs-literal,[data-doc-theme=dark] .hljs-number,[data-doc-theme=dark] .hljs-variable,[data-vc-theme=dark] .hljs-attr,[data-vc-theme=dark] .hljs-literal,[data-vc-theme=dark] .hljs-number,[data-vc-theme=dark] .hljs-variable{color:#79c0ff}[data-doc-theme=dark] .hljs-regexp,[data-doc-theme=dark] .hljs-string,[data-vc-theme=dark] .hljs-regexp,[data-vc-theme=dark] .hljs-string{color:#a5d6ff}[data-doc-theme=dark] .hljs-code,[data-doc-theme=dark] .hljs-comment,[data-vc-theme=dark] .hljs-code,[data-vc-theme=dark] .hljs-comment{color:#8b949e}[data-doc-theme=dark] .hljs-name,[data-doc-theme=dark] .hljs-selector-tag,[data-vc-theme=dark] .hljs-name,[data-vc-theme=dark] .hljs-selector-tag{color:#7ee787}}";
|
|
179
179
|
//#endregion
|
|
180
180
|
//#region packages/playground/src/core/code-preview/code-preview.scss?inline
|
|
181
|
-
var code_preview_default$1 = ".docs-code-preview{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:0;overflow:hidden;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border-radius:8px}.docs-code-preview__language{z-index:1;min-width:28px;padding:0 8px;font-size:12px;line-height:18px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:opacity .15s;transition:opacity .15s}.docs-code-preview__copy,.docs-code-preview__language{position:absolute;top:6px;right:12px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:28px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-extralight,#71717a));-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-code-preview__copy{z-index:2;width:28px;padding:0;pointer-events:none;cursor:pointer;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border:1px solid var(--docs-border-color,var(--vc-color
|
|
181
|
+
var code_preview_default$1 = ".docs-code-preview{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:0;overflow:hidden;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border-radius:8px}.docs-code-preview__language{z-index:1;min-width:28px;padding:0 8px;font-size:12px;line-height:18px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transition:opacity .15s;transition:opacity .15s}.docs-code-preview__copy,.docs-code-preview__language{position:absolute;top:6px;right:12px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:28px;color:var(--docs-foreground-color-mute,var(--vc-color-dark-extralight,#71717a));-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.docs-code-preview__copy{z-index:2;width:28px;padding:0;pointer-events:none;cursor:pointer;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa));border:1px solid var(--docs-border-color,var(--vc-border-color,#d4d4d8));border-radius:8px;opacity:0;-webkit-transition:opacity .15s,background-color .15s;transition:opacity .15s,background-color .15s}.docs-code-preview__copy:hover{background:var(--docs-background-color,var(--vc-background-color-lightest,#fff))}.docs-code-preview__copy:focus-visible{pointer-events:auto;opacity:1}.docs-code-preview:has(.docs-code-preview__copy:focus-visible) .docs-code-preview__language,.docs-code-preview:hover .docs-code-preview__language{opacity:0}.docs-code-preview:has(.docs-code-preview__copy:focus-visible) .docs-code-preview__copy,.docs-code-preview:hover .docs-code-preview__copy{pointer-events:auto;opacity:1}.docs-code-preview__scroller{width:100%;height:100%;min-width:0;min-height:0;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.docs-code-preview__code{width:-webkit-max-content;width:-moz-max-content;width:max-content;margin:0}.docs-code-preview__code,.docs-code-preview__code code.hljs{min-width:100%;min-height:100%;overflow:visible;background:var(--docs-background-color-soft,var(--vc-background-color,#f7f8fa))}.docs-code-preview__code code.hljs{display:block;padding:12px 96px 12px 24px;-webkit-box-sizing:border-box;box-sizing:border-box}";
|
|
182
182
|
//#endregion
|
|
183
183
|
//#region packages/playground/src/core/code-preview/style.ts
|
|
184
184
|
var CODE_PREVIEW_STYLE_ID = "docs-code-preview-style";
|
|
@@ -2203,9 +2203,9 @@ var escapeHtmlAttr = (value) => value.replace(/&/gu, "&").replace(/"/gu, "&q
|
|
|
2203
2203
|
/**
|
|
2204
2204
|
* runtime 画布色。`previewInset` 露出的 padding、iframe chrome 和 sandbox
|
|
2205
2205
|
* `html`/`body` 必须共用这一变量,暗色下 `--docs-background-color` 与
|
|
2206
|
-
* `--vc-background-color-
|
|
2206
|
+
* `--vc-background-color-lightest` 不同,否则会出现色带割裂。
|
|
2207
2207
|
*/
|
|
2208
|
-
var PLAYGROUND_RUNTIME_CANVAS_BACKGROUND = "var(--vc-background-color-
|
|
2208
|
+
var PLAYGROUND_RUNTIME_CANVAS_BACKGROUND = "var(--vc-background-color-lightest, var(--docs-background-color, #fff))";
|
|
2209
2209
|
var createRuntimePreviewOptions = (cdnURL = DEFAULT_CDN_URL, options = {}) => {
|
|
2210
2210
|
const previewScroller = options.previewScroller === true;
|
|
2211
2211
|
const hrefs = Object.values({
|
|
@@ -2235,22 +2235,30 @@ var createRuntimePreviewOptions = (cdnURL = DEFAULT_CDN_URL, options = {}) => {
|
|
|
2235
2235
|
}
|
|
2236
2236
|
};
|
|
2237
2237
|
};
|
|
2238
|
-
var toReplFilename = (filename) => filename.startsWith("src/") ? filename : `src/${filename}`;
|
|
2238
|
+
var toReplFilename = (filename) => filename === "import-map.json" || filename.startsWith("src/") ? filename : `src/${filename}`;
|
|
2239
2239
|
var createReplFile = (filename, code) => {
|
|
2240
2240
|
const replFilename = toReplFilename(filename);
|
|
2241
2241
|
return new File(replFilename, code);
|
|
2242
2242
|
};
|
|
2243
2243
|
/**
|
|
2244
|
-
*
|
|
2244
|
+
* 保留显式配置的模块,供 local 区分宿主默认与 URL 覆盖。
|
|
2245
|
+
* @param builtinImportMap 实例层 import map。
|
|
2246
|
+
* @returns 按优先级合并的显式模块地址。
|
|
2247
|
+
*/
|
|
2248
|
+
var createRuntimeImportOverrides = (builtinImportMap) => ({
|
|
2249
|
+
...getPlaygroundSiteModules(),
|
|
2250
|
+
...getPlaygroundImportMapOverrides(),
|
|
2251
|
+
...filterSafeHrefs(builtinImportMap?.imports)
|
|
2252
|
+
});
|
|
2253
|
+
/**
|
|
2254
|
+
* 默认 CDN → 站点 modules → 管理页覆盖 → 实例 builtinImportMap。
|
|
2245
2255
|
* iframe import map 与直接渲染加载的是同一份地址表。
|
|
2246
2256
|
* @param cdnURL
|
|
2247
2257
|
* @param builtinImportMap
|
|
2248
2258
|
*/
|
|
2249
2259
|
var createRuntimeImports = (cdnURL = DEFAULT_CDN_URL, builtinImportMap) => ({
|
|
2250
2260
|
...createBuiltinImports(cdnURL),
|
|
2251
|
-
...
|
|
2252
|
-
...filterSafeHrefs(builtinImportMap?.imports),
|
|
2253
|
-
...getPlaygroundImportMapOverrides()
|
|
2261
|
+
...createRuntimeImportOverrides(builtinImportMap)
|
|
2254
2262
|
});
|
|
2255
2263
|
var createRuntimeStore = (files, entry, options) => {
|
|
2256
2264
|
const { cdnURL, builtinImportMap, ...storeOptions } = options;
|
|
@@ -2258,6 +2266,7 @@ var createRuntimeStore = (files, entry, options) => {
|
|
|
2258
2266
|
const file = createReplFile(filename, code);
|
|
2259
2267
|
return [file.filename, file];
|
|
2260
2268
|
})));
|
|
2269
|
+
replFiles.value["import-map.json"] ??= new File("import-map.json", "{}");
|
|
2261
2270
|
const mainFile = ref(toReplFilename(entry));
|
|
2262
2271
|
const activeFilename = ref(toReplFilename(entry));
|
|
2263
2272
|
const imports = createRuntimeImports(cdnURL, builtinImportMap);
|
|
@@ -2276,6 +2285,11 @@ var createRuntimeStore = (files, entry, options) => {
|
|
|
2276
2285
|
})
|
|
2277
2286
|
});
|
|
2278
2287
|
bindPlaygroundScss(store);
|
|
2288
|
+
const setFiles = store.setFiles.bind(store);
|
|
2289
|
+
store.setFiles = (nextFiles, nextEntry) => setFiles({
|
|
2290
|
+
"import-map.json": store.files["import-map.json"].code,
|
|
2291
|
+
...nextFiles
|
|
2292
|
+
}, nextEntry);
|
|
2279
2293
|
bindReplModules(store);
|
|
2280
2294
|
whenSassReady(files, () => {
|
|
2281
2295
|
const specifiers = collectBareSpecifiers(files, Object.keys(files));
|
|
@@ -2524,7 +2538,7 @@ var Alone = new Portal(/* @__PURE__ */ defineComponent({
|
|
|
2524
2538
|
/**
|
|
2525
2539
|
* 直接渲染与页面同文档,弹层不需要临时撑高。
|
|
2526
2540
|
* `run` 仍返回可调用函数,但不会申请高度,也不会改动预览尺寸。
|
|
2527
|
-
* @param vue
|
|
2541
|
+
* @param vue 当前预览的 Vue,只用其中的 `isRef`。
|
|
2528
2542
|
* @returns 注入给预览的 `docs:playground`。
|
|
2529
2543
|
*/
|
|
2530
2544
|
var createLocalPlayground = (vue) => {
|
|
@@ -2775,6 +2789,15 @@ var resolveHostModule = (id, modules) => {
|
|
|
2775
2789
|
return null;
|
|
2776
2790
|
};
|
|
2777
2791
|
var HOST_VUE_SPECIFIERS = /* @__PURE__ */ new Set(["vue", "vue/server-renderer"]);
|
|
2792
|
+
var VUE_DEPENDENT_BUILTINS = /* @__PURE__ */ new Set([
|
|
2793
|
+
"vue/server-renderer",
|
|
2794
|
+
"vue-router",
|
|
2795
|
+
"pinia",
|
|
2796
|
+
"@deot/vc",
|
|
2797
|
+
"@deot/vc-components",
|
|
2798
|
+
"@deot/vc-hooks",
|
|
2799
|
+
"@deot/vc-locale"
|
|
2800
|
+
]);
|
|
2778
2801
|
var messageOf = (error) => error instanceof Error ? error.message : String(error);
|
|
2779
2802
|
/**
|
|
2780
2803
|
* 找到 import map 里能覆盖该说明符的键。子路径没有独立 URL 时回退到父包。
|
|
@@ -2793,24 +2816,23 @@ var resolveImportTarget = (id, imports) => {
|
|
|
2793
2816
|
cursor = parent;
|
|
2794
2817
|
}
|
|
2795
2818
|
};
|
|
2796
|
-
var prefersLocalBuiltin = (id, imports,
|
|
2819
|
+
var prefersLocalBuiltin = (id, imports, overrides = new Set(Object.keys(imports))) => {
|
|
2797
2820
|
if (!localBuiltinIds.has(id) && !HOST_VUE_SPECIFIERS.has(id)) return false;
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
return url === createBuiltinImports(cdnURL)[id];
|
|
2821
|
+
if (overrides.has(id)) return false;
|
|
2822
|
+
return !VUE_DEPENDENT_BUILTINS.has(id) || !overrides.has("vue");
|
|
2801
2823
|
};
|
|
2802
2824
|
/**
|
|
2803
|
-
*
|
|
2825
|
+
* 内置依赖默认注入宿主副本,显式 URL 按模块覆盖,包括与默认 CDN 相同的地址。
|
|
2804
2826
|
* @param specifiers 本次预览用到的裸模块说明符。
|
|
2805
2827
|
* @param imports 合并后的 import map。
|
|
2806
2828
|
* @param builtins 宿主 Vue 与 vue-router。
|
|
2807
2829
|
* @param builtins.vue 当前页面的 Vue 模块。
|
|
2808
2830
|
* @param builtins.vueRouter 打包进来的 vue-router,可被 import map 覆盖。
|
|
2809
2831
|
* @param loader 按 URL 加载远程模块。
|
|
2810
|
-
* @param
|
|
2832
|
+
* @param overrides 显式配置的模块名,与自动补齐的默认地址区分。
|
|
2811
2833
|
* @returns 模块表和加载错误。
|
|
2812
2834
|
*/
|
|
2813
|
-
var loadLocalModules = async (specifiers, imports, builtins, loader,
|
|
2835
|
+
var loadLocalModules = async (specifiers, imports, builtins, loader, overrides = new Set(Object.keys(imports))) => {
|
|
2814
2836
|
const modules = {
|
|
2815
2837
|
"vue": builtins.vue,
|
|
2816
2838
|
"vue-router": builtins.vueRouter
|
|
@@ -2820,14 +2842,14 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2820
2842
|
const localIds = /* @__PURE__ */ new Set();
|
|
2821
2843
|
specifiers.forEach((specifier) => {
|
|
2822
2844
|
let local = false;
|
|
2823
|
-
if (prefersLocalBuiltin(specifier, imports,
|
|
2845
|
+
if (prefersLocalBuiltin(specifier, imports, overrides)) localIds.add(specifier);
|
|
2824
2846
|
else {
|
|
2825
2847
|
let cursor = specifier;
|
|
2826
2848
|
while (true) {
|
|
2827
2849
|
const slash = cursor.lastIndexOf("/");
|
|
2828
2850
|
if (slash <= 0) break;
|
|
2829
2851
|
const parent = cursor.slice(0, slash);
|
|
2830
|
-
if (prefersLocalBuiltin(parent, imports,
|
|
2852
|
+
if (prefersLocalBuiltin(parent, imports, overrides)) {
|
|
2831
2853
|
localIds.add(parent);
|
|
2832
2854
|
local = true;
|
|
2833
2855
|
break;
|
|
@@ -2835,12 +2857,8 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2835
2857
|
cursor = parent;
|
|
2836
2858
|
}
|
|
2837
2859
|
}
|
|
2838
|
-
if (specifier === "vue-router") {
|
|
2839
|
-
if (imports["vue-router"]) targets.add("vue-router");
|
|
2840
|
-
return;
|
|
2841
|
-
}
|
|
2842
2860
|
const target = resolveImportTarget(specifier, imports);
|
|
2843
|
-
if (target && prefersLocalBuiltin(target, imports,
|
|
2861
|
+
if (target && prefersLocalBuiltin(target, imports, overrides)) localIds.add(target);
|
|
2844
2862
|
else if (target) targets.add(target);
|
|
2845
2863
|
else if (!local && !localIds.has(specifier)) {
|
|
2846
2864
|
imports[specifier] = resolveNpmImport(specifier);
|
|
@@ -2857,7 +2875,7 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2857
2875
|
}));
|
|
2858
2876
|
for (const id of targets) {
|
|
2859
2877
|
const url = imports[id];
|
|
2860
|
-
if (!url || prefersLocalBuiltin(id, imports,
|
|
2878
|
+
if (!url || prefersLocalBuiltin(id, imports, overrides)) continue;
|
|
2861
2879
|
try {
|
|
2862
2880
|
modules[id] = await loader(url);
|
|
2863
2881
|
} catch (error) {
|
|
@@ -2872,12 +2890,13 @@ var loadLocalModules = async (specifiers, imports, builtins, loader, cdnURL) =>
|
|
|
2872
2890
|
//#endregion
|
|
2873
2891
|
//#region packages/playground/src/core/runtime/local/vue-guard.ts
|
|
2874
2892
|
/**
|
|
2875
|
-
* 给 files
|
|
2893
|
+
* 给 files 注入选定的 Vue,但 `createApp().mount` 不会卸掉页面。
|
|
2876
2894
|
* 防护按本次 link 创建,多个 Playground 互不覆盖。
|
|
2877
2895
|
* @param capture 本次链接收集到的根组件、局部组件和 provide。
|
|
2896
|
+
* @param vue 当前预览选定的 Vue。
|
|
2878
2897
|
* @returns 带防护的 Vue 模块。
|
|
2879
2898
|
*/
|
|
2880
|
-
var createGuardedVue = (capture) => {
|
|
2899
|
+
var createGuardedVue = (capture, vue = Vue) => {
|
|
2881
2900
|
const createApp = (rootComponent, rootProps) => {
|
|
2882
2901
|
const fakeApp = {
|
|
2883
2902
|
_component: rootComponent,
|
|
@@ -2917,14 +2936,14 @@ var createGuardedVue = (capture) => {
|
|
|
2917
2936
|
mount() {
|
|
2918
2937
|
capture.components = { ...fakeApp._context.components };
|
|
2919
2938
|
capture.provides = { ...fakeApp._context.provides };
|
|
2920
|
-
capture.mountedComponent = defineComponent({
|
|
2939
|
+
capture.mountedComponent = vue.defineComponent({
|
|
2921
2940
|
name: "PlaygroundCapturedApp",
|
|
2922
2941
|
components: fakeApp._context.components,
|
|
2923
2942
|
setup() {
|
|
2924
2943
|
Reflect.ownKeys(fakeApp._context.provides).forEach((key) => {
|
|
2925
|
-
provide(key, fakeApp._context.provides[key]);
|
|
2944
|
+
vue.provide(key, fakeApp._context.provides[key]);
|
|
2926
2945
|
});
|
|
2927
|
-
return () => h(rootComponent, rootProps || null);
|
|
2946
|
+
return () => vue.h(rootComponent, rootProps || null);
|
|
2928
2947
|
}
|
|
2929
2948
|
});
|
|
2930
2949
|
return capture.mountedComponent;
|
|
@@ -2936,7 +2955,7 @@ var createGuardedVue = (capture) => {
|
|
|
2936
2955
|
};
|
|
2937
2956
|
return fakeApp;
|
|
2938
2957
|
};
|
|
2939
|
-
return new Proxy(
|
|
2958
|
+
return new Proxy(vue, { get(target, prop, receiver) {
|
|
2940
2959
|
if (prop === "createApp" || prop === "createSSRApp") return createApp;
|
|
2941
2960
|
if (prop === "default") return receiver;
|
|
2942
2961
|
return Reflect.get(target, prop, receiver);
|
|
@@ -2946,7 +2965,7 @@ var createGuardedVue = (capture) => {
|
|
|
2946
2965
|
//#region packages/playground/src/core/runtime/local/linker.ts
|
|
2947
2966
|
/**
|
|
2948
2967
|
* 在当前页面链接编译结果,返回入口组件。
|
|
2949
|
-
*
|
|
2968
|
+
* 给选定的 Vue 加上 mount 防护,避免字符串入口卸掉页面。
|
|
2950
2969
|
* @param compiled 浏览器编译结果。
|
|
2951
2970
|
* @param files 当前 Playground 文件表。
|
|
2952
2971
|
* @param options 可选的宿主模块表。
|
|
@@ -2965,7 +2984,7 @@ var linkPlayground = (compiled, files, options = {}) => {
|
|
|
2965
2984
|
provides: {}
|
|
2966
2985
|
};
|
|
2967
2986
|
const modules = { ...options.modules || {} };
|
|
2968
|
-
|
|
2987
|
+
modules.vue = createGuardedVue(capture, modules.vue || Vue);
|
|
2969
2988
|
const fileIndex = createFileIndex(files);
|
|
2970
2989
|
const root = getCommonRoot([...fileIndex.keys()]);
|
|
2971
2990
|
const cache = /* @__PURE__ */ new Map();
|
|
@@ -3033,16 +3052,54 @@ var linkPlayground = (compiled, files, options = {}) => {
|
|
|
3033
3052
|
//#endregion
|
|
3034
3053
|
//#region packages/playground/src/core/runtime/local/remote.ts
|
|
3035
3054
|
var HOST_VUE = /* @__PURE__ */ new Set(["vue", "vue/server-renderer"]);
|
|
3055
|
+
var moduleUrl = (url) => new URL(url, globalThis.location?.href).href;
|
|
3056
|
+
var REMOTE_SOURCE_CACHE_LIMIT = 128;
|
|
3057
|
+
var sourceCache = /* @__PURE__ */ new Map();
|
|
3058
|
+
var prepareRemoteSource = async (url) => {
|
|
3059
|
+
const response = await fetch(url);
|
|
3060
|
+
if (!response.ok) throw new Error(`${response.status} ${url}`);
|
|
3061
|
+
const text = await response.text();
|
|
3062
|
+
await init();
|
|
3063
|
+
const [specifiers] = parse(text);
|
|
3064
|
+
let source = text;
|
|
3065
|
+
for (const item of [...specifiers].reverse()) if (item.type === "dynamic") source = source.slice(0, item.importStart) + "__import" + source.slice(item.importStart + 6);
|
|
3066
|
+
const cjs = transform(rewriteImportMeta(source, url), {
|
|
3067
|
+
transforms: ["imports"],
|
|
3068
|
+
disableESTransforms: true,
|
|
3069
|
+
production: true,
|
|
3070
|
+
filePath: url
|
|
3071
|
+
}).code;
|
|
3072
|
+
return {
|
|
3073
|
+
dependencies: specifiers.filter((item) => item.type === "static" || item.type === "reexport-star").map((item) => item.specifier),
|
|
3074
|
+
run: new Function("require", "module", "exports", "__import", cjs)
|
|
3075
|
+
};
|
|
3076
|
+
};
|
|
3077
|
+
var readRemoteSource = (url) => {
|
|
3078
|
+
if (new URL(url).origin === globalThis.location?.origin) return prepareRemoteSource(url);
|
|
3079
|
+
const cached = sourceCache.get(url);
|
|
3080
|
+
if (cached) {
|
|
3081
|
+
sourceCache.delete(url);
|
|
3082
|
+
sourceCache.set(url, cached);
|
|
3083
|
+
return cached;
|
|
3084
|
+
}
|
|
3085
|
+
const task = prepareRemoteSource(url).catch((error) => {
|
|
3086
|
+
if (sourceCache.get(url) === task) sourceCache.delete(url);
|
|
3087
|
+
throw error;
|
|
3088
|
+
});
|
|
3089
|
+
sourceCache.set(url, task);
|
|
3090
|
+
if (sourceCache.size > REMOTE_SOURCE_CACHE_LIMIT) sourceCache.delete(sourceCache.keys().next().value);
|
|
3091
|
+
return task;
|
|
3092
|
+
};
|
|
3036
3093
|
/**
|
|
3037
3094
|
* 把 CDN 上的 ESM 先拉完整张依赖图,再在当前页面里执行。
|
|
3038
3095
|
* 裸导入优先走 import map,缺失的 npm 依赖回退到 CDN ESM;import() 按需加载。
|
|
3039
3096
|
* @param imports 合并后的 import map。
|
|
3040
3097
|
* @param builtins 宿主 Vue 与 vue-router。
|
|
3041
|
-
* @param
|
|
3098
|
+
* @param overrides 显式配置的模块名,与自动补齐的默认地址区分。
|
|
3042
3099
|
* @param importModule 浏览器原生 ESM 加载器。
|
|
3043
3100
|
* @returns 按 URL 加载并执行远程模块的加载器。
|
|
3044
3101
|
*/
|
|
3045
|
-
var createRemoteLoader = (imports, builtins,
|
|
3102
|
+
var createRemoteLoader = (imports, builtins, overrides = new Set(Object.keys(imports)), importModule = (url) => import(
|
|
3046
3103
|
/* @vite-ignore */
|
|
3047
3104
|
url
|
|
3048
3105
|
)) => {
|
|
@@ -3051,9 +3108,9 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3051
3108
|
"vue-router": builtins.vueRouter
|
|
3052
3109
|
};
|
|
3053
3110
|
const pendingBuiltins = /* @__PURE__ */ new Set();
|
|
3054
|
-
const
|
|
3111
|
+
const sources = /* @__PURE__ */ new Map();
|
|
3112
|
+
const pendingSources = /* @__PURE__ */ new Map();
|
|
3055
3113
|
const evaluated = /* @__PURE__ */ new Map();
|
|
3056
|
-
const crawled = /* @__PURE__ */ new Set();
|
|
3057
3114
|
const nativeModules = /* @__PURE__ */ new Map();
|
|
3058
3115
|
const loadNative = (url) => {
|
|
3059
3116
|
let pending = nativeModules.get(url);
|
|
@@ -3068,24 +3125,34 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3068
3125
|
return pending;
|
|
3069
3126
|
};
|
|
3070
3127
|
const localBuiltinId = (id) => {
|
|
3071
|
-
if (imports[id] && !prefersLocalBuiltin(id, imports,
|
|
3072
|
-
if (prefersLocalBuiltin(id, imports,
|
|
3128
|
+
if (imports[id] && !prefersLocalBuiltin(id, imports, overrides)) return null;
|
|
3129
|
+
if (prefersLocalBuiltin(id, imports, overrides)) return id;
|
|
3073
3130
|
let cursor = id;
|
|
3074
3131
|
while (true) {
|
|
3075
3132
|
const slash = cursor.lastIndexOf("/");
|
|
3076
3133
|
if (slash <= 0) return null;
|
|
3077
3134
|
const parent = cursor.slice(0, slash);
|
|
3078
|
-
if (prefersLocalBuiltin(parent, imports,
|
|
3135
|
+
if (prefersLocalBuiltin(parent, imports, overrides)) return parent;
|
|
3079
3136
|
cursor = parent;
|
|
3080
3137
|
}
|
|
3081
3138
|
};
|
|
3082
|
-
const
|
|
3083
|
-
if (isRelativeSpecifier(specifier) || /^https?:\/\//.test(specifier))
|
|
3084
|
-
|
|
3085
|
-
|
|
3139
|
+
const dependencySpecifier = (from, specifier) => {
|
|
3140
|
+
if (isRelativeSpecifier(specifier) || /^https?:\/\//.test(specifier)) {
|
|
3141
|
+
const url = new URL(specifier, from);
|
|
3142
|
+
const match = url.origin === "https://cdn.jsdelivr.net" ? url.pathname.match(/^\/npm\/((?:@[^/]+\/)?[^/@]+)(?:@[^/]+)?\/\+esm$/) : null;
|
|
3143
|
+
if (match && (imports[match[1]] || localBuiltinIds.has(match[1]))) return match[1];
|
|
3144
|
+
return url.href;
|
|
3145
|
+
}
|
|
3146
|
+
return specifier;
|
|
3147
|
+
};
|
|
3148
|
+
const dependencyUrl = (from, id) => {
|
|
3149
|
+
const specifier = dependencySpecifier(from, id);
|
|
3150
|
+
if (/^https?:\/\//.test(specifier)) return specifier;
|
|
3151
|
+
if (imports[specifier] && !prefersLocalBuiltin(specifier, imports, overrides)) return moduleUrl(imports[specifier]);
|
|
3152
|
+
if (HOST_VUE.has(specifier) && prefersLocalBuiltin(specifier, imports, overrides)) return null;
|
|
3086
3153
|
let cursor = specifier;
|
|
3087
3154
|
while (cursor) {
|
|
3088
|
-
if (localBuiltinIds.has(cursor) && prefersLocalBuiltin(cursor, imports,
|
|
3155
|
+
if (localBuiltinIds.has(cursor) && prefersLocalBuiltin(cursor, imports, overrides)) {
|
|
3089
3156
|
pendingBuiltins.add(cursor);
|
|
3090
3157
|
return null;
|
|
3091
3158
|
}
|
|
@@ -3098,37 +3165,36 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3098
3165
|
imports[specifier] = resolveNpmImport(specifier);
|
|
3099
3166
|
return imports[specifier];
|
|
3100
3167
|
}
|
|
3101
|
-
return imports[target];
|
|
3168
|
+
return moduleUrl(imports[target]);
|
|
3102
3169
|
};
|
|
3103
|
-
const crawl = async (url) => {
|
|
3104
|
-
if (/\/\+esm(?:[?#]|$)/.test(url)) {
|
|
3170
|
+
const crawl = async (url, visited = /* @__PURE__ */ new Set()) => {
|
|
3171
|
+
if (!overrides.size && /\/\+esm(?:[?#]|$)/.test(url)) {
|
|
3105
3172
|
await loadNative(url);
|
|
3106
3173
|
return;
|
|
3107
3174
|
}
|
|
3108
|
-
if (
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
if (!
|
|
3112
|
-
|
|
3113
|
-
|
|
3114
|
-
|
|
3115
|
-
|
|
3116
|
-
|
|
3117
|
-
|
|
3118
|
-
|
|
3119
|
-
if (
|
|
3120
|
-
const next = dependencyUrl(url, item.specifier);
|
|
3121
|
-
if (next) await crawl(next);
|
|
3175
|
+
if (visited.has(url)) return;
|
|
3176
|
+
visited.add(url);
|
|
3177
|
+
let pending = pendingSources.get(url);
|
|
3178
|
+
if (!pending) {
|
|
3179
|
+
pending = readRemoteSource(url);
|
|
3180
|
+
pendingSources.set(url, pending);
|
|
3181
|
+
}
|
|
3182
|
+
const source = await pending;
|
|
3183
|
+
sources.set(url, source);
|
|
3184
|
+
await Promise.all(source.dependencies.map(async (specifier) => {
|
|
3185
|
+
const next = dependencyUrl(url, specifier);
|
|
3186
|
+
if (next) await crawl(next, visited);
|
|
3122
3187
|
}));
|
|
3123
3188
|
};
|
|
3124
|
-
const requireFrom = (from) => (
|
|
3125
|
-
|
|
3189
|
+
const requireFrom = (from) => (specifier) => {
|
|
3190
|
+
const id = dependencySpecifier(from, specifier);
|
|
3191
|
+
if (HOST_VUE.has(id) && prefersLocalBuiltin(id, imports, overrides)) return toHostModule(builtins.vue);
|
|
3126
3192
|
const builtinId = localBuiltinId(id);
|
|
3127
3193
|
if (builtinId) return toHostModule(hostModules[builtinId]);
|
|
3128
|
-
if (isRelativeSpecifier(id) || /^https?:\/\//.test(id)) return evaluate(
|
|
3194
|
+
if (isRelativeSpecifier(id) || /^https?:\/\//.test(id)) return evaluate(dependencyUrl(from, id));
|
|
3129
3195
|
const target = imports[id] ? id : resolveImportTarget(id, imports);
|
|
3130
3196
|
if (!target || !imports[target]) throw new Error(`[Playground] 未注册的模块 "${id}"`);
|
|
3131
|
-
const loaded = evaluate(imports[target]);
|
|
3197
|
+
const loaded = evaluate(moduleUrl(imports[target]));
|
|
3132
3198
|
if (target === id) return loaded;
|
|
3133
3199
|
if (!resolveHostModule(id, { [target]: loaded }))
|
|
3134
3200
|
/* istanbul ignore next -- 父包没有对应导出时才拒绝 */
|
|
@@ -3137,21 +3203,16 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3137
3203
|
};
|
|
3138
3204
|
const evaluate = (url) => {
|
|
3139
3205
|
if (evaluated.has(url)) return evaluated.get(url);
|
|
3140
|
-
const
|
|
3141
|
-
if (
|
|
3142
|
-
const cjs = transform(rewriteImportMeta(text, url), {
|
|
3143
|
-
transforms: ["imports"],
|
|
3144
|
-
disableESTransforms: true,
|
|
3145
|
-
production: true,
|
|
3146
|
-
filePath: url
|
|
3147
|
-
}).code;
|
|
3206
|
+
const source = sources.get(url);
|
|
3207
|
+
if (!source) throw new Error(`[Playground] 远程模块尚未下载: ${url}`);
|
|
3148
3208
|
const module = { exports: {} };
|
|
3149
3209
|
evaluated.set(url, module.exports);
|
|
3150
|
-
|
|
3210
|
+
const runner = source.run;
|
|
3211
|
+
runner(requireFrom(url), module, module.exports, async (id) => {
|
|
3151
3212
|
const next = dependencyUrl(url, id);
|
|
3152
3213
|
if (next) await load(next);
|
|
3153
3214
|
else {
|
|
3154
|
-
const builtinId = localBuiltinId(id);
|
|
3215
|
+
const builtinId = localBuiltinId(dependencySpecifier(url, id));
|
|
3155
3216
|
if (builtinId && !(builtinId in hostModules)) hostModules[builtinId] = await ensureLocalBuiltin(builtinId);
|
|
3156
3217
|
}
|
|
3157
3218
|
return requireFrom(url)(id);
|
|
@@ -3160,7 +3221,8 @@ var createRemoteLoader = (imports, builtins, cdnURL, importModule = (url) => imp
|
|
|
3160
3221
|
return module.exports;
|
|
3161
3222
|
};
|
|
3162
3223
|
const loading = /* @__PURE__ */ new Map();
|
|
3163
|
-
const load = (
|
|
3224
|
+
const load = (sourceUrl) => {
|
|
3225
|
+
const url = moduleUrl(sourceUrl);
|
|
3164
3226
|
const pending = loading.get(url);
|
|
3165
3227
|
if (pending) return pending;
|
|
3166
3228
|
const task = (async () => {
|
|
@@ -3221,14 +3283,14 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3221
3283
|
});
|
|
3222
3284
|
};
|
|
3223
3285
|
watch([compileError, runtimeError], publishError);
|
|
3224
|
-
const createDocsLink = (preview) => defineComponent({
|
|
3286
|
+
const createDocsLink = (preview, vue) => vue.defineComponent({
|
|
3225
3287
|
name: "DocsLink",
|
|
3226
3288
|
props: { to: {
|
|
3227
3289
|
type: String,
|
|
3228
3290
|
default: ""
|
|
3229
3291
|
} },
|
|
3230
3292
|
setup(linkProps, { slots }) {
|
|
3231
|
-
return () => h("a", {
|
|
3293
|
+
return () => vue.h("a", {
|
|
3232
3294
|
href: linkProps.to,
|
|
3233
3295
|
style: {
|
|
3234
3296
|
color: "inherit",
|
|
@@ -3249,27 +3311,27 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3249
3311
|
previewApp = null;
|
|
3250
3312
|
removeStyle(styleId);
|
|
3251
3313
|
};
|
|
3252
|
-
const mountPreview = (
|
|
3314
|
+
const mountPreview = (job, preview) => {
|
|
3253
3315
|
if (!mountEl.value) return;
|
|
3316
|
+
const { component, vue, scroller, css } = job;
|
|
3254
3317
|
destroyPreview();
|
|
3255
3318
|
injectStyle(styleId, css);
|
|
3256
3319
|
if (props.clearConsole) console.clear();
|
|
3257
|
-
const
|
|
3258
|
-
const app = Vue.createApp({
|
|
3320
|
+
const app = vue.createApp({
|
|
3259
3321
|
name: "LocalSandboxRoot",
|
|
3260
3322
|
setup() {
|
|
3261
|
-
const service = createLocalPlayground(
|
|
3262
|
-
provide("docs:playground", service);
|
|
3263
|
-
onErrorCaptured((error) => {
|
|
3323
|
+
const service = createLocalPlayground(vue);
|
|
3324
|
+
vue.provide("docs:playground", service);
|
|
3325
|
+
vue.onErrorCaptured((error) => {
|
|
3264
3326
|
const message = formatPlaygroundRuntimeError(error);
|
|
3265
3327
|
if (message) runtimeError.value = message;
|
|
3266
3328
|
return false;
|
|
3267
3329
|
});
|
|
3268
|
-
onBeforeUnmount(() => service.dispose());
|
|
3330
|
+
vue.onBeforeUnmount(() => service.dispose());
|
|
3269
3331
|
return () => {
|
|
3270
|
-
const content = h(component);
|
|
3271
|
-
if (!
|
|
3272
|
-
return h(
|
|
3332
|
+
const content = vue.h(component);
|
|
3333
|
+
if (!scroller) return content;
|
|
3334
|
+
return vue.h(scroller, {
|
|
3273
3335
|
height: "100%",
|
|
3274
3336
|
native: false,
|
|
3275
3337
|
autoResize: true,
|
|
@@ -3279,7 +3341,7 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3279
3341
|
};
|
|
3280
3342
|
}
|
|
3281
3343
|
});
|
|
3282
|
-
app.component("DocsLink", createDocsLink(preview));
|
|
3344
|
+
app.component("DocsLink", createDocsLink(preview, vue));
|
|
3283
3345
|
app.config.errorHandler = (error) => {
|
|
3284
3346
|
const message = formatPlaygroundRuntimeError(error);
|
|
3285
3347
|
if (message) runtimeError.value = message;
|
|
@@ -3310,7 +3372,7 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3310
3372
|
/* istanbul ignore if -- 桥接 iframe 尚未就绪或编译已被取代 */
|
|
3311
3373
|
if (pendingMount !== job || !mountEl.value) return;
|
|
3312
3374
|
pendingMount = null;
|
|
3313
|
-
mountPreview(job
|
|
3375
|
+
mountPreview(job, preview);
|
|
3314
3376
|
};
|
|
3315
3377
|
const run = async () => {
|
|
3316
3378
|
const current = ++version;
|
|
@@ -3332,15 +3394,18 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3332
3394
|
return;
|
|
3333
3395
|
}
|
|
3334
3396
|
const imports = createRuntimeImports(props.options.cdnURL, props.options.builtinImportMap);
|
|
3397
|
+
const overrides = new Set(Object.keys(createRuntimeImportOverrides(props.options.builtinImportMap)));
|
|
3335
3398
|
const specifiers = collectBareSpecifiers(props.files, collectReachableFilenames(props.files, compiled.entry));
|
|
3399
|
+
specifiers.push("vue");
|
|
3400
|
+
if (props.previewScroller === true) specifiers.push("@deot/vc");
|
|
3336
3401
|
const remote = createRemoteLoader(imports, {
|
|
3337
3402
|
vue: Vue,
|
|
3338
3403
|
vueRouter: VueRouter
|
|
3339
|
-
},
|
|
3404
|
+
}, overrides);
|
|
3340
3405
|
const loaded = await loadLocalModules(specifiers, imports, {
|
|
3341
3406
|
vue: Vue,
|
|
3342
3407
|
vueRouter: VueRouter
|
|
3343
|
-
}, (url) => remote.load(url),
|
|
3408
|
+
}, (url) => remote.load(url), overrides);
|
|
3344
3409
|
/* istanbul ignore if -- 并发编译时只保留最后一次 */
|
|
3345
3410
|
if (current !== version) return;
|
|
3346
3411
|
if (loaded.errors.length) {
|
|
@@ -3358,6 +3423,8 @@ var local_sandbox_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
|
|
|
3358
3423
|
}
|
|
3359
3424
|
pendingMount = {
|
|
3360
3425
|
component: linked.component,
|
|
3426
|
+
vue: loaded.modules.vue,
|
|
3427
|
+
scroller: props.previewScroller === true ? loaded.modules["@deot/vc"].Scroller : void 0,
|
|
3361
3428
|
css: linked.css,
|
|
3362
3429
|
version: current
|
|
3363
3430
|
};
|