@vetta-org/plugin-vite 0.2.1 → 0.2.2

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.d.ts CHANGED
@@ -10,7 +10,7 @@ export interface VettaPluginFederationOptions {
10
10
  entry?: string;
11
11
  manifestFileName?: string;
12
12
  remoteEntryFileName?: string;
13
- /** Share the narrow host UI contract exposed by `@vetta/theme-ui/plugin-ui`. */
13
+ /** Share the narrow host UI contract exposed by `@vetta-org/theme-ui/plugin-ui`. */
14
14
  hostThemeUi?: boolean;
15
15
  shared?: ModuleFederationOptions["shared"];
16
16
  package?: boolean | VettaPluginPackageOptions;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAInF,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,MAAM,CAAC;AAQjD,OAAO,EAAE,KAAK,+BAA+B,EAA4B,MAAM,WAAW,CAAC;AAQ3F,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,+BAA+B,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9G,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gFAAgF;IAChF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC;CAC9C;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,4BAA4B,GAAG,uBAAuB,CA6DhH;AAgID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,YAAY,EAAE,CAwB3F","sourcesContent":["import { federation, type ModuleFederationOptions } from \"@module-federation/vite\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { parsePluginManifest } from \"@vetta-org/plugin-sdk/manifest\";\nimport type { Plugin, PluginOption } from \"vite\";\nimport {\n\tcreateVettaPluginDevPlugins,\n\tisVettaPluginDevServer,\n\tVETTA_PLUGIN_DEV_ENTRY_ID,\n} from \"./dev-vite-plugins.js\";\nimport { createPluginBuildWarningFilter } from \"./build-warning-filter.js\";\nimport { createHostThemeBridgePlugin } from \"./host-theme.js\";\nimport { type CreateVettaPluginPackageOptions, createVettaPluginPackage } from \"./pack.js\";\nimport { assertPluginPermissionContract } from \"./permission-contract.js\";\nimport { createPluginStyleScopePlugin } from \"./style-scope.js\";\n\nconst SHARED_REACT_COMMONJS_BRIDGE_ID = \"virtual:vetta-plugin-shared-react-commonjs\";\nconst RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID = `\\0${SHARED_REACT_COMMONJS_BRIDGE_ID}`;\nconst STATIC_REACT_REQUIRE_PATTERN = /\\brequire\\s*\\(\\s*([\"'])react\\1\\s*\\)/gu;\n\nexport interface VettaPluginPackageOptions extends Omit<CreateVettaPluginPackageOptions, \"rootDir\" | \"distDir\"> {\n\tenabled?: boolean;\n}\n\nexport interface VettaPluginFederationOptions {\n\tname: string;\n\texpose?: string;\n\tentry?: string;\n\tmanifestFileName?: string;\n\tremoteEntryFileName?: string;\n\t/** Share the narrow host UI contract exposed by `@vetta/theme-ui/plugin-ui`. */\n\thostThemeUi?: boolean;\n\tshared?: ModuleFederationOptions[\"shared\"];\n\tpackage?: boolean | VettaPluginPackageOptions;\n}\n\nexport function createVettaPluginFederationConfig(options: VettaPluginFederationOptions): ModuleFederationOptions {\n\tconst expose = options.expose ?? \"./plugin\";\n\tconst entry = options.entry ?? \"./src/index.tsx\";\n\treturn {\n\t\tname: options.name,\n\t\tfilename: options.remoteEntryFileName ?? \"remoteEntry.js\",\n\t\texposes: {\n\t\t\t[expose]: entry,\n\t\t},\n\t\tmanifest: {\n\t\t\tfileName: options.manifestFileName ?? \"mf-manifest.json\",\n\t\t},\n\t\tdts: false,\n\t\tshared: {\n\t\t\t\"@vetta-org/plugin-sdk\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\treact: {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t\"react-dom\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// Match host plugin-shared-modules (tldraw remotes may require this subpath).\n\t\t\t\"react-dom/client\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// Host design-system primitives; runtime provided by desktop-app share scope.\n\t\t\t\"@vetta-org/ui\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// 这个包 0.1.0 之前叫 @vetta/ui。名字同时是 MF 的共享键,只留新名会让按旧名\n\t\t\t// 构建的既有插件在共享域里落空、退回自己打包的那一份(两份 React 组件实例)。\n\t\t\t\"@vetta/ui\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t...(options.hostThemeUi\n\t\t\t\t? {\n\t\t\t\t\t\t// Host-built UI components (model selector, …); opt in to keep unrelated plugins decoupled.\n\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\": {\n\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\timport: false,\n\t\t\t\t\t\t\trequiredVersion: \"*\",\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\t...options.shared,\n\t\t},\n\t};\n}\n\nfunction createBuildDefaultsPlugin(entry: string): Plugin {\n\treturn {\n\t\tname: \"vetta-plugin-build-defaults\",\n\t\tapply: \"build\",\n\t\tconfig() {\n\t\t\treturn {\n\t\t\t\t// Plugin remotes run inside the host page. Absolute asset URLs like\n\t\t\t\t// `/icon.png` resolve against the host origin (desktop-app public/), not\n\t\t\t\t// the remote. Prefer inlining small assets; large ones still go under\n\t\t\t\t// assets/ and rely on MF publicPath, but never land on host public/.\n\t\t\t\tbuild: {\n\t\t\t\t\tassetsInlineLimit: 32 * 1024,\n\t\t\t\t\trollupOptions: {\n\t\t\t\t\t\tinput: entry,\n\t\t\t\t\t\t// Host-provided singletons (see desktop-app plugin-shared-modules + vetta-host protocol).\n\t\t\t\t\t\texternal: [\n\t\t\t\t\t\t\t\"@vetta-org/plugin-sdk\",\n\t\t\t\t\t\t\t\"@vetta-org/ui\",\n\t\t\t\t\t\t\t// 旧名仍然外置:否则用旧名写的插件源码会把整个 UI 库打进产物。\n\t\t\t\t\t\t\t\"@vetta/ui\",\n\t\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\",\n\t\t\t\t\t\t],\n\t\t\t\t\t\toutput: {\n\t\t\t\t\t\t\tassetFileNames(assetInfo) {\n\t\t\t\t\t\t\t\treturn assetInfo.names.some((name) => name.endsWith(\".css\"))\n\t\t\t\t\t\t\t\t\t? \"style.css\"\n\t\t\t\t\t\t\t\t\t: \"assets/[name]-[hash][extname]\";\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpaths: {\n\t\t\t\t\t\t\t\t\"@vetta-org/plugin-sdk\": \"vetta-host://plugin-sdk\",\n\t\t\t\t\t\t\t\t\"@vetta-org/ui\": \"vetta-host://ui\",\n\t\t\t\t\t\t\t\t\"@vetta/ui\": \"vetta-host://ui\",\n\t\t\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\": \"vetta-host://theme-ui-plugin\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\n// Module Federation exposes shared React through a virtual ESM module. Routing\n// static CommonJS requires through this namespace keeps Rollup's generated\n// bindings stable when dependencies such as use-sync-external-store are bundled.\nfunction createSharedReactCommonJsBridgePlugin(): Plugin {\n\treturn {\n\t\tname: \"vetta-plugin-shared-react-commonjs-bridge\",\n\t\tapply: \"build\",\n\t\tenforce: \"pre\",\n\t\ttransform(code) {\n\t\t\tif (!code.includes(\"require\") || !code.includes(\"react\")) return;\n\t\t\tconst transformed = code.replace(\n\t\t\t\tSTATIC_REACT_REQUIRE_PATTERN,\n\t\t\t\t`require(${JSON.stringify(SHARED_REACT_COMMONJS_BRIDGE_ID)})`,\n\t\t\t);\n\t\t\tif (transformed === code) return;\n\t\t\treturn { code: transformed, map: null };\n\t\t},\n\t\tresolveId(id) {\n\t\t\tif (id === SHARED_REACT_COMMONJS_BRIDGE_ID) return RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID;\n\t\t},\n\t\tload(id) {\n\t\t\tif (id !== RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID) return;\n\t\t\treturn `import * as React from \"react\";\nexport * from \"react\";\nexport default React;\n`;\n\t\t},\n\t};\n}\n\nfunction createPackagePlugin(options: VettaPluginPackageOptions): Plugin {\n\tlet rootDir = \"\";\n\tlet distDir = \"\";\n\tlet buildFailed = false;\n\n\treturn {\n\t\tname: \"vetta-plugin-package\",\n\t\tapply: \"build\",\n\t\tbuildStart() {\n\t\t\tbuildFailed = false;\n\t\t},\n\t\tbuildEnd(error) {\n\t\t\tbuildFailed = error !== undefined;\n\t\t},\n\t\tconfigResolved(config) {\n\t\t\trootDir = config.root;\n\t\t\tdistDir = config.build.outDir;\n\t\t},\n\t\tasync closeBundle() {\n\t\t\tif (options.enabled === false || buildFailed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await createVettaPluginPackage({\n\t\t\t\t...options,\n\t\t\t\trootDir,\n\t\t\t\tdistDir,\n\t\t\t});\n\t\t\tconsole.log(`[vetta-plugin-vite] Wrote ${result.outputPath} with ${result.files.length} runtime files`);\n\t\t},\n\t};\n}\n\nfunction createPermissionContractPlugin(): Plugin {\n\tlet rootDir = \"\";\n\treturn {\n\t\tname: \"vetta-plugin-permission-contract\",\n\t\tapply: \"build\",\n\t\tconfigResolved(config) {\n\t\t\trootDir = config.root;\n\t\t},\n\t\tasync generateBundle(_outputOptions, bundle) {\n\t\t\tconst manifest = parsePluginManifest(\n\t\t\t\tJSON.parse(await readFile(resolve(rootDir, \"plugin.json\"), \"utf8\")) as unknown,\n\t\t\t);\n\t\t\tassertPluginPermissionContract(\n\t\t\t\tmanifest,\n\t\t\t\tObject.values(bundle).flatMap((output) =>\n\t\t\t\t\toutput.type === \"chunk\" ? [{ fileName: output.fileName, code: output.code }] : [],\n\t\t\t\t),\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport function vettaPluginFederation(options: VettaPluginFederationOptions): PluginOption[] {\n\tconst packageOptions = typeof options.package === \"object\" ? options.package : {};\n\tconst entry = options.entry ?? \"./src/index.tsx\";\n\tconst devServer = isVettaPluginDevServer();\n\tconst plugins: PluginOption[] = [\n\t\tcreatePluginBuildWarningFilter(),\n\t\tcreateHostThemeBridgePlugin(),\n\t\t...(devServer ? createVettaPluginDevPlugins(entry) : []),\n\t\tcreateBuildDefaultsPlugin(entry),\n\t\tcreateSharedReactCommonJsBridgePlugin(),\n\t\t...federation({\n\t\t\t...createVettaPluginFederationConfig(options),\n\t\t\texposes: {\n\t\t\t\t[options.expose ?? \"./plugin\"]: devServer ? VETTA_PLUGIN_DEV_ENTRY_ID : entry,\n\t\t\t},\n\t\t}),\n\t\tcreatePluginStyleScopePlugin(),\n\t\tcreatePermissionContractPlugin(),\n\t];\n\t// 兼容旧宿主的 build-watch 流程:增量构建时不重复打 zip。\n\tif (options.package !== false && process.env.VETTA_PLUGIN_DEV_WATCH !== \"1\") {\n\t\tplugins.push(createPackagePlugin(packageOptions));\n\t}\n\treturn plugins;\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAInF,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,MAAM,CAAC;AAQjD,OAAO,EAAE,KAAK,+BAA+B,EAA4B,MAAM,WAAW,CAAC;AAQ3F,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,+BAA+B,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9G,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC;CAC9C;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,4BAA4B,GAAG,uBAAuB,CAmEhH;AAkID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,YAAY,EAAE,CAwB3F","sourcesContent":["import { federation, type ModuleFederationOptions } from \"@module-federation/vite\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { parsePluginManifest } from \"@vetta-org/plugin-sdk/manifest\";\nimport type { Plugin, PluginOption } from \"vite\";\nimport {\n\tcreateVettaPluginDevPlugins,\n\tisVettaPluginDevServer,\n\tVETTA_PLUGIN_DEV_ENTRY_ID,\n} from \"./dev-vite-plugins.js\";\nimport { createPluginBuildWarningFilter } from \"./build-warning-filter.js\";\nimport { createHostThemeBridgePlugin } from \"./host-theme.js\";\nimport { type CreateVettaPluginPackageOptions, createVettaPluginPackage } from \"./pack.js\";\nimport { assertPluginPermissionContract } from \"./permission-contract.js\";\nimport { createPluginStyleScopePlugin } from \"./style-scope.js\";\n\nconst SHARED_REACT_COMMONJS_BRIDGE_ID = \"virtual:vetta-plugin-shared-react-commonjs\";\nconst RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID = `\\0${SHARED_REACT_COMMONJS_BRIDGE_ID}`;\nconst STATIC_REACT_REQUIRE_PATTERN = /\\brequire\\s*\\(\\s*([\"'])react\\1\\s*\\)/gu;\n\nexport interface VettaPluginPackageOptions extends Omit<CreateVettaPluginPackageOptions, \"rootDir\" | \"distDir\"> {\n\tenabled?: boolean;\n}\n\nexport interface VettaPluginFederationOptions {\n\tname: string;\n\texpose?: string;\n\tentry?: string;\n\tmanifestFileName?: string;\n\tremoteEntryFileName?: string;\n\t/** Share the narrow host UI contract exposed by `@vetta-org/theme-ui/plugin-ui`. */\n\thostThemeUi?: boolean;\n\tshared?: ModuleFederationOptions[\"shared\"];\n\tpackage?: boolean | VettaPluginPackageOptions;\n}\n\nexport function createVettaPluginFederationConfig(options: VettaPluginFederationOptions): ModuleFederationOptions {\n\tconst expose = options.expose ?? \"./plugin\";\n\tconst entry = options.entry ?? \"./src/index.tsx\";\n\treturn {\n\t\tname: options.name,\n\t\tfilename: options.remoteEntryFileName ?? \"remoteEntry.js\",\n\t\texposes: {\n\t\t\t[expose]: entry,\n\t\t},\n\t\tmanifest: {\n\t\t\tfileName: options.manifestFileName ?? \"mf-manifest.json\",\n\t\t},\n\t\tdts: false,\n\t\tshared: {\n\t\t\t\"@vetta-org/plugin-sdk\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\treact: {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t\"react-dom\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// Match host plugin-shared-modules (tldraw remotes may require this subpath).\n\t\t\t\"react-dom/client\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// Host design-system primitives; runtime provided by desktop-app share scope.\n\t\t\t\"@vetta-org/ui\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// 这个包 0.1.0 之前叫 @vetta/ui。名字同时是 MF 的共享键,只留新名会让按旧名\n\t\t\t// 构建的既有插件在共享域里落空、退回自己打包的那一份(两份 React 组件实例)。\n\t\t\t\"@vetta/ui\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t...(options.hostThemeUi\n\t\t\t\t? {\n\t\t\t\t\t\t// Host-built UI components (model selector, …); opt in to keep unrelated plugins decoupled.\n\t\t\t\t\t\t\"@vetta-org/theme-ui/plugin-ui\": {\n\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\timport: false,\n\t\t\t\t\t\t\trequiredVersion: \"*\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// 旧名,理由同 @vetta/ui:名字就是共享键,市场上已按旧名构建的插件要继续命中宿主实例。\n\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\": {\n\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\timport: false,\n\t\t\t\t\t\t\trequiredVersion: \"*\",\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\t...options.shared,\n\t\t},\n\t};\n}\n\nfunction createBuildDefaultsPlugin(entry: string): Plugin {\n\treturn {\n\t\tname: \"vetta-plugin-build-defaults\",\n\t\tapply: \"build\",\n\t\tconfig() {\n\t\t\treturn {\n\t\t\t\t// Plugin remotes run inside the host page. Absolute asset URLs like\n\t\t\t\t// `/icon.png` resolve against the host origin (desktop-app public/), not\n\t\t\t\t// the remote. Prefer inlining small assets; large ones still go under\n\t\t\t\t// assets/ and rely on MF publicPath, but never land on host public/.\n\t\t\t\tbuild: {\n\t\t\t\t\tassetsInlineLimit: 32 * 1024,\n\t\t\t\t\trollupOptions: {\n\t\t\t\t\t\tinput: entry,\n\t\t\t\t\t\t// Host-provided singletons (see desktop-app plugin-shared-modules + vetta-host protocol).\n\t\t\t\t\t\texternal: [\n\t\t\t\t\t\t\t\"@vetta-org/plugin-sdk\",\n\t\t\t\t\t\t\t\"@vetta-org/ui\",\n\t\t\t\t\t\t\t// 旧名仍然外置:否则用旧名写的插件源码会把整个 UI 库打进产物。\n\t\t\t\t\t\t\t\"@vetta/ui\",\n\t\t\t\t\t\t\t\"@vetta-org/theme-ui/plugin-ui\",\n\t\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\",\n\t\t\t\t\t\t],\n\t\t\t\t\t\toutput: {\n\t\t\t\t\t\t\tassetFileNames(assetInfo) {\n\t\t\t\t\t\t\t\treturn assetInfo.names.some((name) => name.endsWith(\".css\"))\n\t\t\t\t\t\t\t\t\t? \"style.css\"\n\t\t\t\t\t\t\t\t\t: \"assets/[name]-[hash][extname]\";\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpaths: {\n\t\t\t\t\t\t\t\t\"@vetta-org/plugin-sdk\": \"vetta-host://plugin-sdk\",\n\t\t\t\t\t\t\t\t\"@vetta-org/ui\": \"vetta-host://ui\",\n\t\t\t\t\t\t\t\t\"@vetta/ui\": \"vetta-host://ui\",\n\t\t\t\t\t\t\t\t\"@vetta-org/theme-ui/plugin-ui\": \"vetta-host://theme-ui-plugin\",\n\t\t\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\": \"vetta-host://theme-ui-plugin\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\n// Module Federation exposes shared React through a virtual ESM module. Routing\n// static CommonJS requires through this namespace keeps Rollup's generated\n// bindings stable when dependencies such as use-sync-external-store are bundled.\nfunction createSharedReactCommonJsBridgePlugin(): Plugin {\n\treturn {\n\t\tname: \"vetta-plugin-shared-react-commonjs-bridge\",\n\t\tapply: \"build\",\n\t\tenforce: \"pre\",\n\t\ttransform(code) {\n\t\t\tif (!code.includes(\"require\") || !code.includes(\"react\")) return;\n\t\t\tconst transformed = code.replace(\n\t\t\t\tSTATIC_REACT_REQUIRE_PATTERN,\n\t\t\t\t`require(${JSON.stringify(SHARED_REACT_COMMONJS_BRIDGE_ID)})`,\n\t\t\t);\n\t\t\tif (transformed === code) return;\n\t\t\treturn { code: transformed, map: null };\n\t\t},\n\t\tresolveId(id) {\n\t\t\tif (id === SHARED_REACT_COMMONJS_BRIDGE_ID) return RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID;\n\t\t},\n\t\tload(id) {\n\t\t\tif (id !== RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID) return;\n\t\t\treturn `import * as React from \"react\";\nexport * from \"react\";\nexport default React;\n`;\n\t\t},\n\t};\n}\n\nfunction createPackagePlugin(options: VettaPluginPackageOptions): Plugin {\n\tlet rootDir = \"\";\n\tlet distDir = \"\";\n\tlet buildFailed = false;\n\n\treturn {\n\t\tname: \"vetta-plugin-package\",\n\t\tapply: \"build\",\n\t\tbuildStart() {\n\t\t\tbuildFailed = false;\n\t\t},\n\t\tbuildEnd(error) {\n\t\t\tbuildFailed = error !== undefined;\n\t\t},\n\t\tconfigResolved(config) {\n\t\t\trootDir = config.root;\n\t\t\tdistDir = config.build.outDir;\n\t\t},\n\t\tasync closeBundle() {\n\t\t\tif (options.enabled === false || buildFailed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await createVettaPluginPackage({\n\t\t\t\t...options,\n\t\t\t\trootDir,\n\t\t\t\tdistDir,\n\t\t\t});\n\t\t\tconsole.log(`[vetta-plugin-vite] Wrote ${result.outputPath} with ${result.files.length} runtime files`);\n\t\t},\n\t};\n}\n\nfunction createPermissionContractPlugin(): Plugin {\n\tlet rootDir = \"\";\n\treturn {\n\t\tname: \"vetta-plugin-permission-contract\",\n\t\tapply: \"build\",\n\t\tconfigResolved(config) {\n\t\t\trootDir = config.root;\n\t\t},\n\t\tasync generateBundle(_outputOptions, bundle) {\n\t\t\tconst manifest = parsePluginManifest(\n\t\t\t\tJSON.parse(await readFile(resolve(rootDir, \"plugin.json\"), \"utf8\")) as unknown,\n\t\t\t);\n\t\t\tassertPluginPermissionContract(\n\t\t\t\tmanifest,\n\t\t\t\tObject.values(bundle).flatMap((output) =>\n\t\t\t\t\toutput.type === \"chunk\" ? [{ fileName: output.fileName, code: output.code }] : [],\n\t\t\t\t),\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport function vettaPluginFederation(options: VettaPluginFederationOptions): PluginOption[] {\n\tconst packageOptions = typeof options.package === \"object\" ? options.package : {};\n\tconst entry = options.entry ?? \"./src/index.tsx\";\n\tconst devServer = isVettaPluginDevServer();\n\tconst plugins: PluginOption[] = [\n\t\tcreatePluginBuildWarningFilter(),\n\t\tcreateHostThemeBridgePlugin(),\n\t\t...(devServer ? createVettaPluginDevPlugins(entry) : []),\n\t\tcreateBuildDefaultsPlugin(entry),\n\t\tcreateSharedReactCommonJsBridgePlugin(),\n\t\t...federation({\n\t\t\t...createVettaPluginFederationConfig(options),\n\t\t\texposes: {\n\t\t\t\t[options.expose ?? \"./plugin\"]: devServer ? VETTA_PLUGIN_DEV_ENTRY_ID : entry,\n\t\t\t},\n\t\t}),\n\t\tcreatePluginStyleScopePlugin(),\n\t\tcreatePermissionContractPlugin(),\n\t];\n\t// 兼容旧宿主的 build-watch 流程:增量构建时不重复打 zip。\n\tif (options.package !== false && process.env.VETTA_PLUGIN_DEV_WATCH !== \"1\") {\n\t\tplugins.push(createPackagePlugin(packageOptions));\n\t}\n\treturn plugins;\n}\n"]}
package/dist/index.js CHANGED
@@ -62,6 +62,12 @@ export function createVettaPluginFederationConfig(options) {
62
62
  ...(options.hostThemeUi
63
63
  ? {
64
64
  // Host-built UI components (model selector, …); opt in to keep unrelated plugins decoupled.
65
+ "@vetta-org/theme-ui/plugin-ui": {
66
+ singleton: true,
67
+ import: false,
68
+ requiredVersion: "*",
69
+ },
70
+ // 旧名,理由同 @vetta/ui:名字就是共享键,市场上已按旧名构建的插件要继续命中宿主实例。
65
71
  "@vetta/theme-ui/plugin-ui": {
66
72
  singleton: true,
67
73
  import: false,
@@ -93,6 +99,7 @@ function createBuildDefaultsPlugin(entry) {
93
99
  "@vetta-org/ui",
94
100
  // 旧名仍然外置:否则用旧名写的插件源码会把整个 UI 库打进产物。
95
101
  "@vetta/ui",
102
+ "@vetta-org/theme-ui/plugin-ui",
96
103
  "@vetta/theme-ui/plugin-ui",
97
104
  ],
98
105
  output: {
@@ -105,6 +112,7 @@ function createBuildDefaultsPlugin(entry) {
105
112
  "@vetta-org/plugin-sdk": "vetta-host://plugin-sdk",
106
113
  "@vetta-org/ui": "vetta-host://ui",
107
114
  "@vetta/ui": "vetta-host://ui",
115
+ "@vetta-org/theme-ui/plugin-ui": "vetta-host://theme-ui-plugin",
108
116
  "@vetta/theme-ui/plugin-ui": "vetta-host://theme-ui-plugin",
109
117
  },
110
118
  },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { federation, type ModuleFederationOptions } from \"@module-federation/vite\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { parsePluginManifest } from \"@vetta-org/plugin-sdk/manifest\";\nimport type { Plugin, PluginOption } from \"vite\";\nimport {\n\tcreateVettaPluginDevPlugins,\n\tisVettaPluginDevServer,\n\tVETTA_PLUGIN_DEV_ENTRY_ID,\n} from \"./dev-vite-plugins.js\";\nimport { createPluginBuildWarningFilter } from \"./build-warning-filter.js\";\nimport { createHostThemeBridgePlugin } from \"./host-theme.js\";\nimport { type CreateVettaPluginPackageOptions, createVettaPluginPackage } from \"./pack.js\";\nimport { assertPluginPermissionContract } from \"./permission-contract.js\";\nimport { createPluginStyleScopePlugin } from \"./style-scope.js\";\n\nconst SHARED_REACT_COMMONJS_BRIDGE_ID = \"virtual:vetta-plugin-shared-react-commonjs\";\nconst RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID = `\\0${SHARED_REACT_COMMONJS_BRIDGE_ID}`;\nconst STATIC_REACT_REQUIRE_PATTERN = /\\brequire\\s*\\(\\s*([\"'])react\\1\\s*\\)/gu;\n\nexport interface VettaPluginPackageOptions extends Omit<CreateVettaPluginPackageOptions, \"rootDir\" | \"distDir\"> {\n\tenabled?: boolean;\n}\n\nexport interface VettaPluginFederationOptions {\n\tname: string;\n\texpose?: string;\n\tentry?: string;\n\tmanifestFileName?: string;\n\tremoteEntryFileName?: string;\n\t/** Share the narrow host UI contract exposed by `@vetta/theme-ui/plugin-ui`. */\n\thostThemeUi?: boolean;\n\tshared?: ModuleFederationOptions[\"shared\"];\n\tpackage?: boolean | VettaPluginPackageOptions;\n}\n\nexport function createVettaPluginFederationConfig(options: VettaPluginFederationOptions): ModuleFederationOptions {\n\tconst expose = options.expose ?? \"./plugin\";\n\tconst entry = options.entry ?? \"./src/index.tsx\";\n\treturn {\n\t\tname: options.name,\n\t\tfilename: options.remoteEntryFileName ?? \"remoteEntry.js\",\n\t\texposes: {\n\t\t\t[expose]: entry,\n\t\t},\n\t\tmanifest: {\n\t\t\tfileName: options.manifestFileName ?? \"mf-manifest.json\",\n\t\t},\n\t\tdts: false,\n\t\tshared: {\n\t\t\t\"@vetta-org/plugin-sdk\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\treact: {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t\"react-dom\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// Match host plugin-shared-modules (tldraw remotes may require this subpath).\n\t\t\t\"react-dom/client\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// Host design-system primitives; runtime provided by desktop-app share scope.\n\t\t\t\"@vetta-org/ui\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// 这个包 0.1.0 之前叫 @vetta/ui。名字同时是 MF 的共享键,只留新名会让按旧名\n\t\t\t// 构建的既有插件在共享域里落空、退回自己打包的那一份(两份 React 组件实例)。\n\t\t\t\"@vetta/ui\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t...(options.hostThemeUi\n\t\t\t\t? {\n\t\t\t\t\t\t// Host-built UI components (model selector, …); opt in to keep unrelated plugins decoupled.\n\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\": {\n\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\timport: false,\n\t\t\t\t\t\t\trequiredVersion: \"*\",\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\t...options.shared,\n\t\t},\n\t};\n}\n\nfunction createBuildDefaultsPlugin(entry: string): Plugin {\n\treturn {\n\t\tname: \"vetta-plugin-build-defaults\",\n\t\tapply: \"build\",\n\t\tconfig() {\n\t\t\treturn {\n\t\t\t\t// Plugin remotes run inside the host page. Absolute asset URLs like\n\t\t\t\t// `/icon.png` resolve against the host origin (desktop-app public/), not\n\t\t\t\t// the remote. Prefer inlining small assets; large ones still go under\n\t\t\t\t// assets/ and rely on MF publicPath, but never land on host public/.\n\t\t\t\tbuild: {\n\t\t\t\t\tassetsInlineLimit: 32 * 1024,\n\t\t\t\t\trollupOptions: {\n\t\t\t\t\t\tinput: entry,\n\t\t\t\t\t\t// Host-provided singletons (see desktop-app plugin-shared-modules + vetta-host protocol).\n\t\t\t\t\t\texternal: [\n\t\t\t\t\t\t\t\"@vetta-org/plugin-sdk\",\n\t\t\t\t\t\t\t\"@vetta-org/ui\",\n\t\t\t\t\t\t\t// 旧名仍然外置:否则用旧名写的插件源码会把整个 UI 库打进产物。\n\t\t\t\t\t\t\t\"@vetta/ui\",\n\t\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\",\n\t\t\t\t\t\t],\n\t\t\t\t\t\toutput: {\n\t\t\t\t\t\t\tassetFileNames(assetInfo) {\n\t\t\t\t\t\t\t\treturn assetInfo.names.some((name) => name.endsWith(\".css\"))\n\t\t\t\t\t\t\t\t\t? \"style.css\"\n\t\t\t\t\t\t\t\t\t: \"assets/[name]-[hash][extname]\";\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpaths: {\n\t\t\t\t\t\t\t\t\"@vetta-org/plugin-sdk\": \"vetta-host://plugin-sdk\",\n\t\t\t\t\t\t\t\t\"@vetta-org/ui\": \"vetta-host://ui\",\n\t\t\t\t\t\t\t\t\"@vetta/ui\": \"vetta-host://ui\",\n\t\t\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\": \"vetta-host://theme-ui-plugin\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\n// Module Federation exposes shared React through a virtual ESM module. Routing\n// static CommonJS requires through this namespace keeps Rollup's generated\n// bindings stable when dependencies such as use-sync-external-store are bundled.\nfunction createSharedReactCommonJsBridgePlugin(): Plugin {\n\treturn {\n\t\tname: \"vetta-plugin-shared-react-commonjs-bridge\",\n\t\tapply: \"build\",\n\t\tenforce: \"pre\",\n\t\ttransform(code) {\n\t\t\tif (!code.includes(\"require\") || !code.includes(\"react\")) return;\n\t\t\tconst transformed = code.replace(\n\t\t\t\tSTATIC_REACT_REQUIRE_PATTERN,\n\t\t\t\t`require(${JSON.stringify(SHARED_REACT_COMMONJS_BRIDGE_ID)})`,\n\t\t\t);\n\t\t\tif (transformed === code) return;\n\t\t\treturn { code: transformed, map: null };\n\t\t},\n\t\tresolveId(id) {\n\t\t\tif (id === SHARED_REACT_COMMONJS_BRIDGE_ID) return RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID;\n\t\t},\n\t\tload(id) {\n\t\t\tif (id !== RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID) return;\n\t\t\treturn `import * as React from \"react\";\nexport * from \"react\";\nexport default React;\n`;\n\t\t},\n\t};\n}\n\nfunction createPackagePlugin(options: VettaPluginPackageOptions): Plugin {\n\tlet rootDir = \"\";\n\tlet distDir = \"\";\n\tlet buildFailed = false;\n\n\treturn {\n\t\tname: \"vetta-plugin-package\",\n\t\tapply: \"build\",\n\t\tbuildStart() {\n\t\t\tbuildFailed = false;\n\t\t},\n\t\tbuildEnd(error) {\n\t\t\tbuildFailed = error !== undefined;\n\t\t},\n\t\tconfigResolved(config) {\n\t\t\trootDir = config.root;\n\t\t\tdistDir = config.build.outDir;\n\t\t},\n\t\tasync closeBundle() {\n\t\t\tif (options.enabled === false || buildFailed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await createVettaPluginPackage({\n\t\t\t\t...options,\n\t\t\t\trootDir,\n\t\t\t\tdistDir,\n\t\t\t});\n\t\t\tconsole.log(`[vetta-plugin-vite] Wrote ${result.outputPath} with ${result.files.length} runtime files`);\n\t\t},\n\t};\n}\n\nfunction createPermissionContractPlugin(): Plugin {\n\tlet rootDir = \"\";\n\treturn {\n\t\tname: \"vetta-plugin-permission-contract\",\n\t\tapply: \"build\",\n\t\tconfigResolved(config) {\n\t\t\trootDir = config.root;\n\t\t},\n\t\tasync generateBundle(_outputOptions, bundle) {\n\t\t\tconst manifest = parsePluginManifest(\n\t\t\t\tJSON.parse(await readFile(resolve(rootDir, \"plugin.json\"), \"utf8\")) as unknown,\n\t\t\t);\n\t\t\tassertPluginPermissionContract(\n\t\t\t\tmanifest,\n\t\t\t\tObject.values(bundle).flatMap((output) =>\n\t\t\t\t\toutput.type === \"chunk\" ? [{ fileName: output.fileName, code: output.code }] : [],\n\t\t\t\t),\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport function vettaPluginFederation(options: VettaPluginFederationOptions): PluginOption[] {\n\tconst packageOptions = typeof options.package === \"object\" ? options.package : {};\n\tconst entry = options.entry ?? \"./src/index.tsx\";\n\tconst devServer = isVettaPluginDevServer();\n\tconst plugins: PluginOption[] = [\n\t\tcreatePluginBuildWarningFilter(),\n\t\tcreateHostThemeBridgePlugin(),\n\t\t...(devServer ? createVettaPluginDevPlugins(entry) : []),\n\t\tcreateBuildDefaultsPlugin(entry),\n\t\tcreateSharedReactCommonJsBridgePlugin(),\n\t\t...federation({\n\t\t\t...createVettaPluginFederationConfig(options),\n\t\t\texposes: {\n\t\t\t\t[options.expose ?? \"./plugin\"]: devServer ? VETTA_PLUGIN_DEV_ENTRY_ID : entry,\n\t\t\t},\n\t\t}),\n\t\tcreatePluginStyleScopePlugin(),\n\t\tcreatePermissionContractPlugin(),\n\t];\n\t// 兼容旧宿主的 build-watch 流程:增量构建时不重复打 zip。\n\tif (options.package !== false && process.env.VETTA_PLUGIN_DEV_WATCH !== \"1\") {\n\t\tplugins.push(createPackagePlugin(packageOptions));\n\t}\n\treturn plugins;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { federation, type ModuleFederationOptions } from \"@module-federation/vite\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { parsePluginManifest } from \"@vetta-org/plugin-sdk/manifest\";\nimport type { Plugin, PluginOption } from \"vite\";\nimport {\n\tcreateVettaPluginDevPlugins,\n\tisVettaPluginDevServer,\n\tVETTA_PLUGIN_DEV_ENTRY_ID,\n} from \"./dev-vite-plugins.js\";\nimport { createPluginBuildWarningFilter } from \"./build-warning-filter.js\";\nimport { createHostThemeBridgePlugin } from \"./host-theme.js\";\nimport { type CreateVettaPluginPackageOptions, createVettaPluginPackage } from \"./pack.js\";\nimport { assertPluginPermissionContract } from \"./permission-contract.js\";\nimport { createPluginStyleScopePlugin } from \"./style-scope.js\";\n\nconst SHARED_REACT_COMMONJS_BRIDGE_ID = \"virtual:vetta-plugin-shared-react-commonjs\";\nconst RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID = `\\0${SHARED_REACT_COMMONJS_BRIDGE_ID}`;\nconst STATIC_REACT_REQUIRE_PATTERN = /\\brequire\\s*\\(\\s*([\"'])react\\1\\s*\\)/gu;\n\nexport interface VettaPluginPackageOptions extends Omit<CreateVettaPluginPackageOptions, \"rootDir\" | \"distDir\"> {\n\tenabled?: boolean;\n}\n\nexport interface VettaPluginFederationOptions {\n\tname: string;\n\texpose?: string;\n\tentry?: string;\n\tmanifestFileName?: string;\n\tremoteEntryFileName?: string;\n\t/** Share the narrow host UI contract exposed by `@vetta-org/theme-ui/plugin-ui`. */\n\thostThemeUi?: boolean;\n\tshared?: ModuleFederationOptions[\"shared\"];\n\tpackage?: boolean | VettaPluginPackageOptions;\n}\n\nexport function createVettaPluginFederationConfig(options: VettaPluginFederationOptions): ModuleFederationOptions {\n\tconst expose = options.expose ?? \"./plugin\";\n\tconst entry = options.entry ?? \"./src/index.tsx\";\n\treturn {\n\t\tname: options.name,\n\t\tfilename: options.remoteEntryFileName ?? \"remoteEntry.js\",\n\t\texposes: {\n\t\t\t[expose]: entry,\n\t\t},\n\t\tmanifest: {\n\t\t\tfileName: options.manifestFileName ?? \"mf-manifest.json\",\n\t\t},\n\t\tdts: false,\n\t\tshared: {\n\t\t\t\"@vetta-org/plugin-sdk\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\treact: {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t\"react-dom\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// Match host plugin-shared-modules (tldraw remotes may require this subpath).\n\t\t\t\"react-dom/client\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// Host design-system primitives; runtime provided by desktop-app share scope.\n\t\t\t\"@vetta-org/ui\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t// 这个包 0.1.0 之前叫 @vetta/ui。名字同时是 MF 的共享键,只留新名会让按旧名\n\t\t\t// 构建的既有插件在共享域里落空、退回自己打包的那一份(两份 React 组件实例)。\n\t\t\t\"@vetta/ui\": {\n\t\t\t\tsingleton: true,\n\t\t\t\timport: false,\n\t\t\t\trequiredVersion: \"*\",\n\t\t\t},\n\t\t\t...(options.hostThemeUi\n\t\t\t\t? {\n\t\t\t\t\t\t// Host-built UI components (model selector, …); opt in to keep unrelated plugins decoupled.\n\t\t\t\t\t\t\"@vetta-org/theme-ui/plugin-ui\": {\n\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\timport: false,\n\t\t\t\t\t\t\trequiredVersion: \"*\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// 旧名,理由同 @vetta/ui:名字就是共享键,市场上已按旧名构建的插件要继续命中宿主实例。\n\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\": {\n\t\t\t\t\t\t\tsingleton: true,\n\t\t\t\t\t\t\timport: false,\n\t\t\t\t\t\t\trequiredVersion: \"*\",\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t\t...options.shared,\n\t\t},\n\t};\n}\n\nfunction createBuildDefaultsPlugin(entry: string): Plugin {\n\treturn {\n\t\tname: \"vetta-plugin-build-defaults\",\n\t\tapply: \"build\",\n\t\tconfig() {\n\t\t\treturn {\n\t\t\t\t// Plugin remotes run inside the host page. Absolute asset URLs like\n\t\t\t\t// `/icon.png` resolve against the host origin (desktop-app public/), not\n\t\t\t\t// the remote. Prefer inlining small assets; large ones still go under\n\t\t\t\t// assets/ and rely on MF publicPath, but never land on host public/.\n\t\t\t\tbuild: {\n\t\t\t\t\tassetsInlineLimit: 32 * 1024,\n\t\t\t\t\trollupOptions: {\n\t\t\t\t\t\tinput: entry,\n\t\t\t\t\t\t// Host-provided singletons (see desktop-app plugin-shared-modules + vetta-host protocol).\n\t\t\t\t\t\texternal: [\n\t\t\t\t\t\t\t\"@vetta-org/plugin-sdk\",\n\t\t\t\t\t\t\t\"@vetta-org/ui\",\n\t\t\t\t\t\t\t// 旧名仍然外置:否则用旧名写的插件源码会把整个 UI 库打进产物。\n\t\t\t\t\t\t\t\"@vetta/ui\",\n\t\t\t\t\t\t\t\"@vetta-org/theme-ui/plugin-ui\",\n\t\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\",\n\t\t\t\t\t\t],\n\t\t\t\t\t\toutput: {\n\t\t\t\t\t\t\tassetFileNames(assetInfo) {\n\t\t\t\t\t\t\t\treturn assetInfo.names.some((name) => name.endsWith(\".css\"))\n\t\t\t\t\t\t\t\t\t? \"style.css\"\n\t\t\t\t\t\t\t\t\t: \"assets/[name]-[hash][extname]\";\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpaths: {\n\t\t\t\t\t\t\t\t\"@vetta-org/plugin-sdk\": \"vetta-host://plugin-sdk\",\n\t\t\t\t\t\t\t\t\"@vetta-org/ui\": \"vetta-host://ui\",\n\t\t\t\t\t\t\t\t\"@vetta/ui\": \"vetta-host://ui\",\n\t\t\t\t\t\t\t\t\"@vetta-org/theme-ui/plugin-ui\": \"vetta-host://theme-ui-plugin\",\n\t\t\t\t\t\t\t\t\"@vetta/theme-ui/plugin-ui\": \"vetta-host://theme-ui-plugin\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t};\n}\n\n// Module Federation exposes shared React through a virtual ESM module. Routing\n// static CommonJS requires through this namespace keeps Rollup's generated\n// bindings stable when dependencies such as use-sync-external-store are bundled.\nfunction createSharedReactCommonJsBridgePlugin(): Plugin {\n\treturn {\n\t\tname: \"vetta-plugin-shared-react-commonjs-bridge\",\n\t\tapply: \"build\",\n\t\tenforce: \"pre\",\n\t\ttransform(code) {\n\t\t\tif (!code.includes(\"require\") || !code.includes(\"react\")) return;\n\t\t\tconst transformed = code.replace(\n\t\t\t\tSTATIC_REACT_REQUIRE_PATTERN,\n\t\t\t\t`require(${JSON.stringify(SHARED_REACT_COMMONJS_BRIDGE_ID)})`,\n\t\t\t);\n\t\t\tif (transformed === code) return;\n\t\t\treturn { code: transformed, map: null };\n\t\t},\n\t\tresolveId(id) {\n\t\t\tif (id === SHARED_REACT_COMMONJS_BRIDGE_ID) return RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID;\n\t\t},\n\t\tload(id) {\n\t\t\tif (id !== RESOLVED_SHARED_REACT_COMMONJS_BRIDGE_ID) return;\n\t\t\treturn `import * as React from \"react\";\nexport * from \"react\";\nexport default React;\n`;\n\t\t},\n\t};\n}\n\nfunction createPackagePlugin(options: VettaPluginPackageOptions): Plugin {\n\tlet rootDir = \"\";\n\tlet distDir = \"\";\n\tlet buildFailed = false;\n\n\treturn {\n\t\tname: \"vetta-plugin-package\",\n\t\tapply: \"build\",\n\t\tbuildStart() {\n\t\t\tbuildFailed = false;\n\t\t},\n\t\tbuildEnd(error) {\n\t\t\tbuildFailed = error !== undefined;\n\t\t},\n\t\tconfigResolved(config) {\n\t\t\trootDir = config.root;\n\t\t\tdistDir = config.build.outDir;\n\t\t},\n\t\tasync closeBundle() {\n\t\t\tif (options.enabled === false || buildFailed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await createVettaPluginPackage({\n\t\t\t\t...options,\n\t\t\t\trootDir,\n\t\t\t\tdistDir,\n\t\t\t});\n\t\t\tconsole.log(`[vetta-plugin-vite] Wrote ${result.outputPath} with ${result.files.length} runtime files`);\n\t\t},\n\t};\n}\n\nfunction createPermissionContractPlugin(): Plugin {\n\tlet rootDir = \"\";\n\treturn {\n\t\tname: \"vetta-plugin-permission-contract\",\n\t\tapply: \"build\",\n\t\tconfigResolved(config) {\n\t\t\trootDir = config.root;\n\t\t},\n\t\tasync generateBundle(_outputOptions, bundle) {\n\t\t\tconst manifest = parsePluginManifest(\n\t\t\t\tJSON.parse(await readFile(resolve(rootDir, \"plugin.json\"), \"utf8\")) as unknown,\n\t\t\t);\n\t\t\tassertPluginPermissionContract(\n\t\t\t\tmanifest,\n\t\t\t\tObject.values(bundle).flatMap((output) =>\n\t\t\t\t\toutput.type === \"chunk\" ? [{ fileName: output.fileName, code: output.code }] : [],\n\t\t\t\t),\n\t\t\t);\n\t\t},\n\t};\n}\n\nexport function vettaPluginFederation(options: VettaPluginFederationOptions): PluginOption[] {\n\tconst packageOptions = typeof options.package === \"object\" ? options.package : {};\n\tconst entry = options.entry ?? \"./src/index.tsx\";\n\tconst devServer = isVettaPluginDevServer();\n\tconst plugins: PluginOption[] = [\n\t\tcreatePluginBuildWarningFilter(),\n\t\tcreateHostThemeBridgePlugin(),\n\t\t...(devServer ? createVettaPluginDevPlugins(entry) : []),\n\t\tcreateBuildDefaultsPlugin(entry),\n\t\tcreateSharedReactCommonJsBridgePlugin(),\n\t\t...federation({\n\t\t\t...createVettaPluginFederationConfig(options),\n\t\t\texposes: {\n\t\t\t\t[options.expose ?? \"./plugin\"]: devServer ? VETTA_PLUGIN_DEV_ENTRY_ID : entry,\n\t\t\t},\n\t\t}),\n\t\tcreatePluginStyleScopePlugin(),\n\t\tcreatePermissionContractPlugin(),\n\t];\n\t// 兼容旧宿主的 build-watch 流程:增量构建时不重复打 zip。\n\tif (options.package !== false && process.env.VETTA_PLUGIN_DEV_WATCH !== \"1\") {\n\t\tplugins.push(createPackagePlugin(packageOptions));\n\t}\n\treturn plugins;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vetta-org/plugin-vite",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",