@bleedingdev/modern-js-federation-runtime 3.9.3-ultramodern.1 → 3.9.3-ultramodern.11
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/cjs/module-federation/native-browser-dev-client.js +320 -0
- package/dist/cjs/module-federation/native-browser-dev-refresh.js +226 -0
- package/dist/cjs/module-federation/native-browser-dev-runtime-plugin.js +233 -0
- package/dist/cjs/module-federation/native-dev-refresh-runtime-plugin.js +267 -0
- package/dist/cjs/module-federation/renderer-runtime-plugin.js +5 -2
- package/dist/esm/module-federation/native-browser-dev-client.mjs +276 -0
- package/dist/esm/module-federation/native-browser-dev-refresh.mjs +182 -0
- package/dist/esm/module-federation/native-browser-dev-runtime-plugin.mjs +183 -0
- package/dist/esm/module-federation/native-dev-refresh-runtime-plugin.mjs +229 -0
- package/dist/esm/module-federation/renderer-runtime-plugin.mjs +5 -2
- package/dist/esm-node/module-federation/native-browser-dev-client.mjs +277 -0
- package/dist/esm-node/module-federation/native-browser-dev-refresh.mjs +183 -0
- package/dist/esm-node/module-federation/native-browser-dev-runtime-plugin.mjs +184 -0
- package/dist/esm-node/module-federation/native-dev-refresh-runtime-plugin.mjs +230 -0
- package/dist/esm-node/module-federation/renderer-runtime-plugin.mjs +5 -2
- package/dist/types/module-federation/native-browser-dev-client.d.ts +41 -0
- package/dist/types/module-federation/native-browser-dev-refresh.d.ts +86 -0
- package/dist/types/module-federation/native-browser-dev-runtime-plugin.d.ts +40 -0
- package/dist/types/module-federation/native-dev-refresh-runtime-plugin.d.ts +90 -0
- package/package.json +60 -13
- package/src/module-federation/native-browser-dev-client.ts +424 -0
- package/src/module-federation/native-browser-dev-refresh.ts +373 -0
- package/src/module-federation/native-browser-dev-runtime-plugin.ts +276 -0
- package/src/module-federation/native-dev-refresh-runtime-plugin.ts +445 -0
- package/src/module-federation/renderer-runtime-plugin.ts +7 -2
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, getters, values)=>{
|
|
5
|
+
var define = (defs, kind)=>{
|
|
6
|
+
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
[kind]: defs[key]
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
define(getters, "get");
|
|
12
|
+
define(values, "value");
|
|
13
|
+
};
|
|
14
|
+
})();
|
|
15
|
+
(()=>{
|
|
16
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
|
+
})();
|
|
18
|
+
(()=>{
|
|
19
|
+
__webpack_require__.r = (exports1)=>{
|
|
20
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
|
+
value: 'Module'
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
24
|
+
value: true
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
})();
|
|
28
|
+
var __webpack_exports__ = {};
|
|
29
|
+
__webpack_require__.r(__webpack_exports__);
|
|
30
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
+
NATIVE_BROWSER_DEV_BOUNDARY: ()=>NATIVE_BROWSER_DEV_BOUNDARY,
|
|
32
|
+
createNativeBrowserDevRuntimePlugin: ()=>createNativeBrowserDevRuntimePlugin,
|
|
33
|
+
hasNativeBrowserDevPublisher: ()=>hasNativeBrowserDevPublisher,
|
|
34
|
+
readNativeBrowserDevPublication: ()=>readNativeBrowserDevPublication,
|
|
35
|
+
replaceNativeBrowserDevRemote: ()=>replaceNativeBrowserDevRemote
|
|
36
|
+
});
|
|
37
|
+
const external_native_browser_dev_refresh_js_namespaceObject = require("./native-browser-dev-refresh.js");
|
|
38
|
+
const external_renderer_contract_js_namespaceObject = require("./renderer-contract.js");
|
|
39
|
+
const NATIVE_BROWSER_DEV_BOUNDARY = Symbol.for('ultramodern.federation.browser-dev-boundary.v1');
|
|
40
|
+
const REGISTRY = Symbol.for('ultramodern.federation.browser-dev-routing.v1');
|
|
41
|
+
function registry() {
|
|
42
|
+
const root = globalThis;
|
|
43
|
+
if (!root[REGISTRY]) Object.defineProperty(root, REGISTRY, {
|
|
44
|
+
value: {
|
|
45
|
+
sources: new WeakMap(),
|
|
46
|
+
bindings: new Set()
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return root[REGISTRY];
|
|
50
|
+
}
|
|
51
|
+
function firstReference(binding) {
|
|
52
|
+
const reference = binding.references.values().next().value;
|
|
53
|
+
if (!reference) throw new Error('Native browser refresh has no mounted boundary owner.');
|
|
54
|
+
return reference;
|
|
55
|
+
}
|
|
56
|
+
function createNativeBrowserDevRuntimePlugin(options) {
|
|
57
|
+
return {
|
|
58
|
+
name: 'ultramodern-native-browser-dev-refresh',
|
|
59
|
+
beforeInit (args) {
|
|
60
|
+
const host = args.origin;
|
|
61
|
+
if (Object.hasOwn(host, NATIVE_BROWSER_DEV_BOUNDARY)) return args;
|
|
62
|
+
Object.defineProperty(host, NATIVE_BROWSER_DEV_BOUNDARY, {
|
|
63
|
+
value (id, source, boundary) {
|
|
64
|
+
const remote = options.remotes.find((remote)=>id.startsWith(`${remote.alias}/`));
|
|
65
|
+
if (!remote) throw new Error(`Native browser refresh has no registered remote for ${id}.`);
|
|
66
|
+
const state = registry();
|
|
67
|
+
let sources = state.sources.get(source);
|
|
68
|
+
if (!sources) state.sources.set(source, sources = new Map());
|
|
69
|
+
let binding = sources.get(id);
|
|
70
|
+
if (binding && binding.remoteName !== remote.name) throw new Error('Native browser refresh source has conflicting remote ownership.');
|
|
71
|
+
if (!binding) {
|
|
72
|
+
const references = new Set();
|
|
73
|
+
const current = ()=>firstReference(created);
|
|
74
|
+
const created = {
|
|
75
|
+
id,
|
|
76
|
+
remoteName: remote.name,
|
|
77
|
+
references,
|
|
78
|
+
coordinator: (0, external_native_browser_dev_refresh_js_namespaceObject.createNativeBrowserDevRefresh)({
|
|
79
|
+
get host () {
|
|
80
|
+
return current().host;
|
|
81
|
+
},
|
|
82
|
+
id,
|
|
83
|
+
boundary: references,
|
|
84
|
+
prepareReplacement () {
|
|
85
|
+
const reference = current();
|
|
86
|
+
return reference.prepare(reference.boundary);
|
|
87
|
+
},
|
|
88
|
+
createHost: options.createHost
|
|
89
|
+
})
|
|
90
|
+
};
|
|
91
|
+
binding = created;
|
|
92
|
+
sources.set(id, binding);
|
|
93
|
+
state.bindings.add(binding);
|
|
94
|
+
}
|
|
95
|
+
const reference = {
|
|
96
|
+
host,
|
|
97
|
+
remote,
|
|
98
|
+
boundary,
|
|
99
|
+
prepare: options.prepareReplacement
|
|
100
|
+
};
|
|
101
|
+
binding.references.add(reference);
|
|
102
|
+
const owned = binding;
|
|
103
|
+
let released = false;
|
|
104
|
+
return ()=>{
|
|
105
|
+
if (released) return;
|
|
106
|
+
released = true;
|
|
107
|
+
owned.references.delete(reference);
|
|
108
|
+
if (owned.references.size) return;
|
|
109
|
+
sources.delete(id);
|
|
110
|
+
state.bindings.delete(owned);
|
|
111
|
+
owned.coordinator.dispose();
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
return args;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async function replaceNativeBrowserDevRemote(graph) {
|
|
120
|
+
const bindings = [
|
|
121
|
+
...registry().bindings
|
|
122
|
+
].filter((binding)=>binding.remoteName === graph.remote.name);
|
|
123
|
+
if (!bindings.length) throw new Error('Native browser refresh has no mounted publisher for this remote.');
|
|
124
|
+
let committed = 0;
|
|
125
|
+
try {
|
|
126
|
+
for (const binding of bindings){
|
|
127
|
+
await binding.coordinator.replace(graph);
|
|
128
|
+
committed++;
|
|
129
|
+
}
|
|
130
|
+
} catch (error) {
|
|
131
|
+
if (committed && !(0, external_native_browser_dev_refresh_js_namespaceObject.isNativeBrowserDevCommitError)(error, graph.revision)) throw (0, external_native_browser_dev_refresh_js_namespaceObject.nativeBrowserDevCommitFailure)(graph.revision, error);
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
return bindings.length;
|
|
135
|
+
}
|
|
136
|
+
const record = (value)=>null !== value && 'object' == typeof value && !Array.isArray(value);
|
|
137
|
+
async function readNativeBrowserDevPublication(remoteName, options) {
|
|
138
|
+
const binding = [
|
|
139
|
+
...registry().bindings
|
|
140
|
+
].find((binding)=>binding.remoteName === remoteName);
|
|
141
|
+
if (!binding) throw new Error('Native browser refresh has no mounted publisher for discovery.');
|
|
142
|
+
const reference = firstReference(binding);
|
|
143
|
+
const remote = reference.remote;
|
|
144
|
+
const host = reference.host;
|
|
145
|
+
const init = {
|
|
146
|
+
cache: 'no-store',
|
|
147
|
+
signal: options.signal
|
|
148
|
+
};
|
|
149
|
+
const context = {
|
|
150
|
+
initiator: 'loadRemote',
|
|
151
|
+
id: binding.id,
|
|
152
|
+
resourceType: 'manifest',
|
|
153
|
+
url: remote.entry
|
|
154
|
+
};
|
|
155
|
+
const hook = host.loaderHook?.lifecycle.fetch;
|
|
156
|
+
const request = (async ()=>{
|
|
157
|
+
const hooked = await hook?.emit(remote.entry, init, remote, context);
|
|
158
|
+
const response = hooked instanceof Response ? hooked : await globalThis.fetch(remote.entry, init);
|
|
159
|
+
if (options.signal.aborted) {
|
|
160
|
+
response.body?.cancel().catch(()=>{});
|
|
161
|
+
throw options.signal.reason;
|
|
162
|
+
}
|
|
163
|
+
if (!response.ok) {
|
|
164
|
+
response.body?.cancel().catch(()=>{});
|
|
165
|
+
throw new Error(`Native browser manifest discovery failed: ${response.status}`);
|
|
166
|
+
}
|
|
167
|
+
const manifest = await response.json();
|
|
168
|
+
const revision = response.headers.get(options.revisionHeader);
|
|
169
|
+
const links = [
|
|
170
|
+
...(response.headers.get('link') ?? '').matchAll(/<([^>]+)>\s*;([^,]*)/gu)
|
|
171
|
+
].filter(([, , parameters])=>/\brel\s*=\s*"?ultramodern-completed-graph"?(?:\s|;|$)/u.test(parameters));
|
|
172
|
+
if (!revision || !/^[a-f0-9]{64}$/u.test(revision) || 1 !== links.length) throw new Error('Native browser manifest has no unique completed graph coordinate.');
|
|
173
|
+
const entry = new URL(links[0][1], remote.entry);
|
|
174
|
+
if (![
|
|
175
|
+
'http:',
|
|
176
|
+
'https:'
|
|
177
|
+
].includes(entry.protocol) || entry.username || entry.password || entry.hash) throw new Error('Native browser completed graph URL is invalid.');
|
|
178
|
+
const namespace = /\/__ultramodern_mf__\/([a-f0-9]+)\//u.exec(entry.pathname);
|
|
179
|
+
if (!namespace) throw new Error('Native browser graph is not in the immutable runtime namespace.');
|
|
180
|
+
const metadata = record(manifest) && record(manifest.metaData) ? manifest.metaData.ultramodernRenderer : void 0;
|
|
181
|
+
const contract = (0, external_renderer_contract_js_namespaceObject.readRendererFederationContract)(metadata);
|
|
182
|
+
const buildIds = new Set(Object.values(contract.identities).map((identity)=>identity.buildId));
|
|
183
|
+
if (1 !== buildIds.size) throw new Error('Native browser graph has conflicting renderer build identities.');
|
|
184
|
+
return {
|
|
185
|
+
revision,
|
|
186
|
+
runtimeHash: namespace[1],
|
|
187
|
+
buildId: [
|
|
188
|
+
...buildIds
|
|
189
|
+
][0],
|
|
190
|
+
remote: {
|
|
191
|
+
...remote,
|
|
192
|
+
entry: entry.href
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
})();
|
|
196
|
+
let removeAbort;
|
|
197
|
+
const aborted = new Promise((_resolve, reject)=>{
|
|
198
|
+
const abort = ()=>reject(options.signal.reason);
|
|
199
|
+
removeAbort = ()=>options.signal.removeEventListener('abort', abort);
|
|
200
|
+
if (options.signal.aborted) abort();
|
|
201
|
+
else options.signal.addEventListener('abort', abort, {
|
|
202
|
+
once: true
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
try {
|
|
206
|
+
return await Promise.race([
|
|
207
|
+
request,
|
|
208
|
+
aborted
|
|
209
|
+
]);
|
|
210
|
+
} finally{
|
|
211
|
+
removeAbort();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function hasNativeBrowserDevPublisher(remoteName) {
|
|
215
|
+
return [
|
|
216
|
+
...registry().bindings
|
|
217
|
+
].some((binding)=>binding.remoteName === remoteName);
|
|
218
|
+
}
|
|
219
|
+
exports.NATIVE_BROWSER_DEV_BOUNDARY = __webpack_exports__.NATIVE_BROWSER_DEV_BOUNDARY;
|
|
220
|
+
exports.createNativeBrowserDevRuntimePlugin = __webpack_exports__.createNativeBrowserDevRuntimePlugin;
|
|
221
|
+
exports.hasNativeBrowserDevPublisher = __webpack_exports__.hasNativeBrowserDevPublisher;
|
|
222
|
+
exports.readNativeBrowserDevPublication = __webpack_exports__.readNativeBrowserDevPublication;
|
|
223
|
+
exports.replaceNativeBrowserDevRemote = __webpack_exports__.replaceNativeBrowserDevRemote;
|
|
224
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
225
|
+
"NATIVE_BROWSER_DEV_BOUNDARY",
|
|
226
|
+
"createNativeBrowserDevRuntimePlugin",
|
|
227
|
+
"hasNativeBrowserDevPublisher",
|
|
228
|
+
"readNativeBrowserDevPublication",
|
|
229
|
+
"replaceNativeBrowserDevRemote"
|
|
230
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
231
|
+
Object.defineProperty(exports, '__esModule', {
|
|
232
|
+
value: true
|
|
233
|
+
});
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, getters, values)=>{
|
|
5
|
+
var define = (defs, kind)=>{
|
|
6
|
+
for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
[kind]: defs[key]
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
define(getters, "get");
|
|
12
|
+
define(values, "value");
|
|
13
|
+
};
|
|
14
|
+
})();
|
|
15
|
+
(()=>{
|
|
16
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
17
|
+
})();
|
|
18
|
+
(()=>{
|
|
19
|
+
__webpack_require__.r = (exports1)=>{
|
|
20
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
21
|
+
value: 'Module'
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
24
|
+
value: true
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
})();
|
|
28
|
+
var __webpack_exports__ = {};
|
|
29
|
+
__webpack_require__.r(__webpack_exports__);
|
|
30
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
+
default: ()=>nativeDevRefreshRuntimePlugin
|
|
32
|
+
});
|
|
33
|
+
const external_node_async_hooks_namespaceObject = require("node:async_hooks");
|
|
34
|
+
const LOAD_WITH_CAPTURE = Symbol.for('ultramodern.federation.load-with-capture');
|
|
35
|
+
function nativeDevRefreshRuntimePlugin(options) {
|
|
36
|
+
if (!options.revisionHeader || !Number.isSafeInteger(options.requestTimeout) || options.requestTimeout <= 0) throw new TypeError('Native federation dev refresh requires a bounded revision probe.');
|
|
37
|
+
const hosts = new WeakMap();
|
|
38
|
+
const calls = new external_node_async_hooks_namespaceObject.AsyncLocalStorage();
|
|
39
|
+
const probe = (host, lane, expose)=>{
|
|
40
|
+
if (lane.probe) return lane.probe;
|
|
41
|
+
const info = lane.info;
|
|
42
|
+
if (!info) throw new Error('Native federation dev remote has no admitted entry.');
|
|
43
|
+
const pending = (async ()=>{
|
|
44
|
+
const init = {
|
|
45
|
+
method: 'HEAD',
|
|
46
|
+
cache: 'no-store',
|
|
47
|
+
signal: AbortSignal.timeout(options.requestTimeout)
|
|
48
|
+
};
|
|
49
|
+
let clearDeadline;
|
|
50
|
+
const signal = init.signal;
|
|
51
|
+
const deadline = new Promise((_resolve, reject)=>{
|
|
52
|
+
const abort = ()=>reject(signal.reason);
|
|
53
|
+
signal.addEventListener('abort', abort, {
|
|
54
|
+
once: true
|
|
55
|
+
});
|
|
56
|
+
clearDeadline = ()=>signal.removeEventListener('abort', abort);
|
|
57
|
+
});
|
|
58
|
+
const request = (async ()=>{
|
|
59
|
+
const hooked = await host.loaderHook.lifecycle.fetch.emit(info.entry, init, info, {
|
|
60
|
+
initiator: 'loadRemote',
|
|
61
|
+
id: expose && '.' !== expose ? `${info.name}/${expose.replace(/^\.\//u, '')}` : info.name,
|
|
62
|
+
resourceType: 'remoteEntry',
|
|
63
|
+
url: info.entry,
|
|
64
|
+
expose
|
|
65
|
+
});
|
|
66
|
+
const response = hooked instanceof Response ? hooked : await globalThis.fetch(info.entry, init);
|
|
67
|
+
if (signal.aborted) {
|
|
68
|
+
response.body?.cancel().catch(()=>{});
|
|
69
|
+
throw signal.reason;
|
|
70
|
+
}
|
|
71
|
+
return response;
|
|
72
|
+
})();
|
|
73
|
+
let response;
|
|
74
|
+
try {
|
|
75
|
+
response = await Promise.race([
|
|
76
|
+
request,
|
|
77
|
+
deadline
|
|
78
|
+
]);
|
|
79
|
+
} finally{
|
|
80
|
+
clearDeadline();
|
|
81
|
+
}
|
|
82
|
+
response.body?.cancel().catch(()=>{});
|
|
83
|
+
if (!response.ok) throw Object.assign(new Error(`Native federation dev revision request failed: ${response.status} ${info.entry}`), {
|
|
84
|
+
status: response.status
|
|
85
|
+
});
|
|
86
|
+
const revision = response.headers.get(options.revisionHeader);
|
|
87
|
+
if (null !== revision && !/^[a-f0-9]{64}$/u.test(revision)) throw new Error('Native federation dev remote returned an invalid graph revision.');
|
|
88
|
+
if (null === revision && 'string' == typeof lane.revision) throw new Error('Native federation dev remote lost its completed graph revision.');
|
|
89
|
+
return revision;
|
|
90
|
+
})();
|
|
91
|
+
lane.probe = pending;
|
|
92
|
+
const clear = ()=>{
|
|
93
|
+
if (lane.probe === pending) lane.probe = void 0;
|
|
94
|
+
};
|
|
95
|
+
pending.then(clear, clear);
|
|
96
|
+
return pending;
|
|
97
|
+
};
|
|
98
|
+
return {
|
|
99
|
+
name: 'ultramodern-native-federation-dev-refresh',
|
|
100
|
+
beforeInit (args) {
|
|
101
|
+
const host = args.origin;
|
|
102
|
+
if (hosts.has(host)) return args;
|
|
103
|
+
const lanes = new Map(options.remotes.map((remote)=>[
|
|
104
|
+
remote.name,
|
|
105
|
+
{
|
|
106
|
+
remote: {
|
|
107
|
+
...remote
|
|
108
|
+
},
|
|
109
|
+
active: new Set()
|
|
110
|
+
}
|
|
111
|
+
]));
|
|
112
|
+
hosts.set(host, lanes);
|
|
113
|
+
const load = host.loadRemote.bind(host);
|
|
114
|
+
const loadWithCapture = async (id, loadOptions, capture)=>{
|
|
115
|
+
const parent = calls.getStore();
|
|
116
|
+
const lease = {
|
|
117
|
+
host,
|
|
118
|
+
...parent?.host === host ? {
|
|
119
|
+
parent
|
|
120
|
+
} : {}
|
|
121
|
+
};
|
|
122
|
+
return calls.run(lease, async ()=>{
|
|
123
|
+
let success = false;
|
|
124
|
+
try {
|
|
125
|
+
const module = await load(id, loadOptions);
|
|
126
|
+
const captured = capture?.(module, lease.resolution);
|
|
127
|
+
success = null !== module && true === lease.admitted;
|
|
128
|
+
return {
|
|
129
|
+
module,
|
|
130
|
+
captured
|
|
131
|
+
};
|
|
132
|
+
} finally{
|
|
133
|
+
lease.active = false;
|
|
134
|
+
lease.release?.(success);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
host.loadRemote = async (id, loadOptions)=>(await loadWithCapture(id, loadOptions)).module;
|
|
139
|
+
host[LOAD_WITH_CAPTURE] = (id, capture)=>loadWithCapture(id, void 0, capture);
|
|
140
|
+
return args;
|
|
141
|
+
},
|
|
142
|
+
async beforeRequest (args) {
|
|
143
|
+
const lease = calls.getStore();
|
|
144
|
+
if (!lease || lease.host !== args.origin) return args;
|
|
145
|
+
const lane = [
|
|
146
|
+
...hosts.get(args.origin)?.values() ?? []
|
|
147
|
+
].find(({ remote })=>[
|
|
148
|
+
remote.alias,
|
|
149
|
+
remote.name
|
|
150
|
+
].some((name)=>args.id === name || args.id.startsWith(`${name}/`)));
|
|
151
|
+
if (!lane || lease.lane) return args;
|
|
152
|
+
lease.lane = lane;
|
|
153
|
+
const prefix = [
|
|
154
|
+
lane.remote.alias,
|
|
155
|
+
lane.remote.name
|
|
156
|
+
].find((name)=>args.id === name || args.id.startsWith(`${name}/`));
|
|
157
|
+
const expose = args.id === prefix ? '.' : `./${args.id.slice(prefix.length + 1)}`;
|
|
158
|
+
for(let ancestor = lease.parent; ancestor; ancestor = ancestor.parent)if (ancestor.lane === lane && ancestor.active) {
|
|
159
|
+
let release;
|
|
160
|
+
const finished = new Promise((resolve)=>{
|
|
161
|
+
release = resolve;
|
|
162
|
+
});
|
|
163
|
+
lane.active.add(finished);
|
|
164
|
+
lease.active = true;
|
|
165
|
+
lease.snapshot = ancestor.snapshot;
|
|
166
|
+
lease.release = ()=>{
|
|
167
|
+
lane.active.delete(finished);
|
|
168
|
+
release();
|
|
169
|
+
};
|
|
170
|
+
return args;
|
|
171
|
+
}
|
|
172
|
+
for(;;){
|
|
173
|
+
if (lane.transition) {
|
|
174
|
+
await lane.transition;
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const revision = void 0 === lane.revision ? void 0 : null === lane.revision ? null : await probe(args.origin, lane, expose);
|
|
178
|
+
if (lane.transition) {
|
|
179
|
+
await lane.transition;
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
let finish;
|
|
183
|
+
const finished = new Promise((resolve)=>{
|
|
184
|
+
finish = resolve;
|
|
185
|
+
});
|
|
186
|
+
if (void 0 === lane.revision || revision !== lane.revision) {
|
|
187
|
+
lane.transition = finished;
|
|
188
|
+
lease.release = (success)=>{
|
|
189
|
+
if (success) lane.revision = lane.candidate ?? null;
|
|
190
|
+
if (lane.transition === finished) lane.transition = void 0;
|
|
191
|
+
finish();
|
|
192
|
+
};
|
|
193
|
+
while(lane.active.size)await Promise.allSettled([
|
|
194
|
+
...lane.active
|
|
195
|
+
]);
|
|
196
|
+
lane.candidate = revision;
|
|
197
|
+
if (void 0 !== lane.revision) {
|
|
198
|
+
lease.active = true;
|
|
199
|
+
lease.snapshot = lane.snapshot;
|
|
200
|
+
const retained = new Set();
|
|
201
|
+
for (const scope of Object.values(args.origin.shareScopeMap ?? {}))for (const [pkgName, versions] of Object.entries(scope))if (options.shared?.some((key)=>key === pkgName || key.endsWith('/') && pkgName.startsWith(key)) && Object.values(versions).some((shared)=>shared.loaded || shared.loading || shared.lib)) retained.add(pkgName);
|
|
202
|
+
for (const pkgName of retained){
|
|
203
|
+
if (!args.origin.loadShare) throw new TypeError('Native federation dev refresh requires the host share lifecycle.');
|
|
204
|
+
await args.origin.loadShare(pkgName);
|
|
205
|
+
}
|
|
206
|
+
while(lane.active.size)await Promise.allSettled([
|
|
207
|
+
...lane.active
|
|
208
|
+
]);
|
|
209
|
+
args.origin.registerRemotes([
|
|
210
|
+
{
|
|
211
|
+
...lane.remote
|
|
212
|
+
}
|
|
213
|
+
], {
|
|
214
|
+
force: true
|
|
215
|
+
});
|
|
216
|
+
lease.snapshot = void 0;
|
|
217
|
+
}
|
|
218
|
+
} else {
|
|
219
|
+
lane.active.add(finished);
|
|
220
|
+
lease.release = ()=>{
|
|
221
|
+
lane.active.delete(finished);
|
|
222
|
+
finish();
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
lease.active = true;
|
|
226
|
+
return args;
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
loadSnapshot (args) {
|
|
230
|
+
const lease = calls.getStore();
|
|
231
|
+
if (!lease || args.options !== lease.host.options || args.moduleInfo.name !== lease.lane?.remote.name) return args;
|
|
232
|
+
if (void 0 !== lease.snapshot) return {
|
|
233
|
+
...args,
|
|
234
|
+
remoteSnapshot: lease.snapshot
|
|
235
|
+
};
|
|
236
|
+
lease.snapshot = args.remoteSnapshot;
|
|
237
|
+
return args;
|
|
238
|
+
},
|
|
239
|
+
afterLoadSnapshot (args) {
|
|
240
|
+
const lease = calls.getStore();
|
|
241
|
+
if (lease?.host === args.host && args.moduleInfo.name === lease.lane?.remote.name) lease.snapshot = args.remoteSnapshot;
|
|
242
|
+
return args;
|
|
243
|
+
},
|
|
244
|
+
async afterResolve (args) {
|
|
245
|
+
const lane = hosts.get(args.origin)?.get(args.remote.name);
|
|
246
|
+
const lease = calls.getStore();
|
|
247
|
+
if (!lane || lease?.host !== args.origin || lease.lane !== lane || !lease.active) return args;
|
|
248
|
+
if (lane.info?.entry !== args.remoteInfo.entry) lane.candidate = void 0;
|
|
249
|
+
lane.info = args.remoteInfo;
|
|
250
|
+
if (void 0 === lane.candidate) lane.candidate = await probe(args.origin, lane, args.expose);
|
|
251
|
+
lease.admitted = true;
|
|
252
|
+
lane.snapshot = args.remoteSnapshot;
|
|
253
|
+
lease.resolution = {
|
|
254
|
+
remoteSnapshot: args.remoteSnapshot,
|
|
255
|
+
expose: args.expose
|
|
256
|
+
};
|
|
257
|
+
return args;
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
exports["default"] = __webpack_exports__["default"];
|
|
262
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
263
|
+
"default"
|
|
264
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
265
|
+
Object.defineProperty(exports, '__esModule', {
|
|
266
|
+
value: true
|
|
267
|
+
});
|
|
@@ -143,6 +143,9 @@ function createRendererFederationRuntimePlugin(options) {
|
|
|
143
143
|
const observedEntries = new WeakMap();
|
|
144
144
|
const acceptedEntries = new Set();
|
|
145
145
|
const versions = rendererShareVersions(expected);
|
|
146
|
+
const sharedVersion = (name)=>versions.get(name) ?? ('react' === expected.profile.renderer ? void 0 : [
|
|
147
|
+
...versions
|
|
148
|
+
].find(([owner])=>name.startsWith(`${owner}/`))?.[1]);
|
|
146
149
|
return {
|
|
147
150
|
name: 'ultramodern-renderer-federation-contract',
|
|
148
151
|
beforeRegisterRemote (args) {
|
|
@@ -216,7 +219,7 @@ function createRendererFederationRuntimePlugin(options) {
|
|
|
216
219
|
return args;
|
|
217
220
|
},
|
|
218
221
|
resolveShare (args) {
|
|
219
|
-
const version =
|
|
222
|
+
const version = sharedVersion(args.pkgName);
|
|
220
223
|
if (void 0 === version) return args;
|
|
221
224
|
const resolve = args.resolver;
|
|
222
225
|
return {
|
|
@@ -241,7 +244,7 @@ function createRendererFederationRuntimePlugin(options) {
|
|
|
241
244
|
};
|
|
242
245
|
},
|
|
243
246
|
afterLoadShare (args) {
|
|
244
|
-
if (
|
|
247
|
+
if (void 0 !== sharedVersion(args.pkgName) && args.selectedShared) {
|
|
245
248
|
const shared = record(args.selectedShared.treeShaking) && args.selectedShared.treeShaking.loaded ? args.selectedShared.treeShaking : args.selectedShared;
|
|
246
249
|
selected.set(args.pkgName, Object.freeze({
|
|
247
250
|
lib: shared.lib,
|