@sparqjs/vite-plugin 0.2.3
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 +46 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/trusted-root-build.d.ts +12 -0
- package/dist/trusted-root-build.d.ts.map +1 -0
- package/dist/trusted-root-build.js +40 -0
- package/dist/trusted-root-build.js.map +1 -0
- package/dist/trusted-root-development.d.ts +9 -0
- package/dist/trusted-root-development.d.ts.map +1 -0
- package/dist/trusted-root-development.js +86 -0
- package/dist/trusted-root-development.js.map +1 -0
- package/dist/trusted-root-runtime.d.ts +4 -0
- package/dist/trusted-root-runtime.d.ts.map +1 -0
- package/dist/trusted-root-runtime.js +46 -0
- package/dist/trusted-root-runtime.js.map +1 -0
- package/package.json +29 -0
package/README.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# @sparqjs/vite-plugin
|
|
2
|
+
|
|
3
|
+
该包为 Sparq Trusted Root 提供统一的 Vite 开发和构建接入。它负责开发态 HMR、CSS 转发和生产构建描述;最终文件校验、SHA-256、`frontend/artifact.json` 与 Manifest 仍由 `sparq-tool` 负责。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add -D @sparqjs/vite-plugin vite
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 配置 Trusted Root
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { createSparqTrustedRoot } from '@sparqjs/vite-plugin'
|
|
15
|
+
import { defineConfig } from 'vite'
|
|
16
|
+
|
|
17
|
+
export default defineConfig({
|
|
18
|
+
plugins: [createSparqTrustedRoot()],
|
|
19
|
+
build: {
|
|
20
|
+
outDir: 'dist',
|
|
21
|
+
lib: {
|
|
22
|
+
entry: 'src/frontend.ts',
|
|
23
|
+
formats: ['es'],
|
|
24
|
+
fileName: () => 'frontend.mjs',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
})
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
开发态样式会被发送到 Admin 为当前 Root 创建的 ShadowRoot,不会写入宿主 `document.head`。正式构建会生成 `dist/.vite/sparq-root.json`,供 `sparq-tool plugin build` 复核并生成正式 Artifact。
|
|
31
|
+
|
|
32
|
+
默认 Root 是 `src/frontend.ts`。使用其他入口时显式传入:
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
createSparqTrustedRoot({ root: 'src/admin-root.ts' })
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 复用宿主 Vue
|
|
39
|
+
|
|
40
|
+
Root 直接导入 Vue 或 Vue SFC 时启用 `sharedVue`:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
createSparqTrustedRoot({ sharedVue: true })
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
插件项目仍需把 `vue` 声明为依赖。开发态导入会映射到 Admin Vue 单例,生产构建会把 `vue` 保留为 external,由宿主 Import Map 提供。只使用 `host.vue` 或不使用 Vue 的 Root 不应启用该选项,也不需要安装 Vue。
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { PluginOption } from 'vite';
|
|
2
|
+
export { sparqFrontendBuildDescriptor, sparqFrontendBuildSchema } from './trusted-root-build.js';
|
|
3
|
+
export interface SparqTrustedRootOptions {
|
|
4
|
+
root?: string;
|
|
5
|
+
/** Root 直接导入 Vue 时启用,使开发态和生产态都复用 Admin 提供的 Vue 实例。 */
|
|
6
|
+
sharedVue?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 为 Trusted Root 统一安装开发态 HMR/CSS 桥接和生产构建描述。
|
|
10
|
+
* 插件作者只维护 Root 源文件;直接导入 Vue 的 Root 通过 sharedVue 显式启用共享运行时适配。
|
|
11
|
+
*/
|
|
12
|
+
export declare function createSparqTrustedRoot(options?: SparqTrustedRootOptions): PluginOption[];
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAKxC,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAEhG,MAAM,WAAW,uBAAuB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,YAAY,EAAE,CAM5F"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createSparqTrustedRootBuild } from './trusted-root-build.js';
|
|
2
|
+
import { createSparqTrustedRootDevelopment } from './trusted-root-development.js';
|
|
3
|
+
import { createSparqTrustedRootRuntime } from './trusted-root-runtime.js';
|
|
4
|
+
export { sparqFrontendBuildDescriptor, sparqFrontendBuildSchema } from './trusted-root-build.js';
|
|
5
|
+
/**
|
|
6
|
+
* 为 Trusted Root 统一安装开发态 HMR/CSS 桥接和生产构建描述。
|
|
7
|
+
* 插件作者只维护 Root 源文件;直接导入 Vue 的 Root 通过 sharedVue 显式启用共享运行时适配。
|
|
8
|
+
*/
|
|
9
|
+
export function createSparqTrustedRoot(options = {}) {
|
|
10
|
+
return [
|
|
11
|
+
...(options.sharedVue ? [createSparqTrustedRootRuntime()] : []),
|
|
12
|
+
createSparqTrustedRootDevelopment(options),
|
|
13
|
+
createSparqTrustedRootBuild(options),
|
|
14
|
+
];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,iCAAiC,EAAE,MAAM,+BAA+B,CAAA;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAA;AAEzE,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAQhG;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAmC,EAAE;IACxE,OAAO;QACH,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,iCAAiC,CAAC,OAAO,CAAC;QAC1C,2BAA2B,CAAC,OAAO,CAAC;KACvC,CAAA;AACL,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Plugin } from 'vite';
|
|
2
|
+
export declare const sparqFrontendBuildSchema = "sparq.frontend-build/v1";
|
|
3
|
+
export declare const sparqFrontendBuildDescriptor = ".vite/sparq-root.json";
|
|
4
|
+
export interface SparqTrustedRootBuildOptions {
|
|
5
|
+
root?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 在 Vite 已经确定最终文件名后记录 Root 入口和样式。
|
|
9
|
+
* 该描述只表达构建事实,文件存在性、完整性摘要和发布清单仍由 sparq-tool 校验并生成。
|
|
10
|
+
*/
|
|
11
|
+
export declare function createSparqTrustedRootBuild(options?: SparqTrustedRootBuildOptions): Plugin;
|
|
12
|
+
//# sourceMappingURL=trusted-root-build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-root-build.d.ts","sourceRoot":"","sources":["../src/trusted-root-build.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,MAAM,CAAA;AAEjD,eAAO,MAAM,wBAAwB,4BAA4B,CAAA;AACjE,eAAO,MAAM,4BAA4B,0BAA0B,CAAA;AAEnE,MAAM,WAAW,4BAA4B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB;AAQD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,4BAAiC,GAAG,MAAM,CAoC9F"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { normalizePath } from 'vite';
|
|
3
|
+
export const sparqFrontendBuildSchema = 'sparq.frontend-build/v1';
|
|
4
|
+
export const sparqFrontendBuildDescriptor = '.vite/sparq-root.json';
|
|
5
|
+
/**
|
|
6
|
+
* 在 Vite 已经确定最终文件名后记录 Root 入口和样式。
|
|
7
|
+
* 该描述只表达构建事实,文件存在性、完整性摘要和发布清单仍由 sparq-tool 校验并生成。
|
|
8
|
+
*/
|
|
9
|
+
export function createSparqTrustedRootBuild(options = {}) {
|
|
10
|
+
const root = normalizePath(options.root ?? 'src/frontend.ts');
|
|
11
|
+
let rootFile = '';
|
|
12
|
+
return {
|
|
13
|
+
name: 'sparq-trusted-root-build',
|
|
14
|
+
apply: 'build',
|
|
15
|
+
enforce: 'post',
|
|
16
|
+
configResolved(config) {
|
|
17
|
+
rootFile = normalizePath(path.resolve(config.root, root));
|
|
18
|
+
},
|
|
19
|
+
generateBundle(_outputOptions, bundle) {
|
|
20
|
+
const entry = Object.values(bundle).find((output) => output.type === 'chunk' &&
|
|
21
|
+
output.isEntry &&
|
|
22
|
+
output.facadeModuleId !== null &&
|
|
23
|
+
normalizePath(output.facadeModuleId) === rootFile);
|
|
24
|
+
if (!entry || entry.type !== 'chunk') {
|
|
25
|
+
this.error(`Trusted Root 构建未生成 ${root} 对应的入口文件。`);
|
|
26
|
+
}
|
|
27
|
+
const descriptor = {
|
|
28
|
+
schema: sparqFrontendBuildSchema,
|
|
29
|
+
entry: entry.fileName,
|
|
30
|
+
styles: Object.values(bundle).flatMap((output) => output.type === 'asset' && output.fileName.endsWith('.css') ? [output.fileName] : []),
|
|
31
|
+
};
|
|
32
|
+
this.emitFile({
|
|
33
|
+
type: 'asset',
|
|
34
|
+
fileName: sparqFrontendBuildDescriptor,
|
|
35
|
+
source: `${JSON.stringify(descriptor, null, 2)}\n`,
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=trusted-root-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-root-build.js","sourceRoot":"","sources":["../src/trusted-root-build.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAe,MAAM,MAAM,CAAA;AAEjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,yBAAyB,CAAA;AACjE,MAAM,CAAC,MAAM,4BAA4B,GAAG,uBAAuB,CAAA;AAYnE;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,UAAwC,EAAE;IAClF,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,IAAI,iBAAiB,CAAC,CAAA;IAC7D,IAAI,QAAQ,GAAG,EAAE,CAAA;IAEjB,OAAO;QACH,IAAI,EAAE,0BAA0B;QAChC,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,MAAM;QACf,cAAc,CAAC,MAAM;YACjB,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAC7D,CAAC;QACD,cAAc,CAAC,cAAc,EAAE,MAAM;YACjC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACpC,CAAC,MAAM,EAAE,EAAE,CACP,MAAM,CAAC,IAAI,KAAK,OAAO;gBACvB,MAAM,CAAC,OAAO;gBACd,MAAM,CAAC,cAAc,KAAK,IAAI;gBAC9B,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,QAAQ,CACxD,CAAA;YACD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACnC,IAAI,CAAC,KAAK,CAAC,sBAAsB,IAAI,WAAW,CAAC,CAAA;YACrD,CAAC;YACD,MAAM,UAAU,GAAiC;gBAC7C,MAAM,EAAE,wBAAwB;gBAChC,KAAK,EAAE,KAAK,CAAC,QAAQ;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAC7C,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CACvF;aACJ,CAAA;YACD,IAAI,CAAC,QAAQ,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,4BAA4B;gBACtC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;aACrD,CAAC,CAAA;QACN,CAAC;KACJ,CAAA;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Plugin } from 'vite';
|
|
2
|
+
export declare const sparqTrustedRootUpdateEvent = "sparq:trusted-root-update";
|
|
3
|
+
export declare const sparqTrustedRootStyleEvent = "sparq:trusted-root-style";
|
|
4
|
+
export interface SparqTrustedRootDevelopmentOptions {
|
|
5
|
+
root?: string;
|
|
6
|
+
}
|
|
7
|
+
/** 为唯一 Trusted Root 接入 Vite HMR,并把依赖更新提升为 Root 重新激活事件。 */
|
|
8
|
+
export declare function createSparqTrustedRootDevelopment(options?: SparqTrustedRootDevelopmentOptions): Plugin;
|
|
9
|
+
//# sourceMappingURL=trusted-root-development.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-root-development.d.ts","sourceRoot":"","sources":["../src/trusted-root-development.ts"],"names":[],"mappings":"AACA,OAAO,EAAkC,KAAK,MAAM,EAA2C,MAAM,MAAM,CAAA;AAE3G,eAAO,MAAM,2BAA2B,8BAA8B,CAAA;AACtE,eAAO,MAAM,0BAA0B,6BAA6B,CAAA;AAEpE,MAAM,WAAW,kCAAkC;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,0DAA0D;AAC1D,wBAAgB,iCAAiC,CAAC,OAAO,GAAE,kCAAuC,GAAG,MAAM,CAgC1G"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { normalizePath } from 'vite';
|
|
3
|
+
export const sparqTrustedRootUpdateEvent = 'sparq:trusted-root-update';
|
|
4
|
+
export const sparqTrustedRootStyleEvent = 'sparq:trusted-root-style';
|
|
5
|
+
/** 为唯一 Trusted Root 接入 Vite HMR,并把依赖更新提升为 Root 重新激活事件。 */
|
|
6
|
+
export function createSparqTrustedRootDevelopment(options = {}) {
|
|
7
|
+
const root = normalizePath(options.root ?? 'src/frontend.ts');
|
|
8
|
+
let rootFile = '';
|
|
9
|
+
let rootPublicPath = '';
|
|
10
|
+
let server;
|
|
11
|
+
return {
|
|
12
|
+
name: 'sparq-trusted-root-development',
|
|
13
|
+
apply: 'serve',
|
|
14
|
+
enforce: 'post',
|
|
15
|
+
configResolved(config) {
|
|
16
|
+
rootFile = normalizePath(path.resolve(config.root, root));
|
|
17
|
+
rootPublicPath = joinPublicPath(config.base, root);
|
|
18
|
+
},
|
|
19
|
+
configureServer(currentServer) {
|
|
20
|
+
server = currentServer;
|
|
21
|
+
},
|
|
22
|
+
transform(code, id) {
|
|
23
|
+
let transformed = code;
|
|
24
|
+
if (cleanModuleID(id) === rootFile)
|
|
25
|
+
transformed = `${transformed}\n${trustedRootHotRuntime()}`;
|
|
26
|
+
transformed = trustedStyleRuntime(transformed, rootPublicPath);
|
|
27
|
+
return transformed === code ? undefined : transformed;
|
|
28
|
+
},
|
|
29
|
+
handleHotUpdate(context) {
|
|
30
|
+
if (context.modules.length > 0 && context.modules.every(isStyleModule))
|
|
31
|
+
return context.modules;
|
|
32
|
+
const rootModule = server?.moduleGraph.getModuleById(rootFile);
|
|
33
|
+
if (!rootModule || !context.modules.some((module) => reachesRoot(module, rootModule, new Set()))) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
return [rootModule];
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function joinPublicPath(base, file) {
|
|
41
|
+
const normalizedBase = base.endsWith('/') ? base : `${base}/`;
|
|
42
|
+
return `${normalizedBase}${file.replace(/^\/+/, '')}`;
|
|
43
|
+
}
|
|
44
|
+
function isStyleModule(module) {
|
|
45
|
+
const id = module.id ?? '';
|
|
46
|
+
return /\.(?:css|scss|sass|less)(?:$|\?)/.test(id) || /[?&]type=style(?:&|$)/.test(id);
|
|
47
|
+
}
|
|
48
|
+
function trustedStyleRuntime(code, rootPublicPath) {
|
|
49
|
+
// Vite 默认把 CSS 写入 document.head;Trusted Root 必须改为发送给宿主 ShadowRoot。
|
|
50
|
+
const updateCall = '__vite__updateStyle(__vite__id, __vite__css)';
|
|
51
|
+
const removeCall = 'import.meta.hot.prune(() => __vite__removeStyle(__vite__id))';
|
|
52
|
+
if (!code.includes(updateCall))
|
|
53
|
+
return code;
|
|
54
|
+
const rootURL = `new URL(${JSON.stringify(rootPublicPath)}, import.meta.url).href`;
|
|
55
|
+
const update = `window.dispatchEvent(new CustomEvent('${sparqTrustedRootStyleEvent}', { detail: { rootUrl: ${rootURL}, styleId: __vite__id, css: __vite__css } }))`;
|
|
56
|
+
const remove = `import.meta.hot.prune(() => window.dispatchEvent(new CustomEvent('${sparqTrustedRootStyleEvent}', { detail: { rootUrl: ${rootURL}, styleId: __vite__id } })))`;
|
|
57
|
+
return code.replace(updateCall, update).replace(removeCall, remove);
|
|
58
|
+
}
|
|
59
|
+
function cleanModuleID(id) {
|
|
60
|
+
return normalizePath(id.split('?', 1)[0] ?? id);
|
|
61
|
+
}
|
|
62
|
+
function reachesRoot(module, root, visited) {
|
|
63
|
+
if (module === root)
|
|
64
|
+
return true;
|
|
65
|
+
if (visited.has(module))
|
|
66
|
+
return false;
|
|
67
|
+
visited.add(module);
|
|
68
|
+
for (const importer of module.importers) {
|
|
69
|
+
if (reachesRoot(importer, root, visited))
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
function trustedRootHotRuntime() {
|
|
75
|
+
return `if (import.meta.hot) {
|
|
76
|
+
import.meta.hot.accept(() => {
|
|
77
|
+
const rootUrl = new URL(import.meta.url)
|
|
78
|
+
rootUrl.search = ''
|
|
79
|
+
rootUrl.hash = ''
|
|
80
|
+
window.dispatchEvent(new CustomEvent('${sparqTrustedRootUpdateEvent}', {
|
|
81
|
+
detail: { rootUrl: rootUrl.href, revision: Date.now().toString(36) },
|
|
82
|
+
}))
|
|
83
|
+
})
|
|
84
|
+
}`;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=trusted-root-development.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-root-development.js","sourceRoot":"","sources":["../src/trusted-root-development.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-root-runtime.d.ts","sourceRoot":"","sources":["../src/trusted-root-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAIlC,kDAAkD;AAClD,wBAAgB,6BAA6B,IAAI,MAAM,CAqBtD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
const vueModuleID = '\0sparq-admin-v1-vue';
|
|
3
|
+
/** 开发态通过 Admin 单例解析 Vue,生产构建则保留给宿主 Import Map。 */
|
|
4
|
+
export function createSparqTrustedRootRuntime() {
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const vueExports = Object.keys(require('vue')).filter(isExportName);
|
|
7
|
+
let build = false;
|
|
8
|
+
let test = false;
|
|
9
|
+
return {
|
|
10
|
+
name: 'sparq-trusted-root-runtime',
|
|
11
|
+
enforce: 'pre',
|
|
12
|
+
configResolved(config) {
|
|
13
|
+
build = config.command === 'build';
|
|
14
|
+
test = config.mode === 'test';
|
|
15
|
+
},
|
|
16
|
+
resolveId(source) {
|
|
17
|
+
if (test)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (!isVueRuntimeRequest(source))
|
|
20
|
+
return undefined;
|
|
21
|
+
return build ? { id: 'vue', external: true } : vueModuleID;
|
|
22
|
+
},
|
|
23
|
+
load(id) {
|
|
24
|
+
return id === vueModuleID ? runtimeModule(vueExports) : undefined;
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function isVueRuntimeRequest(source) {
|
|
29
|
+
const cleanSource = source.split('?', 1)[0] ?? source;
|
|
30
|
+
if (cleanSource === 'vue')
|
|
31
|
+
return true;
|
|
32
|
+
return /(?:^|[\\/])vue[\\/]dist[\\/]vue(?:\.runtime)?\.esm-bundler\.js$/.test(cleanSource);
|
|
33
|
+
}
|
|
34
|
+
function runtimeModule(vueExports) {
|
|
35
|
+
const declarations = vueExports.map((key) => `export const ${key} = runtime.${key}`).join('\n');
|
|
36
|
+
return [
|
|
37
|
+
'const runtime = globalThis.__SPARQ_ADMIN_RUNTIME__?.modules?.vue',
|
|
38
|
+
"if (!runtime) throw new Error('Sparq Admin admin-v1 runtime is not available')",
|
|
39
|
+
declarations,
|
|
40
|
+
'export default runtime',
|
|
41
|
+
].join('\n');
|
|
42
|
+
}
|
|
43
|
+
function isExportName(value) {
|
|
44
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=trusted-root-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-root-runtime.js","sourceRoot":"","sources":["../src/trusted-root-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAG3C,MAAM,WAAW,GAAG,sBAAsB,CAAA;AAE1C,kDAAkD;AAClD,MAAM,UAAU,6BAA6B;IACzC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAA4B,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IAC9F,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,IAAI,IAAI,GAAG,KAAK,CAAA;IAChB,OAAO;QACH,IAAI,EAAE,4BAA4B;QAClC,OAAO,EAAE,KAAK;QACd,cAAc,CAAC,MAAM;YACjB,KAAK,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO,CAAA;YAClC,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAA;QACjC,CAAC;QACD,SAAS,CAAC,MAAM;YACZ,IAAI,IAAI;gBAAE,OAAO,SAAS,CAAA;YAC1B,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;gBAAE,OAAO,SAAS,CAAA;YAClD,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAA;QAC9D,CAAC;QACD,IAAI,CAAC,EAAE;YACH,OAAO,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACrE,CAAC;KACJ,CAAA;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAA;IACrD,IAAI,WAAW,KAAK,KAAK;QAAE,OAAO,IAAI,CAAA;IACtC,OAAO,iEAAiE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;AAC9F,CAAC;AAED,SAAS,aAAa,CAAC,UAAoB;IACvC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,GAAG,cAAc,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/F,OAAO;QACH,kEAAkE;QAClE,gFAAgF;QAChF,YAAY;QACZ,wBAAwB;KAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IAC/B,OAAO,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACnD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sparqjs/vite-plugin",
|
|
3
|
+
"version": "0.2.3",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"peerDependencies": {
|
|
21
|
+
"vite": "^8.0.0",
|
|
22
|
+
"vue": "^3.5.0"
|
|
23
|
+
},
|
|
24
|
+
"peerDependenciesMeta": {
|
|
25
|
+
"vue": {
|
|
26
|
+
"optional": true
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|