@bleedingdev/modern-js-federation-runtime 3.9.3-ultramodern.1 → 3.9.3-ultramodern.10

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 (25) hide show
  1. package/dist/cjs/module-federation/native-browser-dev-client.js +320 -0
  2. package/dist/cjs/module-federation/native-browser-dev-refresh.js +226 -0
  3. package/dist/cjs/module-federation/native-browser-dev-runtime-plugin.js +233 -0
  4. package/dist/cjs/module-federation/native-dev-refresh-runtime-plugin.js +267 -0
  5. package/dist/cjs/module-federation/renderer-runtime-plugin.js +5 -2
  6. package/dist/esm/module-federation/native-browser-dev-client.mjs +276 -0
  7. package/dist/esm/module-federation/native-browser-dev-refresh.mjs +182 -0
  8. package/dist/esm/module-federation/native-browser-dev-runtime-plugin.mjs +183 -0
  9. package/dist/esm/module-federation/native-dev-refresh-runtime-plugin.mjs +229 -0
  10. package/dist/esm/module-federation/renderer-runtime-plugin.mjs +5 -2
  11. package/dist/esm-node/module-federation/native-browser-dev-client.mjs +277 -0
  12. package/dist/esm-node/module-federation/native-browser-dev-refresh.mjs +183 -0
  13. package/dist/esm-node/module-federation/native-browser-dev-runtime-plugin.mjs +184 -0
  14. package/dist/esm-node/module-federation/native-dev-refresh-runtime-plugin.mjs +230 -0
  15. package/dist/esm-node/module-federation/renderer-runtime-plugin.mjs +5 -2
  16. package/dist/types/module-federation/native-browser-dev-client.d.ts +41 -0
  17. package/dist/types/module-federation/native-browser-dev-refresh.d.ts +86 -0
  18. package/dist/types/module-federation/native-browser-dev-runtime-plugin.d.ts +40 -0
  19. package/dist/types/module-federation/native-dev-refresh-runtime-plugin.d.ts +90 -0
  20. package/package.json +60 -13
  21. package/src/module-federation/native-browser-dev-client.ts +424 -0
  22. package/src/module-federation/native-browser-dev-refresh.ts +373 -0
  23. package/src/module-federation/native-browser-dev-runtime-plugin.ts +276 -0
  24. package/src/module-federation/native-dev-refresh-runtime-plugin.ts +445 -0
  25. 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 = versions.get(args.pkgName);
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 (versions.has(args.pkgName) && args.selectedShared) {
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,