@fulgurjs/federation 6.8.7 → 6.9.1

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.
Files changed (139) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.en.md +3 -0
  3. package/README.md +3 -0
  4. package/dist/application-core-BuhXQmLF.d.cts +16 -0
  5. package/dist/application-core-DWI3eKme.d.ts +16 -0
  6. package/dist/bridge-app-react.cjs +177 -9
  7. package/dist/bridge-app-react.d.cts +15 -3
  8. package/dist/bridge-app-react.d.ts +15 -3
  9. package/dist/bridge-app-react.js +101 -9
  10. package/dist/bridge-app-vue.cjs +138 -12
  11. package/dist/bridge-app-vue.d.cts +20 -5
  12. package/dist/bridge-app-vue.d.ts +20 -5
  13. package/dist/bridge-app-vue.js +62 -12
  14. package/dist/bridge-host-react.d.cts +1 -1
  15. package/dist/bridge-host-react.d.ts +1 -1
  16. package/dist/bridge-host-vue.d.cts +1 -1
  17. package/dist/bridge-host-vue.d.ts +1 -1
  18. package/dist/chunk-6OB47FSR.js +81 -0
  19. package/dist/cli.js +349 -23
  20. package/dist/index.cjs +7 -6
  21. package/dist/index.js +7 -6
  22. package/dist/react-adapter.d.cts +1 -1
  23. package/dist/react-adapter.d.ts +1 -1
  24. package/dist/react.d.ts +29 -4
  25. package/dist/react.js +1 -0
  26. package/dist/{remote-types-xf1B6_pK.d.ts → remote-types-COmBhjRc.d.ts} +1 -1
  27. package/dist/{remote-types-58hdbx6x.d.cts → remote-types-CStGOJwu.d.cts} +1 -1
  28. package/dist/runtime.js +1 -1
  29. package/dist/vue-adapter.d.cts +1 -1
  30. package/dist/vue-adapter.d.ts +1 -1
  31. package/dist/vue-store.cjs +40 -0
  32. package/dist/vue-store.d.cts +4 -0
  33. package/dist/vue-store.d.ts +4 -0
  34. package/dist/vue-store.js +15 -0
  35. package/dist/vue.d.ts +37 -6
  36. package/dist/vue.js +2 -0
  37. package/docs/en/reference/api.md +38 -2
  38. package/docs/en/reference/types.md +27 -0
  39. package/docs/zh/reference/api.md +46 -2
  40. package/docs/zh/reference/types.md +27 -0
  41. package/examples/templates/README.md +3 -0
  42. package/examples/templates/react-host-vue-remote/README.md +24 -0
  43. package/examples/templates/react-host-vue-remote/package.json +2 -1
  44. package/examples/templates/react-host-vue-remote/pnpm-lock.yaml +189 -189
  45. package/examples/templates/react-host-vue-remote/pnpm-workspace.yaml +1 -1
  46. package/examples/templates/react-host-vue-remote/react-host/package.json +1 -1
  47. package/examples/templates/react-host-vue-remote/react-host/src/application.tsx +62 -0
  48. package/examples/templates/react-host-vue-remote/react-host/src/main.tsx +2 -62
  49. package/examples/templates/react-host-vue-remote/scripts/prod.mjs +101 -0
  50. package/examples/templates/react-host-vue-remote/vue-remote/README.md +17 -16
  51. package/examples/templates/react-host-vue-remote/vue-remote/fulgurjs.config.ts +2 -2
  52. package/examples/templates/react-host-vue-remote/vue-remote/package.json +1 -1
  53. package/examples/templates/react-host-vue-remote/vue-remote/src/AboutPage.vue +1 -0
  54. package/examples/templates/react-host-vue-remote/vue-remote/src/App.vue +15 -5
  55. package/examples/templates/react-host-vue-remote/vue-remote/src/HomePage.vue +1 -0
  56. package/examples/templates/react-host-vue-remote/vue-remote/src/application.ts +19 -0
  57. package/examples/templates/react-host-vue-remote/vue-remote/src/main.ts +2 -15
  58. package/examples/templates/react-react/README.md +25 -1
  59. package/examples/templates/react-react/host/package.json +1 -1
  60. package/examples/templates/react-react/host/src/application.tsx +33 -0
  61. package/examples/templates/react-react/host/src/main.tsx +3 -32
  62. package/examples/templates/react-react/package.json +2 -1
  63. package/examples/templates/react-react/pnpm-lock.yaml +123 -123
  64. package/examples/templates/react-react/pnpm-workspace.yaml +1 -1
  65. package/examples/templates/react-react/remote/package.json +1 -1
  66. package/examples/templates/react-react/remote/src/application.tsx +11 -0
  67. package/examples/templates/react-react/remote/src/main.tsx +3 -10
  68. package/examples/templates/react-react/scripts/prod.mjs +101 -0
  69. package/examples/templates/showcase/README.md +35 -7
  70. package/examples/templates/showcase/package.json +2 -1
  71. package/examples/templates/showcase/pnpm-lock.yaml +196 -196
  72. package/examples/templates/showcase/pnpm-workspace.yaml +1 -1
  73. package/examples/templates/showcase/react-host/package.json +1 -1
  74. package/examples/templates/showcase/react-host/src/application.tsx +28 -0
  75. package/examples/templates/showcase/react-host/src/demo-log.ts +5 -8
  76. package/examples/templates/showcase/react-host/src/main.tsx +2 -33
  77. package/examples/templates/showcase/react-host/src/routing.ts +2 -2
  78. package/examples/templates/showcase/react-remote/fulgurjs.config.ts +1 -1
  79. package/examples/templates/showcase/react-remote/package.json +1 -1
  80. package/examples/templates/showcase/react-remote/src/ChildLayout.tsx +3 -2
  81. package/examples/templates/showcase/react-remote/src/{bridge.tsx → application.tsx} +21 -21
  82. package/examples/templates/showcase/react-remote/src/child-bus.ts +23 -23
  83. package/examples/templates/showcase/react-remote/src/main.tsx +2 -18
  84. package/examples/templates/showcase/react-remote/src/pages/Locked.tsx +2 -1
  85. package/examples/templates/showcase/react-remote/src/pages/OrderDetail.tsx +2 -1
  86. package/examples/templates/showcase/react-remote/src/pages/OrderList.tsx +2 -1
  87. package/examples/templates/showcase/scripts/prod.mjs +101 -0
  88. package/examples/templates/showcase/vue-host/package.json +1 -1
  89. package/examples/templates/showcase/vue-host/src/application.ts +28 -0
  90. package/examples/templates/showcase/vue-host/src/demo-log.ts +4 -7
  91. package/examples/templates/showcase/vue-host/src/main.ts +2 -30
  92. package/examples/templates/showcase/vue-host/src/routing.ts +2 -2
  93. package/examples/templates/showcase/vue-remote/fulgurjs.config.ts +1 -1
  94. package/examples/templates/showcase/vue-remote/package.json +1 -1
  95. package/examples/templates/showcase/vue-remote/src/ChildLayout.vue +3 -2
  96. package/examples/templates/showcase/vue-remote/src/{bridge.ts → application.ts} +10 -13
  97. package/examples/templates/showcase/vue-remote/src/child-bus.ts +23 -23
  98. package/examples/templates/showcase/vue-remote/src/main.ts +2 -16
  99. package/examples/templates/showcase/vue-remote/src/pages/Locked.vue +2 -1
  100. package/examples/templates/showcase/vue-remote/src/pages/OrderDetail.vue +2 -1
  101. package/examples/templates/showcase/vue-remote/src/pages/OrderList.vue +2 -1
  102. package/examples/templates/vue-host-react-remote/README.md +24 -0
  103. package/examples/templates/vue-host-react-remote/package.json +2 -1
  104. package/examples/templates/vue-host-react-remote/pnpm-lock.yaml +184 -184
  105. package/examples/templates/vue-host-react-remote/pnpm-workspace.yaml +1 -1
  106. package/examples/templates/vue-host-react-remote/react-remote/README.md +17 -17
  107. package/examples/templates/vue-host-react-remote/react-remote/fulgurjs.config.ts +2 -2
  108. package/examples/templates/vue-host-react-remote/react-remote/package.json +1 -1
  109. package/examples/templates/vue-host-react-remote/react-remote/src/{bridge.tsx → application.tsx} +13 -24
  110. package/examples/templates/vue-host-react-remote/react-remote/src/main.tsx +2 -7
  111. package/examples/templates/vue-host-react-remote/scripts/prod.mjs +101 -0
  112. package/examples/templates/vue-host-react-remote/vue-host/package.json +1 -1
  113. package/examples/templates/vue-host-react-remote/vue-host/src/application.ts +5 -0
  114. package/examples/templates/vue-host-react-remote/vue-host/src/main.ts +2 -4
  115. package/examples/templates/vue-vue/README.md +25 -1
  116. package/examples/templates/vue-vue/host/package.json +1 -1
  117. package/examples/templates/vue-vue/host/src/application.ts +54 -0
  118. package/examples/templates/vue-vue/host/src/main.ts +3 -50
  119. package/examples/templates/vue-vue/package.json +2 -1
  120. package/examples/templates/vue-vue/pnpm-lock.yaml +182 -182
  121. package/examples/templates/vue-vue/pnpm-workspace.yaml +1 -1
  122. package/examples/templates/vue-vue/remote/package.json +1 -1
  123. package/examples/templates/vue-vue/remote/src/application.ts +6 -0
  124. package/examples/templates/vue-vue/remote/src/main.ts +3 -5
  125. package/examples/templates/vue-vue/scripts/prod.mjs +101 -0
  126. package/package.json +14 -9
  127. package/examples/templates/react-host-vue-remote/react-host/src/fulgurjs/types/bridge-vue-remote/metadata.json +0 -15
  128. package/examples/templates/react-host-vue-remote/react-host/src/fulgurjs/types/bridge-vue-remote/modules.d.ts +0 -14
  129. package/examples/templates/react-host-vue-remote/react-host/src/fulgurjs/types/bridge-vue-remote/registry.d.ts +0 -10
  130. package/examples/templates/react-host-vue-remote/vue-remote/src/bridge.ts +0 -57
  131. package/examples/templates/showcase/react-host/src/fulgurjs/types/vue-remote/metadata.json +0 -16
  132. package/examples/templates/showcase/react-host/src/fulgurjs/types/vue-remote/modules.d.ts +0 -71
  133. package/examples/templates/showcase/react-host/src/fulgurjs/types/vue-remote/registry.d.ts +0 -10
  134. package/examples/templates/showcase/vue-host/src/fulgurjs/types/react-remote/metadata.json +0 -16
  135. package/examples/templates/showcase/vue-host/src/fulgurjs/types/react-remote/modules.d.ts +0 -79
  136. package/examples/templates/showcase/vue-host/src/fulgurjs/types/react-remote/registry.d.ts +0 -10
  137. package/examples/templates/vue-host-react-remote/vue-host/src/fulgurjs/types/bridge-react-remote/metadata.json +0 -16
  138. package/examples/templates/vue-host-react-remote/vue-host/src/fulgurjs/types/bridge-react-remote/modules.d.ts +0 -10
  139. package/examples/templates/vue-host-react-remote/vue-host/src/fulgurjs/types/bridge-react-remote/registry.d.ts +0 -10
package/dist/cli.js CHANGED
@@ -236,18 +236,18 @@ function validateHostPages(value) {
236
236
  }
237
237
  return hp;
238
238
  }
239
- function validatePathsInsideApp(options, appRoot, fs10, path9) {
239
+ function validatePathsInsideApp(options, appRoot, fs11, path10) {
240
240
  const checkModule = (field, value) => {
241
241
  if (typeof value !== "string" || value.trim() === "") return;
242
- if (/^(https?:)?\/\//.test(value) || path9.isAbsolute(value)) {
242
+ if (/^(https?:)?\/\//.test(value) || path10.isAbsolute(value)) {
243
243
  appConfigError(
244
244
  `${field} "${value}" \u4E0D\u662F\u672C\u9879\u76EE\u5185\u7684\u6A21\u5757\u8DEF\u5F84`,
245
245
  "exposes/setup \u7684\u503C\u662F\u76F8\u5BF9\u672C\u5E94\u7528\u6839\u76EE\u5F55\u7684\u6E90\u6587\u4EF6\u8DEF\u5F84\uFF08URL/\u7EDD\u5BF9\u8DEF\u5F84\u65E0\u6CD5\u5728\u72EC\u7ACB\u4ED3\u5E93\u95F4\u79FB\u690D\uFF09",
246
246
  `\u6539\u4E3A\u76F8\u5BF9\u8DEF\u5F84\uFF0C\u5982 './src/views/Home.vue'\uFF08\u914D\u7F6E\u6587\u4EF6\u76EE\u5F55 = \u5E94\u7528\u6839 ${appRoot}\uFF09`
247
247
  );
248
248
  }
249
- const abs = path9.resolve(appRoot, value);
250
- if (!fs10.existsSync(abs)) {
249
+ const abs = path10.resolve(appRoot, value);
250
+ if (!fs11.existsSync(abs)) {
251
251
  appConfigError(
252
252
  `${field} \u6307\u5411\u7684\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${value}`,
253
253
  `\u6309\u5E94\u7528\u6839 ${appRoot} \u89E3\u6790\u540E\u672A\u627E\u5230\u8BE5\u6587\u4EF6`,
@@ -316,11 +316,11 @@ function resolveEsbuild(configPath) {
316
316
  );
317
317
  }
318
318
  async function loadAppConfig(configPath) {
319
- const fs10 = await import("node:fs");
319
+ const fs11 = await import("node:fs");
320
320
  const os = await import("node:os");
321
- const path9 = await import("node:path");
322
- const abs = path9.resolve(configPath);
323
- if (!fs10.existsSync(abs)) {
321
+ const path10 = await import("node:path");
322
+ const abs = path10.resolve(configPath);
323
+ if (!fs11.existsSync(abs)) {
324
324
  appConfigError(
325
325
  `\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${abs}`,
326
326
  "--config \u6307\u5411\u7684\u8DEF\u5F84\u5728\u672C\u673A\u4E0D\u5B58\u5728\uFF08\u76F8\u5BF9\u8DEF\u5F84\u4EE5 CLI \u8FDB\u7A0B cwd \u89E3\u6790\uFF09",
@@ -328,11 +328,11 @@ async function loadAppConfig(configPath) {
328
328
  );
329
329
  }
330
330
  if (abs.endsWith(".json")) {
331
- const parsed = JSON.parse(fs10.readFileSync(abs, "utf8"));
331
+ const parsed = JSON.parse(fs11.readFileSync(abs, "utf8"));
332
332
  if (isAggregateShape(parsed)) aggregateMigrationError();
333
- return finishAppShape(parsed, {}, abs, path9.dirname(abs), fs10, path9);
333
+ return finishAppShape(parsed, {}, abs, path10.dirname(abs), fs11, path10);
334
334
  }
335
- const rawSource = fs10.readFileSync(abs, "utf8");
335
+ const rawSource = fs11.readFileSync(abs, "utf8");
336
336
  if (/@fulgurjs\/federation\/config/.test(rawSource)) {
337
337
  appConfigError(
338
338
  `\u914D\u7F6E\u5BFC\u5165\u4E86\u5DF2\u5220\u9664\u7684\u5B50\u8DEF\u5F84 "@fulgurjs/federation/config"`,
@@ -363,21 +363,21 @@ async function loadAppConfig(configPath) {
363
363
  plugins: [selfRedirect],
364
364
  logLevel: "silent"
365
365
  });
366
- const tmpDir = fs10.mkdtempSync(path9.join(os.tmpdir(), "fulgurjs-appcfg-"));
366
+ const tmpDir = fs11.mkdtempSync(path10.join(os.tmpdir(), "fulgurjs-appcfg-"));
367
367
  try {
368
- const bundleFile = path9.join(tmpDir, "fulgurjs.config.bundle.mjs");
369
- fs10.writeFileSync(bundleFile, out.outputFiles[0].text);
368
+ const bundleFile = path10.join(tmpDir, "fulgurjs.config.bundle.mjs");
369
+ fs11.writeFileSync(bundleFile, out.outputFiles[0].text);
370
370
  const mod = await import(
371
371
  /* @vite-ignore */
372
372
  `${pathToFileURL(bundleFile).href}?t=${Date.now()}`
373
373
  );
374
374
  if (isAggregateShape(mod.default)) aggregateMigrationError();
375
- return finishAppShape(mod.default, { hostPages: mod.hostPages }, abs, path9.dirname(abs), fs10, path9);
375
+ return finishAppShape(mod.default, { hostPages: mod.hostPages }, abs, path10.dirname(abs), fs11, path10);
376
376
  } finally {
377
- fs10.rmSync(tmpDir, { recursive: true, force: true });
377
+ fs11.rmSync(tmpDir, { recursive: true, force: true });
378
378
  }
379
379
  }
380
- function finishAppShape(def, named, configPath, appRoot, fs10, path9) {
380
+ function finishAppShape(def, named, configPath, appRoot, fs11, path10) {
381
381
  if (def === void 0 || def === null) {
382
382
  appConfigError(
383
383
  "fulgurjs.config.ts \u6CA1\u6709\u53EF\u7528\u7684\u9ED8\u8BA4\u5BFC\u51FA",
@@ -390,7 +390,7 @@ function finishAppShape(def, named, configPath, appRoot, fs10, path9) {
390
390
  }
391
391
  const options = def;
392
392
  validateAppOptions(options);
393
- validatePathsInsideApp(options, appRoot, fs10, path9);
393
+ validatePathsInsideApp(options, appRoot, fs11, path10);
394
394
  const hostPages = named.hostPages !== void 0 ? validateHostPages(named.hostPages) : void 0;
395
395
  return {
396
396
  kind: "app",
@@ -522,6 +522,10 @@ function checklistFor(scenario) {
522
522
  out.push(" \u5B8C\u6574\u5B50\u5E94\u7528\uFF08\u81EA\u5E26 Router/store\uFF09\u7528\u6865\u63A5 createVueBridgeApp/createReactBridgeApp\u2014\u2014\u5BBF\u4E3B\u53EA\u914D\u6302\u8F7D\u524D\u7F00\u4E0E\u5165\u53E3\uFF0C");
523
523
  out.push(" \u5B50\u5E94\u7528\u4FDD\u7559\u81EA\u5DF1\u7684 Router \u4E0E\u4E1A\u52A1\u83DC\u5355\uFF0C\u4E0D\u9010\u9875\u767B\u8BB0\u5185\u90E8\u9875\u9762");
524
524
  }
525
+ if (provide) {
526
+ out.push(" \u5B8C\u6574\u5B50\u5E94\u7528\u63A8\u8350 defineApplication\uFF1A\u4E00\u4EFD\u88C5\u914D\u7528\u4E8E\u72EC\u7ACB application.start \u4E0E\u8FDC\u7A0B\u9ED8\u8BA4\u5BFC\u51FA\uFF0C");
527
+ out.push(" \u4E0D\u518D\u590D\u5236 main/bridge \u4E24\u5957\u521D\u59CB\u5316\u3002\u5DF2\u6709 router/\u5B88\u536B\u7EE7\u7EED\u590D\u7528\uFF1B\u6309 context.mode \u9009\u62E9 web/memory \u8DEF\u7531\u3002");
528
+ }
525
529
  out.push("4. shared \u91CC\u53EA\u5217\u300C\u9879\u76EE\u5B9E\u9645\u5B89\u88C5\u4E14\u8DE8\u5E94\u7528\u5171\u4EAB\u300D\u7684\u5E93\uFF0C\u8DE8\u5E94\u7528\u540C\u5B9E\u4F8B\u7684\uFF08vue/react/react-dom/router/store\uFF09\u914D singleton: true\uFF1B");
526
530
  out.push(" \u72EC\u7ACB Router/store \u7684\u5B8C\u6574\u5B50\u5E94\u7528\u9694\u79BB\u8BBE\u8BA1\u662F\u5408\u6CD5\u7684\u2014\u2014\u4E0D\u662F\u6240\u6709\u5171\u4EAB\u9879\u90FD\u5FC5\u987B singleton");
527
531
  if (consume) {
@@ -533,6 +537,7 @@ function checklistFor(scenario) {
533
537
  out.push(APP_ENTRY_NOTE[framework]);
534
538
  out.push('6. dev \u51B7\u542F\u52A8\u9996\u8F6E 30~60s \u6709\u9884\u6784\u5EFA\u7A97\u53E3\uFF08\u77AC\u65F6 504/"ce"\uFF0CDEV-010\uFF09\uFF1A\u5148\u771F\u5B9E\u6253\u5F00\u9875\u9762\u9884\u70ED\u518D\u505A\u65AD\u8A00');
535
539
  out.push("7. \u914D\u7F6E\u89E3\u91CA\uFF1Afulgurjs explain\uFF1B\u90E8\u7F72\u4F53\u68C0\uFF1Afulgurjs doctor --base <URL> --apps <\u90E8\u7F72\u5B50\u76EE\u5F55...>");
540
+ out.push(" \u63A5\u5165\u524D\u5148\u8FD0\u884C fulgurjs doctor --config ./fulgurjs.config.ts\uFF08\u672C\u5730\u9884\u68C0\uFF0C\u4E0D\u4EE3\u8868\u6D4F\u89C8\u5668\u9A8C\u6536\u901A\u8FC7\uFF09");
536
541
  if (consume) {
537
542
  out.push(" \uFF08--apps \u662F\u7AD9\u70B9\u6839\u4E0B\u7684\u90E8\u7F72\u5B50\u76EE\u5F55\uFF0C\u4E0D\u662F\u5BB9\u5668\u540D\uFF09");
538
543
  out.push("8. \u4EC5\u9010\u9875\u63A5\u5165\u7684\u5BBF\u4E3B\uFF1A\u9875\u9762\u5951\u7EA6\u6838\u5BF9 fulgurjs check-pages\uFF08--manifest/--site \u6307\u5B9A\u8FDC\u7A0B manifest \u6765\u6E90\uFF09\uFF1B");
@@ -833,8 +838,8 @@ function nodeEnginesViolation(nodeVersion, range) {
833
838
  if (!range) return void 0;
834
839
  const m = range.trim().match(/^>=?(\d+)\.(\d+)(?:\.(\d+))?/);
835
840
  if (!m) return void 0;
836
- const parse = (v) => v.replace(/^v/, "").split(/[.-]/).map((x) => Number(x) || 0);
837
- const [curMajor, curMinor = 0, curPatch = 0] = parse(nodeVersion);
841
+ const parse2 = (v) => v.replace(/^v/, "").split(/[.-]/).map((x) => Number(x) || 0);
842
+ const [curMajor, curMinor = 0, curPatch = 0] = parse2(nodeVersion);
838
843
  const [minMajor, minMinor = 0, minPatch = 0] = [Number(m[1]), Number(m[2] ?? 0), Number(m[3] ?? 0)];
839
844
  const ge = (a, b) => a[0] !== b[0] ? a[0] > b[0] : a[1] !== b[1] ? a[1] > b[1] : (a[2] ?? 0) >= (b[2] ?? 0);
840
845
  if (range.startsWith(">=")) {
@@ -1453,7 +1458,7 @@ var RUNTIME_VERSION;
1453
1458
  var init_version = __esm({
1454
1459
  "src/version.ts"() {
1455
1460
  "use strict";
1456
- RUNTIME_VERSION = "6.8.7";
1461
+ RUNTIME_VERSION = "6.9.1";
1457
1462
  }
1458
1463
  });
1459
1464
 
@@ -2069,8 +2074,8 @@ function computeStaticClosure(ts, entryFiles, resolver, root) {
2069
2074
  }
2070
2075
  if (file.endsWith(".vue")) {
2071
2076
  const req = createRequire3(path4.join(root, "package.json"));
2072
- const { parse } = req("vue/compiler-sfc");
2073
- const { descriptor } = parse(text);
2077
+ const { parse: parse2 } = req("vue/compiler-sfc");
2078
+ const { descriptor } = parse2(text);
2074
2079
  text = [descriptor.script?.content, descriptor.scriptSetup?.content].filter(Boolean).join("\n");
2075
2080
  if (descriptor.script?.src) text += `
2076
2081
  import ${JSON.stringify(descriptor.script.src)}`;
@@ -3395,6 +3400,303 @@ var init_port = __esm({
3395
3400
  }
3396
3401
  });
3397
3402
 
3403
+ // node_modules/es-module-lexer/dist/lexer.js
3404
+ function parse(E2, g = "@") {
3405
+ if (!C) return init.then((() => parse(E2)));
3406
+ const I = E2.length + 1, w = (C.__heap_base.value || C.__heap_base) + 4 * I - C.memory.buffer.byteLength;
3407
+ w > 0 && C.memory.grow(Math.ceil(w / 65536));
3408
+ const K = C.sa(I - 1);
3409
+ if ((A ? B : Q)(E2, new Uint16Array(C.memory.buffer, K, I)), !C.parse()) throw Object.assign(new Error(`Parse error ${g}:${E2.slice(0, C.e()).split("\n").length}:${C.e() - E2.lastIndexOf("\n", C.e() - 1)}`), { idx: C.e() });
3410
+ const o = [], D = [];
3411
+ for (; C.ri(); ) {
3412
+ const A2 = C.is(), Q2 = C.ie(), B2 = C.it(), g2 = C.ai(), I2 = C.id(), w2 = C.ss(), K2 = C.se();
3413
+ let D2;
3414
+ C.ip() && (D2 = k(E2.slice(-1 === I2 ? A2 - 1 : A2, -1 === I2 ? Q2 + 1 : Q2))), o.push({ n: D2, t: B2, s: A2, e: Q2, ss: w2, se: K2, d: I2, a: g2 });
3415
+ }
3416
+ for (; C.re(); ) {
3417
+ const A2 = C.es(), Q2 = C.ee(), B2 = C.els(), g2 = C.ele(), I2 = E2.slice(A2, Q2), w2 = I2[0], K2 = B2 < 0 ? void 0 : E2.slice(B2, g2), o2 = K2 ? K2[0] : "";
3418
+ D.push({ s: A2, e: Q2, ls: B2, le: g2, n: '"' === w2 || "'" === w2 ? k(I2) : I2, ln: '"' === o2 || "'" === o2 ? k(K2) : K2 });
3419
+ }
3420
+ function k(A2) {
3421
+ try {
3422
+ return (0, eval)(A2);
3423
+ } catch (A3) {
3424
+ }
3425
+ }
3426
+ return [o, D, !!C.f(), !!C.ms()];
3427
+ }
3428
+ function Q(A2, Q2) {
3429
+ const B2 = A2.length;
3430
+ let C2 = 0;
3431
+ for (; C2 < B2; ) {
3432
+ const B3 = A2.charCodeAt(C2);
3433
+ Q2[C2++] = (255 & B3) << 8 | B3 >>> 8;
3434
+ }
3435
+ }
3436
+ function B(A2, Q2) {
3437
+ const B2 = A2.length;
3438
+ let C2 = 0;
3439
+ for (; C2 < B2; ) Q2[C2] = A2.charCodeAt(C2++);
3440
+ }
3441
+ var ImportType, A, C, E, init;
3442
+ var init_lexer = __esm({
3443
+ "node_modules/es-module-lexer/dist/lexer.js"() {
3444
+ !(function(A2) {
3445
+ A2[A2.Static = 1] = "Static", A2[A2.Dynamic = 2] = "Dynamic", A2[A2.ImportMeta = 3] = "ImportMeta", A2[A2.StaticSourcePhase = 4] = "StaticSourcePhase", A2[A2.DynamicSourcePhase = 5] = "DynamicSourcePhase", A2[A2.StaticDeferPhase = 6] = "StaticDeferPhase", A2[A2.DynamicDeferPhase = 7] = "DynamicDeferPhase";
3446
+ })(ImportType || (ImportType = {}));
3447
+ A = 1 === new Uint8Array(new Uint16Array([1]).buffer)[0];
3448
+ E = () => {
3449
+ return A2 = "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GzYCHAtBAEEAKAKwCkECajYCsAoCQAJAAkACQEEAECkiAUHhAEYNACABQfcARg0BQQAoArAKIQEMAgtBACgCsAoiAUECakHACEEKEC8NAUEGIQIMAgtBACgCsAoiAS8BAkHpAEcNACABLwEEQfQARw0AQQQhAiABLwEGQegARg0BC0EAIAFBfmo2ArAKDwtBACABIAJBAXRqNgKwCgJAQQEQKUH7AEYNAEEAIAE2ArAKDwtBACgCsAoiACECA0BBACACQQJqNgKwCgJAAkACQEEBECkiAkEiRg0AIAJBJ0cNAUEnEBpBAEEAKAKwCkECajYCsApBARApIQIMAgtBIhAaQQBBACgCsApBAmo2ArAKQQEQKSECDAELIAIQLCECCwJAIAJBOkYNAEEAIAE2ArAKDwtBAEEAKAKwCkECajYCsAoCQEEBECkiAkEiRg0AIAJBJ0YNAEEAIAE2ArAKDwsgAhAaQQBBACgCsApBAmo2ArAKAkACQEEBECkiAkEsRg0AIAJB/QBGDQFBACABNgKwCg8LQQBBACgCsApBAmo2ArAKQQEQKUH9AEYNAEEAKAKwCiECDAELC0EAKALwCSIBIAA2AhAgAUEAKAKwCkECajYCDAttAQJ/AkACQANAAkAgAEH//wNxIgFBd2oiAkEXSw0AQQEgAnRBn4CABHENAgsgAUGgAUYNASAAIQIgARAoDQJBACECQQBBACgCsAoiAEECajYCsAogAC8BAiIADQAMAgsLIAAhAgsgAkH//wNxC6sBAQR/AkACQEEAKAKwCiICLwEAIgNB4QBGDQAgASEEIAAhBQwBC0EAIAJBBGo2ArAKQQEQKSECQQAoArAKIQUCQAJAIAJBIkYNACACQSdGDQAgAhAsGkEAKAKwCiEEDAELIAIQGkEAQQAoArAKQQJqIgQ2ArAKC0EBECkhA0EAKAKwCiECCwJAIAIgBUYNACAFIARBACAAIAAgAUYiAhtBACABIAIbEAILIAMLcgEEf0EAKAKwCiEAQQAoArQKIQECQAJAA0AgAEECaiECIAAgAU8NAQJAAkAgAi8BACIDQaR/ag4CAQQACyACIQAgA0F2ag4EAgEBAgELIABBBGohAAwACwtBACACNgKwChAlQQAPC0EAIAI2ArAKQd0AC0kBA39BACEDAkAgAkUNAAJAA0AgAC0AACIEIAEtAAAiBUcNASABQQFqIQEgAEEBaiEAIAJBf2oiAg0ADAILCyAEIAVrIQMLIAMLC+wBAgBBgAgLzgEAAHgAcABvAHIAdABtAHAAbwByAHQAZgBvAHIAZQB0AGEAbwB1AHIAYwBlAHIAbwBtAHUAbgBjAHQAaQBvAG4AcwBzAGUAcgB0AHYAbwB5AGkAZQBkAGUAbABlAGMAbwBuAHQAaQBuAGkAbgBzAHQAYQBuAHQAeQBiAHIAZQBhAHIAZQB0AHUAcgBkAGUAYgB1AGcAZwBlAGEAdwBhAGkAdABoAHIAdwBoAGkAbABlAGkAZgBjAGEAdABjAGYAaQBuAGEAbABsAGUAbABzAABB0AkLEAEAAAACAAAAAAQAAEA5AAA=", "undefined" != typeof Buffer ? Buffer.from(A2, "base64") : Uint8Array.from(atob(A2), ((A3) => A3.charCodeAt(0)));
3450
+ var A2;
3451
+ };
3452
+ init = WebAssembly.compile(E()).then(WebAssembly.instantiate).then((({ exports: A2 }) => {
3453
+ C = A2;
3454
+ }));
3455
+ }
3456
+ });
3457
+
3458
+ // src/doctor-source.ts
3459
+ var doctor_source_exports = {};
3460
+ __export(doctor_source_exports, {
3461
+ runSourceDoctor: () => runSourceDoctor
3462
+ });
3463
+ import fs10 from "node:fs";
3464
+ import path9 from "node:path";
3465
+ import { createRequire as createRequire5 } from "node:module";
3466
+ async function runSourceDoctor(configPath) {
3467
+ let loaded;
3468
+ try {
3469
+ loaded = await loadAppConfig(configPath);
3470
+ } catch (error) {
3471
+ const message = error instanceof Error ? error.message : String(error);
3472
+ const sections = message.split("\n");
3473
+ return {
3474
+ checks: [{
3475
+ app: "(config)",
3476
+ item: "\u914D\u7F6E\u52A0\u8F7D",
3477
+ level: "FAIL",
3478
+ symptom: sections[0]?.replace(/^\[fulgurjs:[^\]]+\]\s*/, "") ?? message,
3479
+ cause: message.match(/根因:(.+)/)?.[1],
3480
+ fix: message.match(/修法:(.+)/)?.[1]
3481
+ }],
3482
+ failed: true,
3483
+ complete: false,
3484
+ filesScanned: 0,
3485
+ manualChecks: [],
3486
+ integrationFiles: { required: [], optional: [], existing: [] }
3487
+ };
3488
+ }
3489
+ const root = fs10.realpathSync(loaded.appRoot);
3490
+ const options = loaded.options;
3491
+ const app = options.name;
3492
+ const checks = [];
3493
+ const pending = [];
3494
+ const seen = /* @__PURE__ */ new Set();
3495
+ const imports = /* @__PURE__ */ new Set();
3496
+ const sources = /* @__PURE__ */ new Map();
3497
+ let complete = true;
3498
+ const relative = (file) => path9.relative(root, file).split(path9.sep).join("/");
3499
+ const within = (file) => file === root || file.startsWith(root + path9.sep);
3500
+ const add = (item, level, symptom, cause, fix) => {
3501
+ checks.push({ app, item, level, symptom, cause, fix });
3502
+ };
3503
+ const resolveSource = (value, parent = root) => {
3504
+ const clean = value.split(/[?#]/)[0];
3505
+ const file = /^(?:\/?@\/|~\/)/.test(clean) ? path9.join(root, "src", clean.replace(/^(?:\/?@\/|~\/)/, "")) : path9.resolve(parent, clean);
3506
+ for (const ext of extensions) {
3507
+ const candidate = file + ext;
3508
+ if (!fs10.existsSync(candidate) || !fs10.statSync(candidate).isFile()) continue;
3509
+ const real = fs10.realpathSync(candidate);
3510
+ return real;
3511
+ }
3512
+ return void 0;
3513
+ };
3514
+ const required = [relative(loaded.configPath)];
3515
+ for (const [key, expose] of Object.entries(options.exposes ?? {})) {
3516
+ const file = resolveSource(typeof expose === "string" ? expose : expose.import);
3517
+ if (file) {
3518
+ pending.push(file);
3519
+ required.push(relative(file));
3520
+ add(`expose ${key}`, "PASS", `\u6E90\u6587\u4EF6\u5B58\u5728\uFF1A${relative(file)}`);
3521
+ } else {
3522
+ complete = false;
3523
+ add(
3524
+ `expose ${key}`,
3525
+ "FAIL",
3526
+ "\u66B4\u9732\u6E90\u6587\u4EF6\u7F3A\u5931\u6216\u65E0\u6CD5\u89E3\u6790\u3002",
3527
+ "\u914D\u7F6E\u6307\u5411\u7684\u6587\u4EF6\u4E0D\u80FD\u5728\u52A0\u8F7D\u65F6\u624D\u53D1\u73B0\u7F3A\u5931\u3002",
3528
+ "\u6838\u5BF9 exposes \u8DEF\u5F84\u3001\u540E\u7F00\u548C\u522B\u540D\uFF1B\u5171\u4EAB\u76EE\u5F55\u53E6\u7528\u5176\u6240\u5C5E\u9879\u76EE\u95E8\u7981\u6838\u5B9E\u3002"
3529
+ );
3530
+ }
3531
+ }
3532
+ if (options.setup) {
3533
+ const file = resolveSource(options.setup);
3534
+ if (file) pending.push(file);
3535
+ else {
3536
+ complete = false;
3537
+ add("setup", "FAIL", "setup \u6E90\u6587\u4EF6\u4E0D\u5B58\u5728\u6216\u65E0\u6CD5\u89E3\u6790\u3002", "\u521D\u59CB\u5316\u5165\u53E3\u4E0D\u80FD\u5728\u52A0\u8F7D\u65F6\u624D\u53D1\u73B0\u7F3A\u5931\u3002", "\u4FEE\u6B63 setup \u8DEF\u5F84\uFF1B\u6CA1\u6709\u521D\u59CB\u5316\u9700\u6C42\u5219\u5220\u9664 setup \u914D\u7F6E\u3002");
3538
+ }
3539
+ }
3540
+ const html = path9.join(root, "index.html");
3541
+ let hasEntry = false;
3542
+ if (fs10.existsSync(html)) for (const tag of fs10.readFileSync(html, "utf8").matchAll(/<script\b[^>]*>/gi)) {
3543
+ const entry = tag[0].match(/\bsrc=["']([^"']+)["']/i)?.[1];
3544
+ if (!entry || !/\btype=["']module["']/i.test(tag[0]) || /^(?:https?:)?\/\//.test(entry)) continue;
3545
+ const file = resolveSource(entry.replace(/^\//, ""));
3546
+ if (file) {
3547
+ pending.push(file);
3548
+ hasEntry = true;
3549
+ }
3550
+ }
3551
+ if (Object.keys(options.remotes ?? {}).length && !hasEntry) complete = false;
3552
+ await init;
3553
+ while (pending.length && seen.size < 256) {
3554
+ const file = pending.shift();
3555
+ if (!within(file)) {
3556
+ complete = false;
3557
+ add("\u76EE\u5F55\u5916\u6E90\u7801", "WARN", "\u5DF2\u914D\u7F6E\u7684\u6E90\u6587\u4EF6\u5B58\u5728\u4E8E\u5E94\u7528\u76EE\u5F55\u4E4B\u5916\uFF1B\u672A\u8BFB\u53D6\u6587\u4EF6\u5185\u5BB9\u3002", "\u5355\u9879\u76EE\u9884\u68C0\u4E0D\u5C55\u5F00 monorepo \u5916\u90E8\u76EE\u5F55\u3002", "\u901A\u8FC7\u8BE5\u5171\u4EAB\u76EE\u5F55\u6240\u5C5E\u9879\u76EE\u7684\u7C7B\u578B\u4E0E\u6784\u5EFA\u95E8\u7981\u6838\u5B9E\uFF1B\u5408\u6CD5\u7684\u8DE8\u76EE\u5F55 expose \u4E0D\u4F1A\u88AB\u5224\u4E3A\u7F3A\u6587\u4EF6\u3002");
3558
+ continue;
3559
+ }
3560
+ if (seen.has(file) || /\.d\.[cm]?ts$/.test(file) || relative(file).includes("fulgurjs/types/")) continue;
3561
+ if (!/\.(?:[cm]?js|jsx|ts|tsx|vue)$/.test(file)) continue;
3562
+ seen.add(file);
3563
+ const raw = fs10.readFileSync(file, "utf8");
3564
+ if (file.endsWith(".vue") && /<script\b[^>]*\bsrc\s*=/.test(raw)) complete = false;
3565
+ const script = file.endsWith(".vue") ? [...raw.matchAll(/<script\b[^>]*>([\s\S]*?)<\/script>/gi)].map((match) => match[1]).join("\n") : raw;
3566
+ try {
3567
+ const { code } = await esbuildTransform()(script, { loader: file.endsWith(".tsx") || file.endsWith(".jsx") ? "tsx" : "ts", target: "esnext" });
3568
+ sources.set(relative(file), code);
3569
+ if (/import\.meta\.glob/.test(code)) complete = false;
3570
+ for (const item of parse(code)[0]) {
3571
+ if (!item.n) {
3572
+ if (item.d >= 0) complete = false;
3573
+ continue;
3574
+ }
3575
+ imports.add(item.n);
3576
+ if (item.n.startsWith(".") || /^(?:\/?@\/|~\/)/.test(item.n)) {
3577
+ if (/\.(?:[cm]?js|jsx|ts|tsx|vue)$/.test(item.n.split(/[?#]/)[0]) || !/\.[a-z0-9]+$/i.test(item.n.split(/[?#]/)[0])) {
3578
+ const next = resolveSource(item.n, path9.dirname(file));
3579
+ if (next) pending.push(next);
3580
+ else {
3581
+ complete = false;
3582
+ add(relative(file), "WARN", "\u6709\u672C\u5730\u5BFC\u5165\u65E0\u6CD5\u8DDF\u968F\uFF0C\u6E90\u7801\u68C0\u67E5\u4E0D\u662F\u5B8C\u6574\u4F9D\u8D56\u95ED\u5305\u3002", "\u53EF\u80FD\u4F7F\u7528\u81EA\u5B9A\u4E49\u522B\u540D\u3001\u865A\u62DF\u6A21\u5757\u3001\u8D44\u6E90\u6216\u76EE\u5F55\u5916\u6E90\u7801\u3002", "\u6309\u9879\u76EE tsconfig/Vite \u914D\u7F6E\u5B8C\u6210\u89E3\u6790\u4E0E\u7C7B\u578B\u68C0\u67E5\uFF1B\u672C\u547D\u4EE4\u4E0D\u731C\u81EA\u5B9A\u4E49\u522B\u540D\u3002");
3583
+ }
3584
+ }
3585
+ }
3586
+ }
3587
+ } catch {
3588
+ complete = false;
3589
+ add(relative(file), "WARN", "\u672C\u6587\u4EF6\u65E0\u6CD5\u9759\u6001\u89E3\u6790\uFF0C\u672A\u628A\u5B83\u5224\u5B9A\u4E3A\u68C0\u67E5\u901A\u8FC7\u3002", "\u53EF\u80FD\u5305\u542B\u5B8F\u3001\u81EA\u5B9A\u4E49\u8BED\u6CD5\u6216\u6E90\u7801\u9519\u8BEF\u3002", "\u8FD0\u884C\u672C\u9879\u76EE\u6709\u6548\u914D\u7F6E\u7684\u7C7B\u578B/\u6784\u5EFA\u68C0\u67E5\uFF1B\u4E0D\u8981\u7528\u6B64\u62A5\u544A\u4EE3\u66FF\u7F16\u8BD1\u3002");
3590
+ }
3591
+ }
3592
+ if (pending.length) complete = false;
3593
+ for (const [file, code] of sources) {
3594
+ if (/setActivePinia\s*\(/.test(code) && /\bawait\b/.test(code)) {
3595
+ add(
3596
+ file,
3597
+ "WARN",
3598
+ "\u540C\u4E00\u6A21\u5757\u4F7F\u7528 setActivePinia \u548C await\uFF0C\u9700\u8981\u786E\u8BA4\u5F02\u6B65\u72B6\u6001\u5F52\u5C5E\u3002",
3599
+ "\u7B49\u5F85\u671F\u95F4\u53E6\u4E00\u4E2A\u5E94\u7528\u53EF\u80FD\u6539\u53D8\u5168\u5C40 activePinia\uFF1B\u9759\u6001\u626B\u63CF\u4E0D\u80FD\u8BC1\u660E\u5F53\u524D\u56DE\u8C03\u4E00\u5B9A\u53D6\u9519\u5B9E\u4F8B\u3002",
3600
+ "\u5728\u56DE\u8C03\u4E2D\u4F20\u5165\u672C\u5E94\u7528 pinia\uFF0C\u6216\u7528 /vue \u7684 bindStoreToApp \u7ED1\u5B9A\u5B9E\u9645\u5B9E\u4F8B\uFF1B\u7EC4\u4EF6\u5185\u4FDD\u7559\u539F\u751F\u6CE8\u5165\uFF0C\u4E0D\u628A\u5E93\u5355\u4F8B\u5F53\u6210\u4E1A\u52A1 store \u5B9E\u4F8B\u3002"
3601
+ );
3602
+ }
3603
+ if (/defineBridgeApp\s*\(/.test(code) && /createWeb(?:Hash)?History\s*\(/.test(code) && !/createMemoryHistory|defineApplication/.test(code)) {
3604
+ add(
3605
+ file,
3606
+ "WARN",
3607
+ "\u6865\u63A5\u88C5\u914D\u4E2D\u51FA\u73B0\u6D4F\u89C8\u5668 history\uFF0C\u9700\u786E\u8BA4\u5B83\u53EA\u5728\u72EC\u7ACB\u542F\u52A8\u65F6\u6267\u884C\u3002",
3608
+ "\u5B50\u5E94\u7528\u76F4\u63A5\u5199\u6D4F\u89C8\u5668\u5386\u53F2\u53EF\u80FD\u91CD\u590D\u524D\u7F00\u6216\u6DFB\u52A0\u610F\u5916 hash\uFF1B\u6B64\u9879\u662F\u4EBA\u5DE5\u6838\u67E5\uFF0C\u4E0D\u662F\u5DF2\u590D\u73B0\u7F3A\u9677\u3002",
3609
+ "\u7EDF\u4E00\u88C5\u914D\u7528 defineApplication\uFF1B\u6309 context.mode \u9009\u62E9 web/memory history\uFF0C\u6865\u63A5\u8FD4\u56DE { app, router }\u3002"
3610
+ );
3611
+ }
3612
+ for (const match of code.matchAll(/import\.meta\.glob(?:Eager)?\s*\(\s*(\[[\s\S]*?\]|["'][^"']+["'])/g)) {
3613
+ if (/\.ts/.test(match[1]) && !/![^"']*\.d\.ts/.test(match[1])) {
3614
+ add(
3615
+ file,
3616
+ "WARN",
3617
+ "\u53D1\u73B0\u626B\u63CF .ts \u7684\u4E1A\u52A1 glob\uFF0C\u672A\u770B\u5230\u6392\u9664 .d.ts \u7684\u8D1F\u6A21\u5F0F\u3002",
3618
+ "\u81EA\u52A8\u751F\u6210\u58F0\u660E\u53EA\u7528\u4E8E\u7C7B\u578B\uFF1B\u4E0D\u80FD\u88AB\u7EC4\u4EF6/\u5DE5\u5177\u6CE8\u518C\u5668\u4F5C\u4E3A\u8FD0\u884C\u6A21\u5757\u6267\u884C\u3002\u5176\u4ED6 exclude \u914D\u7F6E\u9700\u4EBA\u5DE5\u6838\u5B9E\u3002",
3619
+ "\u5728 glob \u4E2D\u6392\u9664 **/*.d.ts \u548C\u5E94\u7528\u88C5\u914D\u76EE\u5F55\uFF1B\u4E0D\u8981\u5BFC\u5165\u751F\u6210\u58F0\u660E\u7684\u5185\u5BB9\u3002"
3620
+ );
3621
+ }
3622
+ }
3623
+ }
3624
+ const shared = Array.isArray(options.shared) ? options.shared : Object.keys(options.shared ?? {});
3625
+ const isImported = (key) => [...imports].some((value) => value === key || value.startsWith(key + "/"));
3626
+ for (const key of shared) {
3627
+ const hint = Array.isArray(options.shared) ? void 0 : options.shared?.[key];
3628
+ const local = typeof hint === "string" ? hint : hint?.import;
3629
+ const target = (typeof local === "string" ? local : key).replace(/\/$/, "");
3630
+ if (Object.keys(options.remotes ?? {}).length && complete && local !== false && !isImported(target)) {
3631
+ add(
3632
+ `shared.${key}`,
3633
+ "WARN",
3634
+ "\u5DF2\u626B\u63CF\u5165\u53E3\u6CA1\u6709\u53D1\u73B0\u6B64\u5171\u4EAB\u5E93\u7684\u8FD0\u884C\u65F6\u5BFC\u5165\u3002",
3635
+ "\u53EF\u80FD\u662F\u591A\u4F59 provider\uFF0C\u4E5F\u53EF\u80FD\u7531\u626B\u63CF\u4E4B\u5916\u7684\u5165\u53E3\u4F7F\u7528\uFF1B\u4E0D\u80FD\u4EC5\u51ED\u5B89\u88C5\u4E86\u4F9D\u8D56\u5C31\u8981\u6C42\u5171\u4EAB\u3002",
3636
+ "\u786E\u8BA4\u771F\u5B9E\u7528\u9014\uFF1B\u5B8C\u6574\u5B50\u5E94\u7528\u81EA\u6709\u7684\u72B6\u6001\u5E93\u901A\u5E38\u7531\u5B50\u5E94\u7528\u63D0\u4F9B\uFF0C\u4E0D\u8981\u6C42\u672A\u4F7F\u7528\u5B83\u7684\u5BBF\u4E3B\u91CD\u590D\u63D0\u4F9B\u3002"
3637
+ );
3638
+ }
3639
+ }
3640
+ for (const [key, remote] of Object.entries(options.remotes ?? {})) {
3641
+ if (typeof remote === "function") {
3642
+ add(`remotes.${key}`, "WARN", "\u8FDC\u7A0B\u5730\u5740\u7531\u8FD0\u884C\u65F6\u51FD\u6570\u51B3\u5B9A\uFF0C\u672A\u6267\u884C\u8BE5\u51FD\u6570\u3002", "\u79BB\u7EBF\u9884\u68C0\u4E0D\u6267\u884C\u4E1A\u52A1\u8FDC\u7A0B\u5730\u5740\u56DE\u8C03\u3002", "\u5728\u5B9E\u9645 dev/prod \u94FE\u8DEF\u6838\u5BF9\u51FD\u6570\u8FD4\u56DE\u503C\u3001\u5165\u53E3\u7C7B\u578B\u548C\u7F51\u7EDC\u9519\u8BEF\u3002");
3643
+ } else if (typeof remote === "string") {
3644
+ if (/^https?:\/\/(localhost|127\.0\.0\.1|\[::1\])(?=[:/]|$)/.test(remote)) {
3645
+ add(
3646
+ `remotes.${key}`,
3647
+ "WARN",
3648
+ "\u5355\u5730\u5740\u8FDC\u7A0B\u6307\u5411\u672C\u673A\u5F00\u53D1\u670D\u52A1\uFF0C\u751F\u4EA7\u4E5F\u4F1A\u4F7F\u7528\u8BE5\u5730\u5740\u3002",
3649
+ "\u6CA1\u6709\u663E\u5F0F\u533A\u5206\u5F00\u53D1\u4E0E\u751F\u4EA7\u5730\u5740\u3002",
3650
+ "\u4F7F\u7528 { dev: \u5F00\u53D1\u5730\u5740, prod: \u90E8\u7F72\u8DEF\u5F84\u6216URL }\uFF1B\u751F\u4EA7\u4E0D\u501F\u7528\u5F00\u53D1\u670D\u52A1\u5668\u3002"
3651
+ );
3652
+ }
3653
+ } else if (!remote.dev || !remote.prod) {
3654
+ add(`remotes.${key}`, "WARN", "\u8FDC\u7A0B\u5730\u5740\u672A\u540C\u65F6\u58F0\u660E dev/prod\u3002", "\u7F3A\u7701\u56DE\u9000\u53EF\u80FD\u628A\u5F00\u53D1\u5730\u5740\u5E26\u5165\u751F\u4EA7\u3002", "\u5728\u540C\u4E00\u914D\u7F6E\u4E2D\u660E\u786E\u5199\u51FA dev \u548C prod\uFF0C\u518D\u6838\u5BF9\u90E8\u7F72\u5B50\u8DEF\u5F84\u3002");
3655
+ }
3656
+ }
3657
+ add(
3658
+ "\u6E90\u7801\u626B\u63CF\u8303\u56F4",
3659
+ complete ? "PASS" : "WARN",
3660
+ `\u8BFB\u53D6 ${seen.size} \u4E2A\u5E94\u7528\u6E90\u6587\u4EF6${complete ? "\uFF1B\u9759\u6001\u4F9D\u8D56\u626B\u63CF\u5B8C\u6210\u3002" : "\uFF1B\u626B\u63CF\u4E0D\u5B8C\u6574\uFF0C\u4E0D\u80FD\u636E\u6B64\u5BA3\u79F0\u63A5\u5165\u6210\u529F\u3002"}`,
3661
+ complete ? void 0 : "\u5B58\u5728\u52A8\u6001\u8DEF\u5F84\u3001\u81EA\u5B9A\u4E49\u522B\u540D\u6216\u8D85\u8FC7256\u6587\u4EF6\u7684\u4F9D\u8D56\u56FE\u3002",
3662
+ complete ? void 0 : "\u5B8C\u6210\u6784\u5EFA\u3001\u6709\u6548\u9879\u76EETS\u548C\u5B9E\u9645\u6D4F\u89C8\u5668\u9A8C\u6536\uFF1B\u6B64\u547D\u4EE4\u53EA\u505A\u63A5\u5165\u9884\u68C0\u3002"
3663
+ );
3664
+ return {
3665
+ checks,
3666
+ failed: checks.some((check) => check.level === "FAIL"),
3667
+ complete,
3668
+ filesScanned: seen.size,
3669
+ manualChecks: [
3670
+ "\u5B8C\u6574\u5B50\u5E94\u7528\uFF1A\u590D\u7528\u4E00\u4EFD\u88C5\u914D\u4EE3\u7801\uFF1BVue \u8FD4\u56DE\u5C1A\u672A\u5B89\u88C5\u7684 app/router\uFF0C\u5B88\u536B\u5148\u51C6\u5907\u597D\u3002",
3671
+ "Vue \u8FDC\u7A0B\u7EC4\u4EF6\uFF1A\u9700\u8981\u7684\u7956\u5148\u6CE8\u5165\u3001\u5168\u5C40\u7EC4\u4EF6\u3001\u6743\u9650\u6307\u4EE4\u548C\u4E3B\u9898\u5FC5\u987B\u5728\u5B9E\u9645\u6D88\u8D39 app \u4E2D\u5B58\u5728\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u590D\u5236\u6574\u4E2A\u4E1A\u52A1 app\u3002",
3672
+ "\u4E1A\u52A1 store \u5B9E\u4F8B\u4E0E\u5171\u4EAB\u5E93\u5B9E\u4F8B\u662F\u4E24\u4EF6\u4E8B\uFF1B\u5E76\u884C\u5BB9\u5668\u4E0D\u80FD\u9760\u4E00\u4E2A\u53EF\u53D8\u6A21\u5757\u53D8\u91CF\u533A\u5206\u72B6\u6001\u5F52\u5C5E\u3002",
3673
+ "\u6E90\u7801\u9884\u68C0\u4E0D\u8BC1\u660E\u6302\u8F7D\u3001\u6DF1\u94FE\u3001\u4F1A\u8BDD\u3001\u5378\u8F7D\u548C\u9519\u8BEF\u6062\u590D\u901A\u8FC7\uFF1B\u8FD9\u4E9B\u7531\u5B9E\u9645\u9A8C\u6536\u786E\u8BA4\u3002"
3674
+ ],
3675
+ integrationFiles: {
3676
+ required: [...new Set(required)],
3677
+ optional: ["setup\uFF1A\u53EA\u6709\u8FDC\u7A0B\u521D\u59CB\u5316/\u5168\u5C40\u7EC4\u4EF6/Provider\u7B49\u9700\u6C42\u624D\u914D\u7F6E", "\u4F1A\u8BDD/context\uFF1A\u53EA\u6709\u5BBF\u4E3B\u767B\u5F55\u6001\u548C\u8DE8\u5E94\u7528\u4E0A\u4E0B\u6587\u9700\u6C42\u624D\u63A5\u5165", "hostPages\uFF1A\u4EC5\u9010\u9875\u63A5\u5165\uFF1B\u5B8C\u6574\u5B50\u5E94\u7528\u4E0D\u91CD\u590D\u767B\u8BB0\u5185\u90E8\u83DC\u5355"],
3678
+ existing: ["vite.config\uFF1A\u6CE8\u518C federation", "\u72EC\u7ACB main\uFF1A\u8C03\u7528 application.start", "\u539F router/\u5B88\u536B\uFF1A\u590D\u7528\u8DEF\u7531\uFF0C\u6309\u8FD0\u884C\u6A21\u5F0F\u521B\u5EFA history", "\u5BBF\u4E3B\u89C6\u56FE\uFF1A\u58F0\u660E\u6302\u8F7D\u524D\u7F00\u548C createVueBridgeApp/createReactBridgeApp"]
3679
+ }
3680
+ };
3681
+ }
3682
+ var requireFromHere, cachedTransform, esbuildTransform, extensions;
3683
+ var init_doctor_source = __esm({
3684
+ "src/doctor-source.ts"() {
3685
+ "use strict";
3686
+ init_lexer();
3687
+ init_app_config();
3688
+ requireFromHere = createRequire5(import.meta.url);
3689
+ esbuildTransform = () => {
3690
+ if (!cachedTransform) {
3691
+ const esb = requireFromHere("esbuild");
3692
+ cachedTransform = esb.transform.bind(esb);
3693
+ }
3694
+ return cachedTransform;
3695
+ };
3696
+ extensions = ["", ".ts", ".tsx", ".js", ".jsx", ".mjs", ".vue", "/index.ts", "/index.tsx", "/index.js", "/index.vue"];
3697
+ }
3698
+ });
3699
+
3398
3700
  // src/cli.ts
3399
3701
  import { resolve } from "node:path";
3400
3702
 
@@ -3747,6 +4049,8 @@ var HELP = `fulgurjs \u2014 Vite Module Federation CLI (@fulgurjs/federation)
3747
4049
  fulgurjs port <\u5E94\u7528> <\u65B0\u7AEF\u53E3> [--write] \u4E00\u6B21\u66F4\u65B0\u56DB\u5904\uFF1A\u5E94\u7528 package.json dev/preview\u3001
3748
4050
  \u5BBF\u4E3B fulgurjs.config.ts \u8BE5\u8FDC\u7A0B dev \u5730\u5740\u3001
3749
4051
  scripts/dev.config.json\u3001README \u7AEF\u53E3\u8868
4052
+ \u672C\u5730\u63A5\u5165\u9884\u68C0\uFF08\u4E0D\u542F\u52A8\u5E94\u7528\u3001\u4E0D\u8BF7\u6C42\u7AD9\u70B9\uFF1BWARN \u662F\u4EBA\u5DE5\u6838\u67E5\u9879\uFF09\uFF1A
4053
+ fulgurjs doctor --config <path> [--json] \u67E5\u5165\u53E3/\u5730\u5740/glob/\u72B6\u6001\u5F52\u5C5E\uFF0C\u8F93\u51FA\u5FC5\u6539\u4E0E\u53EF\u9009\u6587\u4EF6\u6E05\u5355
3750
4054
  \u90E8\u7F72\u4F53\u68C0\uFF08--apps \u5FC5\u586B\uFF1A\u7AD9\u70B9\u6839\u4E0B\u7684\u90E8\u7F72\u5B50\u76EE\u5F55\uFF0C\u8FDC\u7A0B\u90E8\u7F72\u5728 /remote-a/ \u5C31\u5199 remote-a\uFF1B
3751
4055
  '.' \u8868\u793A\u90E8\u7F72\u5728\u7AD9\u70B9\u6839\uFF1B\u6761\u76EE\u53EF\u5199\u5B8C\u6574 URL \u68C0\u67E5\u591A origin\uFF1B\u4E0D\u505A\u4EFB\u4F55\u9ED8\u8BA4\u731C\u6D4B\uFF09\uFF1A
3752
4056
  fulgurjs doctor --base <URL> --apps <a,b,c> [--entry <\u6587\u4EF6\u540D>] [--no-entry]
@@ -3988,6 +4292,28 @@ async function main() {
3988
4292
  if (cmd === "doctor") {
3989
4293
  const base = argOf("--base");
3990
4294
  const appsRaw = argOf("--apps");
4295
+ const config = argOf("--config");
4296
+ if (has("--config") && !config) {
4297
+ console.error("[fulgurjs:doctor] --config \u7F3A\u5C11\u8DEF\u5F84\u3002\u7528\u6CD5\uFF1Adoctor --config ./fulgurjs.config.ts");
4298
+ return 2;
4299
+ }
4300
+ if (config) {
4301
+ if (has("--base") || has("--apps")) {
4302
+ console.error("[fulgurjs:doctor] \u672C\u5730 --config \u4E0E\u90E8\u7F72 --base/--apps \u5206\u5F00\u6267\u884C\uFF0C\u907F\u514D\u628A\u6E90\u7801\u9884\u68C0\u5F53\u6210\u90E8\u7F72\u9A8C\u6536\u3002");
4303
+ return 2;
4304
+ }
4305
+ const { runSourceDoctor: runSourceDoctor2 } = await Promise.resolve().then(() => (init_doctor_source(), doctor_source_exports));
4306
+ const report = await runSourceDoctor2(resolve(config));
4307
+ if (has("--json")) console.log(JSON.stringify({ mode: "source", ...report }, null, 2));
4308
+ else {
4309
+ console.log(formatDoctorReport(report.checks));
4310
+ console.log("\n\u5FC5\u9700\u5165\u53E3\u6587\u4EF6\uFF1A\n" + report.integrationFiles.required.map((file) => ` ${file}`).join("\n"));
4311
+ console.log("\n\u5DF2\u6709\u6587\u4EF6\u9700\u8981\u63A5\u7EBF\uFF1A\n" + report.integrationFiles.existing.map((file) => ` ${file}`).join("\n"));
4312
+ console.log("\n\u6309\u9700\u6C42\u9009\u7528\uFF1A\n" + report.integrationFiles.optional.map((file) => ` ${file}`).join("\n"));
4313
+ console.log("\n\u5FC5\u987B\u4EBA\u5DE5\u9A8C\u6536\uFF1A\n" + report.manualChecks.map((line) => ` ${line}`).join("\n"));
4314
+ }
4315
+ return report.failed ? 1 : 0;
4316
+ }
3991
4317
  if (!base) {
3992
4318
  console.error("[fulgurjs:doctor] \u7F3A\u5C11 --base <URL>\uFF08\u7AD9\u70B9\u6839\u5730\u5740\uFF0C\u5982 http://your-site\uFF09");
3993
4319
  return 2;