@bleedingdev/mf-manifest 2.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.
@@ -0,0 +1,514 @@
1
+ "use strict";
2
+ const __rslib_import_meta_url__ = /*#__PURE__*/ (function () {
3
+ return typeof document === 'undefined'
4
+ ? new (require('url'.replace('', '')).URL)('file:' + __filename).href
5
+ : (document.currentScript && document.currentScript.src) ||
6
+ new URL('main.js', document.baseURI).href;
7
+ })();
8
+ ;
9
+ // The require scope
10
+ var __webpack_require__ = {};
11
+
12
+ // webpack/runtime/compat_get_default_export
13
+ (() => {
14
+ // getDefaultExport function for compatibility with non-ESM modules
15
+ __webpack_require__.n = (module) => {
16
+ var getter = module && module.__esModule ?
17
+ () => (module['default']) :
18
+ () => (module);
19
+ __webpack_require__.d(getter, { a: getter });
20
+ return getter;
21
+ };
22
+
23
+ })();
24
+ // webpack/runtime/define_property_getters
25
+ (() => {
26
+ __webpack_require__.d = (exports, getters, values) => {
27
+ var define = (defs, kind) => {
28
+ for(var key in defs) {
29
+ if(__webpack_require__.o(defs, key) && !__webpack_require__.o(exports, key)) {
30
+ Object.defineProperty(exports, key, { enumerable: true, [kind]: defs[key] });
31
+ }
32
+ }
33
+ };
34
+ define(getters, "get");
35
+ define(values, "value");
36
+ };
37
+ })();
38
+ // webpack/runtime/has_own_property
39
+ (() => {
40
+ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
41
+ })();
42
+ // webpack/runtime/make_namespace_object
43
+ (() => {
44
+ // define __esModule on exports
45
+ __webpack_require__.r = (exports) => {
46
+ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
47
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
48
+ }
49
+ Object.defineProperty(exports, '__esModule', { value: true });
50
+ };
51
+ })();
52
+ var __webpack_exports__ = {};
53
+ // ESM COMPAT FLAG
54
+ __webpack_require__.r(__webpack_exports__);
55
+
56
+ // EXPORTS
57
+ __webpack_require__.d(__webpack_exports__, {
58
+ ModuleHandler: () => (/* binding */ ModuleHandler),
59
+ getExposeItem: () => (/* binding */ getExposeItem),
60
+ getExposeName: () => (/* binding */ getExposeName),
61
+ getShareItem: () => (/* binding */ getShareItem)
62
+ });
63
+
64
+ ;// CONCATENATED MODULE: external "@module-federation/sdk"
65
+ const sdk_namespaceObject = require("@module-federation/sdk");
66
+ ;// CONCATENATED MODULE: external "path"
67
+ const external_path_namespaceObject = require("path");
68
+ var external_path_default = /*#__PURE__*/__webpack_require__.n(external_path_namespaceObject);
69
+ ;// CONCATENATED MODULE: external "@module-federation/managers"
70
+ const managers_namespaceObject = require("@module-federation/managers");
71
+ ;// CONCATENATED MODULE: external "./utils.js"
72
+ const external_utils_js_namespaceObject = require("./utils.js");
73
+ ;// CONCATENATED MODULE: ./src/ModuleHandler.ts
74
+
75
+
76
+
77
+
78
+ const REMOTE_REFERENCE_PREFIX = /^(?:webpack|rspack)\/container\/reference\//;
79
+ const isNonEmptyString = (value)=>{
80
+ return typeof value === 'string' && value.trim().length > 0;
81
+ };
82
+ const normalizeExposeValue = (exposeValue)=>{
83
+ if (!exposeValue) {
84
+ return undefined;
85
+ }
86
+ const toImportArray = (value)=>{
87
+ if (isNonEmptyString(value)) {
88
+ return [
89
+ value
90
+ ];
91
+ }
92
+ if (Array.isArray(value)) {
93
+ const normalized = value.filter(isNonEmptyString);
94
+ return normalized.length ? normalized : undefined;
95
+ }
96
+ return undefined;
97
+ };
98
+ if (typeof exposeValue === 'object') {
99
+ if ('import' in exposeValue) {
100
+ const { import: rawImport, name } = exposeValue;
101
+ const normalizedImport = toImportArray(rawImport);
102
+ if (!normalizedImport?.length) {
103
+ return undefined;
104
+ }
105
+ return {
106
+ import: normalizedImport,
107
+ ...isNonEmptyString(name) ? {
108
+ name
109
+ } : {}
110
+ };
111
+ }
112
+ return undefined;
113
+ }
114
+ const normalizedImport = toImportArray(exposeValue);
115
+ if (!normalizedImport?.length) {
116
+ return undefined;
117
+ }
118
+ return {
119
+ import: normalizedImport
120
+ };
121
+ };
122
+ const parseContainerExposeEntries = (identifier)=>{
123
+ const startIndex = identifier.indexOf('[');
124
+ if (startIndex < 0) {
125
+ return undefined;
126
+ }
127
+ let depth = 0;
128
+ let inString = false;
129
+ let isEscaped = false;
130
+ for(let cursor = startIndex; cursor < identifier.length; cursor++){
131
+ const char = identifier[cursor];
132
+ if (isEscaped) {
133
+ isEscaped = false;
134
+ continue;
135
+ }
136
+ if (char === '\\') {
137
+ isEscaped = true;
138
+ continue;
139
+ }
140
+ if (char === '"') {
141
+ inString = !inString;
142
+ continue;
143
+ }
144
+ if (inString) {
145
+ continue;
146
+ }
147
+ if (char === '[') {
148
+ depth++;
149
+ } else if (char === ']') {
150
+ depth--;
151
+ if (depth === 0) {
152
+ const serialized = identifier.slice(startIndex, cursor + 1);
153
+ try {
154
+ return JSON.parse(serialized);
155
+ } catch {
156
+ return undefined;
157
+ }
158
+ }
159
+ }
160
+ }
161
+ return undefined;
162
+ };
163
+ const getExposeName = (exposeKey)=>{
164
+ return exposeKey.replace('./', '');
165
+ };
166
+ function getExposeItem({ exposeKey, name, file }) {
167
+ const exposeModuleName = getExposeName(exposeKey);
168
+ return {
169
+ path: exposeKey,
170
+ id: (0,sdk_namespaceObject.composeKeyWithSeparator)(name, exposeModuleName),
171
+ name: exposeModuleName,
172
+ // @ts-ignore to deduplicate
173
+ requires: [],
174
+ file: external_path_default().relative(process.cwd(), file.import[0]),
175
+ assets: {
176
+ js: {
177
+ async: [],
178
+ sync: []
179
+ },
180
+ css: {
181
+ async: [],
182
+ sync: []
183
+ }
184
+ }
185
+ };
186
+ }
187
+ const getShareItem = ({ pkgName, normalizedShareOptions, pkgVersion, hostName })=>{
188
+ return {
189
+ ...normalizedShareOptions,
190
+ id: `${hostName}:${pkgName}`,
191
+ requiredVersion: normalizedShareOptions?.requiredVersion || `^${pkgVersion}`,
192
+ name: pkgName,
193
+ version: pkgVersion,
194
+ assets: {
195
+ js: {
196
+ async: [],
197
+ sync: []
198
+ },
199
+ css: {
200
+ async: [],
201
+ sync: []
202
+ }
203
+ },
204
+ // @ts-ignore to deduplicate
205
+ usedIn: new Set(),
206
+ usedExports: [],
207
+ fallback: ''
208
+ };
209
+ };
210
+ class ModuleHandler {
211
+ get isRspack() {
212
+ return this._bundler === 'rspack';
213
+ }
214
+ _handleSharedModule(mod, sharedMap, exposesMap) {
215
+ const { identifier, moduleType } = mod;
216
+ if (!identifier) {
217
+ return;
218
+ }
219
+ const sharedManagerNormalizedOptions = this._sharedManager.normalizedOptions;
220
+ const initShared = (pkgName, pkgVersion)=>{
221
+ if (sharedMap[pkgName]) {
222
+ return;
223
+ }
224
+ sharedMap[pkgName] = getShareItem({
225
+ pkgName,
226
+ pkgVersion,
227
+ normalizedShareOptions: sharedManagerNormalizedOptions[pkgName],
228
+ hostName: this._options.name
229
+ });
230
+ };
231
+ const collectRelationshipMap = (mod, pkgName)=>{
232
+ const { issuerName, reasons } = mod;
233
+ if (issuerName) {
234
+ if (exposesMap[(0,external_utils_js_namespaceObject.getFileNameWithOutExt)(issuerName)]) {
235
+ const expose = exposesMap[(0,external_utils_js_namespaceObject.getFileNameWithOutExt)(issuerName)];
236
+ // @ts-ignore use Set to deduplicate
237
+ expose.requires.push(pkgName);
238
+ // @ts-ignore use Set to deduplicate
239
+ sharedMap[pkgName].usedIn.add(expose.path);
240
+ }
241
+ }
242
+ if (reasons) {
243
+ reasons.forEach(({ resolvedModule, moduleName })=>{
244
+ let exposeModName = this.isRspack ? moduleName : resolvedModule;
245
+ // filters out entrypoints
246
+ if (exposeModName) {
247
+ if (exposesMap[(0,external_utils_js_namespaceObject.getFileNameWithOutExt)(exposeModName)]) {
248
+ const expose = exposesMap[(0,external_utils_js_namespaceObject.getFileNameWithOutExt)(exposeModName)];
249
+ // @ts-ignore to deduplicate
250
+ expose.requires.push(pkgName);
251
+ // @ts-ignore to deduplicate
252
+ sharedMap[pkgName].usedIn.add(expose.path);
253
+ }
254
+ }
255
+ });
256
+ }
257
+ };
258
+ const parseResolvedIdentifier = (nameAndVersion)=>{
259
+ let name = '';
260
+ let version = '';
261
+ if (nameAndVersion.startsWith('@')) {
262
+ const splitInfo = nameAndVersion.split('@');
263
+ splitInfo[0] = '@';
264
+ name = splitInfo[0] + splitInfo[1];
265
+ version = splitInfo[2];
266
+ } else if (nameAndVersion.includes('@')) {
267
+ [name, version] = nameAndVersion.split('@');
268
+ version = version.replace(/[\^~>|>=]/g, '');
269
+ }
270
+ return {
271
+ name,
272
+ version
273
+ };
274
+ };
275
+ if (moduleType === 'provide-module') {
276
+ // identifier(rspack) = provide shared module (default) react@18.2.0 = /temp/node_modules/.pnpm/react@18.2.0/node_modules/react/index.js
277
+ // identifier(webpack) = provide module (default) react@18.2.0 = /temp/node_modules/.pnpm/react@18.2.0/node_modules/react/index.js
278
+ const data = identifier.split(' ');
279
+ const nameAndVersion = this.isRspack ? data[4] : data[3];
280
+ const { name, version } = parseResolvedIdentifier(nameAndVersion);
281
+ if (name && version) {
282
+ initShared(name, version);
283
+ collectRelationshipMap(mod, name);
284
+ }
285
+ }
286
+ if (moduleType === 'consume-shared-module') {
287
+ // identifier(rspack) = consume shared module (default) lodash/get@^4.17.21 (strict) (fallback: /temp/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/get.js)
288
+ // identifier(webpack) = consume-shared-module|default|react-dom|!=1.8...2...0|false|/temp/node_modules/.pnpm/react-dom@18.2.0_react@18.2.0/node_modules/react-dom/index.js|true|false
289
+ const SEPARATOR = this.isRspack ? ' ' : '|';
290
+ const data = identifier.split(SEPARATOR);
291
+ let pkgName = '';
292
+ let pkgVersion = '';
293
+ if (this.isRspack) {
294
+ const nameAndVersion = data[4];
295
+ const res = parseResolvedIdentifier(nameAndVersion);
296
+ pkgName = res.name;
297
+ pkgVersion = res.version;
298
+ } else {
299
+ pkgName = data[2];
300
+ const pkgVersionRange = data[3];
301
+ pkgVersion = '';
302
+ if (pkgVersionRange.startsWith('=')) {
303
+ pkgVersion = data[3].replace('=', '');
304
+ } else {
305
+ if (sharedManagerNormalizedOptions[pkgName]) {
306
+ pkgVersion = sharedManagerNormalizedOptions[pkgName].version;
307
+ } else {
308
+ const fullPkgName = pkgName.split('/').slice(0, -1).join('/');
309
+ // pkgName: react-dom/
310
+ if (sharedManagerNormalizedOptions[`${fullPkgName}/`]) {
311
+ if (sharedManagerNormalizedOptions[fullPkgName]) {
312
+ pkgVersion = sharedManagerNormalizedOptions[fullPkgName].version;
313
+ } else {
314
+ pkgVersion = sharedManagerNormalizedOptions[`${fullPkgName}/`].version;
315
+ }
316
+ }
317
+ }
318
+ }
319
+ }
320
+ if (pkgName && pkgVersion) {
321
+ initShared(pkgName, pkgVersion);
322
+ collectRelationshipMap(mod, pkgName);
323
+ }
324
+ }
325
+ }
326
+ _handleRemoteModule(mod, remotes, remotesConsumerMap) {
327
+ const { identifier, reasons, nameForCondition } = mod;
328
+ if (!identifier) {
329
+ return;
330
+ }
331
+ const remoteManagerNormalizedOptions = this._remoteManager.normalizedOptions;
332
+ // identifier = remote (default) [webpack|rspack]/container/reference/app2 ./Button
333
+ const data = identifier.split(' ');
334
+ if (data.length === 4) {
335
+ const moduleName = data[3].replace('./', '');
336
+ const remoteAlias = data[2].replace(REMOTE_REFERENCE_PREFIX, '');
337
+ const normalizedRemote = remoteManagerNormalizedOptions[remoteAlias];
338
+ const basicRemote = {
339
+ alias: normalizedRemote.alias,
340
+ consumingFederationContainerName: this._options.name || '',
341
+ federationContainerName: remoteManagerNormalizedOptions[remoteAlias].name,
342
+ moduleName,
343
+ // @ts-ignore to deduplicate
344
+ usedIn: new Set()
345
+ };
346
+ if (!nameForCondition) {
347
+ return;
348
+ }
349
+ let remote;
350
+ if ('version' in normalizedRemote) {
351
+ remote = {
352
+ ...basicRemote,
353
+ version: normalizedRemote.version
354
+ };
355
+ } else {
356
+ remote = {
357
+ ...basicRemote,
358
+ entry: normalizedRemote.entry
359
+ };
360
+ }
361
+ remotes.push(remote);
362
+ remotesConsumerMap[nameForCondition] = remote;
363
+ }
364
+ if (reasons) {
365
+ reasons.forEach(({ userRequest, resolvedModule, moduleName })=>{
366
+ let exposeModName = this.isRspack ? moduleName : resolvedModule;
367
+ if (userRequest && exposeModName && remotesConsumerMap[userRequest]) {
368
+ // @ts-ignore to deduplicate
369
+ remotesConsumerMap[userRequest].usedIn.add(exposeModName.replace('./', ''));
370
+ }
371
+ });
372
+ }
373
+ }
374
+ _handleContainerModule(mod, exposesMap) {
375
+ const { identifier } = mod;
376
+ if (!identifier) {
377
+ return;
378
+ }
379
+ // identifier: container entry (default) [[".",{"import":["./src/routes/page.tsx"],"name":"__federation_expose_default_export"}]]'
380
+ const entries = parseContainerExposeEntries(identifier) ?? this._getContainerExposeEntriesFromOptions();
381
+ if (!entries) {
382
+ return;
383
+ }
384
+ entries.forEach(([prefixedName, file])=>{
385
+ // TODO: support multiple import
386
+ exposesMap[(0,external_utils_js_namespaceObject.getFileNameWithOutExt)(file.import[0])] = getExposeItem({
387
+ exposeKey: prefixedName,
388
+ name: this._options.name,
389
+ file
390
+ });
391
+ });
392
+ }
393
+ _getContainerExposeEntriesFromOptions() {
394
+ const exposes = this._containerManager.containerPluginExposesOptions;
395
+ const normalizedEntries = Object.entries(exposes).reduce((acc, [exposeKey, exposeOptions])=>{
396
+ const normalizedExpose = normalizeExposeValue(exposeOptions);
397
+ if (!normalizedExpose?.import.length) {
398
+ return acc;
399
+ }
400
+ acc.push([
401
+ exposeKey,
402
+ normalizedExpose
403
+ ]);
404
+ return acc;
405
+ }, []);
406
+ if (normalizedEntries.length) {
407
+ return normalizedEntries;
408
+ }
409
+ const rawExposes = this._options.exposes;
410
+ if (!rawExposes || Array.isArray(rawExposes)) {
411
+ return undefined;
412
+ }
413
+ const normalizedFromOptions = Object.entries(rawExposes).reduce((acc, [exposeKey, exposeOptions])=>{
414
+ const normalizedExpose = normalizeExposeValue(exposeOptions);
415
+ if (!normalizedExpose?.import.length) {
416
+ return acc;
417
+ }
418
+ acc.push([
419
+ exposeKey,
420
+ normalizedExpose
421
+ ]);
422
+ return acc;
423
+ }, []);
424
+ return normalizedFromOptions.length ? normalizedFromOptions : undefined;
425
+ }
426
+ _initializeExposesFromOptions(exposesMap) {
427
+ if (!this._options.name || !this._containerManager.enable) {
428
+ return;
429
+ }
430
+ const exposes = this._containerManager.containerPluginExposesOptions;
431
+ Object.entries(exposes).forEach(([exposeKey, exposeOptions])=>{
432
+ if (!exposeOptions.import?.length) {
433
+ return;
434
+ }
435
+ const [exposeImport] = exposeOptions.import;
436
+ if (!exposeImport) {
437
+ return;
438
+ }
439
+ const exposeMapKey = (0,external_utils_js_namespaceObject.getFileNameWithOutExt)(exposeImport);
440
+ if (!exposesMap[exposeMapKey]) {
441
+ exposesMap[exposeMapKey] = getExposeItem({
442
+ exposeKey,
443
+ name: this._options.name,
444
+ file: exposeOptions
445
+ });
446
+ }
447
+ });
448
+ }
449
+ collect() {
450
+ const remotes = [];
451
+ const remotesConsumerMap = {};
452
+ const exposesMap = {};
453
+ const sharedMap = {};
454
+ this._initializeExposesFromOptions(exposesMap);
455
+ const isSharedModule = (moduleType)=>{
456
+ return Boolean(moduleType && [
457
+ 'provide-module',
458
+ 'consume-shared-module'
459
+ ].includes(moduleType));
460
+ };
461
+ const isContainerModule = (identifier)=>{
462
+ return identifier.startsWith('container entry');
463
+ };
464
+ const isRemoteModule = (identifier)=>{
465
+ return identifier.startsWith('remote ');
466
+ };
467
+ // handle remote/expose
468
+ this._modules.forEach((mod)=>{
469
+ const { identifier, reasons, nameForCondition, moduleType } = mod;
470
+ if (!identifier) {
471
+ return;
472
+ }
473
+ if (isSharedModule(moduleType)) {
474
+ this._handleSharedModule(mod, sharedMap, exposesMap);
475
+ }
476
+ if (isRemoteModule(identifier)) {
477
+ this._handleRemoteModule(mod, remotes, remotesConsumerMap);
478
+ } else if (isContainerModule(identifier)) {
479
+ this._handleContainerModule(mod, exposesMap);
480
+ }
481
+ });
482
+ return {
483
+ remotes,
484
+ exposesMap,
485
+ sharedMap
486
+ };
487
+ }
488
+ constructor(options, modules, { bundler }){
489
+ this._bundler = 'webpack';
490
+ this._remoteManager = new managers_namespaceObject.RemoteManager();
491
+ this._sharedManager = new managers_namespaceObject.SharedManager();
492
+ this._options = options;
493
+ this._modules = modules;
494
+ this._bundler = bundler;
495
+ this._containerManager = new managers_namespaceObject.ContainerManager();
496
+ this._containerManager.init(options);
497
+ this._remoteManager = new managers_namespaceObject.RemoteManager();
498
+ this._remoteManager.init(options);
499
+ this._sharedManager = new managers_namespaceObject.SharedManager();
500
+ this._sharedManager.init(options);
501
+ }
502
+ }
503
+
504
+
505
+ exports.ModuleHandler = __webpack_exports__.ModuleHandler;
506
+ exports.getExposeItem = __webpack_exports__.getExposeItem;
507
+ exports.getExposeName = __webpack_exports__.getExposeName;
508
+ exports.getShareItem = __webpack_exports__.getShareItem;
509
+ for(var __rspack_i in __webpack_exports__) {
510
+ if(["ModuleHandler","getExposeItem","getExposeName","getShareItem"].indexOf(__rspack_i) === -1) {
511
+ exports[__rspack_i] = __webpack_exports__[__rspack_i];
512
+ }
513
+ }
514
+ Object.defineProperty(exports, '__esModule', { value: true });