@mohasinac/appkit 4.58.0 → 4.59.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 (556) hide show
  1. package/dist/.build-stamp.json +3 -3
  2. package/dist/_internal/server/jobs/handlers/messages.d.ts +1 -1
  3. package/dist/_internal/server/jobs/handlers/messages.js +1 -1
  4. package/dist/_internal/shared/types/base-document.d.ts +1 -1
  5. package/dist/constants/seed-meta.d.ts +113 -0
  6. package/dist/constants/seed-meta.js +91 -0
  7. package/dist/index.d.ts +0 -131
  8. package/dist/index.js +50 -294
  9. package/dist/server.d.ts +0 -69
  10. package/dist/server.js +0 -69
  11. package/package.json +4 -2
  12. package/scripts/seed-cli.mjs +69 -1
  13. package/dist/features/tester/seed-data/_happy-path.d.ts +0 -23
  14. package/dist/features/tester/seed-data/_happy-path.js +0 -710
  15. package/dist/features/tester/seed-data/_money-flows.d.ts +0 -23
  16. package/dist/features/tester/seed-data/_money-flows.js +0 -610
  17. package/dist/features/tester/seed-data/authored/_types.d.ts +0 -57
  18. package/dist/features/tester/seed-data/authored/_types.js +0 -35
  19. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +0 -2
  20. package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +0 -226
  21. package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +0 -2
  22. package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +0 -329
  23. package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +0 -2
  24. package/dist/features/tester/seed-data/authored/addresses__address-filters.js +0 -41
  25. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +0 -2
  26. package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +0 -76
  27. package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +0 -2
  28. package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +0 -78
  29. package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +0 -2
  30. package/dist/features/tester/seed-data/authored/addresses__state-picker.js +0 -59
  31. package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +0 -2
  32. package/dist/features/tester/seed-data/authored/addresses__unban-request.js +0 -77
  33. package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.d.ts +0 -2
  34. package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.js +0 -151
  35. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +0 -2
  36. package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +0 -265
  37. package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +0 -2
  38. package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +0 -131
  39. package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.d.ts +0 -2
  40. package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.js +0 -143
  41. package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +0 -2
  42. package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +0 -207
  43. package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +0 -2
  44. package/dist/features/tester/seed-data/authored/admin__bundles.js +0 -144
  45. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +0 -2
  46. package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +0 -265
  47. package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +0 -2
  48. package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +0 -318
  49. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +0 -2
  50. package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +0 -177
  51. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +0 -2
  52. package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +0 -165
  53. package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +0 -2
  54. package/dist/features/tester/seed-data/authored/admin__content-deletes.js +0 -267
  55. package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +0 -2
  56. package/dist/features/tester/seed-data/authored/admin__content-marketing.js +0 -188
  57. package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +0 -2
  58. package/dist/features/tester/seed-data/authored/admin__coupons.js +0 -215
  59. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +0 -2
  60. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +0 -202
  61. package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.d.ts +0 -2
  62. package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.js +0 -249
  63. package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +0 -2
  64. package/dist/features/tester/seed-data/authored/admin__media-watermark.js +0 -148
  65. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +0 -2
  66. package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +0 -350
  67. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +0 -2
  68. package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +0 -129
  69. package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +0 -2
  70. package/dist/features/tester/seed-data/authored/admin__site-system.js +0 -586
  71. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +0 -2
  72. package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +0 -260
  73. package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +0 -2
  74. package/dist/features/tester/seed-data/authored/admin__users-trust.js +0 -569
  75. package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +0 -2
  76. package/dist/features/tester/seed-data/authored/buying__bidding.js +0 -449
  77. package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +0 -2
  78. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +0 -684
  79. package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +0 -2
  80. package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +0 -546
  81. package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +0 -2
  82. package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +0 -379
  83. package/dist/features/tester/seed-data/authored/buying__cart.d.ts +0 -2
  84. package/dist/features/tester/seed-data/authored/buying__cart.js +0 -1264
  85. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +0 -2
  86. package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +0 -122
  87. package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +0 -2
  88. package/dist/features/tester/seed-data/authored/buying__my-orders.js +0 -279
  89. package/dist/features/tester/seed-data/authored/buying__offers.d.ts +0 -2
  90. package/dist/features/tester/seed-data/authored/buying__offers.js +0 -1127
  91. package/dist/features/tester/seed-data/authored/buying__order-detail-actions.d.ts +0 -2
  92. package/dist/features/tester/seed-data/authored/buying__order-detail-actions.js +0 -153
  93. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +0 -2
  94. package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +0 -252
  95. package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +0 -2
  96. package/dist/features/tester/seed-data/authored/buying__product-detail.js +0 -474
  97. package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +0 -2
  98. package/dist/features/tester/seed-data/authored/buying__return-request.js +0 -165
  99. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +0 -2
  100. package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +0 -260
  101. package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +0 -2
  102. package/dist/features/tester/seed-data/authored/buying__reviews.js +0 -128
  103. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +0 -2
  104. package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +0 -96
  105. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +0 -2
  106. package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +0 -283
  107. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +0 -2
  108. package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +0 -169
  109. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +0 -2
  110. package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +0 -105
  111. package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +0 -2
  112. package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +0 -374
  113. package/dist/features/tester/seed-data/authored/community-support__messages.d.ts +0 -2
  114. package/dist/features/tester/seed-data/authored/community-support__messages.js +0 -200
  115. package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +0 -2
  116. package/dist/features/tester/seed-data/authored/community-support__public-profile.js +0 -54
  117. package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +0 -2
  118. package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +0 -76
  119. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +0 -4
  120. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +0 -590
  121. package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +0 -2
  122. package/dist/features/tester/seed-data/authored/content-discovery__blog.js +0 -110
  123. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +0 -2
  124. package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +0 -149
  125. package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.d.ts +0 -2
  126. package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.js +0 -145
  127. package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.d.ts +0 -2
  128. package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +0 -174
  129. package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +0 -2
  130. package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +0 -169
  131. package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.d.ts +0 -2
  132. package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.js +0 -209
  133. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +0 -2
  134. package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +0 -207
  135. package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +0 -2
  136. package/dist/features/tester/seed-data/authored/content-discovery__events.js +0 -377
  137. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +0 -2
  138. package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +0 -87
  139. package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +0 -2
  140. package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +0 -147
  141. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +0 -2
  142. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +0 -209
  143. package/dist/features/tester/seed-data/authored/content-discovery__parts-database.d.ts +0 -2
  144. package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +0 -167
  145. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +0 -2
  146. package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +0 -73
  147. package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +0 -2
  148. package/dist/features/tester/seed-data/authored/content-discovery__search.js +0 -363
  149. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +0 -2
  150. package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +0 -340
  151. package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.d.ts +0 -2
  152. package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.js +0 -88
  153. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +0 -2
  154. package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +0 -78
  155. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +0 -2
  156. package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +0 -76
  157. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +0 -2
  158. package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +0 -62
  159. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +0 -2
  160. package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +0 -163
  161. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +0 -2
  162. package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +0 -61
  163. package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.d.ts +0 -2
  164. package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.js +0 -89
  165. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +0 -2
  166. package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +0 -95
  167. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +0 -2
  168. package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +0 -191
  169. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +0 -2
  170. package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +0 -158
  171. package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.d.ts +0 -2
  172. package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.js +0 -82
  173. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +0 -2
  174. package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +0 -106
  175. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +0 -2
  176. package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +0 -88
  177. package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +0 -2
  178. package/dist/features/tester/seed-data/authored/design-ux__general-design.js +0 -204
  179. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +0 -2
  180. package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +0 -301
  181. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +0 -2
  182. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +0 -90
  183. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +0 -2
  184. package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +0 -85
  185. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +0 -2
  186. package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +0 -407
  187. package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.d.ts +0 -2
  188. package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.js +0 -88
  189. package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.d.ts +0 -2
  190. package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.js +0 -84
  191. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +0 -2
  192. package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +0 -214
  193. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +0 -2
  194. package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +0 -275
  195. package/dist/features/tester/seed-data/authored/index.d.ts +0 -2
  196. package/dist/features/tester/seed-data/authored/index.js +0 -301
  197. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +0 -2
  198. package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +0 -125
  199. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +0 -2
  200. package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +0 -85
  201. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +0 -2
  202. package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +0 -92
  203. package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +0 -2
  204. package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +0 -115
  205. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +0 -2
  206. package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +0 -137
  207. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +0 -2
  208. package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +0 -263
  209. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +0 -2
  210. package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +0 -229
  211. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +0 -2
  212. package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +0 -325
  213. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +0 -2
  214. package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +0 -126
  215. package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.d.ts +0 -2
  216. package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.js +0 -141
  217. package/dist/features/tester/seed-data/authored/public-pages__store-tabs.d.ts +0 -2
  218. package/dist/features/tester/seed-data/authored/public-pages__store-tabs.js +0 -115
  219. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +0 -2
  220. package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +0 -253
  221. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +0 -2
  222. package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +0 -93
  223. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +0 -3
  224. package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +0 -185
  225. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +0 -2
  226. package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +0 -82
  227. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +0 -2
  228. package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +0 -60
  229. package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +0 -2
  230. package/dist/features/tester/seed-data/authored/selling__become-seller.js +0 -117
  231. package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.d.ts +0 -2
  232. package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.js +0 -148
  233. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +0 -2
  234. package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +0 -108
  235. package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +0 -2
  236. package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +0 -274
  237. package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.d.ts +0 -2
  238. package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.js +0 -145
  239. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +0 -2
  240. package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +0 -336
  241. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +0 -2
  242. package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +0 -136
  243. package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +0 -2
  244. package/dist/features/tester/seed-data/authored/selling__media-limits.js +0 -135
  245. package/dist/features/tester/seed-data/authored/selling__product-upload-details.d.ts +0 -2
  246. package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +0 -155
  247. package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.d.ts +0 -2
  248. package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.js +0 -138
  249. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +0 -2
  250. package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +0 -191
  251. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +0 -2
  252. package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +0 -138
  253. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +0 -2
  254. package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +0 -106
  255. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +0 -2
  256. package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +0 -192
  257. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +0 -2
  258. package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +0 -109
  259. package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +0 -2
  260. package/dist/features/tester/seed-data/authored/selling__seller-guide.js +0 -34
  261. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +0 -2
  262. package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +0 -348
  263. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +0 -2
  264. package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +0 -87
  265. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +0 -2
  266. package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +0 -90
  267. package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.d.ts +0 -2
  268. package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.js +0 -85
  269. package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +0 -2
  270. package/dist/features/tester/seed-data/authored/selling__seller-orders.js +0 -213
  271. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +0 -2
  272. package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +0 -192
  273. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +0 -2
  274. package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +0 -77
  275. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +0 -2
  276. package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +0 -165
  277. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +0 -2
  278. package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +0 -116
  279. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +0 -2
  280. package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +0 -127
  281. package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +0 -2
  282. package/dist/features/tester/seed-data/authored/seo__og-images.js +0 -107
  283. package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +0 -2
  284. package/dist/features/tester/seed-data/authored/seo__page-metadata.js +0 -120
  285. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +0 -2
  286. package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +0 -105
  287. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +0 -2
  288. package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +0 -58
  289. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +0 -2
  290. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +0 -284
  291. package/dist/features/tester/seed-data/index.d.ts +0 -2
  292. package/dist/features/tester/seed-data/index.js +0 -2
  293. package/dist/features/tester/seed-data/tester-checklist-seed-data.d.ts +0 -2
  294. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +0 -7601
  295. package/dist/features/tester/seed-data/tester-responses-seed-data.d.ts +0 -2
  296. package/dist/features/tester/seed-data/tester-responses-seed-data.js +0 -95
  297. package/dist/features/tester/seed-data/tester-window.d.ts +0 -25
  298. package/dist/features/tester/seed-data/tester-window.js +0 -66
  299. package/dist/seed/_helpers/brand-rows.d.ts +0 -35
  300. package/dist/seed/_helpers/brand-rows.js +0 -600
  301. package/dist/seed/_helpers/category-content-generated.d.ts +0 -24
  302. package/dist/seed/_helpers/category-content-generated.js +0 -1853
  303. package/dist/seed/_helpers/category-content.d.ts +0 -68
  304. package/dist/seed/_helpers/category-content.js +0 -731
  305. package/dist/seed/_helpers/category-forest.d.ts +0 -4
  306. package/dist/seed/_helpers/category-forest.js +0 -824
  307. package/dist/seed/_helpers/category-images-generated.d.ts +0 -57
  308. package/dist/seed/_helpers/category-images-generated.js +0 -618
  309. package/dist/seed/_helpers/category-models/chunk0.d.ts +0 -2
  310. package/dist/seed/_helpers/category-models/chunk0.js +0 -2648
  311. package/dist/seed/_helpers/category-models/chunk1.d.ts +0 -2
  312. package/dist/seed/_helpers/category-models/chunk1.js +0 -2318
  313. package/dist/seed/_helpers/category-models/chunk2.d.ts +0 -2
  314. package/dist/seed/_helpers/category-models/chunk2.js +0 -2560
  315. package/dist/seed/_helpers/category-models/chunk3.d.ts +0 -2
  316. package/dist/seed/_helpers/category-models/chunk3.js +0 -2196
  317. package/dist/seed/_helpers/category-models/chunk4.d.ts +0 -2
  318. package/dist/seed/_helpers/category-models/chunk4.js +0 -1732
  319. package/dist/seed/_helpers/category-models.d.ts +0 -12
  320. package/dist/seed/_helpers/category-models.js +0 -45
  321. package/dist/seed/_helpers/category-names.d.ts +0 -54
  322. package/dist/seed/_helpers/category-names.js +0 -118
  323. package/dist/seed/_helpers/category-parts-glossary-map.d.ts +0 -1
  324. package/dist/seed/_helpers/category-parts-glossary-map.js +0 -2499
  325. package/dist/seed/_helpers/category-parts.d.ts +0 -9
  326. package/dist/seed/_helpers/category-parts.js +0 -15022
  327. package/dist/seed/_helpers/category-tree.d.ts +0 -27
  328. package/dist/seed/_helpers/category-tree.js +0 -119
  329. package/dist/seed/_helpers/character-features.d.ts +0 -10
  330. package/dist/seed/_helpers/character-features.js +0 -120
  331. package/dist/seed/_helpers/final-sale-fixtures.d.ts +0 -35
  332. package/dist/seed/_helpers/final-sale-fixtures.js +0 -61
  333. package/dist/seed/_helpers/franchise-rows.d.ts +0 -43
  334. package/dist/seed/_helpers/franchise-rows.js +0 -189
  335. package/dist/seed/_helpers/media.d.ts +0 -67
  336. package/dist/seed/_helpers/media.js +0 -172
  337. package/dist/seed/_helpers/part-colours-generated.d.ts +0 -18
  338. package/dist/seed/_helpers/part-colours-generated.js +0 -273
  339. package/dist/seed/_helpers/product-search-txt.d.ts +0 -18
  340. package/dist/seed/_helpers/product-search-txt.js +0 -23
  341. package/dist/seed/_helpers/search-txt-wrappers.d.ts +0 -26
  342. package/dist/seed/_helpers/search-txt-wrappers.js +0 -58
  343. package/dist/seed/addresses-seed-data.d.ts +0 -2
  344. package/dist/seed/addresses-seed-data.js +0 -78
  345. package/dist/seed/authenticity-knowledge-seed-data.d.ts +0 -78
  346. package/dist/seed/authenticity-knowledge-seed-data.js +0 -10729
  347. package/dist/seed/bey-products-seed-data.d.ts +0 -18
  348. package/dist/seed/bey-products-seed-data.js +0 -18011
  349. package/dist/seed/beys/chunk0.d.ts +0 -17
  350. package/dist/seed/beys/chunk0.js +0 -36733
  351. package/dist/seed/beys/chunk1.d.ts +0 -17
  352. package/dist/seed/beys/chunk1.js +0 -35728
  353. package/dist/seed/beys/chunk2.d.ts +0 -17
  354. package/dist/seed/beys/chunk2.js +0 -35857
  355. package/dist/seed/beys/chunk3.d.ts +0 -17
  356. package/dist/seed/beys/chunk3.js +0 -34476
  357. package/dist/seed/beys-seed-data.d.ts +0 -18
  358. package/dist/seed/beys-seed-data.js +0 -11
  359. package/dist/seed/bids-seed-data.d.ts +0 -2
  360. package/dist/seed/bids-seed-data.js +0 -206
  361. package/dist/seed/blog-posts-seed-data.d.ts +0 -6
  362. package/dist/seed/blog-posts-seed-data.js +0 -442
  363. package/dist/seed/carousel-slides-seed-data.d.ts +0 -2
  364. package/dist/seed/carousel-slides-seed-data.js +0 -411
  365. package/dist/seed/carousels-seed-data.d.ts +0 -2
  366. package/dist/seed/carousels-seed-data.js +0 -36
  367. package/dist/seed/cart-seed-data.d.ts +0 -2
  368. package/dist/seed/cart-seed-data.js +0 -241
  369. package/dist/seed/catalogue-seed-data.d.ts +0 -2
  370. package/dist/seed/catalogue-seed-data.js +0 -112
  371. package/dist/seed/categories-seed-data.d.ts +0 -3
  372. package/dist/seed/categories-seed-data.js +0 -816
  373. package/dist/seed/claimed-coupons-seed-data.d.ts +0 -2
  374. package/dist/seed/claimed-coupons-seed-data.js +0 -85
  375. package/dist/seed/coupon-usage-seed-data.d.ts +0 -9
  376. package/dist/seed/coupon-usage-seed-data.js +0 -55
  377. package/dist/seed/coupons-seed-data.d.ts +0 -2
  378. package/dist/seed/coupons-seed-data.js +0 -226
  379. package/dist/seed/defaults/categories.d.ts +0 -2
  380. package/dist/seed/defaults/categories.js +0 -12
  381. package/dist/seed/defaults/faqs.d.ts +0 -2
  382. package/dist/seed/defaults/faqs.js +0 -40
  383. package/dist/seed/events-seed-data.d.ts +0 -7
  384. package/dist/seed/events-seed-data.js +0 -482
  385. package/dist/seed/factories/address.factory.d.ts +0 -21
  386. package/dist/seed/factories/address.factory.js +0 -44
  387. package/dist/seed/factories/bid.factory.d.ts +0 -15
  388. package/dist/seed/factories/bid.factory.js +0 -33
  389. package/dist/seed/factories/blog-post.factory.d.ts +0 -15
  390. package/dist/seed/factories/blog-post.factory.js +0 -22
  391. package/dist/seed/factories/carousel.factory.d.ts +0 -11
  392. package/dist/seed/factories/carousel.factory.js +0 -17
  393. package/dist/seed/factories/cart.factory.d.ts +0 -25
  394. package/dist/seed/factories/cart.factory.js +0 -35
  395. package/dist/seed/factories/category.factory.d.ts +0 -11
  396. package/dist/seed/factories/category.factory.js +0 -16
  397. package/dist/seed/factories/coupon.factory.d.ts +0 -21
  398. package/dist/seed/factories/coupon.factory.js +0 -43
  399. package/dist/seed/factories/faq.factory.d.ts +0 -10
  400. package/dist/seed/factories/faq.factory.js +0 -15
  401. package/dist/seed/factories/notification.factory.d.ts +0 -18
  402. package/dist/seed/factories/notification.factory.js +0 -39
  403. package/dist/seed/factories/order.factory.d.ts +0 -20
  404. package/dist/seed/factories/order.factory.js +0 -20
  405. package/dist/seed/factories/payout.factory.d.ts +0 -21
  406. package/dist/seed/factories/payout.factory.js +0 -38
  407. package/dist/seed/factories/product.factory.d.ts +0 -27
  408. package/dist/seed/factories/product.factory.js +0 -80
  409. package/dist/seed/factories/review.factory.d.ts +0 -14
  410. package/dist/seed/factories/review.factory.js +0 -52
  411. package/dist/seed/factories/session.factory.d.ts +0 -15
  412. package/dist/seed/factories/session.factory.js +0 -31
  413. package/dist/seed/factories/store.factory.d.ts +0 -23
  414. package/dist/seed/factories/store.factory.js +0 -47
  415. package/dist/seed/factories/user.factory.d.ts +0 -19
  416. package/dist/seed/factories/user.factory.js +0 -56
  417. package/dist/seed/faq-seed-data.d.ts +0 -18
  418. package/dist/seed/faq-seed-data.js +0 -1956
  419. package/dist/seed/firestore-indexes.d.ts +0 -12
  420. package/dist/seed/firestore-indexes.js +0 -31
  421. package/dist/seed/grouped-listings-seed-data.d.ts +0 -2
  422. package/dist/seed/grouped-listings-seed-data.js +0 -283
  423. package/dist/seed/history-seed-data.d.ts +0 -12
  424. package/dist/seed/history-seed-data.js +0 -70
  425. package/dist/seed/homepage-sections-seed-data.d.ts +0 -2
  426. package/dist/seed/homepage-sections-seed-data.js +0 -1034
  427. package/dist/seed/index.d.ts +0 -100
  428. package/dist/seed/index.js +0 -115
  429. package/dist/seed/lottery-entries-seed-data.d.ts +0 -2
  430. package/dist/seed/lottery-entries-seed-data.js +0 -108
  431. package/dist/seed/manifest.d.ts +0 -16
  432. package/dist/seed/manifest.js +0 -235
  433. package/dist/seed/media-assets-seed-data.d.ts +0 -22
  434. package/dist/seed/media-assets-seed-data.js +0 -5593
  435. package/dist/seed/model-composition-seed-data.d.ts +0 -15
  436. package/dist/seed/model-composition-seed-data.js +0 -9032
  437. package/dist/seed/notifications-seed-data.d.ts +0 -2
  438. package/dist/seed/notifications-seed-data.js +0 -606
  439. package/dist/seed/offers-seed-data.d.ts +0 -2
  440. package/dist/seed/offers-seed-data.js +0 -398
  441. package/dist/seed/orders-seed-data.d.ts +0 -2
  442. package/dist/seed/orders-seed-data.js +0 -845
  443. package/dist/seed/part-glossary/chunk0.d.ts +0 -9
  444. package/dist/seed/part-glossary/chunk0.js +0 -35448
  445. package/dist/seed/part-glossary/chunk1.d.ts +0 -9
  446. package/dist/seed/part-glossary/chunk1.js +0 -40494
  447. package/dist/seed/part-glossary/chunk2.d.ts +0 -9
  448. package/dist/seed/part-glossary/chunk2.js +0 -51242
  449. package/dist/seed/part-glossary/chunk3.d.ts +0 -9
  450. package/dist/seed/part-glossary/chunk3.js +0 -53337
  451. package/dist/seed/part-glossary/chunk4.d.ts +0 -9
  452. package/dist/seed/part-glossary/chunk4.js +0 -51454
  453. package/dist/seed/part-glossary-seed-data.d.ts +0 -15
  454. package/dist/seed/part-glossary-seed-data.js +0 -25
  455. package/dist/seed/payouts-seed-data.d.ts +0 -2
  456. package/dist/seed/payouts-seed-data.js +0 -302
  457. package/dist/seed/product-features-seed-data.d.ts +0 -3
  458. package/dist/seed/product-features-seed-data.js +0 -366
  459. package/dist/seed/products-art-seed-data.d.ts +0 -2
  460. package/dist/seed/products-art-seed-data.js +0 -289
  461. package/dist/seed/products-auctions-seed-data.d.ts +0 -2
  462. package/dist/seed/products-auctions-seed-data.js +0 -475
  463. package/dist/seed/products-beyblade-x-seed-data.d.ts +0 -2
  464. package/dist/seed/products-beyblade-x-seed-data.js +0 -476
  465. package/dist/seed/products-catalogue/chunk0.d.ts +0 -12
  466. package/dist/seed/products-catalogue/chunk0.js +0 -7262
  467. package/dist/seed/products-catalogue/chunk1.d.ts +0 -12
  468. package/dist/seed/products-catalogue/chunk1.js +0 -7290
  469. package/dist/seed/products-catalogue/chunk10.d.ts +0 -12
  470. package/dist/seed/products-catalogue/chunk10.js +0 -7290
  471. package/dist/seed/products-catalogue/chunk11.d.ts +0 -12
  472. package/dist/seed/products-catalogue/chunk11.js +0 -7005
  473. package/dist/seed/products-catalogue/chunk12.d.ts +0 -12
  474. package/dist/seed/products-catalogue/chunk12.js +0 -7002
  475. package/dist/seed/products-catalogue/chunk13.d.ts +0 -12
  476. package/dist/seed/products-catalogue/chunk13.js +0 -7002
  477. package/dist/seed/products-catalogue/chunk14.d.ts +0 -12
  478. package/dist/seed/products-catalogue/chunk14.js +0 -7002
  479. package/dist/seed/products-catalogue/chunk15.d.ts +0 -12
  480. package/dist/seed/products-catalogue/chunk15.js +0 -7002
  481. package/dist/seed/products-catalogue/chunk16.d.ts +0 -12
  482. package/dist/seed/products-catalogue/chunk16.js +0 -7002
  483. package/dist/seed/products-catalogue/chunk17.d.ts +0 -12
  484. package/dist/seed/products-catalogue/chunk17.js +0 -7002
  485. package/dist/seed/products-catalogue/chunk18.d.ts +0 -12
  486. package/dist/seed/products-catalogue/chunk18.js +0 -4398
  487. package/dist/seed/products-catalogue/chunk2.d.ts +0 -12
  488. package/dist/seed/products-catalogue/chunk2.js +0 -7268
  489. package/dist/seed/products-catalogue/chunk3.d.ts +0 -12
  490. package/dist/seed/products-catalogue/chunk3.js +0 -7264
  491. package/dist/seed/products-catalogue/chunk4.d.ts +0 -12
  492. package/dist/seed/products-catalogue/chunk4.js +0 -7268
  493. package/dist/seed/products-catalogue/chunk5.d.ts +0 -12
  494. package/dist/seed/products-catalogue/chunk5.js +0 -7258
  495. package/dist/seed/products-catalogue/chunk6.d.ts +0 -12
  496. package/dist/seed/products-catalogue/chunk6.js +0 -7268
  497. package/dist/seed/products-catalogue/chunk7.d.ts +0 -12
  498. package/dist/seed/products-catalogue/chunk7.js +0 -7311
  499. package/dist/seed/products-catalogue/chunk8.d.ts +0 -12
  500. package/dist/seed/products-catalogue/chunk8.js +0 -7304
  501. package/dist/seed/products-catalogue/chunk9.d.ts +0 -12
  502. package/dist/seed/products-catalogue/chunk9.js +0 -7309
  503. package/dist/seed/products-catalogue-seed-data.d.ts +0 -2
  504. package/dist/seed/products-catalogue-seed-data.js +0 -60
  505. package/dist/seed/products-classifieds-seed-data.d.ts +0 -7
  506. package/dist/seed/products-classifieds-seed-data.js +0 -435
  507. package/dist/seed/products-digital-codes-seed-data.d.ts +0 -7
  508. package/dist/seed/products-digital-codes-seed-data.js +0 -395
  509. package/dist/seed/products-live-items-seed-data.d.ts +0 -7
  510. package/dist/seed/products-live-items-seed-data.js +0 -269
  511. package/dist/seed/products-preorders-seed-data.d.ts +0 -2
  512. package/dist/seed/products-preorders-seed-data.js +0 -360
  513. package/dist/seed/products-prize-draws-seed-data.d.ts +0 -7
  514. package/dist/seed/products-prize-draws-seed-data.js +0 -427
  515. package/dist/seed/products-spares-seed-data.d.ts +0 -2
  516. package/dist/seed/products-spares-seed-data.js +0 -368
  517. package/dist/seed/products-standard-seed-data.d.ts +0 -2
  518. package/dist/seed/products-standard-seed-data.js +0 -632
  519. package/dist/seed/products-stickers-seed-data.d.ts +0 -2
  520. package/dist/seed/products-stickers-seed-data.js +0 -319
  521. package/dist/seed/reviews-seed-data.d.ts +0 -1
  522. package/dist/seed/reviews-seed-data.js +0 -185
  523. package/dist/seed/runner.d.ts +0 -2
  524. package/dist/seed/runner.js +0 -125
  525. package/dist/seed/scammers-seed-data.d.ts +0 -2
  526. package/dist/seed/scammers-seed-data.js +0 -235
  527. package/dist/seed/seed-market-config.d.ts +0 -48
  528. package/dist/seed/seed-market-config.js +0 -199
  529. package/dist/seed/seed-purpose.d.ts +0 -299
  530. package/dist/seed/seed-purpose.js +0 -440
  531. package/dist/seed/sessions-seed-data.d.ts +0 -3
  532. package/dist/seed/sessions-seed-data.js +0 -116
  533. package/dist/seed/shipments-seed-data.d.ts +0 -5
  534. package/dist/seed/shipments-seed-data.js +0 -185
  535. package/dist/seed/site-settings-seed-data.d.ts +0 -2
  536. package/dist/seed/site-settings-seed-data.js +0 -1069
  537. package/dist/seed/store-addresses-seed-data.d.ts +0 -18
  538. package/dist/seed/store-addresses-seed-data.js +0 -71
  539. package/dist/seed/store-extensions-seed-data.d.ts +0 -11
  540. package/dist/seed/store-extensions-seed-data.js +0 -292
  541. package/dist/seed/stores-seed-data.d.ts +0 -6
  542. package/dist/seed/stores-seed-data.js +0 -242
  543. package/dist/seed/support-tickets-seed-data.d.ts +0 -16
  544. package/dist/seed/support-tickets-seed-data.js +0 -239
  545. package/dist/seed/tax-codes-seed-data.d.ts +0 -34
  546. package/dist/seed/tax-codes-seed-data.js +0 -100
  547. package/dist/seed/test-data-ttl.d.ts +0 -29
  548. package/dist/seed/test-data-ttl.js +0 -31
  549. package/dist/seed/test-utils.d.ts +0 -49
  550. package/dist/seed/test-utils.js +0 -110
  551. package/dist/seed/types.d.ts +0 -89
  552. package/dist/seed/types.js +0 -15
  553. package/dist/seed/users-seed-data.d.ts +0 -2
  554. package/dist/seed/users-seed-data.js +0 -597
  555. package/dist/seed/wishlists-seed-data.d.ts +0 -12
  556. package/dist/seed/wishlists-seed-data.js +0 -54
@@ -1,731 +0,0 @@
1
- /*
2
- * WHY: ~382 category nodes need description templates and product defaults,
3
- * and inlining them per node is 382 places a fix has to land. The crawl
4
- * is the evidence that this is the right shape: worldhobbyshop reuses
5
- * exactly TWO bodies across 1,195 listings, so the bodies are a small
6
- * closed set and the per-category part is which set applies.
7
- * WHAT: The five reusable description bodies, the measured day-1 market bands,
8
- * and per-vertical `productDefaults` factories. Authored ONCE.
9
- *
10
- * EXPORTS:
11
- * TEMPLATES — the five bodies, by variant
12
- * templateSet — pick a subset by variant for a category
13
- * marketBand — a measured {p25, median, p75, sampleSize, asOf} band
14
- * beyDefaults / partDefaults / launcherDefaults / stadiumDefaults
15
- * tcgDefaults / figureDefaults / diecastDefaults / accessoryDefaults
16
- *
17
- * 🛑 Every number in MARKET_BANDS is MEASURED, from
18
- * docs/research/competitor-crawl-2026-10/price-bands.md, with its real
19
- * sample size. A band with no evidence is omitted rather than guessed —
20
- * a fabricated "typical price" is worse than no hint, because a seller
21
- * prices against it.
22
- *
23
- * 🛑 `sold` is never seeded. It is OUR completed sales and we have none for
24
- * most leaves; `priceIndexRollup` (C1) is its only writer, and it must
25
- * never touch `market`.
26
- *
27
- * @tag domain:categories
28
- * @tag layer:seed
29
- * @tag pattern:shared-literal
30
- * @tag access:server-only
31
- * @tag consumers:seed/_helpers/category-forest.ts
32
- * @tag sideEffects:none
33
- */
34
- /**
35
- * When the competitor crawl was taken. Fixed, never `new Date()` — a seed file
36
- * is re-executed on every `appkit-seed` invocation, so a moving timestamp makes
37
- * `load` non-idempotent (Root Cause #25).
38
- */
39
- export const CRAWL_AS_OF = new Date("2026-10-09T00:00:00.000Z");
40
- // ─────────────────────────────────────────────────────────────────────────────
41
- // The five description bodies
42
- //
43
- // Shapes taken from the crawl; every word is ours. The counter-example is
44
- // raikagesbeybladestore, whose 114-char bodies are lifted verbatim from the
45
- // Beyblade Wiki and one of which ships with the literal UI string "Add to
46
- // Wishlist Add to Wishlist" welded into the product body.
47
- //
48
- // 🛑 No `{{price}}` slot, deliberately. A price in free text is an ungated
49
- // public price that `<GatedPrice>` cannot wrap, and `audit-guest-price-leak`
50
- // R2 blocks it.
51
- // ─────────────────────────────────────────────────────────────────────────────
52
- const PRE_OWNED_BODY = `<h2>{{title}}</h2>
53
- <p>A pre-owned {{category}} listing from the {{series}} line, sold as pictured.</p>
54
- <h3>Important things to know</h3>
55
- <ul>
56
- <li><strong>Condition:</strong> {{condition}}. The photographs are of the actual item, not a stock image.</li>
57
- <li><strong>What is included:</strong> only what is shown. Launchers, ripcords and stadiums are sold separately unless pictured.</li>
58
- <li><strong>Wear:</strong> a used {{category}} will show handling marks. Anything structural — a chip, a crack, a stripped tooth — is called out above and photographed.</li>
59
- <li><strong>Authenticity:</strong> stated on this listing. Reproduction parts are labelled as such and never described as original.</li>
60
- </ul>
61
- <p>Sold by a verified seller on {{siteName}}, with buyer protection on every order.</p>`;
62
- const NEW_IN_BOX_BODY = `<h2>{{title}}</h2>
63
- <p>Sealed, unopened {{category}} from the {{series}} line.</p>
64
- <h3>Specification</h3>
65
- <ul>
66
- <li><strong>Manufacturer:</strong> {{brand}}</li>
67
- <li><strong>Condition:</strong> {{condition}}</li>
68
- <li><strong>Series:</strong> {{series}}</li>
69
- <li><strong>System:</strong> {{system}}</li>
70
- <li><strong>Category:</strong> {{categoryPath}}</li>
71
- </ul>
72
- <h3>What is in the box?</h3>
73
- <p>Factory contents, unopened. Where a release includes a launcher or ripcord it is listed in the specification above; where it does not, it is a top-only release.</p>
74
- <p>Listed by a verified seller on {{siteName}}.</p>`;
75
- const NEW_IN_PACKET_BODY = `<h2>{{title}}</h2>
76
- <p>New {{category}} on its original card or in its original polybag — never used, packaging unopened.</p>
77
- <ul>
78
- <li><strong>Manufacturer:</strong> {{brand}}</li>
79
- <li><strong>Condition:</strong> {{condition}}</li>
80
- <li><strong>Series:</strong> {{series}}</li>
81
- </ul>
82
- <p>Card and bag wear is normal on stock of this age and is photographed where present. The item itself is untouched.</p>`;
83
- const REPLICA_BODY = `<h2>{{title}}</h2>
84
- <p><strong>This is a reproduction, not an original {{brand}} release.</strong> It is listed as one deliberately, because knowing which you are buying is the point.</p>
85
- <h3>What that means</h3>
86
- <ul>
87
- <li>A reproduction is an unlicensed copy of an original design. It carries no manufacturer's marque.</li>
88
- <li>Build quality on reproductions varies. Weight and balance may differ from the original, which matters in competitive play.</li>
89
- <li>Some tournament formats permit certain reproduction parts and some do not — check your local format before buying to compete.</li>
90
- <li>This is <em>not</em> a counterfeit sold as genuine. If you believe a listing misrepresents a reproduction as original, report it.</li>
91
- </ul>
92
- <p><strong>Condition:</strong> {{condition}}. Sold as pictured.</p>`;
93
- const DEFAULT_BODY = `<h2>{{title}}</h2>
94
- <p>{{category}} from the {{series}} line, listed by a verified seller on {{siteName}}.</p>
95
- <ul>
96
- <li><strong>Manufacturer:</strong> {{brand}}</li>
97
- <li><strong>Condition:</strong> {{condition}}</li>
98
- <li><strong>Category:</strong> {{categoryPath}}</li>
99
- </ul>
100
- <p>Condition and authenticity are stated on every listing. Photographs are of the actual item.</p>`;
101
- /**
102
- * The five bodies, by variant.
103
- *
104
- * `placeholders` is deliberately LEFT ABSENT on all five: the field's contract
105
- * is that absent means "re-parse", and `extractPlaceholders(body)` is the one
106
- * implementation. Writing the list here by hand would be a second copy that
107
- * drifts the first time a body is edited — and the failure mode is a published
108
- * description containing a literal `{{series}}`.
109
- */
110
- export const TEMPLATES = {
111
- default: {
112
- id: "tpl-default",
113
- label: "Standard — manufacturer, condition, category",
114
- variant: "default",
115
- body: DEFAULT_BODY,
116
- version: 1,
117
- },
118
- new_in_box: {
119
- id: "tpl-new-in-box",
120
- label: "New in box — sealed, with a specification table",
121
- variant: "new_in_box",
122
- body: NEW_IN_BOX_BODY,
123
- version: 1,
124
- },
125
- new_in_packet: {
126
- id: "tpl-new-in-packet",
127
- label: "New in packet — carded or bagged, unopened",
128
- variant: "new_in_packet",
129
- body: NEW_IN_PACKET_BODY,
130
- version: 1,
131
- },
132
- pre_owned: {
133
- id: "tpl-pre-owned",
134
- label: "Pre-owned — condition exactly as pictured",
135
- variant: "pre_owned",
136
- body: PRE_OWNED_BODY,
137
- version: 1,
138
- },
139
- replica: {
140
- id: "tpl-replica",
141
- label: "Reproduction — disclosed, with a what-this-means panel",
142
- variant: "replica",
143
- body: REPLICA_BODY,
144
- version: 1,
145
- },
146
- };
147
- /**
148
- * ── D12: the BEYBLADE bodies, which are the only ones that state PARTS ─────
149
- *
150
- * 🛑 A separate set rather than adding the slot to the shared bodies, and the
151
- * reason is mechanical: `COLLECTIBLE_TEMPLATES` is also what every figure,
152
- * Hot Wheels and TCG category uses, and a `{{partBreakdown}}` on a Marvel
153
- * Legends listing resolves to nothing. The endpoint strips the line when
154
- * there is no composition, so the artifact would be invisible rather than
155
- * wrong — but it would also be a read attempted on four roots that can never
156
- * satisfy it, on an endpoint the seller form hits on every category change.
157
- *
158
- * Assigned to the 21 `line(...)` nodes, which are Beyblade generation lines
159
- * and nothing else — their children are `MODEL_LEAVES`. A model leaf carries
160
- * no body of its own and INHERITS this one, while the slot resolves against
161
- * the leaf's OWN composition. That is the whole design: one body per
162
- * generation, 216 models' worth of parts.
163
- */
164
- const BEY_PARTS_LINE = ` <li><strong>Parts:</strong> {{partBreakdown}}</li>`;
165
- /** The slot sits on its own source line, because the strip is line-based. */
166
- function withPartsLine(body) {
167
- return body.replace("</ul>", `${BEY_PARTS_LINE}
168
- </ul>`);
169
- }
170
- const BEY_TEMPLATE_VARIANTS = [
171
- "new_in_box",
172
- "pre_owned",
173
- "replica",
174
- "default",
175
- ];
176
- export const BEY_TEMPLATES = BEY_TEMPLATE_VARIANTS.map((v) => ({ ...TEMPLATES[v], body: withPartsLine(TEMPLATES[v].body) }));
177
- /** The set a normal collectible category offers. */
178
- export const COLLECTIBLE_TEMPLATES = [
179
- TEMPLATES.new_in_box,
180
- TEMPLATES.pre_owned,
181
- TEMPLATES.replica,
182
- TEMPLATES.default,
183
- ];
184
- /** Parts and small accessories arrive carded or loose, not boxed. */
185
- export const PART_TEMPLATES = [
186
- TEMPLATES.new_in_packet,
187
- TEMPLATES.pre_owned,
188
- TEMPLATES.replica,
189
- TEMPLATES.default,
190
- ];
191
- /** Sealed-only verticals (TCG sealed product, model kits) — no repro tier. */
192
- export const SEALED_TEMPLATES = [
193
- TEMPLATES.new_in_box,
194
- TEMPLATES.pre_owned,
195
- TEMPLATES.default,
196
- ];
197
- export function templateSet(...variants) {
198
- return variants.map((v) => TEMPLATES[v]);
199
- }
200
- /*
201
- * Day-1 bands, keyed by the leaf they belong to.
202
- *
203
- * 🛑 EVERY ROW HERE TRACES TO A LINE IN
204
- * docs/research/competitor-crawl-2026-10/price-bands.md. Nothing is
205
- * interpolated, averaged across sources, or extrapolated from a
206
- * neighbouring leaf. A leaf the crawl has no evidence for is ABSENT from
207
- * this map and renders no hint at all — ten of them are, and they are
208
- * listed at the bottom so their absence is a recorded decision rather than
209
- * an oversight.
210
- *
211
- * 🛑 An earlier draft of this map invented a sample size for all 21 Beyblade
212
- * top lines, because the type required one. The crawl's own rule is the
213
- * reason that matters: *"quote `n`, because a band with n=2 is not
214
- * evidence"* — so a fabricated n is not a cosmetic liberty, it is the
215
- * confidence signal replaced with a guess. `sampleSize` is optional now,
216
- * and these 21 rows legitimately have none.
217
- *
218
- * SOURCE PRIORITY: worldhobbyshop first wherever it has data, which is every
219
- * Beyblade band except HMS. HMS is beybladeshopindia at n=39 against WHS's
220
- * n=2, and `src` records that so the decision is reviewable rather than
221
- * buried. Parts pricing is raikages-only (the sole component-level source in
222
- * the crawl), and TCG / figures / Hot Wheels come from the sites that sell
223
- * them, since WHS carries none of those verticals.
224
- */
225
- const MARKET_BANDS = {
226
- // ── Beyblade tops, by line. WHS + beybladeshopindia; no per-leaf n ────────
227
- "category-original-plastic-gen": { p25: 799, median: 899, p75: 1499, src: "worldhobbyshop (plastic-3-layer)" },
228
- "category-original-spin-gear": { p25: 799, median: 1399, p75: 1799, src: "worldhobbyshop (spin-gear-sf)" },
229
- "category-original-magnacore": { p25: 999, median: 1699, p75: 1999, src: "worldhobbyshop (magna-core-v-force)" },
230
- // 🛑 The one row where a larger sample beat worldhobbyshop, and it is
231
- // recorded because the gap is enormous: beybladeshopindia n=39 against WHS
232
- // n=2. HMS is also the highest-value Beyblade tier on the site, so getting
233
- // it from a coin-flip sample would mis-anchor every HMS listing.
234
- "category-original-hms": { p25: 2999, median: 3999, p75: 9999, n: 39, src: "beybladeshopindia n=39 (worldhobbyshop had n=2)" },
235
- "category-metal-phws": { p25: 799, median: 899, p75: 999, src: "worldhobbyshop (phws-metal-system)" },
236
- "category-metal-fusion": { p25: 799, median: 999, p75: 1499, src: "worldhobbyshop (metal-fusion)" },
237
- "category-metal-masters": { p25: 1099, median: 1499, p75: 1999, src: "worldhobbyshop (metal-masters)" },
238
- "category-metal-fury-4d": { p25: 1799, median: 2399, p75: 2999, src: "worldhobbyshop (metal-fury-4d)" },
239
- "category-metal-shogun-steel": { p25: 1599, median: 2499, p75: 2999, src: "worldhobbyshop (shogun-steel-zero-g)" },
240
- // The crawl lists single-layer (299/299/399) and dual-layer (299/399/399)
241
- // separately and the taxonomy collapses them to one leaf, so the band
242
- // collapses with them — to the documented 299/399/399, not to a midpoint
243
- // somebody computed.
244
- "category-burst-classic": { p25: 299, median: 399, p75: 399, src: "worldhobbyshop (single-layer + dual-layer, collapsed)" },
245
- "category-burst-god": { p25: 599, median: 599, p75: 999, src: "worldhobbyshop (burst-god-evolution)" },
246
- "category-burst-cho-z": { p25: 599, median: 799, p75: 999, src: "worldhobbyshop (burst-cho-z-turbo)" },
247
- "category-burst-gt": { p25: 799, median: 999, p75: 1099, src: "worldhobbyshop (burst-gt-rise)" },
248
- "category-burst-superking": { p25: 999, median: 999, p75: 1499, src: "worldhobbyshop (burst-superking-surge)" },
249
- "category-burst-db": { p25: 999, median: 1399, p75: 1799, src: "worldhobbyshop (burst-db-quaddrive)" },
250
- "category-burst-bu": { p25: 1499, median: 1599, p75: 1799, src: "worldhobbyshop (burst-bu-quadstrike)" },
251
- "category-x-basic": { p25: 799, median: 999, p75: 1499, src: "worldhobbyshop (x-basic-s1)" },
252
- "category-x-unique-ux": { p25: 1199, median: 1399, p75: 1699, src: "worldhobbyshop (x-unique-ux)" },
253
- "category-x-custom-cx": { p25: 1299, median: 1499, p75: 1799, src: "worldhobbyshop (x-custom-cx)" },
254
- "category-x-over": { p25: 999, median: 1099, p75: 1499, src: "worldhobbyshop (x-over-remakes)" },
255
- // ── Parts. raikages is the ONLY component-level source in the crawl ───────
256
- "category-metal-energy-rings": { p25: 149, median: 199, p75: 249, n: 68, src: "raikages n=68" },
257
- "category-metal-fusion-wheels": { p25: 149, median: 249, p75: 299, n: 52, src: "raikages n=52" },
258
- "category-metal-spin-tracks": { p25: 149, median: 199, p75: 249, n: 53, src: "raikages n=53" },
259
- "category-metal-performance-tips": { p25: 129, median: 139, p75: 149, n: 25, src: "raikages n=25" },
260
- // WHS prices Burst parts as ONE pool (n=82) and X parts as one pool (n=14);
261
- // it does not split layers from discs from drivers. The three leaves share
262
- // the pooled band, and `src` says so rather than implying three measurements.
263
- "category-burst-layers": { p25: 99, median: 149, p75: 249, n: 82, src: "worldhobbyshop n=82, POOLED across all Burst parts" },
264
- "category-burst-discs": { p25: 99, median: 149, p75: 249, n: 82, src: "worldhobbyshop n=82, POOLED across all Burst parts" },
265
- "category-burst-drivers": { p25: 99, median: 149, p75: 249, n: 82, src: "worldhobbyshop n=82, POOLED across all Burst parts" },
266
- "category-x-blades": { p25: 199, median: 299, p75: 299, n: 14, src: "worldhobbyshop n=14, POOLED across all X parts" },
267
- "category-x-ratchets": { p25: 199, median: 299, p75: 299, n: 14, src: "worldhobbyshop n=14, POOLED across all X parts" },
268
- "category-x-bits": { p25: 199, median: 299, p75: 299, n: 14, src: "worldhobbyshop n=14, POOLED across all X parts" },
269
- // ── Launchers. One pooled band per generation, again as WHS measured it ───
270
- "category-original-ripcord-launchers": { p25: 199, median: 299, p75: 899, n: 32, src: "worldhobbyshop n=32, POOLED across original-era launchers" },
271
- "category-original-winders": { p25: 199, median: 299, p75: 899, n: 32, src: "worldhobbyshop n=32, POOLED across original-era launchers" },
272
- "category-metal-string-launchers": { p25: 399, median: 599, p75: 849, n: 37, src: "worldhobbyshop n=37, POOLED across Metal Fight launchers" },
273
- "category-metal-ripcord-launchers": { p25: 399, median: 599, p75: 849, n: 37, src: "worldhobbyshop n=37, POOLED across Metal Fight launchers" },
274
- "category-metal-lr-launchers": { p25: 399, median: 599, p75: 849, n: 37, src: "worldhobbyshop n=37, POOLED across Metal Fight launchers" },
275
- "category-burst-string-launchers": { p25: 399, median: 599, p75: 699, n: 78, src: "worldhobbyshop n=78, POOLED across Burst launchers" },
276
- "category-burst-lr-launchers": { p25: 399, median: 599, p75: 699, n: 78, src: "worldhobbyshop n=78, POOLED across Burst launchers" },
277
- "category-burst-grips": { p25: 399, median: 599, p75: 699, n: 78, src: "worldhobbyshop n=78, POOLED across Burst launchers" },
278
- "category-x-string-launchers": { p25: 299, median: 599, p75: 700, n: 34, src: "worldhobbyshop n=34, POOLED across X launchers" },
279
- "category-x-winders": { p25: 299, median: 599, p75: 700, n: 34, src: "worldhobbyshop n=34, POOLED across X launchers" },
280
- "category-x-grips": { p25: 299, median: 599, p75: 700, n: 34, src: "worldhobbyshop n=34, POOLED across X launchers" },
281
- // ── Stadiums. ONE band, EIGHT leaves ──────────────────────────────────────
282
- // WHS does not split stadiums by generation — its single "Stadiums & Arenas"
283
- // category states the split in PROSE, because WooCommerce's flat taxonomy
284
- // could not hold it. So there is no per-generation evidence, and inventing
285
- // four bands from one sample of seven would be fabrication. The leaves stay
286
- // split (a BX-10 Xtreme Stadium is a Beyblade X product); the band does not.
287
- "category-original-bakuten-arena": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
288
- "category-original-attack-stadium": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
289
- "category-metal-standard-stadiums": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
290
- "category-metal-zero-g-stadiums": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
291
- "category-burst-standard-stadiums": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
292
- "category-burst-stadium-variants": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
293
- "category-x-xtreme-stadiums": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
294
- "category-x-standard-stadiums": { p25: 2000, median: 2999, p75: 3499, n: 7, src: "worldhobbyshop n=7, ALL generations pooled" },
295
- // ── TCG. tcgrepublic + hobbykart. WHS sells no cards ─────────────────────
296
- "category-pokemon-singles": { p25: 350, median: 400, p75: 500, n: 545, src: "tcgrepublic n=545 (singles, all games)" },
297
- "category-one-piece-singles": { p25: 350, median: 400, p75: 500, n: 545, src: "tcgrepublic n=545 (singles, all games)" },
298
- "category-pokemon-graded": { p25: 4600, median: 8000, p75: 11000, n: 15, src: "hobbykart n=15 (graded slabs)" },
299
- "category-one-piece-graded": { p25: 4600, median: 8000, p75: 11000, n: 15, src: "hobbykart n=15 (graded slabs)" },
300
- "category-tcg-weiss-schwarz": { p25: 3500, median: 6500, p75: 7500, n: 14, src: "tcgrepublic n=14" },
301
- "category-card-sleeves-toploaders": { p25: 250, median: 800, p75: 1800, n: 31, src: "tcgrepublic n=31 (supplies, pooled)" },
302
- "category-card-binders-boxes": { p25: 250, median: 800, p75: 1800, n: 31, src: "tcgrepublic n=31 (supplies, pooled)" },
303
- "category-card-slab-display": { p25: 250, median: 800, p75: 1800, n: 31, src: "tcgrepublic n=31 (supplies, pooled)" },
304
- // ── Figures. hobson + redeyemerch ────────────────────────────────────────
305
- "category-anime-scale-1-12": { p25: 3499, median: 5900, p75: 7999, n: 34, src: "hobson n=34 (1/12 scale)" },
306
- // The only band the crawl has for mid-scale statues is its general "Anime
307
- // Figures" tag, not a 1/7-or-1/8 measurement. Used, and labelled as general.
308
- "category-anime-scale-1-7-1-8": { p25: 1199, median: 1699, p75: 2499, n: 94, src: "redeyemerch n=94, GENERAL anime-figure band (not scale-specific)" },
309
- "category-anime-prize-figures": { p25: 1999, median: 2699, p75: 2999, n: 23, src: "hobson n=23 (prize figures)" },
310
- "category-comic-marvel-legends": { p25: 2999, median: 3999, p75: 5499, n: 41, src: "hobson n=41" },
311
- "category-comic-vintage-toybiz": { p25: 3499, median: 3999, p75: 4499, n: 22, src: "hobson n=22" },
312
- // ── Hot Wheels. toycollectorsindia ───────────────────────────────────────
313
- // 🛑 NO QUARTILES EXIST for either row. The crawl recorded a median and a
314
- // RANGE (₹99–36,500 for the pooled 1:64 band; ₹130–999 for their own plain
315
- // mainline collection), and a range is not a quartile. So these two carry a
316
- // median only, which is why `p25`/`p75` are optional at all.
317
- "category-hw-mainline-series": { median: 399, n: 27, src: "toycollectorsindia n=27 (their own plain mainline collection); range 130-999, no quartiles measured" },
318
- "category-hw-treasure-hunt": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
319
- "category-hw-car-culture": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
320
- "category-hw-boulevard": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
321
- "category-hw-team-transport": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
322
- "category-hw-fast-and-furious": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
323
- "category-hw-pop-culture": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
324
- "category-hw-rlc": { median: 850, n: 7418, src: "toycollectorsindia n=7418, 1:64 POOLED across mainline and premium; range 99-36500, no quartiles" },
325
- /*
326
- * 🛑 DELIBERATELY ABSENT — the crawl measured no band for these, and a
327
- * plausible-looking number would be worse than no hint, because a seller
328
- * prices against whatever we show them:
329
- *
330
- * category-original-engine-gear WHS bands plastic / spin-gear / magnacore
331
- * / HMS and NOT Engine Gear. An earlier
332
- * draft of this map invented 899/1499/1899
333
- * for it, interpolated from its neighbours.
334
- * category-metal-face-bolts raikages prices rings, wheels, tracks and
335
- * category-burst-chips-armour tips — not face bolts, chips or armour.
336
- * category-anime-scale-1-6 No 1/6 measurement. S.H.Figuarts (n=25)
337
- * is a 1/12 line and is not a substitute.
338
- * category-anime-nendoroid-chibi No band. Good Smile's n=17 in the crawl
339
- * is a TAG COUNT, not a price sample.
340
- * category-comic-dc No DC band at all.
341
- * category-game-* Three leaves, no franchise-level bands.
342
- * the TCG expansion-set leaves Booster pack / box / ETB are a FORMAT
343
- * axis (the `tcg-format` feature group),
344
- * and a set leaf holds all of them mixed.
345
- * No single band describes it honestly.
346
- * the Gunpla grade leaves No model-kit pricing in any of the
347
- * fifteen crawls.
348
- * category-hw-multipacks children No multipack band.
349
- * the accessory leaves No band for cases, tools or counters.
350
- * the living-collectibles leaves Not a market we crawled, and would not
351
- * want a competitor-derived band for.
352
- */
353
- };
354
- export function marketBand(leafId) {
355
- const b = MARKET_BANDS[leafId];
356
- if (!b)
357
- return undefined;
358
- return {
359
- currency: "INR",
360
- market: {
361
- median: b.median,
362
- ...(b.p25 == null ? {} : { p25: b.p25 }),
363
- ...(b.p75 == null ? {} : { p75: b.p75 }),
364
- ...(b.n == null ? {} : { sampleSize: b.n }),
365
- asOf: CRAWL_AS_OF,
366
- /*
367
- * Measured across the five largest competitors: 92.8 / 88.5 / 87.0 /
368
- * 81.1 / 76.0% of their listings are sold out. Carried so the seller
369
- * hint can say "this is a typical ASK, and most asks at this level do
370
- * not convert" rather than presenting it as a clearing price.
371
- */
372
- soldOutShare: 0.85,
373
- source: b.src,
374
- },
375
- };
376
- }
377
- /** Every leaf id this map claims a band for — the seed asserts they all exist. */
378
- export const MARKET_BAND_LEAF_IDS = Object.keys(MARKET_BANDS);
379
- // ─────────────────────────────────────────────────────────────────────────────
380
- // Per-vertical productDefaults
381
- //
382
- // 🛑 taxCodeId, not gstRate/hsnCode. The reference is for AUTHORING; the
383
- // scalars are resolved onto the PRODUCT by `deriveTaxonomy` and snapshotted
384
- // again onto the order item. Without that layering, editing a tax code
385
- // would retroactively re-rate an invoice already issued.
386
- // ─────────────────────────────────────────────────────────────────────────────
387
- const TAX_TOY = "tax-hsn-95030020"; // non-electronic toys incl. spinning tops — 5%
388
- const TAX_TOY_OTHER = "tax-hsn-95030099"; // other toys — 5%
389
- const TAX_EXEMPT = "tax-exempt-0";
390
- /**
391
- * B6 — the ROOT-LEVEL tax fallback, one per root.
392
- *
393
- * 🛑 Measured 2026-10-12: the tax code sat on tiers 1–3 only (t1=4, t2=47,
394
- * t3=71) and on NO root, so **3 of 70 live products resolved no tax code at
395
- * all** and would have fallen to `DEFAULT_GST_RATE` — a listing filed at
396
- * `category-spinning-tops`, `category-burst-tops` or `category-x-tops`.
397
- *
398
- * C0c's own rule is that reaching that constant is a TRIAGE SIGNAL, not a
399
- * feature: "a listing reaching step 3 at all means its category has no tax
400
- * code — and that, not the constant, is the defect to fix. The measure of
401
- * success is that step 3 fires for nothing."
402
- *
403
- * Putting it at the root is what makes that true for every branch, including
404
- * branches nobody has filed under yet — `resolveCategoryDefaults` walks the
405
- * chain nearest-first, so a tier-2 or tier-3 entry still WINS as a
406
- * more-specific override. This is a floor, not a replacement.
407
- *
408
- * 🛑 Deliberately NOT a single shared constant. Each root is a different HSN
409
- * question and a wrong HSN on a real invoice is worse than an absent one —
410
- * printed cards are chapter 4911, not 9503, and a live plant is exempt. Only
411
- * 9503 was verified (section 3.2); the three non-9503 roots therefore take the
412
- * closest VERIFIED code rather than an unverified guess, and say so.
413
- */
414
- export const ROOT_AUTHENTICITY_DEFAULT = "unverified";
415
- export const ROOT_TAX_DEFAULTS = {
416
- // Verified: HSN 9503 0020 — non-electronic toys including spinning tops, 5%.
417
- "category-spinning-tops": { taxCodeId: TAX_TOY },
418
- // Verified: HSN 9503 0099 — "other toys", 5%. A built model kit and a
419
- // die-cast car are both toys under 9503; neither is a spinning top.
420
- "category-hot-wheels": { taxCodeId: TAX_TOY_OTHER },
421
- "category-model-kits": { taxCodeId: TAX_TOY_OTHER },
422
- "category-collectible-figures": { taxCodeId: TAX_TOY_OTHER },
423
- /*
424
- * 🛑 Trading cards are chapter 4911 (printed matter) or 9504 (playing cards)
425
- * and NEITHER was verified — section 3.2 confirmed 9503 only, and § "Still
426
- * open" records "verify each before seeding; 9503 is the only one I
427
- * confirmed". `9503 0099` is used as the floor because a TCG single sold as
428
- * a collectible is a toy-chapter good at the same 5% rate, so the RATE is
429
- * right even where the chapter may not be. It must be re-chaptered before
430
- * the first real TCG invoice, and that is a data task with a source, not a
431
- * guess to make here.
432
- */
433
- "category-trading-cards": { taxCodeId: TAX_TOY_OTHER },
434
- // A live plant or animal is nil-rated — a deliberate exemption, which is
435
- // exactly why `gstRate: 0` must survive derivation rather than be "corrected".
436
- "category-living-collectibles": { taxCodeId: TAX_EXEMPT },
437
- };
438
- /** Shared across every Beyblade-family node. */
439
- const BEY_FAQ_TEMPLATES = [
440
- {
441
- question: "Is {{title}} an original {{brand}} release?",
442
- answer: "The authenticity of every listing is stated on the listing itself — original, reproduction, or unverified. A reproduction is an unlicensed copy with no manufacturer's marque and is always labelled as one; it is not the same thing as a counterfeit sold as genuine.",
443
- },
444
- {
445
- question: "What condition is {{title}} in?",
446
- answer: "This listing is graded {{condition}}, and the photographs are of the actual item rather than a stock image. Structural damage — a chip, a crack, a stripped tooth — is called out in the description and photographed.",
447
- },
448
- {
449
- question: "Does {{title}} include a launcher?",
450
- answer: "Only if the description says so. Starter releases include a launcher and ripcord; booster releases are top-only. Where a used listing is involved, what is pictured is what ships.",
451
- },
452
- {
453
- question: "Can I return {{title}} if it is not as described?",
454
- answer: "Yes. A listing that misrepresents condition or authenticity is covered by buyer protection, and the return window opens from delivery. Report the listing as well as opening the return — a misdescribed reproduction is a listing problem, not just an order problem.",
455
- },
456
- ];
457
- const SPEC = (name, value, unit) => unit ? { name, value, unit } : { name, value };
458
- /** A complete top. */
459
- export function beyDefaults(leafId, series, system) {
460
- return {
461
- taxCodeId: TAX_TOY,
462
- specifications: [SPEC("Series", series), SPEC("System", system)],
463
- inTheBox: ["Beyblade top", "Manual (where supplied)"],
464
- defaultAuthenticity: "unverified",
465
- priceGuidance: marketBand(leafId),
466
- seoTitleTemplate: "{{title}} — {{series}} | {{siteName}}",
467
- seoDescriptionTemplate: "Buy {{title}}, a {{series}} {{category}}, from a verified seller on {{siteName}}. Condition {{condition}}, authenticity stated, buyer protection on every order.",
468
- seoKeywords: ["beyblade", series.toLowerCase()],
469
- weightG: 120,
470
- dimensionsCm: { l: 12, w: 10, h: 6 },
471
- fragile: false,
472
- faqTemplates: BEY_FAQ_TEMPLATES,
473
- };
474
- }
475
- /** A loose component. */
476
- export function partDefaults(leafId, partKind) {
477
- return {
478
- taxCodeId: TAX_TOY,
479
- specifications: [SPEC("Part type", partKind)],
480
- inTheBox: [`${partKind} only — no complete top`],
481
- defaultAuthenticity: "unverified",
482
- priceGuidance: marketBand(leafId),
483
- seoTitleTemplate: "{{title}} — {{category}} | {{siteName}}",
484
- seoDescriptionTemplate: "Buy {{title}}, a loose {{category}} for custom builds, on {{siteName}}. Condition {{condition}}, sold as pictured.",
485
- seoKeywords: ["beyblade parts", partKind.toLowerCase()],
486
- weightG: 25,
487
- dimensionsCm: { l: 8, w: 6, h: 3 },
488
- fragile: false,
489
- /*
490
- * A part listing answers a different question from a complete top: the
491
- * buyer already owns a bey and wants to know whether this fits it. So the
492
- * first FAQ is compatibility, not authenticity — which is also the single
493
- * most common pre-purchase question on used-part listings.
494
- */
495
- faqTemplates: [
496
- {
497
- question: "Will {{title}} fit my Beyblade?",
498
- answer: "Parts are compatible within a generation, not across them. A {{series}} component fits other {{series}} tops; it will not fit a different generation's system, because each generation uses its own locking geometry.",
499
- },
500
- BEY_FAQ_TEMPLATES[1],
501
- BEY_FAQ_TEMPLATES[3],
502
- ],
503
- };
504
- }
505
- export function launcherDefaults(leafId, series) {
506
- return {
507
- taxCodeId: TAX_TOY,
508
- specifications: [SPEC("Series", series), SPEC("Accessory type", "Launcher")],
509
- inTheBox: ["Launcher", "Ripcord or winder (where supplied)"],
510
- defaultAuthenticity: "unverified",
511
- priceGuidance: marketBand(leafId),
512
- seoTitleTemplate: "{{title}} — {{series}} launcher | {{siteName}}",
513
- seoDescriptionTemplate: "Buy {{title}}, a {{series}} launcher, on {{siteName}}. Condition {{condition}}, tested where the seller states so.",
514
- seoKeywords: ["beyblade launcher", series.toLowerCase()],
515
- weightG: 90,
516
- dimensionsCm: { l: 16, w: 10, h: 4 },
517
- fragile: false,
518
- faqTemplates: [
519
- {
520
- question: "Which Beyblades does {{title}} launch?",
521
- answer: "A {{series}} launcher drives {{series}} tops. Launchers are not interchangeable across generations — the ripcord, the prongs and the lock all changed between them.",
522
- },
523
- {
524
- question: "Is the ripcord included with {{title}}?",
525
- answer: "Check the description. A ripcord is a wear part and is frequently sold separately or replaced; where one is included the listing says so and it is in the photographs.",
526
- },
527
- BEY_FAQ_TEMPLATES[1],
528
- ],
529
- };
530
- }
531
- export function stadiumDefaults(leafId, series) {
532
- return {
533
- taxCodeId: TAX_TOY,
534
- specifications: [SPEC("Series", series), SPEC("Accessory type", "Stadium")],
535
- inTheBox: ["Stadium", "Assembly parts where the design requires them"],
536
- defaultAuthenticity: "unverified",
537
- priceGuidance: marketBand(leafId),
538
- seoTitleTemplate: "{{title}} — {{series}} stadium | {{siteName}}",
539
- seoDescriptionTemplate: "Buy {{title}}, a {{series}} Beyblade stadium, on {{siteName}}. Condition {{condition}}, dimensions and compatibility in the description.",
540
- seoKeywords: ["beyblade stadium", "beystadium", series.toLowerCase()],
541
- /*
542
- * 🛑 Stadiums are the one Beyblade node where shipping actually bites — a
543
- * ~35 cm dish is volumetric freight, not a 120 g parcel. The weight and
544
- * dimensions here are what a courier rate is computed from, so getting
545
- * them wrong under-quotes every stadium listing.
546
- */
547
- weightG: 900,
548
- dimensionsCm: { l: 40, w: 40, h: 12 },
549
- fragile: true,
550
- faqTemplates: [
551
- {
552
- question: "Can I use {{title}} with every Beyblade generation?",
553
- answer: "Mostly. Round stadiums handle Original, Metal Fight and Burst play. Beyblade X's Xtreme Line stadiums add a rail feature X tops are designed around, so serious X play wants an X-format stadium rather than a round one.",
554
- },
555
- {
556
- question: "Does {{title}} ship assembled?",
557
- answer: "A stadium ships flat or in its original packaging wherever the design allows it, because a rigid dish is volumetric freight. Any assembly required is noted in the description.",
558
- },
559
- BEY_FAQ_TEMPLATES[1],
560
- ],
561
- };
562
- }
563
- export function tcgDefaults(leafId, game, format) {
564
- return {
565
- /*
566
- * Chapter 9504 (playing cards) is the likelier correct HSN for a TCG
567
- * single and it is deliberately NOT seeded: its current rate is
568
- * UNVERIFIED, and a wrong HSN on a real invoice is worse than a
569
- * conservative one. 9503 0099 ("other toys", 5%) is the rate the Indian
570
- * hobby trade actually invoices sealed product at, and it is the one
571
- * chapter here that was confirmed. Revisit when 9504 is verified.
572
- */
573
- taxCodeId: TAX_TOY_OTHER,
574
- specifications: [SPEC("Game", game), SPEC("Format", format)],
575
- defaultAuthenticity: "unverified",
576
- priceGuidance: marketBand(leafId),
577
- seoTitleTemplate: "{{title}} — {{category}} | {{siteName}}",
578
- seoDescriptionTemplate: "Buy {{title}}, a {{categoryPath}} listing on {{siteName}}. Condition {{condition}}, language and print run stated on the listing.",
579
- seoKeywords: [game.toLowerCase(), "trading cards", format.toLowerCase()],
580
- weightG: format === "Sealed" ? 450 : 15,
581
- dimensionsCm: format === "Sealed" ? { l: 20, w: 15, h: 10 } : { l: 10, w: 7, h: 1 },
582
- fragile: false,
583
- /*
584
- * The tcgindia model — five templated FAQs per product, three of which
585
- * interpolate the name. Nobody else in the crawl of fifteen does it, and
586
- * it is the cheapest structured-data win available to us.
587
- */
588
- faqTemplates: [
589
- {
590
- question: "Is {{title}} authentic?",
591
- answer: "Yes. Cards and sealed product listed here come from verified sellers, and a listing that misrepresents authenticity is covered by buyer protection. Language and print run are stated because a Japanese print and an English print of the same card are different products.",
592
- },
593
- {
594
- question: "Is {{title}} sealed?",
595
- answer: "The listing states it. Sealed product is unopened and factory-wrapped; a single is an individual card whose condition is graded on the listing.",
596
- },
597
- {
598
- question: "Can I request {{title}} if it is out of stock?",
599
- answer: "Yes — add it to your wishlist and you will be notified when a seller lists it again. Sold listings stay visible here on purpose, so you can see what has been available and at what price.",
600
- },
601
- {
602
- question: "Are specific pulls guaranteed from {{title}}?",
603
- answer: "No. Sealed product is random by design and no seller here guarantees a particular card from a pack or box. Any listing claiming a guaranteed pull from sealed product should be reported.",
604
- },
605
- {
606
- question: "Can I return {{title}}?",
607
- answer: "A misdescribed card or a damaged delivery is returnable within the stated window. Opened sealed product is not returnable on the basis of what was inside it, for the reason above.",
608
- },
609
- ],
610
- };
611
- }
612
- export function figureDefaults(leafId, scaleOrLine) {
613
- return {
614
- taxCodeId: TAX_TOY_OTHER,
615
- specifications: [SPEC("Scale / line", scaleOrLine)],
616
- inTheBox: ["Figure", "Stand and accessories as supplied by the maker"],
617
- defaultAuthenticity: "unverified",
618
- priceGuidance: marketBand(leafId),
619
- seoTitleTemplate: "{{title}} — {{category}} | {{siteName}}",
620
- seoDescriptionTemplate: "Buy {{title}}, a {{category}} collectible figure, on {{siteName}}. Condition {{condition}}, box state stated, buyer protection on every order.",
621
- seoKeywords: ["collectible figure", "anime figure", scaleOrLine.toLowerCase()],
622
- weightG: 700,
623
- dimensionsCm: { l: 30, w: 20, h: 20 },
624
- /*
625
- * PVC at scale is genuinely fragile — a 1/7 figure has thin painted
626
- * extremities and the box is part of the value. This is the one vertical
627
- * where `fragile` drives packaging instructions rather than being advisory.
628
- */
629
- fragile: true,
630
- faqTemplates: [
631
- {
632
- question: "Is {{title}} an authentic {{brand}} figure?",
633
- answer: "Authenticity is stated on the listing. Bootleg figures are common at scale and are identified by paint quality, seam finish and box printing — a seller listing a bootleg must label it as a reproduction.",
634
- },
635
- {
636
- question: "What condition is the box of {{title}} in?",
637
- answer: "Box condition is called out separately from figure condition, because for a collectible figure the two are priced differently. A \"without box\" listing says so in its title.",
638
- },
639
- BEY_FAQ_TEMPLATES[3],
640
- ],
641
- };
642
- }
643
- export function diecastDefaults(leafId, line) {
644
- return {
645
- taxCodeId: TAX_TOY,
646
- specifications: [SPEC("Line", line), SPEC("Scale", "1:64")],
647
- inTheBox: ["Die-cast model on its original card where carded"],
648
- defaultAuthenticity: "unverified",
649
- priceGuidance: marketBand(leafId),
650
- seoTitleTemplate: "{{title}} — Hot Wheels {{category}} | {{siteName}}",
651
- seoDescriptionTemplate: "Buy {{title}}, a Hot Wheels {{category}} die-cast, on {{siteName}}. Card condition stated; chase variants identified on the listing.",
652
- seoKeywords: ["hot wheels", "diecast", "1:64", line.toLowerCase()],
653
- weightG: 60,
654
- dimensionsCm: { l: 17, w: 9, h: 4 },
655
- fragile: false,
656
- faqTemplates: [
657
- {
658
- question: "Is {{title}} a Treasure Hunt?",
659
- answer: "Chase variants are identified on the listing itself, not inferred. A Treasure Hunt carries the flame circle logo; a Super Treasure Hunt additionally has Real Riders rubber tyres and Spectraflame paint. A listing that claims a chase without showing it should be reported.",
660
- },
661
- {
662
- question: "Is the card for {{title}} in good condition?",
663
- answer: "Card condition is graded separately from the car, because carded collectors price it separately. Creases, bends and blister clouding are photographed where present.",
664
- },
665
- {
666
- question: "Is {{title}} an Indian-card release?",
667
- answer: "Where it is, the listing says so. The Indian-market blister card differs from the US one and collectors here price the two differently, so it is called out rather than left for the buyer to spot.",
668
- },
669
- ],
670
- };
671
- }
672
- const TAX_TOY_ELECTRONIC = "tax-hsn-95030010"; // electronic toys — 18%
673
- /**
674
- * 🛑 THE ONLY 18% BRANCH IN THE CATALOGUE, and it is derived rather than
675
- * hand-written on a product.
676
- *
677
- * `tax-hsn-95030010` (electronic toys, 18%) has existed as a `taxCodes` row
678
- * since B3 with **nothing referencing it** — so the 18% arm of `calculateGst`
679
- * and every mixed-rate path (C0c defect 4's `gstByRate`, the per-rate invoice
680
- * table, the blended-rate payout) had no data that could exercise it. A code
681
- * with no referrer is the vocabulary-with-no-rows shape of Root Cause #90.
682
- *
683
- * Counters and BeyPointers are battery-powered scoring devices, which is what
684
- * 9503 0010 covers — so this is the honest home for it, not a flag planted on
685
- * an arbitrary row. Putting it on the CATEGORY rather than on a product means
686
- * the 18% is proven through `deriveTaxonomy`, i.e. through the mechanism that
687
- * will actually carry it in production, instead of through a literal that
688
- * would pass while the derivation stayed untested.
689
- */
690
- const ELECTRONIC_ACCESSORY_LEAVES = new Set(["category-accessory-counters"]);
691
- export function accessoryDefaults(leafId, kind) {
692
- return {
693
- taxCodeId: ELECTRONIC_ACCESSORY_LEAVES.has(leafId) ? TAX_TOY_ELECTRONIC : TAX_TOY_OTHER,
694
- specifications: [SPEC("Accessory type", kind)],
695
- defaultAuthenticity: "unverified",
696
- priceGuidance: marketBand(leafId),
697
- seoTitleTemplate: "{{title}} — {{category}} | {{siteName}}",
698
- seoDescriptionTemplate: "Buy {{title}}, a {{category}}, on {{siteName}}. Condition {{condition}}, capacity and dimensions in the description.",
699
- seoKeywords: [kind.toLowerCase(), "collectible accessories"],
700
- weightG: 400,
701
- dimensionsCm: { l: 28, w: 20, h: 8 },
702
- fragile: false,
703
- faqTemplates: [
704
- {
705
- question: "What fits in {{title}}?",
706
- answer: "Capacity is in the description. Storage designed for complete tops and storage designed for loose parts are different products, and the listing states which this is.",
707
- },
708
- BEY_FAQ_TEMPLATES[1],
709
- ],
710
- };
711
- }
712
- /** Live animals and plants — exempt, and nothing about them is a toy. */
713
- export function livingDefaults() {
714
- return {
715
- taxCodeId: TAX_EXEMPT,
716
- defaultAuthenticity: "original",
717
- seoTitleTemplate: "{{title}} — {{category}} | {{siteName}}",
718
- seoDescriptionTemplate: "{{title}}, a {{category}} listing from a verified seller on {{siteName}}. Species, age and provenance disclosed; jurisdiction checked before payment.",
719
- fragile: true,
720
- faqTemplates: [
721
- {
722
- question: "Can {{title}} be shipped to me?",
723
- answer: "The jurisdiction check runs at checkout, before payment rather than after. Most live listings are local-collection only and the listing states the collection area; where courier transport is lawful and appropriate the seller arranges a specialist live service.",
724
- },
725
- {
726
- question: "What welfare information comes with {{title}}?",
727
- answer: "Species, age, sex where known, and provenance are recorded on the listing, and a seller must be verified before any live listing goes public.",
728
- },
729
- ],
730
- };
731
- }