@framework-m/vite-plugin 0.4.0 → 0.6.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAMlD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAsFzE"}
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAMlD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAyFzE"}
@@ -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,CA4JR;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"}
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;AAmCnC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,MAAM,CAmJ9E;AA4ED,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,36 +1,33 @@
1
- import w from "node:fs";
1
+ import k from "node:fs";
2
2
  import u from "node:path";
3
- import { globSync as N } from "glob";
3
+ import { globSync as S } from "glob";
4
4
  import D from "fast-glob";
5
- import S from "@originjs/vite-plugin-federation";
5
+ import N from "@originjs/vite-plugin-federation";
6
6
  async function b(n) {
7
7
  const e = n || I(process.cwd()), t = await D("**/package.json", {
8
8
  cwd: e,
9
9
  ignore: ["**/node_modules/**", "**/dist/**"],
10
10
  absolute: !0
11
- }), a = [];
11
+ }), s = [];
12
12
  for (const o of t)
13
13
  try {
14
- const r = w.readFileSync(o, "utf-8"), l = JSON.parse(r), i = l["framework-m"];
14
+ const r = k.readFileSync(o, "utf-8"), l = JSON.parse(r), i = l["framework-m"];
15
15
  if (i != null && i.plugin) {
16
- const s = u.resolve(
17
- u.dirname(o),
18
- i.plugin
19
- );
20
- a.push({
16
+ const a = u.resolve(u.dirname(o), i.plugin);
17
+ s.push({
21
18
  name: l.name || u.basename(u.dirname(o)),
22
- pluginConfigPath: s
19
+ pluginConfigPath: a
23
20
  });
24
21
  }
25
22
  } catch {
26
23
  continue;
27
24
  }
28
- return a.sort((o, r) => o.name === r.name ? o.pluginConfigPath.localeCompare(r.pluginConfigPath) : o.name.localeCompare(r.name));
25
+ return s.sort((o, r) => o.name === r.name ? o.pluginConfigPath.localeCompare(r.pluginConfigPath) : o.name.localeCompare(r.name));
29
26
  }
30
27
  function I(n) {
31
28
  let e = n;
32
29
  for (; ; ) {
33
- if (w.existsSync(u.join(e, "pnpm-workspace.yaml")))
30
+ if (k.existsSync(u.join(e, "pnpm-workspace.yaml")))
34
31
  return e;
35
32
  const t = u.dirname(e);
36
33
  if (t === e) break;
@@ -46,28 +43,31 @@ function A(n) {
46
43
  return `export default [];
47
44
  `;
48
45
  let e = "", t = "";
49
- const a = [];
46
+ const s = [];
50
47
  return n.forEach((o, r) => {
51
48
  const l = C(o.pluginConfigPath);
52
49
  e += `import plugin${r} from '${l}';
53
50
  `;
54
- const i = u.dirname(o.pluginConfigPath), s = u.join(i, "overrides");
51
+ const i = u.dirname(o.pluginConfigPath), a = u.join(i, "overrides");
55
52
  let g = !1, c = `const enhancedPlugin${r} = {
56
53
  ...plugin${r},
57
54
  `;
58
55
  const p = {}, d = [];
59
56
  let m = "";
60
- if (w.existsSync(s)) {
61
- const f = u.join(s, "traversals.ts");
62
- w.existsSync(f) && (g = !0, m = `traversals_${r}`, e += `import ${m} from '${C(f)}';
57
+ if (k.existsSync(a)) {
58
+ const f = u.join(a, "traversals.ts");
59
+ k.existsSync(f) && (g = !0, m = `traversals_${r}`, e += `import ${m} from '${C(f)}';
63
60
  `);
64
- const P = s.replace(/\\/g, "/"), _ = D.sync("**/*.tsx", { cwd: P, absolute: !0 });
65
- _.length > 0 && (g = !0, _.forEach((F) => {
66
- const j = C(F), y = j.replace(C(s) + "/", "").split("/");
61
+ const P = a.replace(/\\/g, "/"), O = D.sync("**/*.tsx", {
62
+ cwd: P,
63
+ absolute: !0
64
+ });
65
+ O.length > 0 && (g = !0, O.forEach((F) => {
66
+ const _ = C(F), y = _.replace(C(a) + "/", "").split("/");
67
67
  if (y.length === 2) {
68
- const h = y[0], $ = y[1].replace(".tsx", ""), v = `${h}_${$}_${r}`;
69
- e += `import ${v} from '${j}';
70
- `, h === "Core" ? d.push(`{ name: '${$}', component: ${v} }`) : (p[h] || (p[h] = []), p[h].push(`${$}: ${v}`));
68
+ const h = y[0], v = y[1].replace(".tsx", ""), $ = `${h}_${v}_${r}`;
69
+ e += `import ${$} from '${_}';
70
+ `, h === "Core" ? d.push(`{ name: '${v}', component: ${$} }`) : (p[h] || (p[h] = []), p[h].push(`${v}: ${$}`));
71
71
  }
72
72
  }));
73
73
  }
@@ -95,23 +95,48 @@ function A(n) {
95
95
  ],
96
96
  `), m && (c += ` traversals: ${m},
97
97
  `), c += `};
98
- `, t += c, a.push(`enhancedPlugin${r}`);
98
+ `, t += c, s.push(`enhancedPlugin${r}`);
99
99
  } else
100
- a.push(`plugin${r}`);
100
+ s.push(`plugin${r}`);
101
101
  }), `${e}
102
102
  ${t}
103
- export default [${a.join(", ")}];
103
+ export default [${s.join(", ")}];
104
104
  `;
105
105
  }
106
106
  function Z(n) {
107
107
  return {
108
+ resolve: {
109
+ extensions: [
110
+ ".web.mjs",
111
+ ".web.js",
112
+ ".web.jsx",
113
+ ".web.ts",
114
+ ".web.tsx",
115
+ ".mjs",
116
+ ".js",
117
+ ".mts",
118
+ ".ts",
119
+ ".jsx",
120
+ ".tsx",
121
+ ".json"
122
+ ],
123
+ alias: {
124
+ "react-native": "react-native-web"
125
+ }
126
+ },
127
+ optimizeDeps: {
128
+ esbuildOptions: {
129
+ resolveExtensions: [".web.js", ".web.ts", ".web.tsx", ".js", ".jsx", ".ts", ".tsx"]
130
+ }
131
+ },
108
132
  build: {
109
133
  target: "esnext",
110
- minify: !1,
111
- cssCodeSplit: !1
134
+ minify: !0,
135
+ cssCodeSplit: !1,
136
+ chunkSizeWarningLimit: 1e3
112
137
  },
113
138
  plugins: [
114
- S({
139
+ N({
115
140
  name: n.name,
116
141
  filename: "remoteEntry.js",
117
142
  exposes: {
@@ -124,11 +149,11 @@ function Z(n) {
124
149
  }
125
150
  const L = "virtual:framework-m-plugins", x = "\0virtual:framework-m-plugins";
126
151
  function R() {
127
- var t, a;
128
- const n = globalThis.process, e = ((t = n == null ? void 0 : n.env) == null ? void 0 : t.FRAMEWORK_M_VITE_PLUGIN_DEBUG) ?? ((a = n == null ? void 0 : n.env) == null ? void 0 : a.FRAMEWORK_M_DEBUG);
152
+ var t, s;
153
+ const n = globalThis.process, e = ((t = n == null ? void 0 : n.env) == null ? void 0 : t.FRAMEWORK_M_VITE_PLUGIN_DEBUG) ?? ((s = n == null ? void 0 : n.env) == null ? void 0 : s.FRAMEWORK_M_DEBUG);
129
154
  return typeof e == "string" ? ["1", "true", "yes", "on"].includes(e.toLowerCase()) : !1;
130
155
  }
131
- const k = {
156
+ const w = {
132
157
  info(n) {
133
158
  console.info(`[framework-m/vite-plugin] ${n}`);
134
159
  },
@@ -137,25 +162,25 @@ const k = {
137
162
  }
138
163
  };
139
164
  function q(n = {}) {
140
- let e = [], t = [], a = [];
165
+ let e = [], t = [], s = [];
141
166
  return {
142
167
  name: "framework-m-plugin",
143
168
  async config(o) {
144
- var s, g;
145
- e = M(n.root), t = await b(n.root), a = O(t);
146
- const r = (g = (s = o.build) == null ? void 0 : s.rollupOptions) == null ? void 0 : g.output, i = (Array.isArray(r) ? r : [r ?? {}]).map((c) => {
169
+ var a, g;
170
+ e = j(n.root), t = await b(n.root), s = M(t);
171
+ const r = (g = (a = o.build) == null ? void 0 : a.rollupOptions) == null ? void 0 : g.output, i = (Array.isArray(r) ? r : [r ?? {}]).map((c) => {
147
172
  const p = c.manualChunks;
148
173
  return {
149
174
  ...c,
150
175
  manualChunks(d, m) {
151
- const f = W(
152
- d,
153
- a
154
- );
176
+ const f = J(d, s);
155
177
  if (f)
156
178
  return f;
157
179
  if (typeof p == "function")
158
- return p(d, m);
180
+ return p(
181
+ d,
182
+ m
183
+ );
159
184
  }
160
185
  };
161
186
  });
@@ -172,18 +197,16 @@ function q(n = {}) {
172
197
  */
173
198
  async buildStart() {
174
199
  const o = n.root;
175
- e = M(o), t = await b(o), a = O(t);
200
+ e = j(o), t = await b(o), s = M(t);
176
201
  const r = t.map((l) => l.name).join(", ");
177
- if (k.info(
202
+ if (w.info(
178
203
  t.length > 0 ? `Discovered ${t.length} Framework M plugin(s): ${r}` : "Discovered 0 Framework M plugins"
179
204
  ), t.length > 0) {
180
- k.debug(
181
- `✓ Discovered ${t.length} Framework M plugin(s):`
182
- );
205
+ w.debug(`✓ Discovered ${t.length} Framework M plugin(s):`);
183
206
  for (const l of t)
184
- k.debug(` - ${l.name}`);
207
+ w.debug(` - ${l.name}`);
185
208
  } else
186
- k.debug("ℹ No Framework M plugins found in workspace");
209
+ w.debug("ℹ No Framework M plugins found in workspace");
187
210
  },
188
211
  /**
189
212
  * Resolve the virtual module ID.
@@ -205,70 +228,66 @@ function q(n = {}) {
205
228
  configureServer(o) {
206
229
  for (const i of t) {
207
230
  o.watcher.add(i.pluginConfigPath);
208
- const s = u.join(u.dirname(i.pluginConfigPath), "overrides");
209
- o.watcher.add(s);
231
+ const a = u.join(u.dirname(i.pluginConfigPath), "overrides");
232
+ o.watcher.add(a);
210
233
  }
211
234
  for (const i of e)
212
235
  o.watcher.add(i);
213
236
  const r = async () => {
214
- e = M(n.root), t = await b(n.root), a = O(t);
215
- for (const s of t)
216
- o.watcher.add(s.pluginConfigPath);
217
- for (const s of e)
218
- o.watcher.add(s);
219
- const i = o.moduleGraph.getModuleById(
220
- x
221
- );
222
- i && o.moduleGraph.invalidateModule(i), k.info("Plugin configuration changed, triggering reload"), o.ws.send({ type: "full-reload" });
237
+ e = j(n.root), t = await b(n.root), s = M(t);
238
+ for (const a of t)
239
+ o.watcher.add(a.pluginConfigPath);
240
+ for (const a of e)
241
+ o.watcher.add(a);
242
+ const i = o.moduleGraph.getModuleById(x);
243
+ i && o.moduleGraph.invalidateModule(i), w.info("Plugin configuration changed, triggering reload"), o.ws.send({ type: "full-reload" });
223
244
  }, l = (i) => {
224
- const s = i.includes("plugin.config."), g = i.includes("/overrides/") && (i.endsWith(".tsx") || i.endsWith(".ts"));
225
- (s || g) && r();
245
+ const a = i.includes("plugin.config."), g = i.includes("/overrides/") && (i.endsWith(".tsx") || i.endsWith(".ts"));
246
+ (a || g) && r();
226
247
  };
227
248
  o.watcher.on("change", l), o.watcher.on("add", l), o.watcher.on("unlink", l);
228
249
  }
229
250
  };
230
251
  }
231
- function M(n) {
252
+ function j(n) {
232
253
  var o;
233
- const e = n ?? process.cwd(), t = N("**/package.json", {
254
+ const e = n ?? process.cwd(), t = S("**/package.json", {
234
255
  cwd: e,
235
256
  absolute: !0,
236
257
  nodir: !0,
237
258
  ignore: ["**/node_modules/**", "**/dist/**"]
238
- }), a = [];
259
+ }), s = [];
239
260
  for (const r of t)
240
261
  try {
241
- const l = w.readFileSync(r, "utf8"), s = (o = JSON.parse(l)["framework-m"]) == null ? void 0 : o.plugin;
242
- if (typeof s != "string")
262
+ const l = k.readFileSync(r, "utf8"), a = (o = JSON.parse(l)["framework-m"]) == null ? void 0 : o.plugin;
263
+ if (typeof a != "string")
243
264
  continue;
244
- a.push(
245
- u.resolve(u.dirname(r), s)
246
- );
265
+ s.push(u.resolve(u.dirname(r), a));
247
266
  } catch {
248
267
  }
249
- return a.sort((r, l) => r.localeCompare(l));
268
+ return s.sort((r, l) => r.localeCompare(l));
250
269
  }
251
270
  function E(n) {
252
271
  return n.split("?")[0].split(u.sep).join("/");
253
272
  }
254
- function J(n) {
273
+ function W(n) {
255
274
  const e = u.dirname(n), t = u.basename(e);
256
275
  return t === "src" || t === "dist" ? u.dirname(e) : e;
257
276
  }
258
- function U(n) {
277
+ function z(n) {
259
278
  return (n.split("/").pop() || n).replaceAll(/[^a-zA-Z0-9_-]/g, "-").toLowerCase();
260
279
  }
261
- function O(n) {
280
+ function M(n) {
262
281
  return n.map((e) => ({
263
- prefix: E(J(e.pluginConfigPath)) + "/",
264
- chunkName: U(e.name)
282
+ prefix: E(W(e.pluginConfigPath)) + "/",
283
+ chunkName: z(e.name)
265
284
  })).sort((e, t) => t.prefix.length - e.prefix.length);
266
285
  }
267
- function W(n, e) {
286
+ function J(n, e) {
268
287
  const t = E(n);
269
- for (const a of e)
270
- if (t.startsWith(a.prefix))
271
- return a.chunkName;
288
+ for (const s of e)
289
+ if (t.startsWith(s.prefix))
290
+ return s.chunkName;
272
291
  }
273
292
  export {
274
293
  q as frameworkMPlugin,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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 fs from \"node:fs\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { DiscoveredPlugin } from \"./scanner\";\n\nfunction normalizePath(p: string): string {\n return p.split(path.sep).join(\"/\");\n}\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 let imports = \"\";\n let enhancedPluginsCode = \"\";\n const exportNames: string[] = [];\n\n plugins.forEach((p, i) => {\n const pluginConfigPath = normalizePath(p.pluginConfigPath);\n imports += `import plugin${i} from '${pluginConfigPath}';\\n`;\n\n const srcDir = path.dirname(p.pluginConfigPath);\n const overridesDir = path.join(srcDir, \"overrides\");\n\n let hasOverrides = false;\n let pluginOverridesCode = `const enhancedPlugin${i} = {\\n ...plugin${i},\\n`;\n const doctypes: Record<string, string[]> = {};\n const globalPages: string[] = [];\n let traversalsImportName = \"\";\n\n if (fs.existsSync(overridesDir)) {\n const traversalsPath = path.join(overridesDir, \"traversals.ts\");\n if (fs.existsSync(traversalsPath)) {\n hasOverrides = true;\n traversalsImportName = `traversals_${i}`;\n imports += `import ${traversalsImportName} from '${normalizePath(traversalsPath)}';\\n`;\n }\n\n // Use forward slashes for fast-glob cwd to support Windows\n const globCwd = overridesDir.replace(/\\\\/g, \"/\");\n const overrideFiles = fg.sync(\"**/*.tsx\", { cwd: globCwd, absolute: true });\n\n if (overrideFiles.length > 0) {\n hasOverrides = true;\n\n overrideFiles.forEach((file) => {\n const normalizedFile = normalizePath(file);\n const relativePath = normalizedFile.replace(normalizePath(overridesDir) + \"/\", \"\");\n const parts = relativePath.split(\"/\"); // e.g. ['Todo', 'FormView.tsx']\n\n if (parts.length === 2) {\n const folderName = parts[0];\n const fileName = parts[1].replace(\".tsx\", \"\");\n const importName = `${folderName}_${fileName}_${i}`;\n\n imports += `import ${importName} from '${normalizedFile}';\\n`;\n\n if (folderName === \"Core\") {\n globalPages.push(`{ name: '${fileName}', component: ${importName} }`);\n } else {\n if (!doctypes[folderName]) doctypes[folderName] = [];\n doctypes[folderName].push(`${fileName}: ${importName}`);\n }\n }\n });\n }\n }\n\n if (hasOverrides) {\n if (Object.keys(doctypes).length > 0) {\n pluginOverridesCode += ` doctypes: [\\n ...(plugin${i}.doctypes || []),\\n`;\n for (const [doctype, components] of Object.entries(doctypes)) {\n pluginOverridesCode += ` {\\n doctype: '${doctype}',\\n components: {\\n ${components.join(\",\\n \")}\\n }\\n },\\n`;\n }\n pluginOverridesCode += ` ],\\n`;\n }\n\n if (globalPages.length > 0) {\n pluginOverridesCode += ` pages: [\\n ...(plugin${i}.pages || []),\\n ${globalPages.join(\",\\n \")}\\n ],\\n`;\n }\n\n if (traversalsImportName) {\n pluginOverridesCode += ` traversals: ${traversalsImportName},\\n`;\n }\n\n pluginOverridesCode += `};\\n`;\n enhancedPluginsCode += pluginOverridesCode;\n exportNames.push(`enhancedPlugin${i}`);\n } else {\n exportNames.push(`plugin${i}`);\n }\n });\n\n return `${imports}\\n${enhancedPluginsCode}\\nexport default [${exportNames.join(\", \")}];\\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 // Watch the overrides directory for new files\n const overridesDir = path.join(path.dirname(plugin.pluginConfigPath), \"overrides\");\n server.watcher.add(overridesDir);\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 const handleFileChange = (filePath: string) => {\n const isPluginConfig = filePath.includes(\"plugin.config.\");\n const isOverride = filePath.includes(\"/overrides/\") && (filePath.endsWith(\".tsx\") || filePath.endsWith(\".ts\"));\n \n if (isPluginConfig || isOverride) {\n void refreshPlugins();\n }\n };\n\n server.watcher.on(\"change\", handleFileChange);\n server.watcher.on(\"add\", handleFileChange);\n server.watcher.on(\"unlink\", handleFileChange);\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","normalizePath","p","generateVirtualModule","imports","enhancedPluginsCode","exportNames","i","srcDir","overridesDir","hasOverrides","pluginOverridesCode","doctypes","globalPages","traversalsImportName","traversalsPath","globCwd","overrideFiles","file","normalizedFile","parts","folderName","fileName","importName","doctype","components","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","handleFileChange","filePath","isPluginConfig","isOverride","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(root?: string): 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 { plugin?: string; type?: string } | undefined;\n\n if (frameworkM?.plugin) {\n const pluginConfigPath = path.resolve(path.dirname(pkgPath), frameworkM.plugin);\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 fs from \"node:fs\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { DiscoveredPlugin } from \"./scanner\";\n\nfunction normalizePath(p: string): string {\n return p.split(path.sep).join(\"/\");\n}\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 let imports = \"\";\n let enhancedPluginsCode = \"\";\n const exportNames: string[] = [];\n\n plugins.forEach((p, i) => {\n const pluginConfigPath = normalizePath(p.pluginConfigPath);\n imports += `import plugin${i} from '${pluginConfigPath}';\\n`;\n\n const srcDir = path.dirname(p.pluginConfigPath);\n const overridesDir = path.join(srcDir, \"overrides\");\n\n let hasOverrides = false;\n let pluginOverridesCode = `const enhancedPlugin${i} = {\\n ...plugin${i},\\n`;\n const doctypes: Record<string, string[]> = {};\n const globalPages: string[] = [];\n let traversalsImportName = \"\";\n\n if (fs.existsSync(overridesDir)) {\n const traversalsPath = path.join(overridesDir, \"traversals.ts\");\n if (fs.existsSync(traversalsPath)) {\n hasOverrides = true;\n traversalsImportName = `traversals_${i}`;\n imports += `import ${traversalsImportName} from '${normalizePath(traversalsPath)}';\\n`;\n }\n\n // Use forward slashes for fast-glob cwd to support Windows\n const globCwd = overridesDir.replace(/\\\\/g, \"/\");\n const overrideFiles = fg.sync(\"**/*.tsx\", {\n cwd: globCwd,\n absolute: true,\n });\n\n if (overrideFiles.length > 0) {\n hasOverrides = true;\n\n overrideFiles.forEach((file) => {\n const normalizedFile = normalizePath(file);\n const relativePath = normalizedFile.replace(normalizePath(overridesDir) + \"/\", \"\");\n const parts = relativePath.split(\"/\"); // e.g. ['Todo', 'FormView.tsx']\n\n if (parts.length === 2) {\n const folderName = parts[0];\n const fileName = parts[1].replace(\".tsx\", \"\");\n const importName = `${folderName}_${fileName}_${i}`;\n\n imports += `import ${importName} from '${normalizedFile}';\\n`;\n\n if (folderName === \"Core\") {\n globalPages.push(`{ name: '${fileName}', component: ${importName} }`);\n } else {\n if (!doctypes[folderName]) doctypes[folderName] = [];\n doctypes[folderName].push(`${fileName}: ${importName}`);\n }\n }\n });\n }\n }\n\n if (hasOverrides) {\n if (Object.keys(doctypes).length > 0) {\n pluginOverridesCode += ` doctypes: [\\n ...(plugin${i}.doctypes || []),\\n`;\n for (const [doctype, components] of Object.entries(doctypes)) {\n pluginOverridesCode += ` {\\n doctype: '${doctype}',\\n components: {\\n ${components.join(\",\\n \")}\\n }\\n },\\n`;\n }\n pluginOverridesCode += ` ],\\n`;\n }\n\n if (globalPages.length > 0) {\n pluginOverridesCode += ` pages: [\\n ...(plugin${i}.pages || []),\\n ${globalPages.join(\",\\n \")}\\n ],\\n`;\n }\n\n if (traversalsImportName) {\n pluginOverridesCode += ` traversals: ${traversalsImportName},\\n`;\n }\n\n pluginOverridesCode += `};\\n`;\n enhancedPluginsCode += pluginOverridesCode;\n exportNames.push(`enhancedPlugin${i}`);\n } else {\n exportNames.push(`plugin${i}`);\n }\n });\n\n return `${imports}\\n${enhancedPluginsCode}\\nexport default [${exportNames.join(\", \")}];\\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 resolve: {\n extensions: [\n \".web.mjs\",\n \".web.js\",\n \".web.jsx\",\n \".web.ts\",\n \".web.tsx\",\n \".mjs\",\n \".js\",\n \".mts\",\n \".ts\",\n \".jsx\",\n \".tsx\",\n \".json\",\n ],\n alias: {\n \"react-native\": \"react-native-web\",\n },\n },\n optimizeDeps: {\n esbuildOptions: {\n resolveExtensions: [\".web.js\", \".web.ts\", \".web.tsx\", \".js\", \".jsx\", \".ts\", \".tsx\"],\n },\n },\n build: {\n target: \"esnext\",\n minify: true,\n cssCodeSplit: false,\n chunkSizeWarningLimit: 1000,\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 = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process;\n const envFlag =\n processRef?.env?.FRAMEWORK_M_VITE_PLUGIN_DEBUG ?? 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(options: FrameworkMPluginOptions = {}): 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(id, pluginChunkMatchers);\n if (pluginChunk) {\n return pluginChunk;\n }\n\n if (typeof existingManualChunks === \"function\") {\n return (existingManualChunks as (id: string, meta: unknown) => string | undefined)(\n id,\n meta\n );\n }\n\n return undefined;\n },\n };\n });\n\n return {\n build: {\n rollupOptions: {\n output: Array.isArray(existingOutput) ? mergedOutputs : 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(`✓ Discovered ${discoveredPlugins.length} Framework M plugin(s):`);\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 // Watch the overrides directory for new files\n const overridesDir = path.join(path.dirname(plugin.pluginConfigPath), \"overrides\");\n server.watcher.add(overridesDir);\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(RESOLVED_VIRTUAL_MODULE_ID);\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 const handleFileChange = (filePath: string) => {\n const isPluginConfig = filePath.includes(\"plugin.config.\");\n const isOverride =\n filePath.includes(\"/overrides/\") &&\n (filePath.endsWith(\".tsx\") || filePath.endsWith(\".ts\"));\n\n if (isPluginConfig || isOverride) {\n void refreshPlugins();\n }\n };\n\n server.watcher.on(\"change\", handleFileChange);\n server.watcher.on(\"add\", handleFileChange);\n server.watcher.on(\"unlink\", handleFileChange);\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(path.resolve(path.dirname(packageJsonPath), pluginConfig));\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","normalizePath","p","generateVirtualModule","imports","enhancedPluginsCode","exportNames","i","srcDir","overridesDir","hasOverrides","pluginOverridesCode","doctypes","globalPages","traversalsImportName","traversalsPath","globCwd","overrideFiles","file","normalizedFile","parts","folderName","fileName","importName","doctype","components","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","handleFileChange","filePath","isPluginConfig","isOverride","workspaceRoot","globSync","packageJsonPath","packageRaw","pluginConfig","normalizeModuleId","inferPluginRoot","configDir","base","toChunkName","pluginName","matchers","normalizedId","matcher"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mfe-config.d.ts","sourceRoot":"","sources":["../src/mfe-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAGvC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,CAkBjE"}
1
+ {"version":3,"file":"mfe-config.d.ts","sourceRoot":"","sources":["../src/mfe-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAGvC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,CA2CjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA8C7B"}
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAyCrF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@framework-m/vite-plugin",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
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,24 @@
33
33
  "vite": "^5.0.0 || ^6.0.0"
34
34
  },
35
35
  "dependencies": {
36
- "@framework-m/plugin-sdk": "^0.4.0",
36
+ "@framework-m/plugin-sdk": "^0.6.0",
37
37
  "@originjs/vite-plugin-federation": "^1.4.1",
38
38
  "fast-glob": "^3.3.3",
39
- "glob": "^10.5.0",
40
- "vite": "^6.4.1"
39
+ "glob": "^13.0.6",
40
+ "vite": "^6.4.2"
41
41
  },
42
42
  "devDependencies": {
43
- "@types/node": "^22.19.15",
43
+ "@types/node": "^22.19.17",
44
+ "@typescript-eslint/eslint-plugin": "^8.59.0",
45
+ "@typescript-eslint/parser": "^8.59.0",
46
+ "eslint": "^9.39.4",
47
+ "eslint-config-prettier": "^10.1.8",
48
+ "eslint-plugin-unused-imports": "^4.4.1",
49
+ "prettier": "^3.8.3",
44
50
  "typescript": "^5.9.3",
45
51
  "vite": "^6.4.1",
46
52
  "vite-plugin-dts": "^4.5.4",
47
- "vitest": "^4.1.2"
53
+ "vitest": "^4.1.5"
48
54
  },
49
55
  "publishConfig": {
50
56
  "access": "public"
@@ -52,9 +58,12 @@
52
58
  "scripts": {
53
59
  "build": "tsc && vite build",
54
60
  "dev": "vite build --watch",
61
+ "lint": "eslint src --max-warnings 0",
62
+ "format": "prettier --write \"src/**/*.ts\"",
63
+ "format:check": "prettier --check \"src/**/*.ts\"",
55
64
  "type-check": "tsc --noEmit",
56
65
  "test": "vitest run",
57
66
  "test:watch": "vitest",
58
- "test:coverage": "vitest run --coverage"
67
+ "test:coverage": "vitest run --coverage --coverage.reporter=text --coverage.reporter=html --coverage.reporter=lcov"
59
68
  }
60
69
  }