@fulgurjs/federation 0.4.2 → 0.5.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/CHANGELOG.md +20 -7
- package/DESIGN.md +8 -8
- package/README.md +49 -49
- package/dist/cli.js +43 -43
- package/dist/config.cjs +13 -13
- package/dist/config.d.cts +20 -20
- package/dist/config.d.ts +20 -20
- package/dist/config.js +11 -11
- package/dist/index.cjs +139 -139
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +139 -139
- package/dist/pages.cjs +9 -9
- package/dist/pages.d.cts +7 -7
- package/dist/pages.d.ts +7 -7
- package/dist/pages.js +7 -7
- package/dist/runtime.js +2 -2
- package/docs/manual.html +23 -23
- package/docs/webpack-mf-/345/257/271/347/205/247/344/270/216/347/274/272/345/217/243.md +1 -1
- package/docs//346/262/231/347/256/261/350/276/271/347/225/214/345/256/241/350/256/241.md +1 -1
- package/docs//350/277/201/347/247/273/346/214/207/345/215/227.md +8 -8
- package/examples/fulgur.config.example.ts +4 -4
- package/package.json +5 -5
package/dist/config.cjs
CHANGED
|
@@ -30,15 +30,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/config.ts
|
|
31
31
|
var config_exports = {};
|
|
32
32
|
__export(config_exports, {
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
defineFulgurjsConfig: () => defineFulgurjsConfig,
|
|
34
|
+
loadFulgurjsConfig: () => loadFulgurjsConfig
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(config_exports);
|
|
37
37
|
var import_meta = {};
|
|
38
|
-
function
|
|
38
|
+
function defineFulgurjsConfig(config) {
|
|
39
39
|
return config;
|
|
40
40
|
}
|
|
41
|
-
async function
|
|
41
|
+
async function loadFulgurjsConfig(configPath) {
|
|
42
42
|
const { pathToFileURL, fileURLToPath } = await import("url");
|
|
43
43
|
const { createRequire } = await import("module");
|
|
44
44
|
const fs = await import("fs");
|
|
@@ -46,8 +46,8 @@ async function loadFulgurConfig(configPath) {
|
|
|
46
46
|
const path = await import("path");
|
|
47
47
|
const selfDir = path.dirname(fileURLToPath(import_meta.url));
|
|
48
48
|
const selfConfigJs = path.join(selfDir, "config.js");
|
|
49
|
-
const SELF_SPEC = fs.existsSync(selfConfigJs) ? pathToFileURL(selfConfigJs).href : "@
|
|
50
|
-
const rewriteSelfImports = (source) => source.replace(/(['"])@
|
|
49
|
+
const SELF_SPEC = fs.existsSync(selfConfigJs) ? pathToFileURL(selfConfigJs).href : "@fulgurjs-federation-config-unavailable";
|
|
50
|
+
const rewriteSelfImports = (source) => source.replace(/(['"])@fulgurjs\/federation\/config\1/g, (_m, q) => `${q}${SELF_SPEC}${q}`);
|
|
51
51
|
const importConfigs = async (cacheKey) => {
|
|
52
52
|
return await import(`${cacheKey}?t=${Date.now()}`);
|
|
53
53
|
};
|
|
@@ -56,7 +56,7 @@ async function loadFulgurConfig(configPath) {
|
|
|
56
56
|
mod = { default: JSON.parse(fs.readFileSync(configPath, "utf8")) };
|
|
57
57
|
} else {
|
|
58
58
|
const source = rewriteSelfImports(fs.readFileSync(configPath, "utf8"));
|
|
59
|
-
const tmpBase = path.join(os.tmpdir(), `
|
|
59
|
+
const tmpBase = path.join(os.tmpdir(), `fulgurjs-config-${Date.now()}`);
|
|
60
60
|
if (/\.(ts|mts|cts)$/.test(configPath)) {
|
|
61
61
|
try {
|
|
62
62
|
const tmpTs = `${tmpBase}.ts`;
|
|
@@ -88,18 +88,18 @@ async function loadFulgurConfig(configPath) {
|
|
|
88
88
|
const cfg = mod.default;
|
|
89
89
|
if (!cfg?.root) {
|
|
90
90
|
throw new Error(
|
|
91
|
-
`[
|
|
91
|
+
`[fulgurjs:init] \u914D\u7F6E\u7F3A\u5C11 root\uFF08\u5DE5\u7A0B\u6839\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84\uFF09
|
|
92
92
|
\u6839\u56E0\uFF1ACLI \u9700\u8981\u77E5\u9053\u5728\u54EA\u4E2A\u5DE5\u7A0B\u4E0A\u505A\u96C6\u6210
|
|
93
|
-
\u4FEE\u6CD5\
|
|
93
|
+
\u4FEE\u6CD5\uFF1Afulgurjs.config.ts \u9876\u5C42\u8865 root: '/abs/path/to/repo'\uFF08\u8D77\u6B65\u6A21\u677F\uFF1Afulgurjs init\uFF09`
|
|
94
94
|
);
|
|
95
95
|
}
|
|
96
96
|
if (!Array.isArray(cfg.apps) || cfg.apps.length === 0) {
|
|
97
|
-
throw new Error("[
|
|
97
|
+
throw new Error("[fulgurjs:init] \u914D\u7F6E\u7F3A\u5C11 apps\uFF08\u81F3\u5C11\u4E00\u4E2A\u5BBF\u4E3B\u6216\u8FDC\u7A0B\u5E94\u7528\uFF09");
|
|
98
98
|
}
|
|
99
99
|
for (const app of cfg.apps) {
|
|
100
100
|
if (!app.host && !app.remote) {
|
|
101
101
|
throw new Error(
|
|
102
|
-
`[
|
|
102
|
+
`[fulgurjs:init] \u5E94\u7528 "${app.path}" \u65E2\u65E0 host \u4E5F\u65E0 remote \u89D2\u8272
|
|
103
103
|
\u6839\u56E0\uFF1A\u5E94\u7528\u5FC5\u987B\u81F3\u5C11\u58F0\u660E\u4E00\u4E2A\u89D2\u8272
|
|
104
104
|
\u4FEE\u6CD5\uFF1A\u5BBF\u4E3B\u8865 host: { pages, remotePrefixes, remotes }\uFF0C\u8FDC\u7A0B\u8865 remote: { exposes }`
|
|
105
105
|
);
|
|
@@ -109,6 +109,6 @@ async function loadFulgurConfig(configPath) {
|
|
|
109
109
|
}
|
|
110
110
|
// Annotate the CommonJS export names for ESM import in node:
|
|
111
111
|
0 && (module.exports = {
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
defineFulgurjsConfig,
|
|
113
|
+
loadFulgurjsConfig
|
|
114
114
|
});
|
package/dist/config.d.cts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* W1
|
|
2
|
+
* W1 fulgurjs.config.ts:单配置文件驱动的 schema + 加载器(项目无关,决策见排期文档 §4:
|
|
3
3
|
* 主包内置 bin + 单配置文件驱动,可入库可复跑)。
|
|
4
4
|
* init 只消费该配置生成通用样板(见 init.ts);插件运行时(federation())不读取本文件。
|
|
5
5
|
*/
|
|
6
|
-
interface
|
|
6
|
+
interface FulgurjsPageEntry {
|
|
7
7
|
/** 宿主路由路径(参数段用 :xx) */
|
|
8
8
|
route: string;
|
|
9
9
|
/** 路由 name(命名跳转依赖) */
|
|
@@ -13,25 +13,25 @@ interface FulgurPageEntry {
|
|
|
13
13
|
/** 页签标题 */
|
|
14
14
|
title?: string;
|
|
15
15
|
}
|
|
16
|
-
interface
|
|
16
|
+
interface FulgurjsRemoteAddress {
|
|
17
17
|
dev: string;
|
|
18
18
|
prod: string;
|
|
19
19
|
}
|
|
20
|
-
interface
|
|
20
|
+
interface FulgurjsHostConfig {
|
|
21
21
|
/** 页面路由表 */
|
|
22
|
-
pages:
|
|
22
|
+
pages: FulgurjsPageEntry[];
|
|
23
23
|
/** 路由前缀 → 远程名 */
|
|
24
24
|
remotePrefixes: Record<string, string>;
|
|
25
25
|
/** 消费的远程地址(键 = import 前缀;裸 URL,对象形式不支持 name@ 前缀) */
|
|
26
|
-
remotes: Record<string,
|
|
26
|
+
remotes: Record<string, FulgurjsRemoteAddress>;
|
|
27
27
|
}
|
|
28
|
-
interface
|
|
28
|
+
interface FulgurjsRemoteConfig {
|
|
29
29
|
/** exposes:./键 → 源文件(独立页) */
|
|
30
30
|
exposes: Record<string, string>;
|
|
31
31
|
/** 反向消费的远程(双向联邦时;dev 下自身源码参与协商需 devSharedSelf: true) */
|
|
32
|
-
remotes?: Record<string,
|
|
32
|
+
remotes?: Record<string, FulgurjsRemoteAddress>;
|
|
33
33
|
}
|
|
34
|
-
interface
|
|
34
|
+
interface FulgurjsAppConfig {
|
|
35
35
|
/** 相对 root 的应用目录 */
|
|
36
36
|
path: string;
|
|
37
37
|
/** 联邦容器名 */
|
|
@@ -43,37 +43,37 @@ interface FulgurAppConfig {
|
|
|
43
43
|
/** 部署目录名(缺省取 base 去斜杠) */
|
|
44
44
|
deployDir?: string;
|
|
45
45
|
/** 宿主角色 */
|
|
46
|
-
host?:
|
|
46
|
+
host?: FulgurjsHostConfig;
|
|
47
47
|
/** 远程角色 */
|
|
48
|
-
remote?:
|
|
48
|
+
remote?: FulgurjsRemoteConfig;
|
|
49
49
|
/** 该应用的 shared 表(缺省建议 vue/vue-router/pinia singleton,见 init 输出的样板) */
|
|
50
50
|
shared?: Record<string, {
|
|
51
51
|
singleton?: boolean;
|
|
52
52
|
requiredVersion?: string;
|
|
53
53
|
}>;
|
|
54
54
|
}
|
|
55
|
-
interface
|
|
55
|
+
interface FulgurjsDeployConfig {
|
|
56
56
|
/** NGINX 站点根(样板输出用,可选) */
|
|
57
57
|
webRoot?: string;
|
|
58
58
|
/** 监听端口(样板输出用,可选) */
|
|
59
59
|
listen?: number;
|
|
60
60
|
}
|
|
61
|
-
interface
|
|
61
|
+
interface FulgurjsRepoConfig {
|
|
62
62
|
/** 工程根(monorepo 根或单应用仓库根) */
|
|
63
63
|
root: string;
|
|
64
|
-
apps:
|
|
65
|
-
deploy?:
|
|
64
|
+
apps: FulgurjsAppConfig[];
|
|
65
|
+
deploy?: FulgurjsDeployConfig;
|
|
66
66
|
}
|
|
67
|
-
type
|
|
67
|
+
type FulgurjsUserConfig = Partial<FulgurjsRepoConfig>;
|
|
68
68
|
/** 用户配置文件入口:仅做类型收窄(identity),不引入运行时逻辑 */
|
|
69
|
-
declare function
|
|
69
|
+
declare function defineFulgurjsConfig(config: FulgurjsUserConfig): FulgurjsUserConfig;
|
|
70
70
|
/**
|
|
71
|
-
* 加载
|
|
71
|
+
* 加载 fulgurjs.config.ts(或 .js/.json)。
|
|
72
72
|
* - 配置内的 `@fulgurjs/federation/config` 导入被重写为本包 dist/config.js 绝对路径——
|
|
73
73
|
* init 之前工程依赖尚未安装(鸡生蛋),重写后零依赖可加载;
|
|
74
74
|
* - TS 走 Node 原生类型剥离(Node ≥23.6 默认开启;配置文件须用可擦除语法——纯对象无 enum/namespace);
|
|
75
75
|
* 老版本 Node 回退 esbuild 转译(先试配置工程,再试 CLI 自带依赖树)。
|
|
76
76
|
*/
|
|
77
|
-
declare function
|
|
77
|
+
declare function loadFulgurjsConfig(configPath: string): Promise<FulgurjsRepoConfig>;
|
|
78
78
|
|
|
79
|
-
export { type
|
|
79
|
+
export { type FulgurjsAppConfig, type FulgurjsDeployConfig, type FulgurjsHostConfig, type FulgurjsPageEntry, type FulgurjsRemoteAddress, type FulgurjsRemoteConfig, type FulgurjsRepoConfig, type FulgurjsUserConfig, defineFulgurjsConfig, loadFulgurjsConfig };
|
package/dist/config.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* W1
|
|
2
|
+
* W1 fulgurjs.config.ts:单配置文件驱动的 schema + 加载器(项目无关,决策见排期文档 §4:
|
|
3
3
|
* 主包内置 bin + 单配置文件驱动,可入库可复跑)。
|
|
4
4
|
* init 只消费该配置生成通用样板(见 init.ts);插件运行时(federation())不读取本文件。
|
|
5
5
|
*/
|
|
6
|
-
interface
|
|
6
|
+
interface FulgurjsPageEntry {
|
|
7
7
|
/** 宿主路由路径(参数段用 :xx) */
|
|
8
8
|
route: string;
|
|
9
9
|
/** 路由 name(命名跳转依赖) */
|
|
@@ -13,25 +13,25 @@ interface FulgurPageEntry {
|
|
|
13
13
|
/** 页签标题 */
|
|
14
14
|
title?: string;
|
|
15
15
|
}
|
|
16
|
-
interface
|
|
16
|
+
interface FulgurjsRemoteAddress {
|
|
17
17
|
dev: string;
|
|
18
18
|
prod: string;
|
|
19
19
|
}
|
|
20
|
-
interface
|
|
20
|
+
interface FulgurjsHostConfig {
|
|
21
21
|
/** 页面路由表 */
|
|
22
|
-
pages:
|
|
22
|
+
pages: FulgurjsPageEntry[];
|
|
23
23
|
/** 路由前缀 → 远程名 */
|
|
24
24
|
remotePrefixes: Record<string, string>;
|
|
25
25
|
/** 消费的远程地址(键 = import 前缀;裸 URL,对象形式不支持 name@ 前缀) */
|
|
26
|
-
remotes: Record<string,
|
|
26
|
+
remotes: Record<string, FulgurjsRemoteAddress>;
|
|
27
27
|
}
|
|
28
|
-
interface
|
|
28
|
+
interface FulgurjsRemoteConfig {
|
|
29
29
|
/** exposes:./键 → 源文件(独立页) */
|
|
30
30
|
exposes: Record<string, string>;
|
|
31
31
|
/** 反向消费的远程(双向联邦时;dev 下自身源码参与协商需 devSharedSelf: true) */
|
|
32
|
-
remotes?: Record<string,
|
|
32
|
+
remotes?: Record<string, FulgurjsRemoteAddress>;
|
|
33
33
|
}
|
|
34
|
-
interface
|
|
34
|
+
interface FulgurjsAppConfig {
|
|
35
35
|
/** 相对 root 的应用目录 */
|
|
36
36
|
path: string;
|
|
37
37
|
/** 联邦容器名 */
|
|
@@ -43,37 +43,37 @@ interface FulgurAppConfig {
|
|
|
43
43
|
/** 部署目录名(缺省取 base 去斜杠) */
|
|
44
44
|
deployDir?: string;
|
|
45
45
|
/** 宿主角色 */
|
|
46
|
-
host?:
|
|
46
|
+
host?: FulgurjsHostConfig;
|
|
47
47
|
/** 远程角色 */
|
|
48
|
-
remote?:
|
|
48
|
+
remote?: FulgurjsRemoteConfig;
|
|
49
49
|
/** 该应用的 shared 表(缺省建议 vue/vue-router/pinia singleton,见 init 输出的样板) */
|
|
50
50
|
shared?: Record<string, {
|
|
51
51
|
singleton?: boolean;
|
|
52
52
|
requiredVersion?: string;
|
|
53
53
|
}>;
|
|
54
54
|
}
|
|
55
|
-
interface
|
|
55
|
+
interface FulgurjsDeployConfig {
|
|
56
56
|
/** NGINX 站点根(样板输出用,可选) */
|
|
57
57
|
webRoot?: string;
|
|
58
58
|
/** 监听端口(样板输出用,可选) */
|
|
59
59
|
listen?: number;
|
|
60
60
|
}
|
|
61
|
-
interface
|
|
61
|
+
interface FulgurjsRepoConfig {
|
|
62
62
|
/** 工程根(monorepo 根或单应用仓库根) */
|
|
63
63
|
root: string;
|
|
64
|
-
apps:
|
|
65
|
-
deploy?:
|
|
64
|
+
apps: FulgurjsAppConfig[];
|
|
65
|
+
deploy?: FulgurjsDeployConfig;
|
|
66
66
|
}
|
|
67
|
-
type
|
|
67
|
+
type FulgurjsUserConfig = Partial<FulgurjsRepoConfig>;
|
|
68
68
|
/** 用户配置文件入口:仅做类型收窄(identity),不引入运行时逻辑 */
|
|
69
|
-
declare function
|
|
69
|
+
declare function defineFulgurjsConfig(config: FulgurjsUserConfig): FulgurjsUserConfig;
|
|
70
70
|
/**
|
|
71
|
-
* 加载
|
|
71
|
+
* 加载 fulgurjs.config.ts(或 .js/.json)。
|
|
72
72
|
* - 配置内的 `@fulgurjs/federation/config` 导入被重写为本包 dist/config.js 绝对路径——
|
|
73
73
|
* init 之前工程依赖尚未安装(鸡生蛋),重写后零依赖可加载;
|
|
74
74
|
* - TS 走 Node 原生类型剥离(Node ≥23.6 默认开启;配置文件须用可擦除语法——纯对象无 enum/namespace);
|
|
75
75
|
* 老版本 Node 回退 esbuild 转译(先试配置工程,再试 CLI 自带依赖树)。
|
|
76
76
|
*/
|
|
77
|
-
declare function
|
|
77
|
+
declare function loadFulgurjsConfig(configPath: string): Promise<FulgurjsRepoConfig>;
|
|
78
78
|
|
|
79
|
-
export { type
|
|
79
|
+
export { type FulgurjsAppConfig, type FulgurjsDeployConfig, type FulgurjsHostConfig, type FulgurjsPageEntry, type FulgurjsRemoteAddress, type FulgurjsRemoteConfig, type FulgurjsRepoConfig, type FulgurjsUserConfig, defineFulgurjsConfig, loadFulgurjsConfig };
|
package/dist/config.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/config.ts
|
|
2
|
-
function
|
|
2
|
+
function defineFulgurjsConfig(config) {
|
|
3
3
|
return config;
|
|
4
4
|
}
|
|
5
|
-
async function
|
|
5
|
+
async function loadFulgurjsConfig(configPath) {
|
|
6
6
|
const { pathToFileURL, fileURLToPath } = await import("url");
|
|
7
7
|
const { createRequire } = await import("module");
|
|
8
8
|
const fs = await import("fs");
|
|
@@ -10,8 +10,8 @@ async function loadFulgurConfig(configPath) {
|
|
|
10
10
|
const path = await import("path");
|
|
11
11
|
const selfDir = path.dirname(fileURLToPath(import.meta.url));
|
|
12
12
|
const selfConfigJs = path.join(selfDir, "config.js");
|
|
13
|
-
const SELF_SPEC = fs.existsSync(selfConfigJs) ? pathToFileURL(selfConfigJs).href : "@
|
|
14
|
-
const rewriteSelfImports = (source) => source.replace(/(['"])@
|
|
13
|
+
const SELF_SPEC = fs.existsSync(selfConfigJs) ? pathToFileURL(selfConfigJs).href : "@fulgurjs-federation-config-unavailable";
|
|
14
|
+
const rewriteSelfImports = (source) => source.replace(/(['"])@fulgurjs\/federation\/config\1/g, (_m, q) => `${q}${SELF_SPEC}${q}`);
|
|
15
15
|
const importConfigs = async (cacheKey) => {
|
|
16
16
|
return await import(`${cacheKey}?t=${Date.now()}`);
|
|
17
17
|
};
|
|
@@ -20,7 +20,7 @@ async function loadFulgurConfig(configPath) {
|
|
|
20
20
|
mod = { default: JSON.parse(fs.readFileSync(configPath, "utf8")) };
|
|
21
21
|
} else {
|
|
22
22
|
const source = rewriteSelfImports(fs.readFileSync(configPath, "utf8"));
|
|
23
|
-
const tmpBase = path.join(os.tmpdir(), `
|
|
23
|
+
const tmpBase = path.join(os.tmpdir(), `fulgurjs-config-${Date.now()}`);
|
|
24
24
|
if (/\.(ts|mts|cts)$/.test(configPath)) {
|
|
25
25
|
try {
|
|
26
26
|
const tmpTs = `${tmpBase}.ts`;
|
|
@@ -52,18 +52,18 @@ async function loadFulgurConfig(configPath) {
|
|
|
52
52
|
const cfg = mod.default;
|
|
53
53
|
if (!cfg?.root) {
|
|
54
54
|
throw new Error(
|
|
55
|
-
`[
|
|
55
|
+
`[fulgurjs:init] \u914D\u7F6E\u7F3A\u5C11 root\uFF08\u5DE5\u7A0B\u6839\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84\uFF09
|
|
56
56
|
\u6839\u56E0\uFF1ACLI \u9700\u8981\u77E5\u9053\u5728\u54EA\u4E2A\u5DE5\u7A0B\u4E0A\u505A\u96C6\u6210
|
|
57
|
-
\u4FEE\u6CD5\
|
|
57
|
+
\u4FEE\u6CD5\uFF1Afulgurjs.config.ts \u9876\u5C42\u8865 root: '/abs/path/to/repo'\uFF08\u8D77\u6B65\u6A21\u677F\uFF1Afulgurjs init\uFF09`
|
|
58
58
|
);
|
|
59
59
|
}
|
|
60
60
|
if (!Array.isArray(cfg.apps) || cfg.apps.length === 0) {
|
|
61
|
-
throw new Error("[
|
|
61
|
+
throw new Error("[fulgurjs:init] \u914D\u7F6E\u7F3A\u5C11 apps\uFF08\u81F3\u5C11\u4E00\u4E2A\u5BBF\u4E3B\u6216\u8FDC\u7A0B\u5E94\u7528\uFF09");
|
|
62
62
|
}
|
|
63
63
|
for (const app of cfg.apps) {
|
|
64
64
|
if (!app.host && !app.remote) {
|
|
65
65
|
throw new Error(
|
|
66
|
-
`[
|
|
66
|
+
`[fulgurjs:init] \u5E94\u7528 "${app.path}" \u65E2\u65E0 host \u4E5F\u65E0 remote \u89D2\u8272
|
|
67
67
|
\u6839\u56E0\uFF1A\u5E94\u7528\u5FC5\u987B\u81F3\u5C11\u58F0\u660E\u4E00\u4E2A\u89D2\u8272
|
|
68
68
|
\u4FEE\u6CD5\uFF1A\u5BBF\u4E3B\u8865 host: { pages, remotePrefixes, remotes }\uFF0C\u8FDC\u7A0B\u8865 remote: { exposes }`
|
|
69
69
|
);
|
|
@@ -72,6 +72,6 @@ async function loadFulgurConfig(configPath) {
|
|
|
72
72
|
return cfg;
|
|
73
73
|
}
|
|
74
74
|
export {
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
defineFulgurjsConfig,
|
|
76
|
+
loadFulgurjsConfig
|
|
77
77
|
};
|