@burdenoff/microfe-billing 2026.706.1 → 2026.715.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.
@@ -8,20 +8,20 @@ import { FeatureGate as s } from "@burdenoff/fe-libs/shared/feature-flags";
8
8
  import { Navigate as c, Route as l, Routes as u, useNavigate as d } from "react-router-dom";
9
9
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
10
10
  //#region src/billing/BillingAdminRoutes.tsx
11
- var m = a(() => import("./modules/plans/index.js").then((e) => ({ default: e.PlansListPage }))), h = a(() => import("./modules/plans/index.js").then((e) => ({ default: e.PlanDetailPage }))), g = a(() => import("./modules/plans/index.js").then((e) => ({ default: e.PlanEditPage }))), _ = a(() => import("./modules/plans/index.js").then((e) => ({ default: e.PlanCreatePage }))), v = a(() => import("./modules/plans/index.js").then((e) => ({ default: e.PlanAssignFreePage }))), y = a(() => import("./modules/addons/index.js").then((e) => ({ default: e.AddonsListPage }))), b = a(() => import("./modules/addons/index.js").then((e) => ({ default: e.AddonDetailPage }))), x = a(() => import("./modules/addons/index.js").then((e) => ({ default: e.AddonEditPage }))), S = a(() => import("./modules/addons/index.js").then((e) => ({ default: e.AddonCreatePage }))), C = a(() => import("./modules/quota/index.js").then((e) => ({ default: e.QuotaTemplatesListPage }))), w = a(() => import("./modules/quota/index.js").then((e) => ({ default: e.QuotaTemplateDetailPage }))), T = a(() => import("./modules/quota/index.js").then((e) => ({ default: e.QuotaTemplateCreatePage }))), E = a(() => import("./modules/quota/index.js").then((e) => ({ default: e.QuotaTemplateEditPage }))), D = a(() => import("./modules/coupons/index.js").then((e) => ({ default: e.CouponsListPage }))), O = a(() => import("./modules/coupons/index.js").then((e) => ({ default: e.CreateCouponPage }))), k = a(() => import("./modules/coupons/index.js").then((e) => ({ default: e.EditCouponPage }))), A = a(() => import("./modules/coupons/index.js").then((e) => ({ default: e.CouponDetailPage }))), j = a(() => import("./modules/promotions/index.js").then((e) => ({ default: e.PromotionsListPage }))), M = a(() => import("./modules/promotions/index.js").then((e) => ({ default: e.CreatePromotionPage }))), N = a(() => import("./modules/discounts/index.js").then((e) => ({ default: e.DiscountsListPage }))), P = a(() => import("./modules/billing/index.js").then((e) => ({ default: e.RefundsPage }))), F = a(() => import("./modules/credits/index.js").then((e) => ({ default: e.AdminCreditsPage }))), I = a(() => import("./modules/analytics/index.js").then((e) => ({ default: e.AnalyticsPage }))), L = a(() => import("./modules/earnings/index.js").then((e) => ({ default: e.PayoutAdminPage })));
12
- function R() {
11
+ var m = a(() => import("./modules/plans/index.js").then((e) => ({ default: e.PlansListPage }))), h = a(() => import("./modules/plans/index.js").then((e) => ({ default: e.PlanDetailPage }))), g = a(() => import("./modules/plans/index.js").then((e) => ({ default: e.PlanEditPage }))), _ = a(() => import("./modules/plans/index.js").then((e) => ({ default: e.PlanCreatePage }))), v = a(() => import("./modules/plans/index.js").then((e) => ({ default: e.PlanAssignFreePage }))), y = a(() => import("./modules/addons/index.js").then((e) => ({ default: e.AddonsListPage }))), b = a(() => import("./modules/addons/index.js").then((e) => ({ default: e.AddonDetailPage }))), x = a(() => import("./modules/addons/index.js").then((e) => ({ default: e.AddonEditPage }))), S = a(() => import("./modules/addons/index.js").then((e) => ({ default: e.AddonCreatePage }))), C = a(() => import("./modules/quota/index.js").then((e) => ({ default: e.QuotaTemplatesListPage }))), w = a(() => import("./modules/quota/index.js").then((e) => ({ default: e.QuotaTemplateDetailPage }))), T = a(() => import("./modules/quota/index.js").then((e) => ({ default: e.QuotaTemplateCreatePage }))), E = a(() => import("./modules/quota/index.js").then((e) => ({ default: e.QuotaTemplateEditPage }))), D = a(() => import("./modules/coupons/index.js").then((e) => ({ default: e.CouponsListPage }))), O = a(() => import("./modules/coupons/index.js").then((e) => ({ default: e.CreateCouponPage }))), k = a(() => import("./modules/coupons/index.js").then((e) => ({ default: e.EditCouponPage }))), A = a(() => import("./modules/coupons/index.js").then((e) => ({ default: e.CouponDetailPage }))), j = a(() => import("./modules/promotions/index.js").then((e) => ({ default: e.PromotionsListPage }))), M = a(() => import("./modules/promotions/index.js").then((e) => ({ default: e.CreatePromotionPage }))), N = a(() => import("./modules/discounts/index.js").then((e) => ({ default: e.DiscountsListPage }))), P = a(() => import("./modules/billing/index.js").then((e) => ({ default: e.RefundsPage }))), F = a(() => import("./modules/credits/index.js").then((e) => ({ default: e.AdminCreditsPage }))), I = a(() => import("./modules/analytics/index.js").then((e) => ({ default: e.AnalyticsPage }))), L = a(() => import("./modules/earnings/index.js").then((e) => ({ default: e.DeveloperRevenueAdminPage }))), R = a(() => import("./modules/earnings/index.js").then((e) => ({ default: e.PayoutAdminPage })));
12
+ function z() {
13
13
  let { basePath: t } = e(), n = d(), r = t && t !== "/" ? t.replace(/\/$/, "") : "";
14
14
  return o(() => {
15
15
  n(`${r}/plans`, { replace: !0 });
16
16
  }, [r, n]), null;
17
17
  }
18
- function z() {
18
+ function B() {
19
19
  return /* @__PURE__ */ f("div", {
20
20
  className: "flex min-h-[400px] items-center justify-center",
21
21
  children: /* @__PURE__ */ f("div", { className: "size-8 animate-spin rounded-full border-4 border-action-primary-bg border-t-transparent" })
22
22
  });
23
23
  }
24
- function B({ title: e, featureFlag: t }) {
24
+ function V({ title: e, featureFlag: t }) {
25
25
  return /* @__PURE__ */ f("div", {
26
26
  className: "flex min-h-[400px] items-center justify-center p-6",
27
27
  children: /* @__PURE__ */ p("div", {
@@ -45,7 +45,7 @@ function B({ title: e, featureFlag: t }) {
45
45
  })
46
46
  });
47
47
  }
48
- function V({ title: e, featureFlag: i, permission: a, eventName: c, children: l }) {
48
+ function H({ title: e, featureFlag: i, permission: a, eventName: c, children: l }) {
49
49
  let u = r(), { emit: d } = n(), p = !!u[a];
50
50
  return o(() => {
51
51
  p && d(c, { source: "BillingAdminRoutes" });
@@ -53,20 +53,20 @@ function V({ title: e, featureFlag: i, permission: a, eventName: c, children: l
53
53
  d,
54
54
  c,
55
55
  p
56
- ]), u.isLoading ? /* @__PURE__ */ f(z, {}) : /* @__PURE__ */ f(s, {
56
+ ]), u.isLoading ? /* @__PURE__ */ f(B, {}) : /* @__PURE__ */ f(s, {
57
57
  flag: i,
58
58
  defaultValue: !0,
59
- fallback: /* @__PURE__ */ f(B, {
59
+ fallback: /* @__PURE__ */ f(V, {
60
60
  title: e,
61
61
  featureFlag: i
62
62
  }),
63
63
  children: p ? l : /* @__PURE__ */ f(t, { message: `You don't have permission to access ${e}.` })
64
64
  });
65
65
  }
66
- function H(e) {
67
- return /* @__PURE__ */ f(V, { ...e });
66
+ function U(e) {
67
+ return /* @__PURE__ */ f(H, { ...e });
68
68
  }
69
- function U() {
69
+ function W() {
70
70
  return /* @__PURE__ */ p(u, { children: [
71
71
  /* @__PURE__ */ f(l, {
72
72
  index: !0,
@@ -77,323 +77,336 @@ function U() {
77
77
  }),
78
78
  /* @__PURE__ */ f(l, {
79
79
  path: "plans",
80
- element: H({
80
+ element: U({
81
81
  title: "Plans",
82
82
  featureFlag: "billing.plans",
83
83
  permission: "canViewPlans",
84
84
  eventName: "billing.plan.viewed",
85
85
  children: /* @__PURE__ */ f(i, {
86
- fallback: /* @__PURE__ */ f(z, {}),
86
+ fallback: /* @__PURE__ */ f(B, {}),
87
87
  children: /* @__PURE__ */ f(m, {})
88
88
  })
89
89
  })
90
90
  }),
91
91
  /* @__PURE__ */ f(l, {
92
92
  path: "plans/new",
93
- element: H({
93
+ element: U({
94
94
  title: "Create plan",
95
95
  featureFlag: "billing.plans.manage",
96
96
  permission: "canManagePlans",
97
97
  eventName: "billing.plan.viewed",
98
98
  children: /* @__PURE__ */ f(i, {
99
- fallback: /* @__PURE__ */ f(z, {}),
99
+ fallback: /* @__PURE__ */ f(B, {}),
100
100
  children: /* @__PURE__ */ f(_, {})
101
101
  })
102
102
  })
103
103
  }),
104
104
  /* @__PURE__ */ f(l, {
105
105
  path: "plans/assign-free",
106
- element: H({
106
+ element: U({
107
107
  title: "Assign plan for free",
108
108
  featureFlag: "billing.plans.manage",
109
109
  permission: "canManagePlans",
110
110
  eventName: "billing.plan.viewed",
111
111
  children: /* @__PURE__ */ f(i, {
112
- fallback: /* @__PURE__ */ f(z, {}),
112
+ fallback: /* @__PURE__ */ f(B, {}),
113
113
  children: /* @__PURE__ */ f(v, {})
114
114
  })
115
115
  })
116
116
  }),
117
117
  /* @__PURE__ */ f(l, {
118
118
  path: "plans/:planId",
119
- element: H({
119
+ element: U({
120
120
  title: "Plan details",
121
121
  featureFlag: "billing.plans",
122
122
  permission: "canViewPlans",
123
123
  eventName: "billing.plan.viewed",
124
124
  children: /* @__PURE__ */ f(i, {
125
- fallback: /* @__PURE__ */ f(z, {}),
125
+ fallback: /* @__PURE__ */ f(B, {}),
126
126
  children: /* @__PURE__ */ f(h, {})
127
127
  })
128
128
  })
129
129
  }),
130
130
  /* @__PURE__ */ f(l, {
131
131
  path: "plans/:planId/edit",
132
- element: H({
132
+ element: U({
133
133
  title: "Edit plan",
134
134
  featureFlag: "billing.plans.manage",
135
135
  permission: "canManagePlans",
136
136
  eventName: "billing.plan.viewed",
137
137
  children: /* @__PURE__ */ f(i, {
138
- fallback: /* @__PURE__ */ f(z, {}),
138
+ fallback: /* @__PURE__ */ f(B, {}),
139
139
  children: /* @__PURE__ */ f(g, {})
140
140
  })
141
141
  })
142
142
  }),
143
143
  /* @__PURE__ */ f(l, {
144
144
  path: "addons",
145
- element: H({
145
+ element: U({
146
146
  title: "Addons",
147
147
  featureFlag: "billing.addons",
148
148
  permission: "canViewAddons",
149
149
  eventName: "billing.addon.viewed",
150
150
  children: /* @__PURE__ */ f(i, {
151
- fallback: /* @__PURE__ */ f(z, {}),
151
+ fallback: /* @__PURE__ */ f(B, {}),
152
152
  children: /* @__PURE__ */ f(y, {})
153
153
  })
154
154
  })
155
155
  }),
156
156
  /* @__PURE__ */ f(l, {
157
157
  path: "addons/new",
158
- element: H({
158
+ element: U({
159
159
  title: "Create addon",
160
160
  featureFlag: "billing.addons.manage",
161
161
  permission: "canManageAddons",
162
162
  eventName: "billing.addon.viewed",
163
163
  children: /* @__PURE__ */ f(i, {
164
- fallback: /* @__PURE__ */ f(z, {}),
164
+ fallback: /* @__PURE__ */ f(B, {}),
165
165
  children: /* @__PURE__ */ f(S, {})
166
166
  })
167
167
  })
168
168
  }),
169
169
  /* @__PURE__ */ f(l, {
170
170
  path: "addons/:addonId",
171
- element: H({
171
+ element: U({
172
172
  title: "Addon details",
173
173
  featureFlag: "billing.addons",
174
174
  permission: "canViewAddons",
175
175
  eventName: "billing.addon.viewed",
176
176
  children: /* @__PURE__ */ f(i, {
177
- fallback: /* @__PURE__ */ f(z, {}),
177
+ fallback: /* @__PURE__ */ f(B, {}),
178
178
  children: /* @__PURE__ */ f(b, {})
179
179
  })
180
180
  })
181
181
  }),
182
182
  /* @__PURE__ */ f(l, {
183
183
  path: "addons/:addonId/edit",
184
- element: H({
184
+ element: U({
185
185
  title: "Edit addon",
186
186
  featureFlag: "billing.addons.manage",
187
187
  permission: "canManageAddons",
188
188
  eventName: "billing.addon.viewed",
189
189
  children: /* @__PURE__ */ f(i, {
190
- fallback: /* @__PURE__ */ f(z, {}),
190
+ fallback: /* @__PURE__ */ f(B, {}),
191
191
  children: /* @__PURE__ */ f(x, {})
192
192
  })
193
193
  })
194
194
  }),
195
195
  /* @__PURE__ */ f(l, {
196
196
  path: "quotas",
197
- element: H({
197
+ element: U({
198
198
  title: "Quota templates",
199
199
  featureFlag: "billing.quotas",
200
200
  permission: "canViewQuotas",
201
201
  eventName: "billing.quota.viewed",
202
202
  children: /* @__PURE__ */ f(i, {
203
- fallback: /* @__PURE__ */ f(z, {}),
203
+ fallback: /* @__PURE__ */ f(B, {}),
204
204
  children: /* @__PURE__ */ f(C, {})
205
205
  })
206
206
  })
207
207
  }),
208
208
  /* @__PURE__ */ f(l, {
209
209
  path: "quotas/new",
210
- element: H({
210
+ element: U({
211
211
  title: "Create quota template",
212
212
  featureFlag: "billing.quotas.manage",
213
213
  permission: "canManageQuotas",
214
214
  eventName: "billing.quota.viewed",
215
215
  children: /* @__PURE__ */ f(i, {
216
- fallback: /* @__PURE__ */ f(z, {}),
216
+ fallback: /* @__PURE__ */ f(B, {}),
217
217
  children: /* @__PURE__ */ f(T, {})
218
218
  })
219
219
  })
220
220
  }),
221
221
  /* @__PURE__ */ f(l, {
222
222
  path: "quotas/:quotaId",
223
- element: H({
223
+ element: U({
224
224
  title: "Quota template details",
225
225
  featureFlag: "billing.quotas",
226
226
  permission: "canViewQuotas",
227
227
  eventName: "billing.quota.viewed",
228
228
  children: /* @__PURE__ */ f(i, {
229
- fallback: /* @__PURE__ */ f(z, {}),
229
+ fallback: /* @__PURE__ */ f(B, {}),
230
230
  children: /* @__PURE__ */ f(w, {})
231
231
  })
232
232
  })
233
233
  }),
234
234
  /* @__PURE__ */ f(l, {
235
235
  path: "quotas/:quotaId/edit",
236
- element: H({
236
+ element: U({
237
237
  title: "Edit quota template",
238
238
  featureFlag: "billing.quotas.manage",
239
239
  permission: "canManageQuotas",
240
240
  eventName: "billing.quota.viewed",
241
241
  children: /* @__PURE__ */ f(i, {
242
- fallback: /* @__PURE__ */ f(z, {}),
242
+ fallback: /* @__PURE__ */ f(B, {}),
243
243
  children: /* @__PURE__ */ f(E, {})
244
244
  })
245
245
  })
246
246
  }),
247
247
  /* @__PURE__ */ f(l, {
248
248
  path: "coupons",
249
- element: H({
249
+ element: U({
250
250
  title: "Coupons",
251
251
  featureFlag: "billing.discounts",
252
252
  permission: "canManageDiscounts",
253
253
  eventName: "billing.transaction.viewed",
254
254
  children: /* @__PURE__ */ f(i, {
255
- fallback: /* @__PURE__ */ f(z, {}),
255
+ fallback: /* @__PURE__ */ f(B, {}),
256
256
  children: /* @__PURE__ */ f(D, {})
257
257
  })
258
258
  })
259
259
  }),
260
260
  /* @__PURE__ */ f(l, {
261
261
  path: "coupons/create",
262
- element: H({
262
+ element: U({
263
263
  title: "Create coupon",
264
264
  featureFlag: "billing.discounts",
265
265
  permission: "canManageDiscounts",
266
266
  eventName: "billing.transaction.viewed",
267
267
  children: /* @__PURE__ */ f(i, {
268
- fallback: /* @__PURE__ */ f(z, {}),
268
+ fallback: /* @__PURE__ */ f(B, {}),
269
269
  children: /* @__PURE__ */ f(O, {})
270
270
  })
271
271
  })
272
272
  }),
273
273
  /* @__PURE__ */ f(l, {
274
274
  path: "coupons/:id",
275
- element: H({
275
+ element: U({
276
276
  title: "Coupon details",
277
277
  featureFlag: "billing.discounts",
278
278
  permission: "canManageDiscounts",
279
279
  eventName: "billing.transaction.viewed",
280
280
  children: /* @__PURE__ */ f(i, {
281
- fallback: /* @__PURE__ */ f(z, {}),
281
+ fallback: /* @__PURE__ */ f(B, {}),
282
282
  children: /* @__PURE__ */ f(A, {})
283
283
  })
284
284
  })
285
285
  }),
286
286
  /* @__PURE__ */ f(l, {
287
287
  path: "coupons/:id/edit",
288
- element: H({
288
+ element: U({
289
289
  title: "Edit coupon",
290
290
  featureFlag: "billing.discounts",
291
291
  permission: "canManageDiscounts",
292
292
  eventName: "billing.transaction.viewed",
293
293
  children: /* @__PURE__ */ f(i, {
294
- fallback: /* @__PURE__ */ f(z, {}),
294
+ fallback: /* @__PURE__ */ f(B, {}),
295
295
  children: /* @__PURE__ */ f(k, {})
296
296
  })
297
297
  })
298
298
  }),
299
299
  /* @__PURE__ */ f(l, {
300
300
  path: "promotions",
301
- element: H({
301
+ element: U({
302
302
  title: "Promotions",
303
303
  featureFlag: "billing.plans.manage",
304
304
  permission: "canManagePlans",
305
305
  eventName: "billing.plan.viewed",
306
306
  children: /* @__PURE__ */ f(i, {
307
- fallback: /* @__PURE__ */ f(z, {}),
307
+ fallback: /* @__PURE__ */ f(B, {}),
308
308
  children: /* @__PURE__ */ f(j, {})
309
309
  })
310
310
  })
311
311
  }),
312
312
  /* @__PURE__ */ f(l, {
313
313
  path: "promotions/create",
314
- element: H({
314
+ element: U({
315
315
  title: "Create Promotion",
316
316
  featureFlag: "billing.plans.manage",
317
317
  permission: "canManagePlans",
318
318
  eventName: "billing.plan.viewed",
319
319
  children: /* @__PURE__ */ f(i, {
320
- fallback: /* @__PURE__ */ f(z, {}),
320
+ fallback: /* @__PURE__ */ f(B, {}),
321
321
  children: /* @__PURE__ */ f(M, {})
322
322
  })
323
323
  })
324
324
  }),
325
325
  /* @__PURE__ */ f(l, {
326
326
  path: "discounts",
327
- element: H({
327
+ element: U({
328
328
  title: "Discounts",
329
329
  featureFlag: "billing.discounts",
330
330
  permission: "canManageDiscounts",
331
331
  eventName: "billing.transaction.viewed",
332
332
  children: /* @__PURE__ */ f(i, {
333
- fallback: /* @__PURE__ */ f(z, {}),
333
+ fallback: /* @__PURE__ */ f(B, {}),
334
334
  children: /* @__PURE__ */ f(N, {})
335
335
  })
336
336
  })
337
337
  }),
338
338
  /* @__PURE__ */ f(l, {
339
339
  path: "credits",
340
- element: H({
340
+ element: U({
341
341
  title: "Credit grants",
342
342
  featureFlag: "billing.credits.grants",
343
343
  permission: "canGrantCredits",
344
344
  eventName: "billing.credit.viewed",
345
345
  children: /* @__PURE__ */ f(i, {
346
- fallback: /* @__PURE__ */ f(z, {}),
346
+ fallback: /* @__PURE__ */ f(B, {}),
347
347
  children: /* @__PURE__ */ f(F, {})
348
348
  })
349
349
  })
350
350
  }),
351
351
  /* @__PURE__ */ f(l, {
352
352
  path: "refunds",
353
- element: H({
353
+ element: U({
354
354
  title: "Refunds",
355
355
  featureFlag: "billing.refunds",
356
356
  permission: "canProcessRefund",
357
357
  eventName: "billing.transaction.viewed",
358
358
  children: /* @__PURE__ */ f(i, {
359
- fallback: /* @__PURE__ */ f(z, {}),
359
+ fallback: /* @__PURE__ */ f(B, {}),
360
360
  children: /* @__PURE__ */ f(P, {})
361
361
  })
362
362
  })
363
363
  }),
364
364
  /* @__PURE__ */ f(l, {
365
365
  path: "analytics",
366
- element: H({
366
+ element: U({
367
367
  title: "Billing analytics",
368
368
  featureFlag: "billing.analytics",
369
369
  permission: "canViewAnalytics",
370
370
  eventName: "billing.usage.viewed",
371
371
  children: /* @__PURE__ */ f(i, {
372
- fallback: /* @__PURE__ */ f(z, {}),
372
+ fallback: /* @__PURE__ */ f(B, {}),
373
373
  children: /* @__PURE__ */ f(I, {})
374
374
  })
375
375
  })
376
376
  }),
377
+ /* @__PURE__ */ f(l, {
378
+ path: "developer-revenue",
379
+ element: U({
380
+ title: "Developer revenue",
381
+ featureFlag: "billing.payouts.admin",
382
+ permission: "isBillingAdmin",
383
+ eventName: "billing.payout.viewed",
384
+ children: /* @__PURE__ */ f(i, {
385
+ fallback: /* @__PURE__ */ f(B, {}),
386
+ children: /* @__PURE__ */ f(L, {})
387
+ })
388
+ })
389
+ }),
377
390
  /* @__PURE__ */ f(l, {
378
391
  path: "payouts",
379
- element: H({
392
+ element: U({
380
393
  title: "Payout administration",
381
394
  featureFlag: "billing.payouts.admin",
382
395
  permission: "isBillingAdmin",
383
396
  eventName: "billing.payout.viewed",
384
397
  children: /* @__PURE__ */ f(i, {
385
- fallback: /* @__PURE__ */ f(z, {}),
386
- children: /* @__PURE__ */ f(L, {})
398
+ fallback: /* @__PURE__ */ f(B, {}),
399
+ children: /* @__PURE__ */ f(R, {})
387
400
  })
388
401
  })
389
402
  }),
390
403
  /* @__PURE__ */ f(l, {
391
404
  path: "*",
392
- element: /* @__PURE__ */ f(R, {})
405
+ element: /* @__PURE__ */ f(z, {})
393
406
  })
394
407
  ] });
395
408
  }
396
409
  //#endregion
397
- export { U as BillingAdminRoutes };
410
+ export { W as BillingAdminRoutes };
398
411
 
399
412
  //# sourceMappingURL=BillingAdminRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BillingAdminRoutes.js","names":[],"sources":["../../src/billing/BillingAdminRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, useEffect, type ReactNode } from 'react';\nimport { Navigate, Route, Routes, useNavigate } from 'react-router-dom';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useBillingEventEmitter, type BillingDomainEvent } from './hooks/useBillingEventEmitter';\nimport { useBillingPermissions } from './hooks/useBillingPermissions';\nimport { useBilling } from './providers/BillingProvider';\nimport { AccessDenied } from './shared/components';\n\n// Lazy loaded pages - Plans (full CRUD)\nconst PlansListPage = lazy(() =>\n import('./modules/plans').then((m) => ({ default: m.PlansListPage }))\n);\nconst PlanDetailPage = lazy(() =>\n import('./modules/plans').then((m) => ({ default: m.PlanDetailPage }))\n);\nconst PlanEditPage = lazy(() =>\n import('./modules/plans').then((m) => ({ default: m.PlanEditPage }))\n);\nconst PlanCreatePage = lazy(() =>\n import('./modules/plans').then((m) => ({ default: m.PlanCreatePage }))\n);\nconst PlanAssignFreePage = lazy(() =>\n import('./modules/plans').then((m) => ({ default: m.PlanAssignFreePage }))\n);\n\n// Lazy loaded pages - Addons (full CRUD)\nconst AddonsListPage = lazy(() =>\n import('./modules/addons').then((m) => ({ default: m.AddonsListPage }))\n);\nconst AddonDetailPage = lazy(() =>\n import('./modules/addons').then((m) => ({ default: m.AddonDetailPage }))\n);\nconst AddonEditPage = lazy(() =>\n import('./modules/addons').then((m) => ({ default: m.AddonEditPage }))\n);\nconst AddonCreatePage = lazy(() =>\n import('./modules/addons').then((m) => ({ default: m.AddonCreatePage }))\n);\n\n// Lazy loaded pages - Quota Templates (full CRUD)\nconst QuotaTemplatesListPage = lazy(() =>\n import('./modules/quota').then((m) => ({ default: m.QuotaTemplatesListPage }))\n);\nconst QuotaTemplateDetailPage = lazy(() =>\n import('./modules/quota').then((m) => ({ default: m.QuotaTemplateDetailPage }))\n);\nconst QuotaTemplateCreatePage = lazy(() =>\n import('./modules/quota').then((m) => ({ default: m.QuotaTemplateCreatePage }))\n);\nconst QuotaTemplateEditPage = lazy(() =>\n import('./modules/quota').then((m) => ({ default: m.QuotaTemplateEditPage }))\n);\n\n// Lazy loaded pages - Coupons\nconst CouponsListPage = lazy(() =>\n import('./modules/coupons').then((m) => ({ default: m.CouponsListPage }))\n);\nconst CreateCouponPage = lazy(() =>\n import('./modules/coupons').then((m) => ({ default: m.CreateCouponPage }))\n);\nconst EditCouponPage = lazy(() =>\n import('./modules/coupons').then((m) => ({ default: m.EditCouponPage }))\n);\nconst CouponDetailPage = lazy(() =>\n import('./modules/coupons').then((m) => ({ default: m.CouponDetailPage }))\n);\n\n// Lazy loaded pages - Promotions\nconst PromotionsListPage = lazy(() =>\n import('./modules/promotions').then((m) => ({ default: m.PromotionsListPage }))\n);\nconst CreatePromotionPage = lazy(() =>\n import('./modules/promotions').then((m) => ({ default: m.CreatePromotionPage }))\n);\n\n// Lazy loaded pages - Discounts\nconst DiscountsListPage = lazy(() =>\n import('./modules/discounts').then((m) => ({ default: m.DiscountsListPage }))\n);\n\n// Lazy loaded pages - Refunds\nconst RefundsPage = lazy(() =>\n import('./modules/billing').then((m) => ({ default: m.RefundsPage }))\n);\n\n// Lazy loaded pages - Credits admin\nconst AdminCreditsPage = lazy(() =>\n import('./modules/credits').then((m) => ({ default: m.AdminCreditsPage }))\n);\n\n// Lazy loaded pages - Analytics\nconst AnalyticsPage = lazy(() =>\n import('./modules/analytics').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst PayoutAdminPage = lazy(() =>\n import('./modules/earnings').then((m) => ({ default: m.PayoutAdminPage }))\n);\n\nfunction DefaultRedirect() {\n const { basePath } = useBilling();\n const routerNavigate = useNavigate();\n const base = basePath && basePath !== '/' ? basePath.replace(/\\/$/, '') : '';\n useEffect(() => {\n routerNavigate(`${base}/plans`, { replace: true });\n }, [base, routerNavigate]);\n return null;\n}\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <div className=\"size-8 animate-spin rounded-full border-4 border-action-primary-bg border-t-transparent\" />\n </div>\n );\n}\n\ntype BillingPermissions = ReturnType<typeof useBillingPermissions>;\ntype BillingPermissionKey = Exclude<\n {\n [K in keyof BillingPermissions]: BillingPermissions[K] extends boolean ? K : never;\n }[keyof BillingPermissions],\n 'isLoading'\n>;\n\ninterface BillingAdminRouteGateProps {\n title: string;\n featureFlag: string;\n permission: BillingPermissionKey;\n eventName: BillingDomainEvent;\n children: ReactNode;\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-card border border-border-seam bg-bg-surface p-6 text-center shadow-[var(--shadow-elevation-1)]\">\n <h2 className=\"text-base 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{' '}\n <span className=\"font-mono text-xs text-text-secondary bg-bg-sunken/60 rounded px-1.5 py-0.5\">\n {featureFlag}\n </span>{' '}\n feature flag for this organization.\n </p>\n </div>\n </div>\n );\n}\n\nfunction BillingAdminRouteGate({\n title,\n featureFlag,\n permission,\n eventName,\n children,\n}: BillingAdminRouteGateProps) {\n const permissions = useBillingPermissions();\n const { emit } = useBillingEventEmitter();\n const hasPermission = Boolean(permissions[permission]);\n\n useEffect(() => {\n if (hasPermission) {\n emit(eventName, { source: 'BillingAdminRoutes' });\n }\n }, [emit, eventName, hasPermission]);\n\n if (permissions.isLoading) {\n return <PageLoader />;\n }\n\n return (\n <FeatureGate\n flag={featureFlag}\n defaultValue\n fallback={<FeatureDisabled title={title} featureFlag={featureFlag} />}\n >\n {hasPermission ? (\n children\n ) : (\n <AccessDenied message={`You don't have permission to access ${title}.`} />\n )}\n </FeatureGate>\n );\n}\n\nfunction adminPage(props: BillingAdminRouteGateProps): ReactNode {\n return <BillingAdminRouteGate {...props} />;\n}\n\n/**\n * Admin-only billing routes.\n * Includes plans/addons/quota-templates CRUD, coupons, discounts, refunds, and analytics.\n */\nexport function BillingAdminRoutes() {\n return (\n <Routes>\n <Route index element={<Navigate to=\"plans\" replace />} />\n\n {/* Plans - full CRUD */}\n <Route\n path=\"plans\"\n element={adminPage({\n title: 'Plans',\n featureFlag: 'billing.plans',\n permission: 'canViewPlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PlansListPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"plans/new\"\n element={adminPage({\n title: 'Create plan',\n featureFlag: 'billing.plans.manage',\n permission: 'canManagePlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PlanCreatePage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"plans/assign-free\"\n element={adminPage({\n title: 'Assign plan for free',\n featureFlag: 'billing.plans.manage',\n permission: 'canManagePlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PlanAssignFreePage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"plans/:planId\"\n element={adminPage({\n title: 'Plan details',\n featureFlag: 'billing.plans',\n permission: 'canViewPlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PlanDetailPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"plans/:planId/edit\"\n element={adminPage({\n title: 'Edit plan',\n featureFlag: 'billing.plans.manage',\n permission: 'canManagePlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PlanEditPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Addons - full CRUD */}\n <Route\n path=\"addons\"\n element={adminPage({\n title: 'Addons',\n featureFlag: 'billing.addons',\n permission: 'canViewAddons',\n eventName: 'billing.addon.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AddonsListPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"addons/new\"\n element={adminPage({\n title: 'Create addon',\n featureFlag: 'billing.addons.manage',\n permission: 'canManageAddons',\n eventName: 'billing.addon.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AddonCreatePage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"addons/:addonId\"\n element={adminPage({\n title: 'Addon details',\n featureFlag: 'billing.addons',\n permission: 'canViewAddons',\n eventName: 'billing.addon.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AddonDetailPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"addons/:addonId/edit\"\n element={adminPage({\n title: 'Edit addon',\n featureFlag: 'billing.addons.manage',\n permission: 'canManageAddons',\n eventName: 'billing.addon.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AddonEditPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Quota Templates - full CRUD */}\n <Route\n path=\"quotas\"\n element={adminPage({\n title: 'Quota templates',\n featureFlag: 'billing.quotas',\n permission: 'canViewQuotas',\n eventName: 'billing.quota.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <QuotaTemplatesListPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"quotas/new\"\n element={adminPage({\n title: 'Create quota template',\n featureFlag: 'billing.quotas.manage',\n permission: 'canManageQuotas',\n eventName: 'billing.quota.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <QuotaTemplateCreatePage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"quotas/:quotaId\"\n element={adminPage({\n title: 'Quota template details',\n featureFlag: 'billing.quotas',\n permission: 'canViewQuotas',\n eventName: 'billing.quota.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <QuotaTemplateDetailPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"quotas/:quotaId/edit\"\n element={adminPage({\n title: 'Edit quota template',\n featureFlag: 'billing.quotas.manage',\n permission: 'canManageQuotas',\n eventName: 'billing.quota.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <QuotaTemplateEditPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Coupons */}\n <Route\n path=\"coupons\"\n element={adminPage({\n title: 'Coupons',\n featureFlag: 'billing.discounts',\n permission: 'canManageDiscounts',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <CouponsListPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"coupons/create\"\n element={adminPage({\n title: 'Create coupon',\n featureFlag: 'billing.discounts',\n permission: 'canManageDiscounts',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <CreateCouponPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"coupons/:id\"\n element={adminPage({\n title: 'Coupon details',\n featureFlag: 'billing.discounts',\n permission: 'canManageDiscounts',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <CouponDetailPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"coupons/:id/edit\"\n element={adminPage({\n title: 'Edit coupon',\n featureFlag: 'billing.discounts',\n permission: 'canManageDiscounts',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <EditCouponPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Promotions */}\n <Route\n path=\"promotions\"\n element={adminPage({\n title: 'Promotions',\n featureFlag: 'billing.plans.manage',\n permission: 'canManagePlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PromotionsListPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"promotions/create\"\n element={adminPage({\n title: 'Create Promotion',\n featureFlag: 'billing.plans.manage',\n permission: 'canManagePlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <CreatePromotionPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Discounts */}\n <Route\n path=\"discounts\"\n element={adminPage({\n title: 'Discounts',\n featureFlag: 'billing.discounts',\n permission: 'canManageDiscounts',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <DiscountsListPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Credit grants */}\n <Route\n path=\"credits\"\n element={adminPage({\n title: 'Credit grants',\n featureFlag: 'billing.credits.grants',\n permission: 'canGrantCredits',\n eventName: 'billing.credit.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AdminCreditsPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Refunds */}\n <Route\n path=\"refunds\"\n element={adminPage({\n title: 'Refunds',\n featureFlag: 'billing.refunds',\n permission: 'canProcessRefund',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <RefundsPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Analytics */}\n <Route\n path=\"analytics\"\n element={adminPage({\n title: 'Billing analytics',\n featureFlag: 'billing.analytics',\n permission: 'canViewAnalytics',\n eventName: 'billing.usage.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AnalyticsPage />\n </Suspense>\n ),\n })}\n />\n\n <Route\n path=\"payouts\"\n element={adminPage({\n title: 'Payout administration',\n featureFlag: 'billing.payouts.admin',\n permission: 'isBillingAdmin',\n eventName: 'billing.payout.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PayoutAdminPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Catch-all — uses absolute path to avoid relative-navigation loop */}\n <Route path=\"*\" element={<DefaultRedirect />} />\n </Routes>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BillingAdminRoutes.js","names":[],"sources":["../../src/billing/BillingAdminRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, useEffect, type ReactNode } from 'react';\nimport { Navigate, Route, Routes, useNavigate } from 'react-router-dom';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useBillingEventEmitter, type BillingDomainEvent } from './hooks/useBillingEventEmitter';\nimport { useBillingPermissions } from './hooks/useBillingPermissions';\nimport { useBilling } from './providers/BillingProvider';\nimport { AccessDenied } from './shared/components';\n\n// Lazy loaded pages - Plans (full CRUD)\nconst PlansListPage = lazy(() =>\n import('./modules/plans').then((m) => ({ default: m.PlansListPage }))\n);\nconst PlanDetailPage = lazy(() =>\n import('./modules/plans').then((m) => ({ default: m.PlanDetailPage }))\n);\nconst PlanEditPage = lazy(() =>\n import('./modules/plans').then((m) => ({ default: m.PlanEditPage }))\n);\nconst PlanCreatePage = lazy(() =>\n import('./modules/plans').then((m) => ({ default: m.PlanCreatePage }))\n);\nconst PlanAssignFreePage = lazy(() =>\n import('./modules/plans').then((m) => ({ default: m.PlanAssignFreePage }))\n);\n\n// Lazy loaded pages - Addons (full CRUD)\nconst AddonsListPage = lazy(() =>\n import('./modules/addons').then((m) => ({ default: m.AddonsListPage }))\n);\nconst AddonDetailPage = lazy(() =>\n import('./modules/addons').then((m) => ({ default: m.AddonDetailPage }))\n);\nconst AddonEditPage = lazy(() =>\n import('./modules/addons').then((m) => ({ default: m.AddonEditPage }))\n);\nconst AddonCreatePage = lazy(() =>\n import('./modules/addons').then((m) => ({ default: m.AddonCreatePage }))\n);\n\n// Lazy loaded pages - Quota Templates (full CRUD)\nconst QuotaTemplatesListPage = lazy(() =>\n import('./modules/quota').then((m) => ({ default: m.QuotaTemplatesListPage }))\n);\nconst QuotaTemplateDetailPage = lazy(() =>\n import('./modules/quota').then((m) => ({ default: m.QuotaTemplateDetailPage }))\n);\nconst QuotaTemplateCreatePage = lazy(() =>\n import('./modules/quota').then((m) => ({ default: m.QuotaTemplateCreatePage }))\n);\nconst QuotaTemplateEditPage = lazy(() =>\n import('./modules/quota').then((m) => ({ default: m.QuotaTemplateEditPage }))\n);\n\n// Lazy loaded pages - Coupons\nconst CouponsListPage = lazy(() =>\n import('./modules/coupons').then((m) => ({ default: m.CouponsListPage }))\n);\nconst CreateCouponPage = lazy(() =>\n import('./modules/coupons').then((m) => ({ default: m.CreateCouponPage }))\n);\nconst EditCouponPage = lazy(() =>\n import('./modules/coupons').then((m) => ({ default: m.EditCouponPage }))\n);\nconst CouponDetailPage = lazy(() =>\n import('./modules/coupons').then((m) => ({ default: m.CouponDetailPage }))\n);\n\n// Lazy loaded pages - Promotions\nconst PromotionsListPage = lazy(() =>\n import('./modules/promotions').then((m) => ({ default: m.PromotionsListPage }))\n);\nconst CreatePromotionPage = lazy(() =>\n import('./modules/promotions').then((m) => ({ default: m.CreatePromotionPage }))\n);\n\n// Lazy loaded pages - Discounts\nconst DiscountsListPage = lazy(() =>\n import('./modules/discounts').then((m) => ({ default: m.DiscountsListPage }))\n);\n\n// Lazy loaded pages - Refunds\nconst RefundsPage = lazy(() =>\n import('./modules/billing').then((m) => ({ default: m.RefundsPage }))\n);\n\n// Lazy loaded pages - Credits admin\nconst AdminCreditsPage = lazy(() =>\n import('./modules/credits').then((m) => ({ default: m.AdminCreditsPage }))\n);\n\n// Lazy loaded pages - Analytics\nconst AnalyticsPage = lazy(() =>\n import('./modules/analytics').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst DeveloperRevenueAdminPage = lazy(() =>\n import('./modules/earnings').then((m) => ({ default: m.DeveloperRevenueAdminPage }))\n);\nconst PayoutAdminPage = lazy(() =>\n import('./modules/earnings').then((m) => ({ default: m.PayoutAdminPage }))\n);\n\nfunction DefaultRedirect() {\n const { basePath } = useBilling();\n const routerNavigate = useNavigate();\n const base = basePath && basePath !== '/' ? basePath.replace(/\\/$/, '') : '';\n useEffect(() => {\n routerNavigate(`${base}/plans`, { replace: true });\n }, [base, routerNavigate]);\n return null;\n}\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <div className=\"size-8 animate-spin rounded-full border-4 border-action-primary-bg border-t-transparent\" />\n </div>\n );\n}\n\ntype BillingPermissions = ReturnType<typeof useBillingPermissions>;\ntype BillingPermissionKey = Exclude<\n {\n [K in keyof BillingPermissions]: BillingPermissions[K] extends boolean ? K : never;\n }[keyof BillingPermissions],\n 'isLoading'\n>;\n\ninterface BillingAdminRouteGateProps {\n title: string;\n featureFlag: string;\n permission: BillingPermissionKey;\n eventName: BillingDomainEvent;\n children: ReactNode;\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-card border border-border-seam bg-bg-surface p-6 text-center shadow-[var(--shadow-elevation-1)]\">\n <h2 className=\"text-base 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{' '}\n <span className=\"font-mono text-xs text-text-secondary bg-bg-sunken/60 rounded px-1.5 py-0.5\">\n {featureFlag}\n </span>{' '}\n feature flag for this organization.\n </p>\n </div>\n </div>\n );\n}\n\nfunction BillingAdminRouteGate({\n title,\n featureFlag,\n permission,\n eventName,\n children,\n}: BillingAdminRouteGateProps) {\n const permissions = useBillingPermissions();\n const { emit } = useBillingEventEmitter();\n const hasPermission = Boolean(permissions[permission]);\n\n useEffect(() => {\n if (hasPermission) {\n emit(eventName, { source: 'BillingAdminRoutes' });\n }\n }, [emit, eventName, hasPermission]);\n\n if (permissions.isLoading) {\n return <PageLoader />;\n }\n\n return (\n <FeatureGate\n flag={featureFlag}\n defaultValue\n fallback={<FeatureDisabled title={title} featureFlag={featureFlag} />}\n >\n {hasPermission ? (\n children\n ) : (\n <AccessDenied message={`You don't have permission to access ${title}.`} />\n )}\n </FeatureGate>\n );\n}\n\nfunction adminPage(props: BillingAdminRouteGateProps): ReactNode {\n return <BillingAdminRouteGate {...props} />;\n}\n\n/**\n * Admin-only billing routes.\n * Includes plans/addons/quota-templates CRUD, coupons, discounts, refunds, and analytics.\n */\nexport function BillingAdminRoutes() {\n return (\n <Routes>\n <Route index element={<Navigate to=\"plans\" replace />} />\n\n {/* Plans - full CRUD */}\n <Route\n path=\"plans\"\n element={adminPage({\n title: 'Plans',\n featureFlag: 'billing.plans',\n permission: 'canViewPlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PlansListPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"plans/new\"\n element={adminPage({\n title: 'Create plan',\n featureFlag: 'billing.plans.manage',\n permission: 'canManagePlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PlanCreatePage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"plans/assign-free\"\n element={adminPage({\n title: 'Assign plan for free',\n featureFlag: 'billing.plans.manage',\n permission: 'canManagePlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PlanAssignFreePage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"plans/:planId\"\n element={adminPage({\n title: 'Plan details',\n featureFlag: 'billing.plans',\n permission: 'canViewPlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PlanDetailPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"plans/:planId/edit\"\n element={adminPage({\n title: 'Edit plan',\n featureFlag: 'billing.plans.manage',\n permission: 'canManagePlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PlanEditPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Addons - full CRUD */}\n <Route\n path=\"addons\"\n element={adminPage({\n title: 'Addons',\n featureFlag: 'billing.addons',\n permission: 'canViewAddons',\n eventName: 'billing.addon.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AddonsListPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"addons/new\"\n element={adminPage({\n title: 'Create addon',\n featureFlag: 'billing.addons.manage',\n permission: 'canManageAddons',\n eventName: 'billing.addon.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AddonCreatePage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"addons/:addonId\"\n element={adminPage({\n title: 'Addon details',\n featureFlag: 'billing.addons',\n permission: 'canViewAddons',\n eventName: 'billing.addon.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AddonDetailPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"addons/:addonId/edit\"\n element={adminPage({\n title: 'Edit addon',\n featureFlag: 'billing.addons.manage',\n permission: 'canManageAddons',\n eventName: 'billing.addon.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AddonEditPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Quota Templates - full CRUD */}\n <Route\n path=\"quotas\"\n element={adminPage({\n title: 'Quota templates',\n featureFlag: 'billing.quotas',\n permission: 'canViewQuotas',\n eventName: 'billing.quota.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <QuotaTemplatesListPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"quotas/new\"\n element={adminPage({\n title: 'Create quota template',\n featureFlag: 'billing.quotas.manage',\n permission: 'canManageQuotas',\n eventName: 'billing.quota.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <QuotaTemplateCreatePage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"quotas/:quotaId\"\n element={adminPage({\n title: 'Quota template details',\n featureFlag: 'billing.quotas',\n permission: 'canViewQuotas',\n eventName: 'billing.quota.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <QuotaTemplateDetailPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"quotas/:quotaId/edit\"\n element={adminPage({\n title: 'Edit quota template',\n featureFlag: 'billing.quotas.manage',\n permission: 'canManageQuotas',\n eventName: 'billing.quota.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <QuotaTemplateEditPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Coupons */}\n <Route\n path=\"coupons\"\n element={adminPage({\n title: 'Coupons',\n featureFlag: 'billing.discounts',\n permission: 'canManageDiscounts',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <CouponsListPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"coupons/create\"\n element={adminPage({\n title: 'Create coupon',\n featureFlag: 'billing.discounts',\n permission: 'canManageDiscounts',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <CreateCouponPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"coupons/:id\"\n element={adminPage({\n title: 'Coupon details',\n featureFlag: 'billing.discounts',\n permission: 'canManageDiscounts',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <CouponDetailPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"coupons/:id/edit\"\n element={adminPage({\n title: 'Edit coupon',\n featureFlag: 'billing.discounts',\n permission: 'canManageDiscounts',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <EditCouponPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Promotions */}\n <Route\n path=\"promotions\"\n element={adminPage({\n title: 'Promotions',\n featureFlag: 'billing.plans.manage',\n permission: 'canManagePlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PromotionsListPage />\n </Suspense>\n ),\n })}\n />\n <Route\n path=\"promotions/create\"\n element={adminPage({\n title: 'Create Promotion',\n featureFlag: 'billing.plans.manage',\n permission: 'canManagePlans',\n eventName: 'billing.plan.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <CreatePromotionPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Discounts */}\n <Route\n path=\"discounts\"\n element={adminPage({\n title: 'Discounts',\n featureFlag: 'billing.discounts',\n permission: 'canManageDiscounts',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <DiscountsListPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Credit grants */}\n <Route\n path=\"credits\"\n element={adminPage({\n title: 'Credit grants',\n featureFlag: 'billing.credits.grants',\n permission: 'canGrantCredits',\n eventName: 'billing.credit.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AdminCreditsPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Refunds */}\n <Route\n path=\"refunds\"\n element={adminPage({\n title: 'Refunds',\n featureFlag: 'billing.refunds',\n permission: 'canProcessRefund',\n eventName: 'billing.transaction.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <RefundsPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Analytics */}\n <Route\n path=\"analytics\"\n element={adminPage({\n title: 'Billing analytics',\n featureFlag: 'billing.analytics',\n permission: 'canViewAnalytics',\n eventName: 'billing.usage.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <AnalyticsPage />\n </Suspense>\n ),\n })}\n />\n\n <Route\n path=\"developer-revenue\"\n element={adminPage({\n title: 'Developer revenue',\n featureFlag: 'billing.payouts.admin',\n permission: 'isBillingAdmin',\n eventName: 'billing.payout.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <DeveloperRevenueAdminPage />\n </Suspense>\n ),\n })}\n />\n\n <Route\n path=\"payouts\"\n element={adminPage({\n title: 'Payout administration',\n featureFlag: 'billing.payouts.admin',\n permission: 'isBillingAdmin',\n eventName: 'billing.payout.viewed',\n children: (\n <Suspense fallback={<PageLoader />}>\n <PayoutAdminPage />\n </Suspense>\n ),\n })}\n />\n\n {/* Catch-all — uses absolute path to avoid relative-navigation loop */}\n <Route path=\"*\" element={<DefaultRedirect />} />\n </Routes>\n );\n}\n"],"mappings":"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"}