@burdenoff/microfe-store 2026.1028.1 → 2026.1102.1

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.
Files changed (31) hide show
  1. package/dist/StoreAdminRoutes.js +22 -12
  2. package/dist/StoreAdminRoutes.js.map +1 -1
  3. package/dist/StoreRoot.js +47 -36
  4. package/dist/StoreRoot.js.map +1 -1
  5. package/dist/StoreRoutes.js +72 -59
  6. package/dist/StoreRoutes.js.map +1 -1
  7. package/dist/components/TemplateRevisionsQueue.d.ts +10 -0
  8. package/dist/components/TemplateRevisionsQueue.js +300 -0
  9. package/dist/components/TemplateRevisionsQueue.js.map +1 -0
  10. package/dist/components/WorkflowTemplatePreviewPanel.d.ts +50 -0
  11. package/dist/components/WorkflowTemplatePreviewPanel.js +221 -0
  12. package/dist/components/WorkflowTemplatePreviewPanel.js.map +1 -0
  13. package/dist/components/governance/ReportListingCard.d.ts +11 -0
  14. package/dist/components/governance/ReportListingCard.js +100 -0
  15. package/dist/components/governance/ReportListingCard.js.map +1 -0
  16. package/dist/pages/AdminDashboardPage.js +48 -27
  17. package/dist/pages/AdminDashboardPage.js.map +1 -1
  18. package/dist/pages/AdminGovernancePage.d.ts +3 -0
  19. package/dist/pages/AdminGovernancePage.js +883 -0
  20. package/dist/pages/AdminGovernancePage.js.map +1 -0
  21. package/dist/pages/AdminSubmissionsQueuePage.js +468 -335
  22. package/dist/pages/AdminSubmissionsQueuePage.js.map +1 -1
  23. package/dist/pages/ProductDetailPage.js +220 -215
  24. package/dist/pages/ProductDetailPage.js.map +1 -1
  25. package/dist/pages/PublisherGovernancePage.d.ts +3 -0
  26. package/dist/pages/PublisherGovernancePage.js +230 -0
  27. package/dist/pages/PublisherGovernancePage.js.map +1 -0
  28. package/dist/utils/governance.d.ts +158 -0
  29. package/dist/utils/governance.js +129 -0
  30. package/dist/utils/governance.js.map +1 -0
  31. package/package.json +1 -1
@@ -7,8 +7,8 @@ import { Navigate as o, Route as s, Routes as c } from "react-router";
7
7
  import { FeatureGate as l } from "@burdenoff/fe-libs/shared/feature-flags";
8
8
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
9
9
  //#region src/StoreRoutes.tsx
10
- var f = a(() => import("./pages/MarketplaceHomePage.js").then((e) => ({ default: e.MarketplaceHomePage }))), p = a(() => import("./pages/InstalledAppsPage.js").then((e) => ({ default: e.InstalledAppsPage }))), m = a(() => import("./pages/ProductDetailPage.js").then((e) => ({ default: e.ProductDetailPage }))), h = a(() => import("./pages/CartPage.js").then((e) => ({ default: e.CartPage }))), g = a(() => import("./pages/OrdersPage.js").then((e) => ({ default: e.OrdersPage }))), _ = a(() => import("./pages/MyLicensesPage.js").then((e) => ({ default: e.MyLicensesPage }))), v = a(() => import("./pages/OrderConfirmationPage.js").then((e) => ({ default: e.OrderConfirmationPage }))), y = a(() => import("./pages/AppDetailPage.js").then((e) => ({ default: e.AppDetailPage }))), b = a(() => import("./pages/AppSettingsPage.js").then((e) => ({ default: e.AppSettingsPage }))), x = a(() => import("./pages/SourcingRequestsPage.js").then((e) => ({ default: e.SourcingRequestsPage }))), S = a(() => import("./pages/CreateSourcingRequestPage.js").then((e) => ({ default: e.CreateSourcingRequestPage }))), C = a(() => import("./pages/SourcingRequestDetailPage.js").then((e) => ({ default: e.SourcingRequestDetailPage }))), w = a(() => import("./pages/SellerSourcingOpportunitiesPage.js").then((e) => ({ default: e.SellerSourcingOpportunitiesPage }))), T = a(() => import("./pages/SellerSourcingOpportunityDetailPage.js").then((e) => ({ default: e.SellerSourcingOpportunityDetailPage }))), E = a(() => import("./pages/SellerSourcingOffersPage.js").then((e) => ({ default: e.SellerSourcingOffersPage })));
11
- function D({ title: e, featureFlag: t }) {
10
+ var f = a(() => import("./pages/MarketplaceHomePage.js").then((e) => ({ default: e.MarketplaceHomePage }))), p = a(() => import("./pages/InstalledAppsPage.js").then((e) => ({ default: e.InstalledAppsPage }))), m = a(() => import("./pages/PublisherGovernancePage.js").then((e) => ({ default: e.PublisherGovernancePage }))), h = a(() => import("./pages/ProductDetailPage.js").then((e) => ({ default: e.ProductDetailPage }))), g = a(() => import("./pages/CartPage.js").then((e) => ({ default: e.CartPage }))), _ = a(() => import("./pages/OrdersPage.js").then((e) => ({ default: e.OrdersPage }))), v = a(() => import("./pages/MyLicensesPage.js").then((e) => ({ default: e.MyLicensesPage }))), y = a(() => import("./pages/OrderConfirmationPage.js").then((e) => ({ default: e.OrderConfirmationPage }))), b = a(() => import("./pages/AppDetailPage.js").then((e) => ({ default: e.AppDetailPage }))), x = a(() => import("./pages/AppSettingsPage.js").then((e) => ({ default: e.AppSettingsPage }))), S = a(() => import("./pages/SourcingRequestsPage.js").then((e) => ({ default: e.SourcingRequestsPage }))), C = a(() => import("./pages/CreateSourcingRequestPage.js").then((e) => ({ default: e.CreateSourcingRequestPage }))), w = a(() => import("./pages/SourcingRequestDetailPage.js").then((e) => ({ default: e.SourcingRequestDetailPage }))), T = a(() => import("./pages/SellerSourcingOpportunitiesPage.js").then((e) => ({ default: e.SellerSourcingOpportunitiesPage }))), E = a(() => import("./pages/SellerSourcingOpportunityDetailPage.js").then((e) => ({ default: e.SellerSourcingOpportunityDetailPage }))), D = a(() => import("./pages/SellerSourcingOffersPage.js").then((e) => ({ default: e.SellerSourcingOffersPage })));
11
+ function O({ title: e, featureFlag: t }) {
12
12
  return /* @__PURE__ */ u("div", {
13
13
  className: "flex min-h-[400px] items-center justify-center p-6",
14
14
  children: /* @__PURE__ */ d("div", {
@@ -31,19 +31,19 @@ function D({ title: e, featureFlag: t }) {
31
31
  })
32
32
  });
33
33
  }
34
- function O({ title: e, featureFlag: t, allowed: i, isLoading: a, children: o }) {
34
+ function k({ title: e, featureFlag: t, allowed: i, isLoading: a, children: o }) {
35
35
  return a ? /* @__PURE__ */ u(r, {}) : /* @__PURE__ */ u(l, {
36
36
  flag: t,
37
37
  defaultValue: !0,
38
- fallback: /* @__PURE__ */ u(D, {
38
+ fallback: /* @__PURE__ */ u(O, {
39
39
  title: e,
40
40
  featureFlag: t
41
41
  }),
42
42
  children: i ? o : /* @__PURE__ */ u(n, {})
43
43
  });
44
44
  }
45
- var k = () => {
46
- let { basePath: n, user: a, authToken: l } = e(), { permissions: D, isLoading: k } = t(), A = !!(a?.id || l);
45
+ var A = () => {
46
+ let { basePath: n, user: a, authToken: l } = e(), { permissions: O, isLoading: A } = t(), j = !!(a?.id || l);
47
47
  return /* @__PURE__ */ d(c, { children: [
48
48
  /* @__PURE__ */ u(s, {
49
49
  index: !0,
@@ -54,11 +54,11 @@ var k = () => {
54
54
  }),
55
55
  /* @__PURE__ */ u(s, {
56
56
  path: "marketplace",
57
- element: /* @__PURE__ */ u(O, {
57
+ element: /* @__PURE__ */ u(k, {
58
58
  title: "Marketplace",
59
59
  featureFlag: "store.marketplace",
60
- allowed: D.canBrowse,
61
- isLoading: k,
60
+ allowed: O.canBrowse,
61
+ isLoading: A,
62
62
  children: /* @__PURE__ */ u(i, {
63
63
  fallback: /* @__PURE__ */ u(r, {}),
64
64
  children: /* @__PURE__ */ u(f, {})
@@ -67,63 +67,63 @@ var k = () => {
67
67
  }),
68
68
  /* @__PURE__ */ u(s, {
69
69
  path: "marketplace/product/:productId",
70
- element: /* @__PURE__ */ u(O, {
70
+ element: /* @__PURE__ */ u(k, {
71
71
  title: "Marketplace",
72
72
  featureFlag: "store.marketplace",
73
- allowed: D.canBrowse,
74
- isLoading: k,
73
+ allowed: O.canBrowse,
74
+ isLoading: A,
75
75
  children: /* @__PURE__ */ u(i, {
76
76
  fallback: /* @__PURE__ */ u(r, {}),
77
- children: /* @__PURE__ */ u(m, {})
77
+ children: /* @__PURE__ */ u(h, {})
78
78
  })
79
79
  })
80
80
  }),
81
81
  /* @__PURE__ */ u(s, {
82
82
  path: "cart",
83
- element: /* @__PURE__ */ u(O, {
83
+ element: /* @__PURE__ */ u(k, {
84
84
  title: "Cart",
85
85
  featureFlag: "store.cart",
86
- allowed: D.canPurchase,
87
- isLoading: k,
86
+ allowed: O.canPurchase,
87
+ isLoading: A,
88
88
  children: /* @__PURE__ */ u(i, {
89
89
  fallback: /* @__PURE__ */ u(r, {}),
90
- children: /* @__PURE__ */ u(h, {})
90
+ children: /* @__PURE__ */ u(g, {})
91
91
  })
92
92
  })
93
93
  }),
94
94
  /* @__PURE__ */ u(s, {
95
95
  path: "orders/:orderId/confirmation",
96
- element: /* @__PURE__ */ u(O, {
96
+ element: /* @__PURE__ */ u(k, {
97
97
  title: "Order confirmation",
98
98
  featureFlag: "store.orders",
99
- allowed: D.canPurchase,
100
- isLoading: k,
99
+ allowed: O.canPurchase,
100
+ isLoading: A,
101
101
  children: /* @__PURE__ */ u(i, {
102
102
  fallback: /* @__PURE__ */ u(r, {}),
103
- children: /* @__PURE__ */ u(v, {})
103
+ children: /* @__PURE__ */ u(y, {})
104
104
  })
105
105
  })
106
106
  }),
107
107
  /* @__PURE__ */ u(s, {
108
108
  path: "orders",
109
- element: /* @__PURE__ */ u(O, {
109
+ element: /* @__PURE__ */ u(k, {
110
110
  title: "Orders",
111
111
  featureFlag: "store.orders",
112
- allowed: D.canPurchase,
113
- isLoading: k,
112
+ allowed: O.canPurchase,
113
+ isLoading: A,
114
114
  children: /* @__PURE__ */ u(i, {
115
115
  fallback: /* @__PURE__ */ u(r, {}),
116
- children: /* @__PURE__ */ u(g, {})
116
+ children: /* @__PURE__ */ u(_, {})
117
117
  })
118
118
  })
119
119
  }),
120
120
  /* @__PURE__ */ u(s, {
121
121
  path: "installed",
122
- element: /* @__PURE__ */ u(O, {
122
+ element: /* @__PURE__ */ u(k, {
123
123
  title: "Installed apps",
124
124
  featureFlag: "store.installed",
125
- allowed: D.canInstall,
126
- isLoading: k,
125
+ allowed: O.canInstall,
126
+ isLoading: A,
127
127
  children: /* @__PURE__ */ u(i, {
128
128
  fallback: /* @__PURE__ */ u(r, {}),
129
129
  children: /* @__PURE__ */ u(p, {})
@@ -132,118 +132,131 @@ var k = () => {
132
132
  }),
133
133
  /* @__PURE__ */ u(s, {
134
134
  path: "installed/:installationId",
135
- element: /* @__PURE__ */ u(O, {
135
+ element: /* @__PURE__ */ u(k, {
136
136
  title: "Installed apps",
137
137
  featureFlag: "store.installed",
138
- allowed: D.canInstall,
139
- isLoading: k,
138
+ allowed: O.canInstall,
139
+ isLoading: A,
140
140
  children: /* @__PURE__ */ u(i, {
141
141
  fallback: /* @__PURE__ */ u(r, {}),
142
- children: /* @__PURE__ */ u(y, {})
142
+ children: /* @__PURE__ */ u(b, {})
143
143
  })
144
144
  })
145
145
  }),
146
146
  /* @__PURE__ */ u(s, {
147
147
  path: "installed/:installationId/settings",
148
- element: /* @__PURE__ */ u(O, {
148
+ element: /* @__PURE__ */ u(k, {
149
149
  title: "Installed apps",
150
150
  featureFlag: "store.installed",
151
- allowed: D.canInstall,
152
- isLoading: k,
151
+ allowed: O.canInstall,
152
+ isLoading: A,
153
153
  children: /* @__PURE__ */ u(i, {
154
154
  fallback: /* @__PURE__ */ u(r, {}),
155
- children: /* @__PURE__ */ u(b, {})
155
+ children: /* @__PURE__ */ u(x, {})
156
156
  })
157
157
  })
158
158
  }),
159
159
  /* @__PURE__ */ u(s, {
160
160
  path: "licenses",
161
- element: /* @__PURE__ */ u(O, {
161
+ element: /* @__PURE__ */ u(k, {
162
162
  title: "Licenses",
163
163
  featureFlag: "store.licenses",
164
- allowed: D.canManageLicenses,
165
- isLoading: k,
164
+ allowed: O.canManageLicenses,
165
+ isLoading: A,
166
166
  children: /* @__PURE__ */ u(i, {
167
167
  fallback: /* @__PURE__ */ u(r, {}),
168
- children: /* @__PURE__ */ u(_, {})
168
+ children: /* @__PURE__ */ u(v, {})
169
169
  })
170
170
  })
171
171
  }),
172
172
  /* @__PURE__ */ u(s, {
173
173
  path: "sourcing/requests",
174
- element: /* @__PURE__ */ u(O, {
174
+ element: /* @__PURE__ */ u(k, {
175
175
  title: "Sourcing",
176
176
  featureFlag: "store.sourcing",
177
- allowed: A,
177
+ allowed: j,
178
178
  isLoading: !1,
179
179
  children: /* @__PURE__ */ u(i, {
180
180
  fallback: /* @__PURE__ */ u(r, {}),
181
- children: /* @__PURE__ */ u(x, {})
181
+ children: /* @__PURE__ */ u(S, {})
182
182
  })
183
183
  })
184
184
  }),
185
185
  /* @__PURE__ */ u(s, {
186
186
  path: "sourcing/requests/new",
187
- element: /* @__PURE__ */ u(O, {
187
+ element: /* @__PURE__ */ u(k, {
188
188
  title: "Sourcing",
189
189
  featureFlag: "store.sourcing",
190
- allowed: A,
190
+ allowed: j,
191
191
  isLoading: !1,
192
192
  children: /* @__PURE__ */ u(i, {
193
193
  fallback: /* @__PURE__ */ u(r, {}),
194
- children: /* @__PURE__ */ u(S, {})
194
+ children: /* @__PURE__ */ u(C, {})
195
195
  })
196
196
  })
197
197
  }),
198
198
  /* @__PURE__ */ u(s, {
199
199
  path: "sourcing/requests/:requestId",
200
- element: /* @__PURE__ */ u(O, {
200
+ element: /* @__PURE__ */ u(k, {
201
201
  title: "Sourcing",
202
202
  featureFlag: "store.sourcing",
203
- allowed: A,
203
+ allowed: j,
204
204
  isLoading: !1,
205
205
  children: /* @__PURE__ */ u(i, {
206
206
  fallback: /* @__PURE__ */ u(r, {}),
207
- children: /* @__PURE__ */ u(C, {})
207
+ children: /* @__PURE__ */ u(w, {})
208
208
  })
209
209
  })
210
210
  }),
211
211
  /* @__PURE__ */ u(s, {
212
212
  path: "publisher/sourcing/opportunities",
213
- element: /* @__PURE__ */ u(O, {
213
+ element: /* @__PURE__ */ u(k, {
214
214
  title: "Seller sourcing",
215
215
  featureFlag: "store.sourcing",
216
- allowed: A,
216
+ allowed: j,
217
217
  isLoading: !1,
218
218
  children: /* @__PURE__ */ u(i, {
219
219
  fallback: /* @__PURE__ */ u(r, {}),
220
- children: /* @__PURE__ */ u(w, {})
220
+ children: /* @__PURE__ */ u(T, {})
221
221
  })
222
222
  })
223
223
  }),
224
224
  /* @__PURE__ */ u(s, {
225
225
  path: "publisher/sourcing/opportunities/:requestId",
226
- element: /* @__PURE__ */ u(O, {
226
+ element: /* @__PURE__ */ u(k, {
227
227
  title: "Seller sourcing",
228
228
  featureFlag: "store.sourcing",
229
- allowed: A,
229
+ allowed: j,
230
230
  isLoading: !1,
231
231
  children: /* @__PURE__ */ u(i, {
232
232
  fallback: /* @__PURE__ */ u(r, {}),
233
- children: /* @__PURE__ */ u(T, {})
233
+ children: /* @__PURE__ */ u(E, {})
234
234
  })
235
235
  })
236
236
  }),
237
237
  /* @__PURE__ */ u(s, {
238
238
  path: "publisher/sourcing/offers",
239
- element: /* @__PURE__ */ u(O, {
239
+ element: /* @__PURE__ */ u(k, {
240
240
  title: "Seller sourcing",
241
241
  featureFlag: "store.sourcing",
242
- allowed: A,
242
+ allowed: j,
243
243
  isLoading: !1,
244
244
  children: /* @__PURE__ */ u(i, {
245
245
  fallback: /* @__PURE__ */ u(r, {}),
246
- children: /* @__PURE__ */ u(E, {})
246
+ children: /* @__PURE__ */ u(D, {})
247
+ })
248
+ })
249
+ }),
250
+ /* @__PURE__ */ u(s, {
251
+ path: "publisher/governance",
252
+ element: /* @__PURE__ */ u(k, {
253
+ title: "Store actions and appeals",
254
+ featureFlag: "store.publisher-portal",
255
+ allowed: j,
256
+ isLoading: !1,
257
+ children: /* @__PURE__ */ u(i, {
258
+ fallback: /* @__PURE__ */ u(r, {}),
259
+ children: /* @__PURE__ */ u(m, {})
247
260
  })
248
261
  })
249
262
  }),
@@ -257,6 +270,6 @@ var k = () => {
257
270
  ] });
258
271
  };
259
272
  //#endregion
260
- export { k as StoreRoutes };
273
+ export { A as StoreRoutes };
261
274
 
262
275
  //# sourceMappingURL=StoreRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StoreRoutes.js","names":[],"sources":["../src/StoreRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, type FC, type ReactNode } from 'react';\nimport { Routes, Route, Navigate } from 'react-router';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useStore } from './providers/StoreProvider';\nimport { useStorePermissions } from './hooks/useStorePermissions';\nimport { AccessDenied, PageLoadingFallback } from './components/RouteGuards';\n\n// Lazy loaded pages\nconst MarketplaceHomePage = lazy(() =>\n import('./pages/MarketplaceHomePage').then((m) => ({ default: m.MarketplaceHomePage }))\n);\nconst InstalledAppsPage = lazy(() =>\n import('./pages/InstalledAppsPage').then((m) => ({ default: m.InstalledAppsPage }))\n);\nconst ProductDetailPage = lazy(() =>\n import('./pages/ProductDetailPage').then((m) => ({ default: m.ProductDetailPage }))\n);\nconst CartPage = lazy(() => import('./pages/CartPage').then((m) => ({ default: m.CartPage })));\nconst OrdersPage = lazy(() =>\n import('./pages/OrdersPage').then((m) => ({ default: m.OrdersPage }))\n);\nconst MyLicensesPage = lazy(() =>\n import('./pages/MyLicensesPage').then((m) => ({ default: m.MyLicensesPage }))\n);\nconst OrderConfirmationPage = lazy(() =>\n import('./pages/OrderConfirmationPage').then((m) => ({ default: m.OrderConfirmationPage }))\n);\nconst AppDetailPage = lazy(() =>\n import('./pages/AppDetailPage').then((m) => ({ default: m.AppDetailPage }))\n);\nconst AppSettingsPage = lazy(() =>\n import('./pages/AppSettingsPage').then((m) => ({ default: m.AppSettingsPage }))\n);\nconst SourcingRequestsPage = lazy(() =>\n import('./pages/SourcingRequestsPage').then((m) => ({ default: m.SourcingRequestsPage }))\n);\nconst CreateSourcingRequestPage = lazy(() =>\n import('./pages/CreateSourcingRequestPage').then((m) => ({\n default: m.CreateSourcingRequestPage,\n }))\n);\nconst SourcingRequestDetailPage = lazy(() =>\n import('./pages/SourcingRequestDetailPage').then((m) => ({\n default: m.SourcingRequestDetailPage,\n }))\n);\nconst SellerSourcingOpportunitiesPage = lazy(() =>\n import('./pages/SellerSourcingOpportunitiesPage').then((m) => ({\n default: m.SellerSourcingOpportunitiesPage,\n }))\n);\nconst SellerSourcingOpportunityDetailPage = lazy(() =>\n import('./pages/SellerSourcingOpportunityDetailPage').then((m) => ({\n default: m.SellerSourcingOpportunityDetailPage,\n }))\n);\nconst SellerSourcingOffersPage = lazy(() =>\n import('./pages/SellerSourcingOffersPage').then((m) => ({\n default: m.SellerSourcingOffersPage,\n }))\n);\n\nfunction FeatureDisabled({ title, featureFlag }: { title: string; featureFlag: string }) {\n return (\n <div className=\"flex min-h-[400px] items-center justify-center p-6\">\n <div className=\"max-w-md rounded-lg border border-border-subtle bg-bg-surface p-6 text-center shadow-sm\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{title} is not enabled</h2>\n <p className=\"mt-2 text-sm text-text-secondary\">\n Ask an administrator to enable the <span className=\"font-mono\">{featureFlag}</span>{' '}\n feature flag for this organization.\n </p>\n </div>\n </div>\n );\n}\n\ninterface StoreRouteGateProps {\n title: string;\n featureFlag: string;\n allowed: boolean;\n isLoading: boolean;\n children: ReactNode;\n}\n\nfunction StoreRouteGate({ title, featureFlag, allowed, isLoading, children }: StoreRouteGateProps) {\n if (isLoading) {\n return <PageLoadingFallback />;\n }\n return (\n <FeatureGate\n flag={featureFlag}\n defaultValue\n fallback={<FeatureDisabled title={title} featureFlag={featureFlag} />}\n >\n {allowed ? children : <AccessDenied />}\n </FeatureGate>\n );\n}\n\n/**\n * StoreRoutes component\n *\n * Internal routing for the Store microfrontend. Every route is gated by both\n * a live feature flag (via FeatureGate) and an RBAC permission check so that\n * features can be toggled per-org without a deployment.\n *\n * Flag namespace: store.*\n */\nexport const StoreRoutes: FC = () => {\n const { basePath, user, authToken } = useStore();\n const { permissions, isLoading } = useStorePermissions();\n const hasSelfActor = Boolean(user?.id || authToken);\n\n return (\n <Routes>\n {/* Default redirect */}\n <Route index element={<Navigate to=\"marketplace\" replace />} />\n\n {/* Marketplace */}\n <Route\n path=\"marketplace\"\n element={\n <StoreRouteGate\n title=\"Marketplace\"\n featureFlag=\"store.marketplace\"\n allowed={permissions.canBrowse}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <MarketplaceHomePage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"marketplace/product/:productId\"\n element={\n <StoreRouteGate\n title=\"Marketplace\"\n featureFlag=\"store.marketplace\"\n allowed={permissions.canBrowse}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <ProductDetailPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Cart */}\n <Route\n path=\"cart\"\n element={\n <StoreRouteGate\n title=\"Cart\"\n featureFlag=\"store.cart\"\n allowed={permissions.canPurchase}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <CartPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Orders */}\n <Route\n path=\"orders/:orderId/confirmation\"\n element={\n <StoreRouteGate\n title=\"Order confirmation\"\n featureFlag=\"store.orders\"\n allowed={permissions.canPurchase}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <OrderConfirmationPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"orders\"\n element={\n <StoreRouteGate\n title=\"Orders\"\n featureFlag=\"store.orders\"\n allowed={permissions.canPurchase}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <OrdersPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Installed Apps */}\n <Route\n path=\"installed\"\n element={\n <StoreRouteGate\n title=\"Installed apps\"\n featureFlag=\"store.installed\"\n allowed={permissions.canInstall}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <InstalledAppsPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"installed/:installationId\"\n element={\n <StoreRouteGate\n title=\"Installed apps\"\n featureFlag=\"store.installed\"\n allowed={permissions.canInstall}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <AppDetailPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"installed/:installationId/settings\"\n element={\n <StoreRouteGate\n title=\"Installed apps\"\n featureFlag=\"store.installed\"\n allowed={permissions.canInstall}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <AppSettingsPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Licenses */}\n <Route\n path=\"licenses\"\n element={\n <StoreRouteGate\n title=\"Licenses\"\n featureFlag=\"store.licenses\"\n allowed={permissions.canManageLicenses}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <MyLicensesPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Sourcing — actor self-scoped; no workspace or product-publishing permission required. */}\n <Route\n path=\"sourcing/requests\"\n element={\n <StoreRouteGate\n title=\"Sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <SourcingRequestsPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"sourcing/requests/new\"\n element={\n <StoreRouteGate\n title=\"Sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <CreateSourcingRequestPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"sourcing/requests/:requestId\"\n element={\n <StoreRouteGate\n title=\"Sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <SourcingRequestDetailPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"publisher/sourcing/opportunities\"\n element={\n <StoreRouteGate\n title=\"Seller sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <SellerSourcingOpportunitiesPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"publisher/sourcing/opportunities/:requestId\"\n element={\n <StoreRouteGate\n title=\"Seller sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <SellerSourcingOpportunityDetailPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"publisher/sourcing/offers\"\n element={\n <StoreRouteGate\n title=\"Seller sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <SellerSourcingOffersPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Catch-all redirect */}\n <Route path=\"*\" element={<Navigate to={`${basePath}/marketplace`} replace />} />\n </Routes>\n );\n};\n"],"mappings":";;;;;;;;;AAQA,IAAM,IAAsB,QAC1B,OAAO,kCAA+B,MAAM,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,CACxF,EACK,IAAoB,QACxB,OAAO,gCAA6B,MAAM,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CACpF,EACK,IAAoB,QACxB,OAAO,gCAA6B,MAAM,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CACpF,EACK,IAAW,QAAW,OAAO,uBAAoB,MAAM,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,EACxF,IAAa,QACjB,OAAO,yBAAsB,MAAM,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CACtE,EACK,IAAiB,QACrB,OAAO,6BAA0B,MAAM,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAC9E,EACK,IAAwB,QAC5B,OAAO,oCAAiC,MAAM,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,CAC5F,EACK,IAAgB,QACpB,OAAO,4BAAyB,MAAM,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAC5E,EACK,IAAkB,QACtB,OAAO,8BAA2B,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAChF,EACK,IAAuB,QAC3B,OAAO,mCAAgC,MAAM,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAC1F,EACK,IAA4B,QAChC,OAAO,wCAAqC,MAAM,OAAO,EACvD,SAAS,EAAE,2BACZ,EAAE,CACJ,EACK,IAA4B,QAChC,OAAO,wCAAqC,MAAM,OAAO,EACvD,SAAS,EAAE,2BACZ,EAAE,CACJ,EACK,IAAkC,QACtC,OAAO,8CAA2C,MAAM,OAAO,EAC7D,SAAS,EAAE,iCACZ,EAAE,CACJ,EACK,IAAsC,QAC1C,OAAO,kDAA+C,MAAM,OAAO,EACjE,SAAS,EAAE,qCACZ,EAAE,CACJ,EACK,IAA2B,QAC/B,OAAO,uCAAoC,MAAM,OAAO,EACtD,SAAS,EAAE,0BACZ,EAAE,CACJ;AAED,SAAS,EAAgB,EAAE,UAAO,kBAAuD;AACvF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAAd,CAAyD,GAAM,kBAAoB;OACnF,kBAAC,KAAD;IAAG,WAAU;cAAb;KAAgD;KACX,kBAAC,QAAD;MAAM,WAAU;gBAAa;MAAmB,CAAA;KAAC;KAAI;KAEtF;MACA;;EACF,CAAA;;AAYV,SAAS,EAAe,EAAE,UAAO,gBAAa,YAAS,cAAW,eAAiC;AAIjG,QAHI,IACK,kBAAC,GAAD,EAAuB,CAAA,GAG9B,kBAAC,GAAD;EACE,MAAM;EACN,cAAA;EACA,UAAU,kBAAC,GAAD;GAAwB;GAAoB;GAAe,CAAA;YAEpE,IAAU,IAAW,kBAAC,GAAD,EAAgB,CAAA;EAC1B,CAAA;;AAalB,IAAa,UAAwB;CACnC,IAAM,EAAE,aAAU,SAAM,iBAAc,GAAU,EAC1C,EAAE,gBAAa,iBAAc,GAAqB,EAClD,IAAe,GAAQ,GAAM,MAAM;AAEzC,QACE,kBAAC,GAAD,EAAA,UAAA;EAEE,kBAAC,GAAD;GAAO,OAAA;GAAM,SAAS,kBAAC,GAAD;IAAU,IAAG;IAAc,SAAA;IAAU,CAAA;GAAI,CAAA;EAG/D,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS,EAAY;IACV;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAuB,CAAA;KACd,CAAA;IACI,CAAA;GAEnB,CAAA;EACF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS,EAAY;IACV;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAqB,CAAA;KACZ,CAAA;IACI,CAAA;GAEnB,CAAA;EAGF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS,EAAY;IACV;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAY,CAAA;KACH,CAAA;IACI,CAAA;GAEnB,CAAA;EAGF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS,EAAY;IACV;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAyB,CAAA;KAChB,CAAA;IACI,CAAA;GAEnB,CAAA;EACF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS,EAAY;IACV;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAc,CAAA;KACL,CAAA;IACI,CAAA;GAEnB,CAAA;EAGF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS,EAAY;IACV;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAqB,CAAA;KACZ,CAAA;IACI,CAAA;GAEnB,CAAA;EACF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS,EAAY;IACV;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAiB,CAAA;KACR,CAAA;IACI,CAAA;GAEnB,CAAA;EACF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS,EAAY;IACV;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAmB,CAAA;KACV,CAAA;IACI,CAAA;GAEnB,CAAA;EAGF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS,EAAY;IACV;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAkB,CAAA;KACT,CAAA;IACI,CAAA;GAEnB,CAAA;EAGF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS;IACT,WAAW;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAwB,CAAA;KACf,CAAA;IACI,CAAA;GAEnB,CAAA;EACF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS;IACT,WAAW;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAA6B,CAAA;KACpB,CAAA;IACI,CAAA;GAEnB,CAAA;EACF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS;IACT,WAAW;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAA6B,CAAA;KACpB,CAAA;IACI,CAAA;GAEnB,CAAA;EACF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS;IACT,WAAW;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAmC,CAAA;KAC1B,CAAA;IACI,CAAA;GAEnB,CAAA;EACF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS;IACT,WAAW;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAAuC,CAAA;KAC9B,CAAA;IACI,CAAA;GAEnB,CAAA;EACF,kBAAC,GAAD;GACE,MAAK;GACL,SACE,kBAAC,GAAD;IACE,OAAM;IACN,aAAY;IACZ,SAAS;IACT,WAAW;cAEX,kBAAC,GAAD;KAAU,UAAU,kBAAC,GAAD,EAAuB,CAAA;eACzC,kBAAC,GAAD,EAA4B,CAAA;KACnB,CAAA;IACI,CAAA;GAEnB,CAAA;EAGF,kBAAC,GAAD;GAAO,MAAK;GAAI,SAAS,kBAAC,GAAD;IAAU,IAAI,GAAG,EAAS;IAAe,SAAA;IAAU,CAAA;GAAI,CAAA;EACzE,EAAA,CAAA"}
1
+ {"version":3,"file":"StoreRoutes.js","names":[],"sources":["../src/StoreRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, type FC, type ReactNode } from 'react';\nimport { Routes, Route, Navigate } from 'react-router';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useStore } from './providers/StoreProvider';\nimport { useStorePermissions } from './hooks/useStorePermissions';\nimport { AccessDenied, PageLoadingFallback } from './components/RouteGuards';\n\n// Lazy loaded pages\nconst MarketplaceHomePage = lazy(() =>\n import('./pages/MarketplaceHomePage').then((m) => ({ default: m.MarketplaceHomePage }))\n);\nconst InstalledAppsPage = lazy(() =>\n import('./pages/InstalledAppsPage').then((m) => ({ default: m.InstalledAppsPage }))\n);\nconst PublisherGovernancePage = lazy(() =>\n import('./pages/PublisherGovernancePage').then((m) => ({ default: m.PublisherGovernancePage }))\n);\nconst ProductDetailPage = lazy(() =>\n import('./pages/ProductDetailPage').then((m) => ({ default: m.ProductDetailPage }))\n);\nconst CartPage = lazy(() => import('./pages/CartPage').then((m) => ({ default: m.CartPage })));\nconst OrdersPage = lazy(() =>\n import('./pages/OrdersPage').then((m) => ({ default: m.OrdersPage }))\n);\nconst MyLicensesPage = lazy(() =>\n import('./pages/MyLicensesPage').then((m) => ({ default: m.MyLicensesPage }))\n);\nconst OrderConfirmationPage = lazy(() =>\n import('./pages/OrderConfirmationPage').then((m) => ({ default: m.OrderConfirmationPage }))\n);\nconst AppDetailPage = lazy(() =>\n import('./pages/AppDetailPage').then((m) => ({ default: m.AppDetailPage }))\n);\nconst AppSettingsPage = lazy(() =>\n import('./pages/AppSettingsPage').then((m) => ({ default: m.AppSettingsPage }))\n);\nconst SourcingRequestsPage = lazy(() =>\n import('./pages/SourcingRequestsPage').then((m) => ({ default: m.SourcingRequestsPage }))\n);\nconst CreateSourcingRequestPage = lazy(() =>\n import('./pages/CreateSourcingRequestPage').then((m) => ({\n default: m.CreateSourcingRequestPage,\n }))\n);\nconst SourcingRequestDetailPage = lazy(() =>\n import('./pages/SourcingRequestDetailPage').then((m) => ({\n default: m.SourcingRequestDetailPage,\n }))\n);\nconst SellerSourcingOpportunitiesPage = lazy(() =>\n import('./pages/SellerSourcingOpportunitiesPage').then((m) => ({\n default: m.SellerSourcingOpportunitiesPage,\n }))\n);\nconst SellerSourcingOpportunityDetailPage = lazy(() =>\n import('./pages/SellerSourcingOpportunityDetailPage').then((m) => ({\n default: m.SellerSourcingOpportunityDetailPage,\n }))\n);\nconst SellerSourcingOffersPage = lazy(() =>\n import('./pages/SellerSourcingOffersPage').then((m) => ({\n default: m.SellerSourcingOffersPage,\n }))\n);\n\nfunction FeatureDisabled({ title, featureFlag }: { title: string; featureFlag: string }) {\n return (\n <div className=\"flex min-h-[400px] items-center justify-center p-6\">\n <div className=\"max-w-md rounded-lg border border-border-subtle bg-bg-surface p-6 text-center shadow-sm\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{title} is not enabled</h2>\n <p className=\"mt-2 text-sm text-text-secondary\">\n Ask an administrator to enable the <span className=\"font-mono\">{featureFlag}</span>{' '}\n feature flag for this organization.\n </p>\n </div>\n </div>\n );\n}\n\ninterface StoreRouteGateProps {\n title: string;\n featureFlag: string;\n allowed: boolean;\n isLoading: boolean;\n children: ReactNode;\n}\n\nfunction StoreRouteGate({ title, featureFlag, allowed, isLoading, children }: StoreRouteGateProps) {\n if (isLoading) {\n return <PageLoadingFallback />;\n }\n return (\n <FeatureGate\n flag={featureFlag}\n defaultValue\n fallback={<FeatureDisabled title={title} featureFlag={featureFlag} />}\n >\n {allowed ? children : <AccessDenied />}\n </FeatureGate>\n );\n}\n\n/**\n * StoreRoutes component\n *\n * Internal routing for the Store microfrontend. Every route is gated by both\n * a live feature flag (via FeatureGate) and an RBAC permission check so that\n * features can be toggled per-org without a deployment.\n *\n * Flag namespace: store.*\n */\nexport const StoreRoutes: FC = () => {\n const { basePath, user, authToken } = useStore();\n const { permissions, isLoading } = useStorePermissions();\n const hasSelfActor = Boolean(user?.id || authToken);\n\n return (\n <Routes>\n {/* Default redirect */}\n <Route index element={<Navigate to=\"marketplace\" replace />} />\n\n {/* Marketplace */}\n <Route\n path=\"marketplace\"\n element={\n <StoreRouteGate\n title=\"Marketplace\"\n featureFlag=\"store.marketplace\"\n allowed={permissions.canBrowse}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <MarketplaceHomePage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"marketplace/product/:productId\"\n element={\n <StoreRouteGate\n title=\"Marketplace\"\n featureFlag=\"store.marketplace\"\n allowed={permissions.canBrowse}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <ProductDetailPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Cart */}\n <Route\n path=\"cart\"\n element={\n <StoreRouteGate\n title=\"Cart\"\n featureFlag=\"store.cart\"\n allowed={permissions.canPurchase}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <CartPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Orders */}\n <Route\n path=\"orders/:orderId/confirmation\"\n element={\n <StoreRouteGate\n title=\"Order confirmation\"\n featureFlag=\"store.orders\"\n allowed={permissions.canPurchase}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <OrderConfirmationPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"orders\"\n element={\n <StoreRouteGate\n title=\"Orders\"\n featureFlag=\"store.orders\"\n allowed={permissions.canPurchase}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <OrdersPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Installed Apps */}\n <Route\n path=\"installed\"\n element={\n <StoreRouteGate\n title=\"Installed apps\"\n featureFlag=\"store.installed\"\n allowed={permissions.canInstall}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <InstalledAppsPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"installed/:installationId\"\n element={\n <StoreRouteGate\n title=\"Installed apps\"\n featureFlag=\"store.installed\"\n allowed={permissions.canInstall}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <AppDetailPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"installed/:installationId/settings\"\n element={\n <StoreRouteGate\n title=\"Installed apps\"\n featureFlag=\"store.installed\"\n allowed={permissions.canInstall}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <AppSettingsPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Licenses */}\n <Route\n path=\"licenses\"\n element={\n <StoreRouteGate\n title=\"Licenses\"\n featureFlag=\"store.licenses\"\n allowed={permissions.canManageLicenses}\n isLoading={isLoading}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <MyLicensesPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Sourcing — actor self-scoped; no workspace or product-publishing permission required. */}\n <Route\n path=\"sourcing/requests\"\n element={\n <StoreRouteGate\n title=\"Sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <SourcingRequestsPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"sourcing/requests/new\"\n element={\n <StoreRouteGate\n title=\"Sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <CreateSourcingRequestPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"sourcing/requests/:requestId\"\n element={\n <StoreRouteGate\n title=\"Sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <SourcingRequestDetailPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"publisher/sourcing/opportunities\"\n element={\n <StoreRouteGate\n title=\"Seller sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <SellerSourcingOpportunitiesPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"publisher/sourcing/opportunities/:requestId\"\n element={\n <StoreRouteGate\n title=\"Seller sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <SellerSourcingOpportunityDetailPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n <Route\n path=\"publisher/sourcing/offers\"\n element={\n <StoreRouteGate\n title=\"Seller sourcing\"\n featureFlag=\"store.sourcing\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <SellerSourcingOffersPage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Publisher store actions and appeals (BOFF-10635) — actor self-scoped. */}\n <Route\n path=\"publisher/governance\"\n element={\n <StoreRouteGate\n title=\"Store actions and appeals\"\n featureFlag=\"store.publisher-portal\"\n allowed={hasSelfActor}\n isLoading={false}\n >\n <Suspense fallback={<PageLoadingFallback />}>\n <PublisherGovernancePage />\n </Suspense>\n </StoreRouteGate>\n }\n />\n\n {/* Catch-all redirect */}\n <Route path=\"*\" element={<Navigate to={`${basePath}/marketplace`} replace />} />\n </Routes>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { FC } from 'react';
2
+
3
+ export declare const TEMPLATE_REVISION_COUNT_QUERY = "\n query AdminPendingWorkflowTemplateRevisionCount {\n pendingWorkflowTemplateRevisions(limit: 1) {\n totalCount\n }\n }\n";
4
+ export declare const TemplateRevisionsQueue: FC<{
5
+ authToken?: string | null;
6
+ /** Called with the number of pending revisions after every load. */
7
+ onCountChange?: (count: number) => void;
8
+ /** Bumped by the page's Refresh button to reload the list. */
9
+ refreshKey?: number;
10
+ }>;