@burdenoff/microfe-devportal 2026.514.1 → 2026.518.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.
@@ -1 +1 @@
1
- {"version":3,"file":"DevportalRoutes.d.ts","sourceRoot":"","sources":["../../src/devportal/DevportalRoutes.tsx"],"names":[],"mappings":"AAmTA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,4CAa9B"}
1
+ {"version":3,"file":"DevportalRoutes.d.ts","sourceRoot":"","sources":["../../src/devportal/DevportalRoutes.tsx"],"names":[],"mappings":"AA6UA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,4CAa9B"}
@@ -1,174 +1,182 @@
1
- import { LoadingState as e } from "./components/LoadingState.js";
2
- import { FeatureFlaggedRoute as t } from "./components/FeatureFlaggedRoute.js";
3
- import { TelemetryErrorBoundary as n } from "./components/TelemetryErrorBoundary.js";
4
- import { DashboardPage as r } from "./pages/DashboardPage.js";
5
- import { Suspense as i, lazy as a } from "react";
6
- import { Navigate as o, Route as s, Routes as c } from "react-router-dom";
7
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
1
+ import { useDevportal as e } from "./providers/DevportalProvider.js";
2
+ import { LoadingState as t } from "./components/LoadingState.js";
3
+ import { FeatureFlaggedRoute as n } from "./components/FeatureFlaggedRoute.js";
4
+ import { TelemetryErrorBoundary as r } from "./components/TelemetryErrorBoundary.js";
5
+ import { SectionNav as i } from "./components/SectionNav.js";
6
+ import { DashboardPage as a } from "./pages/DashboardPage.js";
7
+ import { Suspense as o, lazy as s, useEffect as c } from "react";
8
+ import { Navigate as l, Route as u, Routes as d } from "react-router-dom";
9
+ import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
8
10
  //#region src/devportal/DevportalRoutes.tsx
9
- function d(e, r) {
10
- return /* @__PURE__ */ l(n, {
11
+ function h() {
12
+ let { basePath: t, navigate: n } = e();
13
+ return c(() => {
14
+ t && n && n((t.endsWith("/") ? t.slice(0, -1) : t) || "/");
15
+ }, [t, n]), t && n ? null : /* @__PURE__ */ p(l, {
16
+ to: "..",
17
+ replace: !0
18
+ });
19
+ }
20
+ function g(e, t) {
21
+ return /* @__PURE__ */ p(r, {
11
22
  scope: e,
12
- children: /* @__PURE__ */ l(t, {
23
+ children: /* @__PURE__ */ p(n, {
13
24
  flag: `devportal.${e}`,
14
- children: r
25
+ children: t
15
26
  })
16
27
  });
17
28
  }
18
- var f = a(() => import("./pages/OrganizationsPage.js").then((e) => ({ default: e.OrganizationsPage }))), p = a(() => import("./pages/OrganizationDetailPage.js").then((e) => ({ default: e.OrganizationDetailPage }))), m = a(() => import("./pages/CreateOrganizationPage.js").then((e) => ({ default: e.CreateOrganizationPage }))), h = a(() => import("./pages/OrganizationMembersPage.js").then((e) => ({ default: e.OrganizationMembersPage }))), g = a(() => import("./pages/RevenueRedirectPage.js").then((e) => ({ default: e.RevenueRedirectPage }))), _ = a(() => import("./pages/ApplicationsPage.js").then((e) => ({ default: e.ApplicationsPage }))), v = a(() => import("./pages/ApplicationDetailPage.js").then((e) => ({ default: e.ApplicationDetailPage }))), y = a(() => import("./pages/CreateApplicationPage.js").then((e) => ({ default: e.CreateApplicationPage }))), b = a(() => import("./pages/EditApplicationPage.js").then((e) => ({ default: e.EditApplicationPage }))), x = a(() => import("./pages/ApplicationVersionsPage.js").then((e) => ({ default: e.ApplicationVersionsPage }))), S = a(() => import("./pages/OAuthClientsPage.js").then((e) => ({ default: e.OAuthClientsPage }))), C = a(() => import("./pages/CreateOAuthClientPage.js").then((e) => ({ default: e.CreateOAuthClientPage }))), w = a(() => import("./pages/OAuthClientDetailPage.js").then((e) => ({ default: e.OAuthClientDetailPage }))), T = a(() => import("./pages/ApiKeysPage.js").then((e) => ({ default: e.ApiKeysPage }))), E = a(() => import("./pages/CreateApiKeyPage.js").then((e) => ({ default: e.CreateApiKeyPage }))), D = a(() => import("./pages/WebhooksPage.js").then((e) => ({ default: e.WebhooksPage }))), O = a(() => import("./pages/CreateWebhookPage.js").then((e) => ({ default: e.CreateWebhookPage }))), k = a(() => import("./pages/WebhookDetailPage.js").then((e) => ({ default: e.WebhookDetailPage }))), A = a(() => import("./pages/AnalyticsDashboardPage.js").then((e) => ({ default: e.AnalyticsDashboardPage }))), j = a(() => import("./pages/DocumentationPage.js").then((e) => ({ default: e.DocumentationPage }))), M = a(() => import("./pages/ResourcesPage.js").then((e) => ({ default: e.ResourcesPage }))), N = a(() => import("./pages/SettingsPage.js").then((e) => ({ default: e.SettingsPage }))), P = a(() => import("./pages/PublishPage.js").then((e) => ({ default: e.PublishPage }))), F = a(() => import("./pages/AppLogsPage.js").then((e) => ({ default: e.AppLogsPage }))), I = a(() => import("./pages/DelegationsPage.js").then((e) => ({ default: e.DelegationsPage }))), L = a(() => import("./pages/ListingPreviewPage.js").then((e) => ({ default: e.ListingPreviewPage }))), R = a(() => import("./pages/StoreSubmissionPage.js").then((e) => ({ default: e.StoreSubmissionPage }))), z = a(() => import("./pages/PublisherProfilePage.js").then((e) => ({ default: e.PublisherProfilePage })));
19
- function B() {
20
- return /* @__PURE__ */ u(c, { children: [
21
- /* @__PURE__ */ l(s, {
29
+ var _ = s(() => import("./pages/OrganizationsPage.js").then((e) => ({ default: e.OrganizationsPage }))), v = s(() => import("./pages/OrganizationDetailPage.js").then((e) => ({ default: e.OrganizationDetailPage }))), y = s(() => import("./pages/CreateOrganizationPage.js").then((e) => ({ default: e.CreateOrganizationPage }))), b = s(() => import("./pages/OrganizationMembersPage.js").then((e) => ({ default: e.OrganizationMembersPage }))), x = s(() => import("./pages/RevenueRedirectPage.js").then((e) => ({ default: e.RevenueRedirectPage }))), S = s(() => import("./pages/ApplicationsPage.js").then((e) => ({ default: e.ApplicationsPage }))), C = s(() => import("./pages/ApplicationDetailPage.js").then((e) => ({ default: e.ApplicationDetailPage }))), w = s(() => import("./pages/CreateApplicationPage.js").then((e) => ({ default: e.CreateApplicationPage }))), T = s(() => import("./pages/EditApplicationPage.js").then((e) => ({ default: e.EditApplicationPage }))), E = s(() => import("./pages/ApplicationVersionsPage.js").then((e) => ({ default: e.ApplicationVersionsPage }))), D = s(() => import("./pages/OAuthClientsPage.js").then((e) => ({ default: e.OAuthClientsPage }))), O = s(() => import("./pages/CreateOAuthClientPage.js").then((e) => ({ default: e.CreateOAuthClientPage }))), k = s(() => import("./pages/OAuthClientDetailPage.js").then((e) => ({ default: e.OAuthClientDetailPage }))), A = s(() => import("./pages/ApiKeysPage.js").then((e) => ({ default: e.ApiKeysPage }))), j = s(() => import("./pages/CreateApiKeyPage.js").then((e) => ({ default: e.CreateApiKeyPage }))), M = s(() => import("./pages/WebhooksPage.js").then((e) => ({ default: e.WebhooksPage }))), N = s(() => import("./pages/CreateWebhookPage.js").then((e) => ({ default: e.CreateWebhookPage }))), P = s(() => import("./pages/WebhookDetailPage.js").then((e) => ({ default: e.WebhookDetailPage }))), F = s(() => import("./pages/AnalyticsDashboardPage.js").then((e) => ({ default: e.AnalyticsDashboardPage }))), I = s(() => import("./pages/DocumentationPage.js").then((e) => ({ default: e.DocumentationPage }))), L = s(() => import("./pages/ResourcesPage.js").then((e) => ({ default: e.ResourcesPage }))), R = s(() => import("./pages/SettingsPage.js").then((e) => ({ default: e.SettingsPage }))), z = s(() => import("./pages/PublishPage.js").then((e) => ({ default: e.PublishPage }))), B = s(() => import("./pages/AppLogsPage.js").then((e) => ({ default: e.AppLogsPage }))), V = s(() => import("./pages/DelegationsPage.js").then((e) => ({ default: e.DelegationsPage }))), H = s(() => import("./pages/ListingPreviewPage.js").then((e) => ({ default: e.ListingPreviewPage }))), U = s(() => import("./pages/StoreSubmissionPage.js").then((e) => ({ default: e.StoreSubmissionPage }))), W = s(() => import("./pages/PublisherProfilePage.js").then((e) => ({ default: e.PublisherProfilePage })));
30
+ function G() {
31
+ return /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(i, {}), /* @__PURE__ */ m(d, { children: [
32
+ /* @__PURE__ */ p(u, {
22
33
  index: !0,
23
- element: d("dashboard", /* @__PURE__ */ l(r, {}))
34
+ element: g("dashboard", /* @__PURE__ */ p(a, {}))
24
35
  }),
25
- /* @__PURE__ */ l(s, {
36
+ /* @__PURE__ */ p(u, {
26
37
  path: "organizations",
27
- element: d("organizations", /* @__PURE__ */ l(f, {}))
38
+ element: g("organizations", /* @__PURE__ */ p(_, {}))
28
39
  }),
29
- /* @__PURE__ */ l(s, {
40
+ /* @__PURE__ */ p(u, {
30
41
  path: "organizations/new",
31
- element: d("organizations.create", /* @__PURE__ */ l(m, {}))
42
+ element: g("organizations.create", /* @__PURE__ */ p(y, {}))
32
43
  }),
33
- /* @__PURE__ */ l(s, {
44
+ /* @__PURE__ */ p(u, {
34
45
  path: "organizations/:orgId",
35
- element: d("organizations.detail", /* @__PURE__ */ l(p, {}))
46
+ element: g("organizations.detail", /* @__PURE__ */ p(v, {}))
36
47
  }),
37
- /* @__PURE__ */ l(s, {
48
+ /* @__PURE__ */ p(u, {
38
49
  path: "organizations/:orgId/members",
39
- element: d("organizations.members", /* @__PURE__ */ l(h, {}))
50
+ element: g("organizations.members", /* @__PURE__ */ p(b, {}))
40
51
  }),
41
- /* @__PURE__ */ l(s, {
52
+ /* @__PURE__ */ p(u, {
42
53
  path: "organizations/:orgId/revenue",
43
- element: d("organizations.revenue", /* @__PURE__ */ l(g, {}))
54
+ element: g("organizations.revenue", /* @__PURE__ */ p(x, {}))
44
55
  }),
45
- /* @__PURE__ */ l(s, {
56
+ /* @__PURE__ */ p(u, {
46
57
  path: "apps",
47
- element: d("apps", /* @__PURE__ */ l(_, {}))
58
+ element: g("apps", /* @__PURE__ */ p(S, {}))
48
59
  }),
49
- /* @__PURE__ */ l(s, {
60
+ /* @__PURE__ */ p(u, {
50
61
  path: "apps/new",
51
- element: d("apps.create", /* @__PURE__ */ l(y, {}))
62
+ element: g("apps.create", /* @__PURE__ */ p(w, {}))
52
63
  }),
53
- /* @__PURE__ */ l(s, {
64
+ /* @__PURE__ */ p(u, {
54
65
  path: "apps/:appId",
55
- element: d("apps.detail", /* @__PURE__ */ l(v, {}))
66
+ element: g("apps.detail", /* @__PURE__ */ p(C, {}))
56
67
  }),
57
- /* @__PURE__ */ l(s, {
68
+ /* @__PURE__ */ p(u, {
58
69
  path: "apps/:appId/edit",
59
- element: d("apps.edit", /* @__PURE__ */ l(b, {}))
70
+ element: g("apps.edit", /* @__PURE__ */ p(T, {}))
60
71
  }),
61
- /* @__PURE__ */ l(s, {
72
+ /* @__PURE__ */ p(u, {
62
73
  path: "apps/:appId/versions",
63
- element: d("apps.versions", /* @__PURE__ */ l(x, {}))
74
+ element: g("apps.versions", /* @__PURE__ */ p(E, {}))
64
75
  }),
65
- /* @__PURE__ */ l(s, {
76
+ /* @__PURE__ */ p(u, {
66
77
  path: "apps/:appId/publish",
67
- element: d("apps.publish", /* @__PURE__ */ l(P, {}))
78
+ element: g("apps.publish", /* @__PURE__ */ p(z, {}))
68
79
  }),
69
- /* @__PURE__ */ l(s, {
80
+ /* @__PURE__ */ p(u, {
70
81
  path: "apps/:appId/store-submission",
71
- element: d("apps.storeSubmission", /* @__PURE__ */ l(R, {}))
82
+ element: g("apps.storeSubmission", /* @__PURE__ */ p(U, {}))
72
83
  }),
73
- /* @__PURE__ */ l(s, {
84
+ /* @__PURE__ */ p(u, {
74
85
  path: "apps/:appId/listing",
75
- element: d("apps.listing", /* @__PURE__ */ l(L, {}))
86
+ element: g("apps.listing", /* @__PURE__ */ p(H, {}))
76
87
  }),
77
- /* @__PURE__ */ l(s, {
88
+ /* @__PURE__ */ p(u, {
78
89
  path: "apps/:appId/logs",
79
- element: d("apps.logs", /* @__PURE__ */ l(F, {}))
90
+ element: g("apps.logs", /* @__PURE__ */ p(B, {}))
80
91
  }),
81
- /* @__PURE__ */ l(s, {
92
+ /* @__PURE__ */ p(u, {
82
93
  path: "oauth",
83
- element: d("oauth", /* @__PURE__ */ l(S, {}))
94
+ element: g("oauth", /* @__PURE__ */ p(D, {}))
84
95
  }),
85
- /* @__PURE__ */ l(s, {
96
+ /* @__PURE__ */ p(u, {
86
97
  path: "oauth/new",
87
- element: d("oauth.create", /* @__PURE__ */ l(C, {}))
98
+ element: g("oauth.create", /* @__PURE__ */ p(O, {}))
88
99
  }),
89
- /* @__PURE__ */ l(s, {
100
+ /* @__PURE__ */ p(u, {
90
101
  path: "oauth/:clientId",
91
- element: d("oauth.detail", /* @__PURE__ */ l(w, {}))
102
+ element: g("oauth.detail", /* @__PURE__ */ p(k, {}))
92
103
  }),
93
- /* @__PURE__ */ l(s, {
104
+ /* @__PURE__ */ p(u, {
94
105
  path: "api-keys",
95
- element: d("apiKeys", /* @__PURE__ */ l(T, {}))
106
+ element: g("apiKeys", /* @__PURE__ */ p(A, {}))
96
107
  }),
97
- /* @__PURE__ */ l(s, {
108
+ /* @__PURE__ */ p(u, {
98
109
  path: "api-keys/new",
99
- element: d("apiKeys.create", /* @__PURE__ */ l(E, {}))
110
+ element: g("apiKeys.create", /* @__PURE__ */ p(j, {}))
100
111
  }),
101
- /* @__PURE__ */ l(s, {
112
+ /* @__PURE__ */ p(u, {
102
113
  path: "apps/:appId/webhooks",
103
- element: d("apps.webhooks", /* @__PURE__ */ l(D, {}))
114
+ element: g("apps.webhooks", /* @__PURE__ */ p(M, {}))
104
115
  }),
105
- /* @__PURE__ */ l(s, {
116
+ /* @__PURE__ */ p(u, {
106
117
  path: "apps/:appId/webhooks/new",
107
- element: d("apps.webhooks.create", /* @__PURE__ */ l(O, {}))
118
+ element: g("apps.webhooks.create", /* @__PURE__ */ p(N, {}))
108
119
  }),
109
- /* @__PURE__ */ l(s, {
120
+ /* @__PURE__ */ p(u, {
110
121
  path: "apps/:appId/webhooks/:webhookId",
111
- element: d("apps.webhooks.detail", /* @__PURE__ */ l(k, {}))
122
+ element: g("apps.webhooks.detail", /* @__PURE__ */ p(P, {}))
112
123
  }),
113
- /* @__PURE__ */ l(s, {
124
+ /* @__PURE__ */ p(u, {
114
125
  path: "apps/:appId/analytics",
115
- element: d("apps.analytics", /* @__PURE__ */ l(A, {}))
126
+ element: g("apps.analytics", /* @__PURE__ */ p(F, {}))
116
127
  }),
117
- /* @__PURE__ */ l(s, {
128
+ /* @__PURE__ */ p(u, {
118
129
  path: "delegations",
119
- element: d("delegations", /* @__PURE__ */ l(I, {}))
130
+ element: g("delegations", /* @__PURE__ */ p(V, {}))
120
131
  }),
121
- /* @__PURE__ */ l(s, {
132
+ /* @__PURE__ */ p(u, {
122
133
  path: "webhooks/new",
123
- element: d("webhooks.create", /* @__PURE__ */ l(O, {}))
134
+ element: g("webhooks.create", /* @__PURE__ */ p(N, {}))
124
135
  }),
125
- /* @__PURE__ */ l(s, {
136
+ /* @__PURE__ */ p(u, {
126
137
  path: "webhooks",
127
- element: d("webhooks", /* @__PURE__ */ l(D, {}))
138
+ element: g("webhooks", /* @__PURE__ */ p(M, {}))
128
139
  }),
129
- /* @__PURE__ */ l(s, {
140
+ /* @__PURE__ */ p(u, {
130
141
  path: "analytics",
131
- element: d("analytics", /* @__PURE__ */ l(A, {}))
142
+ element: g("analytics", /* @__PURE__ */ p(F, {}))
132
143
  }),
133
- /* @__PURE__ */ l(s, {
144
+ /* @__PURE__ */ p(u, {
134
145
  path: "revenue",
135
- element: d("revenue", /* @__PURE__ */ l(g, {}))
146
+ element: g("revenue", /* @__PURE__ */ p(x, {}))
136
147
  }),
137
- /* @__PURE__ */ l(s, {
148
+ /* @__PURE__ */ p(u, {
138
149
  path: "docs",
139
- element: d("docs", /* @__PURE__ */ l(j, {}))
150
+ element: g("docs", /* @__PURE__ */ p(I, {}))
140
151
  }),
141
- /* @__PURE__ */ l(s, {
152
+ /* @__PURE__ */ p(u, {
142
153
  path: "resources",
143
- element: d("resources", /* @__PURE__ */ l(M, {}))
154
+ element: g("resources", /* @__PURE__ */ p(L, {}))
144
155
  }),
145
- /* @__PURE__ */ l(s, {
156
+ /* @__PURE__ */ p(u, {
146
157
  path: "publisher/profile",
147
- element: d("publisher.profile", /* @__PURE__ */ l(z, {}))
158
+ element: g("publisher.profile", /* @__PURE__ */ p(W, {}))
148
159
  }),
149
- /* @__PURE__ */ l(s, {
160
+ /* @__PURE__ */ p(u, {
150
161
  path: "settings",
151
- element: d("settings", /* @__PURE__ */ l(N, {}))
162
+ element: g("settings", /* @__PURE__ */ p(R, {}))
152
163
  }),
153
- /* @__PURE__ */ l(s, {
164
+ /* @__PURE__ */ p(u, {
154
165
  path: "*",
155
- element: /* @__PURE__ */ l(o, {
156
- to: "",
157
- replace: !0
158
- })
166
+ element: /* @__PURE__ */ p(h, {})
159
167
  })
160
- ] });
168
+ ] })] });
161
169
  }
162
- function V() {
163
- return /* @__PURE__ */ l(i, {
164
- fallback: /* @__PURE__ */ l(e, { message: "Loading page..." }),
165
- children: /* @__PURE__ */ l(c, { children: /* @__PURE__ */ l(s, {
170
+ function K() {
171
+ return /* @__PURE__ */ p(o, {
172
+ fallback: /* @__PURE__ */ p(t, { message: "Loading page..." }),
173
+ children: /* @__PURE__ */ p(d, { children: /* @__PURE__ */ p(u, {
166
174
  path: "/*",
167
- element: /* @__PURE__ */ l(B, {})
175
+ element: /* @__PURE__ */ p(G, {})
168
176
  }) })
169
177
  });
170
178
  }
171
179
  //#endregion
172
- export { V as DevportalRoutes };
180
+ export { K as DevportalRoutes };
173
181
 
174
182
  //# sourceMappingURL=DevportalRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DevportalRoutes.js","names":[],"sources":["../../src/devportal/DevportalRoutes.tsx"],"sourcesContent":["import { Suspense, lazy, type ReactNode } from \"react\";\nimport { Routes, Route, Navigate } from \"react-router-dom\";\nimport { LoadingState } from \"./components/LoadingState\";\nimport { FeatureFlaggedRoute } from \"./components/FeatureFlaggedRoute\";\nimport { TelemetryErrorBoundary } from \"./components/TelemetryErrorBoundary\";\n\n/**\n * Wrap a page element with the per-route feature flag gate and a\n * telemetry-emitting error boundary. The flag name follows\n * `devportal.<page-slug>` convention; when disabled the user sees a\n * graceful fallback instead of a route-level crash.\n *\n * Per `dev/platform/context/feature-flags` and spec\n * `microfrontends/47-FRONTEND-EVENT-BUS.md` (error.boundary emission).\n */\nfunction gated(slug: string, element: ReactNode): ReactNode {\n return (\n <TelemetryErrorBoundary scope={slug}>\n <FeatureFlaggedRoute flag={`devportal.${slug}`}>\n {element}\n </FeatureFlaggedRoute>\n </TelemetryErrorBoundary>\n );\n}\n\n// Eager load the main dashboard page\nimport { DashboardPage } from \"./pages/DashboardPage\";\n\n// Lazy load all other pages\nconst OrganizationsPage = lazy(() =>\n import(\"./pages/OrganizationsPage\").then((m) => ({\n default: m.OrganizationsPage,\n })),\n);\nconst OrganizationDetailPage = lazy(() =>\n import(\"./pages/OrganizationDetailPage\").then((m) => ({\n default: m.OrganizationDetailPage,\n })),\n);\nconst CreateOrganizationPage = lazy(() =>\n import(\"./pages/CreateOrganizationPage\").then((m) => ({\n default: m.CreateOrganizationPage,\n })),\n);\nconst OrganizationMembersPage = lazy(() =>\n import(\"./pages/OrganizationMembersPage\").then((m) => ({\n default: m.OrganizationMembersPage,\n })),\n);\nconst RevenueRedirectPage = lazy(() =>\n import(\"./pages/RevenueRedirectPage\").then((m) => ({\n default: m.RevenueRedirectPage,\n })),\n);\nconst ApplicationsPage = lazy(() =>\n import(\"./pages/ApplicationsPage\").then((m) => ({\n default: m.ApplicationsPage,\n })),\n);\nconst ApplicationDetailPage = lazy(() =>\n import(\"./pages/ApplicationDetailPage\").then((m) => ({\n default: m.ApplicationDetailPage,\n })),\n);\nconst CreateApplicationPage = lazy(() =>\n import(\"./pages/CreateApplicationPage\").then((m) => ({\n default: m.CreateApplicationPage,\n })),\n);\nconst EditApplicationPage = lazy(() =>\n import(\"./pages/EditApplicationPage\").then((m) => ({\n default: m.EditApplicationPage,\n })),\n);\nconst ApplicationVersionsPage = lazy(() =>\n import(\"./pages/ApplicationVersionsPage\").then((m) => ({\n default: m.ApplicationVersionsPage,\n })),\n);\nconst OAuthClientsPage = lazy(() =>\n import(\"./pages/OAuthClientsPage\").then((m) => ({\n default: m.OAuthClientsPage,\n })),\n);\nconst CreateOAuthClientPage = lazy(() =>\n import(\"./pages/CreateOAuthClientPage\").then((m) => ({\n default: m.CreateOAuthClientPage,\n })),\n);\nconst OAuthClientDetailPage = lazy(() =>\n import(\"./pages/OAuthClientDetailPage\").then((m) => ({\n default: m.OAuthClientDetailPage,\n })),\n);\nconst ApiKeysPage = lazy(() =>\n import(\"./pages/ApiKeysPage\").then((m) => ({ default: m.ApiKeysPage })),\n);\nconst CreateApiKeyPage = lazy(() =>\n import(\"./pages/CreateApiKeyPage\").then((m) => ({\n default: m.CreateApiKeyPage,\n })),\n);\nconst WebhooksPage = lazy(() =>\n import(\"./pages/WebhooksPage\").then((m) => ({ default: m.WebhooksPage })),\n);\nconst CreateWebhookPage = lazy(() =>\n import(\"./pages/CreateWebhookPage\").then((m) => ({\n default: m.CreateWebhookPage,\n })),\n);\nconst WebhookDetailPage = lazy(() =>\n import(\"./pages/WebhookDetailPage\").then((m) => ({\n default: m.WebhookDetailPage,\n })),\n);\nconst AnalyticsDashboardPage = lazy(() =>\n import(\"./pages/AnalyticsDashboardPage\").then((m) => ({\n default: m.AnalyticsDashboardPage,\n })),\n);\nconst DocumentationPage = lazy(() =>\n import(\"./pages/DocumentationPage\").then((m) => ({\n default: m.DocumentationPage,\n })),\n);\nconst ResourcesPage = lazy(() =>\n import(\"./pages/ResourcesPage\").then((m) => ({ default: m.ResourcesPage })),\n);\nconst SettingsPage = lazy(() =>\n import(\"./pages/SettingsPage\").then((m) => ({ default: m.SettingsPage })),\n);\nconst PublishPage = lazy(() =>\n import(\"./pages/PublishPage\").then((m) => ({ default: m.PublishPage })),\n);\nconst AppLogsPage = lazy(() =>\n import(\"./pages/AppLogsPage\").then((m) => ({ default: m.AppLogsPage })),\n);\nconst DelegationsPage = lazy(() =>\n import(\"./pages/DelegationsPage\").then((m) => ({\n default: m.DelegationsPage,\n })),\n);\nconst ListingPreviewPage = lazy(() =>\n import(\"./pages/ListingPreviewPage\").then((m) => ({\n default: m.ListingPreviewPage,\n })),\n);\nconst StoreSubmissionPage = lazy(() =>\n import(\"./pages/StoreSubmissionPage\").then((m) => ({\n default: m.StoreSubmissionPage,\n })),\n);\nconst PublisherProfilePage = lazy(() =>\n import(\"./pages/PublisherProfilePage\").then((m) => ({\n default: m.PublisherProfilePage,\n })),\n);\n\n/**\n * Inner routes component - renders actual page routes\n */\nfunction InnerRoutes() {\n return (\n <Routes>\n {/* Dashboard */}\n <Route index element={gated(\"dashboard\", <DashboardPage />)} />\n\n {/* Organizations */}\n <Route\n path=\"organizations\"\n element={gated(\"organizations\", <OrganizationsPage />)}\n />\n <Route\n path=\"organizations/new\"\n element={gated(\"organizations.create\", <CreateOrganizationPage />)}\n />\n <Route\n path=\"organizations/:orgId\"\n element={gated(\"organizations.detail\", <OrganizationDetailPage />)}\n />\n <Route\n path=\"organizations/:orgId/members\"\n element={gated(\"organizations.members\", <OrganizationMembersPage />)}\n />\n <Route\n path=\"organizations/:orgId/revenue\"\n element={gated(\"organizations.revenue\", <RevenueRedirectPage />)}\n />\n\n {/* Applications */}\n <Route path=\"apps\" element={gated(\"apps\", <ApplicationsPage />)} />\n <Route\n path=\"apps/new\"\n element={gated(\"apps.create\", <CreateApplicationPage />)}\n />\n <Route\n path=\"apps/:appId\"\n element={gated(\"apps.detail\", <ApplicationDetailPage />)}\n />\n <Route\n path=\"apps/:appId/edit\"\n element={gated(\"apps.edit\", <EditApplicationPage />)}\n />\n <Route\n path=\"apps/:appId/versions\"\n element={gated(\"apps.versions\", <ApplicationVersionsPage />)}\n />\n <Route\n path=\"apps/:appId/publish\"\n element={gated(\"apps.publish\", <PublishPage />)}\n />\n <Route\n path=\"apps/:appId/store-submission\"\n element={gated(\"apps.storeSubmission\", <StoreSubmissionPage />)}\n />\n <Route\n path=\"apps/:appId/listing\"\n element={gated(\"apps.listing\", <ListingPreviewPage />)}\n />\n <Route\n path=\"apps/:appId/logs\"\n element={gated(\"apps.logs\", <AppLogsPage />)}\n />\n\n {/* OAuth Clients — user-scoped via auth-svc (no app nesting) */}\n <Route path=\"oauth\" element={gated(\"oauth\", <OAuthClientsPage />)} />\n <Route\n path=\"oauth/new\"\n element={gated(\"oauth.create\", <CreateOAuthClientPage />)}\n />\n <Route\n path=\"oauth/:clientId\"\n element={gated(\"oauth.detail\", <OAuthClientDetailPage />)}\n />\n\n {/* API Keys — user-scoped via auth-svc (no app nesting) */}\n <Route path=\"api-keys\" element={gated(\"apiKeys\", <ApiKeysPage />)} />\n <Route\n path=\"api-keys/new\"\n element={gated(\"apiKeys.create\", <CreateApiKeyPage />)}\n />\n\n {/* Webhooks (App-specific) */}\n <Route\n path=\"apps/:appId/webhooks\"\n element={gated(\"apps.webhooks\", <WebhooksPage />)}\n />\n <Route\n path=\"apps/:appId/webhooks/new\"\n element={gated(\"apps.webhooks.create\", <CreateWebhookPage />)}\n />\n <Route\n path=\"apps/:appId/webhooks/:webhookId\"\n element={gated(\"apps.webhooks.detail\", <WebhookDetailPage />)}\n />\n\n {/* App Analytics */}\n <Route\n path=\"apps/:appId/analytics\"\n element={gated(\"apps.analytics\", <AnalyticsDashboardPage />)}\n />\n\n {/* Delegations */}\n <Route\n path=\"delegations\"\n element={gated(\"delegations\", <DelegationsPage />)}\n />\n\n {/* Global Webhooks views */}\n <Route\n path=\"webhooks/new\"\n element={gated(\"webhooks.create\", <CreateWebhookPage />)}\n />\n <Route path=\"webhooks\" element={gated(\"webhooks\", <WebhooksPage />)} />\n\n {/* Analytics & Revenue */}\n <Route\n path=\"analytics\"\n element={gated(\"analytics\", <AnalyticsDashboardPage />)}\n />\n <Route\n path=\"revenue\"\n element={gated(\"revenue\", <RevenueRedirectPage />)}\n />\n\n {/* Documentation & Resources */}\n <Route path=\"docs\" element={gated(\"docs\", <DocumentationPage />)} />\n <Route path=\"resources\" element={gated(\"resources\", <ResourcesPage />)} />\n\n {/* Admin surfaces (e.g. /admin/reviews) live in admin-app via\n AdminDevportalRoot — intentionally not mounted in user shells. */}\n\n {/* Publisher */}\n <Route\n path=\"publisher/profile\"\n element={gated(\"publisher.profile\", <PublisherProfilePage />)}\n />\n\n {/* Settings */}\n <Route path=\"settings\" element={gated(\"settings\", <SettingsPage />)} />\n\n {/* Catch-all redirect to dashboard */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n );\n}\n\n/**\n * Developer Portal Routes\n *\n * Defines all the routes for the developer portal microfrontend.\n * Uses lazy loading for all pages except the dashboard for optimal performance.\n *\n * When integrated into a shell (basePath provided), the shell already handles\n * the basePath route (e.g., /devportal/*), so this component should render\n * routes relative to that path - NOT nest them under basePath again.\n *\n * Example:\n * - Shell route: /devportal/*\n * - User navigates to: /devportal/organizations\n * - Inside DevportalRoutes, the path is: /organizations (relative to shell route)\n * - InnerRoutes matches: organizations -> OrganizationsPage\n */\nexport function DevportalRoutes() {\n // When basePath is provided, we're in shell integration mode.\n // The shell already matched the basePath route, so we render routes\n // relative to that - using wildcard to catch all sub-paths.\n // When no basePath (standalone mode), just render InnerRoutes at root.\n return (\n <Suspense fallback={<LoadingState message=\"Loading page...\" />}>\n <Routes>\n {/* Wildcard route to let InnerRoutes handle all paths */}\n <Route path=\"/*\" element={<InnerRoutes />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DevportalRoutes.js","names":[],"sources":["../../src/devportal/DevportalRoutes.tsx"],"sourcesContent":["import { Suspense, lazy, useEffect, type ReactNode } from \"react\";\nimport { Routes, Route, Navigate } from \"react-router-dom\";\nimport { LoadingState } from \"./components/LoadingState\";\nimport { FeatureFlaggedRoute } from \"./components/FeatureFlaggedRoute\";\nimport { TelemetryErrorBoundary } from \"./components/TelemetryErrorBoundary\";\nimport { SectionNav } from \"./components/SectionNav\";\nimport { useDevportal } from \"./providers/DevportalProvider\";\n\n/**\n * Catch-all redirect target for the unmatched `*` route. Uses the\n * DevportalProvider's `basePath` and `navigate` so the redirect works\n * regardless of the integration mode (shell or standalone). Falls back to a\n * relative Navigate when neither is wired, which is the standalone/test path.\n */\nfunction CatchAllRedirect() {\n const { basePath, navigate } = useDevportal();\n useEffect(() => {\n if (basePath && navigate) {\n const target = basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath;\n navigate(target || \"/\");\n }\n }, [basePath, navigate]);\n if (basePath && navigate) return null;\n return <Navigate to=\"..\" replace />;\n}\n\n/**\n * Wrap a page element with the per-route feature flag gate and a\n * telemetry-emitting error boundary. The flag name follows\n * `devportal.<page-slug>` convention; when disabled the user sees a\n * graceful fallback instead of a route-level crash.\n *\n * Per `dev/platform/context/feature-flags` and spec\n * `microfrontends/47-FRONTEND-EVENT-BUS.md` (error.boundary emission).\n */\nfunction gated(slug: string, element: ReactNode): ReactNode {\n return (\n <TelemetryErrorBoundary scope={slug}>\n <FeatureFlaggedRoute flag={`devportal.${slug}`}>\n {element}\n </FeatureFlaggedRoute>\n </TelemetryErrorBoundary>\n );\n}\n\n// Eager load the main dashboard page\nimport { DashboardPage } from \"./pages/DashboardPage\";\n\n// Lazy load all other pages\nconst OrganizationsPage = lazy(() =>\n import(\"./pages/OrganizationsPage\").then((m) => ({\n default: m.OrganizationsPage,\n })),\n);\nconst OrganizationDetailPage = lazy(() =>\n import(\"./pages/OrganizationDetailPage\").then((m) => ({\n default: m.OrganizationDetailPage,\n })),\n);\nconst CreateOrganizationPage = lazy(() =>\n import(\"./pages/CreateOrganizationPage\").then((m) => ({\n default: m.CreateOrganizationPage,\n })),\n);\nconst OrganizationMembersPage = lazy(() =>\n import(\"./pages/OrganizationMembersPage\").then((m) => ({\n default: m.OrganizationMembersPage,\n })),\n);\nconst RevenueRedirectPage = lazy(() =>\n import(\"./pages/RevenueRedirectPage\").then((m) => ({\n default: m.RevenueRedirectPage,\n })),\n);\nconst ApplicationsPage = lazy(() =>\n import(\"./pages/ApplicationsPage\").then((m) => ({\n default: m.ApplicationsPage,\n })),\n);\nconst ApplicationDetailPage = lazy(() =>\n import(\"./pages/ApplicationDetailPage\").then((m) => ({\n default: m.ApplicationDetailPage,\n })),\n);\nconst CreateApplicationPage = lazy(() =>\n import(\"./pages/CreateApplicationPage\").then((m) => ({\n default: m.CreateApplicationPage,\n })),\n);\nconst EditApplicationPage = lazy(() =>\n import(\"./pages/EditApplicationPage\").then((m) => ({\n default: m.EditApplicationPage,\n })),\n);\nconst ApplicationVersionsPage = lazy(() =>\n import(\"./pages/ApplicationVersionsPage\").then((m) => ({\n default: m.ApplicationVersionsPage,\n })),\n);\nconst OAuthClientsPage = lazy(() =>\n import(\"./pages/OAuthClientsPage\").then((m) => ({\n default: m.OAuthClientsPage,\n })),\n);\nconst CreateOAuthClientPage = lazy(() =>\n import(\"./pages/CreateOAuthClientPage\").then((m) => ({\n default: m.CreateOAuthClientPage,\n })),\n);\nconst OAuthClientDetailPage = lazy(() =>\n import(\"./pages/OAuthClientDetailPage\").then((m) => ({\n default: m.OAuthClientDetailPage,\n })),\n);\nconst ApiKeysPage = lazy(() =>\n import(\"./pages/ApiKeysPage\").then((m) => ({ default: m.ApiKeysPage })),\n);\nconst CreateApiKeyPage = lazy(() =>\n import(\"./pages/CreateApiKeyPage\").then((m) => ({\n default: m.CreateApiKeyPage,\n })),\n);\nconst WebhooksPage = lazy(() =>\n import(\"./pages/WebhooksPage\").then((m) => ({ default: m.WebhooksPage })),\n);\nconst CreateWebhookPage = lazy(() =>\n import(\"./pages/CreateWebhookPage\").then((m) => ({\n default: m.CreateWebhookPage,\n })),\n);\nconst WebhookDetailPage = lazy(() =>\n import(\"./pages/WebhookDetailPage\").then((m) => ({\n default: m.WebhookDetailPage,\n })),\n);\nconst AnalyticsDashboardPage = lazy(() =>\n import(\"./pages/AnalyticsDashboardPage\").then((m) => ({\n default: m.AnalyticsDashboardPage,\n })),\n);\nconst DocumentationPage = lazy(() =>\n import(\"./pages/DocumentationPage\").then((m) => ({\n default: m.DocumentationPage,\n })),\n);\nconst ResourcesPage = lazy(() =>\n import(\"./pages/ResourcesPage\").then((m) => ({ default: m.ResourcesPage })),\n);\nconst SettingsPage = lazy(() =>\n import(\"./pages/SettingsPage\").then((m) => ({ default: m.SettingsPage })),\n);\nconst PublishPage = lazy(() =>\n import(\"./pages/PublishPage\").then((m) => ({ default: m.PublishPage })),\n);\nconst AppLogsPage = lazy(() =>\n import(\"./pages/AppLogsPage\").then((m) => ({ default: m.AppLogsPage })),\n);\nconst DelegationsPage = lazy(() =>\n import(\"./pages/DelegationsPage\").then((m) => ({\n default: m.DelegationsPage,\n })),\n);\nconst ListingPreviewPage = lazy(() =>\n import(\"./pages/ListingPreviewPage\").then((m) => ({\n default: m.ListingPreviewPage,\n })),\n);\nconst StoreSubmissionPage = lazy(() =>\n import(\"./pages/StoreSubmissionPage\").then((m) => ({\n default: m.StoreSubmissionPage,\n })),\n);\nconst PublisherProfilePage = lazy(() =>\n import(\"./pages/PublisherProfilePage\").then((m) => ({\n default: m.PublisherProfilePage,\n })),\n);\n\n/**\n * Inner routes component - renders actual page routes\n */\nfunction InnerRoutes() {\n return (\n <>\n <SectionNav />\n <Routes>\n {/* Dashboard */}\n <Route index element={gated(\"dashboard\", <DashboardPage />)} />\n\n {/* Organizations */}\n <Route\n path=\"organizations\"\n element={gated(\"organizations\", <OrganizationsPage />)}\n />\n <Route\n path=\"organizations/new\"\n element={gated(\"organizations.create\", <CreateOrganizationPage />)}\n />\n <Route\n path=\"organizations/:orgId\"\n element={gated(\"organizations.detail\", <OrganizationDetailPage />)}\n />\n <Route\n path=\"organizations/:orgId/members\"\n element={gated(\"organizations.members\", <OrganizationMembersPage />)}\n />\n <Route\n path=\"organizations/:orgId/revenue\"\n element={gated(\"organizations.revenue\", <RevenueRedirectPage />)}\n />\n\n {/* Applications */}\n <Route path=\"apps\" element={gated(\"apps\", <ApplicationsPage />)} />\n <Route\n path=\"apps/new\"\n element={gated(\"apps.create\", <CreateApplicationPage />)}\n />\n <Route\n path=\"apps/:appId\"\n element={gated(\"apps.detail\", <ApplicationDetailPage />)}\n />\n <Route\n path=\"apps/:appId/edit\"\n element={gated(\"apps.edit\", <EditApplicationPage />)}\n />\n <Route\n path=\"apps/:appId/versions\"\n element={gated(\"apps.versions\", <ApplicationVersionsPage />)}\n />\n <Route\n path=\"apps/:appId/publish\"\n element={gated(\"apps.publish\", <PublishPage />)}\n />\n <Route\n path=\"apps/:appId/store-submission\"\n element={gated(\"apps.storeSubmission\", <StoreSubmissionPage />)}\n />\n <Route\n path=\"apps/:appId/listing\"\n element={gated(\"apps.listing\", <ListingPreviewPage />)}\n />\n <Route\n path=\"apps/:appId/logs\"\n element={gated(\"apps.logs\", <AppLogsPage />)}\n />\n\n {/* OAuth Clients — user-scoped via auth-svc (no app nesting) */}\n <Route path=\"oauth\" element={gated(\"oauth\", <OAuthClientsPage />)} />\n <Route\n path=\"oauth/new\"\n element={gated(\"oauth.create\", <CreateOAuthClientPage />)}\n />\n <Route\n path=\"oauth/:clientId\"\n element={gated(\"oauth.detail\", <OAuthClientDetailPage />)}\n />\n\n {/* API Keys — user-scoped via auth-svc (no app nesting) */}\n <Route path=\"api-keys\" element={gated(\"apiKeys\", <ApiKeysPage />)} />\n <Route\n path=\"api-keys/new\"\n element={gated(\"apiKeys.create\", <CreateApiKeyPage />)}\n />\n\n {/* Webhooks (App-specific) */}\n <Route\n path=\"apps/:appId/webhooks\"\n element={gated(\"apps.webhooks\", <WebhooksPage />)}\n />\n <Route\n path=\"apps/:appId/webhooks/new\"\n element={gated(\"apps.webhooks.create\", <CreateWebhookPage />)}\n />\n <Route\n path=\"apps/:appId/webhooks/:webhookId\"\n element={gated(\"apps.webhooks.detail\", <WebhookDetailPage />)}\n />\n\n {/* App Analytics */}\n <Route\n path=\"apps/:appId/analytics\"\n element={gated(\"apps.analytics\", <AnalyticsDashboardPage />)}\n />\n\n {/* Delegations */}\n <Route\n path=\"delegations\"\n element={gated(\"delegations\", <DelegationsPage />)}\n />\n\n {/* Global Webhooks views */}\n <Route\n path=\"webhooks/new\"\n element={gated(\"webhooks.create\", <CreateWebhookPage />)}\n />\n <Route path=\"webhooks\" element={gated(\"webhooks\", <WebhooksPage />)} />\n\n {/* Analytics & Revenue */}\n <Route\n path=\"analytics\"\n element={gated(\"analytics\", <AnalyticsDashboardPage />)}\n />\n <Route\n path=\"revenue\"\n element={gated(\"revenue\", <RevenueRedirectPage />)}\n />\n\n {/* Documentation & Resources */}\n <Route path=\"docs\" element={gated(\"docs\", <DocumentationPage />)} />\n <Route\n path=\"resources\"\n element={gated(\"resources\", <ResourcesPage />)}\n />\n\n {/* Admin surfaces (e.g. /admin/reviews) live in admin-app via\n AdminDevportalRoot — intentionally not mounted in user shells. */}\n\n {/* Publisher */}\n <Route\n path=\"publisher/profile\"\n element={gated(\"publisher.profile\", <PublisherProfilePage />)}\n />\n\n {/* Settings */}\n <Route path=\"settings\" element={gated(\"settings\", <SettingsPage />)} />\n\n {/* Catch-all redirect to dashboard */}\n <Route path=\"*\" element={<CatchAllRedirect />} />\n </Routes>\n </>\n );\n}\n\n/**\n * Developer Portal Routes\n *\n * Defines all the routes for the developer portal microfrontend.\n * Uses lazy loading for all pages except the dashboard for optimal performance.\n *\n * When integrated into a shell (basePath provided), the shell already handles\n * the basePath route (e.g., /devportal/*), so this component should render\n * routes relative to that path - NOT nest them under basePath again.\n *\n * Example:\n * - Shell route: /devportal/*\n * - User navigates to: /devportal/organizations\n * - Inside DevportalRoutes, the path is: /organizations (relative to shell route)\n * - InnerRoutes matches: organizations -> OrganizationsPage\n */\nexport function DevportalRoutes() {\n // When basePath is provided, we're in shell integration mode.\n // The shell already matched the basePath route, so we render routes\n // relative to that - using wildcard to catch all sub-paths.\n // When no basePath (standalone mode), just render InnerRoutes at root.\n return (\n <Suspense fallback={<LoadingState message=\"Loading page...\" />}>\n <Routes>\n {/* Wildcard route to let InnerRoutes handle all paths */}\n <Route path=\"/*\" element={<InnerRoutes />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { FC } from 'react';
2
+ import { LayoutDashboard } from 'lucide-react';
3
+
4
+ interface SectionDef {
5
+ path: string;
6
+ i18nKey: string;
7
+ fallback: string;
8
+ icon: typeof LayoutDashboard;
9
+ /** Additional sub-paths that should mark this section as active. */
10
+ matchPrefixes?: string[];
11
+ }
12
+ /**
13
+ * Horizontal section nav rendered above the page content on every devportal
14
+ * route. Gives developers a one-click jump between all top-level sections so
15
+ * routes like OAuth, Delegations, Analytics, Revenue, Docs, Resources,
16
+ * Publisher Profile, and Settings are reachable without typing URLs.
17
+ *
18
+ * Renders nothing when `basePath` is undefined (standalone/dev mode) so it
19
+ * doesn't conflict with whatever harness wraps the MFE there.
20
+ */
21
+ export declare const SectionNav: FC;
22
+ export declare const __SECTION_NAV_SECTIONS: readonly SectionDef[];
23
+ export {};
24
+ //# sourceMappingURL=SectionNav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionNav.d.ts","sourceRoot":"","sources":["../../../src/devportal/components/SectionNav.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EACL,eAAe,EAahB,MAAM,cAAc,CAAC;AAKtB,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,eAAe,CAAC;IAC7B,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AA4GD;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,EAAE,EA+CxB,CAAC;AAGF,eAAO,MAAM,sBAAsB,uBAAW,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { useDevportal as e } from "../providers/DevportalProvider.js";
2
+ import { cn as t } from "../utils/cn.js";
3
+ import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
4
+ import { AppWindow as r, BarChart3 as i, BookOpen as a, Building2 as o, DollarSign as s, Key as c, KeyRound as l, LayoutDashboard as u, Library as d, Settings as f, Share2 as p, User as m, Webhook as h } from "lucide-react";
5
+ import { useLocation as g } from "react-router-dom";
6
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
7
+ //#region src/devportal/components/SectionNav.tsx
8
+ var y = [
9
+ {
10
+ path: "",
11
+ i18nKey: "devportal.nav.dashboard",
12
+ fallback: "Dashboard",
13
+ icon: u
14
+ },
15
+ {
16
+ path: "apps",
17
+ i18nKey: "devportal.nav.apps",
18
+ fallback: "Apps",
19
+ icon: r
20
+ },
21
+ {
22
+ path: "organizations",
23
+ i18nKey: "devportal.nav.organizations",
24
+ fallback: "Organizations",
25
+ icon: o
26
+ },
27
+ {
28
+ path: "oauth",
29
+ i18nKey: "devportal.nav.oauth",
30
+ fallback: "OAuth Clients",
31
+ icon: l
32
+ },
33
+ {
34
+ path: "api-keys",
35
+ i18nKey: "devportal.nav.apiKeys",
36
+ fallback: "API Keys",
37
+ icon: c
38
+ },
39
+ {
40
+ path: "webhooks",
41
+ i18nKey: "devportal.nav.webhooks",
42
+ fallback: "Webhooks",
43
+ icon: h
44
+ },
45
+ {
46
+ path: "delegations",
47
+ i18nKey: "devportal.nav.delegations",
48
+ fallback: "Delegations",
49
+ icon: p
50
+ },
51
+ {
52
+ path: "analytics",
53
+ i18nKey: "devportal.nav.analytics",
54
+ fallback: "Analytics",
55
+ icon: i
56
+ },
57
+ {
58
+ path: "revenue",
59
+ i18nKey: "devportal.nav.revenue",
60
+ fallback: "Revenue",
61
+ icon: s
62
+ },
63
+ {
64
+ path: "docs",
65
+ i18nKey: "devportal.nav.docs",
66
+ fallback: "Docs",
67
+ icon: a
68
+ },
69
+ {
70
+ path: "resources",
71
+ i18nKey: "devportal.nav.resources",
72
+ fallback: "Resources",
73
+ icon: d
74
+ },
75
+ {
76
+ path: "publisher/profile",
77
+ i18nKey: "devportal.nav.publisher",
78
+ fallback: "Publisher",
79
+ icon: m,
80
+ matchPrefixes: ["publisher"]
81
+ },
82
+ {
83
+ path: "settings",
84
+ i18nKey: "devportal.nav.settings",
85
+ fallback: "Settings",
86
+ icon: f
87
+ }
88
+ ];
89
+ function b(e, t) {
90
+ let n = (e ?? "").replace(/\/$/, "");
91
+ return t ? `${n}${t.startsWith("/") ? t : `/${t}`}` : n || "/";
92
+ }
93
+ function x(e, t, n) {
94
+ let r = b(t, n.path);
95
+ return n.path === "" ? e === r || e === `${r}/` : [n.path, ...n.matchPrefixes ?? []].some((n) => {
96
+ let r = b(t, n);
97
+ return e === r || e.startsWith(`${r}/`);
98
+ });
99
+ }
100
+ var S = () => {
101
+ let { navigate: r, basePath: i } = e(), { pathname: a } = g(), { t: o } = n(), s = (e, t) => {
102
+ let n = o(e);
103
+ return n === e ? t : n;
104
+ };
105
+ if (!i || !r) return null;
106
+ let c = (e) => {
107
+ r(b(i, e));
108
+ };
109
+ return /* @__PURE__ */ _("nav", {
110
+ "aria-label": s("devportal.nav.sections", "Developer portal sections"),
111
+ className: "border-b border-border bg-card/40 px-4 py-2",
112
+ "data-testid": "devportal-section-nav",
113
+ children: /* @__PURE__ */ _("ul", {
114
+ className: "flex flex-wrap gap-1",
115
+ children: y.map((e) => {
116
+ let n = x(a, i, e), r = e.icon;
117
+ return /* @__PURE__ */ _("li", { children: /* @__PURE__ */ v("button", {
118
+ type: "button",
119
+ onClick: () => c(e.path),
120
+ "aria-current": n ? "page" : void 0,
121
+ className: t("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium transition-colors", n ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-accent hover:text-foreground"),
122
+ children: [/* @__PURE__ */ _(r, { size: 14 }), /* @__PURE__ */ _("span", { children: s(e.i18nKey, e.fallback) })]
123
+ }) }, e.path);
124
+ })
125
+ })
126
+ });
127
+ };
128
+ //#endregion
129
+ export { S as SectionNav };
130
+
131
+ //# sourceMappingURL=SectionNav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionNav.js","names":[],"sources":["../../../src/devportal/components/SectionNav.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport {\n LayoutDashboard,\n AppWindow,\n Building2,\n KeyRound,\n Key,\n Webhook,\n Share2,\n BarChart3,\n DollarSign,\n BookOpen,\n Library,\n User,\n Settings,\n} from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport { cn } from \"../utils/cn\";\n\ninterface SectionDef {\n path: string;\n i18nKey: string;\n fallback: string;\n icon: typeof LayoutDashboard;\n /** Additional sub-paths that should mark this section as active. */\n matchPrefixes?: string[];\n}\n\nconst SECTIONS: ReadonlyArray<SectionDef> = [\n {\n path: \"\",\n i18nKey: \"devportal.nav.dashboard\",\n fallback: \"Dashboard\",\n icon: LayoutDashboard,\n },\n {\n path: \"apps\",\n i18nKey: \"devportal.nav.apps\",\n fallback: \"Apps\",\n icon: AppWindow,\n },\n {\n path: \"organizations\",\n i18nKey: \"devportal.nav.organizations\",\n fallback: \"Organizations\",\n icon: Building2,\n },\n {\n path: \"oauth\",\n i18nKey: \"devportal.nav.oauth\",\n fallback: \"OAuth Clients\",\n icon: KeyRound,\n },\n {\n path: \"api-keys\",\n i18nKey: \"devportal.nav.apiKeys\",\n fallback: \"API Keys\",\n icon: Key,\n },\n {\n path: \"webhooks\",\n i18nKey: \"devportal.nav.webhooks\",\n fallback: \"Webhooks\",\n icon: Webhook,\n },\n {\n path: \"delegations\",\n i18nKey: \"devportal.nav.delegations\",\n fallback: \"Delegations\",\n icon: Share2,\n },\n {\n path: \"analytics\",\n i18nKey: \"devportal.nav.analytics\",\n fallback: \"Analytics\",\n icon: BarChart3,\n },\n {\n path: \"revenue\",\n i18nKey: \"devportal.nav.revenue\",\n fallback: \"Revenue\",\n icon: DollarSign,\n },\n {\n path: \"docs\",\n i18nKey: \"devportal.nav.docs\",\n fallback: \"Docs\",\n icon: BookOpen,\n },\n {\n path: \"resources\",\n i18nKey: \"devportal.nav.resources\",\n fallback: \"Resources\",\n icon: Library,\n },\n {\n path: \"publisher/profile\",\n i18nKey: \"devportal.nav.publisher\",\n fallback: \"Publisher\",\n icon: User,\n matchPrefixes: [\"publisher\"],\n },\n {\n path: \"settings\",\n i18nKey: \"devportal.nav.settings\",\n fallback: \"Settings\",\n icon: Settings,\n },\n];\n\nfunction joinBaseAndPath(basePath: string | undefined, path: string): string {\n const base = (basePath ?? \"\").replace(/\\/$/, \"\");\n if (!path) return base || \"/\";\n const suffix = path.startsWith(\"/\") ? path : `/${path}`;\n return `${base}${suffix}`;\n}\n\nfunction isSectionActive(\n pathname: string,\n basePath: string | undefined,\n section: SectionDef,\n): boolean {\n const sectionUrl = joinBaseAndPath(basePath, section.path);\n // Index/dashboard is active only when exactly matched (or with empty extra).\n if (section.path === \"\") {\n return pathname === sectionUrl || pathname === `${sectionUrl}/`;\n }\n const candidates = [section.path, ...(section.matchPrefixes ?? [])];\n return candidates.some((prefix) => {\n const url = joinBaseAndPath(basePath, prefix);\n return pathname === url || pathname.startsWith(`${url}/`);\n });\n}\n\n/**\n * Horizontal section nav rendered above the page content on every devportal\n * route. Gives developers a one-click jump between all top-level sections so\n * routes like OAuth, Delegations, Analytics, Revenue, Docs, Resources,\n * Publisher Profile, and Settings are reachable without typing URLs.\n *\n * Renders nothing when `basePath` is undefined (standalone/dev mode) so it\n * doesn't conflict with whatever harness wraps the MFE there.\n */\nexport const SectionNav: FC = () => {\n const { navigate, basePath } = useDevportal();\n const { pathname } = useLocation();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n\n if (!basePath || !navigate) return null;\n\n const handleClick = (path: string) => {\n navigate(joinBaseAndPath(basePath, path));\n };\n\n return (\n <nav\n aria-label={tr(\"devportal.nav.sections\", \"Developer portal sections\")}\n className=\"border-b border-border bg-card/40 px-4 py-2\"\n data-testid=\"devportal-section-nav\"\n >\n <ul className=\"flex flex-wrap gap-1\">\n {SECTIONS.map((section) => {\n const active = isSectionActive(pathname, basePath, section);\n const Icon = section.icon;\n return (\n <li key={section.path}>\n <button\n type=\"button\"\n onClick={() => handleClick(section.path)}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium transition-colors\",\n active\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n <Icon size={14} />\n <span>{tr(section.i18nKey, section.fallback)}</span>\n </button>\n </li>\n );\n })}\n </ul>\n </nav>\n );\n};\n\n// Exported for unit tests that want to assert against the canonical list.\nexport const __SECTION_NAV_SECTIONS = SECTIONS;\n"],"mappings":";;;;;;;AA8BA,IAAM,IAAsC;CAC1C;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACN,eAAe,CAAC,YAAY;EAC7B;CACD;EACE,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM;EACP;CACF;AAED,SAAS,EAAgB,GAA8B,GAAsB;CAC3E,IAAM,KAAQ,KAAY,IAAI,QAAQ,OAAO,GAAG;AAGhD,QAFK,IAEE,GAAG,IADK,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI,QAD/B,KAAQ;;AAK5B,SAAS,EACP,GACA,GACA,GACS;CACT,IAAM,IAAa,EAAgB,GAAU,EAAQ,KAAK;AAM1D,QAJI,EAAQ,SAAS,KACZ,MAAa,KAAc,MAAa,GAAG,EAAW,KAE5C,CAAC,EAAQ,MAAM,GAAI,EAAQ,iBAAiB,EAAE,CAAE,CACjD,MAAM,MAAW;EACjC,IAAM,IAAM,EAAgB,GAAU,EAAO;AAC7C,SAAO,MAAa,KAAO,EAAS,WAAW,GAAG,EAAI,GAAG;GACzD;;AAYJ,IAAa,UAAuB;CAClC,IAAM,EAAE,aAAU,gBAAa,GAAc,EACvC,EAAE,gBAAa,GAAa,EAC5B,EAAE,SAAM,GAAS,EACjB,KAAM,GAAa,MAA6B;EACpD,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;;AAGpC,KAAI,CAAC,KAAY,CAAC,EAAU,QAAO;CAEnC,IAAM,KAAe,MAAiB;AACpC,IAAS,EAAgB,GAAU,EAAK,CAAC;;AAG3C,QACE,kBAAC,OAAD;EACE,cAAY,EAAG,0BAA0B,4BAA4B;EACrE,WAAU;EACV,eAAY;YAEZ,kBAAC,MAAD;GAAI,WAAU;aACX,EAAS,KAAK,MAAY;IACzB,IAAM,IAAS,EAAgB,GAAU,GAAU,EAAQ,EACrD,IAAO,EAAQ;AACrB,WACE,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAY,EAAQ,KAAK;KACxC,gBAAc,IAAS,SAAS,KAAA;KAChC,WAAW,EACT,iGACA,IACI,uCACA,8DACL;eATH,CAWE,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA,EAClB,kBAAC,QAAD,EAAA,UAAO,EAAG,EAAQ,SAAS,EAAQ,SAAS,EAAQ,CAAA,CAC7C;QACN,EAfI,EAAQ,KAeZ;KAEP;GACC,CAAA;EACD,CAAA"}
@@ -17,4 +17,5 @@ export * from './GrantDelegationModal';
17
17
  export * from './PermissionGuard';
18
18
  export * from './FeatureFlaggedRoute';
19
19
  export * from './TelemetryErrorBoundary';
20
+ export * from './SectionNav';
20
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/devportal/components/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/devportal/components/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC"}
@@ -2,6 +2,7 @@ import "./LoadingState.js";
2
2
  import "./EmptyState.js";
3
3
  import "./FeatureFlaggedRoute.js";
4
4
  import "./TelemetryErrorBoundary.js";
5
+ import "./SectionNav.js";
5
6
  import "./PageLayout.js";
6
7
  import "./StatCard.js";
7
8
  import "./StatusBadge.js";
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationVersionsPage.d.ts","sourceRoot":"","sources":["../../../src/devportal/pages/ApplicationVersionsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAgChC,eAAO,MAAM,uBAAuB,EAAE,EAolBrC,CAAC"}
1
+ {"version":3,"file":"ApplicationVersionsPage.d.ts","sourceRoot":"","sources":["../../../src/devportal/pages/ApplicationVersionsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAgChC,eAAO,MAAM,uBAAuB,EAAE,EAulBrC,CAAC"}
@@ -30,7 +30,7 @@ var x = () => {
30
30
  variables: { applicationId: E },
31
31
  skip: !E,
32
32
  fetchPolicy: "cache-and-network"
33
- }), [H, { loading: U }] = c({ refetchQueries: ["GetApplicationVersions"] }), [W] = ne({ refetchQueries: ["GetApplicationVersions"] }), [G] = ee({ refetchQueries: ["GetApplicationVersions"] }), K = f(() => z?.application?.versions ?? [], [z?.application?.versions]), q = f(() => K.filter((e) => F.has(e.id)), [K, F]), J = f(() => q.filter((e) => e.status === "DRAFT"), [q]), Y = f(() => q.filter((e) => e.status === "PUBLISHED" && !e.isLatest), [q]), X = K.length > 0 && K.every((e) => F.has(e.id)), Z = K.some((e) => F.has(e.id)) && !X, ce = async () => {
33
+ }), [H, { loading: U }] = c({ refetchQueries: ["GetApplicationVersions"] }), [W] = ne({ refetchQueries: ["GetApplicationVersions"] }), [G] = ee({ refetchQueries: ["GetApplicationVersions"] }), K = f(() => z?.application?.versions?.edges?.map((e) => e.node) ?? [], [z?.application?.versions]), q = f(() => K.filter((e) => F.has(e.id)), [K, F]), J = f(() => q.filter((e) => e.status === "DRAFT"), [q]), Y = f(() => q.filter((e) => e.status === "PUBLISHED" && !e.isLatest), [q]), X = K.length > 0 && K.every((e) => F.has(e.id)), Z = K.some((e) => F.has(e.id)) && !X, ce = async () => {
34
34
  if (!(!E || !k.version.trim())) {
35
35
  M(null);
36
36
  try {