@esmx/core 3.0.0-rc.62 → 3.0.0-rc.64

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.
@@ -1,5 +1,10 @@
1
1
  import { assert, describe, test } from "vitest";
2
- import { buildImportsMap, buildScopesMap, getImportMap } from "./import-map.mjs";
2
+ import {
3
+ buildImportsMap,
4
+ buildScopesMap,
5
+ fixNestedScopesResolution,
6
+ getImportMap
7
+ } from "./import-map.mjs";
3
8
  describe("buildImportsMap", () => {
4
9
  test("should return empty object for empty manifests", () => {
5
10
  const result = buildImportsMap([], (name, file) => `${name}/${file}`);
@@ -9,7 +14,6 @@ describe("buildImportsMap", () => {
9
14
  const manifests = [
10
15
  {
11
16
  name: "test-module",
12
- imports: {},
13
17
  exports: {
14
18
  component: {
15
19
  name: "component",
@@ -36,65 +40,10 @@ describe("buildImportsMap", () => {
36
40
  "test-module/vue": "test-module/vue.js"
37
41
  });
38
42
  });
39
- test("should handle user imports with existing identifiers", () => {
40
- const manifests = [
41
- {
42
- name: "test-module",
43
- imports: {
44
- "custom-name": "test-module/component"
45
- },
46
- exports: {
47
- component: {
48
- name: "component",
49
- pkg: false,
50
- file: "component.js",
51
- identifier: "test-module/component"
52
- }
53
- },
54
- scopes: {}
55
- }
56
- ];
57
- const result = buildImportsMap(
58
- manifests,
59
- (name, file) => `${name}/${file}`
60
- );
61
- assert.deepEqual(result, {
62
- "test-module/component": "test-module/component.js",
63
- "test-module/custom-name": "test-module/component.js"
64
- });
65
- });
66
- test("should handle user imports with non existing identifiers", () => {
67
- const manifests = [
68
- {
69
- name: "test-module",
70
- imports: {
71
- external: "https://cdn.com/lib.js"
72
- },
73
- exports: {
74
- component: {
75
- name: "component",
76
- pkg: false,
77
- file: "component.js",
78
- identifier: "test-module/component"
79
- }
80
- },
81
- scopes: {}
82
- }
83
- ];
84
- const result = buildImportsMap(
85
- manifests,
86
- (name, file) => `${name}/${file}`
87
- );
88
- assert.deepEqual(result, {
89
- "test-module/component": "test-module/component.js",
90
- "test-module/external": "https://cdn.com/lib.js"
91
- });
92
- });
93
43
  test("should create aliases for index suffixes", () => {
94
44
  const manifests = [
95
45
  {
96
46
  name: "test-module",
97
- imports: {},
98
47
  exports: {
99
48
  "src/index": {
100
49
  name: "src/index",
@@ -119,7 +68,6 @@ describe("buildImportsMap", () => {
119
68
  const manifests = [
120
69
  {
121
70
  name: "module-a",
122
- imports: {},
123
71
  exports: {
124
72
  utils: {
125
73
  name: "utils",
@@ -132,9 +80,6 @@ describe("buildImportsMap", () => {
132
80
  },
133
81
  {
134
82
  name: "module-b",
135
- imports: {
136
- shared: "module-a/utils"
137
- },
138
83
  exports: {},
139
84
  scopes: {}
140
85
  }
@@ -144,82 +89,13 @@ describe("buildImportsMap", () => {
144
89
  (name, file) => `${name}/${file}`
145
90
  );
146
91
  assert.deepEqual(result, {
147
- "module-a/utils": "module-a/utils.js",
148
- "module-b/shared": "module-a/utils.js"
149
- });
150
- });
151
- test("should prioritize user imports", () => {
152
- const manifests = [
153
- {
154
- name: "test-module",
155
- imports: {
156
- react: "preact",
157
- vue: "./custom/vue.js"
158
- },
159
- exports: {
160
- react: {
161
- name: "react",
162
- pkg: false,
163
- file: "react.js",
164
- identifier: "test-module/react"
165
- },
166
- vue: {
167
- name: "vue",
168
- pkg: false,
169
- file: "vue.js",
170
- identifier: "test-module/vue"
171
- }
172
- },
173
- scopes: {}
174
- }
175
- ];
176
- const result = buildImportsMap(
177
- manifests,
178
- (name, file) => `${name}/${file}`
179
- );
180
- assert.deepEqual(result, {
181
- "test-module/react": "preact",
182
- "test-module/vue": "./custom/vue.js"
183
- });
184
- });
185
- test("should handle mixed user import types", () => {
186
- const manifests = [
187
- {
188
- name: "test-module",
189
- imports: {
190
- "url-import": "https://example.com/lib.js",
191
- "relative-import": "./local/file.js",
192
- "identifier-import": "test-module/component"
193
- },
194
- exports: {
195
- component: {
196
- name: "component",
197
- pkg: false,
198
- file: "component.js",
199
- identifier: "test-module/component"
200
- }
201
- },
202
- scopes: {}
203
- }
204
- ];
205
- const result = buildImportsMap(
206
- manifests,
207
- (name, file) => `${name}/${file}`
208
- );
209
- assert.deepEqual(result, {
210
- "test-module/component": "test-module/component.js",
211
- "test-module/url-import": "https://example.com/lib.js",
212
- "test-module/relative-import": "./local/file.js",
213
- "test-module/identifier-import": "test-module/component.js"
92
+ "module-a/utils": "module-a/utils.js"
214
93
  });
215
94
  });
216
95
  test("should handle empty exports", () => {
217
96
  const manifests = [
218
97
  {
219
98
  name: "test-module",
220
- imports: {
221
- external: "https://cdn.com/lib.js"
222
- },
223
99
  exports: {},
224
100
  scopes: {}
225
101
  }
@@ -228,39 +104,12 @@ describe("buildImportsMap", () => {
228
104
  manifests,
229
105
  (name, file) => `${name}/${file}`
230
106
  );
231
- assert.deepEqual(result, {
232
- "test-module/external": "https://cdn.com/lib.js"
233
- });
234
- });
235
- test("should handle empty imports", () => {
236
- const manifests = [
237
- {
238
- name: "test-module",
239
- imports: {},
240
- exports: {
241
- component: {
242
- name: "component",
243
- pkg: false,
244
- file: "component.js",
245
- identifier: "test-module/component"
246
- }
247
- },
248
- scopes: {}
249
- }
250
- ];
251
- const result = buildImportsMap(
252
- manifests,
253
- (name, file) => `${name}/${file}`
254
- );
255
- assert.deepEqual(result, {
256
- "test-module/component": "test-module/component.js"
257
- });
107
+ assert.deepEqual(result, {});
258
108
  });
259
109
  test("should handle duplicate alias creation", () => {
260
110
  const manifests = [
261
111
  {
262
112
  name: "test-module",
263
- imports: {},
264
113
  exports: {
265
114
  "src/components/index": {
266
115
  name: "src/components/index",
@@ -281,77 +130,10 @@ describe("buildImportsMap", () => {
281
130
  "test-module/src/components": "test-module/src/components/index.js"
282
131
  });
283
132
  });
284
- test("should handle cross-module references", () => {
285
- const manifests = [
286
- {
287
- name: "module-a",
288
- imports: {},
289
- exports: {
290
- utils: {
291
- name: "utils",
292
- pkg: false,
293
- file: "utils.js",
294
- identifier: "module-a/utils"
295
- }
296
- },
297
- scopes: {}
298
- },
299
- {
300
- name: "module-b",
301
- imports: {
302
- shared: "module-a/utils"
303
- },
304
- exports: {},
305
- scopes: {}
306
- }
307
- ];
308
- const result = buildImportsMap(
309
- manifests,
310
- (name, file) => `${name}/${file}`
311
- );
312
- assert.deepEqual(result, {
313
- "module-a/utils": "module-a/utils.js",
314
- "module-b/shared": "module-a/utils.js"
315
- });
316
- });
317
- test("should handle cross-module non-existent references", () => {
318
- const manifests = [
319
- {
320
- name: "module-a",
321
- imports: {},
322
- exports: {
323
- utils: {
324
- name: "utils",
325
- pkg: false,
326
- file: "utils.js",
327
- identifier: "module-a/utils"
328
- }
329
- },
330
- scopes: {}
331
- },
332
- {
333
- name: "module-b",
334
- imports: {
335
- external: "module-a/non-existent"
336
- },
337
- exports: {},
338
- scopes: {}
339
- }
340
- ];
341
- const result = buildImportsMap(
342
- manifests,
343
- (name, file) => `${name}/${file}`
344
- );
345
- assert.deepEqual(result, {
346
- "module-a/utils": "module-a/utils.js",
347
- "module-b/external": "module-a/non-existent"
348
- });
349
- });
350
133
  test("should handle identifier conflicts across modules", () => {
351
134
  const manifests = [
352
135
  {
353
136
  name: "module-a",
354
- imports: {},
355
137
  exports: {
356
138
  utils: {
357
139
  name: "utils",
@@ -364,7 +146,6 @@ describe("buildImportsMap", () => {
364
146
  },
365
147
  {
366
148
  name: "module-b",
367
- imports: {},
368
149
  exports: {
369
150
  utils: {
370
151
  name: "utils",
@@ -385,39 +166,10 @@ describe("buildImportsMap", () => {
385
166
  "module-b/utils": "module-b/utils-b.js"
386
167
  });
387
168
  });
388
- test("should handle user imports referencing aliased identifiers", () => {
389
- const manifests = [
390
- {
391
- name: "test-module",
392
- imports: {
393
- "alias-test": "test-module/src/index"
394
- },
395
- exports: {
396
- "src/index": {
397
- name: "src/index",
398
- pkg: false,
399
- file: "src/index.js",
400
- identifier: "test-module/src/index"
401
- }
402
- },
403
- scopes: {}
404
- }
405
- ];
406
- const result = buildImportsMap(
407
- manifests,
408
- (name, file) => `${name}/${file}`
409
- );
410
- assert.deepEqual(result, {
411
- "test-module/src/index": "test-module/src/index.js",
412
- "test-module/src": "test-module/src/index.js",
413
- "test-module/alias-test": "test-module/src/index.js"
414
- });
415
- });
416
169
  test("should handle nested index aliases", () => {
417
170
  const manifests = [
418
171
  {
419
172
  name: "test-module",
420
- imports: {},
421
173
  exports: {
422
174
  "src/components/utils/index": {
423
175
  name: "src/components/utils/index",
@@ -439,6 +191,577 @@ describe("buildImportsMap", () => {
439
191
  });
440
192
  });
441
193
  });
194
+ describe("fixNestedScopesResolution", () => {
195
+ test("should return unchanged import map for empty scopes", () => {
196
+ const importMap = {
197
+ imports: {
198
+ "shared-modules/vue": "/shared-modules/vue.620a1e89.final.mjs"
199
+ },
200
+ scopes: {}
201
+ };
202
+ const result = fixNestedScopesResolution(importMap);
203
+ assert.deepEqual(result, importMap);
204
+ });
205
+ test("should return unchanged import map for shallow scopes only", () => {
206
+ const importMap = {
207
+ imports: {
208
+ "shared-modules/vue": "/shared-modules/vue.620a1e89.final.mjs"
209
+ },
210
+ scopes: {
211
+ "/shared-modules/": {
212
+ vue: "/shared-modules/vue.620a1e89.final.mjs"
213
+ }
214
+ }
215
+ };
216
+ const result = fixNestedScopesResolution(importMap);
217
+ assert.deepEqual(result, importMap);
218
+ });
219
+ test("should create file-level scopes for nested scopes", () => {
220
+ const importMap = {
221
+ imports: {
222
+ "shared-modules/vue2": "/shared-modules/vue2.a1b2c3d4.final.mjs",
223
+ "shared-modules/vue2/@esmx/router-vue": "/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs",
224
+ "shared-modules/vue2/index": "/shared-modules/vue2/index.i9j0k1l2.final.mjs",
225
+ "shared-modules/vue": "/shared-modules/vue.m3n4o5p6.final.mjs"
226
+ },
227
+ scopes: {
228
+ "/shared-modules/": {
229
+ vue: "/shared-modules/vue.m3n4o5p6.final.mjs"
230
+ },
231
+ "/shared-modules/vue2/": {
232
+ vue: "/shared-modules/vue2.a1b2c3d4.final.mjs"
233
+ }
234
+ }
235
+ };
236
+ const expected = {
237
+ imports: {
238
+ "shared-modules/vue2": "/shared-modules/vue2.a1b2c3d4.final.mjs",
239
+ "shared-modules/vue2/@esmx/router-vue": "/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs",
240
+ "shared-modules/vue2/index": "/shared-modules/vue2/index.i9j0k1l2.final.mjs",
241
+ "shared-modules/vue": "/shared-modules/vue.m3n4o5p6.final.mjs"
242
+ },
243
+ scopes: {
244
+ "/shared-modules/vue.m3n4o5p6.final.mjs": {
245
+ vue: "/shared-modules/vue.m3n4o5p6.final.mjs"
246
+ },
247
+ "/shared-modules/vue2.a1b2c3d4.final.mjs": {
248
+ vue: "/shared-modules/vue.m3n4o5p6.final.mjs"
249
+ },
250
+ "/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs": {
251
+ vue: "/shared-modules/vue2.a1b2c3d4.final.mjs"
252
+ },
253
+ "/shared-modules/vue2/index.i9j0k1l2.final.mjs": {
254
+ vue: "/shared-modules/vue2.a1b2c3d4.final.mjs"
255
+ }
256
+ }
257
+ };
258
+ const result = fixNestedScopesResolution(importMap);
259
+ assert.deepEqual(result, expected);
260
+ });
261
+ test("should handle multiple nested scopes correctly", () => {
262
+ const importMap = {
263
+ imports: {
264
+ "shared-modules/vue2": "/shared-modules/vue2.q7r8s9t0.final.mjs",
265
+ "shared-modules/vue2/component": "/shared-modules/vue2/component.u1v2w3x4.final.mjs",
266
+ "shared-modules/vue3": "/shared-modules/vue3.y5z6a7b8.final.mjs",
267
+ "shared-modules/vue3/component": "/shared-modules/vue3/component.c9d0e1f2.final.mjs",
268
+ "shared-modules/vue": "/shared-modules/vue.g3h4i5j6.final.mjs"
269
+ },
270
+ scopes: {
271
+ "/shared-modules/": {
272
+ vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
273
+ },
274
+ "/shared-modules/vue2/": {
275
+ vue: "/shared-modules/vue2.q7r8s9t0.final.mjs"
276
+ },
277
+ "/shared-modules/vue3/": {
278
+ vue: "/shared-modules/vue3.y5z6a7b8.final.mjs"
279
+ }
280
+ }
281
+ };
282
+ const expected = {
283
+ imports: {
284
+ "shared-modules/vue2": "/shared-modules/vue2.q7r8s9t0.final.mjs",
285
+ "shared-modules/vue2/component": "/shared-modules/vue2/component.u1v2w3x4.final.mjs",
286
+ "shared-modules/vue3": "/shared-modules/vue3.y5z6a7b8.final.mjs",
287
+ "shared-modules/vue3/component": "/shared-modules/vue3/component.c9d0e1f2.final.mjs",
288
+ "shared-modules/vue": "/shared-modules/vue.g3h4i5j6.final.mjs"
289
+ },
290
+ scopes: {
291
+ "/shared-modules/vue.g3h4i5j6.final.mjs": {
292
+ vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
293
+ },
294
+ "/shared-modules/vue2.q7r8s9t0.final.mjs": {
295
+ vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
296
+ },
297
+ "/shared-modules/vue2/component.u1v2w3x4.final.mjs": {
298
+ vue: "/shared-modules/vue2.q7r8s9t0.final.mjs"
299
+ },
300
+ "/shared-modules/vue3.y5z6a7b8.final.mjs": {
301
+ vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
302
+ },
303
+ "/shared-modules/vue3/component.c9d0e1f2.final.mjs": {
304
+ vue: "/shared-modules/vue3.y5z6a7b8.final.mjs"
305
+ }
306
+ }
307
+ };
308
+ const result = fixNestedScopesResolution(importMap);
309
+ assert.deepEqual(result, expected);
310
+ });
311
+ test("should handle deeply nested scopes", () => {
312
+ const importMap = {
313
+ imports: {
314
+ "shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.k7l8m9n0.final.mjs",
315
+ "shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.o1p2q3r4.final.mjs"
316
+ },
317
+ scopes: {
318
+ "/shared-modules/vue2/components/": {
319
+ vue: "/shared-modules/vue2.s5t6u7v8.final.mjs"
320
+ }
321
+ }
322
+ };
323
+ const expected = {
324
+ imports: {
325
+ "shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.k7l8m9n0.final.mjs",
326
+ "shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.o1p2q3r4.final.mjs"
327
+ },
328
+ scopes: {
329
+ "/shared-modules/vue2/components/button.k7l8m9n0.final.mjs": {
330
+ vue: "/shared-modules/vue2.s5t6u7v8.final.mjs"
331
+ },
332
+ "/shared-modules/vue2/components/input.o1p2q3r4.final.mjs": {
333
+ vue: "/shared-modules/vue2.s5t6u7v8.final.mjs"
334
+ }
335
+ }
336
+ };
337
+ const result = fixNestedScopesResolution(importMap);
338
+ assert.deepEqual(result, expected);
339
+ });
340
+ test("should not create file-level scopes for imports not matching nested scope", () => {
341
+ const importMap = {
342
+ imports: {
343
+ "shared-modules/vue": "/shared-modules/vue.w9x0y1z2.final.mjs",
344
+ "shared-modules/vue2/component": "/shared-modules/vue2/component.a3b4c5d6.final.mjs",
345
+ "other-modules/component": "/other-modules/component.e7f8g9h0.final.mjs"
346
+ },
347
+ scopes: {
348
+ "/shared-modules/vue2/": {
349
+ vue: "/shared-modules/vue2.i1j2k3l4.final.mjs"
350
+ }
351
+ }
352
+ };
353
+ const expected = {
354
+ imports: importMap.imports,
355
+ scopes: {
356
+ "/shared-modules/vue2/component.a3b4c5d6.final.mjs": {
357
+ vue: "/shared-modules/vue2.i1j2k3l4.final.mjs"
358
+ }
359
+ }
360
+ };
361
+ const result = fixNestedScopesResolution(importMap);
362
+ assert.deepEqual(result, expected);
363
+ });
364
+ test("should handle empty imports", () => {
365
+ const importMap = {
366
+ imports: {},
367
+ scopes: {
368
+ "/shared-modules/vue2/": {
369
+ vue: "/shared-modules/vue2.m5n6o7p8.final.mjs"
370
+ }
371
+ }
372
+ };
373
+ const expected = {
374
+ imports: {},
375
+ scopes: {}
376
+ };
377
+ const result = fixNestedScopesResolution(importMap);
378
+ assert.deepEqual(result, expected);
379
+ });
380
+ test("should preserve original import map structure", () => {
381
+ const importMap = {
382
+ imports: {
383
+ "shared-modules/vue2": "/shared-modules/vue2.q9r8s7t6.final.mjs",
384
+ "shared-modules/vue2/component": "/shared-modules/vue2/component.u5v4w3x2.final.mjs"
385
+ },
386
+ scopes: {
387
+ "/shared-modules/vue2/": {
388
+ vue: "/shared-modules/vue2.q9r8s7t6.final.mjs",
389
+ "vue-router": "/shared-modules/vue2/router.y1z0a9b8.final.mjs"
390
+ }
391
+ }
392
+ };
393
+ const result = fixNestedScopesResolution(importMap);
394
+ assert.deepEqual(result.imports, importMap.imports);
395
+ assert.deepEqual(
396
+ result.scopes["/shared-modules/vue2/"],
397
+ importMap.scopes["/shared-modules/vue2/"]
398
+ );
399
+ assert.deepEqual(
400
+ result.scopes["/shared-modules/vue2/component.u5v4w3x2.final.mjs"],
401
+ {
402
+ vue: "/shared-modules/vue2.q9r8s7t6.final.mjs",
403
+ "vue-router": "/shared-modules/vue2/router.y1z0a9b8.final.mjs"
404
+ }
405
+ );
406
+ });
407
+ test("should handle complex priority scenarios with multiple nested levels", () => {
408
+ const importMap = {
409
+ imports: {
410
+ "shared-modules/vue2": "/shared-modules/vue2.c7d8e9f0.final.mjs",
411
+ "shared-modules/vue2/test": "/shared-modules/vue2/test.a1b2c3d4.final.mjs",
412
+ "shared-modules/vue2/test/component": "/shared-modules/vue2/test/component.e5f6g7h8.final.mjs",
413
+ "shared-modules/vue": "/shared-modules/vue.i9j0k1l2.final.mjs"
414
+ },
415
+ scopes: {
416
+ "/shared-modules/": {
417
+ vue: "/shared-modules/vue.i9j0k1l2.final.mjs",
418
+ "vue-router": "/shared-modules/@esmx/router.m3n4o5p6.final.mjs"
419
+ },
420
+ "/shared-modules/vue2/": {
421
+ vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
422
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs"
423
+ },
424
+ "/shared-modules/vue2/test/": {
425
+ vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
426
+ "test-utils": "/shared-modules/vue2/test/utils.u1v2w3x4.final.mjs"
427
+ }
428
+ }
429
+ };
430
+ const expected = {
431
+ imports: {
432
+ "shared-modules/vue2": "/shared-modules/vue2.c7d8e9f0.final.mjs",
433
+ "shared-modules/vue2/test": "/shared-modules/vue2/test.a1b2c3d4.final.mjs",
434
+ "shared-modules/vue2/test/component": "/shared-modules/vue2/test/component.e5f6g7h8.final.mjs",
435
+ "shared-modules/vue": "/shared-modules/vue.i9j0k1l2.final.mjs"
436
+ },
437
+ scopes: {
438
+ "/shared-modules/vue.i9j0k1l2.final.mjs": {
439
+ vue: "/shared-modules/vue.i9j0k1l2.final.mjs",
440
+ "vue-router": "/shared-modules/@esmx/router.m3n4o5p6.final.mjs"
441
+ },
442
+ "/shared-modules/vue2.c7d8e9f0.final.mjs": {
443
+ vue: "/shared-modules/vue.i9j0k1l2.final.mjs",
444
+ "vue-router": "/shared-modules/@esmx/router.m3n4o5p6.final.mjs"
445
+ },
446
+ "/shared-modules/vue2/test.a1b2c3d4.final.mjs": {
447
+ vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
448
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs"
449
+ },
450
+ "/shared-modules/vue2/test/component.e5f6g7h8.final.mjs": {
451
+ vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
452
+ "test-utils": "/shared-modules/vue2/test/utils.u1v2w3x4.final.mjs",
453
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs"
454
+ }
455
+ }
456
+ };
457
+ const result = fixNestedScopesResolution(importMap);
458
+ assert.deepEqual(result, expected);
459
+ });
460
+ test("should handle priority with overlapping nested scopes", () => {
461
+ const importMap = {
462
+ imports: {
463
+ "shared-modules/vue2": "/shared-modules/vue2.n3o4p5q6.final.mjs",
464
+ "shared-modules/vue2/components": "/shared-modules/vue2/components.r7s8t9u0.final.mjs",
465
+ "shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.v1w2x3y4.final.mjs",
466
+ "shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.z5a6b7c8.final.mjs"
467
+ },
468
+ scopes: {
469
+ "/shared-modules/vue2/": {
470
+ vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
471
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
472
+ },
473
+ "/shared-modules/vue2/components/": {
474
+ vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
475
+ "component-utils": "/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs"
476
+ }
477
+ }
478
+ };
479
+ const expected = {
480
+ imports: {
481
+ "shared-modules/vue2": "/shared-modules/vue2.n3o4p5q6.final.mjs",
482
+ "shared-modules/vue2/components": "/shared-modules/vue2/components.r7s8t9u0.final.mjs",
483
+ "shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.v1w2x3y4.final.mjs",
484
+ "shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.z5a6b7c8.final.mjs"
485
+ },
486
+ scopes: {
487
+ "/shared-modules/vue2/components.r7s8t9u0.final.mjs": {
488
+ vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
489
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
490
+ },
491
+ "/shared-modules/vue2/components/button.v1w2x3y4.final.mjs": {
492
+ "component-utils": "/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs",
493
+ vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
494
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
495
+ },
496
+ "/shared-modules/vue2/components/input.z5a6b7c8.final.mjs": {
497
+ "component-utils": "/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs",
498
+ vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
499
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
500
+ }
501
+ }
502
+ };
503
+ const result = fixNestedScopesResolution(importMap);
504
+ assert.deepEqual(result, expected);
505
+ });
506
+ test("should handle very deeply nested scope priority scenarios", () => {
507
+ const importMap = {
508
+ imports: {
509
+ "shared-modules/vue2": "/shared-modules/vue2.l7m8n9o0.final.mjs",
510
+ "shared-modules/vue2/test": "/shared-modules/vue2/test.p1q2r3s4.final.mjs",
511
+ "shared-modules/vue2/test/unit": "/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs",
512
+ "shared-modules/vue2/test/unit/component": "/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs"
513
+ },
514
+ scopes: {
515
+ "/shared-modules/": {
516
+ vue: "/shared-modules/vue.b3c4d5e6.final.mjs"
517
+ },
518
+ "/shared-modules/vue2/": {
519
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs"
520
+ },
521
+ "/shared-modules/vue2/test/": {
522
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
523
+ "test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
524
+ },
525
+ "/shared-modules/vue2/test/unit/": {
526
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
527
+ "test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
528
+ }
529
+ }
530
+ };
531
+ const expected = {
532
+ imports: {
533
+ "shared-modules/vue2": "/shared-modules/vue2.l7m8n9o0.final.mjs",
534
+ "shared-modules/vue2/test": "/shared-modules/vue2/test.p1q2r3s4.final.mjs",
535
+ "shared-modules/vue2/test/unit": "/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs",
536
+ "shared-modules/vue2/test/unit/component": "/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs"
537
+ },
538
+ scopes: {
539
+ "/shared-modules/vue2.l7m8n9o0.final.mjs": {
540
+ vue: "/shared-modules/vue.b3c4d5e6.final.mjs"
541
+ },
542
+ "/shared-modules/vue2/test.p1q2r3s4.final.mjs": {
543
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs"
544
+ },
545
+ "/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs": {
546
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
547
+ "test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
548
+ },
549
+ "/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs": {
550
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
551
+ "test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
552
+ }
553
+ }
554
+ };
555
+ const result = fixNestedScopesResolution(importMap);
556
+ assert.deepEqual(result, expected);
557
+ });
558
+ test("should ensure different directory levels have distinct values for proper testing", () => {
559
+ const importMap = {
560
+ imports: {
561
+ "shared-modules/level1": "/shared-modules/level1.a1b2c3d4.final.mjs",
562
+ "shared-modules/level1/level2": "/shared-modules/level1/level2.e5f6g7h8.final.mjs",
563
+ "shared-modules/level1/level2/level3": "/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs"
564
+ },
565
+ scopes: {
566
+ "/shared-modules/level1/": {
567
+ vue: "/shared-modules/level1.a1b2c3d4.final.mjs"
568
+ },
569
+ "/shared-modules/level1/level2/": {
570
+ vue: "/shared-modules/level1/level2.e5f6g7h8.final.mjs"
571
+ }
572
+ }
573
+ };
574
+ const expected = {
575
+ imports: {
576
+ "shared-modules/level1": "/shared-modules/level1.a1b2c3d4.final.mjs",
577
+ "shared-modules/level1/level2": "/shared-modules/level1/level2.e5f6g7h8.final.mjs",
578
+ "shared-modules/level1/level2/level3": "/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs"
579
+ },
580
+ scopes: {
581
+ "/shared-modules/level1/level2.e5f6g7h8.final.mjs": {
582
+ vue: "/shared-modules/level1.a1b2c3d4.final.mjs"
583
+ },
584
+ "/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs": {
585
+ vue: "/shared-modules/level1/level2.e5f6g7h8.final.mjs"
586
+ }
587
+ }
588
+ };
589
+ const result = fixNestedScopesResolution(importMap);
590
+ assert.deepEqual(result, expected);
591
+ assert.equal(
592
+ result.scopes["/shared-modules/level1/level2.e5f6g7h8.final.mjs"].vue,
593
+ "/shared-modules/level1.a1b2c3d4.final.mjs"
594
+ );
595
+ assert.equal(
596
+ result.scopes["/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs"].vue,
597
+ "/shared-modules/level1/level2.e5f6g7h8.final.mjs"
598
+ );
599
+ });
600
+ test("should successfully delete properties using Reflect.deleteProperty", () => {
601
+ const importMap = {
602
+ imports: {
603
+ "shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs"
604
+ },
605
+ scopes: {
606
+ "/shared/modules/vue2/": {
607
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
608
+ }
609
+ }
610
+ };
611
+ const result = fixNestedScopesResolution(importMap);
612
+ assert.deepEqual(result.imports, importMap.imports);
613
+ assert.isUndefined(result.scopes["/shared/modules/vue2/"]);
614
+ assert.doesNotThrow(() => {
615
+ fixNestedScopesResolution(importMap);
616
+ });
617
+ });
618
+ describe("scope path processing logic", () => {
619
+ test("should process all scope paths regardless of format", () => {
620
+ const importMap = {
621
+ imports: {
622
+ "shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
623
+ "shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
624
+ },
625
+ scopes: {
626
+ "shared/modules/vue2/": {
627
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
628
+ },
629
+ "/shared/modules/vue2": {
630
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
631
+ },
632
+ "/shared/": {
633
+ vue: "/shared/vue.e5f6g7h8.final.mjs"
634
+ },
635
+ "/shared/modules/vue2/": {
636
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
637
+ }
638
+ }
639
+ };
640
+ const expected = {
641
+ imports: {
642
+ "shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
643
+ "shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
644
+ },
645
+ scopes: {
646
+ "/shared/modules/vue2.a1b2c3d4.final.mjs": {
647
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
648
+ },
649
+ "/shared/vue.e5f6g7h8.final.mjs": {
650
+ vue: "/shared/vue.e5f6g7h8.final.mjs"
651
+ }
652
+ }
653
+ };
654
+ const result = fixNestedScopesResolution(importMap);
655
+ assert.deepEqual(result, expected);
656
+ });
657
+ test("should handle scope paths with any depth", () => {
658
+ const importMap = {
659
+ imports: {
660
+ "a/b/c": "/a/b/c.a1b2c3d4.final.mjs"
661
+ },
662
+ scopes: {
663
+ "/a/b/c/": {
664
+ vue: "/a/b/c.a1b2c3d4.final.mjs"
665
+ }
666
+ }
667
+ };
668
+ const expected = {
669
+ imports: {
670
+ "a/b/c": "/a/b/c.a1b2c3d4.final.mjs"
671
+ },
672
+ scopes: {}
673
+ };
674
+ const result = fixNestedScopesResolution(importMap);
675
+ assert.deepEqual(result, expected);
676
+ });
677
+ test("should handle very deep nested scope paths", () => {
678
+ const importMap = {
679
+ imports: {
680
+ "a/b/c/d/e/f": "/a/b/c/d/e/f.a1b2c3d4.final.mjs"
681
+ },
682
+ scopes: {
683
+ "/a/b/c/d/e/f/": {
684
+ vue: "/a/b/c/d/e/f.a1b2c3d4.final.mjs"
685
+ }
686
+ }
687
+ };
688
+ const expected = {
689
+ imports: {
690
+ "a/b/c/d/e/f": "/a/b/c/d/e/f.a1b2c3d4.final.mjs"
691
+ },
692
+ scopes: {}
693
+ };
694
+ const result = fixNestedScopesResolution(importMap);
695
+ assert.deepEqual(result, expected);
696
+ });
697
+ test("should create file-level scopes for all scope paths", () => {
698
+ const importMap = {
699
+ imports: {
700
+ "modules/vue": "/modules/vue.a1b2c3d4.final.mjs",
701
+ "shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
702
+ },
703
+ scopes: {
704
+ "/modules/": {
705
+ vue: "/modules/vue.a1b2c3d4.final.mjs"
706
+ },
707
+ "/shared/": {
708
+ vue: "/shared/vue.e5f6g7h8.final.mjs"
709
+ }
710
+ }
711
+ };
712
+ const expected = {
713
+ imports: {
714
+ "modules/vue": "/modules/vue.a1b2c3d4.final.mjs",
715
+ "shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
716
+ },
717
+ scopes: {
718
+ "/modules/vue.a1b2c3d4.final.mjs": {
719
+ vue: "/modules/vue.a1b2c3d4.final.mjs"
720
+ },
721
+ "/shared/vue.e5f6g7h8.final.mjs": {
722
+ vue: "/shared/vue.e5f6g7h8.final.mjs"
723
+ }
724
+ }
725
+ };
726
+ const result = fixNestedScopesResolution(importMap);
727
+ assert.deepEqual(result, expected);
728
+ });
729
+ test("should process multiple scope paths in correct order by depth", () => {
730
+ const importMap = {
731
+ imports: {
732
+ "shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
733
+ "shared/modules/vue2/component": "/shared/modules/vue2/component.e5f6g7h8.final.mjs",
734
+ "shared/modules/vue2/utils": "/shared/modules/vue2/utils.i9j0k1l2.final.mjs"
735
+ },
736
+ scopes: {
737
+ "/shared/modules/vue2/": {
738
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
739
+ },
740
+ "/shared/modules/vue2/utils/": {
741
+ "test-utils": "/shared/modules/vue2/utils.i9j0k1l2.final.mjs"
742
+ }
743
+ }
744
+ };
745
+ const expected = {
746
+ imports: {
747
+ "shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
748
+ "shared/modules/vue2/component": "/shared/modules/vue2/component.e5f6g7h8.final.mjs",
749
+ "shared/modules/vue2/utils": "/shared/modules/vue2/utils.i9j0k1l2.final.mjs"
750
+ },
751
+ scopes: {
752
+ "/shared/modules/vue2/component.e5f6g7h8.final.mjs": {
753
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
754
+ },
755
+ "/shared/modules/vue2/utils.i9j0k1l2.final.mjs": {
756
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
757
+ }
758
+ }
759
+ };
760
+ const result = fixNestedScopesResolution(importMap);
761
+ assert.deepEqual(result, expected);
762
+ });
763
+ });
764
+ });
442
765
  describe("buildScopesMap", () => {
443
766
  test("should return empty object for empty manifests", () => {
444
767
  const imports = {};
@@ -457,7 +780,6 @@ describe("buildScopesMap", () => {
457
780
  const manifests = [
458
781
  {
459
782
  name: "test-module",
460
- imports: {},
461
783
  exports: {
462
784
  component: {
463
785
  name: "component",
@@ -484,7 +806,6 @@ describe("buildScopesMap", () => {
484
806
  const manifests = [
485
807
  {
486
808
  name: "test-module",
487
- imports: {},
488
809
  exports: {
489
810
  component: {
490
811
  name: "component",
@@ -526,7 +847,6 @@ describe("buildScopesMap", () => {
526
847
  const manifests = [
527
848
  {
528
849
  name: "test-module",
529
- imports: {},
530
850
  exports: {
531
851
  component: {
532
852
  name: "component",
@@ -562,7 +882,6 @@ describe("buildScopesMap", () => {
562
882
  const manifests = [
563
883
  {
564
884
  name: "test-module",
565
- imports: {},
566
885
  exports: {
567
886
  component: {
568
887
  name: "component",
@@ -599,7 +918,6 @@ describe("buildScopesMap", () => {
599
918
  const manifests = [
600
919
  {
601
920
  name: "test-module",
602
- imports: {},
603
921
  exports: {
604
922
  node_modules: {
605
923
  name: "node_modules",
@@ -639,7 +957,6 @@ describe("buildScopesMap", () => {
639
957
  const manifests = [
640
958
  {
641
959
  name: "test-module",
642
- imports: {},
643
960
  exports: {
644
961
  component: {
645
962
  name: "component",
@@ -674,7 +991,6 @@ describe("buildScopesMap", () => {
674
991
  const manifests = [
675
992
  {
676
993
  name: "test-module",
677
- imports: {},
678
994
  exports: {
679
995
  component: {
680
996
  name: "component",
@@ -721,7 +1037,6 @@ describe("buildScopesMap", () => {
721
1037
  const manifests = [
722
1038
  {
723
1039
  name: "module-a",
724
- imports: {},
725
1040
  exports: {
726
1041
  component: {
727
1042
  name: "component",
@@ -738,7 +1053,6 @@ describe("buildScopesMap", () => {
738
1053
  },
739
1054
  {
740
1055
  name: "module-b",
741
- imports: {},
742
1056
  exports: {
743
1057
  utils: {
744
1058
  name: "utils",
@@ -775,7 +1089,6 @@ describe("buildScopesMap", () => {
775
1089
  const manifests = [
776
1090
  {
777
1091
  name: "test-module",
778
- imports: {},
779
1092
  exports: {
780
1093
  component: {
781
1094
  name: "component",
@@ -805,7 +1118,6 @@ describe("buildScopesMap", () => {
805
1118
  const manifests = [
806
1119
  {
807
1120
  name: "test-module",
808
- imports: {},
809
1121
  exports: {
810
1122
  component: {
811
1123
  name: "component",
@@ -838,14 +1150,11 @@ describe("getImportMap", () => {
838
1150
  scopes: {}
839
1151
  });
840
1152
  });
841
- test("should build complete import map with imports and scopes", () => {
1153
+ test("should build complete import map with exports and scopes", () => {
842
1154
  const options = {
843
1155
  manifests: [
844
1156
  {
845
1157
  name: "test-module",
846
- imports: {
847
- "custom-react": "test-module/component"
848
- },
849
1158
  exports: {
850
1159
  component: {
851
1160
  name: "component",
@@ -875,8 +1184,7 @@ describe("getImportMap", () => {
875
1184
  assert.deepEqual(result, {
876
1185
  imports: {
877
1186
  "test-module/component": "test-module/component.js",
878
- "test-module/utils": "test-module/utils.js",
879
- "test-module/custom-react": "test-module/component.js"
1187
+ "test-module/utils": "test-module/utils.js"
880
1188
  },
881
1189
  scopes: {
882
1190
  "test-module//node_modules": {
@@ -891,7 +1199,6 @@ describe("getImportMap", () => {
891
1199
  manifests: [
892
1200
  {
893
1201
  name: "module-a",
894
- imports: {},
895
1202
  exports: {
896
1203
  utils: {
897
1204
  name: "utils",
@@ -908,9 +1215,6 @@ describe("getImportMap", () => {
908
1215
  },
909
1216
  {
910
1217
  name: "module-b",
911
- imports: {
912
- shared: "module-a/utils"
913
- },
914
1218
  exports: {
915
1219
  component: {
916
1220
  name: "component",
@@ -933,8 +1237,7 @@ describe("getImportMap", () => {
933
1237
  assert.deepEqual(result, {
934
1238
  imports: {
935
1239
  "module-a/utils": "module-a/utils.js",
936
- "module-b/component": "module-b/component.js",
937
- "module-b/shared": "module-a/utils.js"
1240
+ "module-b/component": "module-b/component.js"
938
1241
  },
939
1242
  scopes: {
940
1243
  "module-a//node_modules": {
@@ -951,7 +1254,6 @@ describe("getImportMap", () => {
951
1254
  manifests: [
952
1255
  {
953
1256
  name: "test-module",
954
- imports: {},
955
1257
  exports: {
956
1258
  component: {
957
1259
  name: "component",
@@ -974,35 +1276,11 @@ describe("getImportMap", () => {
974
1276
  scopes: {}
975
1277
  });
976
1278
  });
977
- test("should handle manifests with only imports", () => {
978
- const options = {
979
- manifests: [
980
- {
981
- name: "test-module",
982
- imports: {
983
- external: "https://cdn.com/lib.js"
984
- },
985
- exports: {},
986
- scopes: {}
987
- }
988
- ],
989
- getFile: (name, file) => `${name}/${file}`,
990
- getScope: (name, scope) => `${name}/${scope}`
991
- };
992
- const result = getImportMap(options);
993
- assert.deepEqual(result, {
994
- imports: {
995
- "test-module/external": "https://cdn.com/lib.js"
996
- },
997
- scopes: {}
998
- });
999
- });
1000
1279
  test("should handle manifests with only scopes", () => {
1001
1280
  const options = {
1002
1281
  manifests: [
1003
1282
  {
1004
1283
  name: "test-module",
1005
- imports: {},
1006
1284
  exports: {},
1007
1285
  scopes: {
1008
1286
  node_modules: {
@@ -1029,7 +1307,6 @@ describe("getImportMap", () => {
1029
1307
  manifests: [
1030
1308
  {
1031
1309
  name: "test-module",
1032
- imports: {},
1033
1310
  exports: {
1034
1311
  component: {
1035
1312
  name: "component",
@@ -1065,7 +1342,6 @@ describe("getImportMap", () => {
1065
1342
  manifests: [
1066
1343
  {
1067
1344
  name: "test-module",
1068
- imports: {},
1069
1345
  exports: {
1070
1346
  component: {
1071
1347
  name: "component",
@@ -1093,10 +1369,6 @@ describe("getImportMap", () => {
1093
1369
  manifests: [
1094
1370
  {
1095
1371
  name: "test-module",
1096
- imports: {
1097
- "external-react": "https://cdn.com/react.js",
1098
- "local-alias": "test-module/component"
1099
- },
1100
1372
  exports: {
1101
1373
  component: {
1102
1374
  name: "component",
@@ -1119,9 +1391,7 @@ describe("getImportMap", () => {
1119
1391
  const result = getImportMap(options);
1120
1392
  assert.deepEqual(result, {
1121
1393
  imports: {
1122
- "test-module/component": "test-module/component.js",
1123
- "test-module/external-react": "https://cdn.com/react.js",
1124
- "test-module/local-alias": "test-module/component.js"
1394
+ "test-module/component": "test-module/component.js"
1125
1395
  },
1126
1396
  scopes: {
1127
1397
  "test-module//node_modules": {
@@ -1136,7 +1406,6 @@ describe("getImportMap", () => {
1136
1406
  manifests: [
1137
1407
  {
1138
1408
  name: "test-module",
1139
- imports: {},
1140
1409
  exports: {
1141
1410
  "src/index": {
1142
1411
  name: "src/index",