@fulgurjs/federation 6.11.7 → 6.12.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 (79) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.en.md +2 -0
  3. package/README.md +3 -3
  4. package/dist/{application-core-DWI3eKme.d.ts → application-core-C72tVRT7.d.ts} +1 -1
  5. package/dist/{application-core-BuhXQmLF.d.cts → application-core-Coa0CIre.d.cts} +1 -1
  6. package/dist/bridge-app-react.d.cts +2 -2
  7. package/dist/bridge-app-react.d.ts +2 -2
  8. package/dist/bridge-app-react.js +1 -1
  9. package/dist/bridge-app-vue.d.cts +2 -2
  10. package/dist/bridge-app-vue.d.ts +2 -2
  11. package/dist/bridge-app-vue.js +1 -1
  12. package/dist/{bridge-core-77BT1__I.d.cts → bridge-core-CGFET9Qi.d.cts} +2 -1
  13. package/dist/{bridge-core-CoQRVgnZ.d.ts → bridge-core-Dm6ABUxQ.d.ts} +2 -1
  14. package/dist/bridge-core.cjs +4 -1
  15. package/dist/bridge-core.d.cts +1 -1
  16. package/dist/bridge-core.d.ts +1 -1
  17. package/dist/bridge-core.js +1 -1
  18. package/dist/bridge-host-react.cjs +4 -1
  19. package/dist/bridge-host-react.d.cts +2 -2
  20. package/dist/bridge-host-react.d.ts +2 -2
  21. package/dist/bridge-host-react.js +1 -1
  22. package/dist/bridge-host-vue.cjs +42 -5
  23. package/dist/bridge-host-vue.d.cts +12 -4
  24. package/dist/bridge-host-vue.d.ts +12 -4
  25. package/dist/bridge-host-vue.js +40 -5
  26. package/dist/bridge-session-auto.cjs +121 -0
  27. package/dist/bridge-session-auto.d.cts +21 -0
  28. package/dist/bridge-session-auto.d.ts +21 -0
  29. package/dist/bridge-session-auto.js +88 -0
  30. package/dist/{chunk-HDRZBSND.js → chunk-2MWIIRQZ.js} +4 -1
  31. package/dist/cli.js +53 -10
  32. package/dist/index.cjs +4 -3
  33. package/dist/index.js +4 -3
  34. package/dist/react-adapter.d.cts +2 -2
  35. package/dist/react-adapter.d.ts +2 -2
  36. package/dist/react.d.ts +2 -2
  37. package/dist/{remote-types-COmBhjRc.d.ts → remote-types-CMtfvLcH.d.ts} +1 -1
  38. package/dist/{remote-types-CStGOJwu.d.cts → remote-types-Cf4SSzus.d.cts} +1 -1
  39. package/dist/runtime-entry.d.ts +2 -2
  40. package/dist/runtime.js +13 -13
  41. package/dist/vue-adapter.d.cts +2 -2
  42. package/dist/vue-adapter.d.ts +2 -2
  43. package/dist/vue.d.ts +10 -3
  44. package/dist/vue.js +2 -1
  45. package/docs/en/reference/api.md +15 -4
  46. package/docs/en/reference/errors.md +1 -1
  47. package/docs/en/reference/types.md +4 -2
  48. package/docs/zh/reference/api.md +16 -6
  49. package/docs/zh/reference/errors.md +1 -1
  50. package/docs/zh/reference/types.md +4 -2
  51. package/examples/templates/README.md +2 -0
  52. package/examples/templates/react-host-vue-remote/pnpm-lock.yaml +7 -7
  53. package/examples/templates/react-host-vue-remote/pnpm-workspace.yaml +1 -1
  54. package/examples/templates/react-host-vue-remote/react-host/package.json +1 -1
  55. package/examples/templates/react-host-vue-remote/vue-remote/package.json +1 -1
  56. package/examples/templates/react-react/host/package.json +1 -1
  57. package/examples/templates/react-react/pnpm-lock.yaml +7 -7
  58. package/examples/templates/react-react/pnpm-workspace.yaml +1 -1
  59. package/examples/templates/react-react/remote/package.json +1 -1
  60. package/examples/templates/showcase/pnpm-lock.yaml +11 -11
  61. package/examples/templates/showcase/pnpm-workspace.yaml +1 -1
  62. package/examples/templates/showcase/react-host/package.json +1 -1
  63. package/examples/templates/showcase/react-remote/package.json +1 -1
  64. package/examples/templates/showcase/vue-host/package.json +1 -1
  65. package/examples/templates/showcase/vue-remote/package.json +1 -1
  66. package/examples/templates/vue-host-react-remote/README.md +5 -1
  67. package/examples/templates/vue-host-react-remote/pnpm-lock.yaml +7 -7
  68. package/examples/templates/vue-host-react-remote/pnpm-workspace.yaml +1 -1
  69. package/examples/templates/vue-host-react-remote/react-remote/package.json +1 -1
  70. package/examples/templates/vue-host-react-remote/vue-host/README.md +9 -5
  71. package/examples/templates/vue-host-react-remote/vue-host/package.json +1 -1
  72. package/examples/templates/vue-host-react-remote/vue-host/src/App.vue +14 -45
  73. package/examples/templates/vue-host-react-remote/vue-host/src/fulgurjs/host/context.ts +28 -0
  74. package/examples/templates/vue-vue/host/package.json +1 -1
  75. package/examples/templates/vue-vue/pnpm-lock.yaml +7 -7
  76. package/examples/templates/vue-vue/pnpm-workspace.yaml +1 -1
  77. package/examples/templates/vue-vue/remote/package.json +1 -1
  78. package/package.json +6 -2
  79. package/examples/templates/vue-host-react-remote/vue-host/src/fulgurjs/host/session.ts +0 -29
@@ -1,68 +1,37 @@
1
1
  <script setup lang="ts">
2
- /**
3
- * Vue 宿主 × React 桥接子应用(examples 版,含全部关键语义注释)。
4
- * 先启动 examples/templates/react-remote(5303)再启动本宿主。
5
- */
6
- import { ref } from 'vue'
7
- import { clearAppContext } from '@fulgurjs/federation/runtime'
2
+ /** Vue宿主嵌React完整应用:只绑定业务身份与上下文,不手写联邦登录代次。 */
3
+ import { computed, ref } from 'vue'
8
4
  import { createVueBridgeApp } from '@fulgurjs/federation/vue'
9
- import { getLatestHostContext, login, logout } from './fulgurjs/host/session'
5
+ import { currentUser, sessionIdentity, getLatestHostContext, login, logout, refreshToken } from './fulgurjs/host/context'
10
6
 
11
- // 工厂选项:retries 透传 loadRemote;getContext 在每次实际加载前同步取最新快照
12
7
  const RemoteReactApp = createVueBridgeApp('bridge-react-remote/bridge', {
13
8
  retries: 1,
14
- getContext: () => getLatestHostContext(),
9
+ session: sessionIdentity,
10
+ getContext: getLatestHostContext,
15
11
  })
16
-
17
- // sessionKey 是桥接控制参数(非敏感登录代次 ID),不是业务 props
18
- const sessionKey = ref<string | null>('login-1-alice')
19
- const userName = ref('Alice')
12
+ const userName = computed(() => currentUser()?.name ?? '')
20
13
  const label = ref('来自 Vue 宿主')
21
14
  const readyCount = ref(0)
22
-
23
- function handleReady(): void {
24
- readyCount.value++
25
- }
26
-
27
- function nextFrame(): Promise<void> {
28
- return new Promise((r) => requestAnimationFrame(() => r()))
29
- }
30
-
31
- // 换账号推荐顺序(§4.3):受控 prop 置 null → 等卸载 → clearAppContext 清 A 残留
32
- // → 登录 B → 更新受控 prop 触发新代次(getContext + loadRemote + onSession 全走一遍)
33
- async function switchUser(): Promise<void> {
34
- sessionKey.value = null
35
- await nextFrame()
36
- clearAppContext()
37
- login('login-2-bob', { id: 2, name: 'Bob' })
38
- userName.value = 'Bob'
39
- sessionKey.value = 'login-2-bob'
40
- }
41
-
42
- // 登出:prop 置 null → 桥接立即卸载且不再请求 → 宿主清理全局 context
43
- async function doLogout(): Promise<void> {
44
- sessionKey.value = null
45
- await nextFrame()
46
- clearAppContext()
47
- logout()
48
- userName.value = ''
49
- }
15
+ function handleReady(): void { readyCount.value++ }
16
+ // 这些函数只改业务状态;换代、清理旧上下文与卸载顺序由插件负责。
17
+ function switchUser(): void { login({ id: 2, name: 'Bob' }) }
18
+ function doLogout(): void { logout() }
50
19
  </script>
51
20
 
52
21
  <template>
53
22
  <div style="font-family: sans-serif; padding: 16px; max-width: 720px">
54
23
  <h1>Vue 宿主 × React 子应用(@fulgurjs/federation/vue)</h1>
55
- <p data-testid="demo-session">会话:{{ sessionKey ?? '未登录' }}({{ userName || '—' }})· onReady 次数:{{ readyCount }}</p>
24
+ <p data-testid="demo-session">当前用户:{{ userName || '未登录' }}· onReady 次数:{{ readyCount }}</p>
56
25
 
57
26
  <p>
58
- <button data-testid="demo-switch" @click="switchUser">切换到 Bob(clearAppContext → 重挂)</button>
59
- <button data-testid="demo-logout" @click="doLogout">登出(sessionKey → null)</button>
27
+ <button data-testid="demo-switch" @click="switchUser">切换到 Bob(自动重挂)</button>
28
+ <button data-testid="demo-refresh-token" @click="refreshToken">刷新 token(不重挂)</button>
29
+ <button data-testid="demo-logout" @click="doLogout">登出(自动卸载)</button>
60
30
  </p>
61
31
 
62
32
  <!-- 外层元素控制桥接区域外观;appProps 是挂载时浅拷贝快照,换引用不重挂,重挂用 :key -->
63
33
  <section style="margin-top: 12px">
64
34
  <RemoteReactApp
65
- :session-key="sessionKey"
66
35
  :app-props="{ label, onReady: handleReady }"
67
36
  />
68
37
  </section>
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 演示宿主的业务登录状态与上下文。真实工程复用已有登录 store,不复制本示例的假账号。
3
+ * session getter 仅返回非敏感用户ID;插件负责代次/恢复/卸载,token刷新不触发重挂。
4
+ * 一个响应式快照让用户与token同时提交,避免在换号中间态把旧用户配上新凭据。
5
+ */
6
+ import { shallowRef } from 'vue'
7
+
8
+ interface HostUser { id: number; name: string }
9
+ const current = shallowRef<{ user: HostUser; token: string } | null>({
10
+ user: { id: 1, name: 'Alice' }, token: 'demo-alice-token',
11
+ })
12
+
13
+ export const currentUser = () => current.value?.user ?? null
14
+ export const sessionIdentity = () => current.value?.user.id ?? null
15
+
16
+ /** 业务快照不填sessionKey;桥接层从自动会话补入,函数每次读取当前登录状态。 */
17
+ export function getLatestHostContext() {
18
+ return { user: current.value?.user ?? {}, getToken: () => current.value?.token }
19
+ }
20
+
21
+ export function login(user: HostUser): void {
22
+ current.value = { user, token: `demo-token-${user.id}-${Date.now()}` }
23
+ }
24
+ export function logout(): void { current.value = null }
25
+ /** 只换凭据:身份不变,插件保持同一个子应用实例。 */
26
+ export function refreshToken(): void {
27
+ if (current.value) current.value = { ...current.value, token: `demo-refresh-${Date.now()}` }
28
+ }
@@ -11,7 +11,7 @@
11
11
  "typecheck": "vue-tsc --noEmit"
12
12
  },
13
13
  "dependencies": {
14
- "@fulgurjs/federation": "6.11.4",
14
+ "@fulgurjs/federation": "6.12.0",
15
15
  "vue": "^3.5.13",
16
16
  "vue-router": "^4.5.0"
17
17
  },
@@ -11,8 +11,8 @@ importers:
11
11
  host:
12
12
  dependencies:
13
13
  '@fulgurjs/federation':
14
- specifier: 6.11.4
15
- version: 6.11.4(vite@6.4.4)(vue-router@4.6.4(vue@3.5.44(typescript@5.9.3)))(vue@3.5.44(typescript@5.9.3))
14
+ specifier: 6.12.0
15
+ version: 6.12.0(vite@6.4.4)(vue-router@4.6.4(vue@3.5.44(typescript@5.9.3)))(vue@3.5.44(typescript@5.9.3))
16
16
  vue:
17
17
  specifier: ^3.5.13
18
18
  version: 3.5.44(typescript@5.9.3)
@@ -36,8 +36,8 @@ importers:
36
36
  remote:
37
37
  dependencies:
38
38
  '@fulgurjs/federation':
39
- specifier: 6.11.4
40
- version: 6.11.4(vite@6.4.4)(vue-router@4.6.4(vue@3.5.44(typescript@5.9.3)))(vue@3.5.44(typescript@5.9.3))
39
+ specifier: 6.12.0
40
+ version: 6.12.0(vite@6.4.4)(vue-router@4.6.4(vue@3.5.44(typescript@5.9.3)))(vue@3.5.44(typescript@5.9.3))
41
41
  vue:
42
42
  specifier: ^3.5.13
43
43
  version: 3.5.44(typescript@5.9.3)
@@ -386,8 +386,8 @@ packages:
386
386
  cpu: [x64]
387
387
  os: [win32]
388
388
 
389
- '@fulgurjs/federation@6.11.4':
390
- resolution: {integrity: sha512-FyBLpBwRbMcLY7tlUIGl2HJBCa+U1GmpQvhTITdJun8pFWfW+9uyNVf3CxZB8S1WizhbXgVuPeWyOgujdsF7rw==}
389
+ '@fulgurjs/federation@6.12.0':
390
+ resolution: {integrity: sha512-l37+A1drLgzIztZBTthhQKWuLXUwtsjfv5WQ2cqOHwMxVu/2qYwaacAk4OgDcN/6M4Vyjj8hMGNQL6Hd3Zr46Q==}
391
391
  engines: {node: '>=18'}
392
392
  hasBin: true
393
393
  peerDependencies:
@@ -955,7 +955,7 @@ snapshots:
955
955
  '@esbuild/win32-x64@0.27.7':
956
956
  optional: true
957
957
 
958
- '@fulgurjs/federation@6.11.4(vite@6.4.4)(vue-router@4.6.4(vue@3.5.44(typescript@5.9.3)))(vue@3.5.44(typescript@5.9.3))':
958
+ '@fulgurjs/federation@6.12.0(vite@6.4.4)(vue-router@4.6.4(vue@3.5.44(typescript@5.9.3)))(vue@3.5.44(typescript@5.9.3))':
959
959
  dependencies:
960
960
  es-module-lexer: 1.7.0
961
961
  esbuild: 0.27.7
@@ -2,7 +2,7 @@ packages:
2
2
  - host
3
3
  - remote
4
4
  minimumReleaseAgeExclude:
5
- - '@fulgurjs/federation@6.11.4'
5
+ - '@fulgurjs/federation@6.11.4 || 6.12.0'
6
6
  # pnpm >=12 构建脚本批准(12 起弃用 onlyBuiltDependencies;pnpm 9-11 忽略本键:
7
7
  # esbuild >=0.16 二进制经 optionalDependencies 平台包分发,postinstall 仅校验,不阻塞安装)
8
8
  allowBuilds:
@@ -11,7 +11,7 @@
11
11
  "typecheck": "vue-tsc --noEmit"
12
12
  },
13
13
  "dependencies": {
14
- "@fulgurjs/federation": "6.11.4",
14
+ "@fulgurjs/federation": "6.12.0",
15
15
  "vue": "^3.5.13"
16
16
  },
17
17
  "devDependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fulgurjs/federation",
3
- "version": "6.11.7",
3
+ "version": "6.12.1",
4
4
  "type": "module",
5
5
  "description": "Vite Module Federation for Vue and React: remote modules, shared dependencies and app bridges.",
6
6
  "license": "MIT",
@@ -85,6 +85,10 @@
85
85
  "./internal/vue-store.js": {
86
86
  "types": "./dist/vue-store.d.ts",
87
87
  "import": "./dist/vue-store.js"
88
+ },
89
+ "./internal/bridge-session-auto.js": {
90
+ "types": "./dist/bridge-session-auto.d.ts",
91
+ "import": "./dist/bridge-session-auto.js"
88
92
  }
89
93
  },
90
94
  "typesVersions": {
@@ -122,7 +126,7 @@
122
126
  "types"
123
127
  ],
124
128
  "scripts": {
125
- "build": "cp ../../README.md README.md && cp ../../README.en.md README.en.md && mkdir -p docs && mkdir -p docs/zh/reference docs/en/reference docs/maintainers && cp ../../docs/zh/reference/api.md ../../docs/zh/reference/errors.md ../../docs/zh/reference/types.md docs/zh/reference/ && cp ../../docs/en/reference/api.md ../../docs/en/reference/errors.md ../../docs/en/reference/types.md docs/en/reference/ && cp ../../docs/maintainers/webpack-mf-对照与缺口.md ../../docs/maintainers/沙箱边界审计.md ../../docs/maintainers/compatibility-testing.md docs/maintainers/ && cp ../../CHANGELOG.md CHANGELOG.md && node scripts/sync-package-examples.mjs && esbuild src/runtime/index.ts --bundle --format=esm --target=es2022 --minify --outfile=dist/runtime.js && node scripts/gen-runtime.mjs && tsup src/index.ts src/pages.ts src/vue-adapter.ts src/react-adapter.ts src/context.ts src/bridge-core.ts src/bridge-errors.ts src/bridge-session.ts src/bridge-app-vue.ts src/bridge-app-react.ts src/vue-store.ts src/bridge-host-vue.ts src/bridge-host-react.ts --format esm,cjs --dts --external vite --external @fulgurjs/federation/internal/registry.js --target node18 --clean && tsup src/runtime-entry.ts --format esm --dts --external vite --external @fulgurjs/federation/internal/registry.js --target node18 && tsup src/vue.ts --format esm --dts --external vite,vue,vue-router,@fulgurjs/federation/internal/registry.js --target node18 && tsup src/react.ts --format esm --dts --external vite,react,react-dom,react-router-dom,@fulgurjs/federation/internal/registry.js --target node18 && tsup src/bridge-router-vue.ts --format esm --dts --external vite,vue,vue-router --target node18 && tsup src/bridge-router-react.tsx --format esm --dts --external vite,react,react-dom,react-router-dom --target node18 && esbuild src/cli.ts --bundle --format=esm --target=node18 --platform=node --outfile=dist/cli.js && esbuild src/runtime/index.ts --bundle --format=esm --target=es2022 --minify --outfile=dist/runtime.js && node scripts/gen-runtime-entry.mjs && node scripts/check-gzip.mjs && node scripts/check-tree-shaking.mjs && node scripts/check-manual-codes.mjs",
129
+ "build": "cp ../../README.md README.md && cp ../../README.en.md README.en.md && mkdir -p docs && mkdir -p docs/zh/reference docs/en/reference docs/maintainers && cp ../../docs/zh/reference/api.md ../../docs/zh/reference/errors.md ../../docs/zh/reference/types.md docs/zh/reference/ && cp ../../docs/en/reference/api.md ../../docs/en/reference/errors.md ../../docs/en/reference/types.md docs/en/reference/ && cp ../../docs/maintainers/webpack-mf-对照与缺口.md ../../docs/maintainers/沙箱边界审计.md ../../docs/maintainers/compatibility-testing.md docs/maintainers/ && cp ../../CHANGELOG.md CHANGELOG.md && node scripts/sync-package-examples.mjs && esbuild src/runtime/index.ts --bundle --format=esm --target=es2022 --minify --outfile=dist/runtime.js && node scripts/gen-runtime.mjs && tsup src/index.ts src/pages.ts src/vue-adapter.ts src/react-adapter.ts src/context.ts src/bridge-core.ts src/bridge-errors.ts src/bridge-session.ts src/bridge-app-vue.ts src/bridge-app-react.ts src/vue-store.ts src/bridge-host-vue.ts src/bridge-host-react.ts src/bridge-session-auto.ts --format esm,cjs --dts --external vite --external @fulgurjs/federation/internal/registry.js --target node18 --clean && tsup src/runtime-entry.ts --format esm --dts --external vite --external @fulgurjs/federation/internal/registry.js --target node18 && tsup src/vue.ts --format esm --dts --external vite,vue,vue-router,@fulgurjs/federation/internal/registry.js --target node18 && tsup src/react.ts --format esm --dts --external vite,react,react-dom,react-router-dom,@fulgurjs/federation/internal/registry.js --target node18 && tsup src/bridge-router-vue.ts --format esm --dts --external vite,vue,vue-router --target node18 && tsup src/bridge-router-react.tsx --format esm --dts --external vite,react,react-dom,react-router-dom --target node18 && esbuild src/cli.ts --bundle --format=esm --target=node18 --platform=node --outfile=dist/cli.js && esbuild src/runtime/index.ts --bundle --format=esm --target=es2022 --minify --outfile=dist/runtime.js && node scripts/gen-runtime-entry.mjs && node scripts/check-gzip.mjs && node scripts/check-tree-shaking.mjs && node scripts/check-manual-codes.mjs",
126
130
  "dev": "tsup --watch",
127
131
  "test": "vitest run --dir tests",
128
132
  "typecheck": "tsc --noEmit",
@@ -1,29 +0,0 @@
1
- /**
2
- * 宿主自有会话源(示例实现):返回「当前登录用户」的完整 AppContext 快照。
3
- * 要求(任务书 §4.3):纯同步、无副作用、不调 provideAppContext、不返回 Promise。
4
- * 真实项目里通常读登录 store / token 管理器——只要保持「同步快照 getter」语义即可。
5
- */
6
- export interface HostSession {
7
- key: string | null
8
- user: { id: number; name: string }
9
- }
10
-
11
- let current: HostSession = { key: 'login-1-alice', user: { id: 1, name: 'Alice' } }
12
-
13
- export function getLatestHostContext(): Record<string, unknown> & { sessionKey: string } {
14
- if (current.key === null) throw new Error('已登出:此刻不应有桥接代次请求 context')
15
- return {
16
- sessionKey: current.key,
17
- user: current.user,
18
- // 取最新 token 用拉取式函数引用,防止快照过期(README §9)
19
- getToken: () => `token-for-${current.key}`,
20
- }
21
- }
22
-
23
- export function login(key: string, user: { id: number; name: string }): void {
24
- current = { key, user }
25
- }
26
-
27
- export function logout(): void {
28
- current = { key: null, user: { id: 0, name: '' } }
29
- }