@fulgurjs/federation 3.0.1 → 4.1.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.
package/dist/index.cjs CHANGED
@@ -43,7 +43,7 @@ var import_node_fs = __toESM(require("fs"), 1);
43
43
  var import_node_path = __toESM(require("path"), 1);
44
44
 
45
45
  // src/version.ts
46
- var RUNTIME_VERSION = "3.0.1";
46
+ var RUNTIME_VERSION = "4.1.0";
47
47
 
48
48
  // src/dev-cors.ts
49
49
  function normalizeDevCorsOrigins(input) {
@@ -73,6 +73,8 @@ function isNonLoopbackHost(host) {
73
73
 
74
74
  // src/options.ts
75
75
  var DEFAULT_FILENAME = "fulgurjs-remoteEntry.js";
76
+ var SETUP_EXPOSE_KEY = "./__fulgurjs_setup__";
77
+ var SETUP_CONTAINER_KEY = "__fulgurjsSetup";
76
78
  var RUNTIME_VIRTUAL_ID = "virtual:fulgurjs-runtime";
77
79
  var RUNTIME_PROXY_VIRTUAL_ID = "virtual:fulgurjs-runtime-proxy";
78
80
  var INIT_VIRTUAL_ID = "virtual:fulgurjs-init";
@@ -280,6 +282,51 @@ function validateOptions(options) {
280
282
  `federation({ name: 'my-app', ... })`
281
283
  );
282
284
  }
285
+ if (options.remoteType !== void 0 && options.remoteType !== "module") {
286
+ configError(
287
+ 'CFG-011: remoteType other than "module" is not supported',
288
+ options.remoteType,
289
+ '"module"\uFF08\u7F3A\u7701\u5373\u53EF\uFF09\u2014\u2014webpack script/var remote \u4E92\u64CD\u4F5C\u672A\u5B9E\u73B0',
290
+ `// \u5220\u9664 remoteType \u914D\u7F6E\uFF08fulgurjs \u53EA\u4EA7\u51FA ESM module remote\uFF09`
291
+ );
292
+ }
293
+ if (options.library?.type !== void 0 && options.library.type !== "module" && options.library.type !== "esm") {
294
+ configError(
295
+ 'CFG-011: library.type other than "module"/"esm" is not supported',
296
+ options.library.type,
297
+ '"module" \u6216 "esm"\uFF08\u7F3A\u7701\u5373\u53EF\uFF09\u2014\u2014webpack UMD/var \u8F93\u51FA\u4E92\u64CD\u4F5C\u672A\u5B9E\u73B0',
298
+ `// \u5220\u9664 library \u914D\u7F6E\uFF08fulgurjs remoteEntry \u6052\u4E3A ESM\uFF09`
299
+ );
300
+ }
301
+ if (options.automaticAsyncBoundary === false) {
302
+ configError(
303
+ "CFG-011: automaticAsyncBoundary=false cannot be honored",
304
+ options.automaticAsyncBoundary,
305
+ "\u7F3A\u7701\u6216 true\u2014\u2014fulgurjs \u4F7F\u7528 TLA \u81EA\u52A8\u5F02\u6B65\u8FB9\u754C\uFF0C\u4E0D\u5B58\u5728\u624B\u5DE5 bootstrap \u6A21\u5F0F",
306
+ `// \u5220\u9664 automaticAsyncBoundary \u914D\u7F6E\uFF08\u5BB9\u5668\u534F\u8BAE\u5929\u7136\u5F02\u6B65\uFF09`
307
+ );
308
+ }
309
+ for (const key of Object.keys(options.exposes ?? {})) {
310
+ const norm = key.startsWith("./") ? key : `./${key}`;
311
+ if (norm === SETUP_EXPOSE_KEY) {
312
+ configError(
313
+ `CFG-012: exposes key "${norm}" is reserved for the federation setup entry`,
314
+ key,
315
+ `a public expose name\uFF08\u5185\u90E8\u4FDD\u7559\u952E "${SETUP_EXPOSE_KEY}" \u7531 setup \u9009\u9879\u81EA\u52A8\u751F\u6210\uFF09`,
316
+ `// \u628A\u8BE5 expose \u6539\u540D\uFF0C\u6216\u5220\u9664\u5B83\u5E76\u628A\u539F\u6587\u4EF6\u8DEF\u5F84\u914D\u7F6E\u5230 federation({ setup })`
317
+ );
318
+ }
319
+ }
320
+ if (options.setup !== void 0) {
321
+ if (typeof options.setup !== "string" || options.setup.trim() === "") {
322
+ configError(
323
+ "CFG-012: setup must be a non-empty module path relative to the app root",
324
+ options.setup,
325
+ 'e.g. "./src/fulgurjs/setup.ts"\uFF08\u9ED8\u8BA4\u5BFC\u51FA setup(context)\uFF0C\u53EF\u9009\u5177\u540D\u5BFC\u51FA onSession(context)\uFF09',
326
+ `federation({ name: 'my-app', setup: './src/fulgurjs/setup.ts', ... })`
327
+ );
328
+ }
329
+ }
283
330
  if (options.exposes !== void 0 && typeof options.exposes !== "object") {
284
331
  configError("`exposes` must be an object", options.exposes, 'an object of { "./Module": "./src/path" }', `exposes: { './Button': './src/Button.vue' }`);
285
332
  }
@@ -401,21 +448,6 @@ function normalizeOptions(options, root, command) {
401
448
  const warnings = [];
402
449
  validateOptions(options);
403
450
  if (!options.name) throw new Error("[fulgurjs] option `name` is required.");
404
- if (options.remoteType && options.remoteType !== "module") {
405
- warnings.push(
406
- `remoteType "${options.remoteType}" requires webpack-host interop (P3 milestone); falling back to "module".`
407
- );
408
- }
409
- if (options.library?.type && options.library.type !== "module" && options.library.type !== "esm") {
410
- warnings.push(
411
- `library.type "${options.library.type}" requires webpack-host interop (P3 milestone); falling back to "module".`
412
- );
413
- }
414
- if (options.automaticAsyncBoundary === false) {
415
- warnings.push(
416
- "automaticAsyncBoundary=false has no effect: fulgurjs uses TLA-based automatic async boundaries (better than webpack manual bootstrap)."
417
- );
418
- }
419
451
  const exposes = [];
420
452
  for (const [rawName, val] of Object.entries(options.exposes ?? {})) {
421
453
  const name = rawName.startsWith("./") ? rawName : `./${rawName}`;
@@ -423,6 +455,11 @@ function normalizeOptions(options, root, command) {
423
455
  const hint = typeof val === "string" ? { import: val } : val;
424
456
  exposes.push({ name, import: hint.import, chunkName: hint.name });
425
457
  }
458
+ let setup;
459
+ if (options.setup) {
460
+ setup = { name: SETUP_EXPOSE_KEY, import: options.setup, internal: true };
461
+ exposes.push(setup);
462
+ }
426
463
  const shareScopeDefault = options.shareScope || "default";
427
464
  const filename = options.filename || DEFAULT_FILENAME;
428
465
  const pkgDependencies = readPkgDependencies(root);
@@ -453,6 +490,7 @@ function normalizeOptions(options, root, command) {
453
490
  uniqueName: options.name,
454
491
  filename,
455
492
  exposes,
493
+ setup,
456
494
  remotes,
457
495
  shared,
458
496
  shareScope: shareScopeDefault,
@@ -466,8 +504,10 @@ function normalizeOptions(options, root, command) {
466
504
  pluginVersion: RUNTIME_VERSION,
467
505
  pkgDependencies,
468
506
  warnings,
469
- // dev 改写开关:默认纯 remote 参与 shared 协商,宿主(有 remotes)不参与;可显式覆盖
470
- devSharedSelf: options.devSharedSelf ?? remotes.length === 0,
507
+ // dev 改写开关:纯 remote 与双角色(既 expose 又消费 remote)为 true——被宿主消费的
508
+ // 组件需协商到宿主实例,双向联邦漏配该项曾是已知错误配置(README 要求显式 true,
509
+ // §12.4 后默认推断:仅纯宿主为 false);显式配置永远优先
510
+ devSharedSelf: options.devSharedSelf ?? (remotes.length === 0 || exposes.length > 0),
471
511
  devCorsOrigins: options.devCorsOrigins,
472
512
  devFsRoot: options.devFsRoot ?? true
473
513
  };
@@ -618,6 +658,9 @@ function normalizeExposes(manifest) {
618
658
  }
619
659
 
620
660
  // src/virtual.ts
661
+ function setupMetaLine(options) {
662
+ return options.setup ? `export const ${SETUP_CONTAINER_KEY} = ${JSON.stringify(options.setup.name)};` : "";
663
+ }
621
664
  function jsonReplacer(_k, v) {
622
665
  return v;
623
666
  }
@@ -836,6 +879,7 @@ ${remoteLines.length > 0 ? `import { registerRemotes } from ${JSON.stringify(`${
836
879
  ${remoteLines.join("\n")}` : ""}
837
880
 
838
881
  export const name = _fulgurjs_name;
882
+ ${setupMetaLine(options)}
839
883
 
840
884
  export async function init(shareScopeMap) {
841
885
  for (const p of provides) {
@@ -899,6 +943,7 @@ function genBuildRemoteEntry(options, exposeAbsPaths) {
899
943
  ...provides,
900
944
  `];`,
901
945
  `export const name = ${JSON.stringify(options.name)};`,
946
+ setupMetaLine(options),
902
947
  ``,
903
948
  `export async function init(shareScopeMap) {`,
904
949
  ` for (const p of provides) {`,
@@ -921,32 +966,19 @@ function genBuildRemoteEntry(options, exposeAbsPaths) {
921
966
  ""
922
967
  ].join("\n");
923
968
  }
924
- function genApiFacade(mode) {
925
- if (mode === "build") {
926
- return [
927
- "export {",
928
- " initSharing, registerShare, registerRemotes, registerRemote, registerPlugins,",
929
- " loadShare, loadRemote, getContainer, preloadRemote, parseSpec,",
930
- " getRuntime, shareScopeMap, unwrapDefault, version,",
931
- '} from "virtual:fulgurjs-runtime";',
932
- "export { provideAppContext, getAppContext, requireAppContext } from '@fulgurjs/federation/internal/context.js';",
933
- "export { definePages, validatePages } from '@fulgurjs/federation/internal/pages.js';",
934
- "export { remoteComponent } from '@fulgurjs/federation/internal/vue.js';",
935
- "export { default as remoteSchema } from 'virtual:fulgurjs-remote-schema';",
936
- ""
937
- ].join("\n");
938
- }
969
+ function genApiFacade() {
939
970
  return [
940
971
  "export {",
941
972
  " loadRemote, loadShare, preloadRemote, getContainer,",
942
973
  " registerRemote, registerRemotes, registerShare, initSharing, registerPlugins,",
943
974
  " parseSpec, getRuntime, shareScopeMap, unwrapDefault, version,",
944
975
  '} from "virtual:fulgurjs-runtime-proxy";',
945
- "export { provideAppContext, getAppContext, requireAppContext } from '@fulgurjs/federation/internal/context.js';",
976
+ "export { provideAppContext, getAppContext, requireAppContext, clearAppContext } from '@fulgurjs/federation/internal/context.js';",
946
977
  "export { definePages, validatePages } from '@fulgurjs/federation/internal/pages.js';",
947
- `let __fulgurjs_vue_p;`,
948
- `export const remoteComponent = (...a) => (__fulgurjs_vue_p ??= import('@fulgurjs/federation/internal/vue.js')).then((m) => m.remoteComponent(...a));`,
949
- "export { default as remoteSchema } from 'virtual:fulgurjs-remote-schema';",
978
+ "import { createRemoteComponent, createHostPages as __fulgurjs_chp } from '@fulgurjs/federation/internal/vue-adapter.js';",
979
+ "import { loadRemote as __fulgurjs_loadRemote } from 'virtual:fulgurjs-runtime-proxy';",
980
+ "export const remoteComponent = createRemoteComponent(__fulgurjs_loadRemote);",
981
+ "export const createHostPages = (options) => __fulgurjs_chp(options, __fulgurjs_loadRemote);",
950
982
  ""
951
983
  ].join("\n");
952
984
  }
@@ -974,6 +1006,9 @@ function genDevManifest(options, base) {
974
1006
  // dev 下 preload 全部 404。
975
1007
  file: `${b}${e.import.replace(/^\.?\//, "")}`
976
1008
  })),
1009
+ // setup 生命周期入口(内部 expose 键;未配置 setup 时省略)。preloadRemote 据此把
1010
+ // setup 资源纳入预载,doctor/explain 据此区分内部资源与公开 exposes。
1011
+ ...options.setup ? { setup: options.setup.name } : {},
977
1012
  shared: options.shared.map((s) => ({
978
1013
  name: s.shareKey,
979
1014
  version: s.version,
@@ -991,6 +1026,7 @@ function genProdManifest(options, exposeFiles, entryFile) {
991
1026
  name: options.name,
992
1027
  entry: entryFile,
993
1028
  exposes: exposeFiles,
1029
+ ...options.setup && exposeFiles[options.setup.name] ? { setup: options.setup.name } : {},
994
1030
  shared: options.shared.map((s) => ({
995
1031
  name: s.shareKey,
996
1032
  version: s.version,
@@ -1012,6 +1048,61 @@ function ensureLexer() {
1012
1048
  lexerReady ??= import_es_module_lexer.init;
1013
1049
  return lexerReady;
1014
1050
  }
1051
+ function splitNamedImportBindings(inner) {
1052
+ const parts = [];
1053
+ let start = 0;
1054
+ for (let i = 0; i < inner.length; i++) {
1055
+ if (inner.startsWith("/*", i)) {
1056
+ const end = inner.indexOf("*/", i + 2);
1057
+ i = end < 0 ? inner.length : end + 1;
1058
+ } else if (inner.startsWith("//", i)) {
1059
+ const end = inner.indexOf("\n", i + 2);
1060
+ i = end < 0 ? inner.length : end;
1061
+ } else if (inner[i] === ",") {
1062
+ parts.push(inner.slice(start, i).trim());
1063
+ start = i + 1;
1064
+ }
1065
+ }
1066
+ parts.push(inner.slice(start).trim());
1067
+ return parts.filter(Boolean);
1068
+ }
1069
+ async function rewriteRuntimeEntryImports(code, exposeTarget) {
1070
+ if (!code.includes("@fulgurjs/federation/runtime")) return null;
1071
+ await ensureLexer();
1072
+ const [imports] = (0, import_es_module_lexer.parse)(code);
1073
+ const out = new import_magic_string.default(code);
1074
+ let changed = false;
1075
+ for (const imp of imports) {
1076
+ if (imp.n !== "@fulgurjs/federation/runtime" || imp.d !== -1) continue;
1077
+ const statement = code.slice(imp.ss, imp.se);
1078
+ if (/^\s*import\s+type\b/.test(statement)) continue;
1079
+ const destination = exposeTarget ? "virtual:fulgurjs-api-facade" : "@fulgurjs/federation/runtime";
1080
+ const braces = statement.match(/\{([\s\S]*?)\}/);
1081
+ if (braces && /^\s*import\b/.test(statement)) {
1082
+ const parts = splitNamedImportBindings(braces[1]);
1083
+ const normalized = parts.map((x) => x.replace(/\/\*[\s\S]*?\*\/|\/\/[^\n]*/g, "").trim());
1084
+ const schema = normalized.filter((x) => /^remoteSchema(?:\s+as\s+[A-Za-z_$][\w$]*)?$/.test(x));
1085
+ if (schema.length) {
1086
+ const rest = parts.filter((_, i) => !schema.includes(normalized[i]));
1087
+ const before = statement.slice(0, statement.indexOf("{")).trim();
1088
+ const defaultBinding = before.replace(/^import\s*/, "").replace(/,\s*$/, "").trim();
1089
+ const replacement = [
1090
+ ...rest.length || defaultBinding ? [`import ${defaultBinding ? defaultBinding + (rest.length ? ", " : "") : ""}${rest.length ? `{ ${rest.join(", ")} }` : ""} from ${JSON.stringify(destination)};`] : [],
1091
+ `import { ${schema.join(", ")} } from "virtual:fulgurjs-remote-schema";`
1092
+ ].join("\n");
1093
+ const end = code[imp.se] === ";" ? imp.se + 1 : imp.se;
1094
+ out.overwrite(imp.ss, end, replacement);
1095
+ changed = true;
1096
+ continue;
1097
+ }
1098
+ }
1099
+ if (exposeTarget) {
1100
+ out.overwrite(imp.s, imp.e, destination);
1101
+ changed = true;
1102
+ }
1103
+ }
1104
+ return changed ? out.toString() : null;
1105
+ }
1015
1106
  function isExposeTargetFile(cleanPath, root, exposes) {
1016
1107
  for (const e of exposes) {
1017
1108
  const abs = import_node_path2.default.resolve(root, e.import.replace(/^\.\//, ""));
@@ -1378,14 +1469,6 @@ function extractTsExportNames(text) {
1378
1469
  }
1379
1470
  return [...names];
1380
1471
  }
1381
- function genRuntimeTypesShim() {
1382
- return [
1383
- "// \u81EA\u52A8\u751F\u6210\uFF1Afulgurjs-federation \u8FD0\u884C\u65F6\u7C7B\u578B\uFF08virtual:fulgurjs-api\uFF09",
1384
- "import '@fulgurjs/federation/client'",
1385
- "export {}",
1386
- ""
1387
- ].join("\n");
1388
- }
1389
1472
  function resolveDtsDir(dtsOpt, rootHasSrc) {
1390
1473
  if (dtsOpt === false) return "";
1391
1474
  return (typeof dtsOpt === "object" ? dtsOpt.dir : void 0) ?? (rootHasSrc ? "src/fulgurjs/types" : ".fulgurjs/types");
@@ -1423,7 +1506,6 @@ async function generateDevTypes(options, _server) {
1423
1506
  const dir = resolveDtsDir(dtsOpt, import_node_fs2.default.existsSync(import_node_path3.default.join(options.root, "src")));
1424
1507
  const outDir = import_node_path3.default.join(options.root, dir);
1425
1508
  import_node_fs2.default.mkdirSync(outDir, { recursive: true });
1426
- import_node_fs2.default.writeFileSync(import_node_path3.default.join(outDir, "fulgurjs-runtime.d.ts"), genRuntimeTypesShim());
1427
1509
  for (const remote of options.remotes) {
1428
1510
  if (!remote.devEntry || remote.promise) continue;
1429
1511
  const manifest = await fetchManifest(remote.devEntry);
@@ -1453,6 +1535,7 @@ async function generateDevTypes(options, _server) {
1453
1535
  ];
1454
1536
  let accepted = 0;
1455
1537
  for (const expose of manifest.exposes ?? []) {
1538
+ if (manifest.setup && expose.name === manifest.setup) continue;
1456
1539
  const skipped = (reason) => console.warn(`[fulgurjs] dts: remote "${remote.key}" expose ${JSON.stringify(expose.name)} \u8DF3\u8FC7\uFF1A${reason}`);
1457
1540
  const src = expose.src;
1458
1541
  if (!src || typeof src !== "string") {
@@ -1670,7 +1753,10 @@ async function probeRemotesAndBuildSchema(options) {
1670
1753
  }
1671
1754
  function genEmptyRemoteSchemaModule() {
1672
1755
  console.info("[fulgurjs] build \u671F\u8DF3\u8FC7\u8DEF\u7531 spec \u5B58\u5728\u6027\u6821\u9A8C\uFF08\u8FDC\u7A0B manifest \u4E0D\u5728\u6784\u5EFA\u673A\u672C\u5730\uFF1Bdev \u4E0B\u81EA\u52A8\u542F\u7528\uFF09");
1673
- return "export default {}";
1756
+ return genRemoteSchemaModule({});
1757
+ }
1758
+ function genRemoteSchemaModule(schema) {
1759
+ return `export const remoteSchema = ${JSON.stringify(schema)}; export default remoteSchema`;
1674
1760
  }
1675
1761
 
1676
1762
  // src/vite-cache.ts
@@ -1698,7 +1784,7 @@ function syncViteCacheMarker(root, pluginVersion, log) {
1698
1784
  }
1699
1785
 
1700
1786
  // src/runtime-code.gen.ts
1701
- var runtime_code_gen_default = 'var oe=/^v?(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z.-]+)?$/;function I(o){let i=oe.exec(String(o).trim());return i?{major:Number(i[1]),minor:Number(i[2]??0),patch:Number(i[3]??0),pre:i[4]?i[4].split("."):[]}:null}function ie(o,i){if(o.length===0&&i.length===0)return 0;if(o.length===0)return 1;if(i.length===0)return-1;let s=Math.max(o.length,i.length);for(let n=0;n<s;n++){let f=o[n],y=i[n];if(f===void 0)return-1;if(y===void 0)return 1;let R=/^\\d+$/.test(f),w=/^\\d+$/.test(y);if(R&&w){let T=Number(f)-Number(y);if(T!==0)return T}else{if(R!==w)return R?-1:1;if(f!==y)return f<y?-1:1}}return 0}function j(o,i){let s=I(o),n=I(i);return!s||!n?o<i?-1:o>i?1:0:s.major!==n.major?s.major-n.major:s.minor!==n.minor?s.minor-n.minor:s.patch!==n.patch?s.patch-n.patch:ie(s.pre,n.pre)}var se=/^[a-z]+[+:-]/i;function P(o,i){if(i===!1||i==null||i==="")return!0;let s=String(i).trim();return!s||s==="*"||s==="latest"||se.test(s)?!0:s.split("||").some(n=>ae(o,n.trim()))}function ae(o,i){if(!i||i==="*")return!I(o)?.pre.length;let s=i.split(/\\s+-\\s+/);if(s.length===2){let y=s[0].trim(),R=s[1].trim();return!(!P(o,`>=${y}`)||!P(o,`<=${R}`))}let n=I(o);if(!n)return!1;let f=ce(i);if(f===null)return!0;for(let y of f)if(!pe(n,o,y))return!1;return!(n.pre.length>0&&!f.some(y=>y.ver.pre.length>0)&&!f.some(R=>R.ver.major===n.major&&R.ver.minor===n.minor&&R.ver.patch===n.patch))}function ce(o){let i=[],s=o.trim().split(/\\s+/).filter(Boolean);if(s.length===0)return null;for(let n of s){let f=/^(>=|<=|>|<|=|\\^|~)?(.*)$/.exec(n);if(!f)return null;let y=f[1],R=f[2],w=le(y,R);if(w===null)return null;i.push(...w)}return i}function le(o,i){let s=me(i);if(!s)return null;let{ver:n,partial:f}=s;switch(o){case"^":{let y=ue(n);return y?[{op:">=",ver:n},{op:"<",ver:y}]:null}case"~":{let y=f>=2?{major:n.major,minor:n.minor+1,patch:0,pre:[]}:{major:n.major+1,minor:0,patch:0,pre:[]};return[{op:">=",ver:n},{op:"<",ver:y}]}case">=":return[{op:">=",ver:n}];case">":return f===1?[{op:">=",ver:{major:n.major+1,minor:0,patch:0,pre:[]}}]:f===2?[{op:">=",ver:{major:n.major,minor:n.minor+1,patch:0,pre:[]}}]:[{op:">",ver:n}];case"<":return f===1?[{op:"<",ver:{major:n.major,minor:0,patch:0,pre:[]}}]:f===2?[{op:"<",ver:{major:n.major,minor:n.minor,patch:0,pre:[]}}]:[{op:"<",ver:n}];case"<=":return[{op:"<=",ver:n}];case"=":case void 0:return f===1?[{op:">=",ver:n},{op:"<",ver:{major:n.major+1,minor:0,patch:0,pre:[]}}]:f===2?[{op:">=",ver:n},{op:"<",ver:{major:n.major,minor:n.minor+1,patch:0,pre:[]}}]:[{op:"=",ver:n}];default:return null}}function ue(o){return o.major>0?{major:o.major+1,minor:0,patch:0,pre:[]}:o.minor>0?{major:0,minor:o.minor+1,patch:0,pre:[]}:{major:0,minor:0,patch:o.patch+1,pre:[]}}function me(o){let i=o.replace(/^v/,"").trim();if(!i||i==="*"||i==="x"||i==="X")return{ver:{major:0,minor:0,patch:0,pre:[]},partial:0};let s=i.split("."),n=[],f=0;for(let w of s.slice(0,3))if(/^\\d+$/.test(w))n.push(Number(w)),f++;else{if(w==="x"||w==="X"||w==="*")break;break}let y=i.split("-"),R=y.length>1?y.slice(1).join("-").split("+")[0].split("."):[];return f===0&&R.length===0?{ver:{major:0,minor:0,patch:0,pre:[]},partial:0}:{ver:{major:n[0]??0,minor:n[1]??0,patch:n[2]??0,pre:R},partial:f}}function fe(o,i){switch(i){case">=":return o>=0;case">":return o>0;case"<":return o<0;case"<=":return o<=0;case"=":return o===0}}function pe(o,i,s){let n=`${o.major}.${o.minor}.${o.patch}`+(o.pre.length?`-${o.pre.join(".")}`:"");if(s.upper)return!(!(j(n,`${s.ver.major}.${s.ver.minor}.${s.ver.patch}`+(s.ver.pre.length?`-${s.ver.pre.join(".")}`:""))>=0)||!(j(n,`${s.upper.major}.${s.upper.minor}.${s.upper.patch}`)<0));let f=j(n,`${s.ver.major}.${s.ver.minor}.${s.ver.patch}`+(s.ver.pre.length?`-${s.ver.pre.join(".")}`:"")),y=fe(f,s.op);return s.ver.pre.length>0&&o.pre.length===0&&(s.op===">"||s.op==="<")?!1:y}var b=class extends Error{code;details;constructor(i,s,n){super(`[fulgurjs:${i}] ${s}`),this.name="FgError",this.code=i,this.details=n}},S={REMOTE_LOAD_FAILED:"MFU-001",REMOTE_NAME_MISMATCH:"MFU-002",SHARE_STRICT_VERSION:"MFU-003",SHARE_NOT_AVAILABLE:"MFU-004",CONTAINER_REINIT_CONFLICT:"MFU-005",MODULE_NOT_EXPOSED:"MFU-006",PRELOAD_FAILED:"MFU-007",REMOTE_UNKNOWN:"MFU-008",EMPTY_EXPORTS:"MFU-009",SINGLETON_SKEW:"MFU-010"};var q="3.0.1";var x=15e3,z=2,de=5,ge=3e4,he=4e3,ye=.2;function Ee(){let o=Object.create(null),i=new Map,s=[],n=new Map,f=new Map,y=new WeakMap,R=new WeakMap,w={},T=()=>{for(let e of s)try{e.init?.(w)}catch(t){console.warn("[fulgurjs] runtimePlugin init failed:",e.name,t)}},N=e=>o[e]??=Object.create(null);function $(e){try{w.onRemoteError?.(e)}catch{}typeof window<"u"&&window.dispatchEvent(new CustomEvent("fulgurjs:error",{detail:e}))}function B(e="default"){return N(e),o}function J(e,t,r,l,h={}){let a=N(e||"default"),p=Object.hasOwn(a,t)?a[t]:void 0,d=p&&typeof p=="object"?p:void 0;d||(d=Object.create(null),a[t]=d),!(Object.hasOwn(d,r)&&d[r])&&(d[r]={version:r,get:l,from:h.from??"unknown",eager:!!h.eager,loaded:!!h.loaded})}function G(e){let t=(r,l,h)=>{if(r===void 0)return;if(!(typeof r=="number"&&(h?Number.isInteger(r)&&r>=0&&r<=10:Number.isFinite(r)&&r>0)))throw new Error(`[fulgurjs] registerRemote("${e.name}"): ${l} must be a ${h?"integer 0..10":"finite positive number"}, got ${String(r)}`)};t(e.timeout,"timeout"),t(e.retries,"retries",!0),e.breaker&&(t(e.breaker.threshold,"breaker.threshold"),t(e.breaker.resetMs,"breaker.resetMs"))}function F(e){for(let t of e){G(t);let r=i.get(t.name);i.set(t.name,{timeout:x,retries:z,...r,...t,breakerThreshold:t.breaker?.threshold??r?.breakerThreshold??de,breakerResetMs:t.breaker?.resetMs??r?.breakerResetMs??ge,state:r?.state??"idle",breakerState:r?.breakerState??{fails:0,openUntil:0},entryInflight:r?.entryInflight??new Map,debug:r?.debug??{entry:t.entry,status:"idle"}})}}function X(e){F([e])}function Y(e){s.push(...e),T()}async function Z(e,t={}){let r=t.shareScope||"default",l=t.shareKey||e,a=N(r)[l]||{},p=Object.keys(a),d=t.requiredVersion,g=p.filter(c=>d===void 0||d===!1||P(c,d)),m;if(t.singleton&&p.length>0){let c=p.filter(u=>a[u].loaded);if(m=[...c.length?c:p].sort(j).pop(),p.length>1||!g.includes(m)){let u=a[m],k=`singleton skew "${l}": req "${d??"any"}" use ${m} from ${u.from}`;if(t.strictVersion){let v=new b(S.SHARE_STRICT_VERSION,k,{shareKey:l,requiredVersion:d});throw $({remote:u.from,error:v}),v}console.warn(`[fulgurjs:MFU-010] ${k}`)}}else if(m=[...g].sort(j).pop(),!m){if(t.strictVersion){let u=new b(S.SHARE_STRICT_VERSION,`no satisfying version for "${l}" (required "${d}") in share scope "${r}"`);throw $({remote:l,error:u}),u}if(t.fallback)return t.fallback();let c=new b(S.SHARE_NOT_AVAILABLE,`shared "${l}" (${d??"any"}) unavailable in scope "${r}" (no local fallback)`,{shareKey:l,requiredVersion:d});throw $({remote:l,error:c}),c}let E=a[m];if(w.resolveShare){let c=await w.resolveShare({shareKey:l,shareScope:r,requiredVersion:d,picked:E,available:Object.values(a)});c&&(E=c)}return E.loaded=!0,E.get()}function Q(e){try{let t=new URL(e,typeof location<"u"?location.href:"http://f.invalid");return t.protocol+"//"+t.host+t.pathname}catch{return String(e).replace(/[?#].*$/,"")}}function C(e,t,r){return new Promise((l,h)=>{let a=setTimeout(()=>h(new Error(`timeout after ${t}ms: ${r}`)),t);e.then(p=>{clearTimeout(a),l(p)},p=>{clearTimeout(a),h(p)})})}let ee=e=>new Promise(t=>setTimeout(t,e));function A(e,t){if(!e||typeof e.get!="function")throw new Error(`remoteEntry of "${t.name}" does not export a container interface (get/init)`);if(e.name&&t.name&&e.name!==t.name){let r=`remoteEntry self-reported name "${e.name}" mismatches configured name "${t.name}"`;if(t.promise)console.warn(`[fulgurjs] ${r} (promise-based remote, continuing)`);else throw Object.assign(new Error(r),{code:S.REMOTE_NAME_MISMATCH})}}async function D(e,t){let r=t.entryInflight.get(e),l=r??import(e);return r||(t.entryInflight.set(e,l),l.catch(()=>t.entryInflight.delete(e))),C(l,t.timeout??x,`load remoteEntry ${e}`)}async function V(e,t){let r=e.shareScope||"default";if(e.container){let a=R.get(e.container);if(a&&a!==r)throw new b(S.CONTAINER_REINIT_CONFLICT,`container "${e.name}" already initialized with share scope "${a}", cannot re-init with "${r}"`);return e.container}if(e.containerPromise)return e.containerPromise;let l=e.breakerState;if(l.openUntil>Date.now()){let a=new b(S.REMOTE_LOAD_FAILED,`circuit breaker open for remote "${e.name}" until ${new Date(l.openUntil).toISOString()}`,{remote:e.name});throw $({remote:e.name,error:a}),a}e.state="loading",e.debug.status="loading";let h=(async()=>{let a=[];if(e.promise)a.push(async()=>{let c=await C(e.promise(),e.timeout??x,`resolve promise remote "${e.name}"`),u=typeof c=="string"?await D(c,e):c;return A(u,e),u});else for(let c of[e.entry,...e.fallback??[]])a.push(async()=>{let u=await D(c,e);return A(u,e),u});let p,d,g=!1,m=t?.retries??e.retries??z;for(let c of a){for(let u=0;u<=m;u++){let k=performance.now();try{p=await c(),e.lastLoadMs=Math.round(performance.now()-k),e.debug.lastLoadMs=e.lastLoadMs,g=!0;break}catch(v){if(d=v,v?.code)throw v;u<m&&await ee(Math.min(he,200*2**u)*(1-ye*(1-2*Math.random())))}}if(g)break}if(!g||!p){let c=Q(e.entry),u=[];throw/^https?:\\/\\//.test(e.entry)&&typeof location<"u"?(u.push(`1. is the remote dev server running? open ${c} in a browser \\u2014 it must return JS, not HTML`),u.push("2. is the URL correct in federation({ remotes })? dev/prod entries can differ"),u.push("3. CORS: the remote dev server must allow cross-origin requests (check its server.cors)")):(u.push(`1. is the remote deployed? open ${c} in a browser \\u2014 it must return JS`),u.push("2. NGINX/CDN routing: the entry path must serve the remoteEntry JS (check try_files)")),new b(S.REMOTE_LOAD_FAILED,`failed to load remote "${e.name}" from ${c}: ${String(d?.message??d)}\n`+u.join(`\n`),{remote:e.name})}A(p,e);let E=R.get(p);if(E&&E!==r)throw new b(S.CONTAINER_REINIT_CONFLICT,`container "${e.name}" already initialized with share scope "${E}", cannot re-init with "${r}"`);return typeof p.init=="function"&&await p.init(o),R.set(p,r),e.container=p,e.state="loaded",e.debug.status="loaded",l.fails=0,p})();e.containerPromise=h;try{return await h}catch(a){if(e.containerPromise=void 0,e.state="failed",e.debug.status="failed",e.debug.error=String(a?.message??a),l.fails+=1,l.fails>=e.breakerThreshold&&(l.openUntil=Date.now()+e.breakerResetMs,l.fails=0),a instanceof b)throw $({remote:e.name,error:a}),a;if(a?.code)throw $({remote:e.name,error:a}),a;let p=new b(S.REMOTE_LOAD_FAILED,String(a?.message??a),{remote:e.name});throw $({remote:e.name,error:p}),p}}function U(e){let t=e.indexOf("/");return t===-1?{remote:e,module:""}:{remote:e.slice(0,t),module:H(e.slice(t+1))}}function H(e){return e?e.startsWith(".")?e:`./${e}`:""}async function re(e,t){let{remote:r,module:l}=U(e);try{w.beforeLoadRemote?.({remote:r,module:l})}catch(g){console.warn("[fulgurjs] beforeLoadRemote hook error (ignored):",g)}let h=i.get(r);if(!h)throw new b(S.REMOTE_UNKNOWN,`unknown remote "${r}". Register it via federation({ remotes }) or registerRemote().`,{remote:r});let a;try{let g=l&&h.manifestUrl?K(e):Promise.resolve();[a]=await Promise.all([V(h,{retries:t?.retries}),g])}catch(g){if(t?.fallbackModule)return console.error(`[fulgurjs] loadRemote("${e}") failed; returning fallbackModule (\\u663E\\u5F0F\\u964D\\u7EA7\\uFF0C\\u9519\\u8BEF\\u5DF2\\u900F\\u51FA)`,g),$({remote:r,error:g}),await t.fallbackModule();throw g}if(!l)return a;let p=`${r}@${h.shareScope||"default"}#${l}`;n.has(p)||n.set(p,a.get(l).catch(g=>{throw n.delete(p),g instanceof b||g?.code?g:new b(S.REMOTE_LOAD_FAILED,`failed to load module "${l}" from remote "${r}": ${String(g?.message??g)}`,{remote:r,module:l})}));let d;try{d=await n.get(p)}catch(g){if(t?.fallbackModule)return console.error(`[fulgurjs] loadRemote("${e}") failed; returning fallbackModule (\\u663E\\u5F0F\\u964D\\u7EA7\\uFF0C\\u9519\\u8BEF\\u5DF2\\u900F\\u51FA)`,g),$({remote:r,error:g}),await t.fallbackModule();throw g}try{w.afterLoadRemote?.({remote:r,module:l,module_ns:d})}catch(g){console.warn("[fulgurjs] afterLoadRemote hook error (ignored):",g)}if(d&&typeof d=="object"&&Object.keys(d).length===0){let g=new b(S.EMPTY_EXPORTS,`no exports: ${l} @ ${r}`,{remote:r,module:l});$({remote:r,error:g}),console.error(`[fulgurjs:MFU-009] ${g.message}`)}return d}function te(e){let t=i.get(e);if(!t)throw new b(S.REMOTE_UNKNOWN,`unknown remote "${e}"`,{remote:e});return V(t)}async function K(e,t={}){let{remote:r,module:l}=U(e),h=i.get(r);if(!h)throw new b(S.REMOTE_UNKNOWN,`unknown remote "${r}"`,{remote:r});let a=t.mode??"preload",p=(m,E)=>{if(m.sheet)return Promise.resolve();let c=y.get(m);if(c)return c;let u=new Promise(k=>{let v=()=>{m.removeEventListener("load",v),m.removeEventListener("error",O),k()},O=()=>{$({remote:r,error:new b(S.PRELOAD_FAILED,`failed to load remote stylesheet ${E}`,{remote:r})}),v()};m.addEventListener("load",v,{once:!0}),m.addEventListener("error",O,{once:!0}),m.sheet&&v()});return y.set(m,u),u},d=(m,E)=>{if(typeof document>"u")return Promise.resolve();let c=document.querySelector(`link[href="${m}"]`);if(c)return E==="style"&&a==="preload"?y.get(c)??Promise.resolve():Promise.resolve();let u=document.createElement("link");u.rel=E==="style"?"stylesheet":"modulepreload",u.href=m,a==="prefetch"&&(u.fetchPriority="low");let k=E==="style"?p(u,m):Promise.resolve();return document.head.appendChild(u),E==="style"&&a==="preload"?k:Promise.resolve()},g=m=>{let E=typeof document<"u"?document.baseURI:void 0,c=new URL(h.entry,E||"http://fulgurjs.invalid/");return!c.pathname.endsWith("/")&&!c.pathname.split("/").pop().includes(".")&&(c.pathname+="/"),new URL(m,c).href};try{if(h.manifestUrl){let m=f.get(h.manifestUrl);m||(m=fetch(h.manifestUrl,{cache:"no-cache",signal:AbortSignal.timeout(8e3)}).then(c=>c.ok?c.json():void 0),f.set(h.manifestUrl,m),m.then(c=>{c||f.delete(h.manifestUrl)},()=>f.delete(h.manifestUrl)));let E=await m;if(E){let c=E.schemaVersion;if(typeof c=="number"&&(!Number.isInteger(c)||c>1)){$({remote:r,error:new b(S.PRELOAD_FAILED,`unsupported manifest schemaVersion ${String(c)} (expected 1)`,{remote:r})}),await d(h.entry,"modulepreload");return}await d(h.entry,"modulepreload");let u=E.exposes,k=Array.isArray(u)?u.filter(_=>_&&typeof _=="object").map(_=>[String(_.name??""),_]):u&&typeof u=="object"?Object.entries(u):[],v=l?k.filter(([_,L])=>H(String(L?.name??_))===l):k,O=[];for(let[,_]of v)if(typeof _?.file=="string"&&await d(g(_.file),"modulepreload"),Array.isArray(_?.css))for(let L of _.css){if(typeof L!="string")continue;let ne=d(g(L),"style");a==="preload"&&O.push(ne)}await Promise.all(O);return}}await d(h.entry,"modulepreload")}catch(m){$({remote:r,error:new b(S.PRELOAD_FAILED,String(m?.message??m),{remote:r})})}}return typeof window>"u"||(window.__FULGURJS_SCOPE__=o,window.__FULGURJS_INFO__={get remotes(){let e={};for(let[t,r]of i)e[t]={...r.debug,entry:r.entry};return e},errors:[]}),{shareScopeMap:o,initSharing:B,registerShare:J,registerRemotes:F,registerRemote:X,registerPlugins:Y,loadShare:Z,loadRemote:re,getContainer:te,preloadRemote:K,parseSpec:U}}var W=globalThis,M=W.__FULGURJS_RUNTIME__??Ee();W.__FULGURJS_RUNTIME__=M;try{Object.freeze(M)}catch{}var _e=q;function ke(){return M}var je=M.initSharing,Oe=M.registerShare,Te=M.registerRemotes,Le=M.registerRemote,Ie=M.registerPlugins,Pe=M.loadShare,Ne=M.loadRemote,Ae=M.getContainer,Ue=M.preloadRemote,xe=M.parseSpec,Fe=M.shareScopeMap;function Ce(o){if(o&&typeof o=="object"&&"default"in o){let i=o.default;return i!==void 0?i:o}return o}var De=M;export{De as default,Ae as getContainer,ke as getRuntime,je as initSharing,Ne as loadRemote,Pe as loadShare,xe as parseSpec,Ue as preloadRemote,Ie as registerPlugins,Le as registerRemote,Te as registerRemotes,Oe as registerShare,M as runtime,Fe as shareScopeMap,Ce as unwrapDefault,_e as version};\n';
1787
+ var runtime_code_gen_default = 'var pe=/^v?(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:-((?:[0-9A-Za-z-]+)(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z.-]+)?$/;function L(s){let c=pe.exec(String(s).trim());return c?{major:Number(c[1]),minor:Number(c[2]??0),patch:Number(c[3]??0),pre:c[4]?c[4].split("."):[]}:null}function de(s,c){if(s.length===0&&c.length===0)return 0;if(s.length===0)return 1;if(c.length===0)return-1;let l=Math.max(s.length,c.length);for(let n=0;n<l;n++){let g=s[n],y=c[n];if(g===void 0)return-1;if(y===void 0)return 1;let w=/^\\d+$/.test(g),b=/^\\d+$/.test(y);if(w&&b){let T=Number(g)-Number(y);if(T!==0)return T}else{if(w!==b)return w?-1:1;if(g!==y)return g<y?-1:1}}return 0}function x(s,c){let l=L(s),n=L(c);return!l||!n?s<c?-1:s>c?1:0:l.major!==n.major?l.major-n.major:l.minor!==n.minor?l.minor-n.minor:l.patch!==n.patch?l.patch-n.patch:de(l.pre,n.pre)}var ge=/^[a-z]+[+:-]/i;function k(s,c){if(c===!1||c==null||c==="")return!0;let l=String(c).trim();return!l||l==="*"||l==="latest"||ge.test(l)?!0:l.split("||").some(n=>he(s,n.trim()))}function he(s,c){if(!c||c==="*")return!L(s)?.pre.length;let l=c.split(/\\s+-\\s+/);if(l.length===2){let y=l[0].trim(),w=l[1].trim();return!(!k(s,`>=${y}`)||!k(s,`<=${w}`))}let n=L(s);if(!n)return!1;let g=ye(c);if(g===null)return!0;for(let y of g)if(!be(n,s,y))return!1;return!(n.pre.length>0&&!g.some(y=>y.ver.pre.length>0)&&!g.some(w=>w.ver.major===n.major&&w.ver.minor===n.minor&&w.ver.patch===n.patch))}function ye(s){let c=[],l=s.trim().split(/\\s+/).filter(Boolean);if(l.length===0)return null;for(let n of l){let g=/^(>=|<=|>|<|=|\\^|~)?(.*)$/.exec(n);if(!g)return null;let y=g[1],w=g[2],b=Se(y,w);if(b===null)return null;c.push(...b)}return c}function Se(s,c){let l=Ee(c);if(!l)return null;let{ver:n,partial:g}=l;switch(s){case"^":{let y=Re(n);return y?[{op:">=",ver:n},{op:"<",ver:y}]:null}case"~":{let y=g>=2?{major:n.major,minor:n.minor+1,patch:0,pre:[]}:{major:n.major+1,minor:0,patch:0,pre:[]};return[{op:">=",ver:n},{op:"<",ver:y}]}case">=":return[{op:">=",ver:n}];case">":return g===1?[{op:">=",ver:{major:n.major+1,minor:0,patch:0,pre:[]}}]:g===2?[{op:">=",ver:{major:n.major,minor:n.minor+1,patch:0,pre:[]}}]:[{op:">",ver:n}];case"<":return g===1?[{op:"<",ver:{major:n.major,minor:0,patch:0,pre:[]}}]:g===2?[{op:"<",ver:{major:n.major,minor:n.minor,patch:0,pre:[]}}]:[{op:"<",ver:n}];case"<=":return[{op:"<=",ver:n}];case"=":case void 0:return g===1?[{op:">=",ver:n},{op:"<",ver:{major:n.major+1,minor:0,patch:0,pre:[]}}]:g===2?[{op:">=",ver:n},{op:"<",ver:{major:n.major,minor:n.minor+1,patch:0,pre:[]}}]:[{op:"=",ver:n}];default:return null}}function Re(s){return s.major>0?{major:s.major+1,minor:0,patch:0,pre:[]}:s.minor>0?{major:0,minor:s.minor+1,patch:0,pre:[]}:{major:0,minor:0,patch:s.patch+1,pre:[]}}function Ee(s){let c=s.replace(/^v/,"").trim();if(!c||c==="*"||c==="x"||c==="X")return{ver:{major:0,minor:0,patch:0,pre:[]},partial:0};let l=c.split("."),n=[],g=0;for(let b of l.slice(0,3))if(/^\\d+$/.test(b))n.push(Number(b)),g++;else{if(b==="x"||b==="X"||b==="*")break;break}let y=c.split("-"),w=y.length>1?y.slice(1).join("-").split("+")[0].split("."):[];return g===0&&w.length===0?{ver:{major:0,minor:0,patch:0,pre:[]},partial:0}:{ver:{major:n[0]??0,minor:n[1]??0,patch:n[2]??0,pre:w},partial:g}}function we(s,c){switch(c){case">=":return s>=0;case">":return s>0;case"<":return s<0;case"<=":return s<=0;case"=":return s===0}}function be(s,c,l){let n=`${s.major}.${s.minor}.${s.patch}`+(s.pre.length?`-${s.pre.join(".")}`:"");if(l.upper)return!(!(x(n,`${l.ver.major}.${l.ver.minor}.${l.ver.patch}`+(l.ver.pre.length?`-${l.ver.pre.join(".")}`:""))>=0)||!(x(n,`${l.upper.major}.${l.upper.minor}.${l.upper.patch}`)<0));let g=x(n,`${l.ver.major}.${l.ver.minor}.${l.ver.patch}`+(l.ver.pre.length?`-${l.ver.pre.join(".")}`:"")),y=we(g,l.op);return l.ver.pre.length>0&&s.pre.length===0&&(l.op===">"||l.op==="<")?!1:y}var S=class extends Error{code;details;constructor(c,l,n){super(`[fulgurjs:${c}] ${l}`),this.name="FgError",this.code=c,this.details=n}},R={REMOTE_LOAD_FAILED:"MFU-001",REMOTE_NAME_MISMATCH:"MFU-002",SHARE_STRICT_VERSION:"MFU-003",SHARE_NOT_AVAILABLE:"MFU-004",CONTAINER_REINIT_CONFLICT:"MFU-005",MODULE_NOT_EXPOSED:"MFU-006",PRELOAD_FAILED:"MFU-007",REMOTE_UNKNOWN:"MFU-008",EMPTY_EXPORTS:"MFU-009",SINGLETON_SKEW:"MFU-010",SETUP_INVALID_EXPORT:"MFU-011",SETUP_RUN_FAILED:"MFU-012",SETUP_SESSION_KEY_MISSING:"MFU-013",SETUP_RECURSION:"MFU-014"};var J="4.1.0";var Pe="__fulgurjsSetup",_e="__FULGURJS_APP_CONFIG__",D=15e3,B=2,ve=5,Me=3e4,$e=4e3,xe=.2;function Ie(){let s=Object.create(null),c=new Map,l=[],n=new Map,g=new Map,y=new WeakMap,w=new WeakMap,b={},T=()=>{for(let e of l)try{e.init?.(b)}catch(r){console.warn("[fulgurjs] runtimePlugin init failed:",e.name,r)}},U=new Map,j,Y=e=>{let r=U.get(e);return r||U.set(e,r={}),r},V=()=>globalThis[_e]??{};async function K(e,r,t,o){let a=u=>u instanceof S?u:new S(R.SETUP_RUN_FAILED,`${o} of "${e}" threw: ${String(u?.message??u)}\n \\u4FEE\\u6CD5: \\u4FEE\\u590D\\u8BE5 ${o} \\u7684\\u521D\\u59CB\\u5316\\u903B\\u8F91\\u540E\\u91CD\\u65B0\\u52A0\\u8F7D\\uFF08\\u5931\\u8D25\\u7684\\u521D\\u59CB\\u5316\\u7F13\\u5B58\\u5DF2\\u6E05\\u9664\\uFF0C\\u53EF\\u76F4\\u63A5\\u91CD\\u8BD5\\uFF09`,{remote:e,phase:o});j=e;let i;try{i=r(t)}catch(u){throw a(u)}finally{j=void 0}try{await i}catch(u){throw a(u)}}async function Z(e,r,t,o){e.debug.setup="pending";try{if(e.manifestUrl)try{await F(`${e.name}/${t}`)}catch{}let a=await r.get(t),i=a?.default;if(typeof i!="function")throw new S(R.SETUP_INVALID_EXPORT,`setup module "${t}" of "${e.name}": default export is ${a==null?String(a):typeof i}, expected a function\n expected: export default async function setup(context: RemoteSetupContext) { ... }\n \\u4FEE\\u6CD5: \\u5728 federation({ setup }) \\u6307\\u5411\\u7684\\u6587\\u4EF6\\u8865\\u9ED8\\u8BA4\\u5BFC\\u51FA\\u51FD\\u6570\\uFF08\\u5177\\u540D onSession \\u53EF\\u9009\\uFF1B\\u5176\\u4ED6\\u5BFC\\u51FA\\u4E0D\\u4F5C\\u4E3A\\u751F\\u547D\\u5468\\u671F\\u5165\\u53E3\\uFF09`,{remote:e.name,module:t});if(a.onSession!==void 0&&typeof a.onSession!="function")throw new S(R.SETUP_INVALID_EXPORT,`setup module "${t}" of "${e.name}": export "onSession" is ${typeof a.onSession}, expected a function\n \\u4FEE\\u6CD5: \\u5C06 onSession \\u4FEE\\u6B63\\u4E3A\\u51FD\\u6570\\u5BFC\\u51FA\\uFF0C\\u6216\\u5220\\u9664\\u8BE5\\u5177\\u540D\\u5BFC\\u51FA\\uFF08\\u5176\\u4ED6\\u5BFC\\u51FA\\u540D\\u4E0D\\u4F5C\\u4E3A\\u751F\\u547D\\u5468\\u671F\\u5165\\u53E3\\uFF09`,{remote:e.name,module:t});o.setupExports=a,await K(e.name,i,{appContext:V(),signal:(o.controller??=new AbortController).signal},"setup"),e.debug.setup="ready"}catch(a){throw e.debug.setup="failed",o.setupExports=void 0,a}}async function Q(e,r,t){let o=V(),a=o?.sessionKey;if(typeof a!="string"||a==="")throw new S(R.SETUP_SESSION_KEY_MISSING,`remote "${e.name}" declares onSession but AppContext.sessionKey is ${a===void 0?"missing":JSON.stringify(a)}\n expected: \\u5BBF\\u4E3B\\u767B\\u5F55\\u540E provideAppContext({ ..., sessionKey: \'<\\u975E\\u654F\\u611F\\u767B\\u5F55\\u4EE3\\u6B21 ID>\' })\n \\u4FEE\\u6CD5: \\u5BBF\\u4E3B\\u767B\\u5F55\\u6D41\\u7A0B\\u6BCF\\u6B21\\u6210\\u529F\\u767B\\u5F55/\\u91CD\\u767B\\u751F\\u6210\\u65B0\\u4EE3\\u6B21 ID\\uFF08\\u7981\\u6B62\\u7528 token \\u5145\\u5F53\\uFF09\\uFF0C\\u5E76\\u5728 loadRemote \\u524D\\u63D0\\u4F9B`,{remote:e.name});if(r.sessionPromise&&r.sessionKey===a)return r.sessionPromise;r.controller?.abort();let i=new AbortController;r.controller=i,r.sessionKey=a;let u=r.sessionPromise?r.sessionPromise.catch(()=>{}):Promise.resolve(),p=(async()=>{await u,!i.signal.aborted&&await K(e.name,t,{appContext:o,sessionKey:a,signal:i.signal},"onSession")})();return r.sessionPromise=p,p.catch(()=>{r.sessionKey===a&&(r.sessionKey=void 0,r.sessionPromise=void 0)}),p}async function ee(e,r){let t=r?.[Pe];if(typeof t!="string"||t==="")return;let o=Y(e.name);o.setupPromise||(o.setupPromise=Z(e,r,t,o).catch(i=>{throw o.setupPromise=void 0,i})),await o.setupPromise;let a=o.setupExports?.onSession;typeof a=="function"&&await Q(e,o,a)}function re(){for(let e of U.values()){try{e.controller?.abort()}catch{}e.sessionKey=void 0,e.sessionPromise=void 0}}let A=e=>s[e]??=Object.create(null);function _(e){try{b.onRemoteError?.(e)}catch{}typeof window<"u"&&window.dispatchEvent(new CustomEvent("fulgurjs:error",{detail:e}))}function te(e="default"){return A(e),s}function ne(e,r,t,o,a={}){let i=A(e||"default"),u=Object.hasOwn(i,r)?i[r]:void 0,p=u&&typeof u=="object"?u:void 0;p||(p=Object.create(null),i[r]=p),!(Object.hasOwn(p,t)&&p[t])&&(p[t]={version:t,get:o,from:a.from??"unknown",eager:!!a.eager,loaded:!!a.loaded})}function oe(e){let r=(t,o,a)=>{if(t===void 0)return;if(!(typeof t=="number"&&(a?Number.isInteger(t)&&t>=0&&t<=10:Number.isFinite(t)&&t>0)))throw new Error(`[fulgurjs] registerRemote("${e.name}"): ${o} must be a ${a?"integer 0..10":"finite positive number"}, got ${String(t)}`)};r(e.timeout,"timeout"),r(e.retries,"retries",!0),e.breaker&&(r(e.breaker.threshold,"breaker.threshold"),r(e.breaker.resetMs,"breaker.resetMs"))}function H(e){for(let r of e){oe(r);let t=c.get(r.name);c.set(r.name,{timeout:D,retries:B,...t,...r,breakerThreshold:r.breaker?.threshold??t?.breakerThreshold??ve,breakerResetMs:r.breaker?.resetMs??t?.breakerResetMs??Me,state:t?.state??"idle",breakerState:t?.breakerState??{fails:0,openUntil:0},entryInflight:t?.entryInflight??new Map,debug:t?.debug??{entry:r.entry,status:"idle",setup:"none"}})}}function ie(e){H([e])}function se(e){l.push(...e),T()}async function ae(e,r={}){let t=r.shareScope||"default",o=r.shareKey||e,i=A(t)[o]||{},u=Object.keys(i),p=r.requiredVersion,h=u.filter(f=>p===void 0||p===!1||k(f,p)),d;if(r.singleton&&u.length>0){let f=u.filter(m=>i[m].loaded);if(d=[...f.length?f:u].sort(x).pop(),u.length>1||!h.includes(d)){let m=i[d],$=`singleton skew "${o}": req "${p??"any"}" use ${d} from ${m.from}`;if(r.strictVersion){let v=new S(R.SHARE_STRICT_VERSION,$,{shareKey:o,requiredVersion:p});throw _({remote:m.from,error:v}),v}console.warn(`[fulgurjs:MFU-010] ${$}`)}}else if(d=[...h].sort(x).pop(),!d){if(r.strictVersion){let m=new S(R.SHARE_STRICT_VERSION,`no satisfying version for "${o}" (required "${p}") in share scope "${t}"`);throw _({remote:o,error:m}),m}if(r.fallback)return r.fallback();let f=new S(R.SHARE_NOT_AVAILABLE,`shared "${o}" (${p??"any"}) unavailable in scope "${t}" (no local fallback)`,{shareKey:o,requiredVersion:p});throw _({remote:o,error:f}),f}let E=i[d];if(b.resolveShare){let f=await b.resolveShare({shareKey:o,shareScope:t,requiredVersion:p,picked:E,available:Object.values(i)});f&&(E=f)}return E.loaded=!0,E.get()}function ce(e){try{let r=new URL(e,typeof location<"u"?location.href:"http://f.invalid");return r.protocol+"//"+r.host+r.pathname}catch{return String(e).replace(/[?#].*$/,"")}}function q(e,r,t){return new Promise((o,a)=>{let i=setTimeout(()=>a(new Error(`timeout after ${r}ms: ${t}`)),r);e.then(u=>{clearTimeout(i),o(u)},u=>{clearTimeout(i),a(u)})})}let le=e=>new Promise(r=>setTimeout(r,e));function N(e,r){if(!e||typeof e.get!="function")throw new Error(`remoteEntry of "${r.name}" does not export a container interface (get/init)`);if(e.name&&r.name&&e.name!==r.name){let t=`remoteEntry self-reported name "${e.name}" mismatches configured name "${r.name}"`;if(r.promise)console.warn(`[fulgurjs] ${t} (promise-based remote, continuing)`);else throw Object.assign(new Error(t),{code:R.REMOTE_NAME_MISMATCH})}}async function G(e,r){let t=r.entryInflight.get(e),o=t??import(e);return t||(r.entryInflight.set(e,o),o.catch(()=>r.entryInflight.delete(e))),q(o,r.timeout??D,`load remoteEntry ${e}`)}async function X(e,r){let t=e.shareScope||"default";if(e.container){let i=w.get(e.container);if(i&&i!==t)throw new S(R.CONTAINER_REINIT_CONFLICT,`container "${e.name}" already initialized with share scope "${i}", cannot re-init with "${t}"`);return e.container}if(e.containerPromise)return e.containerPromise;let o=e.breakerState;if(o.openUntil>Date.now()){let i=new S(R.REMOTE_LOAD_FAILED,`circuit breaker open for remote "${e.name}" until ${new Date(o.openUntil).toISOString()}`,{remote:e.name});throw _({remote:e.name,error:i}),i}e.state="loading",e.debug.status="loading";let a=(async()=>{let i=[];if(e.promise)i.push(async()=>{let f=await q(e.promise(),e.timeout??D,`resolve promise remote "${e.name}"`),m=typeof f=="string"?await G(f,e):f;return N(m,e),m});else for(let f of[e.entry,...e.fallback??[]])i.push(async()=>{let m=await G(f,e);return N(m,e),m});let u,p,h=!1,d=r?.retries??e.retries??B;for(let f of i){for(let m=0;m<=d;m++){let $=performance.now();try{u=await f(),e.lastLoadMs=Math.round(performance.now()-$),e.debug.lastLoadMs=e.lastLoadMs,h=!0;break}catch(v){if(p=v,v?.code)throw v;m<d&&await le(Math.min($e,200*2**m)*(1-xe*(1-2*Math.random())))}}if(h)break}if(!h||!u){let f=ce(e.entry),m=[];throw/^https?:\\/\\//.test(e.entry)&&typeof location<"u"?(m.push(`1. is the remote dev server running? open ${f} in a browser \\u2014 it must return JS, not HTML`),m.push("2. is the URL correct in federation({ remotes })? dev/prod entries can differ"),m.push("3. CORS: the remote dev server must allow cross-origin requests (check its server.cors)")):(m.push(`1. is the remote deployed? open ${f} in a browser \\u2014 it must return JS`),m.push("2. NGINX/CDN routing: the entry path must serve the remoteEntry JS (check try_files)")),new S(R.REMOTE_LOAD_FAILED,`failed to load remote "${e.name}" from ${f}: ${String(p?.message??p)}\n`+m.join(`\n`),{remote:e.name})}N(u,e);let E=w.get(u);if(E&&E!==t)throw new S(R.CONTAINER_REINIT_CONFLICT,`container "${e.name}" already initialized with share scope "${E}", cannot re-init with "${t}"`);return typeof u.init=="function"&&await u.init(s),w.set(u,t),e.container=u,e.state="loaded",e.debug.status="loaded",o.fails=0,u})();e.containerPromise=a;try{return await a}catch(i){if(e.containerPromise=void 0,e.state="failed",e.debug.status="failed",e.debug.error=String(i?.message??i),o.fails+=1,o.fails>=e.breakerThreshold&&(o.openUntil=Date.now()+e.breakerResetMs,o.fails=0),i instanceof S)throw _({remote:e.name,error:i}),i;if(i?.code)throw _({remote:e.name,error:i}),i;let u=new S(R.REMOTE_LOAD_FAILED,String(i?.message??i),{remote:e.name});throw _({remote:e.name,error:u}),u}}function C(e){let r=e.indexOf("/");return r===-1?{remote:e,module:""}:{remote:e.slice(0,r),module:z(e.slice(r+1))}}function z(e){return e?e.startsWith(".")?e:`./${e}`:""}async function ue(e,r){let{remote:t,module:o}=C(e);if(o&&j===t)throw new S(R.SETUP_RECURSION,`loadRemote("${e}") re-entered from setup/onSession of "${t}" \\u2014 the initialization promise would await itself (deadlock)\n \\u4FEE\\u6CD5: setup/onSession \\u5185\\u4E0D loadRemote \\u540C\\u4E00\\u8FDC\\u7A0B\\u7684\\u6A21\\u5757\\uFF1B\\u9700\\u8981\\u7684\\u4E1A\\u52A1\\u6A21\\u5757\\u6539\\u4E3A\\u5728\\u9875\\u9762\\u7EC4\\u4EF6\\u5185\\u52A0\\u8F7D\\uFF0C\\u6216\\u7ECF context \\u901A\\u9053\\u89E3\\u8026`,{remote:t});try{b.beforeLoadRemote?.({remote:t,module:o})}catch(h){console.warn("[fulgurjs] beforeLoadRemote hook error (ignored):",h)}let a=c.get(t);if(!a)throw new S(R.REMOTE_UNKNOWN,`unknown remote "${t}". Register it via federation({ remotes }) or registerRemote().`,{remote:t});let i;try{let h=o&&a.manifestUrl?F(e):Promise.resolve();[i]=await Promise.all([X(a,{retries:r?.retries}),h])}catch(h){if(r?.fallbackModule)return console.error(`[fulgurjs] loadRemote("${e}") failed; returning fallbackModule (\\u663E\\u5F0F\\u964D\\u7EA7\\uFF0C\\u9519\\u8BEF\\u5DF2\\u900F\\u51FA)`,h),_({remote:t,error:h}),await r.fallbackModule();throw h}if(!o)return i;await ee(a,i);let u=`${t}@${a.shareScope||"default"}#${o}`;n.has(u)||n.set(u,i.get(o).catch(h=>{throw n.delete(u),h instanceof S||h?.code?h:new S(R.REMOTE_LOAD_FAILED,`failed to load module "${o}" from remote "${t}": ${String(h?.message??h)}`,{remote:t,module:o})}));let p;try{p=await n.get(u)}catch(h){if(r?.fallbackModule)return console.error(`[fulgurjs] loadRemote("${e}") failed; returning fallbackModule (\\u663E\\u5F0F\\u964D\\u7EA7\\uFF0C\\u9519\\u8BEF\\u5DF2\\u900F\\u51FA)`,h),_({remote:t,error:h}),await r.fallbackModule();throw h}try{b.afterLoadRemote?.({remote:t,module:o,module_ns:p})}catch(h){console.warn("[fulgurjs] afterLoadRemote hook error (ignored):",h)}if(p&&typeof p=="object"&&Object.keys(p).length===0){let h=new S(R.EMPTY_EXPORTS,`no exports: ${o} @ ${t}`,{remote:t,module:o});_({remote:t,error:h}),console.error(`[fulgurjs:MFU-009] ${h.message}`)}return p}function fe(e){let r=c.get(e);if(!r)throw new S(R.REMOTE_UNKNOWN,`unknown remote "${e}"`,{remote:e});return X(r)}async function F(e,r={}){let{remote:t,module:o}=C(e),a=c.get(t);if(!a)throw new S(R.REMOTE_UNKNOWN,`unknown remote "${t}"`,{remote:t});let i=r.mode??"preload",u=(d,E)=>{if(d.sheet)return Promise.resolve();let f=y.get(d);if(f)return f;let m=new Promise($=>{let v=()=>{d.removeEventListener("load",v),d.removeEventListener("error",I),$()},I=()=>{_({remote:t,error:new S(R.PRELOAD_FAILED,`failed to load remote stylesheet ${E}`,{remote:t})}),v()};d.addEventListener("load",v,{once:!0}),d.addEventListener("error",I,{once:!0}),d.sheet&&v()});return y.set(d,m),m},p=(d,E)=>{if(typeof document>"u")return Promise.resolve();let f=document.querySelector(`link[href="${d}"]`);if(f)return E==="style"&&i==="preload"?y.get(f)??Promise.resolve():Promise.resolve();let m=document.createElement("link");m.rel=E==="style"?"stylesheet":"modulepreload",m.href=d,i==="prefetch"&&(m.fetchPriority="low");let $=E==="style"?u(m,d):Promise.resolve();return document.head.appendChild(m),E==="style"&&i==="preload"?$:Promise.resolve()},h=d=>{let E=typeof document<"u"?document.baseURI:void 0,f=new URL(a.entry,E||"http://fulgurjs.invalid/");return!f.pathname.endsWith("/")&&!f.pathname.split("/").pop().includes(".")&&(f.pathname+="/"),new URL(d,f).href};try{if(a.manifestUrl){let d=g.get(a.manifestUrl);d||(d=fetch(a.manifestUrl,{cache:"no-cache",signal:AbortSignal.timeout(8e3)}).then(f=>f.ok?f.json():void 0),g.set(a.manifestUrl,d),d.then(f=>{f||g.delete(a.manifestUrl)},()=>g.delete(a.manifestUrl)));let E=await d;if(E){let f=E.schemaVersion;if(typeof f=="number"&&(!Number.isInteger(f)||f>1)){_({remote:t,error:new S(R.PRELOAD_FAILED,`unsupported manifest schemaVersion ${String(f)} (expected 1)`,{remote:t})}),await p(a.entry,"modulepreload");return}await p(a.entry,"modulepreload");let m=E.exposes,$=Array.isArray(m)?m.filter(M=>M&&typeof M=="object").map(M=>[String(M.name??""),M]):m&&typeof m=="object"?Object.entries(m):[],v=o?$.filter(([M,O])=>z(String(O?.name??M))===o):$,I=[];for(let[,M]of v)if(typeof M?.file=="string"&&await p(h(M.file),"modulepreload"),Array.isArray(M?.css))for(let O of M.css){if(typeof O!="string")continue;let me=p(h(O),"style");i==="preload"&&I.push(me)}await Promise.all(I);return}}await p(a.entry,"modulepreload")}catch(d){_({remote:t,error:new S(R.PRELOAD_FAILED,String(d?.message??d),{remote:t})})}}return typeof window>"u"||(window.__FULGURJS_SCOPE__=s,window.__FULGURJS_INFO__={get remotes(){let e={};for(let[r,t]of c)e[r]={...t.debug,entry:t.entry};return e},errors:[]}),{shareScopeMap:s,initSharing:te,registerShare:ne,registerRemotes:H,registerRemote:ie,registerPlugins:se,loadShare:ae,loadRemote:ue,getContainer:fe,preloadRemote:F,parseSpec:C,clearSessionState:re}}var W=globalThis,P=W.__FULGURJS_RUNTIME__??Ie();W.__FULGURJS_RUNTIME__=P;try{Object.freeze(P)}catch{}var Ne=J;function Ce(){return P}var Fe=P.initSharing,De=P.registerShare,Ve=P.registerRemotes,Ke=P.registerRemote,He=P.registerPlugins,qe=P.loadShare,Ge=P.loadRemote,Xe=P.getContainer,ze=P.preloadRemote,Je=P.parseSpec,Be=P.clearSessionState,We=P.shareScopeMap;function Ye(s){if(s&&typeof s=="object"&&"default"in s){let c=s.default;return c!==void 0?c:s}return s}var Ze=P;export{Be as clearSessionState,Ze as default,Xe as getContainer,Ce as getRuntime,Fe as initSharing,Ge as loadRemote,qe as loadShare,Je as parseSpec,ze as preloadRemote,He as registerPlugins,Ke as registerRemote,Ve as registerRemotes,De as registerShare,P as runtime,We as shareScopeMap,Ye as unwrapDefault,Ne as version};\n';
1702
1788
 
1703
1789
  // src/index.ts
1704
1790
  function readRuntimeCode() {
@@ -1970,7 +2056,7 @@ export { default } from ${JSON.stringify(url)};
1970
2056
  const slash = bareClean.indexOf("/");
1971
2057
  if (slash > 0) {
1972
2058
  const prefix = bareClean.slice(0, slash);
1973
- const known = n.remotes.some((r) => r.key === prefix) || n.shared.some((sh) => sh.aliases.includes(prefix) || sh.aliases.some((a) => a.endsWith("/") && prefix.startsWith(a)));
2059
+ const known = bareClean === "@fulgurjs/federation/runtime" || n.remotes.some((r) => r.key === prefix) || n.shared.some((sh) => sh.aliases.includes(prefix) || sh.aliases.some((a) => a.endsWith("/") && prefix.startsWith(a)));
1974
2060
  if (!known && !warnedUnknownPrefixes.has(prefix)) {
1975
2061
  warnedUnknownPrefixes.add(prefix);
1976
2062
  console.warn(
@@ -1983,7 +2069,7 @@ export { default } from ${JSON.stringify(url)};
1983
2069
  if (bareClean === RUNTIME_PROXY_VIRTUAL_ID) return RESOLVED.runtimeProxy;
1984
2070
  if (bareClean === INIT_VIRTUAL_ID) return RESOLVED.init;
1985
2071
  if (bareClean === "virtual:fulgurjs-remote-schema") return bareClean;
1986
- if (bareClean === "virtual:fulgurjs-api") return bareClean;
2072
+ if (bareClean === "virtual:fulgurjs-api-facade") return bareClean;
1987
2073
  if (bareClean === "virtual:fulgurjs-provides") return RESOLVED.provides;
1988
2074
  if (bareClean === "virtual:fulgurjs-remote-entry") return RESOLVED.remoteEntry;
1989
2075
  if (bareClean.startsWith(SHARED_NS_FACADE_PREFIX)) {
@@ -2010,13 +2096,13 @@ export { default } from ${JSON.stringify(url)};
2010
2096
  if (clean === "virtual:fulgurjs-provides" && state.normalized) {
2011
2097
  return genDevProvides(state.normalized);
2012
2098
  }
2013
- if (clean === "virtual:fulgurjs-api") {
2014
- return genApiFacade(state.command);
2099
+ if (clean === "virtual:fulgurjs-api-facade" && state.command === "serve") {
2100
+ return genApiFacade();
2015
2101
  }
2016
2102
  if (clean === "virtual:fulgurjs-remote-schema" && state.normalized) {
2017
2103
  if (state.command === "build") return genEmptyRemoteSchemaModule();
2018
2104
  remoteSchemaPromise ??= probeRemotesAndBuildSchema(state.normalized).then(
2019
- (schema) => `export default ${JSON.stringify(schema)}`
2105
+ genRemoteSchemaModule
2020
2106
  );
2021
2107
  return remoteSchemaPromise;
2022
2108
  }
@@ -2316,7 +2402,7 @@ ${code}`, map: null };
2316
2402
  server.httpServer?.once("listening", () => {
2317
2403
  setTimeout(() => {
2318
2404
  remoteSchemaPromise ??= probeRemotesAndBuildSchema(n).then(
2319
- (schema) => `export default ${JSON.stringify(schema)}`
2405
+ genRemoteSchemaModule
2320
2406
  );
2321
2407
  }, 5e3);
2322
2408
  });
@@ -2347,17 +2433,20 @@ ${code}`, map: null };
2347
2433
  async transform(code, id) {
2348
2434
  if (!state.normalized) return null;
2349
2435
  const clean = id.split("?")[0];
2436
+ const isAppSource = clean.startsWith(state.normalized.root + import_node_path6.default.sep) && !clean.includes(`${import_node_path6.default.sep}node_modules${import_node_path6.default.sep}`) && !clean.includes(`${import_node_path6.default.sep}.vite${import_node_path6.default.sep}`);
2437
+ const entryRewrite = state.command === "serve" && isAppSource ? await rewriteRuntimeEntryImports(code, isExposeTargetFile(clean, state.normalized.root, state.normalized.exposes)) : null;
2438
+ if (entryRewrite !== null) code = entryRewrite;
2350
2439
  if (state.command === "serve" && code.includes("virtual:fulgurjs-runtime") && !code.includes("virtual:fulgurjs-runtime-proxy") && isExposeTargetFile(clean, state.normalized.root, state.normalized.exposes)) {
2351
2440
  return { code: code.split("virtual:fulgurjs-runtime").join("virtual:fulgurjs-runtime-proxy"), map: null };
2352
2441
  }
2353
- if (state.command === "serve" && isPluginProcessedModule(code)) return null;
2354
- if (/type=(style|template)/.test(id)) return null;
2442
+ if (state.command === "serve" && isPluginProcessedModule(code)) return entryRewrite === null ? null : { code, map: null };
2443
+ if (/type=(style|template)/.test(id)) return entryRewrite === null ? null : { code, map: null };
2355
2444
  const isJsLike = /\.(m|c)?[jt]sx?$/.test(clean) || clean.endsWith(".vue");
2356
- if (!isJsLike) return null;
2445
+ if (!isJsLike) return entryRewrite === null ? null : { code, map: null };
2357
2446
  const devRewriteAll = state.command === "serve" && state.normalized.devSharedSelf;
2358
2447
  const isPureRemoteBuild = state.normalized.exposes.length > 0 && state.normalized.remotes.length === 0;
2359
2448
  if (state.command === "serve" && clean.includes("node_modules") && !id.includes(".vite/deps") && !devRewriteAll) {
2360
- return null;
2449
+ return entryRewrite === null ? null : { code, map: null };
2361
2450
  }
2362
2451
  if (state.command === "build") {
2363
2452
  return buildFallbackTransform(code, id);
@@ -2374,13 +2463,14 @@ ${code}`, map: null };
2374
2463
  if (!cleanPath.startsWith("/")) return null;
2375
2464
  return state.resolvedSharedPaths.get(cleanPath) ?? null;
2376
2465
  };
2377
- return transformModule(code, id, {
2466
+ const transformed = await transformModule(code, id, {
2378
2467
  onRewrite: () => recordRewritten(id),
2379
2468
  options: state.normalized,
2380
2469
  remapSpecifier,
2381
2470
  rewriteShared,
2382
2471
  sharedClosureRoots: state.sharedClosureRoots
2383
2472
  });
2473
+ return transformed ?? (entryRewrite === null ? null : { code, map: null });
2384
2474
  }
2385
2475
  };
2386
2476
  function warmResolvedSharedPaths(server) {
package/dist/index.d.cts CHANGED
@@ -1,96 +1,6 @@
1
1
  import { Plugin } from 'vite';
2
-
3
- interface SharedHint {
4
- /** 放入共享作用域的本地模块;false 表示不提供本地副本 */
5
- import?: string | false;
6
- /** 用于从 package.json 推断 requiredVersion 的包名 */
7
- packageName?: string;
8
- /** 期望版本(完整 semver 语法 / false 接受任意) */
9
- requiredVersion?: string | false;
10
- /** 只允许单实例 */
11
- singleton?: boolean;
12
- /** 版本无效时抛运行时错误(默认:有本地副本且非 singleton 时为 true,对齐 webpack) */
13
- strictVersion?: boolean;
14
- /** 在共享作用域中的键(导入名与共享名不同时使用) */
15
- shareKey?: string;
16
- /** 共享作用域命名空间 */
17
- shareScope?: string;
18
- /** 同步提供(打进初始 chunk,总是被下载) */
19
- eager?: boolean;
20
- /** 提供版本显式指定 */
21
- version?: string;
22
- }
23
- type SharedConfig = string[] | Record<string, string | SharedHint>;
24
- interface ExposeHint {
25
- import: string;
26
- /** 稳定 chunk 文件名(不写则内部 id,随构建变化) */
27
- name?: string;
28
- }
29
- interface RemoteEntryConfig {
30
- external?: string;
31
- shareScope?: string;
32
- /** dev 专用地址(缺省回落 external) */
33
- dev?: string;
34
- /** prod 专用地址(缺省回落 external) */
35
- prod?: string;
36
- timeout?: number;
37
- retries?: number;
38
- /** 备用 remoteEntry 地址 */
39
- fallback?: string[];
40
- breaker?: {
41
- threshold?: number;
42
- resetMs?: number;
43
- };
44
- }
45
- interface FederationOptions {
46
- name: string;
47
- filename?: string;
48
- exposes?: Record<string, string | ExposeHint>;
49
- remotes?: Record<string, string | RemoteEntryConfig | (() => Promise<any>)>;
50
- shared?: SharedConfig;
51
- shareScope?: string;
52
- remoteType?: string;
53
- library?: {
54
- type?: string;
55
- name?: string;
56
- };
57
- runtime?: string | false;
58
- runtimeChunk?: boolean | 'single';
59
- manifest?: boolean | Record<string, unknown>;
60
- runtimePlugins?: string[];
61
- dts?: boolean | {
62
- dir?: string;
63
- mode?: 'source' | 'shim';
64
- };
65
- /** 接受并恒为 true:TLA 天然异步边界,无需手工 bootstrap(比 webpack 更进一步) */
66
- automaticAsyncBoundary?: boolean;
67
- /** 接受并恒为 true:preloadRemote 能力始终可用 */
68
- dataPrefetch?: boolean;
69
- /** 接受 no-op:Rollup/Rolldown 原生 tree-shaking 已覆盖 */
70
- usedExports?: boolean;
71
- ignoreUnusedSharedExports?: boolean;
72
- /**
73
- * dev 下自身源码(含依赖,需配合 optimizeDeps.exclude)是否参与 shared 协商改写。
74
- * 默认:纯 remote(无 remotes)为 true——被宿主消费的组件需协商到宿主实例;
75
- * 有 remotes 的宿主为 false——自身 import 即自身 provide,避免巨型工程 TLA/循环依赖风险。
76
- * 双向联邦(宿主同时 expose 组件给更高层消费)显式设 true。
77
- */
78
- devSharedSelf?: boolean;
79
- /**
80
- * dev 跨源访问策略(插件端点 /@fulgurjs-entry.js、/@fulgurjs-manifest.json 与 server.cors
81
- * 共用同一来源)。缺省 = '*'(现状兼容:端点与 server.cors 全放开);'*' = 显式全放开(不告警);
82
- * 数组 = 来源 allowlist(端点按 Origin 反射匹配,不匹配省略头;server.cors 传 { origin: [...] },
83
- * 用户显式配置的 server.cors 永远优先)。
84
- */
85
- devCorsOrigins?: string[] | '*';
86
- /**
87
- * dev manifest 是否携带 fsRoot(remote 根目录本机绝对路径,宿主 dts 类型直连用)。
88
- * 默认 true(现状兼容);false 时不写入 manifest,宿主 dts 降级为 any 桩并给出提示。
89
- * fsRoot 是 dev-only 字段,永不进入 prod manifest。
90
- */
91
- devFsRoot?: boolean;
92
- }
2
+ import { F as FederationOptions } from './options-CRGpSmVj.cjs';
93
3
 
94
4
  declare function federation(options: FederationOptions): Plugin[];
95
5
 
96
- export { type FederationOptions, federation as default, federation };
6
+ export { FederationOptions, federation as default, federation };