@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.
@@ -1,3 +1,3 @@
1
- [0] Successfully compiled: 5 files with swc (236.95ms)
1
+ [0] Successfully compiled: 5 files with swc (278.23ms)
2
2
  [0] swc --strip-leading-paths src -d dist exited with code 0
3
3
  [1] tsc --project tsconfig.build.json exited with code 0
@@ -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;AA2GtH;;;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"}
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"}
@@ -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.5186",
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.5186",
57
- "@openmrs/esm-translations": "^10.0.1-pre.5186"
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.5186",
61
- "@openmrs/esm-translations": "10.0.1-pre.5186",
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",
@@ -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
- script.textContent = JSON.stringify(map);
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
  }