@mohasinac/appkit 4.43.0 → 4.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/dist/_internal/server/features/categories/adapters.d.ts +47 -0
  2. package/dist/_internal/server/features/categories/adapters.js +235 -0
  3. package/dist/_internal/server/features/checkout/actions.js +161 -22
  4. package/dist/_internal/server/features/checkout/expand-order-items.js +34 -0
  5. package/dist/_internal/server/features/orders/adapters.js +21 -0
  6. package/dist/_internal/server/features/refunds/actions.js +1 -1
  7. package/dist/_internal/server/features/seo/sitemap.js +54 -15
  8. package/dist/_internal/server/features/stores/adapters.d.ts +1 -1
  9. package/dist/_internal/server/features/stores/adapters.js +6 -0
  10. package/dist/_internal/server/functions/scheduled.d.ts +4 -2
  11. package/dist/_internal/server/functions/scheduled.js +64 -6
  12. package/dist/_internal/server/jobs/core/adminAnalytics.d.ts +0 -1
  13. package/dist/_internal/server/jobs/core/adminAnalytics.js +9 -1
  14. package/dist/_internal/server/jobs/core/analyticsAlertEvaluate.d.ts +47 -0
  15. package/dist/_internal/server/jobs/core/analyticsAlertEvaluate.js +468 -0
  16. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +14 -1
  17. package/dist/_internal/server/jobs/core/countersReconcile.js +24 -8
  18. package/dist/_internal/server/jobs/core/onCategoryWrite.js +54 -0
  19. package/dist/_internal/server/jobs/core/priceIndexRollup.d.ts +47 -0
  20. package/dist/_internal/server/jobs/core/priceIndexRollup.js +234 -0
  21. package/dist/_internal/server/jobs/core/{testerSandboxCleanup.d.ts → testDataCleanup.d.ts} +3 -3
  22. package/dist/_internal/server/jobs/core/{testerSandboxCleanup.js → testDataCleanup.js} +3 -3
  23. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +5 -1
  24. package/dist/_internal/server/jobs/handlers/analyticsAlertEvaluate.d.ts +2 -0
  25. package/dist/_internal/server/jobs/handlers/analyticsAlertEvaluate.js +2 -0
  26. package/dist/_internal/server/jobs/handlers/index.d.ts +3 -1
  27. package/dist/_internal/server/jobs/handlers/index.js +3 -1
  28. package/dist/_internal/server/jobs/handlers/messages.d.ts +5 -2
  29. package/dist/_internal/server/jobs/handlers/messages.js +5 -2
  30. package/dist/_internal/server/jobs/handlers/priceIndexRollup.d.ts +2 -0
  31. package/dist/_internal/server/jobs/handlers/priceIndexRollup.js +2 -0
  32. package/dist/_internal/server/jobs/handlers/testDataCleanup.d.ts +2 -0
  33. package/dist/_internal/server/jobs/handlers/testDataCleanup.js +2 -0
  34. package/dist/_internal/shared/actions/action-registry.js +34 -0
  35. package/dist/_internal/shared/checkout/order-math.d.ts +113 -3
  36. package/dist/_internal/shared/checkout/order-math.js +194 -7
  37. package/dist/_internal/shared/features/categories/price-guidance.d.ts +110 -0
  38. package/dist/_internal/shared/features/categories/price-guidance.js +136 -0
  39. package/dist/_internal/shared/features/site-settings/gst-registration.d.ts +90 -0
  40. package/dist/_internal/shared/features/site-settings/gst-registration.js +126 -0
  41. package/dist/_internal/shared/fees/calculator.d.ts +105 -0
  42. package/dist/_internal/shared/fees/calculator.js +143 -0
  43. package/dist/_internal/shared/listing-types/art/config.d.ts +0 -6
  44. package/dist/_internal/shared/listing-types/classified/config.d.ts +0 -6
  45. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +0 -6
  46. package/dist/_internal/shared/listing-types/live/config.d.ts +0 -6
  47. package/dist/_internal/shared/listing-types/standard/config.d.ts +0 -6
  48. package/dist/_internal/shared/listing-types/stickers/config.d.ts +0 -6
  49. package/dist/_internal/shared/templating/placeholders.d.ts +70 -0
  50. package/dist/_internal/shared/templating/placeholders.js +73 -0
  51. package/dist/client.d.ts +2 -0
  52. package/dist/client.js +1 -0
  53. package/dist/constants/api-endpoints.d.ts +42 -0
  54. package/dist/constants/api-endpoints.js +14 -0
  55. package/dist/features/admin/actions/admin-actions.d.ts +1 -1
  56. package/dist/features/admin/actions/admin-actions.js +1 -1
  57. package/dist/features/admin/components/AdminCategoryEditorView.js +269 -3
  58. package/dist/features/admin/components/AdminProductEditorView.js +8 -1
  59. package/dist/features/admin/components/AdminProductsView.js +78 -7
  60. package/dist/features/admin/components/AdminSiteSettingsView.js +20 -1
  61. package/dist/features/admin/components/AdminTaxCodeEditorView.d.ts +10 -0
  62. package/dist/features/admin/components/AdminTaxCodeEditorView.js +160 -0
  63. package/dist/features/admin/components/AdminTaxCodesView.d.ts +13 -0
  64. package/dist/features/admin/components/AdminTaxCodesView.js +86 -0
  65. package/dist/features/admin/components/AdminTesterChecklistView.js +1 -1
  66. package/dist/features/admin/components/analytics/AdminTopProductsTable.js +1 -1
  67. package/dist/features/auth/schemas/firestore.d.ts +0 -1
  68. package/dist/features/blog/schemas/firestore.d.ts +2 -2
  69. package/dist/features/catalogue/components/CatalogueItemEditorView.js +14 -3
  70. package/dist/features/categories/api/[id]/description-template/route.d.ts +45 -0
  71. package/dist/features/categories/api/[id]/description-template/route.js +252 -0
  72. package/dist/features/categories/api/route.js +156 -11
  73. package/dist/features/categories/components/CategoryDetailPageView.js +43 -10
  74. package/dist/features/categories/components/CategoryTemplatePicker.d.ts +65 -0
  75. package/dist/features/categories/components/CategoryTemplatePicker.js +170 -0
  76. package/dist/features/categories/constants/listing-categories.d.ts +17 -0
  77. package/dist/features/categories/constants/listing-categories.js +53 -0
  78. package/dist/features/categories/hooks/useCategoryTree.js +28 -2
  79. package/dist/features/categories/repository/categories.repository.d.ts +62 -11
  80. package/dist/features/categories/repository/categories.repository.js +178 -35
  81. package/dist/features/categories/repository/price-index.repository.d.ts +115 -0
  82. package/dist/features/categories/repository/price-index.repository.js +85 -0
  83. package/dist/features/categories/schemas/category-content.d.ts +206 -0
  84. package/dist/features/categories/schemas/category-content.js +28 -0
  85. package/dist/features/categories/schemas/firestore.d.ts +74 -5
  86. package/dist/features/categories/schemas/firestore.js +74 -3
  87. package/dist/features/categories/schemas/index.d.ts +1047 -0
  88. package/dist/features/categories/schemas/index.js +96 -0
  89. package/dist/features/categories/server.d.ts +1 -0
  90. package/dist/features/categories/server.js +7 -0
  91. package/dist/features/categories/types/index.d.ts +9 -0
  92. package/dist/features/events/schemas/firestore.d.ts +2 -2
  93. package/dist/features/faq/schemas/firestore.d.ts +2 -1
  94. package/dist/features/faq/schemas/firestore.js +20 -8
  95. package/dist/features/orders/schemas/firestore.d.ts +70 -0
  96. package/dist/features/orders/types/index.d.ts +55 -0
  97. package/dist/features/products/columns/index.d.ts +0 -1
  98. package/dist/features/products/columns/index.js +5 -1
  99. package/dist/features/products/components/ProductFilters.d.ts +0 -9
  100. package/dist/features/products/components/ProductForm.d.ts +27 -1
  101. package/dist/features/products/components/ProductForm.js +26 -12
  102. package/dist/features/products/constants/sieve.d.ts +0 -6
  103. package/dist/features/products/constants/sieve.js +35 -2
  104. package/dist/features/products/repository/products.repository.d.ts +115 -1
  105. package/dist/features/products/repository/products.repository.js +491 -39
  106. package/dist/features/products/schemas/firestore.d.ts +65 -5
  107. package/dist/features/products/schemas/firestore.js +9 -0
  108. package/dist/features/products/schemas/product-features.d.ts +140 -2
  109. package/dist/features/products/schemas/product-features.js +62 -1
  110. package/dist/features/promotions/repository/coupons.repository.js +6 -1
  111. package/dist/features/promotions/schemas/firestore.d.ts +44 -1
  112. package/dist/features/promotions/schemas/firestore.js +76 -2
  113. package/dist/features/seller/actions/seller-actions.js +17 -2
  114. package/dist/features/seller/components/PrintCenterView.d.ts +3 -2
  115. package/dist/features/seller/components/PrintCenterView.js +3 -2
  116. package/dist/features/seller/components/SellerAnalyticsAlertsView.js +21 -11
  117. package/dist/features/seller/components/SellerOrdersView.js +6 -1
  118. package/dist/features/seller/components/SellerPayoutSettingsView.js +19 -3
  119. package/dist/features/seller/components/SellerProductShell.d.ts +50 -2
  120. package/dist/features/seller/components/SellerProductShell.js +101 -9
  121. package/dist/features/seller/components/SellerProductsFilterDrawer.d.ts +13 -1
  122. package/dist/features/seller/components/SellerProductsFilterDrawer.js +2 -2
  123. package/dist/features/seller/components/SellerProductsView.js +108 -3
  124. package/dist/features/seller/types/index.d.ts +17 -0
  125. package/dist/features/seller/utils/product-draft-mapping.d.ts +13 -0
  126. package/dist/features/seller/utils/product-draft-mapping.js +17 -0
  127. package/dist/features/store-extensions/constants/alert-metrics.d.ts +86 -0
  128. package/dist/features/store-extensions/constants/alert-metrics.js +142 -0
  129. package/dist/features/store-extensions/schemas/firestore.d.ts +19 -1
  130. package/dist/features/stores/schemas/firestore.d.ts +31 -2
  131. package/dist/features/tax-codes/repository/tax-codes.repository.d.ts +55 -0
  132. package/dist/features/tax-codes/repository/tax-codes.repository.js +131 -0
  133. package/dist/features/tax-codes/schemas/firestore.d.ts +125 -0
  134. package/dist/features/tax-codes/schemas/firestore.js +82 -0
  135. package/dist/features/tax-codes/schemas/tax-code-form.d.ts +63 -0
  136. package/dist/features/tax-codes/schemas/tax-code-form.js +152 -0
  137. package/dist/features/tax-codes/schemas/tax-codes.validators.d.ts +107 -0
  138. package/dist/features/tax-codes/schemas/tax-codes.validators.js +85 -0
  139. package/dist/features/tester/actions/index.d.ts +0 -1
  140. package/dist/features/tester/actions/index.js +0 -1
  141. package/dist/features/tester/components/AdminTesterFeedbackIssuesView.js +1 -1
  142. package/dist/features/tester/components/AdminTesterFeedbackListView.js +1 -1
  143. package/dist/features/tester/components/index.d.ts +0 -4
  144. package/dist/features/tester/components/index.js +0 -2
  145. package/dist/features/tester/repository/tester-checklist-item.repository.d.ts +1 -20
  146. package/dist/features/tester/repository/tester-checklist-item.repository.js +0 -52
  147. package/dist/features/tester/schemas/firestore.d.ts +0 -6
  148. package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.js +3 -3
  149. package/dist/features/tester/seed-data/authored/admin__site-system.js +4 -5
  150. package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.js +2 -2
  151. package/dist/features/tester/seed-data/authored/index.js +0 -2
  152. package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +0 -19
  153. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +8 -27
  154. package/dist/index.d.ts +21 -7
  155. package/dist/index.js +53 -7
  156. package/dist/next/routing/route-map.d.ts +2 -4
  157. package/dist/next/routing/route-map.js +1 -2
  158. package/dist/repositories/index.d.ts +1 -0
  159. package/dist/repositories/index.js +1 -0
  160. package/dist/schemas/registry.d.ts +506 -0
  161. package/dist/seed/_helpers/brand-rows.d.ts +35 -0
  162. package/dist/seed/_helpers/brand-rows.js +576 -0
  163. package/dist/seed/_helpers/category-content.d.ts +39 -0
  164. package/dist/seed/_helpers/category-content.js +634 -0
  165. package/dist/seed/_helpers/category-forest.d.ts +2 -0
  166. package/dist/seed/_helpers/category-forest.js +585 -243
  167. package/dist/seed/_helpers/category-models.d.ts +5 -0
  168. package/dist/seed/_helpers/category-models.js +1364 -0
  169. package/dist/seed/_helpers/category-tree.js +17 -1
  170. package/dist/seed/_helpers/character-features.d.ts +10 -0
  171. package/dist/seed/_helpers/character-features.js +118 -0
  172. package/dist/seed/_helpers/search-txt-wrappers.d.ts +10 -0
  173. package/dist/seed/_helpers/search-txt-wrappers.js +12 -1
  174. package/dist/seed/categories-seed-data.js +147 -169
  175. package/dist/seed/index.d.ts +1 -0
  176. package/dist/seed/index.js +1 -0
  177. package/dist/seed/manifest.d.ts +1 -1
  178. package/dist/seed/manifest.js +5 -0
  179. package/dist/seed/product-features-seed-data.d.ts +1 -8
  180. package/dist/seed/product-features-seed-data.js +358 -154
  181. package/dist/seed/products-art-seed-data.js +16 -4
  182. package/dist/seed/products-auctions-seed-data.js +6 -6
  183. package/dist/seed/products-classifieds-seed-data.js +17 -7
  184. package/dist/seed/products-digital-codes-seed-data.js +12 -12
  185. package/dist/seed/products-preorders-seed-data.js +8 -8
  186. package/dist/seed/products-prize-draws-seed-data.js +25 -8
  187. package/dist/seed/products-standard-seed-data.js +10 -60
  188. package/dist/seed/products-stickers-seed-data.js +6 -6
  189. package/dist/seed/site-settings-seed-data.js +24 -0
  190. package/dist/seed/store-extensions-seed-data.js +10 -4
  191. package/dist/seed/tax-codes-seed-data.d.ts +34 -0
  192. package/dist/seed/tax-codes-seed-data.js +100 -0
  193. package/dist/seed/test-data-ttl.d.ts +29 -0
  194. package/dist/seed/test-data-ttl.js +31 -0
  195. package/dist/server-entry.d.ts +1 -1
  196. package/dist/server-entry.js +6 -1
  197. package/dist/server.d.ts +2 -1
  198. package/dist/server.js +5 -2
  199. package/dist/styles.css +40 -0
  200. package/dist/ui/components/PaginatedSelect.d.ts +14 -0
  201. package/dist/ui/components/PaginatedSelect.js +0 -0
  202. package/dist/ui/components/PaginatedSelect.style.css +40 -0
  203. package/dist/utils/physical-location.d.ts +23 -0
  204. package/dist/utils/physical-location.js +52 -0
  205. package/dist/utils/search-txt-builders.d.ts +20 -0
  206. package/dist/utils/search-txt-builders.js +36 -0
  207. package/package.json +1 -1
  208. package/scripts/seed-cli.mjs +4 -1
  209. package/dist/_internal/server/jobs/handlers/testerSandboxCleanup.d.ts +0 -2
  210. package/dist/_internal/server/jobs/handlers/testerSandboxCleanup.js +0 -2
  211. package/dist/features/tester/actions/leaderboard-actions.d.ts +0 -3
  212. package/dist/features/tester/actions/leaderboard-actions.js +0 -5
  213. package/dist/features/tester/components/BugHunterLeaderboardView.d.ts +0 -23
  214. package/dist/features/tester/components/BugHunterLeaderboardView.js +0 -18
  215. package/dist/features/tester/components/TesterHubView.d.ts +0 -5
  216. package/dist/features/tester/components/TesterHubView.js +0 -110
  217. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.d.ts +0 -2
  218. package/dist/features/tester/seed-data/authored/public-pages__bug-hunters.js +0 -78
  219. package/dist/features/tester/seed-data/tester-ttl.d.ts +0 -4
  220. package/dist/features/tester/seed-data/tester-ttl.js +0 -6
@@ -64,15 +64,15 @@ export const authored = {
64
64
  startPage: "/admin/categories",
65
65
  steps: [
66
66
  "Sign in as admin@letitrip.in / TempPass123!.",
67
- "Open /categories/category-x-starters as a visitor in a second tab and write down its product count. Note the FULL id — /categories/x-starters serves 'Category Not Found'; every category id carries the category- prefix.",
68
- "In the first tab open /admin/categories and find Starter Sets — that is the display name of category-x-starters; there is no category called 'X Starters'.",
67
+ "Open /categories/category-x-basic as a visitor in a second tab and write down its product count. Note the FULL id — /categories/x-basic serves 'Category Not Found'; every category id carries the category- prefix.",
68
+ "In the first tab open /admin/categories and find Basic Line — that is the display name of category-x-basic; there is no category called 'X Basic'.",
69
69
  "Write down its parent and how many children it has.",
70
70
  "Open its Edit action, change ONLY its description, and press Save.",
71
71
  "Reload the admin list and reopen it.",
72
72
  "Reload the public category page in the second tab.",
73
73
  "Restore the description by removing the word you appended, then save again. Three of the cases on this page append a marker and this one accumulated 'roundtrip' from an earlier run — categories is SEED_OWNED, but a run does not reseed.",
74
74
  ],
75
- inputs: { categorySlug: "x-starters" },
75
+ inputs: { categorySlug: "x-basic" },
76
76
  expectedBehaviour: "A rename or a description edit touches that field alone. The hierarchy fields — parent, children, ancestors, tier — are derived and must never be rewritten from form state, and the product count is derived from a trigger rather than typed.",
77
77
  expectedUiState: "The parent and the child count are unchanged, and the public page shows the same product count as before.",
78
78
  expectedData: { hierarchyChanged: false, countChanged: false },
@@ -576,13 +576,12 @@ export const authored = {
576
576
  "Open /admin/tester-checklist and read the catalogue.",
577
577
  "Create a case with a label, a description, a group, a page, roles, a start page and steps.",
578
578
  "Save, RELOAD, and read every field including roles and steps.",
579
- "Open /user/tester as a tester and find the new case.",
580
- "Check its roles, steps and expectations all render there.",
579
+ "Reopen the catalogue list and find the new case by searching its label.",
581
580
  "Delete the case and confirm it disappears from both surfaces.",
582
581
  ],
583
- expectedBehaviour: "The admin editor accepts every field a case carries, including the roles list, the input values and the expected data — fields added to the document type reach this form too, or the admin can create cases the hub cannot fully display.",
584
- expectedUiState: "After the reload the case holds every field. The Tester Hub shows its roles, steps, both value tables and the expectations. A field the editor accepts but the hub never shows, or the reverse, is the finding.",
585
- endResult: "The case is deleted from both surfaces.",
582
+ expectedBehaviour: "The admin editor accepts every field a case carries, including the roles list, the input values and the expected data — a field added to the document type must reach this form too, or an admin can create a case the harness cannot read.",
583
+ expectedUiState: "After the reload the case holds every field, including roles, steps, both value tables and the expectations. A field the editor accepts but does not read back is the finding.",
584
+ endResult: "The case is deleted from the catalogue.",
586
585
  },
587
586
  "checklist-admin-site-system-tester-feedback-report-export": {
588
587
  roles: ["admin"],
@@ -45,7 +45,7 @@ export const authored = {
45
45
  roles: ["guest"],
46
46
  startPage: "/categories",
47
47
  steps: [
48
- "Open /categories/category-x-tops — a parent whose children are category-x-starters and category-x-boosters — every category id carries the `category-` prefix, and a URL without it does not resolve.",
48
+ "Open /categories/category-x-tops — a parent whose children are the four Beyblade X retail lines, category-x-basic, category-x-unique-ux, category-x-custom-cx and category-x-over — every category id carries the `category-` prefix, and a URL without it does not resolve.",
49
49
  "Write down the count on the parent's tile.",
50
50
  "Open the parent and write down the count shown on each of its child chips.",
51
51
  "Add the children's counts together.",
@@ -74,7 +74,7 @@ export const authored = {
74
74
  roles: ["guest"],
75
75
  startPage: "/categories",
76
76
  steps: [
77
- "Open /categories/category-x-tops, a parent that shows a row of child chips — category-x-starters and category-x-boosters.",
77
+ "Open /categories/category-x-tops, a parent that shows a row of child chips — category-x-basic, category-x-unique-ux, category-x-custom-cx and category-x-over.",
78
78
  "Write down the number in the page header.",
79
79
  "Write down the number on each child chip.",
80
80
  "Open one child and compare its own header number to the number its chip showed.",
@@ -94,7 +94,6 @@ import { authored as a_design_ux__hand_mode_layout } from "./design-ux__hand-mod
94
94
  import { authored as a_design_ux__homepage_carousels } from "./design-ux__homepage-carousels";
95
95
  import { authored as a_page_wiring__data_loss } from "./page-wiring__data-loss";
96
96
  import { authored as a_public_pages__auth_error_pages } from "./public-pages__auth-error-pages";
97
- import { authored as a_public_pages__bug_hunters } from "./public-pages__bug-hunters";
98
97
  import { authored as a_public_pages__core_listing_pages } from "./public-pages__core-listing-pages";
99
98
  import { authored as a_public_pages__help_how_it_works } from "./public-pages__help-how-it-works";
100
99
  import { authored as a_public_pages__legal_policy_pages } from "./public-pages__legal-policy-pages";
@@ -214,7 +213,6 @@ export const AUTHORED_CASES = {
214
213
  ...a_design_ux__homepage_carousels,
215
214
  ...a_page_wiring__data_loss,
216
215
  ...a_public_pages__auth_error_pages,
217
- ...a_public_pages__bug_hunters,
218
216
  ...a_public_pages__core_listing_pages,
219
217
  ...a_public_pages__help_how_it_works,
220
218
  ...a_public_pages__legal_policy_pages,
@@ -112,23 +112,4 @@ export const authored = {
112
112
  expectedData: { brokenLinkCount: 0, linksChecked: 62 },
113
113
  endResult: "Read-only; nothing persists. Record every broken href in the comment, not just the first — one report naming all of them is worth more than a verdict.",
114
114
  },
115
- "checklist-page-wiring-reachability-user-tester-hub-reachable-from-user-sidebar": {
116
- roles: ["admin", "buyer"],
117
- startPage: "/user",
118
- steps: [
119
- "Sign in as admin@letitrip.in / TempPass123!, open /admin/users, and turn the tester flag ON for vivaan.kapoor@gmail.com — no seeded account carries it, so the case sets up the flag it is about.",
120
- "Sign out and sign in as vivaan.kapoor@gmail.com / TempPass123!, which now carries the tester flag.",
121
- "Open /user and read the sidebar.",
122
- "Find the Testing group and click Tester Hub.",
123
- "Read where it lands.",
124
- "Sign out and sign in as rehan.sheikh@gmail.com / TempPass123!, which does not carry the flag.",
125
- "Open /user and read the sidebar for a Testing group.",
126
- "Sign back in as admin@letitrip.in and turn the tester flag on vivaan.kapoor@gmail.com back off.",
127
- ],
128
- inputs: { testerAccount: "vivaan.kapoor@gmail.com", nonTesterAccount: "rehan.sheikh@gmail.com" },
129
- expectedBehaviour: "The Testing group is injected at runtime for accounts carrying the tester flag and is empty for everyone else. An empty group must not render as a heading with nothing under it.",
130
- expectedUiState: "The tester sees a Testing group containing Tester Hub, and clicking it opens /user/tester with the checklist. The non-tester sees no Testing group at all — not a heading with no children, and not a link that leads to a 'Testers only' warning.",
131
- expectedData: { testingGroupVisibleForNonTester: false },
132
- endResult: "The flag is revoked by the final step, leaving vivaan.kapoor@gmail.com on its seeded settings. Checking both accounts is the case — a group that renders for everybody would pass the first half alone.",
133
- },
134
115
  };
@@ -3,8 +3,9 @@
3
3
  * WHAT: Default test cases across 8 groups (Account & Auth, Buying, Selling, Content & Discovery,
4
4
  * Community & Support, Design & UX, Public & Marketing Pages, Admin (Testing)). Admins add/edit
5
5
  * further cases via /admin/tester-checklist — this array is a starting point, not the source of
6
- * truth. Every case is searchable by title or route in the Tester Hub (/user/tester), which any
7
- * isTester account OR admin can open. Items in the "admin" group carry adminOnly:true — only
6
+ * truth. Every case is searchable by title or route at /admin/tester-checklist — the human-facing
7
+ * Tester Hub at /user/tester was deleted in B2, and the Claude tester reads the catalogue
8
+ * through GET /api/user/tester-checklist instead. Items in the "admin" group carry adminOnly:true — only
8
9
  * visible to a tester with canTestAdmin (or a real admin); see `group()`'s `opts.adminOnly`.
9
10
  *
10
11
  * EXPORTS:
@@ -3829,7 +3830,7 @@ const rawTesterChecklistItems = [
3829
3830
  {
3830
3831
  key: "detail-page-tags-readable",
3831
3832
  label: "Opening an individual auction, pre-order, prize draw, classified, digital code and live-item page, each one's type tag and status chips are readable in light mode",
3832
- description: "Card grids and detail pages don't always share the same component, so check both. Use the sandbox listings linked from the Tester Hub if you need one of each type.",
3833
+ description: "Card grids and detail pages don't always share the same component, so check both. Use the seeded listings of each type if you need one of each.",
3833
3834
  href: "/auctions/auction-beyblade-original-dragoon-storm",
3834
3835
  },
3835
3836
  {
@@ -4623,21 +4624,6 @@ const rawTesterChecklistItems = [
4623
4624
  },
4624
4625
  ],
4625
4626
  },
4626
- {
4627
- pageKey: "bug-hunters",
4628
- pageLabel: "Bug Hunters Leaderboard",
4629
- href: "/bug-hunters",
4630
- cases: [
4631
- {
4632
- key: "leaderboard-loads",
4633
- label: "The public Bug Hunters leaderboard (/bug-hunters) loads and lists testers ranked by confirmed-bug count, most bugs first",
4634
- description: "Verify against the seeded demo fixture — \"Mock User 3\" should appear on the leaderboard with 1 confirmed bug (from the \"Demo fixture\" case under Admin (Testing) → Bug Hunter Rewards).",
4635
- href: "/bug-hunters",
4636
- },
4637
- { key: "leaderboard-empty-state", label: "If no bugs have been confirmed yet, the leaderboard shows a clear \"No confirmed bugs yet\" empty state instead of a blank page or error" },
4638
- { key: "leaderboard-footer-link", label: "A \"Bug Hunters\" link is present in the site footer's Support column and navigates to /bug-hunters" },
4639
- ],
4640
- },
4641
4627
  ]),
4642
4628
  ...group("seo", "SEO & Metadata", [
4643
4629
  {
@@ -5630,7 +5616,7 @@ const rawTesterChecklistItems = [
5630
5616
  {
5631
5617
  key: "confirm-bug",
5632
5618
  label: "Admin can mark a tester's \"No\" answer as a confirmed bug from the Main Issues tab (or the All Submissions tab) — the reporting tester is credited as the bug hunter and the case is disabled so no other tester can answer it",
5633
- description: "From /admin/tester-feedback → Main Issues, click \"Mark as Bug\" on any open issue. Confirm: (1) the confirmation dialog appears before it commits, (2) the issue's card now shows a \"🐛 Confirmed — credited to [tester name]\" badge, (3) re-opening the Tester Hub as any other tester no longer shows that case at all.",
5619
+ description: "From /admin/tester-feedback → Main Issues, click \"Mark as Bug\" on any open issue. Confirm: (1) the confirmation dialog appears before it commits, (2) the issue's card now shows a \"🐛 Confirmed — credited to [tester name]\" badge, (3) the case no longer appears for any other tester in GET /api/user/tester-checklist.",
5634
5620
  href: "/admin/tester-feedback",
5635
5621
  },
5636
5622
  {
@@ -5640,7 +5626,7 @@ const rawTesterChecklistItems = [
5640
5626
  {
5641
5627
  key: "reopen-case",
5642
5628
  label: "Admin can reopen a bug-confirmed case as a new version for retest — the new version is active and answerable again, while the old case stays disabled in the catalog with its bug-hunter credit intact",
5643
- description: "Verify against the seeded \"Demo fixture — reported bug, already confirmed and reopened\" pair under this page: the v1 case should show Status \"Bug Confirmed\" and be hidden from the catalog's default (Active-only) view, while its v2 case shows Status \"Active\" and is answerable from the Tester Hub. From /admin/tester-checklist, switch the Status filter to \"Inactive\" or \"Bug status → Bug Confirmed\" to find v1, then use its \"Reopen as New Test Case\" row action on any other bug-confirmed case to try the flow live.",
5629
+ description: "Verify against the seeded \"Demo fixture — reported bug, already confirmed and reopened\" pair under this page: the v1 case should show Status \"Bug Confirmed\" and be hidden from the catalog's default (Active-only) view, while its v2 case shows Status \"Active\" and is answerable. From /admin/tester-checklist, switch the Status filter to \"Inactive\" or \"Bug status → Bug Confirmed\" to find v1, then use its \"Reopen as New Test Case\" row action on any other bug-confirmed case to try the flow live.",
5644
5630
  href: "/admin/tester-checklist",
5645
5631
  },
5646
5632
  {
@@ -5994,7 +5980,8 @@ const rawTesterChecklistItems = [
5994
5980
  // (bugConfirmed/bugHunterId/version/previousVersionId/supersededByItemId
5995
5981
  // are not part of the CaseInput shape group() builds). Lets an admin/
5996
5982
  // tester see the full state machine immediately after a fresh reseed,
5997
- // and gives the /bug-hunters leaderboard a non-empty first entry.
5983
+ // The /bug-hunters leaderboard this also fed was deleted in B2; the pair
5984
+ // stays because /admin/tester-feedback reads the same credit fields.
5998
5985
  {
5999
5986
  id: "checklist-admin-bug-hunter-rewards-demo-fixture",
6000
5987
  groupKey: "admin",
@@ -6133,12 +6120,6 @@ const rawTesterChecklistItems = [
6133
6120
  description: "Walk the public header nav, the sidebar support links and every footer column. All 55 hrefs must land on a real page. No audit checked ANY of them until this wave — the nav audit only ever looked at the three portal sidebars.",
6134
6121
  href: "/",
6135
6122
  },
6136
- {
6137
- key: "user-tester-hub-reachable-from-user-sidebar",
6138
- label: "A tester reaches the Tester Hub from their OWN sidebar",
6139
- description: "As a user with the tester flag, open /user and find Tester Hub in the sidebar under Testing. The group is injected at runtime and is empty for non-testers — confirm a NON-tester account does not see it.",
6140
- href: "/user",
6141
- },
6142
6123
  ],
6143
6124
  },
6144
6125
  ]),
package/dist/index.d.ts CHANGED
@@ -546,9 +546,14 @@ export { ELIGIBLE_ORDER_STATUSES_FOR_TICKET, SUPPORT_TICKET_COLLECTION, ACTIVE_T
546
546
  export { supportTicketsSeedData } from "./seed/index";
547
547
  export { offersSeedData } from "./seed/index";
548
548
  export { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeWhatsAppConfigSeedData, storeGoogleConfigSeedData, } from "./seed/index";
549
+ export { AdminTaxCodesView } from "./features/admin/components/AdminTaxCodesView";
550
+ export type { AdminTaxCodesViewProps } from "./features/admin/components/AdminTaxCodesView";
551
+ export { AdminTaxCodeEditorView } from "./features/admin/components/AdminTaxCodeEditorView";
552
+ export type { AdminTaxCodeEditorViewProps } from "./features/admin/components/AdminTaxCodeEditorView";
549
553
  export { productFeaturesRepository } from "./repositories/index";
550
554
  export type { ProductFeatureListFilter } from "./repositories/index";
551
555
  export { loadProductFeaturesForStore } from "./repositories/index";
556
+ export { taxCodesRepository } from "./repositories/index";
552
557
  export { productTemplateRepository } from "./repositories/index";
553
558
  export type { ProductTemplateDocument, ProductTemplateCreateInput, ProductTemplateUpdateInput, } from "./repositories/index";
554
559
  export { tokenRepository } from "./repositories/index";
@@ -1032,11 +1037,7 @@ export { AdminTesterChecklistView } from "./features/admin/index";
1032
1037
  export type { AdminTesterChecklistViewProps } from "./features/admin/index";
1033
1038
  export { AdminTesterChecklistItemEditorView } from "./features/admin/index";
1034
1039
  export type { AdminTesterChecklistItemEditorViewProps } from "./features/admin/index";
1035
- export { TesterHubView } from "./features/tester/index";
1036
- export type { TesterHubViewProps } from "./features/tester/index";
1037
1040
  export { AdminTesterFeedbackView } from "./features/tester/index";
1038
- export { BugHunterLeaderboardView } from "./features/tester/index";
1039
- export type { BugHunterLeaderboardViewProps } from "./features/tester/index";
1040
1041
  export { AdminNavEditorView } from "./features/admin/index";
1041
1042
  export type { AdminNavEditorViewProps, NavItemData } from "./features/admin/index";
1042
1043
  export { AdminNewsletterView } from "./features/admin/index";
@@ -1555,6 +1556,7 @@ export { POST } from "./features/categories/server";
1555
1556
  export { categoriesGET } from "./features/categories/server";
1556
1557
  export { categoryItemDELETE } from "./features/categories/server";
1557
1558
  export { categoryItemGET } from "./features/categories/server";
1559
+ export { categoryDescriptionTemplateGET } from "./features/categories/server";
1558
1560
  export { categoryItemPATCH } from "./features/categories/server";
1559
1561
  export { createCategory } from "./features/categories/server";
1560
1562
  export { deleteCategory } from "./features/categories/server";
@@ -1767,7 +1769,6 @@ export { getEventLeaderboard } from "./features/events/server";
1767
1769
  export { getEventPollResults } from "./features/events/server";
1768
1770
  export { getEventSpinResults } from "./features/events/server";
1769
1771
  export { getUserSpinResultsForEvent } from "./features/events/server";
1770
- export { getBugHunterLeaderboard } from "./features/tester/server";
1771
1772
  export { getPublicEventById } from "./features/events/server";
1772
1773
  export { listPublicEvents } from "./features/events/server";
1773
1774
  export { getRelatedEvents } from "./features/events/server";
@@ -1792,7 +1793,6 @@ export type { TesterChecklistItemDocument } from "./features/tester/index";
1792
1793
  export type { TesterChecklistResponseDocument } from "./features/tester/index";
1793
1794
  export type { TesterAnswer } from "./features/tester/index";
1794
1795
  export type { TesterFeedbackStatus } from "./features/tester/index";
1795
- export type { BugHunterLeaderboardEntry } from "./features/tester/index";
1796
1796
  export { FAQS_PUBLIC_FIELDS } from "./features/faq/index";
1797
1797
  export { FAQSortDropdown } from "./features/faq/index";
1798
1798
  export { FAQ_CATEGORY_LABELS } from "./features/faq/index";
@@ -2370,6 +2370,8 @@ export { checkEmiEligibility, computeEmiSchedule, computeBuyerEmiQuote } from ".
2370
2370
  export type { BuyerEmiQuote } from "./_internal/shared/features/emi/schedule";
2371
2371
  export { toBuyerFacingFees, toBuyerEmiSettings, } from "./_internal/shared/features/site-settings/fees";
2372
2372
  export type { BuyerFacingFees, BuyerEmiSettings, } from "./_internal/shared/features/site-settings/fees";
2373
+ export { GSTIN_PATTERN, gstinCheckCharacter, isValidGstin, validateGstEnablement, canEnableGst, } from "./_internal/shared/features/site-settings/gst-registration";
2374
+ export type { GstEnablementInput, GstEnablementProblems, } from "./_internal/shared/features/site-settings/gst-registration";
2373
2375
  export type { EmiSettings, EmiIneligibleReason, EmiEligibility, EmiInstallmentPlan, EmiScheduleResult, } from "./_internal/shared/features/emi/schedule";
2374
2376
  export { isAdminUser, isSellerUser, isModeratorUser, isEmployeeUser, isBuyerUser, isEffectiveAdminUser, isTesterUser, canTestAdminSurfaces, isStrictSellerUser, isAccountDisabled, } from "./features/auth/role-predicates";
2375
2377
  export { sanitizeProductForPublic, sanitizeProductsForPublic } from "./features/products/index";
@@ -3023,7 +3025,14 @@ export { resolveMediaUrl, resolveVideoUrl, FIREBASE_STORAGE_HOST, GCS_HOST, isSt
3023
3025
  export { generateFAQId } from "./utils/id-generators";
3024
3026
  export type { GenerateFAQIdInput } from "./utils/id-generators";
3025
3027
  export { generateCroppedImageFilename } from "./utils/id-generators";
3026
- export { PRODUCT_FEATURES_COLLECTION, PRODUCT_FEATURE_PREFIX, MAX_STORE_CUSTOM_FEATURES, MAX_FEATURES_PER_PRODUCT, PRODUCT_FEATURE_SIEVE_FIELDS, isFeatureIconPath, } from "./features/products/schemas/product-features";
3028
+ export { PRODUCT_FEATURES_COLLECTION, PRODUCT_FEATURE_PREFIX, MAX_STORE_CUSTOM_FEATURES, MAX_FEATURES_PER_PRODUCT, PRODUCT_FEATURE_SIEVE_FIELDS, FEATURE_GROUP_VALUES, FEATURE_GROUP_LABEL, isFeatureIconPath, } from "./features/products/schemas/product-features";
3029
+ export type { FeatureGroup } from "./features/products/schemas/product-features";
3030
+ export { TAX_CODES_COLLECTION, TAX_CODE_PREFIX, TAX_CODE_FIELDS, TAX_CODE_SIEVE_FIELDS, TAX_CODE_UPDATABLE_FIELDS, GST_RATE_VALUES, createTaxCodeId, isValidHsnCode, } from "./features/tax-codes/schemas/firestore";
3031
+ export type { TaxCodeDocument, TaxCodeCreateInput, TaxCodeUpdateInput, GstRate, HsnChapter, } from "./features/tax-codes/schemas/firestore";
3032
+ export { taxCodeFormSchema, GST_RATE_OPTIONS, HSN_CHAPTER_OPTIONS } from "./features/tax-codes/schemas/tax-code-form";
3033
+ export type { TaxCodeFormValues } from "./features/tax-codes/schemas/tax-code-form";
3034
+ export { taxCodeCreateSchema, taxCodeUpdateSchema, } from "./features/tax-codes/schemas/tax-codes.validators";
3035
+ export type { TaxCodeCreatePayload, TaxCodeUpdatePayload, } from "./features/tax-codes/schemas/tax-codes.validators";
3027
3036
  export type { ProductFeatureDocument, ProductFeatureCreateInput, ProductFeatureUpdateInput, ProductFeatureScope, ProductFeatureCategory, ProductFeatureProductType, ProductFeatureIcon, } from "./features/products/schemas/product-features";
3028
3037
  export { productFeatureAdminCreateSchema, productFeatureStoreCreateSchema, productFeatureUpdateSchema, PRODUCT_FEATURE_PRODUCT_TYPE_ENUM, PRODUCT_FEATURE_CATEGORY_ENUM, PRODUCT_FEATURE_SCOPE_ENUM, } from "./features/products/schemas/product-features.validators";
3029
3038
  export type { ProductFeatureAdminCreatePayload, ProductFeatureStoreCreatePayload, ProductFeatureUpdatePayload, } from "./features/products/schemas/product-features.validators";
@@ -3053,6 +3062,7 @@ export { navItemFormSchema, navItemCreateSchema, navItemUpdateSchema, type NavIt
3053
3062
  export { groupedListingFormSchema, groupedListingCreateSchema, groupedListingUpdateSchema, type GroupedListingFormValues, } from "./features/grouped/schemas/grouped-listing-form";
3054
3063
  export { scammersSeedData } from "./seed/index";
3055
3064
  export { productFeaturesSeedData } from "./seed/index";
3065
+ export { taxCodesSeedData } from "./seed/index";
3056
3066
  export { SCAMMER_COLLECTION, SCAMMER_ID_PREFIX, SCAMMER_MATCH_FIELDS, SCAMMER_INDEXED_FIELDS, SCAMMER_FIELDS, SCAMMER_INCIDENTS_SUBCOLLECTION, SCAMMER_COMMENTS_SUBCOLLECTION, SCAMMER_CONTESTS_SUBCOLLECTION, MAX_COMMENT_BODY_LENGTH, MAX_PENDING_SCAMMER_REPORTS_PER_USER, ScammerStatusValues, ScamPlatformValues, SocialPlatformValues, ContestTypeValues, ContestStatusValues, SCAM_PLATFORM_LABELS, SOCIAL_PLATFORM_LABELS, SCAMMER_STATUS_LABELS, CONTEST_TYPE_LABELS, CONTEST_STATUS_LABELS, DEFAULT_SCAMMER_DATA, DEFAULT_SCAMMER_INCIDENT_DATA, DEFAULT_SCAMMER_COMMENT_DATA, DEFAULT_SCAMMER_CONTEST_DATA, } from "./features/scams/schemas/firestore";
3057
3067
  export type { ScammerStatus, ScamPlatform, SocialPlatform, ContestType, ContestStatus, ScammerMatchField, ScammerMatchStrength, ScammerSocialMedia, ScammerDocument, ScammerIncidentDocument, ScammerCommentDocument, ScammerContestDocument, ScammerSuggestion, ScammerCreateInput, ScammerAdminUpdateInput, ScammerIncidentCreateInput, ScammerCommentCreateInput, ScammerContestCreateInput, } from "./features/scams/schemas/firestore";
3058
3068
  export { SCAM_TYPES, SCAM_CATEGORIES, SCAM_TYPE_LABELS, SCAM_CATEGORY_LABELS, getScamType, getScamTypesByCategory, getCategoryForScamType, } from "./features/scams/constants/scam-types";
@@ -3073,6 +3083,10 @@ export { SellerProductShell } from "./features/seller/components/SellerProductSh
3073
3083
  export type { SellerProductShellProps, SellerProductDraft, ProductListingMode } from "./features/seller/components/SellerProductShell";
3074
3084
  export { CategoryInlineSelect } from "./features/seller/components/CategoryInlineSelect";
3075
3085
  export type { CategoryInlineSelectProps } from "./features/seller/components/CategoryInlineSelect";
3086
+ export { ALERT_METRIC_VALUES, ALERT_METRICS, isAlertMetric, alertMetricsForScope, LOW_STOCK_THRESHOLD, } from "./features/store-extensions/constants/alert-metrics";
3087
+ export type { AlertMetric, AlertMetricDef, AlertMetricScope, AlertMetricUnit, } from "./features/store-extensions/constants/alert-metrics";
3088
+ export { CategoryTemplatePicker, variantForCondition } from "./features/categories/components/CategoryTemplatePicker";
3089
+ export type { CategoryTemplatePickerProps, CategoryTemplateApply } from "./features/categories/components/CategoryTemplatePicker";
3076
3090
  export { BrandInlineSelect } from "./features/seller/components/BrandInlineSelect";
3077
3091
  export type { BrandInlineSelectProps } from "./features/seller/components/BrandInlineSelect";
3078
3092
  export { SublistingInlineSelect } from "./features/seller/components/SublistingInlineSelect";
package/dist/index.js CHANGED
@@ -1075,10 +1075,16 @@ export { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData,
1075
1075
  // SB-UNI-B â€" sublistingCategoriesRepository + SublistingCategoryDocument deleted.
1076
1076
  // Use categoriesRepository.findBySlugAndType(slug, "sublisting") and CategoryDocument with categoryType:"sublisting".
1077
1077
  // [DB]-Database layer â€" uses firebase-admin; server-only.
1078
+ // AdminTaxCodesView / AdminTaxCodeEditorView (B3) — /admin/tax-codes.
1079
+ export { AdminTaxCodesView } from "./features/admin/components/AdminTaxCodesView";
1080
+ export { AdminTaxCodeEditorView } from "./features/admin/components/AdminTaxCodeEditorView";
1078
1081
  // productFeaturesRepository - Server-only repository for productFeatures (FI1).
1079
1082
  export { productFeaturesRepository } from "./repositories/index";
1080
1083
  // loadProductFeaturesForStore - SSR helper combining listPlatform + listForStore (FI6).
1081
1084
  export { loadProductFeaturesForStore } from "./repositories/index";
1085
+ // taxCodesRepository - Server-only repository for taxCodes (B3). An HSN code and
1086
+ // its GST rate as an ENTITY, so a rate change is one edit rather than ~330.
1087
+ export { taxCodesRepository } from "./repositories/index";
1082
1088
  // productTemplateRepository - Server-only repository for store product templates.
1083
1089
  export { productTemplateRepository } from "./repositories/index";
1084
1090
  // [DB]-Database layer â€" uses firebase-admin or another server-side DB SDK; can only run in a trusted server environment.
@@ -2006,12 +2012,8 @@ export { AdminFaqEditorView } from "./features/admin/index";
2006
2012
  export { AdminTesterChecklistView } from "./features/admin/index";
2007
2013
  // AdminTesterChecklistItemEditorView - Component for admin tester-checklist item create/edit form.
2008
2014
  export { AdminTesterChecklistItemEditorView } from "./features/admin/index";
2009
- // TesterHubView - Component for the tester-facing checklist hub page.
2010
- export { TesterHubView } from "./features/tester/index";
2011
2015
  // AdminTesterFeedbackView - Component for the admin Tester Feedback report/issues/submissions page.
2012
2016
  export { AdminTesterFeedbackView } from "./features/tester/index";
2013
- // BugHunterLeaderboardView - Public component ranking testers by confirmed-bug count.
2014
- export { BugHunterLeaderboardView } from "./features/tester/index";
2015
2017
  // AdminNavEditorView - SideDrawer form for nav item create/edit.
2016
2018
  export { AdminNavEditorView } from "./features/admin/index";
2017
2019
  // [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
@@ -2959,6 +2961,8 @@ export { categoryItemDELETE } from "./features/categories/server";
2959
2961
  // [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
2960
2962
  // categoryItemGET - Shared export for category item get.
2961
2963
  export { categoryItemGET } from "./features/categories/server";
2964
+ // categoryDescriptionTemplateGET - the seller form's inherited-template read.
2965
+ export { categoryDescriptionTemplateGET } from "./features/categories/server";
2962
2966
  // [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
2963
2967
  // categoryItemPATCH - Shared export for category item patch.
2964
2968
  export { categoryItemPATCH } from "./features/categories/server";
@@ -3342,8 +3346,6 @@ export { getEventSpinResults } from "./features/events/server";
3342
3346
  // getUserSpinResultsForEvent - The CALLER'S OWN spins for an event, unmasked. Companion to the masked public feed above.
3343
3347
  export { getUserSpinResultsForEvent } from "./features/events/server";
3344
3348
  // [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
3345
- // getBugHunterLeaderboard - Ranks testers by confirmed-bug count.
3346
- export { getBugHunterLeaderboard } from "./features/tester/server";
3347
3349
  // [SERVER-ONLY]-Server-only â€" uses Node.js, Next.js server internals, or third-party server SDKs (auth, email, payment, shipping).
3348
3350
  // getPublicEventById - Helper for get public event by id.
3349
3351
  export { getPublicEventById } from "./features/events/server";
@@ -4328,6 +4330,11 @@ export { checkEmiEligibility, computeEmiSchedule, computeBuyerEmiQuote } from ".
4328
4330
  // Buyer-facing projections of siteSettings.commissions / .emi — the single
4329
4331
  // definition of "safe to send to a browser" for fee data. See fees.ts header.
4330
4332
  export { toBuyerFacingFees, toBuyerEmiSettings, } from "./_internal/shared/features/site-settings/fees";
4333
+ // The gate on turning product GST on. Exported because BOTH ends need the same
4334
+ // implementation — `/api/admin/site` refuses the write and the admin form
4335
+ // shows the problem inline — and two copies of a compliance rule is the shape
4336
+ // of Root Cause #75.
4337
+ export { GSTIN_PATTERN, gstinCheckCharacter, isValidGstin, validateGstEnablement, canEnableGst, } from "./_internal/shared/features/site-settings/gst-registration";
4331
4338
  // User-role predicates â€" SB-UNI-E 2026-05-13.
4332
4339
  export { isAdminUser, isSellerUser, isModeratorUser, isEmployeeUser, isBuyerUser, isEffectiveAdminUser, isTesterUser, canTestAdminSurfaces, isStrictSellerUser, isAccountDisabled, } from "./features/auth/role-predicates";
4333
4340
  // [SERVER-ONLY]-Safe in browser but intended for server routes.
@@ -5369,7 +5376,14 @@ export { generateCroppedImageFilename } from "./utils/id-generators";
5369
5376
  // opens the offer form instead. See `offerIsOnlyPurchasePath`.
5370
5377
  // SB-UNI-B â€" SublistingCategoryDocument deleted; sublistings are CategoryDocument with categoryType:"sublisting".
5371
5378
  // Product features feature schemas (FI1)
5372
- export { PRODUCT_FEATURES_COLLECTION, PRODUCT_FEATURE_PREFIX, MAX_STORE_CUSTOM_FEATURES, MAX_FEATURES_PER_PRODUCT, PRODUCT_FEATURE_SIEVE_FIELDS, isFeatureIconPath, } from "./features/products/schemas/product-features";
5379
+ export { PRODUCT_FEATURES_COLLECTION, PRODUCT_FEATURE_PREFIX, MAX_STORE_CUSTOM_FEATURES, MAX_FEATURES_PER_PRODUCT, PRODUCT_FEATURE_SIEVE_FIELDS, FEATURE_GROUP_VALUES, FEATURE_GROUP_LABEL, isFeatureIconPath, } from "./features/products/schemas/product-features";
5380
+ // Tax codes feature schemas (B3) — HSN + GST rate as an entity.
5381
+ export { TAX_CODES_COLLECTION, TAX_CODE_PREFIX, TAX_CODE_FIELDS, TAX_CODE_SIEVE_FIELDS, TAX_CODE_UPDATABLE_FIELDS, GST_RATE_VALUES, createTaxCodeId, isValidHsnCode, } from "./features/tax-codes/schemas/firestore";
5382
+ export { taxCodeFormSchema, GST_RATE_OPTIONS, HSN_CHAPTER_OPTIONS } from "./features/tax-codes/schemas/tax-code-form";
5383
+ // Wire contracts for /api/admin/tax-codes. BOTH are .strict(): z.object()
5384
+ // strips unknown keys (a PATCH returning 200 having written nothing),
5385
+ // .passthrough() writes whatever arrives.
5386
+ export { taxCodeCreateSchema, taxCodeUpdateSchema, } from "./features/tax-codes/schemas/tax-codes.validators";
5373
5387
  // Product features zod validators (S8 refactor â€" shared by admin + store API routes)
5374
5388
  export { productFeatureAdminCreateSchema, productFeatureStoreCreateSchema, productFeatureUpdateSchema, PRODUCT_FEATURE_PRODUCT_TYPE_ENUM, PRODUCT_FEATURE_CATEGORY_ENUM, PRODUCT_FEATURE_SCOPE_ENUM, } from "./features/products/schemas/product-features.validators";
5375
5389
  // parseListingParams / serializeListingParams â€" short-name URL params (Q2 / S12)
@@ -5410,6 +5424,14 @@ export { groupedListingFormSchema, groupedListingCreateSchema, groupedListingUpd
5410
5424
  export { scammersSeedData } from "./seed/index";
5411
5425
  // Product features â€" seed data (FI2)
5412
5426
  export { productFeaturesSeedData } from "./seed/index";
5427
+ /*
5428
+ * 🛑 Registering a seed collection takes FOUR edits and three of them are
5429
+ * silent if missed: seed/index.ts, THIS re-export, and seed-cli's own import
5430
+ * plus its two maps. With this line absent, `appkit-seed status` reported
5431
+ * `taxCodes seed 0 in db 0` — the collection looked registered and simply
5432
+ * had no data, which is indistinguishable from an empty fixture set.
5433
+ */
5434
+ export { taxCodesSeedData } from "./seed/index";
5413
5435
  // Scam registry â€" schema types and constants
5414
5436
  export { SCAMMER_COLLECTION, SCAMMER_ID_PREFIX, SCAMMER_MATCH_FIELDS, SCAMMER_INDEXED_FIELDS, SCAMMER_FIELDS, SCAMMER_INCIDENTS_SUBCOLLECTION, SCAMMER_COMMENTS_SUBCOLLECTION, SCAMMER_CONTESTS_SUBCOLLECTION, MAX_COMMENT_BODY_LENGTH, MAX_PENDING_SCAMMER_REPORTS_PER_USER, ScammerStatusValues, ScamPlatformValues, SocialPlatformValues, ContestTypeValues, ContestStatusValues, SCAM_PLATFORM_LABELS, SOCIAL_PLATFORM_LABELS, SCAMMER_STATUS_LABELS, CONTEST_TYPE_LABELS, CONTEST_STATUS_LABELS, DEFAULT_SCAMMER_DATA, DEFAULT_SCAMMER_INCIDENT_DATA, DEFAULT_SCAMMER_COMMENT_DATA, DEFAULT_SCAMMER_CONTEST_DATA, } from "./features/scams/schemas/firestore";
5415
5437
  // Scam registry â€" scam type definitions
@@ -5426,6 +5448,30 @@ export { listVerifiedScammers, getPublicScammerById, getScammerProfilePageData,
5426
5448
  export { SellerProductShell } from "./features/seller/components/SellerProductShell";
5427
5449
  // [CLIENT] CategoryInlineSelect â€" searchable category selector with optional inline quick-create.
5428
5450
  export { CategoryInlineSelect } from "./features/seller/components/CategoryInlineSelect";
5451
+ /*
5452
+ * 🛑 The category-content Zod schemas are deliberately NOT exported, and this
5453
+ * note exists so nobody adds them.
5454
+ *
5455
+ * Measured 2026-10-11: appkit compiles against **zod 3.25.76**
5456
+ * (`appkit/node_modules/zod`, pinned `^3.24.0`) while the consumer resolves
5457
+ * **zod 4.4.3**. Those are different majors with incompatible type identities,
5458
+ * so an appkit `ZodObject` nested inside a consumer `z.array(...)` fails to
5459
+ * typecheck — it is not a `dedupe-peer-deps` miss but a genuine version split.
5460
+ *
5461
+ * The direction that DOES work is consumer-schema → appkit handler, which is
5462
+ * why every route declaring its own schema and handing it to
5463
+ * `createRouteHandler` is fine. Sharing a schema the other way is not
5464
+ * available until the two agree on a major.
5465
+ */
5466
+ // The ONE alert-metric vocabulary (C3a) plus the shared low-stock threshold.
5467
+ // Exported because the consumer needs the threshold too: the alert evaluator,
5468
+ // the seller products column and the store dashboard tile must agree on what
5469
+ // "low" means, or a seller gets a warning from one and a clean bill from
5470
+ // another.
5471
+ export { ALERT_METRIC_VALUES, ALERT_METRICS, isAlertMetric, alertMetricsForScope, LOW_STOCK_THRESHOLD, } from "./features/store-extensions/constants/alert-metrics";
5472
+ // [CLIENT] CategoryTemplatePicker — the seller form's category description-template
5473
+ // picker (C2c). Fills SellerProductShell's `renderTemplateSelector` slot.
5474
+ export { CategoryTemplatePicker, variantForCondition } from "./features/categories/components/CategoryTemplatePicker";
5429
5475
  // [CLIENT] BrandInlineSelect â€" searchable brand selector with inline quick-create (default: allowCreate=true).
5430
5476
  export { BrandInlineSelect } from "./features/seller/components/BrandInlineSelect";
5431
5477
  // [CLIENT] SublistingInlineSelect â€" searchable sub-listing-category picker with optional admin quick-create.
@@ -15,7 +15,6 @@ export declare const DEFAULT_ROUTE_MAP: {
15
15
  readonly PUBLIC: {
16
16
  readonly FAQS: "/faqs";
17
17
  readonly FAQ_CATEGORY: (category: string) => string;
18
- readonly BUG_HUNTERS: "/bug-hunters";
19
18
  readonly PROFILE: (userId: string) => string;
20
19
  readonly PRODUCTS: "/products";
21
20
  readonly PRODUCT_DETAIL: (slugOrId: string) => string;
@@ -171,7 +170,6 @@ export declare const DEFAULT_ROUTE_MAP: {
171
170
  readonly CATALOGUE: "/user/catalogue";
172
171
  readonly CATALOGUE_NEW: "/user/catalogue/new";
173
172
  readonly CATALOGUE_EDIT: (id: string) => string;
174
- readonly TESTER_HUB: "/user/tester";
175
173
  };
176
174
  readonly STORE: {
177
175
  readonly DASHBOARD: "/store";
@@ -357,6 +355,7 @@ export declare const DEFAULT_ROUTE_MAP: {
357
355
  readonly SUBLISTING_CATEGORIES_NEW: "/admin/sublisting-categories/new";
358
356
  readonly SUBLISTING_CATEGORIES_EDIT: (id: string) => string;
359
357
  readonly FEATURES: "/admin/features";
358
+ readonly TAX_CODES: "/admin/tax-codes";
360
359
  readonly FEATURES_NEW: "/admin/features/new";
361
360
  readonly FEATURES_EDIT: (id: string) => string;
362
361
  readonly BUNDLES: "/admin/bundles";
@@ -419,7 +418,6 @@ export declare const ROUTES: {
419
418
  readonly PUBLIC: {
420
419
  readonly FAQS: "/faqs";
421
420
  readonly FAQ_CATEGORY: (category: string) => string;
422
- readonly BUG_HUNTERS: "/bug-hunters";
423
421
  readonly PROFILE: (userId: string) => string;
424
422
  readonly PRODUCTS: "/products";
425
423
  readonly PRODUCT_DETAIL: (slugOrId: string) => string;
@@ -575,7 +573,6 @@ export declare const ROUTES: {
575
573
  readonly CATALOGUE: "/user/catalogue";
576
574
  readonly CATALOGUE_NEW: "/user/catalogue/new";
577
575
  readonly CATALOGUE_EDIT: (id: string) => string;
578
- readonly TESTER_HUB: "/user/tester";
579
576
  };
580
577
  readonly STORE: {
581
578
  readonly DASHBOARD: "/store";
@@ -761,6 +758,7 @@ export declare const ROUTES: {
761
758
  readonly SUBLISTING_CATEGORIES_NEW: "/admin/sublisting-categories/new";
762
759
  readonly SUBLISTING_CATEGORIES_EDIT: (id: string) => string;
763
760
  readonly FEATURES: "/admin/features";
761
+ readonly TAX_CODES: "/admin/tax-codes";
764
762
  readonly FEATURES_NEW: "/admin/features/new";
765
763
  readonly FEATURES_EDIT: (id: string) => string;
766
764
  readonly BUNDLES: "/admin/bundles";
@@ -3,7 +3,6 @@ export const DEFAULT_ROUTE_MAP = {
3
3
  PUBLIC: {
4
4
  FAQS: "/faqs",
5
5
  FAQ_CATEGORY: (category) => `/faqs/${category}`,
6
- BUG_HUNTERS: "/bug-hunters",
7
6
  PROFILE: (userId) => `/profile/${userId}`,
8
7
  PRODUCTS: "/products",
9
8
  PRODUCT_DETAIL: (slugOrId) => `/products/${slugOrId}`,
@@ -175,7 +174,6 @@ export const DEFAULT_ROUTE_MAP = {
175
174
  CATALOGUE: "/user/catalogue",
176
175
  CATALOGUE_NEW: "/user/catalogue/new",
177
176
  CATALOGUE_EDIT: (id) => `/user/catalogue/${id}/edit`,
178
- TESTER_HUB: "/user/tester",
179
177
  },
180
178
  STORE: {
181
179
  DASHBOARD: "/store",
@@ -379,6 +377,7 @@ export const DEFAULT_ROUTE_MAP = {
379
377
  SUBLISTING_CATEGORIES_NEW: "/admin/sublisting-categories/new",
380
378
  SUBLISTING_CATEGORIES_EDIT: (id) => `/admin/sublisting-categories/${id}/edit`,
381
379
  FEATURES: "/admin/features",
380
+ TAX_CODES: "/admin/tax-codes",
382
381
  FEATURES_NEW: "/admin/features/new",
383
382
  FEATURES_EDIT: (id) => `/admin/features/${id}/edit`,
384
383
  // SB1-J — bundles + prize draws (admin moderation)
@@ -59,6 +59,7 @@ export type { ProductTemplateDocument, ProductTemplateCreateInput, ProductTempla
59
59
  export { ProductFeaturesRepository, productFeaturesRepository, } from "../features/products/repository/product-features.repository";
60
60
  export type { ProductFeatureListFilter } from "../features/products/repository/product-features.repository";
61
61
  export { loadProductFeaturesForStore } from "../features/products/repository/loadProductFeatures";
62
+ export { TaxCodesRepository, taxCodesRepository, } from "../features/tax-codes/repository/tax-codes.repository";
62
63
  export { LotteryEntryRepository, lotteryEntryRepository, } from "../features/lottery/repository/lottery-entry.repository";
63
64
  export { MediaAssetsRepository, mediaAssetsRepository, } from "../features/media/repository/media-assets.repository";
64
65
  export type { MediaAssetDocument, MediaAssetCreateInput, } from "../features/media/repository/media-assets.repository";
@@ -65,6 +65,7 @@ export { SupportRepository, supportRepository, } from "../features/support/repos
65
65
  export { ProductTemplateRepository, productTemplateRepository, } from "../features/products/repository/product-templates.repository";
66
66
  export { ProductFeaturesRepository, productFeaturesRepository, } from "../features/products/repository/product-features.repository";
67
67
  export { loadProductFeaturesForStore } from "../features/products/repository/loadProductFeatures";
68
+ export { TaxCodesRepository, taxCodesRepository, } from "../features/tax-codes/repository/tax-codes.repository";
68
69
  // SB-UNI-V — BundlesRepository deleted; bundles live on categoriesRepository
69
70
  // with categoryType:"bundle". See features/categories/repository for the
70
71
  // listByType / findBySlugAndType helpers.