@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/cli",
3
- "version": "0.5.1-develop.2652.0276e72e45",
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.2652.0276e72e45",
62
- "@open-mercato/shared": "0.5.1-develop.2652.0276e72e45",
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.2652.0276e72e45"
72
+ "@open-mercato/shared": "0.5.1-develop.2657.a01847a9fa"
73
73
  },
74
74
  "devDependencies": {
75
- "@open-mercato/shared": "0.5.1-develop.2652.0276e72e45",
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!