@open-mercato/cli 0.5.1-develop.2652.0276e72e45 → 0.5.1-develop.2657.a01847a9fa
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/dist/agentic/guides/ui.md +97 -0
- package/dist/lib/generators/module-registry.js +22 -4
- package/dist/lib/generators/module-registry.js.map +2 -2
- package/package.json +5 -5
- package/src/lib/generators/__tests__/module-subset.test.ts +6 -6
- package/src/lib/generators/__tests__/output-snapshots.test.ts +3 -1
- package/src/lib/generators/module-registry.ts +28 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/cli",
|
|
3
|
-
"version": "0.5.1-develop.
|
|
3
|
+
"version": "0.5.1-develop.2657.a01847a9fa",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
"@mikro-orm/core": "^6.6.10",
|
|
59
59
|
"@mikro-orm/migrations": "^6.6.10",
|
|
60
60
|
"@mikro-orm/postgresql": "^6.6.10",
|
|
61
|
-
"@open-mercato/queue": "0.5.1-develop.
|
|
62
|
-
"@open-mercato/shared": "0.5.1-develop.
|
|
61
|
+
"@open-mercato/queue": "0.5.1-develop.2657.a01847a9fa",
|
|
62
|
+
"@open-mercato/shared": "0.5.1-develop.2657.a01847a9fa",
|
|
63
63
|
"cross-spawn": "^7.0.6",
|
|
64
64
|
"pg": "8.20.0",
|
|
65
65
|
"semver": "^7.7.4",
|
|
@@ -69,10 +69,10 @@
|
|
|
69
69
|
"typescript": "^5.9.3"
|
|
70
70
|
},
|
|
71
71
|
"peerDependencies": {
|
|
72
|
-
"@open-mercato/shared": "0.5.1-develop.
|
|
72
|
+
"@open-mercato/shared": "0.5.1-develop.2657.a01847a9fa"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
|
-
"@open-mercato/shared": "0.5.1-develop.
|
|
75
|
+
"@open-mercato/shared": "0.5.1-develop.2657.a01847a9fa",
|
|
76
76
|
"@types/jest": "^30.0.0",
|
|
77
77
|
"jest": "^30.3.0",
|
|
78
78
|
"ts-jest": "^29.4.9"
|
|
@@ -278,8 +278,8 @@ describe('generateModuleRegistry with module subsets', () => {
|
|
|
278
278
|
{
|
|
279
279
|
id: "orders",
|
|
280
280
|
info: I0_orders.metadata,
|
|
281
|
-
frontendRoutes: [{ pattern: "/", requireAuth: ((CM2_orders_index as any).metadata)?.requireAuth, requireRoles: ((CM2_orders_index as any).metadata)?.requireRoles, requireFeatures: ((CM2_orders_index as any).metadata)?.requireFeatures, requireCustomerAuth: ((CM2_orders_index as any).metadata)?.requireCustomerAuth, requireCustomerFeatures: ((CM2_orders_index as any).metadata)?.requireCustomerFeatures, title: ((CM2_orders_index as any).metadata)?.pageTitle ?? ((CM2_orders_index as any).metadata)?.title, titleKey: ((CM2_orders_index as any).metadata)?.pageTitleKey ?? ((CM2_orders_index as any).metadata)?.titleKey, group: ((CM2_orders_index as any).metadata)?.pageGroup ?? ((CM2_orders_index as any).metadata)?.group, groupKey: ((CM2_orders_index as any).metadata)?.pageGroupKey ?? ((CM2_orders_index as any).metadata)?.groupKey, icon: ((CM2_orders_index as any).metadata)?.icon, order: ((CM2_orders_index as any).metadata)?.pageOrder ?? ((CM2_orders_index as any).metadata)?.order, priority: ((CM2_orders_index as any).metadata)?.pagePriority ?? ((CM2_orders_index as any).metadata)?.priority, navHidden: ((CM2_orders_index as any).metadata)?.navHidden, visible: ((CM2_orders_index as any).metadata)?.visible, enabled: ((CM2_orders_index as any).metadata)?.enabled, breadcrumb: ((CM2_orders_index as any).metadata)?.breadcrumb, pageContext: ((CM2_orders_index as any).metadata)?.pageContext, placement: ((CM2_orders_index as any).metadata)?.placement, Component: C1_orders_index }],
|
|
282
|
-
backendRoutes: [{ pattern: "/backend/orders", requireAuth: ((BM6_orders_index as any).metadata)?.requireAuth, requireRoles: ((BM6_orders_index as any).metadata)?.requireRoles, requireFeatures: ((BM6_orders_index as any).metadata)?.requireFeatures, requireCustomerAuth: ((BM6_orders_index as any).metadata)?.requireCustomerAuth, requireCustomerFeatures: ((BM6_orders_index as any).metadata)?.requireCustomerFeatures, title: ((BM6_orders_index as any).metadata)?.pageTitle ?? ((BM6_orders_index as any).metadata)?.title, titleKey: ((BM6_orders_index as any).metadata)?.pageTitleKey ?? ((BM6_orders_index as any).metadata)?.titleKey, group: ((BM6_orders_index as any).metadata)?.pageGroup ?? ((BM6_orders_index as any).metadata)?.group, groupKey: ((BM6_orders_index as any).metadata)?.pageGroupKey ?? ((BM6_orders_index as any).metadata)?.groupKey, icon: ((BM6_orders_index as any).metadata)?.icon, order: ((BM6_orders_index as any).metadata)?.pageOrder ?? ((BM6_orders_index as any).metadata)?.order, priority: ((BM6_orders_index as any).metadata)?.pagePriority ?? ((BM6_orders_index as any).metadata)?.priority, navHidden: ((BM6_orders_index as any).metadata)?.navHidden, visible: ((BM6_orders_index as any).metadata)?.visible, enabled: ((BM6_orders_index as any).metadata)?.enabled, breadcrumb: ((BM6_orders_index as any).metadata)?.breadcrumb, pageContext: ((BM6_orders_index as any).metadata)?.pageContext, placement: ((BM6_orders_index as any).metadata)?.placement, Component: B5_orders_index }],
|
|
281
|
+
frontendRoutes: [{ pattern: "/", requireAuth: ((CM2_orders_index as any).metadata)?.requireAuth, requireRoles: ((CM2_orders_index as any).metadata)?.requireRoles, requireFeatures: ((CM2_orders_index as any).metadata)?.requireFeatures, requireCustomerAuth: ((CM2_orders_index as any).metadata)?.requireCustomerAuth, requireCustomerFeatures: ((CM2_orders_index as any).metadata)?.requireCustomerFeatures, nav: ((CM2_orders_index as any).metadata)?.nav, title: ((CM2_orders_index as any).metadata)?.pageTitle ?? ((CM2_orders_index as any).metadata)?.title, titleKey: ((CM2_orders_index as any).metadata)?.pageTitleKey ?? ((CM2_orders_index as any).metadata)?.titleKey, group: ((CM2_orders_index as any).metadata)?.pageGroup ?? ((CM2_orders_index as any).metadata)?.group, groupKey: ((CM2_orders_index as any).metadata)?.pageGroupKey ?? ((CM2_orders_index as any).metadata)?.groupKey, icon: ((CM2_orders_index as any).metadata)?.icon, order: ((CM2_orders_index as any).metadata)?.pageOrder ?? ((CM2_orders_index as any).metadata)?.order, priority: ((CM2_orders_index as any).metadata)?.pagePriority ?? ((CM2_orders_index as any).metadata)?.priority, navHidden: ((CM2_orders_index as any).metadata)?.navHidden, visible: ((CM2_orders_index as any).metadata)?.visible, enabled: ((CM2_orders_index as any).metadata)?.enabled, breadcrumb: ((CM2_orders_index as any).metadata)?.breadcrumb, pageContext: ((CM2_orders_index as any).metadata)?.pageContext, placement: ((CM2_orders_index as any).metadata)?.placement, Component: C1_orders_index }],
|
|
282
|
+
backendRoutes: [{ pattern: "/backend/orders", requireAuth: ((BM6_orders_index as any).metadata)?.requireAuth, requireRoles: ((BM6_orders_index as any).metadata)?.requireRoles, requireFeatures: ((BM6_orders_index as any).metadata)?.requireFeatures, requireCustomerAuth: ((BM6_orders_index as any).metadata)?.requireCustomerAuth, requireCustomerFeatures: ((BM6_orders_index as any).metadata)?.requireCustomerFeatures, nav: ((BM6_orders_index as any).metadata)?.nav, title: ((BM6_orders_index as any).metadata)?.pageTitle ?? ((BM6_orders_index as any).metadata)?.title, titleKey: ((BM6_orders_index as any).metadata)?.pageTitleKey ?? ((BM6_orders_index as any).metadata)?.titleKey, group: ((BM6_orders_index as any).metadata)?.pageGroup ?? ((BM6_orders_index as any).metadata)?.group, groupKey: ((BM6_orders_index as any).metadata)?.pageGroupKey ?? ((BM6_orders_index as any).metadata)?.groupKey, icon: ((BM6_orders_index as any).metadata)?.icon, order: ((BM6_orders_index as any).metadata)?.pageOrder ?? ((BM6_orders_index as any).metadata)?.order, priority: ((BM6_orders_index as any).metadata)?.pagePriority ?? ((BM6_orders_index as any).metadata)?.priority, navHidden: ((BM6_orders_index as any).metadata)?.navHidden, visible: ((BM6_orders_index as any).metadata)?.visible, enabled: ((BM6_orders_index as any).metadata)?.enabled, breadcrumb: ((BM6_orders_index as any).metadata)?.breadcrumb, pageContext: ((BM6_orders_index as any).metadata)?.pageContext, placement: ((BM6_orders_index as any).metadata)?.placement, Component: B5_orders_index }],
|
|
283
283
|
apis: [{ path: ((R9_orders_orders as any).metadata?.path ?? "/orders/orders"), metadata: (R9_orders_orders as any).metadata, handlers: R9_orders_orders as any }],
|
|
284
284
|
|
|
285
285
|
|
|
@@ -311,8 +311,8 @@ describe('generateModuleRegistry with module subsets', () => {
|
|
|
311
311
|
{
|
|
312
312
|
id: "orders",
|
|
313
313
|
info: I0_orders.metadata,
|
|
314
|
-
frontendRoutes: [{ pattern: "/", requireAuth: ((((MRuntime3_orders_index as any).metadata) as any))?.requireAuth, requireRoles: ((((MRuntime3_orders_index as any).metadata) as any))?.requireRoles, requireFeatures: ((((MRuntime3_orders_index as any).metadata) as any))?.requireFeatures, requireCustomerAuth: ((((MRuntime3_orders_index as any).metadata) as any))?.requireCustomerAuth, requireCustomerFeatures: ((((MRuntime3_orders_index as any).metadata) as any))?.requireCustomerFeatures, title: ((((MRuntime3_orders_index as any).metadata) as any))?.pageTitle ?? ((((MRuntime3_orders_index as any).metadata) as any))?.title, titleKey: ((((MRuntime3_orders_index as any).metadata) as any))?.pageTitleKey ?? ((((MRuntime3_orders_index as any).metadata) as any))?.titleKey, group: ((((MRuntime3_orders_index as any).metadata) as any))?.pageGroup ?? ((((MRuntime3_orders_index as any).metadata) as any))?.group, groupKey: ((((MRuntime3_orders_index as any).metadata) as any))?.pageGroupKey ?? ((((MRuntime3_orders_index as any).metadata) as any))?.groupKey, icon: ((((MRuntime3_orders_index as any).metadata) as any))?.icon, order: ((((MRuntime3_orders_index as any).metadata) as any))?.pageOrder ?? ((((MRuntime3_orders_index as any).metadata) as any))?.order, priority: ((((MRuntime3_orders_index as any).metadata) as any))?.pagePriority ?? ((((MRuntime3_orders_index as any).metadata) as any))?.priority, navHidden: ((((MRuntime3_orders_index as any).metadata) as any))?.navHidden, visible: ((((MRuntime3_orders_index as any).metadata) as any))?.visible, enabled: ((((MRuntime3_orders_index as any).metadata) as any))?.enabled, breadcrumb: ((((MRuntime3_orders_index as any).metadata) as any))?.breadcrumb, pageContext: ((((MRuntime3_orders_index as any).metadata) as any))?.pageContext, placement: ((((MRuntime3_orders_index as any).metadata) as any))?.placement, Component: async (props: any) => { const mod = await import("@open-mercato/core/modules/orders/frontend/page"); const Component = (mod.default ?? mod) as any; return createElement(Component, props) } }],
|
|
315
|
-
backendRoutes: [{ pattern: "/backend/orders", requireAuth: ((((BMRuntime7_orders_index as any).metadata) as any))?.requireAuth, requireRoles: ((((BMRuntime7_orders_index as any).metadata) as any))?.requireRoles, requireFeatures: ((((BMRuntime7_orders_index as any).metadata) as any))?.requireFeatures, requireCustomerAuth: ((((BMRuntime7_orders_index as any).metadata) as any))?.requireCustomerAuth, requireCustomerFeatures: ((((BMRuntime7_orders_index as any).metadata) as any))?.requireCustomerFeatures, title: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageTitle ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.title, titleKey: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageTitleKey ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.titleKey, group: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageGroup ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.group, groupKey: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageGroupKey ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.groupKey, icon: ((((BMRuntime7_orders_index as any).metadata) as any))?.icon, order: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageOrder ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.order, priority: ((((BMRuntime7_orders_index as any).metadata) as any))?.pagePriority ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.priority, navHidden: ((((BMRuntime7_orders_index as any).metadata) as any))?.navHidden, visible: ((((BMRuntime7_orders_index as any).metadata) as any))?.visible, enabled: ((((BMRuntime7_orders_index as any).metadata) as any))?.enabled, breadcrumb: ((((BMRuntime7_orders_index as any).metadata) as any))?.breadcrumb, pageContext: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageContext, placement: ((((BMRuntime7_orders_index as any).metadata) as any))?.placement, Component: async (props: any) => { const mod = await import("@open-mercato/core/modules/orders/backend/page"); const Component = (mod.default ?? mod) as any; return createElement(Component, props) } }],
|
|
314
|
+
frontendRoutes: [{ pattern: "/", requireAuth: ((((MRuntime3_orders_index as any).metadata) as any))?.requireAuth, requireRoles: ((((MRuntime3_orders_index as any).metadata) as any))?.requireRoles, requireFeatures: ((((MRuntime3_orders_index as any).metadata) as any))?.requireFeatures, requireCustomerAuth: ((((MRuntime3_orders_index as any).metadata) as any))?.requireCustomerAuth, requireCustomerFeatures: ((((MRuntime3_orders_index as any).metadata) as any))?.requireCustomerFeatures, nav: ((((MRuntime3_orders_index as any).metadata) as any))?.nav, title: ((((MRuntime3_orders_index as any).metadata) as any))?.pageTitle ?? ((((MRuntime3_orders_index as any).metadata) as any))?.title, titleKey: ((((MRuntime3_orders_index as any).metadata) as any))?.pageTitleKey ?? ((((MRuntime3_orders_index as any).metadata) as any))?.titleKey, group: ((((MRuntime3_orders_index as any).metadata) as any))?.pageGroup ?? ((((MRuntime3_orders_index as any).metadata) as any))?.group, groupKey: ((((MRuntime3_orders_index as any).metadata) as any))?.pageGroupKey ?? ((((MRuntime3_orders_index as any).metadata) as any))?.groupKey, icon: ((((MRuntime3_orders_index as any).metadata) as any))?.icon, order: ((((MRuntime3_orders_index as any).metadata) as any))?.pageOrder ?? ((((MRuntime3_orders_index as any).metadata) as any))?.order, priority: ((((MRuntime3_orders_index as any).metadata) as any))?.pagePriority ?? ((((MRuntime3_orders_index as any).metadata) as any))?.priority, navHidden: ((((MRuntime3_orders_index as any).metadata) as any))?.navHidden, visible: ((((MRuntime3_orders_index as any).metadata) as any))?.visible, enabled: ((((MRuntime3_orders_index as any).metadata) as any))?.enabled, breadcrumb: ((((MRuntime3_orders_index as any).metadata) as any))?.breadcrumb, pageContext: ((((MRuntime3_orders_index as any).metadata) as any))?.pageContext, placement: ((((MRuntime3_orders_index as any).metadata) as any))?.placement, Component: async (props: any) => { const mod = await import("@open-mercato/core/modules/orders/frontend/page"); const Component = (mod.default ?? mod) as any; return createElement(Component, props) } }],
|
|
315
|
+
backendRoutes: [{ pattern: "/backend/orders", requireAuth: ((((BMRuntime7_orders_index as any).metadata) as any))?.requireAuth, requireRoles: ((((BMRuntime7_orders_index as any).metadata) as any))?.requireRoles, requireFeatures: ((((BMRuntime7_orders_index as any).metadata) as any))?.requireFeatures, requireCustomerAuth: ((((BMRuntime7_orders_index as any).metadata) as any))?.requireCustomerAuth, requireCustomerFeatures: ((((BMRuntime7_orders_index as any).metadata) as any))?.requireCustomerFeatures, nav: ((((BMRuntime7_orders_index as any).metadata) as any))?.nav, title: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageTitle ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.title, titleKey: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageTitleKey ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.titleKey, group: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageGroup ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.group, groupKey: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageGroupKey ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.groupKey, icon: ((((BMRuntime7_orders_index as any).metadata) as any))?.icon, order: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageOrder ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.order, priority: ((((BMRuntime7_orders_index as any).metadata) as any))?.pagePriority ?? ((((BMRuntime7_orders_index as any).metadata) as any))?.priority, navHidden: ((((BMRuntime7_orders_index as any).metadata) as any))?.navHidden, visible: ((((BMRuntime7_orders_index as any).metadata) as any))?.visible, enabled: ((((BMRuntime7_orders_index as any).metadata) as any))?.enabled, breadcrumb: ((((BMRuntime7_orders_index as any).metadata) as any))?.breadcrumb, pageContext: ((((BMRuntime7_orders_index as any).metadata) as any))?.pageContext, placement: ((((BMRuntime7_orders_index as any).metadata) as any))?.placement, Component: async (props: any) => { const mod = await import("@open-mercato/core/modules/orders/backend/page"); const Component = (mod.default ?? mod) as any; return createElement(Component, props) } }],
|
|
316
316
|
apis: [{ path: "/orders/orders", metadata: undefined, handlers: { GET: async (req: Request, ctx?: any) => { const mod = await import("@open-mercato/core/modules/orders/api/orders/route"); return (mod as any).GET(req, ctx) } } }],
|
|
317
317
|
|
|
318
318
|
|
|
@@ -335,7 +335,7 @@ describe('generateModuleRegistry with module subsets', () => {
|
|
|
335
335
|
import type { FrontendRouteManifestEntry } from '@open-mercato/shared/modules/registry'
|
|
336
336
|
|
|
337
337
|
export const frontendRoutes: FrontendRouteManifestEntry[] = [
|
|
338
|
-
{ moduleId: "orders", pattern: "/", requireAuth: ((undefined as any))?.requireAuth, requireRoles: ((undefined as any))?.requireRoles, requireFeatures: ((undefined as any))?.requireFeatures, requireCustomerAuth: ((undefined as any))?.requireCustomerAuth, requireCustomerFeatures: ((undefined as any))?.requireCustomerFeatures, title: ((undefined as any))?.pageTitle ?? ((undefined as any))?.title, titleKey: ((undefined as any))?.pageTitleKey ?? ((undefined as any))?.titleKey, group: ((undefined as any))?.pageGroup ?? ((undefined as any))?.group, groupKey: ((undefined as any))?.pageGroupKey ?? ((undefined as any))?.groupKey, icon: ((undefined as any))?.icon, order: ((undefined as any))?.pageOrder ?? ((undefined as any))?.order, priority: ((undefined as any))?.pagePriority ?? ((undefined as any))?.priority, navHidden: ((undefined as any))?.navHidden, visible: ((undefined as any))?.visible, enabled: ((undefined as any))?.enabled, breadcrumb: ((undefined as any))?.breadcrumb, pageContext: ((undefined as any))?.pageContext, placement: ((undefined as any))?.placement, load: async () => { const mod = await import("@open-mercato/core/modules/orders/frontend/page"); return (mod.default ?? mod) as any } }
|
|
338
|
+
{ moduleId: "orders", pattern: "/", requireAuth: ((undefined as any))?.requireAuth, requireRoles: ((undefined as any))?.requireRoles, requireFeatures: ((undefined as any))?.requireFeatures, requireCustomerAuth: ((undefined as any))?.requireCustomerAuth, requireCustomerFeatures: ((undefined as any))?.requireCustomerFeatures, nav: ((undefined as any))?.nav, title: ((undefined as any))?.pageTitle ?? ((undefined as any))?.title, titleKey: ((undefined as any))?.pageTitleKey ?? ((undefined as any))?.titleKey, group: ((undefined as any))?.pageGroup ?? ((undefined as any))?.group, groupKey: ((undefined as any))?.pageGroupKey ?? ((undefined as any))?.groupKey, icon: ((undefined as any))?.icon, order: ((undefined as any))?.pageOrder ?? ((undefined as any))?.order, priority: ((undefined as any))?.pagePriority ?? ((undefined as any))?.priority, navHidden: ((undefined as any))?.navHidden, visible: ((undefined as any))?.visible, enabled: ((undefined as any))?.enabled, breadcrumb: ((undefined as any))?.breadcrumb, pageContext: ((undefined as any))?.pageContext, placement: ((undefined as any))?.placement, load: async () => { const mod = await import("@open-mercato/core/modules/orders/frontend/page"); return (mod.default ?? mod) as any } }
|
|
339
339
|
]
|
|
340
340
|
|
|
341
341
|
export default frontendRoutes
|
|
@@ -345,7 +345,7 @@ describe('generateModuleRegistry with module subsets', () => {
|
|
|
345
345
|
import type { BackendRouteManifestEntry } from '@open-mercato/shared/modules/registry'
|
|
346
346
|
|
|
347
347
|
export const backendRoutes: BackendRouteManifestEntry[] = [
|
|
348
|
-
{ moduleId: "orders", pattern: "/backend/orders", requireAuth: ((undefined as any))?.requireAuth, requireRoles: ((undefined as any))?.requireRoles, requireFeatures: ((undefined as any))?.requireFeatures, requireCustomerAuth: ((undefined as any))?.requireCustomerAuth, requireCustomerFeatures: ((undefined as any))?.requireCustomerFeatures, title: ((undefined as any))?.pageTitle ?? ((undefined as any))?.title, titleKey: ((undefined as any))?.pageTitleKey ?? ((undefined as any))?.titleKey, group: ((undefined as any))?.pageGroup ?? ((undefined as any))?.group, groupKey: ((undefined as any))?.pageGroupKey ?? ((undefined as any))?.groupKey, icon: ((undefined as any))?.icon, order: ((undefined as any))?.pageOrder ?? ((undefined as any))?.order, priority: ((undefined as any))?.pagePriority ?? ((undefined as any))?.priority, navHidden: ((undefined as any))?.navHidden, visible: ((undefined as any))?.visible, enabled: ((undefined as any))?.enabled, breadcrumb: ((undefined as any))?.breadcrumb, pageContext: ((undefined as any))?.pageContext, placement: ((undefined as any))?.placement, load: async () => { const mod = await import("@open-mercato/core/modules/orders/backend/page"); return (mod.default ?? mod) as any } }
|
|
348
|
+
{ moduleId: "orders", pattern: "/backend/orders", requireAuth: ((undefined as any))?.requireAuth, requireRoles: ((undefined as any))?.requireRoles, requireFeatures: ((undefined as any))?.requireFeatures, requireCustomerAuth: ((undefined as any))?.requireCustomerAuth, requireCustomerFeatures: ((undefined as any))?.requireCustomerFeatures, nav: ((undefined as any))?.nav, title: ((undefined as any))?.pageTitle ?? ((undefined as any))?.title, titleKey: ((undefined as any))?.pageTitleKey ?? ((undefined as any))?.titleKey, group: ((undefined as any))?.pageGroup ?? ((undefined as any))?.group, groupKey: ((undefined as any))?.pageGroupKey ?? ((undefined as any))?.groupKey, icon: ((undefined as any))?.icon, order: ((undefined as any))?.pageOrder ?? ((undefined as any))?.order, priority: ((undefined as any))?.pagePriority ?? ((undefined as any))?.priority, navHidden: ((undefined as any))?.navHidden, visible: ((undefined as any))?.visible, enabled: ((undefined as any))?.enabled, breadcrumb: ((undefined as any))?.breadcrumb, pageContext: ((undefined as any))?.pageContext, placement: ((undefined as any))?.placement, load: async () => { const mod = await import("@open-mercato/core/modules/orders/backend/page"); return (mod.default ?? mod) as any } }
|
|
349
349
|
]
|
|
350
350
|
|
|
351
351
|
export default backendRoutes
|
|
@@ -773,10 +773,12 @@ describe('generator output compatibility', () => {
|
|
|
773
773
|
const content = readGenerated('bootstrap-registrations.generated.ts')
|
|
774
774
|
expect(content).not.toBeNull()
|
|
775
775
|
expect(content).toContain(`import { backendRoutes } from "./backend-routes.generated"`)
|
|
776
|
+
expect(content).toContain(`import { frontendRoutes } from "./frontend-routes.generated"`)
|
|
776
777
|
expect(content).toContain(
|
|
777
|
-
`import { registerBackendRouteManifests } from '@open-mercato/shared/modules/registry'`,
|
|
778
|
+
`import { registerBackendRouteManifests, registerFrontendRouteManifests } from '@open-mercato/shared/modules/registry'`,
|
|
778
779
|
)
|
|
779
780
|
expect(content).toMatch(/export function runBootstrapRegistrations\(\): void \{[\s\S]*registerBackendRouteManifests\(backendRoutes\)[\s\S]*\}/)
|
|
781
|
+
expect(content).toMatch(/export function runBootstrapRegistrations\(\): void \{[\s\S]*registerFrontendRouteManifests\(frontendRoutes\)[\s\S]*\}/)
|
|
780
782
|
})
|
|
781
783
|
|
|
782
784
|
it('bootstrap-registrations includes backend routes alongside plugin hooks', async () => {
|
|
@@ -130,6 +130,13 @@ type SerializablePageMetadata = {
|
|
|
130
130
|
sectionLabelKey?: string
|
|
131
131
|
order?: number
|
|
132
132
|
}
|
|
133
|
+
nav?: {
|
|
134
|
+
label: string
|
|
135
|
+
labelKey?: string
|
|
136
|
+
group?: 'main' | 'account'
|
|
137
|
+
order?: number
|
|
138
|
+
icon?: string
|
|
139
|
+
}
|
|
133
140
|
icon?: string
|
|
134
141
|
}
|
|
135
142
|
|
|
@@ -941,7 +948,7 @@ function detectExportedHttpMethods(sourceFile: string): HttpMethod[] {
|
|
|
941
948
|
}
|
|
942
949
|
|
|
943
950
|
function buildPageRouteProps(metaExpr: string, routePath: string): string {
|
|
944
|
-
return `pattern: ${toLiteral(routePath || '/')}, requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, requireCustomerAuth: (${metaExpr})?.requireCustomerAuth, requireCustomerFeatures: (${metaExpr})?.requireCustomerFeatures, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, pageContext: (${metaExpr})?.pageContext, placement: (${metaExpr})?.placement`
|
|
951
|
+
return `pattern: ${toLiteral(routePath || '/')}, requireAuth: (${metaExpr})?.requireAuth, requireRoles: (${metaExpr})?.requireRoles, requireFeatures: (${metaExpr})?.requireFeatures, requireCustomerAuth: (${metaExpr})?.requireCustomerAuth, requireCustomerFeatures: (${metaExpr})?.requireCustomerFeatures, nav: (${metaExpr})?.nav, title: (${metaExpr})?.pageTitle ?? (${metaExpr})?.title, titleKey: (${metaExpr})?.pageTitleKey ?? (${metaExpr})?.titleKey, group: (${metaExpr})?.pageGroup ?? (${metaExpr})?.group, groupKey: (${metaExpr})?.pageGroupKey ?? (${metaExpr})?.groupKey, icon: (${metaExpr})?.icon, order: (${metaExpr})?.pageOrder ?? (${metaExpr})?.order, priority: (${metaExpr})?.pagePriority ?? (${metaExpr})?.priority, navHidden: (${metaExpr})?.navHidden, visible: (${metaExpr})?.visible, enabled: (${metaExpr})?.enabled, breadcrumb: (${metaExpr})?.breadcrumb, pageContext: (${metaExpr})?.pageContext, placement: (${metaExpr})?.placement`
|
|
945
952
|
}
|
|
946
953
|
|
|
947
954
|
function normalizeBreadcrumb(raw: unknown): SerializablePageMetadata['breadcrumb'] {
|
|
@@ -973,6 +980,20 @@ function normalizePlacement(raw: unknown): SerializablePageMetadata['placement']
|
|
|
973
980
|
}
|
|
974
981
|
}
|
|
975
982
|
|
|
983
|
+
function normalizePortalNav(raw: unknown): SerializablePageMetadata['nav'] {
|
|
984
|
+
if (!raw || typeof raw !== 'object') return undefined
|
|
985
|
+
const source = raw as Record<string, unknown>
|
|
986
|
+
if (typeof source.label !== 'string' || source.label.length === 0) return undefined
|
|
987
|
+
const group = source.group === 'main' || source.group === 'account' ? source.group : undefined
|
|
988
|
+
return {
|
|
989
|
+
label: source.label,
|
|
990
|
+
labelKey: typeof source.labelKey === 'string' ? source.labelKey : undefined,
|
|
991
|
+
group,
|
|
992
|
+
order: typeof source.order === 'number' ? source.order : undefined,
|
|
993
|
+
icon: typeof source.icon === 'string' ? source.icon : undefined,
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
|
|
976
997
|
function normalizePageMetadata(raw: unknown): SerializablePageMetadata | null {
|
|
977
998
|
if (!raw || typeof raw !== 'object') return null
|
|
978
999
|
const source = raw as Record<string, unknown>
|
|
@@ -1003,6 +1024,8 @@ function normalizePageMetadata(raw: unknown): SerializablePageMetadata | null {
|
|
|
1003
1024
|
if (breadcrumb) normalized.breadcrumb = breadcrumb
|
|
1004
1025
|
const placement = normalizePlacement(source.placement)
|
|
1005
1026
|
if (placement) normalized.placement = placement
|
|
1027
|
+
const nav = normalizePortalNav(source.nav)
|
|
1028
|
+
if (nav) normalized.nav = nav
|
|
1006
1029
|
if (typeof source.icon === 'string') normalized.icon = source.icon
|
|
1007
1030
|
|
|
1008
1031
|
return Object.keys(normalized).length > 0 ? normalized : null
|
|
@@ -1860,6 +1883,7 @@ function buildPageRouteEntries(metaExpr: WriterFunction, routePath: string): Gen
|
|
|
1860
1883
|
{ name: 'requireFeatures', value: optionalPropertyAccess(meta, 'requireFeatures') },
|
|
1861
1884
|
{ name: 'requireCustomerAuth', value: optionalPropertyAccess(meta, 'requireCustomerAuth') },
|
|
1862
1885
|
{ name: 'requireCustomerFeatures', value: optionalPropertyAccess(meta, 'requireCustomerFeatures') },
|
|
1886
|
+
{ name: 'nav', value: optionalPropertyAccess(meta, 'nav') },
|
|
1863
1887
|
{
|
|
1864
1888
|
name: 'title',
|
|
1865
1889
|
value: nullishCoalesce([
|
|
@@ -2825,12 +2849,14 @@ export async function generateModuleRegistry(options: ModuleRegistryOptions): Pr
|
|
|
2825
2849
|
const bootstrapPlugins = [...pluginRegistry.values()].filter((p) => p.bootstrapRegistration)
|
|
2826
2850
|
const allEntryImports: string[] = [
|
|
2827
2851
|
buildImportStatement(`{ backendRoutes }`, `./backend-routes.generated`),
|
|
2852
|
+
buildImportStatement(`{ frontendRoutes }`, `./frontend-routes.generated`),
|
|
2828
2853
|
]
|
|
2829
2854
|
const allRegImports: string[] = [
|
|
2830
|
-
`import { registerBackendRouteManifests } from '@open-mercato/shared/modules/registry'`,
|
|
2855
|
+
`import { registerBackendRouteManifests, registerFrontendRouteManifests } from '@open-mercato/shared/modules/registry'`,
|
|
2831
2856
|
]
|
|
2832
2857
|
const allCalls: string[] = [
|
|
2833
2858
|
`registerBackendRouteManifests(backendRoutes)`,
|
|
2859
|
+
`registerFrontendRouteManifests(frontendRoutes)`,
|
|
2834
2860
|
]
|
|
2835
2861
|
for (const plugin of bootstrapPlugins) {
|
|
2836
2862
|
const reg = plugin.bootstrapRegistration!
|