@framework-m/vite-plugin 0.3.4 → 0.3.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/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +106 -85
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.d.ts
CHANGED
|
@@ -22,4 +22,6 @@ export declare function frameworkMPlugin(options?: FrameworkMPluginOptions): Plu
|
|
|
22
22
|
export type { DiscoveredPlugin } from './scanner';
|
|
23
23
|
export { scanWorkspacePlugins } from './scanner';
|
|
24
24
|
export { generateVirtualModule } from './codegen';
|
|
25
|
+
export { generateMfeConfig } from './mfe-config';
|
|
26
|
+
export type { MfeOptions } from './mfe-config';
|
|
25
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAqCnC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAwJR;AA8ED,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAqCnC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAwJR;AA8ED,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,59 +1,79 @@
|
|
|
1
1
|
import m from "node:fs";
|
|
2
2
|
import s from "node:path";
|
|
3
|
-
import { globSync as
|
|
4
|
-
import
|
|
3
|
+
import { globSync as b } from "glob";
|
|
4
|
+
import v from "fast-glob";
|
|
5
|
+
import x from "@originjs/vite-plugin-federation";
|
|
5
6
|
async function g(n) {
|
|
6
|
-
const
|
|
7
|
-
cwd:
|
|
7
|
+
const o = n || _(process.cwd()), e = await v("**/package.json", {
|
|
8
|
+
cwd: o,
|
|
8
9
|
ignore: ["**/node_modules/**", "**/dist/**"],
|
|
9
10
|
absolute: !0
|
|
10
11
|
}), i = [];
|
|
11
|
-
for (const
|
|
12
|
+
for (const t of e)
|
|
12
13
|
try {
|
|
13
|
-
const a = m.readFileSync(
|
|
14
|
+
const a = m.readFileSync(t, "utf-8"), r = JSON.parse(a), u = r["framework-m"];
|
|
14
15
|
if (u != null && u.plugin) {
|
|
15
|
-
const
|
|
16
|
-
s.dirname(
|
|
16
|
+
const l = s.resolve(
|
|
17
|
+
s.dirname(t),
|
|
17
18
|
u.plugin
|
|
18
19
|
);
|
|
19
20
|
i.push({
|
|
20
|
-
name: r.name || s.basename(s.dirname(
|
|
21
|
-
pluginConfigPath:
|
|
21
|
+
name: r.name || s.basename(s.dirname(t)),
|
|
22
|
+
pluginConfigPath: l
|
|
22
23
|
});
|
|
23
24
|
}
|
|
24
25
|
} catch {
|
|
25
26
|
continue;
|
|
26
27
|
}
|
|
27
|
-
return i.sort((
|
|
28
|
+
return i.sort((t, a) => t.name === a.name ? t.pluginConfigPath.localeCompare(a.pluginConfigPath) : t.name.localeCompare(a.name));
|
|
28
29
|
}
|
|
29
30
|
function _(n) {
|
|
30
|
-
let
|
|
31
|
+
let o = n;
|
|
31
32
|
for (; ; ) {
|
|
32
|
-
if (m.existsSync(s.join(
|
|
33
|
-
return
|
|
34
|
-
const
|
|
35
|
-
if (
|
|
36
|
-
|
|
33
|
+
if (m.existsSync(s.join(o, "pnpm-workspace.yaml")))
|
|
34
|
+
return o;
|
|
35
|
+
const e = s.dirname(o);
|
|
36
|
+
if (e === o) break;
|
|
37
|
+
o = e;
|
|
37
38
|
}
|
|
38
39
|
return n;
|
|
39
40
|
}
|
|
40
|
-
function
|
|
41
|
+
function O(n) {
|
|
41
42
|
if (n.length === 0)
|
|
42
43
|
return `export default [];
|
|
43
44
|
`;
|
|
44
|
-
const
|
|
45
|
-
`),
|
|
46
|
-
return `${
|
|
47
|
-
export default [${
|
|
45
|
+
const o = n.map((i, t) => `import plugin${t} from '${i.pluginConfigPath}';`).join(`
|
|
46
|
+
`), e = n.map((i, t) => `plugin${t}`).join(", ");
|
|
47
|
+
return `${o}
|
|
48
|
+
export default [${e}];
|
|
48
49
|
`;
|
|
49
50
|
}
|
|
50
|
-
|
|
51
|
+
function N(n) {
|
|
52
|
+
return {
|
|
53
|
+
build: {
|
|
54
|
+
target: "esnext",
|
|
55
|
+
minify: !1,
|
|
56
|
+
cssCodeSplit: !1
|
|
57
|
+
},
|
|
58
|
+
plugins: [
|
|
59
|
+
x({
|
|
60
|
+
name: n.name,
|
|
61
|
+
filename: "remoteEntry.js",
|
|
62
|
+
exposes: {
|
|
63
|
+
"./remoteEntry": n.entry
|
|
64
|
+
},
|
|
65
|
+
shared: n.shared || []
|
|
66
|
+
})
|
|
67
|
+
]
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const E = "virtual:framework-m-plugins", f = "\0virtual:framework-m-plugins";
|
|
51
71
|
function D() {
|
|
52
|
-
var
|
|
53
|
-
const n = globalThis.process,
|
|
54
|
-
return typeof
|
|
72
|
+
var e, i;
|
|
73
|
+
const n = globalThis.process, o = ((e = n == null ? void 0 : n.env) == null ? void 0 : e.FRAMEWORK_M_VITE_PLUGIN_DEBUG) ?? ((i = n == null ? void 0 : n.env) == null ? void 0 : i.FRAMEWORK_M_DEBUG);
|
|
74
|
+
return typeof o == "string" ? ["1", "true", "yes", "on"].includes(o.toLowerCase()) : !1;
|
|
55
75
|
}
|
|
56
|
-
const
|
|
76
|
+
const c = {
|
|
57
77
|
info(n) {
|
|
58
78
|
console.info(`[framework-m/vite-plugin] ${n}`);
|
|
59
79
|
},
|
|
@@ -61,24 +81,24 @@ const l = {
|
|
|
61
81
|
D() && console.info(`[framework-m/vite-plugin] ${n}`);
|
|
62
82
|
}
|
|
63
83
|
};
|
|
64
|
-
function
|
|
65
|
-
let
|
|
84
|
+
function J(n = {}) {
|
|
85
|
+
let o = [], e = [], i = [];
|
|
66
86
|
return {
|
|
67
87
|
name: "framework-m-plugin",
|
|
68
|
-
async config(
|
|
69
|
-
var
|
|
70
|
-
|
|
71
|
-
const a = (h = (
|
|
88
|
+
async config(t) {
|
|
89
|
+
var l, h;
|
|
90
|
+
o = p(n.root), e = await g(n.root), i = d(e);
|
|
91
|
+
const a = (h = (l = t.build) == null ? void 0 : l.rollupOptions) == null ? void 0 : h.output, u = (Array.isArray(a) ? a : [a ?? {}]).map((k) => {
|
|
72
92
|
const w = k.manualChunks;
|
|
73
93
|
return {
|
|
74
94
|
...k,
|
|
75
95
|
manualChunks(C, M) {
|
|
76
|
-
const
|
|
96
|
+
const y = A(
|
|
77
97
|
C,
|
|
78
98
|
i
|
|
79
99
|
);
|
|
80
|
-
if (
|
|
81
|
-
return
|
|
100
|
+
if (y)
|
|
101
|
+
return y;
|
|
82
102
|
if (typeof w == "function")
|
|
83
103
|
return w(C, M);
|
|
84
104
|
}
|
|
@@ -96,106 +116,107 @@ function S(n = {}) {
|
|
|
96
116
|
* Discover plugins at build start.
|
|
97
117
|
*/
|
|
98
118
|
async buildStart() {
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
const a =
|
|
102
|
-
if (
|
|
103
|
-
|
|
104
|
-
),
|
|
105
|
-
|
|
106
|
-
`✓ Discovered ${
|
|
119
|
+
const t = n.root;
|
|
120
|
+
o = p(t), e = await g(t), i = d(e);
|
|
121
|
+
const a = e.map((r) => r.name).join(", ");
|
|
122
|
+
if (c.info(
|
|
123
|
+
e.length > 0 ? `Discovered ${e.length} Framework M plugin(s): ${a}` : "Discovered 0 Framework M plugins"
|
|
124
|
+
), e.length > 0) {
|
|
125
|
+
c.debug(
|
|
126
|
+
`✓ Discovered ${e.length} Framework M plugin(s):`
|
|
107
127
|
);
|
|
108
|
-
for (const r of
|
|
109
|
-
|
|
128
|
+
for (const r of e)
|
|
129
|
+
c.debug(` - ${r.name}`);
|
|
110
130
|
} else
|
|
111
|
-
|
|
131
|
+
c.debug("ℹ No Framework M plugins found in workspace");
|
|
112
132
|
},
|
|
113
133
|
/**
|
|
114
134
|
* Resolve the virtual module ID.
|
|
115
135
|
*/
|
|
116
|
-
resolveId(
|
|
117
|
-
if (
|
|
136
|
+
resolveId(t) {
|
|
137
|
+
if (t === E)
|
|
118
138
|
return f;
|
|
119
139
|
},
|
|
120
140
|
/**
|
|
121
141
|
* Load the virtual module — generate code with all plugin imports.
|
|
122
142
|
*/
|
|
123
|
-
load(
|
|
124
|
-
if (
|
|
125
|
-
return
|
|
143
|
+
load(t) {
|
|
144
|
+
if (t === f)
|
|
145
|
+
return O(e);
|
|
126
146
|
},
|
|
127
147
|
/**
|
|
128
148
|
* HMR: Watch plugin config files for changes.
|
|
129
149
|
*/
|
|
130
|
-
configureServer(
|
|
150
|
+
configureServer(t) {
|
|
151
|
+
for (const r of e)
|
|
152
|
+
t.watcher.add(r.pluginConfigPath);
|
|
131
153
|
for (const r of o)
|
|
132
|
-
|
|
133
|
-
for (const r of t)
|
|
134
|
-
e.watcher.add(r);
|
|
154
|
+
t.watcher.add(r);
|
|
135
155
|
const a = async () => {
|
|
136
|
-
|
|
156
|
+
o = p(n.root), e = await g(n.root), i = d(e);
|
|
157
|
+
for (const u of e)
|
|
158
|
+
t.watcher.add(u.pluginConfigPath);
|
|
137
159
|
for (const u of o)
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
e.watcher.add(u);
|
|
141
|
-
const r = e.moduleGraph.getModuleById(
|
|
160
|
+
t.watcher.add(u);
|
|
161
|
+
const r = t.moduleGraph.getModuleById(
|
|
142
162
|
f
|
|
143
163
|
);
|
|
144
|
-
r &&
|
|
164
|
+
r && t.moduleGraph.invalidateModule(r), c.info("Plugin configuration changed, triggering reload"), t.ws.send({ type: "full-reload" });
|
|
145
165
|
};
|
|
146
|
-
|
|
147
|
-
(r.includes("plugin.config.") ||
|
|
148
|
-
(
|
|
166
|
+
t.watcher.on("change", (r) => {
|
|
167
|
+
(r.includes("plugin.config.") || o.includes(r) || e.some(
|
|
168
|
+
(l) => l.pluginConfigPath === r
|
|
149
169
|
)) && a();
|
|
150
170
|
});
|
|
151
171
|
}
|
|
152
172
|
};
|
|
153
173
|
}
|
|
154
174
|
function p(n) {
|
|
155
|
-
var
|
|
156
|
-
const
|
|
157
|
-
cwd:
|
|
175
|
+
var t;
|
|
176
|
+
const o = n ?? process.cwd(), e = b("**/package.json", {
|
|
177
|
+
cwd: o,
|
|
158
178
|
absolute: !0,
|
|
159
179
|
nodir: !0,
|
|
160
180
|
ignore: ["**/node_modules/**", "**/dist/**"]
|
|
161
181
|
}), i = [];
|
|
162
|
-
for (const a of
|
|
182
|
+
for (const a of e)
|
|
163
183
|
try {
|
|
164
|
-
const r = m.readFileSync(a, "utf8"),
|
|
165
|
-
if (typeof
|
|
184
|
+
const r = m.readFileSync(a, "utf8"), l = (t = JSON.parse(r)["framework-m"]) == null ? void 0 : t.plugin;
|
|
185
|
+
if (typeof l != "string")
|
|
166
186
|
continue;
|
|
167
187
|
i.push(
|
|
168
|
-
s.resolve(s.dirname(a),
|
|
188
|
+
s.resolve(s.dirname(a), l)
|
|
169
189
|
);
|
|
170
190
|
} catch {
|
|
171
191
|
}
|
|
172
192
|
return i.sort((a, r) => a.localeCompare(r));
|
|
173
193
|
}
|
|
174
|
-
function
|
|
194
|
+
function P(n) {
|
|
175
195
|
return n.split("?")[0].split(s.sep).join("/");
|
|
176
196
|
}
|
|
177
197
|
function R(n) {
|
|
178
|
-
const
|
|
179
|
-
return
|
|
198
|
+
const o = s.dirname(n), e = s.basename(o);
|
|
199
|
+
return e === "src" || e === "dist" ? s.dirname(o) : o;
|
|
180
200
|
}
|
|
181
201
|
function $(n) {
|
|
182
202
|
return (n.split("/").pop() || n).replaceAll(/[^a-zA-Z0-9_-]/g, "-").toLowerCase();
|
|
183
203
|
}
|
|
184
204
|
function d(n) {
|
|
185
|
-
return n.map((
|
|
186
|
-
prefix:
|
|
187
|
-
chunkName: $(
|
|
188
|
-
})).sort((
|
|
205
|
+
return n.map((o) => ({
|
|
206
|
+
prefix: P(R(o.pluginConfigPath)) + "/",
|
|
207
|
+
chunkName: $(o.name)
|
|
208
|
+
})).sort((o, e) => e.prefix.length - o.prefix.length);
|
|
189
209
|
}
|
|
190
|
-
function A(n,
|
|
191
|
-
const
|
|
192
|
-
for (const i of
|
|
193
|
-
if (
|
|
210
|
+
function A(n, o) {
|
|
211
|
+
const e = P(n);
|
|
212
|
+
for (const i of o)
|
|
213
|
+
if (e.startsWith(i.prefix))
|
|
194
214
|
return i.chunkName;
|
|
195
215
|
}
|
|
196
216
|
export {
|
|
197
|
-
|
|
198
|
-
|
|
217
|
+
J as frameworkMPlugin,
|
|
218
|
+
N as generateMfeConfig,
|
|
219
|
+
O as generateVirtualModule,
|
|
199
220
|
g as scanWorkspacePlugins
|
|
200
221
|
};
|
|
201
222
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/scanner.ts","../src/codegen.ts","../src/index.ts"],"sourcesContent":["/**\n * Workspace Scanner\n *\n * Scans the monorepo workspace for packages that have \"framework-m\"\n * metadata in their package.json, indicating they are frontend plugins.\n *\n * A plugin package.json looks like:\n * ```json\n * {\n * \"name\": \"@my-company/wms\",\n * \"framework-m\": {\n * \"plugin\": \"./src/plugin.config.ts\",\n * \"type\": \"frontend-module\"\n * }\n * }\n * ```\n */\n\nimport fg from \"fast-glob\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Represents a discovered Framework M plugin in the workspace.\n */\nexport interface DiscoveredPlugin {\n /** Package name from package.json */\n name: string;\n /** Absolute path to the plugin config file */\n pluginConfigPath: string;\n}\n\n/**\n * Scan the workspace for packages with \"framework-m\" plugin metadata.\n *\n * @param root — workspace root directory to scan\n * @returns Array of discovered plugins with their config paths\n */\nexport async function scanWorkspacePlugins(\n root?: string,\n): Promise<DiscoveredPlugin[]> {\n // Find workspace root by looking for pnpm-workspace.yaml\n const scanRoot = root || findWorkspaceRoot(process.cwd());\n\n // Find all package.json files, excluding node_modules and dist\n const packageJsonPaths = await fg(\"**/package.json\", {\n cwd: scanRoot,\n ignore: [\"**/node_modules/**\", \"**/dist/**\"],\n absolute: true,\n });\n\n const plugins: DiscoveredPlugin[] = [];\n\n for (const pkgPath of packageJsonPaths) {\n try {\n const content = fs.readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content) as Record<string, unknown>;\n\n // Check for framework-m plugin metadata\n const frameworkM = pkg[\"framework-m\"] as\n | { plugin?: string; type?: string }\n | undefined;\n\n if (frameworkM?.plugin) {\n const pluginConfigPath = path.resolve(\n path.dirname(pkgPath),\n frameworkM.plugin,\n );\n\n plugins.push({\n name: (pkg.name as string) || path.basename(path.dirname(pkgPath)),\n pluginConfigPath,\n });\n }\n } catch {\n // Skip unreadable or malformed package.json files\n continue;\n }\n }\n\n return plugins.sort((a, b) => {\n if (a.name === b.name) {\n return a.pluginConfigPath.localeCompare(b.pluginConfigPath);\n }\n return a.name.localeCompare(b.name);\n });\n}\n\n/**\n * Walk up from startDir to find the workspace root (directory containing pnpm-workspace.yaml).\n * Falls back to startDir if not found.\n */\nfunction findWorkspaceRoot(startDir: string): string {\n let dir = startDir;\n while (true) {\n if (fs.existsSync(path.join(dir, \"pnpm-workspace.yaml\"))) {\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break; // reached filesystem root\n dir = parent;\n }\n return startDir; // fallback\n}\n","/**\n * Virtual Module Code Generator\n *\n * Generates the code for the `virtual:framework-m-plugins` virtual module.\n * This module imports all discovered plugin configs and exports them as an array.\n *\n * Generated output looks like:\n * ```js\n * import plugin0 from '/workspace/apps/wms/frontend/src/plugin.config.ts';\n * import plugin1 from '/workspace/apps/hr/frontend/src/plugin.config.ts';\n * export default [plugin0, plugin1];\n * ```\n */\n\nimport type { DiscoveredPlugin } from \"./scanner\";\n\n/**\n * Generate the virtual module source code for all discovered plugins.\n *\n * @param plugins — discovered plugins from workspace scanning\n * @returns JavaScript/TypeScript source code string\n */\nexport function generateVirtualModule(plugins: DiscoveredPlugin[]): string {\n if (plugins.length === 0) {\n return \"export default [];\\n\";\n }\n\n const imports = plugins\n .map((p, i) => `import plugin${i} from '${p.pluginConfigPath}';`)\n .join(\"\\n\");\n\n const exportNames = plugins.map((_, i) => `plugin${i}`).join(\", \");\n\n return `${imports}\\nexport default [${exportNames}];\\n`;\n}\n","/**\n * @framework-m/vite-plugin\n *\n * Vite plugin for Framework M plugin auto-discovery and bundling.\n *\n * Scans the workspace for packages with \"framework-m\" metadata in their\n * package.json and generates a virtual module that imports all plugin\n * configs. The shell app can then import this virtual module to\n * bootstrap all plugins automatically.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { frameworkMPlugin } from \"@framework-m/vite-plugin\";\n *\n * export default defineConfig({\n * plugins: [frameworkMPlugin()],\n * });\n * ```\n *\n * @example\n * ```ts\n * // In shell app:\n * // @ts-ignore - Virtual module generated by Vite plugin\n * import discoveredPlugins from \"virtual:framework-m-plugins\";\n *\n * for (const plugin of discoveredPlugins) {\n * await registry.register(plugin);\n * }\n * ```\n */\n\nimport type { Plugin } from \"vite\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { globSync } from \"glob\";\nimport { scanWorkspacePlugins } from \"./scanner\";\nimport { generateVirtualModule } from \"./codegen\";\nimport type { DiscoveredPlugin } from \"./scanner\";\n\nconst VIRTUAL_MODULE_ID = \"virtual:framework-m-plugins\";\nconst RESOLVED_VIRTUAL_MODULE_ID = \"\\0virtual:framework-m-plugins\";\n\nfunction isDebugEnabled(): boolean {\n const processRef = (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process;\n const envFlag =\n processRef?.env?.FRAMEWORK_M_VITE_PLUGIN_DEBUG ??\n processRef?.env?.FRAMEWORK_M_DEBUG;\n\n if (typeof envFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(envFlag.toLowerCase());\n }\n\n return false;\n}\n\nconst pluginLogger = {\n info(message: string): void {\n console.info(`[framework-m/vite-plugin] ${message}`);\n },\n debug(message: string): void {\n if (isDebugEnabled()) {\n console.info(`[framework-m/vite-plugin] ${message}`);\n }\n },\n};\n\n/**\n * Options for the Framework M Vite plugin.\n */\nexport interface FrameworkMPluginOptions {\n /**\n * Root directory to scan for plugins. Defaults to process.cwd().\n */\n root?: string;\n}\n\n/**\n * Create the Framework M Vite plugin.\n *\n * This plugin:\n * 1. Scans the workspace at build time for packages with \"framework-m\"\n * metadata in their package.json\n * 2. Generates a virtual module `virtual:framework-m-plugins` that imports\n * all discovered plugin configs\n * 3. The shell app imports this virtual module to auto-register all plugins\n */\nexport function frameworkMPlugin(\n options: FrameworkMPluginOptions = {},\n): Plugin {\n let pluginPaths: string[] = [];\n let discoveredPlugins: DiscoveredPlugin[] = [];\n let pluginChunkMatchers: Array<{ prefix: string; chunkName: string }> = [];\n\n return {\n name: \"framework-m-plugin\",\n\n async config(userConfig) {\n pluginPaths = discoverPluginConfigPaths(options.root);\n discoveredPlugins = await scanWorkspacePlugins(options.root);\n pluginChunkMatchers = createPluginChunkMatchers(discoveredPlugins);\n\n const existingOutput = userConfig.build?.rollupOptions?.output;\n const existingOutputs = Array.isArray(existingOutput)\n ? existingOutput\n : [existingOutput ?? {}];\n\n const mergedOutputs = existingOutputs.map(output => {\n const existingManualChunks = output.manualChunks;\n\n return {\n ...output,\n manualChunks(id: string, meta: unknown) {\n const pluginChunk = findPluginChunkForModule(\n id,\n pluginChunkMatchers,\n );\n if (pluginChunk) {\n return pluginChunk;\n }\n\n if (typeof existingManualChunks === \"function\") {\n return (\n existingManualChunks as (\n id: string,\n meta: unknown,\n ) => string | undefined\n )(id, meta);\n }\n\n return undefined;\n },\n };\n });\n\n return {\n build: {\n rollupOptions: {\n output: Array.isArray(existingOutput)\n ? mergedOutputs\n : mergedOutputs[0],\n },\n },\n };\n },\n\n /**\n * Discover plugins at build start.\n */\n async buildStart() {\n const root = options.root;\n pluginPaths = discoverPluginConfigPaths(root);\n discoveredPlugins = await scanWorkspacePlugins(root);\n pluginChunkMatchers = createPluginChunkMatchers(discoveredPlugins);\n\n const pluginNames = discoveredPlugins.map(p => p.name).join(\", \");\n pluginLogger.info(\n discoveredPlugins.length > 0\n ? `Discovered ${discoveredPlugins.length} Framework M plugin(s): ${pluginNames}`\n : \"Discovered 0 Framework M plugins\",\n );\n\n if (discoveredPlugins.length > 0) {\n pluginLogger.debug(\n `✓ Discovered ${discoveredPlugins.length} Framework M plugin(s):`,\n );\n for (const p of discoveredPlugins) {\n pluginLogger.debug(` - ${p.name}`);\n }\n } else {\n pluginLogger.debug(\"ℹ No Framework M plugins found in workspace\");\n }\n },\n\n /**\n * Resolve the virtual module ID.\n */\n resolveId(id: string) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID;\n }\n return undefined;\n },\n\n /**\n * Load the virtual module — generate code with all plugin imports.\n */\n load(id: string) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n return generateVirtualModule(discoveredPlugins);\n }\n return undefined;\n },\n\n /**\n * HMR: Watch plugin config files for changes.\n */\n configureServer(server) {\n // Watch all discovered plugin config files\n for (const plugin of discoveredPlugins) {\n server.watcher.add(plugin.pluginConfigPath);\n }\n for (const pluginConfigPath of pluginPaths) {\n server.watcher.add(pluginConfigPath);\n }\n\n const refreshPlugins = async () => {\n pluginPaths = discoverPluginConfigPaths(options.root);\n discoveredPlugins = await scanWorkspacePlugins(options.root);\n pluginChunkMatchers = createPluginChunkMatchers(discoveredPlugins);\n for (const plugin of discoveredPlugins) {\n server.watcher.add(plugin.pluginConfigPath);\n }\n for (const pluginConfigPath of pluginPaths) {\n server.watcher.add(pluginConfigPath);\n }\n\n const virtualModule = server.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_MODULE_ID,\n );\n if (virtualModule) {\n server.moduleGraph.invalidateModule(virtualModule);\n }\n\n pluginLogger.info(\"Plugin configuration changed, triggering reload\");\n server.ws.send({ type: \"full-reload\" });\n };\n\n server.watcher.on(\"change\", filePath => {\n const shouldRefresh =\n filePath.includes(\"plugin.config.\") ||\n pluginPaths.includes(filePath) ||\n discoveredPlugins.some(\n plugin => plugin.pluginConfigPath === filePath,\n );\n if (shouldRefresh) {\n void refreshPlugins();\n }\n });\n },\n };\n}\n\nfunction discoverPluginConfigPaths(root?: string): string[] {\n const workspaceRoot = root ?? process.cwd();\n const packageJsonPaths = globSync(\"**/package.json\", {\n cwd: workspaceRoot,\n absolute: true,\n nodir: true,\n ignore: [\"**/node_modules/**\", \"**/dist/**\"],\n });\n\n const pluginPaths: string[] = [];\n for (const packageJsonPath of packageJsonPaths) {\n try {\n const packageRaw = fs.readFileSync(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(packageRaw) as {\n \"framework-m\"?: { plugin?: unknown };\n };\n\n const pluginConfig = packageJson[\"framework-m\"]?.plugin;\n if (typeof pluginConfig !== \"string\") {\n continue;\n }\n\n pluginPaths.push(\n path.resolve(path.dirname(packageJsonPath), pluginConfig),\n );\n } catch {\n // Ignore invalid package.json files and continue scanning.\n }\n }\n\n return pluginPaths.sort((a, b) => a.localeCompare(b));\n}\n\nfunction normalizeModuleId(id: string): string {\n return id.split(\"?\")[0].split(path.sep).join(\"/\");\n}\n\nfunction inferPluginRoot(pluginConfigPath: string): string {\n const configDir = path.dirname(pluginConfigPath);\n const base = path.basename(configDir);\n if (base === \"src\" || base === \"dist\") {\n return path.dirname(configDir);\n }\n return configDir;\n}\n\nfunction toChunkName(pluginName: string): string {\n const tail = pluginName.split(\"/\").pop() || pluginName;\n return tail.replaceAll(/[^a-zA-Z0-9_-]/g, \"-\").toLowerCase();\n}\n\nfunction createPluginChunkMatchers(\n plugins: DiscoveredPlugin[],\n): Array<{ prefix: string; chunkName: string }> {\n return plugins\n .map(plugin => ({\n prefix: normalizeModuleId(inferPluginRoot(plugin.pluginConfigPath)) + \"/\",\n chunkName: toChunkName(plugin.name),\n }))\n .sort((a, b) => b.prefix.length - a.prefix.length);\n}\n\nfunction findPluginChunkForModule(\n id: string,\n matchers: Array<{ prefix: string; chunkName: string }>,\n): string | undefined {\n const normalizedId = normalizeModuleId(id);\n for (const matcher of matchers) {\n if (normalizedId.startsWith(matcher.prefix)) {\n return matcher.chunkName;\n }\n }\n return undefined;\n}\n\n// Re-export types and utilities\nexport type { DiscoveredPlugin } from \"./scanner\";\nexport { scanWorkspacePlugins } from \"./scanner\";\nexport { generateVirtualModule } from \"./codegen\";\n"],"names":["scanWorkspacePlugins","root","scanRoot","findWorkspaceRoot","packageJsonPaths","fg","plugins","pkgPath","content","fs","pkg","frameworkM","pluginConfigPath","path","a","b","startDir","dir","parent","generateVirtualModule","imports","p","i","exportNames","_","VIRTUAL_MODULE_ID","RESOLVED_VIRTUAL_MODULE_ID","isDebugEnabled","processRef","envFlag","_a","_b","pluginLogger","message","frameworkMPlugin","options","pluginPaths","discoveredPlugins","pluginChunkMatchers","userConfig","discoverPluginConfigPaths","createPluginChunkMatchers","existingOutput","mergedOutputs","output","existingManualChunks","id","meta","pluginChunk","findPluginChunkForModule","pluginNames","server","plugin","refreshPlugins","virtualModule","filePath","workspaceRoot","globSync","packageJsonPath","packageRaw","pluginConfig","normalizeModuleId","inferPluginRoot","configDir","base","toChunkName","pluginName","matchers","normalizedId","matcher"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/scanner.ts","../src/codegen.ts","../src/mfe-config.ts","../src/index.ts"],"sourcesContent":["/**\n * Workspace Scanner\n *\n * Scans the monorepo workspace for packages that have \"framework-m\"\n * metadata in their package.json, indicating they are frontend plugins.\n *\n * A plugin package.json looks like:\n * ```json\n * {\n * \"name\": \"@my-company/wms\",\n * \"framework-m\": {\n * \"plugin\": \"./src/plugin.config.ts\",\n * \"type\": \"frontend-module\"\n * }\n * }\n * ```\n */\n\nimport fg from \"fast-glob\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Represents a discovered Framework M plugin in the workspace.\n */\nexport interface DiscoveredPlugin {\n /** Package name from package.json */\n name: string;\n /** Absolute path to the plugin config file */\n pluginConfigPath: string;\n}\n\n/**\n * Scan the workspace for packages with \"framework-m\" plugin metadata.\n *\n * @param root — workspace root directory to scan\n * @returns Array of discovered plugins with their config paths\n */\nexport async function scanWorkspacePlugins(\n root?: string,\n): Promise<DiscoveredPlugin[]> {\n // Find workspace root by looking for pnpm-workspace.yaml\n const scanRoot = root || findWorkspaceRoot(process.cwd());\n\n // Find all package.json files, excluding node_modules and dist\n const packageJsonPaths = await fg(\"**/package.json\", {\n cwd: scanRoot,\n ignore: [\"**/node_modules/**\", \"**/dist/**\"],\n absolute: true,\n });\n\n const plugins: DiscoveredPlugin[] = [];\n\n for (const pkgPath of packageJsonPaths) {\n try {\n const content = fs.readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content) as Record<string, unknown>;\n\n // Check for framework-m plugin metadata\n const frameworkM = pkg[\"framework-m\"] as\n | { plugin?: string; type?: string }\n | undefined;\n\n if (frameworkM?.plugin) {\n const pluginConfigPath = path.resolve(\n path.dirname(pkgPath),\n frameworkM.plugin,\n );\n\n plugins.push({\n name: (pkg.name as string) || path.basename(path.dirname(pkgPath)),\n pluginConfigPath,\n });\n }\n } catch {\n // Skip unreadable or malformed package.json files\n continue;\n }\n }\n\n return plugins.sort((a, b) => {\n if (a.name === b.name) {\n return a.pluginConfigPath.localeCompare(b.pluginConfigPath);\n }\n return a.name.localeCompare(b.name);\n });\n}\n\n/**\n * Walk up from startDir to find the workspace root (directory containing pnpm-workspace.yaml).\n * Falls back to startDir if not found.\n */\nfunction findWorkspaceRoot(startDir: string): string {\n let dir = startDir;\n while (true) {\n if (fs.existsSync(path.join(dir, \"pnpm-workspace.yaml\"))) {\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break; // reached filesystem root\n dir = parent;\n }\n return startDir; // fallback\n}\n","/**\n * Virtual Module Code Generator\n *\n * Generates the code for the `virtual:framework-m-plugins` virtual module.\n * This module imports all discovered plugin configs and exports them as an array.\n *\n * Generated output looks like:\n * ```js\n * import plugin0 from '/workspace/apps/wms/frontend/src/plugin.config.ts';\n * import plugin1 from '/workspace/apps/hr/frontend/src/plugin.config.ts';\n * export default [plugin0, plugin1];\n * ```\n */\n\nimport type { DiscoveredPlugin } from \"./scanner\";\n\n/**\n * Generate the virtual module source code for all discovered plugins.\n *\n * @param plugins — discovered plugins from workspace scanning\n * @returns JavaScript/TypeScript source code string\n */\nexport function generateVirtualModule(plugins: DiscoveredPlugin[]): string {\n if (plugins.length === 0) {\n return \"export default [];\\n\";\n }\n\n const imports = plugins\n .map((p, i) => `import plugin${i} from '${p.pluginConfigPath}';`)\n .join(\"\\n\");\n\n const exportNames = plugins.map((_, i) => `plugin${i}`).join(\", \");\n\n return `${imports}\\nexport default [${exportNames}];\\n`;\n}\n","import type { UserConfig } from \"vite\";\nimport federation from \"@originjs/vite-plugin-federation\";\n\nexport interface MfeOptions {\n name: string;\n entry: string;\n shared?: string[];\n}\n\nexport function generateMfeConfig(options: MfeOptions): UserConfig {\n return {\n build: {\n target: \"esnext\",\n minify: false,\n cssCodeSplit: false,\n },\n plugins: [\n federation({\n name: options.name,\n filename: \"remoteEntry.js\",\n exposes: {\n \"./remoteEntry\": options.entry,\n },\n shared: options.shared || [],\n }),\n ],\n };\n}\n","/**\n * @framework-m/vite-plugin\n *\n * Vite plugin for Framework M plugin auto-discovery and bundling.\n *\n * Scans the workspace for packages with \"framework-m\" metadata in their\n * package.json and generates a virtual module that imports all plugin\n * configs. The shell app can then import this virtual module to\n * bootstrap all plugins automatically.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { frameworkMPlugin } from \"@framework-m/vite-plugin\";\n *\n * export default defineConfig({\n * plugins: [frameworkMPlugin()],\n * });\n * ```\n *\n * @example\n * ```ts\n * // In shell app:\n * // @ts-ignore - Virtual module generated by Vite plugin\n * import discoveredPlugins from \"virtual:framework-m-plugins\";\n *\n * for (const plugin of discoveredPlugins) {\n * await registry.register(plugin);\n * }\n * ```\n */\n\nimport type { Plugin } from \"vite\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { globSync } from \"glob\";\nimport { scanWorkspacePlugins } from \"./scanner\";\nimport { generateVirtualModule } from \"./codegen\";\nimport type { DiscoveredPlugin } from \"./scanner\";\n\nconst VIRTUAL_MODULE_ID = \"virtual:framework-m-plugins\";\nconst RESOLVED_VIRTUAL_MODULE_ID = \"\\0virtual:framework-m-plugins\";\n\nfunction isDebugEnabled(): boolean {\n const processRef = (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process;\n const envFlag =\n processRef?.env?.FRAMEWORK_M_VITE_PLUGIN_DEBUG ??\n processRef?.env?.FRAMEWORK_M_DEBUG;\n\n if (typeof envFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(envFlag.toLowerCase());\n }\n\n return false;\n}\n\nconst pluginLogger = {\n info(message: string): void {\n console.info(`[framework-m/vite-plugin] ${message}`);\n },\n debug(message: string): void {\n if (isDebugEnabled()) {\n console.info(`[framework-m/vite-plugin] ${message}`);\n }\n },\n};\n\n/**\n * Options for the Framework M Vite plugin.\n */\nexport interface FrameworkMPluginOptions {\n /**\n * Root directory to scan for plugins. Defaults to process.cwd().\n */\n root?: string;\n}\n\n/**\n * Create the Framework M Vite plugin.\n *\n * This plugin:\n * 1. Scans the workspace at build time for packages with \"framework-m\"\n * metadata in their package.json\n * 2. Generates a virtual module `virtual:framework-m-plugins` that imports\n * all discovered plugin configs\n * 3. The shell app imports this virtual module to auto-register all plugins\n */\nexport function frameworkMPlugin(\n options: FrameworkMPluginOptions = {},\n): Plugin {\n let pluginPaths: string[] = [];\n let discoveredPlugins: DiscoveredPlugin[] = [];\n let pluginChunkMatchers: Array<{ prefix: string; chunkName: string }> = [];\n\n return {\n name: \"framework-m-plugin\",\n\n async config(userConfig) {\n pluginPaths = discoverPluginConfigPaths(options.root);\n discoveredPlugins = await scanWorkspacePlugins(options.root);\n pluginChunkMatchers = createPluginChunkMatchers(discoveredPlugins);\n\n const existingOutput = userConfig.build?.rollupOptions?.output;\n const existingOutputs = Array.isArray(existingOutput)\n ? existingOutput\n : [existingOutput ?? {}];\n\n const mergedOutputs = existingOutputs.map(output => {\n const existingManualChunks = output.manualChunks;\n\n return {\n ...output,\n manualChunks(id: string, meta: unknown) {\n const pluginChunk = findPluginChunkForModule(\n id,\n pluginChunkMatchers,\n );\n if (pluginChunk) {\n return pluginChunk;\n }\n\n if (typeof existingManualChunks === \"function\") {\n return (\n existingManualChunks as (\n id: string,\n meta: unknown,\n ) => string | undefined\n )(id, meta);\n }\n\n return undefined;\n },\n };\n });\n\n return {\n build: {\n rollupOptions: {\n output: Array.isArray(existingOutput)\n ? mergedOutputs\n : mergedOutputs[0],\n },\n },\n };\n },\n\n /**\n * Discover plugins at build start.\n */\n async buildStart() {\n const root = options.root;\n pluginPaths = discoverPluginConfigPaths(root);\n discoveredPlugins = await scanWorkspacePlugins(root);\n pluginChunkMatchers = createPluginChunkMatchers(discoveredPlugins);\n\n const pluginNames = discoveredPlugins.map(p => p.name).join(\", \");\n pluginLogger.info(\n discoveredPlugins.length > 0\n ? `Discovered ${discoveredPlugins.length} Framework M plugin(s): ${pluginNames}`\n : \"Discovered 0 Framework M plugins\",\n );\n\n if (discoveredPlugins.length > 0) {\n pluginLogger.debug(\n `✓ Discovered ${discoveredPlugins.length} Framework M plugin(s):`,\n );\n for (const p of discoveredPlugins) {\n pluginLogger.debug(` - ${p.name}`);\n }\n } else {\n pluginLogger.debug(\"ℹ No Framework M plugins found in workspace\");\n }\n },\n\n /**\n * Resolve the virtual module ID.\n */\n resolveId(id: string) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID;\n }\n return undefined;\n },\n\n /**\n * Load the virtual module — generate code with all plugin imports.\n */\n load(id: string) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n return generateVirtualModule(discoveredPlugins);\n }\n return undefined;\n },\n\n /**\n * HMR: Watch plugin config files for changes.\n */\n configureServer(server) {\n // Watch all discovered plugin config files\n for (const plugin of discoveredPlugins) {\n server.watcher.add(plugin.pluginConfigPath);\n }\n for (const pluginConfigPath of pluginPaths) {\n server.watcher.add(pluginConfigPath);\n }\n\n const refreshPlugins = async () => {\n pluginPaths = discoverPluginConfigPaths(options.root);\n discoveredPlugins = await scanWorkspacePlugins(options.root);\n pluginChunkMatchers = createPluginChunkMatchers(discoveredPlugins);\n for (const plugin of discoveredPlugins) {\n server.watcher.add(plugin.pluginConfigPath);\n }\n for (const pluginConfigPath of pluginPaths) {\n server.watcher.add(pluginConfigPath);\n }\n\n const virtualModule = server.moduleGraph.getModuleById(\n RESOLVED_VIRTUAL_MODULE_ID,\n );\n if (virtualModule) {\n server.moduleGraph.invalidateModule(virtualModule);\n }\n\n pluginLogger.info(\"Plugin configuration changed, triggering reload\");\n server.ws.send({ type: \"full-reload\" });\n };\n\n server.watcher.on(\"change\", filePath => {\n const shouldRefresh =\n filePath.includes(\"plugin.config.\") ||\n pluginPaths.includes(filePath) ||\n discoveredPlugins.some(\n plugin => plugin.pluginConfigPath === filePath,\n );\n if (shouldRefresh) {\n void refreshPlugins();\n }\n });\n },\n };\n}\n\nfunction discoverPluginConfigPaths(root?: string): string[] {\n const workspaceRoot = root ?? process.cwd();\n const packageJsonPaths = globSync(\"**/package.json\", {\n cwd: workspaceRoot,\n absolute: true,\n nodir: true,\n ignore: [\"**/node_modules/**\", \"**/dist/**\"],\n });\n\n const pluginPaths: string[] = [];\n for (const packageJsonPath of packageJsonPaths) {\n try {\n const packageRaw = fs.readFileSync(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(packageRaw) as {\n \"framework-m\"?: { plugin?: unknown };\n };\n\n const pluginConfig = packageJson[\"framework-m\"]?.plugin;\n if (typeof pluginConfig !== \"string\") {\n continue;\n }\n\n pluginPaths.push(\n path.resolve(path.dirname(packageJsonPath), pluginConfig),\n );\n } catch {\n // Ignore invalid package.json files and continue scanning.\n }\n }\n\n return pluginPaths.sort((a, b) => a.localeCompare(b));\n}\n\nfunction normalizeModuleId(id: string): string {\n return id.split(\"?\")[0].split(path.sep).join(\"/\");\n}\n\nfunction inferPluginRoot(pluginConfigPath: string): string {\n const configDir = path.dirname(pluginConfigPath);\n const base = path.basename(configDir);\n if (base === \"src\" || base === \"dist\") {\n return path.dirname(configDir);\n }\n return configDir;\n}\n\nfunction toChunkName(pluginName: string): string {\n const tail = pluginName.split(\"/\").pop() || pluginName;\n return tail.replaceAll(/[^a-zA-Z0-9_-]/g, \"-\").toLowerCase();\n}\n\nfunction createPluginChunkMatchers(\n plugins: DiscoveredPlugin[],\n): Array<{ prefix: string; chunkName: string }> {\n return plugins\n .map(plugin => ({\n prefix: normalizeModuleId(inferPluginRoot(plugin.pluginConfigPath)) + \"/\",\n chunkName: toChunkName(plugin.name),\n }))\n .sort((a, b) => b.prefix.length - a.prefix.length);\n}\n\nfunction findPluginChunkForModule(\n id: string,\n matchers: Array<{ prefix: string; chunkName: string }>,\n): string | undefined {\n const normalizedId = normalizeModuleId(id);\n for (const matcher of matchers) {\n if (normalizedId.startsWith(matcher.prefix)) {\n return matcher.chunkName;\n }\n }\n return undefined;\n}\n\n// Re-export types and utilities\nexport type { DiscoveredPlugin } from \"./scanner\";\nexport { scanWorkspacePlugins } from \"./scanner\";\nexport { generateVirtualModule } from \"./codegen\";\nexport { generateMfeConfig } from \"./mfe-config\";\nexport type { MfeOptions } from \"./mfe-config\";\n"],"names":["scanWorkspacePlugins","root","scanRoot","findWorkspaceRoot","packageJsonPaths","fg","plugins","pkgPath","content","fs","pkg","frameworkM","pluginConfigPath","path","a","b","startDir","dir","parent","generateVirtualModule","imports","p","i","exportNames","_","generateMfeConfig","options","federation","VIRTUAL_MODULE_ID","RESOLVED_VIRTUAL_MODULE_ID","isDebugEnabled","processRef","envFlag","_a","_b","pluginLogger","message","frameworkMPlugin","pluginPaths","discoveredPlugins","pluginChunkMatchers","userConfig","discoverPluginConfigPaths","createPluginChunkMatchers","existingOutput","mergedOutputs","output","existingManualChunks","id","meta","pluginChunk","findPluginChunkForModule","pluginNames","server","plugin","refreshPlugins","virtualModule","filePath","workspaceRoot","globSync","packageJsonPath","packageRaw","pluginConfig","normalizeModuleId","inferPluginRoot","configDir","base","toChunkName","pluginName","matchers","normalizedId","matcher"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@framework-m/vite-plugin",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.7",
|
|
4
4
|
"description": "Vite plugin for Framework M plugin auto-discovery and bundling",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -33,18 +33,18 @@
|
|
|
33
33
|
"vite": "^5.0.0 || ^6.0.0"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@framework-m/plugin-sdk": "^0.
|
|
36
|
+
"@framework-m/plugin-sdk": "^0.2.5",
|
|
37
37
|
"@originjs/vite-plugin-federation": "^1.4.1",
|
|
38
38
|
"fast-glob": "^3.3.3",
|
|
39
|
-
"glob": "^10.
|
|
40
|
-
"vite": "^6.
|
|
39
|
+
"glob": "^10.5.0",
|
|
40
|
+
"vite": "^6.4.1"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "^22.19.15",
|
|
44
44
|
"typescript": "^5.9.3",
|
|
45
45
|
"vite": "^6.4.1",
|
|
46
|
-
"vite-plugin-dts": "^4.5.
|
|
47
|
-
"vitest": "^4.1.
|
|
46
|
+
"vite-plugin-dts": "^4.5.4",
|
|
47
|
+
"vitest": "^4.1.1"
|
|
48
48
|
},
|
|
49
49
|
"publishConfig": {
|
|
50
50
|
"access": "public"
|