@openmrs/esm-dynamic-loading 10.0.1-pre.5186 → 10.0.1-pre.5199
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/.turbo/turbo-build.log +1 -1
- package/dist/route-maps.d.ts.map +1 -1
- package/dist/route-maps.js +13 -5
- package/package.json +5 -5
- package/src/route-maps.test.ts +123 -28
- package/src/route-maps.ts +9 -5
package/.turbo/turbo-build.log
CHANGED
package/dist/route-maps.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-maps.d.ts","sourceRoot":"","sources":["../src/route-maps.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,EAAuC,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"route-maps.d.ts","sourceRoot":"","sources":["../src/route-maps.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,EAAuC,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA+GtH;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,CAOjE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC,CAEpE;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,aAAa,CAAC,CAMrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoB/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,MAAM,GAAG,GAAG,QAkC9F;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,QAYxD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,SAmBrC;AAaD,wBAAgB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBtD"}
|
package/dist/route-maps.js
CHANGED
|
@@ -33,10 +33,15 @@ let initialOverrideSnapshot = null;
|
|
|
33
33
|
return mergeRouteMaps(maps);
|
|
34
34
|
}
|
|
35
35
|
function mergeRouteMaps(maps) {
|
|
36
|
-
const merged = {
|
|
36
|
+
const merged = {
|
|
37
|
+
routes: {}
|
|
38
|
+
};
|
|
37
39
|
for (const map of maps){
|
|
38
|
-
if (map && typeof map === 'object') {
|
|
39
|
-
Object.assign(merged, map);
|
|
40
|
+
if (map && typeof map === 'object' && !Array.isArray(map)) {
|
|
41
|
+
Object.assign(merged.routes, map.routes);
|
|
42
|
+
if (merged.version === undefined && map.version !== undefined) {
|
|
43
|
+
merged.version = map.version;
|
|
44
|
+
}
|
|
40
45
|
}
|
|
41
46
|
}
|
|
42
47
|
return merged;
|
|
@@ -45,7 +50,10 @@ function mergeRouteMaps(maps) {
|
|
|
45
50
|
* Reads all `openmrs-routes:*` entries from localStorage as an {@link OpenmrsRoutes}.
|
|
46
51
|
* This is async because URL-valued overrides need to be fetched.
|
|
47
52
|
*/ async function readOverrideMap() {
|
|
48
|
-
const result = {
|
|
53
|
+
const result = {
|
|
54
|
+
version: undefined,
|
|
55
|
+
routes: {}
|
|
56
|
+
};
|
|
49
57
|
try {
|
|
50
58
|
const entries = [];
|
|
51
59
|
for(let i = 0; i < localStorage.length; i++){
|
|
@@ -83,7 +91,7 @@ function mergeRouteMaps(maps) {
|
|
|
83
91
|
}));
|
|
84
92
|
for (const entry of settled){
|
|
85
93
|
if (entry.status === 'fulfilled') {
|
|
86
|
-
result[entry.value.moduleName] = entry.value.routes;
|
|
94
|
+
result['routes'][entry.value.moduleName] = entry.value.routes;
|
|
87
95
|
} else {
|
|
88
96
|
console.warn('[route-maps] Failed to load route override', entry.reason);
|
|
89
97
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openmrs/esm-dynamic-loading",
|
|
3
|
-
"version": "10.0.1-pre.
|
|
3
|
+
"version": "10.0.1-pre.5199",
|
|
4
4
|
"license": "MPL-2.0",
|
|
5
5
|
"description": "Utilities for dynamically loading code in OpenMRS",
|
|
6
6
|
"type": "module",
|
|
@@ -53,12 +53,12 @@
|
|
|
53
53
|
"access": "public"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"@openmrs/esm-globals": "^10.0.1-pre.
|
|
57
|
-
"@openmrs/esm-translations": "^10.0.1-pre.
|
|
56
|
+
"@openmrs/esm-globals": "^10.0.1-pre.5199",
|
|
57
|
+
"@openmrs/esm-translations": "^10.0.1-pre.5199"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
-
"@openmrs/esm-globals": "10.0.1-pre.
|
|
61
|
-
"@openmrs/esm-translations": "10.0.1-pre.
|
|
60
|
+
"@openmrs/esm-globals": "10.0.1-pre.5199",
|
|
61
|
+
"@openmrs/esm-translations": "10.0.1-pre.5199",
|
|
62
62
|
"@swc/cli": "0.8.1",
|
|
63
63
|
"@swc/core": "1.15.21",
|
|
64
64
|
"@vitest/coverage-v8": "^4.1.2",
|
package/src/route-maps.test.ts
CHANGED
|
@@ -10,7 +10,8 @@ describe('route-maps', () => {
|
|
|
10
10
|
for (const map of maps) {
|
|
11
11
|
const script = document.createElement('script');
|
|
12
12
|
script.type = 'openmrs-routes';
|
|
13
|
-
|
|
13
|
+
// `map` is a flat module map; wrap it in the { version, routes } registry shape.
|
|
14
|
+
script.textContent = JSON.stringify({ routes: map });
|
|
14
15
|
document.head.appendChild(script);
|
|
15
16
|
}
|
|
16
17
|
}
|
|
@@ -43,8 +44,8 @@ describe('route-maps', () => {
|
|
|
43
44
|
);
|
|
44
45
|
|
|
45
46
|
const map = await getCurrentRouteMap();
|
|
46
|
-
expect(map['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
47
|
-
expect(map['@openmrs/esm-bar']).toEqual({ extensions: [] });
|
|
47
|
+
expect(map.routes['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
48
|
+
expect(map.routes['@openmrs/esm-bar']).toEqual({ extensions: [] });
|
|
48
49
|
});
|
|
49
50
|
|
|
50
51
|
it('getRouteMapNextPageMap returns base map only', async () => {
|
|
@@ -58,7 +59,7 @@ describe('route-maps', () => {
|
|
|
58
59
|
);
|
|
59
60
|
|
|
60
61
|
const map = await getRouteMapNextPageMap();
|
|
61
|
-
expect(map['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
62
|
+
expect(map.routes['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
62
63
|
});
|
|
63
64
|
|
|
64
65
|
it('getRouteMapOverrideMap returns empty object', async () => {
|
|
@@ -115,8 +116,8 @@ describe('route-maps', () => {
|
|
|
115
116
|
await setupRouteMapOverrides();
|
|
116
117
|
|
|
117
118
|
const map = await getCurrentRouteMap();
|
|
118
|
-
expect(map['@openmrs/esm-foo']).toEqual({ pages: [{ component: 'root', route: '/' }] });
|
|
119
|
-
expect(map['@openmrs/esm-bar']).toEqual({ extensions: [] });
|
|
119
|
+
expect(map.routes['@openmrs/esm-foo']).toEqual({ pages: [{ component: 'root', route: '/' }] });
|
|
120
|
+
expect(map.routes['@openmrs/esm-bar']).toEqual({ extensions: [] });
|
|
120
121
|
});
|
|
121
122
|
|
|
122
123
|
it('getCurrentRouteMap merges base map with URL-fetched overrides', async () => {
|
|
@@ -128,7 +129,7 @@ describe('route-maps', () => {
|
|
|
128
129
|
await setupRouteMapOverrides();
|
|
129
130
|
|
|
130
131
|
const map = await getCurrentRouteMap();
|
|
131
|
-
expect(map['@openmrs/esm-foo']).toEqual({ pages: [{ component: 'root', route: '/fetched' }] });
|
|
132
|
+
expect(map.routes['@openmrs/esm-foo']).toEqual({ pages: [{ component: 'root', route: '/fetched' }] });
|
|
132
133
|
});
|
|
133
134
|
|
|
134
135
|
it('getRouteMapDefaultMap returns only the base map', async () => {
|
|
@@ -142,7 +143,7 @@ describe('route-maps', () => {
|
|
|
142
143
|
await setupRouteMapOverrides();
|
|
143
144
|
|
|
144
145
|
const map = await getRouteMapDefaultMap();
|
|
145
|
-
expect(map['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
146
|
+
expect(map.routes['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
146
147
|
});
|
|
147
148
|
|
|
148
149
|
it('addRouteMapOverride stores an object in localStorage', async () => {
|
|
@@ -254,11 +255,11 @@ describe('route-maps', () => {
|
|
|
254
255
|
|
|
255
256
|
// getCurrentRouteMap uses the snapshot — doesn't reflect post-setup changes
|
|
256
257
|
const currentMap = await getCurrentRouteMap();
|
|
257
|
-
expect(currentMap['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
258
|
+
expect(currentMap.routes['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
258
259
|
|
|
259
260
|
// getRouteMapNextPageMap reads live overrides
|
|
260
261
|
const nextMap = await getRouteMapNextPageMap();
|
|
261
|
-
expect(nextMap['@openmrs/esm-foo']).toEqual({ pages: [{ component: 'new', route: '/new' }] });
|
|
262
|
+
expect(nextMap.routes['@openmrs/esm-foo']).toEqual({ pages: [{ component: 'new', route: '/new' }] });
|
|
262
263
|
});
|
|
263
264
|
});
|
|
264
265
|
|
|
@@ -276,7 +277,101 @@ describe('route-maps', () => {
|
|
|
276
277
|
await setupRouteMapOverrides();
|
|
277
278
|
|
|
278
279
|
const map = await getCurrentRouteMap();
|
|
279
|
-
expect(map['@openmrs/esm-foo']).toEqual({ pages: [{ component: 'v2', route: '/' }] });
|
|
280
|
+
expect(map.routes['@openmrs/esm-foo']).toEqual({ pages: [{ component: 'v2', route: '/' }] });
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
it('takes the first defined top-level version when merging', async () => {
|
|
284
|
+
(window as any).spaEnv = 'production';
|
|
285
|
+
vi.resetModules();
|
|
286
|
+
|
|
287
|
+
document.querySelectorAll("script[type='openmrs-routes']").forEach((el) => el.remove());
|
|
288
|
+
for (const registry of [
|
|
289
|
+
{ version: '1.0.0', routes: { '@openmrs/esm-foo': { pages: [] } } },
|
|
290
|
+
{ version: '2.0.0', routes: { '@openmrs/esm-bar': { pages: [] } } },
|
|
291
|
+
]) {
|
|
292
|
+
const script = document.createElement('script');
|
|
293
|
+
script.type = 'openmrs-routes';
|
|
294
|
+
script.textContent = JSON.stringify(registry);
|
|
295
|
+
document.head.appendChild(script);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
const { setupRouteMapOverrides, getCurrentRouteMap } = await import('./route-maps');
|
|
299
|
+
await setupRouteMapOverrides();
|
|
300
|
+
|
|
301
|
+
const map = await getCurrentRouteMap();
|
|
302
|
+
expect(map.version).toBe('1.0.0');
|
|
303
|
+
expect(map.routes['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
304
|
+
expect(map.routes['@openmrs/esm-bar']).toEqual({ pages: [] });
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
it('preserves the versioned registry version when a versionless map follows', async () => {
|
|
308
|
+
(window as any).spaEnv = 'production';
|
|
309
|
+
vi.resetModules();
|
|
310
|
+
|
|
311
|
+
document.querySelectorAll("script[type='openmrs-routes']").forEach((el) => el.remove());
|
|
312
|
+
for (const registry of [
|
|
313
|
+
{ version: '1.0.0', routes: { '@openmrs/esm-foo': { pages: [] } } },
|
|
314
|
+
{ routes: { '@openmrs/esm-core': { extensions: [] } } },
|
|
315
|
+
]) {
|
|
316
|
+
const script = document.createElement('script');
|
|
317
|
+
script.type = 'openmrs-routes';
|
|
318
|
+
script.textContent = JSON.stringify(registry);
|
|
319
|
+
document.head.appendChild(script);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const { setupRouteMapOverrides, getCurrentRouteMap } = await import('./route-maps');
|
|
323
|
+
await setupRouteMapOverrides();
|
|
324
|
+
|
|
325
|
+
const map = await getCurrentRouteMap();
|
|
326
|
+
expect(map.version).toBe('1.0.0');
|
|
327
|
+
expect(map.routes['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
328
|
+
expect(map.routes['@openmrs/esm-core']).toEqual({ extensions: [] });
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it('skips maps with no version and uses the first defined one', async () => {
|
|
332
|
+
(window as any).spaEnv = 'production';
|
|
333
|
+
vi.resetModules();
|
|
334
|
+
|
|
335
|
+
document.querySelectorAll("script[type='openmrs-routes']").forEach((el) => el.remove());
|
|
336
|
+
for (const registry of [
|
|
337
|
+
{ routes: { '@openmrs/esm-foo': { pages: [] } } },
|
|
338
|
+
{ version: '2.0.0', routes: { '@openmrs/esm-bar': { pages: [] } } },
|
|
339
|
+
]) {
|
|
340
|
+
const script = document.createElement('script');
|
|
341
|
+
script.type = 'openmrs-routes';
|
|
342
|
+
script.textContent = JSON.stringify(registry);
|
|
343
|
+
document.head.appendChild(script);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
const { setupRouteMapOverrides, getCurrentRouteMap } = await import('./route-maps');
|
|
347
|
+
await setupRouteMapOverrides();
|
|
348
|
+
|
|
349
|
+
const map = await getCurrentRouteMap();
|
|
350
|
+
expect(map.version).toBe('2.0.0');
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('ignores a route map script whose content is a JSON array', async () => {
|
|
354
|
+
(window as any).spaEnv = 'production';
|
|
355
|
+
vi.resetModules();
|
|
356
|
+
|
|
357
|
+
document.querySelectorAll("script[type='openmrs-routes']").forEach((el) => el.remove());
|
|
358
|
+
|
|
359
|
+
const good = document.createElement('script');
|
|
360
|
+
good.type = 'openmrs-routes';
|
|
361
|
+
good.textContent = JSON.stringify({ routes: { '@openmrs/esm-foo': { pages: [] } } });
|
|
362
|
+
document.head.appendChild(good);
|
|
363
|
+
|
|
364
|
+
const arrayScript = document.createElement('script');
|
|
365
|
+
arrayScript.type = 'openmrs-routes';
|
|
366
|
+
arrayScript.textContent = JSON.stringify([{ '@openmrs/esm-bar': { pages: [] } }]);
|
|
367
|
+
document.head.appendChild(arrayScript);
|
|
368
|
+
|
|
369
|
+
const { setupRouteMapOverrides, getCurrentRouteMap } = await import('./route-maps');
|
|
370
|
+
await setupRouteMapOverrides();
|
|
371
|
+
|
|
372
|
+
const map = await getCurrentRouteMap();
|
|
373
|
+
// An array-shaped registry must not pollute the merged routes.
|
|
374
|
+
expect(Object.keys(map.routes)).toEqual(['@openmrs/esm-foo']);
|
|
280
375
|
});
|
|
281
376
|
});
|
|
282
377
|
|
|
@@ -291,14 +386,14 @@ describe('route-maps', () => {
|
|
|
291
386
|
document.head.appendChild(script);
|
|
292
387
|
|
|
293
388
|
fetchMock.mockResponseOnce(
|
|
294
|
-
JSON.stringify({ '@openmrs/esm-remote': { pages: [{ component: 'root', route: '/remote' }] } }),
|
|
389
|
+
JSON.stringify({ routes: { '@openmrs/esm-remote': { pages: [{ component: 'root', route: '/remote' }] } } }),
|
|
295
390
|
);
|
|
296
391
|
|
|
297
392
|
const { setupRouteMapOverrides, getCurrentRouteMap } = await import('./route-maps');
|
|
298
393
|
await setupRouteMapOverrides();
|
|
299
394
|
|
|
300
395
|
const map = await getCurrentRouteMap();
|
|
301
|
-
expect(map['@openmrs/esm-remote']).toEqual({ pages: [{ component: 'root', route: '/remote' }] });
|
|
396
|
+
expect(map.routes['@openmrs/esm-remote']).toEqual({ pages: [{ component: 'root', route: '/remote' }] });
|
|
302
397
|
expect(fetchMock).toHaveBeenCalledWith('http://localhost/routes.json');
|
|
303
398
|
});
|
|
304
399
|
|
|
@@ -308,7 +403,7 @@ describe('route-maps', () => {
|
|
|
308
403
|
|
|
309
404
|
const inline = document.createElement('script');
|
|
310
405
|
inline.type = 'openmrs-routes';
|
|
311
|
-
inline.textContent = JSON.stringify({ '@openmrs/esm-inline': { extensions: [] } });
|
|
406
|
+
inline.textContent = JSON.stringify({ routes: { '@openmrs/esm-inline': { extensions: [] } } });
|
|
312
407
|
document.head.appendChild(inline);
|
|
313
408
|
|
|
314
409
|
const remote = document.createElement('script');
|
|
@@ -316,14 +411,14 @@ describe('route-maps', () => {
|
|
|
316
411
|
Object.defineProperty(remote, 'src', { value: 'http://localhost/routes.json', writable: false });
|
|
317
412
|
document.head.appendChild(remote);
|
|
318
413
|
|
|
319
|
-
fetchMock.mockResponseOnce(JSON.stringify({ '@openmrs/esm-remote': { pages: [] } }));
|
|
414
|
+
fetchMock.mockResponseOnce(JSON.stringify({ routes: { '@openmrs/esm-remote': { pages: [] } } }));
|
|
320
415
|
|
|
321
416
|
const { setupRouteMapOverrides, getCurrentRouteMap } = await import('./route-maps');
|
|
322
417
|
await setupRouteMapOverrides();
|
|
323
418
|
|
|
324
419
|
const map = await getCurrentRouteMap();
|
|
325
|
-
expect(map['@openmrs/esm-inline']).toEqual({ extensions: [] });
|
|
326
|
-
expect(map['@openmrs/esm-remote']).toEqual({ pages: [] });
|
|
420
|
+
expect(map.routes['@openmrs/esm-inline']).toEqual({ extensions: [] });
|
|
421
|
+
expect(map.routes['@openmrs/esm-remote']).toEqual({ pages: [] });
|
|
327
422
|
});
|
|
328
423
|
|
|
329
424
|
it('skips remote route maps that fail to fetch', async () => {
|
|
@@ -334,7 +429,7 @@ describe('route-maps', () => {
|
|
|
334
429
|
|
|
335
430
|
const good = document.createElement('script');
|
|
336
431
|
good.type = 'openmrs-routes';
|
|
337
|
-
good.textContent = JSON.stringify({ '@openmrs/esm-foo': { pages: [] } });
|
|
432
|
+
good.textContent = JSON.stringify({ routes: { '@openmrs/esm-foo': { pages: [] } } });
|
|
338
433
|
document.head.appendChild(good);
|
|
339
434
|
|
|
340
435
|
const bad = document.createElement('script');
|
|
@@ -348,8 +443,8 @@ describe('route-maps', () => {
|
|
|
348
443
|
await setupRouteMapOverrides();
|
|
349
444
|
|
|
350
445
|
const map = await getCurrentRouteMap();
|
|
351
|
-
expect(map['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
352
|
-
expect(map['@openmrs/esm-broken']).toBeUndefined();
|
|
446
|
+
expect(map.routes['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
447
|
+
expect(map.routes['@openmrs/esm-broken']).toBeUndefined();
|
|
353
448
|
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Failed to parse routes'), expect.anything());
|
|
354
449
|
});
|
|
355
450
|
|
|
@@ -370,7 +465,7 @@ describe('route-maps', () => {
|
|
|
370
465
|
await setupRouteMapOverrides();
|
|
371
466
|
|
|
372
467
|
const map = await getCurrentRouteMap();
|
|
373
|
-
expect(Object.keys(map)).toHaveLength(0);
|
|
468
|
+
expect(Object.keys(map.routes)).toHaveLength(0);
|
|
374
469
|
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Failed to parse routes'), expect.anything());
|
|
375
470
|
});
|
|
376
471
|
|
|
@@ -389,7 +484,7 @@ describe('route-maps', () => {
|
|
|
389
484
|
await setupRouteMapOverrides();
|
|
390
485
|
|
|
391
486
|
const map = await getCurrentRouteMap();
|
|
392
|
-
expect(Object.keys(map)).toHaveLength(0);
|
|
487
|
+
expect(Object.keys(map.routes)).toHaveLength(0);
|
|
393
488
|
});
|
|
394
489
|
|
|
395
490
|
it('skips malformed inline route map script tags', async () => {
|
|
@@ -400,7 +495,7 @@ describe('route-maps', () => {
|
|
|
400
495
|
|
|
401
496
|
const good = document.createElement('script');
|
|
402
497
|
good.type = 'openmrs-routes';
|
|
403
|
-
good.textContent = JSON.stringify({ '@openmrs/esm-foo': { pages: [] } });
|
|
498
|
+
good.textContent = JSON.stringify({ routes: { '@openmrs/esm-foo': { pages: [] } } });
|
|
404
499
|
document.head.appendChild(good);
|
|
405
500
|
|
|
406
501
|
const bad = document.createElement('script');
|
|
@@ -412,7 +507,7 @@ describe('route-maps', () => {
|
|
|
412
507
|
await setupRouteMapOverrides();
|
|
413
508
|
|
|
414
509
|
const map = await getCurrentRouteMap();
|
|
415
|
-
expect(map['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
510
|
+
expect(map.routes['@openmrs/esm-foo']).toEqual({ pages: [] });
|
|
416
511
|
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Failed to parse routes'), expect.anything());
|
|
417
512
|
});
|
|
418
513
|
|
|
@@ -428,7 +523,7 @@ describe('route-maps', () => {
|
|
|
428
523
|
await setupRouteMapOverrides();
|
|
429
524
|
|
|
430
525
|
const map = await getCurrentRouteMap();
|
|
431
|
-
expect(map['@openmrs/esm-foo']).toBeUndefined();
|
|
526
|
+
expect(map.routes['@openmrs/esm-foo']).toBeUndefined();
|
|
432
527
|
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Failed to load route override'), expect.anything());
|
|
433
528
|
});
|
|
434
529
|
|
|
@@ -444,7 +539,7 @@ describe('route-maps', () => {
|
|
|
444
539
|
await setupRouteMapOverrides();
|
|
445
540
|
|
|
446
541
|
const map = await getCurrentRouteMap();
|
|
447
|
-
expect(map['@openmrs/esm-foo']).toBeUndefined();
|
|
542
|
+
expect(map.routes['@openmrs/esm-foo']).toBeUndefined();
|
|
448
543
|
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Failed to load route override'), expect.anything());
|
|
449
544
|
});
|
|
450
545
|
|
|
@@ -459,7 +554,7 @@ describe('route-maps', () => {
|
|
|
459
554
|
await setupRouteMapOverrides();
|
|
460
555
|
|
|
461
556
|
const map = await getCurrentRouteMap();
|
|
462
|
-
expect(map['@openmrs/esm-foo']).toBeUndefined();
|
|
557
|
+
expect(map.routes['@openmrs/esm-foo']).toBeUndefined();
|
|
463
558
|
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Failed to load route override'), expect.anything());
|
|
464
559
|
});
|
|
465
560
|
|
|
@@ -474,7 +569,7 @@ describe('route-maps', () => {
|
|
|
474
569
|
await setupRouteMapOverrides();
|
|
475
570
|
|
|
476
571
|
const map = await getCurrentRouteMap();
|
|
477
|
-
expect(map['@openmrs/esm-foo']).toBeUndefined();
|
|
572
|
+
expect(map.routes['@openmrs/esm-foo']).toBeUndefined();
|
|
478
573
|
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Failed to load route override'), expect.anything());
|
|
479
574
|
});
|
|
480
575
|
});
|
package/src/route-maps.ts
CHANGED
|
@@ -43,10 +43,14 @@ async function readBaseMap(): Promise<OpenmrsRoutes> {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
function mergeRouteMaps(maps: OpenmrsRoutes[]): OpenmrsRoutes {
|
|
46
|
-
const merged: OpenmrsRoutes = {};
|
|
46
|
+
const merged: OpenmrsRoutes = { routes: {} };
|
|
47
47
|
for (const map of maps) {
|
|
48
|
-
if (map && typeof map === 'object') {
|
|
49
|
-
Object.assign(merged, map);
|
|
48
|
+
if (map && typeof map === 'object' && !Array.isArray(map)) {
|
|
49
|
+
Object.assign(merged.routes, map.routes);
|
|
50
|
+
|
|
51
|
+
if (merged.version === undefined && map.version !== undefined) {
|
|
52
|
+
merged.version = map.version;
|
|
53
|
+
}
|
|
50
54
|
}
|
|
51
55
|
}
|
|
52
56
|
return merged;
|
|
@@ -57,7 +61,7 @@ function mergeRouteMaps(maps: OpenmrsRoutes[]): OpenmrsRoutes {
|
|
|
57
61
|
* This is async because URL-valued overrides need to be fetched.
|
|
58
62
|
*/
|
|
59
63
|
async function readOverrideMap(): Promise<OpenmrsRoutes> {
|
|
60
|
-
const result: OpenmrsRoutes = {};
|
|
64
|
+
const result: OpenmrsRoutes = { version: undefined, routes: {} };
|
|
61
65
|
|
|
62
66
|
try {
|
|
63
67
|
const entries: Array<{ moduleName: string; raw: string }> = [];
|
|
@@ -94,7 +98,7 @@ async function readOverrideMap(): Promise<OpenmrsRoutes> {
|
|
|
94
98
|
|
|
95
99
|
for (const entry of settled) {
|
|
96
100
|
if (entry.status === 'fulfilled') {
|
|
97
|
-
result[entry.value.moduleName] = entry.value.routes;
|
|
101
|
+
result['routes'][entry.value.moduleName] = entry.value.routes;
|
|
98
102
|
} else {
|
|
99
103
|
console.warn('[route-maps] Failed to load route override', entry.reason);
|
|
100
104
|
}
|