@open-mercato/core 0.9.1-develop.7474.1.51db10479d → 0.9.1-develop.7475.1.28ca93ed97

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 (597) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/catalog_price_history_entry/index.js +53 -0
  3. package/dist/generated/entities/catalog_price_history_entry/index.js.map +7 -0
  4. package/dist/generated/entities/customer_group_terms/index.js +2 -0
  5. package/dist/generated/entities/customer_group_terms/index.js.map +2 -2
  6. package/dist/generated/entities/ecommerce_store/index.js +33 -0
  7. package/dist/generated/entities/ecommerce_store/index.js.map +7 -0
  8. package/dist/generated/entities/ecommerce_store_channel_binding/index.js +29 -0
  9. package/dist/generated/entities/ecommerce_store_channel_binding/index.js.map +7 -0
  10. package/dist/generated/entities/ecommerce_store_domain_binding/index.js +23 -0
  11. package/dist/generated/entities/ecommerce_store_domain_binding/index.js.map +7 -0
  12. package/dist/generated/entities.ids.generated.js +8 -1
  13. package/dist/generated/entities.ids.generated.js.map +2 -2
  14. package/dist/generated/entity-fields-registry.js +72 -0
  15. package/dist/generated/entity-fields-registry.js.map +2 -2
  16. package/dist/helpers/integration/customerGroupsFixtures.js.map +2 -2
  17. package/dist/modules/catalog/acl.js +8 -1
  18. package/dist/modules/catalog/acl.js.map +2 -2
  19. package/dist/modules/catalog/api/config/omnibus/route.js +184 -0
  20. package/dist/modules/catalog/api/config/omnibus/route.js.map +7 -0
  21. package/dist/modules/catalog/api/prices/history/route.js +131 -0
  22. package/dist/modules/catalog/api/prices/history/route.js.map +7 -0
  23. package/dist/modules/catalog/api/prices/omnibus-preview/route.js +184 -0
  24. package/dist/modules/catalog/api/prices/omnibus-preview/route.js.map +7 -0
  25. package/dist/modules/catalog/api/products/route.js +54 -245
  26. package/dist/modules/catalog/api/products/route.js.map +3 -3
  27. package/dist/modules/catalog/api/tags/route.js +6 -0
  28. package/dist/modules/catalog/api/tags/route.js.map +2 -2
  29. package/dist/modules/catalog/backend/config/catalog/page.js +3 -1
  30. package/dist/modules/catalog/backend/config/catalog/page.js.map +2 -2
  31. package/dist/modules/catalog/cli.js +80 -2
  32. package/dist/modules/catalog/cli.js.map +2 -2
  33. package/dist/modules/catalog/commands/categories.js +51 -2
  34. package/dist/modules/catalog/commands/categories.js.map +2 -2
  35. package/dist/modules/catalog/commands/prices.js +43 -1
  36. package/dist/modules/catalog/commands/prices.js.map +2 -2
  37. package/dist/modules/catalog/commands/products.js +71 -0
  38. package/dist/modules/catalog/commands/products.js.map +2 -2
  39. package/dist/modules/catalog/commands/variants.js +7 -0
  40. package/dist/modules/catalog/commands/variants.js.map +2 -2
  41. package/dist/modules/catalog/components/OmnibusSettings.js +703 -0
  42. package/dist/modules/catalog/components/OmnibusSettings.js.map +7 -0
  43. package/dist/modules/catalog/components/PriceEditorOmnibusRow.js +152 -0
  44. package/dist/modules/catalog/components/PriceEditorOmnibusRow.js.map +7 -0
  45. package/dist/modules/catalog/components/lookupSources.js +31 -0
  46. package/dist/modules/catalog/components/lookupSources.js.map +7 -0
  47. package/dist/modules/catalog/components/prices/PriceScopeSelectors.js +8 -2
  48. package/dist/modules/catalog/components/prices/PriceScopeSelectors.js.map +2 -2
  49. package/dist/modules/catalog/components/products/VariantBuilder.js +11 -1
  50. package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
  51. package/dist/modules/catalog/data/entities.js +122 -1
  52. package/dist/modules/catalog/data/entities.js.map +2 -2
  53. package/dist/modules/catalog/data/validators.js +78 -0
  54. package/dist/modules/catalog/data/validators.js.map +2 -2
  55. package/dist/modules/catalog/di.js +18 -0
  56. package/dist/modules/catalog/di.js.map +2 -2
  57. package/dist/modules/catalog/lib/omnibus.js +285 -0
  58. package/dist/modules/catalog/lib/omnibus.js.map +7 -0
  59. package/dist/modules/catalog/lib/omnibusBackfill.js +146 -0
  60. package/dist/modules/catalog/lib/omnibusBackfill.js.map +7 -0
  61. package/dist/modules/catalog/lib/omnibusCache.js +89 -0
  62. package/dist/modules/catalog/lib/omnibusCache.js.map +7 -0
  63. package/dist/modules/catalog/lib/omnibusConfig.js +64 -0
  64. package/dist/modules/catalog/lib/omnibusConfig.js.map +7 -0
  65. package/dist/modules/catalog/lib/omnibusHistoryQueries.js +191 -0
  66. package/dist/modules/catalog/lib/omnibusHistoryQueries.js.map +7 -0
  67. package/dist/modules/catalog/lib/omnibusPresentedEntry.js +73 -0
  68. package/dist/modules/catalog/lib/omnibusPresentedEntry.js.map +7 -0
  69. package/dist/modules/catalog/lib/omnibusProductListEnrichment.js +94 -0
  70. package/dist/modules/catalog/lib/omnibusProductListEnrichment.js.map +7 -0
  71. package/dist/modules/catalog/lib/omnibusTypes.js +115 -0
  72. package/dist/modules/catalog/lib/omnibusTypes.js.map +7 -0
  73. package/dist/modules/catalog/lib/optionSchemaTranslations.js +55 -0
  74. package/dist/modules/catalog/lib/optionSchemaTranslations.js.map +7 -0
  75. package/dist/modules/catalog/lib/priceHistoryQuery.js +103 -0
  76. package/dist/modules/catalog/lib/priceHistoryQuery.js.map +7 -0
  77. package/dist/modules/catalog/lib/pricing.js +26 -2
  78. package/dist/modules/catalog/lib/pricing.js.map +2 -2
  79. package/dist/modules/catalog/lib/productFilters.js +273 -0
  80. package/dist/modules/catalog/lib/productFilters.js.map +7 -0
  81. package/dist/modules/catalog/lib/productScopeKeys.js +105 -0
  82. package/dist/modules/catalog/lib/productScopeKeys.js.map +7 -0
  83. package/dist/modules/catalog/lib/productScopeReindex.js +73 -0
  84. package/dist/modules/catalog/lib/productScopeReindex.js.map +7 -0
  85. package/dist/modules/catalog/migrations/Migration20261005105352_catalog.js +39 -0
  86. package/dist/modules/catalog/migrations/Migration20261005105352_catalog.js.map +7 -0
  87. package/dist/modules/catalog/migrations/Migration20261005150824_catalog.js +39 -0
  88. package/dist/modules/catalog/migrations/Migration20261005150824_catalog.js.map +7 -0
  89. package/dist/modules/catalog/services/catalogOmnibusService.js +480 -0
  90. package/dist/modules/catalog/services/catalogOmnibusService.js.map +7 -0
  91. package/dist/modules/catalog/setup.js +3 -1
  92. package/dist/modules/catalog/setup.js.map +2 -2
  93. package/dist/modules/catalog/subscribers/product-scope-keys-category-deleted.js +16 -0
  94. package/dist/modules/catalog/subscribers/product-scope-keys-category-deleted.js.map +7 -0
  95. package/dist/modules/catalog/subscribers/product-scope-keys-category-updated.js +17 -0
  96. package/dist/modules/catalog/subscribers/product-scope-keys-category-updated.js.map +7 -0
  97. package/dist/modules/catalog/translations.js +10 -0
  98. package/dist/modules/catalog/translations.js.map +2 -2
  99. package/dist/modules/configs/lib/upgrade-actions.js +28 -0
  100. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  101. package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js +5 -0
  102. package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js.map +2 -2
  103. package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js +111 -3
  104. package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js.map +2 -2
  105. package/dist/modules/customer_groups/components/customerGroupAssortmentScope.js +43 -0
  106. package/dist/modules/customer_groups/components/customerGroupAssortmentScope.js.map +7 -0
  107. package/dist/modules/customer_groups/data/entities.js +3 -0
  108. package/dist/modules/customer_groups/data/entities.js.map +2 -2
  109. package/dist/modules/customer_groups/data/validators.js +9 -0
  110. package/dist/modules/customer_groups/data/validators.js.map +2 -2
  111. package/dist/modules/customer_groups/migrations/Migration20261005110250_customer_groups.js +17 -0
  112. package/dist/modules/customer_groups/migrations/Migration20261005110250_customer_groups.js.map +7 -0
  113. package/dist/modules/customer_groups/services/customerGroupsService.js +62 -15
  114. package/dist/modules/customer_groups/services/customerGroupsService.js.map +2 -2
  115. package/dist/modules/ecommerce/acl.js +13 -0
  116. package/dist/modules/ecommerce/acl.js.map +7 -0
  117. package/dist/modules/ecommerce/api/domain-mappings/route.js +72 -0
  118. package/dist/modules/ecommerce/api/domain-mappings/route.js.map +7 -0
  119. package/dist/modules/ecommerce/api/openapi.js +27 -0
  120. package/dist/modules/ecommerce/api/openapi.js.map +7 -0
  121. package/dist/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.js +109 -0
  122. package/dist/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.js.map +7 -0
  123. package/dist/modules/ecommerce/api/store-channel-bindings/crud.js +265 -0
  124. package/dist/modules/ecommerce/api/store-channel-bindings/crud.js.map +7 -0
  125. package/dist/modules/ecommerce/api/store-channel-bindings/route.js +67 -0
  126. package/dist/modules/ecommerce/api/store-channel-bindings/route.js.map +7 -0
  127. package/dist/modules/ecommerce/api/store-domain-bindings/crud.js +296 -0
  128. package/dist/modules/ecommerce/api/store-domain-bindings/crud.js.map +7 -0
  129. package/dist/modules/ecommerce/api/store-domain-bindings/route.js +73 -0
  130. package/dist/modules/ecommerce/api/store-domain-bindings/route.js.map +7 -0
  131. package/dist/modules/ecommerce/api/storefront/categories/[slug]/route.js +87 -0
  132. package/dist/modules/ecommerce/api/storefront/categories/[slug]/route.js.map +7 -0
  133. package/dist/modules/ecommerce/api/storefront/categories/openapiSchemas.js +50 -0
  134. package/dist/modules/ecommerce/api/storefront/categories/openapiSchemas.js.map +7 -0
  135. package/dist/modules/ecommerce/api/storefront/categories/route.js +75 -0
  136. package/dist/modules/ecommerce/api/storefront/categories/route.js.map +7 -0
  137. package/dist/modules/ecommerce/api/storefront/context/route.js +163 -0
  138. package/dist/modules/ecommerce/api/storefront/context/route.js.map +7 -0
  139. package/dist/modules/ecommerce/api/storefront/products/[idOrHandle]/route.js +87 -0
  140. package/dist/modules/ecommerce/api/storefront/products/[idOrHandle]/route.js.map +7 -0
  141. package/dist/modules/ecommerce/api/storefront/products/openapiSchemas.js +177 -0
  142. package/dist/modules/ecommerce/api/storefront/products/openapiSchemas.js.map +7 -0
  143. package/dist/modules/ecommerce/api/storefront/products/route.js +78 -0
  144. package/dist/modules/ecommerce/api/storefront/products/route.js.map +7 -0
  145. package/dist/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.js +25 -0
  146. package/dist/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.js.map +7 -0
  147. package/dist/modules/ecommerce/api/storefront/search/suggest/route.js +75 -0
  148. package/dist/modules/ecommerce/api/storefront/search/suggest/route.js.map +7 -0
  149. package/dist/modules/ecommerce/api/storefront/storefrontRouteSupport.js +58 -0
  150. package/dist/modules/ecommerce/api/storefront/storefrontRouteSupport.js.map +7 -0
  151. package/dist/modules/ecommerce/api/stores/[id]/branding/route.js +183 -0
  152. package/dist/modules/ecommerce/api/stores/[id]/branding/route.js.map +7 -0
  153. package/dist/modules/ecommerce/api/stores/[id]/preview-branding/route.js +92 -0
  154. package/dist/modules/ecommerce/api/stores/[id]/preview-branding/route.js.map +7 -0
  155. package/dist/modules/ecommerce/api/stores/crud.js +401 -0
  156. package/dist/modules/ecommerce/api/stores/crud.js.map +7 -0
  157. package/dist/modules/ecommerce/api/stores/route.js +64 -0
  158. package/dist/modules/ecommerce/api/stores/route.js.map +7 -0
  159. package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.js +9 -0
  160. package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.js.map +7 -0
  161. package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.js +16 -0
  162. package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.js.map +7 -0
  163. package/dist/modules/ecommerce/backend/config/ecommerce/page.js +9 -0
  164. package/dist/modules/ecommerce/backend/config/ecommerce/page.js.map +7 -0
  165. package/dist/modules/ecommerce/backend/config/ecommerce/page.meta.js +16 -0
  166. package/dist/modules/ecommerce/backend/config/ecommerce/page.meta.js.map +7 -0
  167. package/dist/modules/ecommerce/commands/stores.js +110 -0
  168. package/dist/modules/ecommerce/commands/stores.js.map +7 -0
  169. package/dist/modules/ecommerce/components/ChannelAssortmentCount.js +90 -0
  170. package/dist/modules/ecommerce/components/ChannelAssortmentCount.js.map +7 -0
  171. package/dist/modules/ecommerce/components/ChannelBindingFormSections.js +33 -0
  172. package/dist/modules/ecommerce/components/ChannelBindingFormSections.js.map +7 -0
  173. package/dist/modules/ecommerce/components/ChannelLookupPicker.js +11 -0
  174. package/dist/modules/ecommerce/components/ChannelLookupPicker.js.map +7 -0
  175. package/dist/modules/ecommerce/components/DomainStatusWarning.js +24 -0
  176. package/dist/modules/ecommerce/components/DomainStatusWarning.js.map +7 -0
  177. package/dist/modules/ecommerce/components/StoreAvailabilityDefaultsSection.js +190 -0
  178. package/dist/modules/ecommerce/components/StoreAvailabilityDefaultsSection.js.map +7 -0
  179. package/dist/modules/ecommerce/components/StoreBrandingControls.js +67 -0
  180. package/dist/modules/ecommerce/components/StoreBrandingControls.js.map +7 -0
  181. package/dist/modules/ecommerce/components/StoreBrandingPreview.js +69 -0
  182. package/dist/modules/ecommerce/components/StoreBrandingPreview.js.map +7 -0
  183. package/dist/modules/ecommerce/components/StoreBrandingTab.js +218 -0
  184. package/dist/modules/ecommerce/components/StoreBrandingTab.js.map +7 -0
  185. package/dist/modules/ecommerce/components/StoreChannelBindingDialog.js +270 -0
  186. package/dist/modules/ecommerce/components/StoreChannelBindingDialog.js.map +7 -0
  187. package/dist/modules/ecommerce/components/StoreChannelsTab.js +313 -0
  188. package/dist/modules/ecommerce/components/StoreChannelsTab.js.map +7 -0
  189. package/dist/modules/ecommerce/components/StoreCreateDialog.js +164 -0
  190. package/dist/modules/ecommerce/components/StoreCreateDialog.js.map +7 -0
  191. package/dist/modules/ecommerce/components/StoreDomainBindingDialog.js +162 -0
  192. package/dist/modules/ecommerce/components/StoreDomainBindingDialog.js.map +7 -0
  193. package/dist/modules/ecommerce/components/StoreDomainsTab.js +357 -0
  194. package/dist/modules/ecommerce/components/StoreDomainsTab.js.map +7 -0
  195. package/dist/modules/ecommerce/components/StoreEditPage.js +155 -0
  196. package/dist/modules/ecommerce/components/StoreEditPage.js.map +7 -0
  197. package/dist/modules/ecommerce/components/StoreGeneralTab.js +167 -0
  198. package/dist/modules/ecommerce/components/StoreGeneralTab.js.map +7 -0
  199. package/dist/modules/ecommerce/components/StoreListPage.js +290 -0
  200. package/dist/modules/ecommerce/components/StoreListPage.js.map +7 -0
  201. package/dist/modules/ecommerce/components/StoreSeoTab.js +132 -0
  202. package/dist/modules/ecommerce/components/StoreSeoTab.js.map +7 -0
  203. package/dist/modules/ecommerce/components/StoreStatusBadge.js +20 -0
  204. package/dist/modules/ecommerce/components/StoreStatusBadge.js.map +7 -0
  205. package/dist/modules/ecommerce/components/channelLookups.js +28 -0
  206. package/dist/modules/ecommerce/components/channelLookups.js.map +7 -0
  207. package/dist/modules/ecommerce/components/storeAdmin.js +41 -0
  208. package/dist/modules/ecommerce/components/storeAdmin.js.map +7 -0
  209. package/dist/modules/ecommerce/components/storeBrandingForm.js +197 -0
  210. package/dist/modules/ecommerce/components/storeBrandingForm.js.map +7 -0
  211. package/dist/modules/ecommerce/components/storeChannels.js +140 -0
  212. package/dist/modules/ecommerce/components/storeChannels.js.map +7 -0
  213. package/dist/modules/ecommerce/components/storeDomains.js +167 -0
  214. package/dist/modules/ecommerce/components/storeDomains.js.map +7 -0
  215. package/dist/modules/ecommerce/components/storeEditTabs.js +62 -0
  216. package/dist/modules/ecommerce/components/storeEditTabs.js.map +7 -0
  217. package/dist/modules/ecommerce/components/storeGeneral.js +95 -0
  218. package/dist/modules/ecommerce/components/storeGeneral.js.map +7 -0
  219. package/dist/modules/ecommerce/components/storeSeo.js +69 -0
  220. package/dist/modules/ecommerce/components/storeSeo.js.map +7 -0
  221. package/dist/modules/ecommerce/components/useChannelAssortmentCount.js +45 -0
  222. package/dist/modules/ecommerce/components/useChannelAssortmentCount.js.map +7 -0
  223. package/dist/modules/ecommerce/components/useStoreAccess.js +28 -0
  224. package/dist/modules/ecommerce/components/useStoreAccess.js.map +7 -0
  225. package/dist/modules/ecommerce/data/enrichers.js +157 -0
  226. package/dist/modules/ecommerce/data/enrichers.js.map +7 -0
  227. package/dist/modules/ecommerce/data/entities.js +197 -0
  228. package/dist/modules/ecommerce/data/entities.js.map +7 -0
  229. package/dist/modules/ecommerce/data/validators.js +406 -0
  230. package/dist/modules/ecommerce/data/validators.js.map +7 -0
  231. package/dist/modules/ecommerce/di.js +11 -0
  232. package/dist/modules/ecommerce/di.js.map +7 -0
  233. package/dist/modules/ecommerce/events.js +27 -0
  234. package/dist/modules/ecommerce/events.js.map +7 -0
  235. package/dist/modules/ecommerce/index.js +16 -0
  236. package/dist/modules/ecommerce/index.js.map +7 -0
  237. package/dist/modules/ecommerce/lib/assortmentCount.js +112 -0
  238. package/dist/modules/ecommerce/lib/assortmentCount.js.map +7 -0
  239. package/dist/modules/ecommerce/lib/brandingStyles.js +184 -0
  240. package/dist/modules/ecommerce/lib/brandingStyles.js.map +7 -0
  241. package/dist/modules/ecommerce/lib/buyerContext.js +284 -0
  242. package/dist/modules/ecommerce/lib/buyerContext.js.map +7 -0
  243. package/dist/modules/ecommerce/lib/cacheInvalidation.js +186 -0
  244. package/dist/modules/ecommerce/lib/cacheInvalidation.js.map +7 -0
  245. package/dist/modules/ecommerce/lib/cacheKeys.js +236 -0
  246. package/dist/modules/ecommerce/lib/cacheKeys.js.map +7 -0
  247. package/dist/modules/ecommerce/lib/createConflictRecheck.js +29 -0
  248. package/dist/modules/ecommerce/lib/createConflictRecheck.js.map +7 -0
  249. package/dist/modules/ecommerce/lib/crudEvents.js +94 -0
  250. package/dist/modules/ecommerce/lib/crudEvents.js.map +7 -0
  251. package/dist/modules/ecommerce/lib/crudSupport.js +64 -0
  252. package/dist/modules/ecommerce/lib/crudSupport.js.map +7 -0
  253. package/dist/modules/ecommerce/lib/domainBindingRebind.js +99 -0
  254. package/dist/modules/ecommerce/lib/domainBindingRebind.js.map +7 -0
  255. package/dist/modules/ecommerce/lib/domainMappingSummaries.js +39 -0
  256. package/dist/modules/ecommerce/lib/domainMappingSummaries.js.map +7 -0
  257. package/dist/modules/ecommerce/lib/exclusiveFlag.js +57 -0
  258. package/dist/modules/ecommerce/lib/exclusiveFlag.js.map +7 -0
  259. package/dist/modules/ecommerce/lib/references.js +70 -0
  260. package/dist/modules/ecommerce/lib/references.js.map +7 -0
  261. package/dist/modules/ecommerce/lib/seedDraftStore.js +99 -0
  262. package/dist/modules/ecommerce/lib/seedDraftStore.js.map +7 -0
  263. package/dist/modules/ecommerce/lib/storeBindingCascade.js +109 -0
  264. package/dist/modules/ecommerce/lib/storeBindingCascade.js.map +7 -0
  265. package/dist/modules/ecommerce/lib/storeBranding.js +40 -0
  266. package/dist/modules/ecommerce/lib/storeBranding.js.map +7 -0
  267. package/dist/modules/ecommerce/lib/storeBrandingRoute.js +76 -0
  268. package/dist/modules/ecommerce/lib/storeBrandingRoute.js.map +7 -0
  269. package/dist/modules/ecommerce/lib/storeContext.js +393 -0
  270. package/dist/modules/ecommerce/lib/storeContext.js.map +7 -0
  271. package/dist/modules/ecommerce/lib/storeContextService.js +43 -0
  272. package/dist/modules/ecommerce/lib/storeContextService.js.map +7 -0
  273. package/dist/modules/ecommerce/lib/storeLocale.js +60 -0
  274. package/dist/modules/ecommerce/lib/storeLocale.js.map +7 -0
  275. package/dist/modules/ecommerce/lib/storeNotifications.js +41 -0
  276. package/dist/modules/ecommerce/lib/storeNotifications.js.map +7 -0
  277. package/dist/modules/ecommerce/lib/storefrontCatalogSupport.js +248 -0
  278. package/dist/modules/ecommerce/lib/storefrontCatalogSupport.js.map +7 -0
  279. package/dist/modules/ecommerce/lib/storefrontCategories.js +241 -0
  280. package/dist/modules/ecommerce/lib/storefrontCategories.js.map +7 -0
  281. package/dist/modules/ecommerce/lib/storefrontCategoryCache.js +71 -0
  282. package/dist/modules/ecommerce/lib/storefrontCategoryCache.js.map +7 -0
  283. package/dist/modules/ecommerce/lib/storefrontDetail.js +447 -0
  284. package/dist/modules/ecommerce/lib/storefrontDetail.js.map +7 -0
  285. package/dist/modules/ecommerce/lib/storefrontFacets.js +441 -0
  286. package/dist/modules/ecommerce/lib/storefrontFacets.js.map +7 -0
  287. package/dist/modules/ecommerce/lib/storefrontOptionFilter.js +15 -0
  288. package/dist/modules/ecommerce/lib/storefrontOptionFilter.js.map +7 -0
  289. package/dist/modules/ecommerce/lib/storefrontPricing.js +393 -0
  290. package/dist/modules/ecommerce/lib/storefrontPricing.js.map +7 -0
  291. package/dist/modules/ecommerce/lib/storefrontProductCache.js +90 -0
  292. package/dist/modules/ecommerce/lib/storefrontProductCache.js.map +7 -0
  293. package/dist/modules/ecommerce/lib/storefrontProductScope.js +107 -0
  294. package/dist/modules/ecommerce/lib/storefrontProductScope.js.map +7 -0
  295. package/dist/modules/ecommerce/lib/storefrontProducts.js +670 -0
  296. package/dist/modules/ecommerce/lib/storefrontProducts.js.map +7 -0
  297. package/dist/modules/ecommerce/lib/storefrontQuery.js +156 -0
  298. package/dist/modules/ecommerce/lib/storefrontQuery.js.map +7 -0
  299. package/dist/modules/ecommerce/lib/storefrontRateLimit.js +99 -0
  300. package/dist/modules/ecommerce/lib/storefrontRateLimit.js.map +7 -0
  301. package/dist/modules/ecommerce/lib/storefrontSearch.js +303 -0
  302. package/dist/modules/ecommerce/lib/storefrontSearch.js.map +7 -0
  303. package/dist/modules/ecommerce/lib/storefrontSearchCache.js +35 -0
  304. package/dist/modules/ecommerce/lib/storefrontSearchCache.js.map +7 -0
  305. package/dist/modules/ecommerce/lib/subscriberSupport.js +33 -0
  306. package/dist/modules/ecommerce/lib/subscriberSupport.js.map +7 -0
  307. package/dist/modules/ecommerce/lib/types.js +1 -0
  308. package/dist/modules/ecommerce/lib/types.js.map +7 -0
  309. package/dist/modules/ecommerce/migrations/Migration20261005113233_ecommerce.js +32 -0
  310. package/dist/modules/ecommerce/migrations/Migration20261005113233_ecommerce.js.map +7 -0
  311. package/dist/modules/ecommerce/migrations/Migration20261006112733_ecommerce.js +17 -0
  312. package/dist/modules/ecommerce/migrations/Migration20261006112733_ecommerce.js.map +7 -0
  313. package/dist/modules/ecommerce/notifications.client.js +47 -0
  314. package/dist/modules/ecommerce/notifications.client.js.map +7 -0
  315. package/dist/modules/ecommerce/notifications.js +48 -0
  316. package/dist/modules/ecommerce/notifications.js.map +7 -0
  317. package/dist/modules/ecommerce/search.js +83 -0
  318. package/dist/modules/ecommerce/search.js.map +7 -0
  319. package/dist/modules/ecommerce/setup.js +17 -0
  320. package/dist/modules/ecommerce/setup.js.map +7 -0
  321. package/dist/modules/ecommerce/subscribers/assortment-empty-notifications.js +14 -0
  322. package/dist/modules/ecommerce/subscribers/assortment-empty-notifications.js.map +7 -0
  323. package/dist/modules/ecommerce/subscribers/availability-policy-cache-invalidation.js +14 -0
  324. package/dist/modules/ecommerce/subscribers/availability-policy-cache-invalidation.js.map +7 -0
  325. package/dist/modules/ecommerce/subscribers/catalog-category-cache-invalidation.js +14 -0
  326. package/dist/modules/ecommerce/subscribers/catalog-category-cache-invalidation.js.map +7 -0
  327. package/dist/modules/ecommerce/subscribers/catalog-price-cache-invalidation.js +14 -0
  328. package/dist/modules/ecommerce/subscribers/catalog-price-cache-invalidation.js.map +7 -0
  329. package/dist/modules/ecommerce/subscribers/catalog-product-cache-invalidation.js +14 -0
  330. package/dist/modules/ecommerce/subscribers/catalog-product-cache-invalidation.js.map +7 -0
  331. package/dist/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.js +14 -0
  332. package/dist/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.js.map +7 -0
  333. package/dist/modules/ecommerce/subscribers/customer-group-cache-invalidation.js +14 -0
  334. package/dist/modules/ecommerce/subscribers/customer-group-cache-invalidation.js.map +7 -0
  335. package/dist/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.js +14 -0
  336. package/dist/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.js.map +7 -0
  337. package/dist/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.js +14 -0
  338. package/dist/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.js.map +7 -0
  339. package/dist/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.js +14 -0
  340. package/dist/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.js.map +7 -0
  341. package/dist/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.js +14 -0
  342. package/dist/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.js.map +7 -0
  343. package/dist/modules/ecommerce/subscribers/domain-binding-rebind.js +16 -0
  344. package/dist/modules/ecommerce/subscribers/domain-binding-rebind.js.map +7 -0
  345. package/dist/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.js +14 -0
  346. package/dist/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.js.map +7 -0
  347. package/dist/modules/ecommerce/subscribers/store-cache-invalidation.js +14 -0
  348. package/dist/modules/ecommerce/subscribers/store-cache-invalidation.js.map +7 -0
  349. package/dist/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.js +14 -0
  350. package/dist/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.js.map +7 -0
  351. package/dist/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.js +14 -0
  352. package/dist/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.js.map +7 -0
  353. package/dist/modules/ecommerce/subscribers/store-notifications.js +14 -0
  354. package/dist/modules/ecommerce/subscribers/store-notifications.js.map +7 -0
  355. package/dist/modules/query_index/lib/batch.js +23 -9
  356. package/dist/modules/query_index/lib/batch.js.map +2 -2
  357. package/dist/modules/query_index/lib/doc-enrichers.js +212 -0
  358. package/dist/modules/query_index/lib/doc-enrichers.js.map +7 -0
  359. package/dist/modules/query_index/lib/document.js +2 -0
  360. package/dist/modules/query_index/lib/document.js.map +2 -2
  361. package/dist/modules/query_index/lib/engine.js +68 -1
  362. package/dist/modules/query_index/lib/engine.js.map +2 -2
  363. package/dist/modules/query_index/lib/indexer.js +7 -0
  364. package/dist/modules/query_index/lib/indexer.js.map +2 -2
  365. package/dist/modules/query_index/lib/search-tokens.js +2 -0
  366. package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
  367. package/dist/modules/query_index/migrations/Migration20261005201500_query_index.js +17 -0
  368. package/dist/modules/query_index/migrations/Migration20261005201500_query_index.js.map +7 -0
  369. package/dist/modules/translations/components/TranslationManager.js +3 -3
  370. package/dist/modules/translations/components/TranslationManager.js.map +2 -2
  371. package/dist/modules/translations/data/validators.js +1 -1
  372. package/dist/modules/translations/data/validators.js.map +1 -1
  373. package/dist/modules/translations/lib/batch.js +21 -1
  374. package/dist/modules/translations/lib/batch.js.map +2 -2
  375. package/dist/modules/translations/lib/helpers.js +3 -0
  376. package/dist/modules/translations/lib/helpers.js.map +2 -2
  377. package/dist/modules/translations/lib/resolve-field-list.js +14 -2
  378. package/dist/modules/translations/lib/resolve-field-list.js.map +2 -2
  379. package/generated/entities/catalog_price_history_entry/index.ts +25 -0
  380. package/generated/entities/customer_group_terms/index.ts +1 -0
  381. package/generated/entities/ecommerce_store/index.ts +15 -0
  382. package/generated/entities/ecommerce_store_channel_binding/index.ts +13 -0
  383. package/generated/entities/ecommerce_store_domain_binding/index.ts +10 -0
  384. package/generated/entities.ids.generated.ts +8 -1
  385. package/generated/entity-fields-registry.ts +72 -0
  386. package/package.json +7 -7
  387. package/src/helpers/integration/customerGroupsFixtures.ts +2 -0
  388. package/src/modules/auth/i18n/de.json +8 -0
  389. package/src/modules/auth/i18n/en.json +8 -0
  390. package/src/modules/auth/i18n/es.json +8 -0
  391. package/src/modules/auth/i18n/ko.json +8 -0
  392. package/src/modules/auth/i18n/pl.json +8 -0
  393. package/src/modules/catalog/AGENTS.md +5 -2
  394. package/src/modules/catalog/acl.ts +7 -0
  395. package/src/modules/catalog/api/config/omnibus/route.ts +204 -0
  396. package/src/modules/catalog/api/prices/history/route.ts +139 -0
  397. package/src/modules/catalog/api/prices/omnibus-preview/route.ts +202 -0
  398. package/src/modules/catalog/api/products/route.ts +53 -308
  399. package/src/modules/catalog/api/tags/route.ts +6 -0
  400. package/src/modules/catalog/backend/config/catalog/page.tsx +2 -0
  401. package/src/modules/catalog/cli.ts +84 -1
  402. package/src/modules/catalog/commands/categories.ts +54 -2
  403. package/src/modules/catalog/commands/prices.ts +43 -1
  404. package/src/modules/catalog/commands/products.ts +84 -1
  405. package/src/modules/catalog/commands/variants.ts +7 -0
  406. package/src/modules/catalog/components/OmnibusSettings.tsx +832 -0
  407. package/src/modules/catalog/components/PriceEditorOmnibusRow.tsx +219 -0
  408. package/src/modules/catalog/components/lookupSources.ts +29 -0
  409. package/src/modules/catalog/components/prices/PriceScopeSelectors.tsx +9 -0
  410. package/src/modules/catalog/components/products/VariantBuilder.tsx +9 -0
  411. package/src/modules/catalog/data/entities.ts +123 -1
  412. package/src/modules/catalog/data/validators.ts +118 -0
  413. package/src/modules/catalog/di.ts +23 -0
  414. package/src/modules/catalog/i18n/de.json +77 -0
  415. package/src/modules/catalog/i18n/en.json +77 -0
  416. package/src/modules/catalog/i18n/es.json +77 -0
  417. package/src/modules/catalog/i18n/ko.json +77 -0
  418. package/src/modules/catalog/i18n/pl.json +77 -0
  419. package/src/modules/catalog/lib/omnibus.ts +406 -0
  420. package/src/modules/catalog/lib/omnibusBackfill.ts +198 -0
  421. package/src/modules/catalog/lib/omnibusCache.ts +111 -0
  422. package/src/modules/catalog/lib/omnibusConfig.ts +73 -0
  423. package/src/modules/catalog/lib/omnibusHistoryQueries.ts +248 -0
  424. package/src/modules/catalog/lib/omnibusPresentedEntry.ts +76 -0
  425. package/src/modules/catalog/lib/omnibusProductListEnrichment.ts +125 -0
  426. package/src/modules/catalog/lib/omnibusTypes.ts +202 -0
  427. package/src/modules/catalog/lib/optionSchemaTranslations.ts +55 -0
  428. package/src/modules/catalog/lib/priceHistoryQuery.ts +155 -0
  429. package/src/modules/catalog/lib/pricing.ts +42 -4
  430. package/src/modules/catalog/lib/productFilters.ts +349 -0
  431. package/src/modules/catalog/lib/productScopeKeys.ts +162 -0
  432. package/src/modules/catalog/lib/productScopeReindex.ts +139 -0
  433. package/src/modules/catalog/migrations/.snapshot-open-mercato.json +572 -0
  434. package/src/modules/catalog/migrations/Migration20261005105352_catalog.ts +39 -0
  435. package/src/modules/catalog/migrations/Migration20261005150824_catalog.ts +39 -0
  436. package/src/modules/catalog/services/catalogOmnibusService.ts +642 -0
  437. package/src/modules/catalog/setup.ts +2 -0
  438. package/src/modules/catalog/subscribers/product-scope-keys-category-deleted.ts +18 -0
  439. package/src/modules/catalog/subscribers/product-scope-keys-category-updated.ts +19 -0
  440. package/src/modules/catalog/translations.ts +12 -0
  441. package/src/modules/configs/i18n/de.json +5 -1
  442. package/src/modules/configs/i18n/en.json +5 -1
  443. package/src/modules/configs/i18n/es.json +5 -1
  444. package/src/modules/configs/i18n/ko.json +5 -1
  445. package/src/modules/configs/i18n/pl.json +5 -1
  446. package/src/modules/configs/lib/upgrade-actions.ts +35 -0
  447. package/src/modules/customer_groups/api/customer-groups/[id]/terms/route.ts +7 -0
  448. package/src/modules/customer_groups/components/CustomerGroupTermsSection.tsx +124 -2
  449. package/src/modules/customer_groups/components/customerGroupAssortmentScope.ts +46 -0
  450. package/src/modules/customer_groups/data/entities.ts +4 -0
  451. package/src/modules/customer_groups/data/validators.ts +14 -0
  452. package/src/modules/customer_groups/i18n/de.json +12 -0
  453. package/src/modules/customer_groups/i18n/en.json +12 -0
  454. package/src/modules/customer_groups/i18n/es.json +12 -0
  455. package/src/modules/customer_groups/i18n/ko.json +12 -0
  456. package/src/modules/customer_groups/i18n/pl.json +12 -0
  457. package/src/modules/customer_groups/migrations/.snapshot-open-mercato.json +17 -0
  458. package/src/modules/customer_groups/migrations/Migration20261005110250_customer_groups.ts +15 -0
  459. package/src/modules/customer_groups/services/customerGroupsService.ts +74 -23
  460. package/src/modules/ecommerce/acl.ts +9 -0
  461. package/src/modules/ecommerce/api/domain-mappings/route.ts +76 -0
  462. package/src/modules/ecommerce/api/openapi.ts +28 -0
  463. package/src/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.ts +141 -0
  464. package/src/modules/ecommerce/api/store-channel-bindings/crud.ts +283 -0
  465. package/src/modules/ecommerce/api/store-channel-bindings/route.ts +67 -0
  466. package/src/modules/ecommerce/api/store-domain-bindings/crud.ts +324 -0
  467. package/src/modules/ecommerce/api/store-domain-bindings/route.ts +73 -0
  468. package/src/modules/ecommerce/api/storefront/categories/[slug]/route.ts +94 -0
  469. package/src/modules/ecommerce/api/storefront/categories/openapiSchemas.ts +63 -0
  470. package/src/modules/ecommerce/api/storefront/categories/route.ts +78 -0
  471. package/src/modules/ecommerce/api/storefront/context/route.ts +203 -0
  472. package/src/modules/ecommerce/api/storefront/products/[idOrHandle]/route.ts +94 -0
  473. package/src/modules/ecommerce/api/storefront/products/openapiSchemas.ts +193 -0
  474. package/src/modules/ecommerce/api/storefront/products/route.ts +81 -0
  475. package/src/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.ts +25 -0
  476. package/src/modules/ecommerce/api/storefront/search/suggest/route.ts +78 -0
  477. package/src/modules/ecommerce/api/storefront/storefrontRouteSupport.ts +68 -0
  478. package/src/modules/ecommerce/api/stores/[id]/branding/route.ts +205 -0
  479. package/src/modules/ecommerce/api/stores/[id]/preview-branding/route.ts +99 -0
  480. package/src/modules/ecommerce/api/stores/crud.ts +457 -0
  481. package/src/modules/ecommerce/api/stores/route.ts +66 -0
  482. package/src/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.ts +12 -0
  483. package/src/modules/ecommerce/backend/config/ecommerce/[id]/page.tsx +5 -0
  484. package/src/modules/ecommerce/backend/config/ecommerce/page.meta.ts +12 -0
  485. package/src/modules/ecommerce/backend/config/ecommerce/page.tsx +5 -0
  486. package/src/modules/ecommerce/commands/stores.ts +154 -0
  487. package/src/modules/ecommerce/components/ChannelAssortmentCount.tsx +138 -0
  488. package/src/modules/ecommerce/components/ChannelBindingFormSections.tsx +40 -0
  489. package/src/modules/ecommerce/components/ChannelLookupPicker.tsx +5 -0
  490. package/src/modules/ecommerce/components/DomainStatusWarning.tsx +32 -0
  491. package/src/modules/ecommerce/components/StoreAvailabilityDefaultsSection.tsx +219 -0
  492. package/src/modules/ecommerce/components/StoreBrandingControls.tsx +73 -0
  493. package/src/modules/ecommerce/components/StoreBrandingPreview.tsx +77 -0
  494. package/src/modules/ecommerce/components/StoreBrandingTab.tsx +242 -0
  495. package/src/modules/ecommerce/components/StoreChannelBindingDialog.tsx +306 -0
  496. package/src/modules/ecommerce/components/StoreChannelsTab.tsx +375 -0
  497. package/src/modules/ecommerce/components/StoreCreateDialog.tsx +204 -0
  498. package/src/modules/ecommerce/components/StoreDomainBindingDialog.tsx +198 -0
  499. package/src/modules/ecommerce/components/StoreDomainsTab.tsx +426 -0
  500. package/src/modules/ecommerce/components/StoreEditPage.tsx +193 -0
  501. package/src/modules/ecommerce/components/StoreGeneralTab.tsx +189 -0
  502. package/src/modules/ecommerce/components/StoreListPage.tsx +326 -0
  503. package/src/modules/ecommerce/components/StoreSeoTab.tsx +152 -0
  504. package/src/modules/ecommerce/components/StoreStatusBadge.tsx +22 -0
  505. package/src/modules/ecommerce/components/channelLookups.ts +24 -0
  506. package/src/modules/ecommerce/components/storeAdmin.ts +56 -0
  507. package/src/modules/ecommerce/components/storeBrandingForm.ts +230 -0
  508. package/src/modules/ecommerce/components/storeChannels.ts +210 -0
  509. package/src/modules/ecommerce/components/storeDomains.ts +221 -0
  510. package/src/modules/ecommerce/components/storeEditTabs.tsx +76 -0
  511. package/src/modules/ecommerce/components/storeGeneral.ts +155 -0
  512. package/src/modules/ecommerce/components/storeSeo.ts +78 -0
  513. package/src/modules/ecommerce/components/useChannelAssortmentCount.ts +67 -0
  514. package/src/modules/ecommerce/components/useStoreAccess.ts +36 -0
  515. package/src/modules/ecommerce/data/enrichers.ts +213 -0
  516. package/src/modules/ecommerce/data/entities.ts +168 -0
  517. package/src/modules/ecommerce/data/validators.ts +587 -0
  518. package/src/modules/ecommerce/di.ts +9 -0
  519. package/src/modules/ecommerce/events.ts +27 -0
  520. package/src/modules/ecommerce/i18n/de.json +341 -0
  521. package/src/modules/ecommerce/i18n/en.json +341 -0
  522. package/src/modules/ecommerce/i18n/es.json +341 -0
  523. package/src/modules/ecommerce/i18n/ko.json +341 -0
  524. package/src/modules/ecommerce/i18n/pl.json +341 -0
  525. package/src/modules/ecommerce/index.ts +14 -0
  526. package/src/modules/ecommerce/lib/assortmentCount.ts +175 -0
  527. package/src/modules/ecommerce/lib/brandingStyles.ts +215 -0
  528. package/src/modules/ecommerce/lib/buyerContext.ts +401 -0
  529. package/src/modules/ecommerce/lib/cacheInvalidation.ts +302 -0
  530. package/src/modules/ecommerce/lib/cacheKeys.ts +340 -0
  531. package/src/modules/ecommerce/lib/createConflictRecheck.ts +31 -0
  532. package/src/modules/ecommerce/lib/crudEvents.ts +128 -0
  533. package/src/modules/ecommerce/lib/crudSupport.ts +85 -0
  534. package/src/modules/ecommerce/lib/domainBindingRebind.ts +138 -0
  535. package/src/modules/ecommerce/lib/domainMappingSummaries.ts +71 -0
  536. package/src/modules/ecommerce/lib/exclusiveFlag.ts +90 -0
  537. package/src/modules/ecommerce/lib/references.ts +93 -0
  538. package/src/modules/ecommerce/lib/seedDraftStore.ts +125 -0
  539. package/src/modules/ecommerce/lib/storeBindingCascade.ts +138 -0
  540. package/src/modules/ecommerce/lib/storeBranding.ts +48 -0
  541. package/src/modules/ecommerce/lib/storeBrandingRoute.ts +91 -0
  542. package/src/modules/ecommerce/lib/storeContext.ts +669 -0
  543. package/src/modules/ecommerce/lib/storeContextService.ts +71 -0
  544. package/src/modules/ecommerce/lib/storeLocale.ts +88 -0
  545. package/src/modules/ecommerce/lib/storeNotifications.ts +55 -0
  546. package/src/modules/ecommerce/lib/storefrontCatalogSupport.ts +427 -0
  547. package/src/modules/ecommerce/lib/storefrontCategories.ts +419 -0
  548. package/src/modules/ecommerce/lib/storefrontCategoryCache.ts +113 -0
  549. package/src/modules/ecommerce/lib/storefrontDetail.ts +654 -0
  550. package/src/modules/ecommerce/lib/storefrontFacets.ts +697 -0
  551. package/src/modules/ecommerce/lib/storefrontOptionFilter.ts +44 -0
  552. package/src/modules/ecommerce/lib/storefrontPricing.ts +583 -0
  553. package/src/modules/ecommerce/lib/storefrontProductCache.ts +126 -0
  554. package/src/modules/ecommerce/lib/storefrontProductScope.ts +181 -0
  555. package/src/modules/ecommerce/lib/storefrontProducts.ts +963 -0
  556. package/src/modules/ecommerce/lib/storefrontQuery.ts +215 -0
  557. package/src/modules/ecommerce/lib/storefrontRateLimit.ts +126 -0
  558. package/src/modules/ecommerce/lib/storefrontSearch.ts +454 -0
  559. package/src/modules/ecommerce/lib/storefrontSearchCache.ts +49 -0
  560. package/src/modules/ecommerce/lib/subscriberSupport.ts +41 -0
  561. package/src/modules/ecommerce/lib/types.ts +69 -0
  562. package/src/modules/ecommerce/migrations/.snapshot-open-mercato.json +829 -0
  563. package/src/modules/ecommerce/migrations/Migration20261005113233_ecommerce.ts +32 -0
  564. package/src/modules/ecommerce/migrations/Migration20261006112733_ecommerce.ts +15 -0
  565. package/src/modules/ecommerce/notifications.client.ts +46 -0
  566. package/src/modules/ecommerce/notifications.ts +46 -0
  567. package/src/modules/ecommerce/search.ts +93 -0
  568. package/src/modules/ecommerce/setup.ts +15 -0
  569. package/src/modules/ecommerce/subscribers/assortment-empty-notifications.ts +12 -0
  570. package/src/modules/ecommerce/subscribers/availability-policy-cache-invalidation.ts +12 -0
  571. package/src/modules/ecommerce/subscribers/catalog-category-cache-invalidation.ts +12 -0
  572. package/src/modules/ecommerce/subscribers/catalog-price-cache-invalidation.ts +12 -0
  573. package/src/modules/ecommerce/subscribers/catalog-product-cache-invalidation.ts +12 -0
  574. package/src/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.ts +12 -0
  575. package/src/modules/ecommerce/subscribers/customer-group-cache-invalidation.ts +12 -0
  576. package/src/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.ts +12 -0
  577. package/src/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.ts +12 -0
  578. package/src/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.ts +12 -0
  579. package/src/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.ts +12 -0
  580. package/src/modules/ecommerce/subscribers/domain-binding-rebind.ts +14 -0
  581. package/src/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.ts +12 -0
  582. package/src/modules/ecommerce/subscribers/store-cache-invalidation.ts +12 -0
  583. package/src/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.ts +12 -0
  584. package/src/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.ts +12 -0
  585. package/src/modules/ecommerce/subscribers/store-notifications.ts +12 -0
  586. package/src/modules/query_index/lib/batch.ts +25 -9
  587. package/src/modules/query_index/lib/doc-enrichers.ts +306 -0
  588. package/src/modules/query_index/lib/document.ts +2 -0
  589. package/src/modules/query_index/lib/engine.ts +58 -1
  590. package/src/modules/query_index/lib/indexer.ts +8 -0
  591. package/src/modules/query_index/lib/search-tokens.ts +2 -0
  592. package/src/modules/query_index/migrations/Migration20261005201500_query_index.ts +42 -0
  593. package/src/modules/translations/components/TranslationManager.tsx +3 -3
  594. package/src/modules/translations/data/validators.ts +1 -1
  595. package/src/modules/translations/lib/batch.ts +47 -0
  596. package/src/modules/translations/lib/helpers.ts +4 -0
  597. package/src/modules/translations/lib/resolve-field-list.ts +16 -2
@@ -0,0 +1,75 @@
1
+ import { NextResponse } from "next/server";
2
+ import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
3
+ import { rateLimitErrorSchema } from "@open-mercato/shared/lib/ratelimit/helpers";
4
+ import { ecommerceStorefrontCategoryTreeQuerySchema } from "../../../data/validators.js";
5
+ import { enforceStorefrontRateLimit } from "../../../lib/storefrontRateLimit.js";
6
+ import { cachedGetStorefrontCategoryTree } from "../../../lib/storefrontCategoryCache.js";
7
+ import { parseStorefrontCategoryTreeQuery } from "../../../lib/storefrontQuery.js";
8
+ import {
9
+ storefrontErrorSchema,
10
+ storefrontInvalidQueryErrorSchema,
11
+ storefrontRouteErrorResponse,
12
+ storefrontSuccessHeaders,
13
+ runInStoreCacheTenant
14
+ } from "../storefrontRouteSupport.js";
15
+ import { storefrontCategoryTreeResponseSchema } from "./openapiSchemas.js";
16
+ const metadata = {
17
+ path: "/ecommerce/storefront/categories",
18
+ GET: {
19
+ requireAuth: false
20
+ }
21
+ };
22
+ const ANONYMOUS_CACHE_CONTROL = "public, max-age=300, stale-while-revalidate=60";
23
+ async function GET(req) {
24
+ try {
25
+ const query = parseStorefrontCategoryTreeQuery(new URL(req.url).searchParams);
26
+ const container = await createRequestContainer();
27
+ const service = container.resolve("storeContextService");
28
+ const context = await service.resolve(req, { pathname: query.path ?? "/" });
29
+ return await runInStoreCacheTenant(context, async () => {
30
+ const rateLimited = await enforceStorefrontRateLimit(container, req, context, "categories");
31
+ if (rateLimited) return rateLimited;
32
+ const body = await cachedGetStorefrontCategoryTree(container, context, query);
33
+ return NextResponse.json(body, { headers: storefrontSuccessHeaders(context, ANONYMOUS_CACHE_CONTROL) });
34
+ });
35
+ } catch (error) {
36
+ return storefrontRouteErrorResponse(error, {
37
+ message: "Storefront category tree failed",
38
+ code: "ecommerce.storefront_categories_failed"
39
+ });
40
+ }
41
+ }
42
+ var route_default = GET;
43
+ const storefrontCategoriesTag = "Ecommerce";
44
+ const storefrontCategoriesGetDoc = {
45
+ summary: "List the storefront category tree for the current buyer",
46
+ description: "Public. Resolves the store from the Host header and the optional portal session, then returns the visible category tree below `parentId` (the roots when omitted), `depth` levels deep (all levels when omitted). `productCount` is descendant-inclusive and counts only products inside the buyer's effective assortment; categories the buyer cannot browse are absent, and empty categories are absent unless `includeEmpty=true`. Past 10 000 products in the assortment the counts are not computed: every `productCount` is null and no category is dropped as empty. A `parentId` that is unknown or not visible to the buyer yields an empty tree, identical to a nonexistent one. A nested node beyond `depth` has empty `children` and `hasChildren: true`. Anonymous responses are `public, max-age=300, stale-while-revalidate=60`; authenticated responses are `private, no-store`. Cached server-side for 300 s per assortment scope. Rate limited per IP and store.",
47
+ tags: [storefrontCategoriesTag],
48
+ query: ecommerceStorefrontCategoryTreeQuerySchema,
49
+ responses: [
50
+ { status: 200, description: "The category tree within the buyer's assortment.", schema: storefrontCategoryTreeResponseSchema }
51
+ ],
52
+ errors: [
53
+ { status: 400, description: "Unknown, repeated or malformed query parameters", schema: storefrontInvalidQueryErrorSchema },
54
+ { status: 401, description: "Portal session invalid or issued for another tenant or organization", schema: storefrontErrorSchema },
55
+ { status: 403, description: "Draft store (only when OM_ECOMMERCE_DEV_STORE_SLUG=true)", schema: storefrontErrorSchema },
56
+ { status: 404, description: "No store serves this host or path", schema: storefrontErrorSchema },
57
+ { status: 410, description: "Store archived", schema: storefrontErrorSchema },
58
+ { status: 429, description: "Too many requests", schema: rateLimitErrorSchema },
59
+ { status: 503, description: "Store misconfigured (no default channel binding)", schema: storefrontErrorSchema }
60
+ ]
61
+ };
62
+ const openApi = {
63
+ tag: storefrontCategoriesTag,
64
+ summary: "Public storefront category tree",
65
+ methods: {
66
+ GET: storefrontCategoriesGetDoc
67
+ }
68
+ };
69
+ export {
70
+ GET,
71
+ route_default as default,
72
+ metadata,
73
+ openApi
74
+ };
75
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/ecommerce/api/storefront/categories/route.ts"],
4
+ "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport type { OpenApiMethodDoc, OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { rateLimitErrorSchema } from '@open-mercato/shared/lib/ratelimit/helpers'\nimport { ecommerceStorefrontCategoryTreeQuerySchema } from '../../../data/validators'\nimport { enforceStorefrontRateLimit } from '../../../lib/storefrontRateLimit'\nimport type { StoreContextService } from '../../../lib/storeContextService'\nimport { cachedGetStorefrontCategoryTree } from '../../../lib/storefrontCategoryCache'\nimport { parseStorefrontCategoryTreeQuery } from '../../../lib/storefrontQuery'\nimport {\n storefrontErrorSchema,\n storefrontInvalidQueryErrorSchema,\n storefrontRouteErrorResponse,\n storefrontSuccessHeaders,\n runInStoreCacheTenant,\n} from '../storefrontRouteSupport'\nimport { storefrontCategoryTreeResponseSchema } from './openapiSchemas'\n\nexport const metadata = {\n path: '/ecommerce/storefront/categories',\n GET: {\n requireAuth: false,\n },\n}\n\nconst ANONYMOUS_CACHE_CONTROL = 'public, max-age=300, stale-while-revalidate=60'\n\nexport async function GET(req: Request) {\n try {\n const query = parseStorefrontCategoryTreeQuery(new URL(req.url).searchParams)\n const container = await createRequestContainer()\n const service = container.resolve('storeContextService') as StoreContextService\n const context = await service.resolve(req, { pathname: query.path ?? '/' })\n return await runInStoreCacheTenant(context, async () => {\n const rateLimited = await enforceStorefrontRateLimit(container, req, context, 'categories')\n if (rateLimited) return rateLimited\n const body = await cachedGetStorefrontCategoryTree(container, context, query)\n return NextResponse.json(body, { headers: storefrontSuccessHeaders(context, ANONYMOUS_CACHE_CONTROL) })\n })\n } catch (error) {\n return storefrontRouteErrorResponse(error, {\n message: 'Storefront category tree failed',\n code: 'ecommerce.storefront_categories_failed',\n })\n }\n}\n\nexport default GET\n\nconst storefrontCategoriesTag = 'Ecommerce'\n\nconst storefrontCategoriesGetDoc: OpenApiMethodDoc = {\n summary: 'List the storefront category tree for the current buyer',\n description:\n 'Public. Resolves the store from the Host header and the optional portal session, then returns the visible category tree below `parentId` (the roots when omitted), `depth` levels deep (all levels when omitted). `productCount` is descendant-inclusive and counts only products inside the buyer\\'s effective assortment; categories the buyer cannot browse are absent, and empty categories are absent unless `includeEmpty=true`. Past 10 000 products in the assortment the counts are not computed: every `productCount` is null and no category is dropped as empty. A `parentId` that is unknown or not visible to the buyer yields an empty tree, identical to a nonexistent one. A nested node beyond `depth` has empty `children` and `hasChildren: true`. Anonymous responses are `public, max-age=300, stale-while-revalidate=60`; authenticated responses are `private, no-store`. Cached server-side for 300 s per assortment scope. Rate limited per IP and store.',\n tags: [storefrontCategoriesTag],\n query: ecommerceStorefrontCategoryTreeQuerySchema,\n responses: [\n { status: 200, description: 'The category tree within the buyer\\'s assortment.', schema: storefrontCategoryTreeResponseSchema },\n ],\n errors: [\n { status: 400, description: 'Unknown, repeated or malformed query parameters', schema: storefrontInvalidQueryErrorSchema },\n { status: 401, description: 'Portal session invalid or issued for another tenant or organization', schema: storefrontErrorSchema },\n { status: 403, description: 'Draft store (only when OM_ECOMMERCE_DEV_STORE_SLUG=true)', schema: storefrontErrorSchema },\n { status: 404, description: 'No store serves this host or path', schema: storefrontErrorSchema },\n { status: 410, description: 'Store archived', schema: storefrontErrorSchema },\n { status: 429, description: 'Too many requests', schema: rateLimitErrorSchema },\n { status: 503, description: 'Store misconfigured (no default channel binding)', schema: storefrontErrorSchema },\n ],\n}\n\nexport const openApi: OpenApiRouteDoc = {\n tag: storefrontCategoriesTag,\n summary: 'Public storefront category tree',\n methods: {\n GET: storefrontCategoriesGetDoc,\n },\n}\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AAEvC,SAAS,4BAA4B;AACrC,SAAS,kDAAkD;AAC3D,SAAS,kCAAkC;AAE3C,SAAS,uCAAuC;AAChD,SAAS,wCAAwC;AACjD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,4CAA4C;AAE9C,MAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,KAAK;AAAA,IACH,aAAa;AAAA,EACf;AACF;AAEA,MAAM,0BAA0B;AAEhC,eAAsB,IAAI,KAAc;AACtC,MAAI;AACF,UAAM,QAAQ,iCAAiC,IAAI,IAAI,IAAI,GAAG,EAAE,YAAY;AAC5E,UAAM,YAAY,MAAM,uBAAuB;AAC/C,UAAM,UAAU,UAAU,QAAQ,qBAAqB;AACvD,UAAM,UAAU,MAAM,QAAQ,QAAQ,KAAK,EAAE,UAAU,MAAM,QAAQ,IAAI,CAAC;AAC1E,WAAO,MAAM,sBAAsB,SAAS,YAAY;AACtD,YAAM,cAAc,MAAM,2BAA2B,WAAW,KAAK,SAAS,YAAY;AAC1F,UAAI,YAAa,QAAO;AACxB,YAAM,OAAO,MAAM,gCAAgC,WAAW,SAAS,KAAK;AAC5E,aAAO,aAAa,KAAK,MAAM,EAAE,SAAS,yBAAyB,SAAS,uBAAuB,EAAE,CAAC;AAAA,IACxG,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,6BAA6B,OAAO;AAAA,MACzC,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,IAAO,gBAAQ;AAEf,MAAM,0BAA0B;AAEhC,MAAM,6BAA+C;AAAA,EACnD,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM,CAAC,uBAAuB;AAAA,EAC9B,OAAO;AAAA,EACP,WAAW;AAAA,IACT,EAAE,QAAQ,KAAK,aAAa,oDAAqD,QAAQ,qCAAqC;AAAA,EAChI;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,QAAQ,KAAK,aAAa,mDAAmD,QAAQ,kCAAkC;AAAA,IACzH,EAAE,QAAQ,KAAK,aAAa,uEAAuE,QAAQ,sBAAsB;AAAA,IACjI,EAAE,QAAQ,KAAK,aAAa,4DAA4D,QAAQ,sBAAsB;AAAA,IACtH,EAAE,QAAQ,KAAK,aAAa,qCAAqC,QAAQ,sBAAsB;AAAA,IAC/F,EAAE,QAAQ,KAAK,aAAa,kBAAkB,QAAQ,sBAAsB;AAAA,IAC5E,EAAE,QAAQ,KAAK,aAAa,qBAAqB,QAAQ,qBAAqB;AAAA,IAC9E,EAAE,QAAQ,KAAK,aAAa,oDAAoD,QAAQ,sBAAsB;AAAA,EAChH;AACF;AAEO,MAAM,UAA2B;AAAA,EACtC,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,IACP,KAAK;AAAA,EACP;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,163 @@
1
+ import { NextResponse } from "next/server";
2
+ import { z } from "zod";
3
+ import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
4
+ import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
5
+ import { rateLimitErrorSchema } from "@open-mercato/shared/lib/ratelimit/helpers";
6
+ import { CustomerUser } from "@open-mercato/core/modules/customer_accounts/data/entities";
7
+ import { CustomerEntity } from "@open-mercato/core/modules/customers/data/entities";
8
+ import { ecommercePriceDisplayModeSchema, ecommerceStorefrontContextQuerySchema } from "../../../data/validators.js";
9
+ import { parseStorefrontContextQuery } from "../../../lib/storefrontQuery.js";
10
+ import { enforceStorefrontRateLimit } from "../../../lib/storefrontRateLimit.js";
11
+ import {
12
+ runInStoreCacheTenant,
13
+ storefrontErrorSchema,
14
+ storefrontInvalidQueryErrorSchema,
15
+ storefrontRouteErrorResponse,
16
+ storefrontSuccessHeaders
17
+ } from "../storefrontRouteSupport.js";
18
+ const metadata = {
19
+ path: "/ecommerce/storefront/context",
20
+ GET: {
21
+ requireAuth: false
22
+ }
23
+ };
24
+ const ANONYMOUS_CACHE_CONTROL = "public, max-age=60";
25
+ function projectStorefrontContext(context, names) {
26
+ const { store, buyer } = context;
27
+ return {
28
+ store: {
29
+ id: store.id,
30
+ code: store.code,
31
+ name: store.name,
32
+ slug: store.slug,
33
+ status: store.status,
34
+ defaultLocale: store.defaultLocale,
35
+ supportedLocales: [...store.supportedLocales],
36
+ defaultCurrencyCode: store.defaultCurrencyCode,
37
+ settings: store.settings
38
+ },
39
+ effectiveLocale: context.effectiveLocale,
40
+ requestedLocale: context.requestedLocale,
41
+ supportedLocales: [...store.supportedLocales],
42
+ currencyCode: context.currencyCode,
43
+ buyer: {
44
+ isAuthenticated: buyer.isAuthenticated,
45
+ taxMode: buyer.taxMode,
46
+ displayName: buyer.isAuthenticated ? names.displayName : null,
47
+ companyName: buyer.isAuthenticated ? names.companyName : null,
48
+ allowPurchaseOnAccount: buyer.allowPurchaseOnAccount
49
+ }
50
+ };
51
+ }
52
+ function nonEmptyOrNull(value) {
53
+ return typeof value === "string" && value.trim().length > 0 ? value : null;
54
+ }
55
+ async function loadBuyerNames(em, context) {
56
+ const { buyer } = context;
57
+ if (!buyer.isAuthenticated || !buyer.customerUserId) return { displayName: null, companyName: null };
58
+ const scope = { tenantId: context.tenantId, organizationId: context.organizationId };
59
+ const user = await findOneWithDecryption(
60
+ em,
61
+ CustomerUser,
62
+ { id: buyer.customerUserId, ...scope, deletedAt: null },
63
+ void 0,
64
+ scope
65
+ );
66
+ const company = buyer.companyId ? await findOneWithDecryption(
67
+ em,
68
+ CustomerEntity,
69
+ { id: buyer.companyId, ...scope, deletedAt: null },
70
+ void 0,
71
+ scope
72
+ ) : null;
73
+ return {
74
+ displayName: nonEmptyOrNull(user?.displayName),
75
+ companyName: nonEmptyOrNull(company?.displayName)
76
+ };
77
+ }
78
+ async function GET(req) {
79
+ try {
80
+ const query = parseStorefrontContextQuery(new URL(req.url).searchParams);
81
+ const container = await createRequestContainer();
82
+ const service = container.resolve("storeContextService");
83
+ const context = await service.resolve(req, { pathname: query.path ?? "/" });
84
+ return await runInStoreCacheTenant(context, async () => {
85
+ const rateLimited = await enforceStorefrontRateLimit(container, req, context, "context");
86
+ if (rateLimited) return rateLimited;
87
+ const em = container.resolve("em");
88
+ const names = await loadBuyerNames(em, context);
89
+ const body = projectStorefrontContext(context, names);
90
+ return NextResponse.json(body, { headers: storefrontSuccessHeaders(context, ANONYMOUS_CACHE_CONTROL) });
91
+ });
92
+ } catch (error) {
93
+ return storefrontRouteErrorResponse(error, {
94
+ message: "Storefront context resolution failed",
95
+ code: "ecommerce.storefront_context_failed"
96
+ });
97
+ }
98
+ }
99
+ var route_default = GET;
100
+ const storefrontContextTag = "Ecommerce";
101
+ const storefrontContextResponseSchema = z.object({
102
+ store: z.object({
103
+ id: z.string().uuid(),
104
+ code: z.string(),
105
+ name: z.string(),
106
+ slug: z.string(),
107
+ status: z.literal("active"),
108
+ defaultLocale: z.string(),
109
+ supportedLocales: z.array(z.string()),
110
+ defaultCurrencyCode: z.string(),
111
+ settings: z.record(z.string(), z.unknown())
112
+ }),
113
+ effectiveLocale: z.string(),
114
+ requestedLocale: z.string().nullable(),
115
+ supportedLocales: z.array(z.string()),
116
+ currencyCode: z.string(),
117
+ buyer: z.object({
118
+ isAuthenticated: z.boolean(),
119
+ taxMode: ecommercePriceDisplayModeSchema,
120
+ displayName: z.string().nullable(),
121
+ companyName: z.string().nullable(),
122
+ allowPurchaseOnAccount: z.boolean()
123
+ })
124
+ });
125
+ const storefrontContextBadRequestSchema = z.union([storefrontInvalidQueryErrorSchema, storefrontErrorSchema]);
126
+ const storefrontContextGetDoc = {
127
+ summary: "Resolve the storefront context for the current host",
128
+ description: "Public, unauthenticated. Resolves the store from the Host header (or `storeSlug` when OM_ECOMMERCE_DEV_STORE_SLUG=true) and the optional portal session, and returns a safe projection of the store and buyer context. Anonymous responses are `public, max-age=60`; authenticated responses are `private, no-store`. Rate limited per IP and store.",
129
+ tags: [storefrontContextTag],
130
+ query: ecommerceStorefrontContextQuerySchema,
131
+ responses: [
132
+ { status: 200, description: "Storefront context resolved.", schema: storefrontContextResponseSchema }
133
+ ],
134
+ errors: [
135
+ {
136
+ status: 400,
137
+ description: "Unknown, repeated or malformed query parameters, or storeSlug used while the development flag is off",
138
+ schema: storefrontContextBadRequestSchema
139
+ },
140
+ { status: 401, description: "Portal session invalid or issued for another tenant or organization", schema: storefrontErrorSchema },
141
+ { status: 403, description: "Draft store (only when OM_ECOMMERCE_DEV_STORE_SLUG=true)", schema: storefrontErrorSchema },
142
+ { status: 404, description: "No store serves this host or path", schema: storefrontErrorSchema },
143
+ { status: 410, description: "Store archived", schema: storefrontErrorSchema },
144
+ { status: 429, description: "Too many requests", schema: rateLimitErrorSchema },
145
+ { status: 503, description: "Store misconfigured (no default channel binding)", schema: storefrontErrorSchema }
146
+ ]
147
+ };
148
+ const openApi = {
149
+ tag: storefrontContextTag,
150
+ summary: "Public storefront context",
151
+ methods: {
152
+ GET: storefrontContextGetDoc
153
+ }
154
+ };
155
+ export {
156
+ GET,
157
+ route_default as default,
158
+ metadata,
159
+ openApi,
160
+ projectStorefrontContext,
161
+ storefrontContextResponseSchema
162
+ };
163
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/ecommerce/api/storefront/context/route.ts"],
4
+ "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport type { OpenApiMethodDoc, OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { rateLimitErrorSchema } from '@open-mercato/shared/lib/ratelimit/helpers'\nimport { CustomerUser } from '@open-mercato/core/modules/customer_accounts/data/entities'\nimport { CustomerEntity } from '@open-mercato/core/modules/customers/data/entities'\nimport { ecommercePriceDisplayModeSchema, ecommerceStorefrontContextQuerySchema } from '../../../data/validators'\nimport { parseStorefrontContextQuery } from '../../../lib/storefrontQuery'\nimport { enforceStorefrontRateLimit } from '../../../lib/storefrontRateLimit'\nimport type { StoreContextService } from '../../../lib/storeContextService'\nimport type { StoreContext } from '../../../lib/types'\nimport {\n runInStoreCacheTenant,\n storefrontErrorSchema,\n storefrontInvalidQueryErrorSchema,\n storefrontRouteErrorResponse,\n storefrontSuccessHeaders,\n} from '../storefrontRouteSupport'\n\nexport const metadata = {\n path: '/ecommerce/storefront/context',\n GET: {\n requireAuth: false,\n },\n}\n\nconst ANONYMOUS_CACHE_CONTROL = 'public, max-age=60'\n\nexport type StorefrontBuyerNames = {\n displayName: string | null\n companyName: string | null\n}\n\nexport type StorefrontContextResponse = {\n store: {\n id: string\n code: string\n name: string\n slug: string\n status: 'active'\n defaultLocale: string\n supportedLocales: string[]\n defaultCurrencyCode: string\n settings: StoreContext['store']['settings']\n }\n effectiveLocale: string\n requestedLocale: string | null\n supportedLocales: string[]\n currencyCode: string\n buyer: {\n isAuthenticated: boolean\n taxMode: StoreContext['buyer']['taxMode']\n displayName: string | null\n companyName: string | null\n allowPurchaseOnAccount: boolean\n }\n}\n\nexport function projectStorefrontContext(context: StoreContext, names: StorefrontBuyerNames): StorefrontContextResponse {\n const { store, buyer } = context\n return {\n store: {\n id: store.id,\n code: store.code,\n name: store.name,\n slug: store.slug,\n status: store.status,\n defaultLocale: store.defaultLocale,\n supportedLocales: [...store.supportedLocales],\n defaultCurrencyCode: store.defaultCurrencyCode,\n settings: store.settings,\n },\n effectiveLocale: context.effectiveLocale,\n requestedLocale: context.requestedLocale,\n supportedLocales: [...store.supportedLocales],\n currencyCode: context.currencyCode,\n buyer: {\n isAuthenticated: buyer.isAuthenticated,\n taxMode: buyer.taxMode,\n displayName: buyer.isAuthenticated ? names.displayName : null,\n companyName: buyer.isAuthenticated ? names.companyName : null,\n allowPurchaseOnAccount: buyer.allowPurchaseOnAccount,\n },\n }\n}\n\nfunction nonEmptyOrNull(value: string | null | undefined): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value : null\n}\n\nasync function loadBuyerNames(em: EntityManager, context: StoreContext): Promise<StorefrontBuyerNames> {\n const { buyer } = context\n if (!buyer.isAuthenticated || !buyer.customerUserId) return { displayName: null, companyName: null }\n const scope = { tenantId: context.tenantId, organizationId: context.organizationId }\n const user = await findOneWithDecryption(\n em,\n CustomerUser,\n { id: buyer.customerUserId, ...scope, deletedAt: null },\n undefined,\n scope,\n )\n const company = buyer.companyId\n ? await findOneWithDecryption(\n em,\n CustomerEntity,\n { id: buyer.companyId, ...scope, deletedAt: null },\n undefined,\n scope,\n )\n : null\n return {\n displayName: nonEmptyOrNull(user?.displayName),\n companyName: nonEmptyOrNull(company?.displayName),\n }\n}\n\nexport async function GET(req: Request) {\n try {\n const query = parseStorefrontContextQuery(new URL(req.url).searchParams)\n const container = await createRequestContainer()\n const service = container.resolve('storeContextService') as StoreContextService\n const context = await service.resolve(req, { pathname: query.path ?? '/' })\n return await runInStoreCacheTenant(context, async () => {\n const rateLimited = await enforceStorefrontRateLimit(container, req, context, 'context')\n if (rateLimited) return rateLimited\n const em = container.resolve('em') as EntityManager\n const names = await loadBuyerNames(em, context)\n const body = projectStorefrontContext(context, names)\n return NextResponse.json(body, { headers: storefrontSuccessHeaders(context, ANONYMOUS_CACHE_CONTROL) })\n })\n } catch (error) {\n return storefrontRouteErrorResponse(error, {\n message: 'Storefront context resolution failed',\n code: 'ecommerce.storefront_context_failed',\n })\n }\n}\n\nexport default GET\n\nconst storefrontContextTag = 'Ecommerce'\n\nexport const storefrontContextResponseSchema = z.object({\n store: z.object({\n id: z.string().uuid(),\n code: z.string(),\n name: z.string(),\n slug: z.string(),\n status: z.literal('active'),\n defaultLocale: z.string(),\n supportedLocales: z.array(z.string()),\n defaultCurrencyCode: z.string(),\n settings: z.record(z.string(), z.unknown()),\n }),\n effectiveLocale: z.string(),\n requestedLocale: z.string().nullable(),\n supportedLocales: z.array(z.string()),\n currencyCode: z.string(),\n buyer: z.object({\n isAuthenticated: z.boolean(),\n taxMode: ecommercePriceDisplayModeSchema,\n displayName: z.string().nullable(),\n companyName: z.string().nullable(),\n allowPurchaseOnAccount: z.boolean(),\n }),\n})\n\nconst storefrontContextBadRequestSchema = z.union([storefrontInvalidQueryErrorSchema, storefrontErrorSchema])\n\nconst storefrontContextGetDoc: OpenApiMethodDoc = {\n summary: 'Resolve the storefront context for the current host',\n description:\n 'Public, unauthenticated. Resolves the store from the Host header (or `storeSlug` when OM_ECOMMERCE_DEV_STORE_SLUG=true) and the optional portal session, and returns a safe projection of the store and buyer context. Anonymous responses are `public, max-age=60`; authenticated responses are `private, no-store`. Rate limited per IP and store.',\n tags: [storefrontContextTag],\n query: ecommerceStorefrontContextQuerySchema,\n responses: [\n { status: 200, description: 'Storefront context resolved.', schema: storefrontContextResponseSchema },\n ],\n errors: [\n {\n status: 400,\n description: 'Unknown, repeated or malformed query parameters, or storeSlug used while the development flag is off',\n schema: storefrontContextBadRequestSchema,\n },\n { status: 401, description: 'Portal session invalid or issued for another tenant or organization', schema: storefrontErrorSchema },\n { status: 403, description: 'Draft store (only when OM_ECOMMERCE_DEV_STORE_SLUG=true)', schema: storefrontErrorSchema },\n { status: 404, description: 'No store serves this host or path', schema: storefrontErrorSchema },\n { status: 410, description: 'Store archived', schema: storefrontErrorSchema },\n { status: 429, description: 'Too many requests', schema: rateLimitErrorSchema },\n { status: 503, description: 'Store misconfigured (no default channel binding)', schema: storefrontErrorSchema },\n ],\n}\n\nexport const openApi: OpenApiRouteDoc = {\n tag: storefrontContextTag,\n summary: 'Public storefront context',\n methods: {\n GET: storefrontContextGetDoc,\n },\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,87 @@
1
+ import { NextResponse } from "next/server";
2
+ import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
3
+ import { rateLimitErrorSchema } from "@open-mercato/shared/lib/ratelimit/helpers";
4
+ import {
5
+ ecommerceStorefrontProductDetailQuerySchema,
6
+ ecommerceStorefrontProductParamsSchema
7
+ } from "../../../../data/validators.js";
8
+ import { enforceStorefrontRateLimit } from "../../../../lib/storefrontRateLimit.js";
9
+ import { cachedGetStorefrontProductDetail } from "../../../../lib/storefrontProductCache.js";
10
+ import { parseStorefrontProductDetailQuery } from "../../../../lib/storefrontQuery.js";
11
+ import {
12
+ storefrontErrorResponse,
13
+ storefrontErrorSchema,
14
+ storefrontInvalidQueryErrorSchema,
15
+ storefrontRouteErrorResponse,
16
+ storefrontSuccessHeaders,
17
+ runInStoreCacheTenant
18
+ } from "../../storefrontRouteSupport.js";
19
+ import { storefrontProductDetailResponseSchema } from "../openapiSchemas.js";
20
+ const metadata = {
21
+ path: "/ecommerce/storefront/products/[idOrHandle]",
22
+ GET: {
23
+ requireAuth: false
24
+ }
25
+ };
26
+ const ANONYMOUS_CACHE_CONTROL = "public, max-age=60";
27
+ const PRODUCT_NOT_FOUND = { error: "product_not_found" };
28
+ async function GET(req, routeContext = {}) {
29
+ try {
30
+ const query = parseStorefrontProductDetailQuery(new URL(req.url).searchParams);
31
+ const container = await createRequestContainer();
32
+ const service = container.resolve("storeContextService");
33
+ const context = await service.resolve(req, { pathname: query.path ?? "/" });
34
+ return await runInStoreCacheTenant(context, async () => {
35
+ const rateLimited = await enforceStorefrontRateLimit(container, req, context, "productDetail");
36
+ if (rateLimited) return rateLimited;
37
+ const params = ecommerceStorefrontProductParamsSchema.safeParse(await routeContext.params ?? {});
38
+ if (!params.success) return storefrontErrorResponse(404, { ...PRODUCT_NOT_FOUND });
39
+ const detail = await cachedGetStorefrontProductDetail(container, context, params.data.idOrHandle, {
40
+ variantId: query.variantId ?? null,
41
+ locale: query.locale ?? null
42
+ });
43
+ if (!detail) return storefrontErrorResponse(404, { ...PRODUCT_NOT_FOUND });
44
+ return NextResponse.json(detail, { headers: storefrontSuccessHeaders(context, ANONYMOUS_CACHE_CONTROL) });
45
+ });
46
+ } catch (error) {
47
+ return storefrontRouteErrorResponse(error, {
48
+ message: "Storefront product detail failed",
49
+ code: "ecommerce.storefront_product_detail_failed"
50
+ });
51
+ }
52
+ }
53
+ var route_default = GET;
54
+ const storefrontProductTag = "Ecommerce";
55
+ const storefrontProductGetDoc = {
56
+ summary: "Get one storefront product for the current buyer",
57
+ description: 'Public. Resolves the store from the Host header and the optional portal session, then returns the product by UUID or handle with buyer-resolved prices per variant. A product that does not exist, is inactive, deleted, of another tenant or outside the buyer\'s effective assortment answers the same 404 `{ "error": "product_not_found" }`. `variantId` preselects a variant; top-level `priceTiers` are the selected variant\'s tiers. Anonymous responses are `public, max-age=60`; authenticated responses are `private, no-store`. Cached server-side for 60 s per buyer context digest. Rate limited per IP and store.',
58
+ tags: [storefrontProductTag],
59
+ pathParams: ecommerceStorefrontProductParamsSchema,
60
+ query: ecommerceStorefrontProductDetailQuerySchema,
61
+ responses: [
62
+ { status: 200, description: "The product as this buyer sees it.", schema: storefrontProductDetailResponseSchema }
63
+ ],
64
+ errors: [
65
+ { status: 400, description: "Unknown, repeated or malformed query parameters", schema: storefrontInvalidQueryErrorSchema },
66
+ { status: 401, description: "Portal session invalid or issued for another tenant or organization", schema: storefrontErrorSchema },
67
+ { status: 403, description: "Draft store (only when OM_ECOMMERCE_DEV_STORE_SLUG=true)", schema: storefrontErrorSchema },
68
+ { status: 404, description: "No store serves this host or path, or the product is not visible to this buyer", schema: storefrontErrorSchema },
69
+ { status: 410, description: "Store archived", schema: storefrontErrorSchema },
70
+ { status: 429, description: "Too many requests", schema: rateLimitErrorSchema },
71
+ { status: 503, description: "Store misconfigured (no default channel binding)", schema: storefrontErrorSchema }
72
+ ]
73
+ };
74
+ const openApi = {
75
+ tag: storefrontProductTag,
76
+ summary: "Public storefront product detail",
77
+ methods: {
78
+ GET: storefrontProductGetDoc
79
+ }
80
+ };
81
+ export {
82
+ GET,
83
+ route_default as default,
84
+ metadata,
85
+ openApi
86
+ };
87
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/ecommerce/api/storefront/products/%5BidOrHandle%5D/route.ts"],
4
+ "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport type { OpenApiMethodDoc, OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { rateLimitErrorSchema } from '@open-mercato/shared/lib/ratelimit/helpers'\nimport {\n ecommerceStorefrontProductDetailQuerySchema,\n ecommerceStorefrontProductParamsSchema,\n} from '../../../../data/validators'\nimport { enforceStorefrontRateLimit } from '../../../../lib/storefrontRateLimit'\nimport type { StoreContextService } from '../../../../lib/storeContextService'\nimport { cachedGetStorefrontProductDetail } from '../../../../lib/storefrontProductCache'\nimport { parseStorefrontProductDetailQuery } from '../../../../lib/storefrontQuery'\nimport {\n storefrontErrorResponse,\n storefrontErrorSchema,\n storefrontInvalidQueryErrorSchema,\n storefrontRouteErrorResponse,\n storefrontSuccessHeaders,\n runInStoreCacheTenant,\n} from '../../storefrontRouteSupport'\nimport { storefrontProductDetailResponseSchema } from '../openapiSchemas'\n\nexport const metadata = {\n path: '/ecommerce/storefront/products/[idOrHandle]',\n GET: {\n requireAuth: false,\n },\n}\n\nconst ANONYMOUS_CACHE_CONTROL = 'public, max-age=60'\nconst PRODUCT_NOT_FOUND = { error: 'product_not_found' } as const\n\ntype ProductRouteParams = { idOrHandle?: string }\n\ntype ProductRouteContext = { params?: ProductRouteParams | Promise<ProductRouteParams> }\n\nexport async function GET(req: Request, routeContext: ProductRouteContext = {}) {\n try {\n const query = parseStorefrontProductDetailQuery(new URL(req.url).searchParams)\n const container = await createRequestContainer()\n const service = container.resolve('storeContextService') as StoreContextService\n const context = await service.resolve(req, { pathname: query.path ?? '/' })\n return await runInStoreCacheTenant(context, async () => {\n const rateLimited = await enforceStorefrontRateLimit(container, req, context, 'productDetail')\n if (rateLimited) return rateLimited\n const params = ecommerceStorefrontProductParamsSchema.safeParse((await routeContext.params) ?? {})\n if (!params.success) return storefrontErrorResponse(404, { ...PRODUCT_NOT_FOUND })\n const detail = await cachedGetStorefrontProductDetail(container, context, params.data.idOrHandle, {\n variantId: query.variantId ?? null,\n locale: query.locale ?? null,\n })\n if (!detail) return storefrontErrorResponse(404, { ...PRODUCT_NOT_FOUND })\n return NextResponse.json(detail, { headers: storefrontSuccessHeaders(context, ANONYMOUS_CACHE_CONTROL) })\n })\n } catch (error) {\n return storefrontRouteErrorResponse(error, {\n message: 'Storefront product detail failed',\n code: 'ecommerce.storefront_product_detail_failed',\n })\n }\n}\n\nexport default GET\n\nconst storefrontProductTag = 'Ecommerce'\n\nconst storefrontProductGetDoc: OpenApiMethodDoc = {\n summary: 'Get one storefront product for the current buyer',\n description:\n 'Public. Resolves the store from the Host header and the optional portal session, then returns the product by UUID or handle with buyer-resolved prices per variant. A product that does not exist, is inactive, deleted, of another tenant or outside the buyer\\'s effective assortment answers the same 404 `{ \"error\": \"product_not_found\" }`. `variantId` preselects a variant; top-level `priceTiers` are the selected variant\\'s tiers. Anonymous responses are `public, max-age=60`; authenticated responses are `private, no-store`. Cached server-side for 60 s per buyer context digest. Rate limited per IP and store.',\n tags: [storefrontProductTag],\n pathParams: ecommerceStorefrontProductParamsSchema,\n query: ecommerceStorefrontProductDetailQuerySchema,\n responses: [\n { status: 200, description: 'The product as this buyer sees it.', schema: storefrontProductDetailResponseSchema },\n ],\n errors: [\n { status: 400, description: 'Unknown, repeated or malformed query parameters', schema: storefrontInvalidQueryErrorSchema },\n { status: 401, description: 'Portal session invalid or issued for another tenant or organization', schema: storefrontErrorSchema },\n { status: 403, description: 'Draft store (only when OM_ECOMMERCE_DEV_STORE_SLUG=true)', schema: storefrontErrorSchema },\n { status: 404, description: 'No store serves this host or path, or the product is not visible to this buyer', schema: storefrontErrorSchema },\n { status: 410, description: 'Store archived', schema: storefrontErrorSchema },\n { status: 429, description: 'Too many requests', schema: rateLimitErrorSchema },\n { status: 503, description: 'Store misconfigured (no default channel binding)', schema: storefrontErrorSchema },\n ],\n}\n\nexport const openApi: OpenApiRouteDoc = {\n tag: storefrontProductTag,\n summary: 'Public storefront product detail',\n methods: {\n GET: storefrontProductGetDoc,\n },\n}\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AAEvC,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,kCAAkC;AAE3C,SAAS,wCAAwC;AACjD,SAAS,yCAAyC;AAClD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,6CAA6C;AAE/C,MAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,KAAK;AAAA,IACH,aAAa;AAAA,EACf;AACF;AAEA,MAAM,0BAA0B;AAChC,MAAM,oBAAoB,EAAE,OAAO,oBAAoB;AAMvD,eAAsB,IAAI,KAAc,eAAoC,CAAC,GAAG;AAC9E,MAAI;AACF,UAAM,QAAQ,kCAAkC,IAAI,IAAI,IAAI,GAAG,EAAE,YAAY;AAC7E,UAAM,YAAY,MAAM,uBAAuB;AAC/C,UAAM,UAAU,UAAU,QAAQ,qBAAqB;AACvD,UAAM,UAAU,MAAM,QAAQ,QAAQ,KAAK,EAAE,UAAU,MAAM,QAAQ,IAAI,CAAC;AAC1E,WAAO,MAAM,sBAAsB,SAAS,YAAY;AACtD,YAAM,cAAc,MAAM,2BAA2B,WAAW,KAAK,SAAS,eAAe;AAC7F,UAAI,YAAa,QAAO;AACxB,YAAM,SAAS,uCAAuC,UAAW,MAAM,aAAa,UAAW,CAAC,CAAC;AACjG,UAAI,CAAC,OAAO,QAAS,QAAO,wBAAwB,KAAK,EAAE,GAAG,kBAAkB,CAAC;AACjF,YAAM,SAAS,MAAM,iCAAiC,WAAW,SAAS,OAAO,KAAK,YAAY;AAAA,QAChG,WAAW,MAAM,aAAa;AAAA,QAC9B,QAAQ,MAAM,UAAU;AAAA,MAC1B,CAAC;AACD,UAAI,CAAC,OAAQ,QAAO,wBAAwB,KAAK,EAAE,GAAG,kBAAkB,CAAC;AACzE,aAAO,aAAa,KAAK,QAAQ,EAAE,SAAS,yBAAyB,SAAS,uBAAuB,EAAE,CAAC;AAAA,IAC1G,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,6BAA6B,OAAO;AAAA,MACzC,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,IAAO,gBAAQ;AAEf,MAAM,uBAAuB;AAE7B,MAAM,0BAA4C;AAAA,EAChD,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM,CAAC,oBAAoB;AAAA,EAC3B,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,IACT,EAAE,QAAQ,KAAK,aAAa,sCAAsC,QAAQ,sCAAsC;AAAA,EAClH;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,QAAQ,KAAK,aAAa,mDAAmD,QAAQ,kCAAkC;AAAA,IACzH,EAAE,QAAQ,KAAK,aAAa,uEAAuE,QAAQ,sBAAsB;AAAA,IACjI,EAAE,QAAQ,KAAK,aAAa,4DAA4D,QAAQ,sBAAsB;AAAA,IACtH,EAAE,QAAQ,KAAK,aAAa,kFAAkF,QAAQ,sBAAsB;AAAA,IAC5I,EAAE,QAAQ,KAAK,aAAa,kBAAkB,QAAQ,sBAAsB;AAAA,IAC5E,EAAE,QAAQ,KAAK,aAAa,qBAAqB,QAAQ,qBAAqB;AAAA,IAC9E,EAAE,QAAQ,KAAK,aAAa,oDAAoD,QAAQ,sBAAsB;AAAA,EAChH;AACF;AAEO,MAAM,UAA2B;AAAA,EACtC,KAAK;AAAA,EACL,SAAS;AAAA,EACT,SAAS;AAAA,IACP,KAAK;AAAA,EACP;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,177 @@
1
+ import { z } from "zod";
2
+ import { CATALOG_PRODUCT_TYPES } from "@open-mercato/core/modules/catalog/data/types";
3
+ import {
4
+ ecommercePriceDisplayModeSchema,
5
+ ecommercePriceSortFallbackSchema,
6
+ ecommerceStorefrontProductSortSchema
7
+ } from "../../../data/validators.js";
8
+ const availabilityStateSchema = z.enum(["in_stock", "low_stock", "out_of_stock", "backorder", "preorder", "not_tracked"]);
9
+ const storefrontPriceSchema = z.object({
10
+ currencyCode: z.string(),
11
+ displayMode: ecommercePriceDisplayModeSchema,
12
+ amount: z.number(),
13
+ formatted: z.string(),
14
+ isPromotion: z.boolean(),
15
+ originalAmount: z.number().nullable(),
16
+ formattedOriginal: z.string().nullable(),
17
+ lowestPriorAmount: z.number().nullable(),
18
+ formattedLowestPrior: z.string().nullable()
19
+ });
20
+ const storefrontPriceRangeSchema = z.object({
21
+ min: z.number(),
22
+ max: z.number(),
23
+ formattedMin: z.string(),
24
+ formattedMax: z.string()
25
+ });
26
+ const storefrontPriceTierSchema = z.object({
27
+ minQuantity: z.number(),
28
+ maxQuantity: z.number().nullable(),
29
+ amount: z.number(),
30
+ formatted: z.string()
31
+ });
32
+ const storefrontAvailabilitySchema = z.object({
33
+ state: availabilityStateSchema,
34
+ canFulfil: z.boolean(),
35
+ leadTimeDays: z.number().nullable(),
36
+ releaseAt: z.string().nullable()
37
+ });
38
+ const storefrontProductListItemSchema = z.object({
39
+ id: z.string().uuid(),
40
+ handle: z.string().nullable(),
41
+ title: z.string(),
42
+ subtitle: z.string().nullable(),
43
+ defaultMediaUrl: z.string().nullable(),
44
+ productType: z.string(),
45
+ isConfigurable: z.boolean(),
46
+ hasVariants: z.boolean(),
47
+ variantCount: z.number().int(),
48
+ categories: z.array(z.object({ id: z.string().uuid(), name: z.string(), slug: z.string().nullable() })),
49
+ tags: z.array(z.string()),
50
+ price: storefrontPriceSchema.nullable(),
51
+ priceRange: storefrontPriceRangeSchema.nullable(),
52
+ availability: storefrontAvailabilitySchema,
53
+ badges: z.array(z.string())
54
+ });
55
+ const storefrontFacetsSchema = z.object({
56
+ categories: z.array(
57
+ z.object({
58
+ id: z.string().uuid(),
59
+ name: z.string(),
60
+ slug: z.string().nullable(),
61
+ depth: z.number().int(),
62
+ parentId: z.string().uuid().nullable(),
63
+ count: z.number().int()
64
+ })
65
+ ),
66
+ tags: z.array(z.object({ slug: z.string(), label: z.string(), count: z.number().int() })),
67
+ priceRange: z.object({ min: z.number(), max: z.number(), currencyCode: z.string() }).nullable(),
68
+ options: z.array(
69
+ z.object({
70
+ code: z.string(),
71
+ label: z.string(),
72
+ values: z.array(z.object({ code: z.string(), label: z.string(), count: z.number().int() }))
73
+ })
74
+ ),
75
+ productTypes: z.array(z.object({ type: z.string(), label: z.string(), count: z.number().int() })),
76
+ availability: z.array(z.object({ state: availabilityStateSchema, count: z.number().int() })),
77
+ availabilityScope: z.literal("page"),
78
+ total: z.number().int()
79
+ });
80
+ const storefrontAppliedFiltersSchema = z.object({
81
+ search: z.string().optional(),
82
+ category: z.object({ id: z.string().uuid(), slug: z.string().nullable(), includesDescendants: z.literal(true) }).optional(),
83
+ tagSlugs: z.array(z.string()).optional(),
84
+ price: z.object({ min: z.number().nullable(), max: z.number().nullable(), approximate: z.boolean() }).optional(),
85
+ options: z.record(z.string(), z.array(z.string())).optional(),
86
+ productType: z.enum(CATALOG_PRODUCT_TYPES).optional(),
87
+ availability: z.object({ value: z.enum(["in_stock", "available"]), scope: z.literal("page") }).optional()
88
+ });
89
+ const storefrontProductListResponseSchema = z.object({
90
+ items: z.array(storefrontProductListItemSchema),
91
+ total: z.number().int(),
92
+ page: z.number().int(),
93
+ pageSize: z.number().int(),
94
+ totalPages: z.number().int(),
95
+ facets: storefrontFacetsSchema.describe(
96
+ "Cross-excluded facet counts over the buyer assortment; priceRange is buyer-priced, availability counts the returned page"
97
+ ),
98
+ effectiveLocale: z.string(),
99
+ requestedLocale: z.string().nullable(),
100
+ currencyCode: z.string(),
101
+ taxMode: ecommercePriceDisplayModeSchema,
102
+ appliedFilters: storefrontAppliedFiltersSchema,
103
+ availableSorts: z.array(ecommerceStorefrontProductSortSchema),
104
+ appliedSort: ecommerceStorefrontProductSortSchema,
105
+ priceSort: z.object({ cap: z.number().int(), fallback: ecommercePriceSortFallbackSchema, capExceeded: z.boolean() }),
106
+ sortApproximate: z.boolean(),
107
+ sortUnavailable: z.boolean()
108
+ });
109
+ const dimensionsSchema = z.object({
110
+ length: z.number().nullable(),
111
+ width: z.number().nullable(),
112
+ height: z.number().nullable(),
113
+ unit: z.string().nullable()
114
+ }).nullable();
115
+ const optionSchemaSchema = z.object({
116
+ version: z.number().int().optional(),
117
+ name: z.string().nullable().optional(),
118
+ description: z.string().nullable().optional(),
119
+ options: z.array(
120
+ z.object({
121
+ code: z.string(),
122
+ label: z.string(),
123
+ description: z.string().nullable().optional(),
124
+ inputType: z.string(),
125
+ isRequired: z.boolean().optional(),
126
+ isMultiple: z.boolean().optional(),
127
+ choices: z.array(z.object({ code: z.string(), label: z.string().nullable().optional() })).optional()
128
+ })
129
+ )
130
+ }).nullable();
131
+ const storefrontProductDetailResponseSchema = storefrontProductListItemSchema.omit({ categories: true }).extend({
132
+ description: z.string().nullable(),
133
+ sku: z.string().nullable(),
134
+ media: z.array(z.object({ id: z.string(), url: z.string(), alt: z.string().nullable(), sortOrder: z.number().int() })),
135
+ dimensions: dimensionsSchema,
136
+ weightValue: z.number().nullable(),
137
+ weightUnit: z.string().nullable(),
138
+ categories: z.array(
139
+ z.object({ id: z.string().uuid(), name: z.string(), slug: z.string().nullable(), ancestorIds: z.array(z.string().uuid()) })
140
+ ),
141
+ breadcrumb: z.array(z.object({ id: z.string().uuid(), name: z.string(), slug: z.string().nullable() })),
142
+ optionSchema: optionSchemaSchema,
143
+ variants: z.array(
144
+ z.object({
145
+ id: z.string().uuid(),
146
+ name: z.string(),
147
+ sku: z.string().nullable(),
148
+ optionValues: z.record(z.string(), z.string()),
149
+ isDefault: z.boolean(),
150
+ price: storefrontPriceSchema.nullable(),
151
+ priceTiers: z.array(storefrontPriceTierSchema).describe("Quantity tiers of this variant for this buyer"),
152
+ availability: storefrontAvailabilitySchema,
153
+ dimensions: dimensionsSchema,
154
+ weightValue: z.number().nullable(),
155
+ weightUnit: z.string().nullable()
156
+ })
157
+ ),
158
+ selectedVariantId: z.string().uuid().nullable().describe("The requested variantId when it is one of variants, else the default variant, else null"),
159
+ quantityRules: z.object({
160
+ minOrderQuantity: z.number().nullable(),
161
+ maxOrderQuantity: z.number().nullable(),
162
+ quantityIncrement: z.number().nullable()
163
+ }),
164
+ priceTiers: z.array(storefrontPriceTierSchema).describe("Quantity tiers of selectedVariantId when one is selected, else of the product"),
165
+ relatedProducts: z.array(storefrontProductListItemSchema).max(8),
166
+ seo: z.object({ title: z.string().nullable(), description: z.string().nullable(), canonicalUrl: z.string().nullable() })
167
+ });
168
+ export {
169
+ storefrontAvailabilitySchema,
170
+ storefrontPriceRangeSchema,
171
+ storefrontPriceSchema,
172
+ storefrontPriceTierSchema,
173
+ storefrontProductDetailResponseSchema,
174
+ storefrontProductListItemSchema,
175
+ storefrontProductListResponseSchema
176
+ };
177
+ //# sourceMappingURL=openapiSchemas.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/ecommerce/api/storefront/products/openapiSchemas.ts"],
4
+ "sourcesContent": ["import { z } from 'zod'\nimport { CATALOG_PRODUCT_TYPES } from '@open-mercato/core/modules/catalog/data/types'\nimport {\n ecommercePriceDisplayModeSchema,\n ecommercePriceSortFallbackSchema,\n ecommerceStorefrontProductSortSchema,\n} from '../../../data/validators'\n\nconst availabilityStateSchema = z.enum(['in_stock', 'low_stock', 'out_of_stock', 'backorder', 'preorder', 'not_tracked'])\n\nexport const storefrontPriceSchema = z.object({\n currencyCode: z.string(),\n displayMode: ecommercePriceDisplayModeSchema,\n amount: z.number(),\n formatted: z.string(),\n isPromotion: z.boolean(),\n originalAmount: z.number().nullable(),\n formattedOriginal: z.string().nullable(),\n lowestPriorAmount: z.number().nullable(),\n formattedLowestPrior: z.string().nullable(),\n})\n\nexport const storefrontPriceRangeSchema = z.object({\n min: z.number(),\n max: z.number(),\n formattedMin: z.string(),\n formattedMax: z.string(),\n})\n\nexport const storefrontPriceTierSchema = z.object({\n minQuantity: z.number(),\n maxQuantity: z.number().nullable(),\n amount: z.number(),\n formatted: z.string(),\n})\n\nexport const storefrontAvailabilitySchema = z.object({\n state: availabilityStateSchema,\n canFulfil: z.boolean(),\n leadTimeDays: z.number().nullable(),\n releaseAt: z.string().nullable(),\n})\n\nexport const storefrontProductListItemSchema = z.object({\n id: z.string().uuid(),\n handle: z.string().nullable(),\n title: z.string(),\n subtitle: z.string().nullable(),\n defaultMediaUrl: z.string().nullable(),\n productType: z.string(),\n isConfigurable: z.boolean(),\n hasVariants: z.boolean(),\n variantCount: z.number().int(),\n categories: z.array(z.object({ id: z.string().uuid(), name: z.string(), slug: z.string().nullable() })),\n tags: z.array(z.string()),\n price: storefrontPriceSchema.nullable(),\n priceRange: storefrontPriceRangeSchema.nullable(),\n availability: storefrontAvailabilitySchema,\n badges: z.array(z.string()),\n})\n\nconst storefrontFacetsSchema = z.object({\n categories: z.array(\n z.object({\n id: z.string().uuid(),\n name: z.string(),\n slug: z.string().nullable(),\n depth: z.number().int(),\n parentId: z.string().uuid().nullable(),\n count: z.number().int(),\n }),\n ),\n tags: z.array(z.object({ slug: z.string(), label: z.string(), count: z.number().int() })),\n priceRange: z.object({ min: z.number(), max: z.number(), currencyCode: z.string() }).nullable(),\n options: z.array(\n z.object({\n code: z.string(),\n label: z.string(),\n values: z.array(z.object({ code: z.string(), label: z.string(), count: z.number().int() })),\n }),\n ),\n productTypes: z.array(z.object({ type: z.string(), label: z.string(), count: z.number().int() })),\n availability: z.array(z.object({ state: availabilityStateSchema, count: z.number().int() })),\n availabilityScope: z.literal('page'),\n total: z.number().int(),\n})\n\nconst storefrontAppliedFiltersSchema = z.object({\n search: z.string().optional(),\n category: z\n .object({ id: z.string().uuid(), slug: z.string().nullable(), includesDescendants: z.literal(true) })\n .optional(),\n tagSlugs: z.array(z.string()).optional(),\n price: z.object({ min: z.number().nullable(), max: z.number().nullable(), approximate: z.boolean() }).optional(),\n options: z.record(z.string(), z.array(z.string())).optional(),\n productType: z.enum(CATALOG_PRODUCT_TYPES).optional(),\n availability: z.object({ value: z.enum(['in_stock', 'available']), scope: z.literal('page') }).optional(),\n})\n\nexport const storefrontProductListResponseSchema = z.object({\n items: z.array(storefrontProductListItemSchema),\n total: z.number().int(),\n page: z.number().int(),\n pageSize: z.number().int(),\n totalPages: z.number().int(),\n facets: storefrontFacetsSchema.describe(\n 'Cross-excluded facet counts over the buyer assortment; priceRange is buyer-priced, availability counts the returned page',\n ),\n effectiveLocale: z.string(),\n requestedLocale: z.string().nullable(),\n currencyCode: z.string(),\n taxMode: ecommercePriceDisplayModeSchema,\n appliedFilters: storefrontAppliedFiltersSchema,\n availableSorts: z.array(ecommerceStorefrontProductSortSchema),\n appliedSort: ecommerceStorefrontProductSortSchema,\n priceSort: z.object({ cap: z.number().int(), fallback: ecommercePriceSortFallbackSchema, capExceeded: z.boolean() }),\n sortApproximate: z.boolean(),\n sortUnavailable: z.boolean(),\n})\n\nconst dimensionsSchema = z\n .object({\n length: z.number().nullable(),\n width: z.number().nullable(),\n height: z.number().nullable(),\n unit: z.string().nullable(),\n })\n .nullable()\n\nconst optionSchemaSchema = z\n .object({\n version: z.number().int().optional(),\n name: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n options: z.array(\n z.object({\n code: z.string(),\n label: z.string(),\n description: z.string().nullable().optional(),\n inputType: z.string(),\n isRequired: z.boolean().optional(),\n isMultiple: z.boolean().optional(),\n choices: z.array(z.object({ code: z.string(), label: z.string().nullable().optional() })).optional(),\n }),\n ),\n })\n .nullable()\n\nexport const storefrontProductDetailResponseSchema = storefrontProductListItemSchema\n .omit({ categories: true })\n .extend({\n description: z.string().nullable(),\n sku: z.string().nullable(),\n media: z.array(z.object({ id: z.string(), url: z.string(), alt: z.string().nullable(), sortOrder: z.number().int() })),\n dimensions: dimensionsSchema,\n weightValue: z.number().nullable(),\n weightUnit: z.string().nullable(),\n categories: z.array(\n z.object({ id: z.string().uuid(), name: z.string(), slug: z.string().nullable(), ancestorIds: z.array(z.string().uuid()) }),\n ),\n breadcrumb: z.array(z.object({ id: z.string().uuid(), name: z.string(), slug: z.string().nullable() })),\n optionSchema: optionSchemaSchema,\n variants: z.array(\n z.object({\n id: z.string().uuid(),\n name: z.string(),\n sku: z.string().nullable(),\n optionValues: z.record(z.string(), z.string()),\n isDefault: z.boolean(),\n price: storefrontPriceSchema.nullable(),\n priceTiers: z.array(storefrontPriceTierSchema).describe('Quantity tiers of this variant for this buyer'),\n availability: storefrontAvailabilitySchema,\n dimensions: dimensionsSchema,\n weightValue: z.number().nullable(),\n weightUnit: z.string().nullable(),\n }),\n ),\n selectedVariantId: z\n .string()\n .uuid()\n .nullable()\n .describe('The requested variantId when it is one of variants, else the default variant, else null'),\n quantityRules: z.object({\n minOrderQuantity: z.number().nullable(),\n maxOrderQuantity: z.number().nullable(),\n quantityIncrement: z.number().nullable(),\n }),\n priceTiers: z\n .array(storefrontPriceTierSchema)\n .describe('Quantity tiers of selectedVariantId when one is selected, else of the product'),\n relatedProducts: z.array(storefrontProductListItemSchema).max(8),\n seo: z.object({ title: z.string().nullable(), description: z.string().nullable(), canonicalUrl: z.string().nullable() }),\n })\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }