@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,587 @@
1
+ import { z } from 'zod'
2
+ import { CATALOG_PRODUCT_TYPES } from '@open-mercato/core/modules/catalog/data/types'
3
+ import {
4
+ ecommerceBrandingFontIds,
5
+ isValidBorderRadius,
6
+ isValidBrandingColor,
7
+ } from '../lib/brandingStyles'
8
+
9
+ export {
10
+ ECOMMERCE_BRANDING_FONTS,
11
+ ecommerceBrandingFontIds,
12
+ findEcommerceBrandingFont,
13
+ isValidBorderRadius,
14
+ isValidBrandingColor,
15
+ isValidOklchColor,
16
+ type EcommerceBrandingFont,
17
+ } from '../lib/brandingStyles'
18
+
19
+ const uuid = () => z.string().uuid()
20
+
21
+ const emptyStringToNull = (value: unknown): unknown => {
22
+ if (typeof value !== 'string') return value
23
+ const trimmed = value.trim()
24
+ return trimmed.length ? trimmed : null
25
+ }
26
+
27
+ const emptyStringToUndefined = (value: unknown): unknown => {
28
+ if (typeof value !== 'string') return value
29
+ const trimmed = value.trim()
30
+ return trimmed.length ? trimmed : undefined
31
+ }
32
+
33
+ export const ecommerceStoreStatusValues = ['draft', 'active', 'archived'] as const
34
+ export const ecommerceStoreStatusSchema = z.enum(ecommerceStoreStatusValues)
35
+ export type EcommerceStoreStatus = z.infer<typeof ecommerceStoreStatusSchema>
36
+
37
+ export const ecommercePriceSortFallbackValues = ['approximate', 'unavailable'] as const
38
+ export const ecommercePriceSortFallbackSchema = z.enum(ecommercePriceSortFallbackValues)
39
+ export type EcommercePriceSortFallback = z.infer<typeof ecommercePriceSortFallbackSchema>
40
+
41
+ export const ecommercePriceDisplayModeValues = ['gross', 'net'] as const
42
+ export const ecommercePriceDisplayModeSchema = z.enum(ecommercePriceDisplayModeValues)
43
+ export type EcommercePriceDisplayMode = z.infer<typeof ecommercePriceDisplayModeSchema>
44
+
45
+ const brandingColorSchema = z.preprocess(
46
+ emptyStringToUndefined,
47
+ z
48
+ .string()
49
+ .max(64)
50
+ .refine(isValidBrandingColor, { message: 'ecommerce.validation.colorInvalid' })
51
+ .optional(),
52
+ )
53
+
54
+ const brandingFontSchema = z.preprocess(
55
+ emptyStringToUndefined,
56
+ z
57
+ .string()
58
+ .refine((value) => ecommerceBrandingFontIds.includes(value), { message: 'ecommerce.validation.fontNotAllowed' })
59
+ .optional(),
60
+ )
61
+
62
+ const borderRadiusSchema = z.preprocess(
63
+ emptyStringToUndefined,
64
+ z
65
+ .string()
66
+ .max(16)
67
+ .refine(isValidBorderRadius, { message: 'ecommerce.validation.borderRadiusInvalid' })
68
+ .optional(),
69
+ )
70
+
71
+ const ROOT_RELATIVE_PATH_PATTERN = /^\/(?!\/)[A-Za-z0-9\-._~/%]*$/
72
+
73
+ export function isSafeAssetUrl(value: string): boolean {
74
+ if (ROOT_RELATIVE_PATH_PATTERN.test(value)) return true
75
+ try {
76
+ const parsed = new URL(value)
77
+ return parsed.protocol === 'https:' || parsed.protocol === 'http:'
78
+ } catch {
79
+ return false
80
+ }
81
+ }
82
+
83
+ const assetUrlSchema = z.preprocess(
84
+ emptyStringToNull,
85
+ z
86
+ .string()
87
+ .max(2048)
88
+ .refine(isSafeAssetUrl, { message: 'ecommerce.validation.urlInvalid' })
89
+ .nullable()
90
+ .optional(),
91
+ )
92
+
93
+ const httpUrlSchema = z
94
+ .string()
95
+ .trim()
96
+ .max(2048)
97
+ .refine(
98
+ (value) => {
99
+ try {
100
+ const parsed = new URL(value)
101
+ return parsed.protocol === 'https:' || parsed.protocol === 'http:'
102
+ } catch {
103
+ return false
104
+ }
105
+ },
106
+ { message: 'ecommerce.validation.urlInvalid' },
107
+ )
108
+
109
+ const clearableStringSchema = (max: number) =>
110
+ z.preprocess(emptyStringToNull, z.string().trim().max(max).nullable().optional())
111
+
112
+ const optionalStringSchema = (max: number) =>
113
+ z.preprocess(emptyStringToUndefined, z.string().trim().max(max).optional())
114
+
115
+ export const ecommerceStoreBrandingSchema = z
116
+ .object({
117
+ logoUrl: assetUrlSchema,
118
+ faviconUrl: assetUrlSchema,
119
+ primaryColor: brandingColorSchema,
120
+ primaryForeground: brandingColorSchema,
121
+ accentColor: brandingColorSchema,
122
+ accentForeground: brandingColorSchema,
123
+ backgroundColor: brandingColorSchema,
124
+ foregroundColor: brandingColorSchema,
125
+ borderRadius: borderRadiusSchema,
126
+ fontFamilyBase: brandingFontSchema,
127
+ fontFamilyHeading: brandingFontSchema,
128
+ })
129
+ .strict()
130
+
131
+ export type EcommerceStoreBranding = z.infer<typeof ecommerceStoreBrandingSchema>
132
+
133
+ const SOCIAL_NETWORK_KEY_PATTERN = /^[a-z0-9_-]{1,32}$/
134
+ const SOCIAL_LINKS_MAX = 20
135
+
136
+ export const ecommerceStoreContactSchema = z
137
+ .object({
138
+ email: z.preprocess(emptyStringToNull, z.string().trim().email().max(320).nullable().optional()),
139
+ phone: clearableStringSchema(50),
140
+ address: clearableStringSchema(1000),
141
+ social: z
142
+ .record(z.string().regex(SOCIAL_NETWORK_KEY_PATTERN), httpUrlSchema)
143
+ .refine((value) => Object.keys(value).length <= SOCIAL_LINKS_MAX)
144
+ .optional(),
145
+ })
146
+ .strict()
147
+
148
+ export type EcommerceStoreContact = z.infer<typeof ecommerceStoreContactSchema>
149
+
150
+ const ecommerceStoreDisplayShape = {
151
+ priceDisplayModeDefault: ecommercePriceDisplayModeSchema,
152
+ enableSearch: z.boolean(),
153
+ }
154
+
155
+ export const ecommerceStoreDisplaySchema = z
156
+ .object({
157
+ priceDisplayModeDefault: ecommercePriceDisplayModeSchema.default('gross'),
158
+ enableSearch: z.boolean().default(true),
159
+ })
160
+ .strict()
161
+
162
+ export type EcommerceStoreDisplay = z.infer<typeof ecommerceStoreDisplaySchema>
163
+
164
+ export const GOOGLE_SITE_VERIFICATION_PATTERN = /^[A-Za-z0-9_-]{1,128}$/
165
+ export const ECOMMERCE_SEO_SITE_NAME_MAX = 200
166
+ export const ECOMMERCE_SEO_META_DESCRIPTION_MAX = 500
167
+ export const ECOMMERCE_SEO_ROBOTS_TXT_MAX = 10000
168
+ export const ECOMMERCE_SEO_GOOGLE_VERIFICATION_MAX = 128
169
+
170
+ export const ecommerceStoreSeoSchema = z
171
+ .object({
172
+ siteName: optionalStringSchema(ECOMMERCE_SEO_SITE_NAME_MAX),
173
+ defaultMetaDescription: optionalStringSchema(ECOMMERCE_SEO_META_DESCRIPTION_MAX),
174
+ googleSiteVerification: z.preprocess(
175
+ emptyStringToUndefined,
176
+ z
177
+ .string()
178
+ .regex(GOOGLE_SITE_VERIFICATION_PATTERN, { message: 'ecommerce.validation.googleSiteVerificationInvalid' })
179
+ .optional(),
180
+ ),
181
+ robotsTxt: z.preprocess(emptyStringToUndefined, z.string().max(ECOMMERCE_SEO_ROBOTS_TXT_MAX).optional()),
182
+ })
183
+ .strict()
184
+
185
+ export type EcommerceStoreSeo = z.infer<typeof ecommerceStoreSeoSchema>
186
+
187
+ export const ecommerceStoreSettingsSchema = z
188
+ .object({
189
+ branding: ecommerceStoreBrandingSchema.prefault({}),
190
+ contact: ecommerceStoreContactSchema.prefault({}),
191
+ display: ecommerceStoreDisplaySchema.prefault({}),
192
+ seo: ecommerceStoreSeoSchema.prefault({}),
193
+ })
194
+ .strict()
195
+
196
+ export type EcommerceStoreSettings = z.infer<typeof ecommerceStoreSettingsSchema>
197
+
198
+ export const ecommerceStoreSettingsPatchSchema = z
199
+ .object({
200
+ branding: ecommerceStoreBrandingSchema.optional(),
201
+ contact: ecommerceStoreContactSchema.optional(),
202
+ display: z.object(ecommerceStoreDisplayShape).partial().strict().optional(),
203
+ seo: ecommerceStoreSeoSchema.optional(),
204
+ })
205
+ .strict()
206
+
207
+ export type EcommerceStoreSettingsPatch = z.infer<typeof ecommerceStoreSettingsPatchSchema>
208
+
209
+ export const ECOMMERCE_STORE_CODE_PATTERN = /^[a-z0-9_-]+$/
210
+ export const ECOMMERCE_STORE_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/
211
+ export const ECOMMERCE_LOCALE_PATTERN = /^[a-z]{2,3}(?:-[A-Z][a-z]{3})?(?:-(?:[A-Z]{2}|\d{3}))?$/
212
+
213
+ const codeSchema = z
214
+ .string()
215
+ .trim()
216
+ .min(1)
217
+ .max(80)
218
+ .regex(ECOMMERCE_STORE_CODE_PATTERN, 'ecommerce.validation.codeInvalid')
219
+
220
+ const slugSchema = z
221
+ .string()
222
+ .trim()
223
+ .min(1)
224
+ .max(120)
225
+ .regex(ECOMMERCE_STORE_SLUG_PATTERN, 'ecommerce.validation.slugInvalid')
226
+
227
+ const nameSchema = z.string().trim().min(1).max(200)
228
+
229
+ const localeSchema = z.string().trim().regex(ECOMMERCE_LOCALE_PATTERN, 'ecommerce.validation.localeInvalid')
230
+
231
+ const supportedLocalesSchema = z
232
+ .array(localeSchema)
233
+ .min(1)
234
+ .max(50)
235
+ .refine((locales) => new Set(locales).size === locales.length, {
236
+ message: 'ecommerce.validation.localesDuplicate',
237
+ })
238
+
239
+ const currencyCodeSchema = z
240
+ .string()
241
+ .trim()
242
+ .regex(/^[A-Z]{3}$/, 'ecommerce.validation.currencyCodeInvalid')
243
+
244
+ type LocalePair = { defaultLocale?: string; supportedLocales?: string[] }
245
+
246
+ function refineDefaultLocaleSupported(value: LocalePair, ctx: z.RefinementCtx): void {
247
+ if (value.defaultLocale === undefined || value.supportedLocales === undefined) return
248
+ if (value.supportedLocales.includes(value.defaultLocale)) return
249
+ ctx.addIssue({
250
+ code: 'custom',
251
+ path: ['defaultLocale'],
252
+ message: 'ecommerce.validation.defaultLocaleNotSupported',
253
+ })
254
+ }
255
+
256
+ const ecommerceStoreBaseShape = {
257
+ organizationId: uuid(),
258
+ tenantId: uuid(),
259
+ code: codeSchema,
260
+ name: nameSchema,
261
+ slug: slugSchema,
262
+ status: ecommerceStoreStatusSchema,
263
+ defaultLocale: localeSchema,
264
+ supportedLocales: supportedLocalesSchema,
265
+ defaultCurrencyCode: currencyCodeSchema,
266
+ isPrimary: z.boolean(),
267
+ }
268
+
269
+ export const ecommerceStoreCreateSchema = z
270
+ .object({
271
+ ...ecommerceStoreBaseShape,
272
+ status: ecommerceStoreStatusSchema.optional().default('draft'),
273
+ isPrimary: z.boolean().optional().default(false),
274
+ settings: ecommerceStoreSettingsSchema.prefault({}),
275
+ })
276
+ .strict()
277
+ .superRefine(refineDefaultLocaleSupported)
278
+
279
+ export type EcommerceStoreCreateInput = z.infer<typeof ecommerceStoreCreateSchema>
280
+
281
+ export const ecommerceStoreUpdateSchema = z
282
+ .object({
283
+ id: uuid(),
284
+ ...z.object(ecommerceStoreBaseShape).partial().shape,
285
+ settings: ecommerceStoreSettingsPatchSchema.optional(),
286
+ })
287
+ .strict()
288
+ .superRefine(refineDefaultLocaleSupported)
289
+
290
+ export type EcommerceStoreUpdateInput = z.infer<typeof ecommerceStoreUpdateSchema>
291
+
292
+ export const ecommerceStoreDeleteSchema = z.object({ id: uuid() }).strict()
293
+
294
+ export type EcommerceStoreDeleteInput = z.infer<typeof ecommerceStoreDeleteSchema>
295
+
296
+ const PATH_PREFIX_PATTERN = /^(?:\/[a-z0-9-]+)+$/
297
+ const PATH_PREFIX_MAX = 200
298
+
299
+ export function normalizePathPrefix(value: unknown): unknown {
300
+ if (value === undefined || value === null) return value
301
+ if (typeof value !== 'string') return value
302
+ const lowered = value.trim().toLowerCase()
303
+ const withoutTrailing = lowered.replace(/\/+$/, '')
304
+ if (!withoutTrailing.length) return null
305
+ return withoutTrailing.startsWith('/') ? withoutTrailing : `/${withoutTrailing}`
306
+ }
307
+
308
+ const pathPrefixSchema = z.preprocess(
309
+ normalizePathPrefix,
310
+ z
311
+ .string()
312
+ .max(PATH_PREFIX_MAX)
313
+ .regex(PATH_PREFIX_PATTERN, 'ecommerce.validation.pathPrefixInvalid')
314
+ .nullable()
315
+ .optional(),
316
+ )
317
+
318
+ const ecommerceStoreDomainBindingBaseShape = {
319
+ organizationId: uuid(),
320
+ tenantId: uuid(),
321
+ storeId: uuid(),
322
+ domainMappingId: uuid(),
323
+ pathPrefix: pathPrefixSchema,
324
+ isPrimary: z.boolean(),
325
+ }
326
+
327
+ export const ecommerceStoreDomainBindingCreateSchema = z
328
+ .object({
329
+ ...ecommerceStoreDomainBindingBaseShape,
330
+ isPrimary: z.boolean().optional().default(false),
331
+ })
332
+ .strict()
333
+
334
+ export type EcommerceStoreDomainBindingCreateInput = z.infer<typeof ecommerceStoreDomainBindingCreateSchema>
335
+
336
+ export const ecommerceStoreDomainBindingUpdateSchema = z
337
+ .object({
338
+ id: uuid(),
339
+ ...z.object(ecommerceStoreDomainBindingBaseShape).partial().shape,
340
+ })
341
+ .strict()
342
+
343
+ export type EcommerceStoreDomainBindingUpdateInput = z.infer<typeof ecommerceStoreDomainBindingUpdateSchema>
344
+
345
+ export const ecommerceStoreDomainBindingDeleteSchema = z.object({ id: uuid() }).strict()
346
+
347
+ export type EcommerceStoreDomainBindingDeleteInput = z.infer<typeof ecommerceStoreDomainBindingDeleteSchema>
348
+
349
+ export const ecommerceAssortmentScopeSchema = z
350
+ .object({
351
+ categoryIds: z.array(uuid()).optional(),
352
+ tagIds: z.array(uuid()).optional(),
353
+ excludeProductIds: z.array(uuid()).optional(),
354
+ excludeCategoryIds: z.array(uuid()).optional(),
355
+ excludeTagIds: z.array(uuid()).optional(),
356
+ })
357
+ .strict()
358
+ .nullable()
359
+
360
+ export type EcommerceAssortmentScopeInput = z.infer<typeof ecommerceAssortmentScopeSchema>
361
+
362
+ const clearableUuidSchema = z.preprocess(emptyStringToNull, uuid().nullable().optional())
363
+
364
+ const ecommerceStoreChannelBindingBaseShape = {
365
+ organizationId: uuid(),
366
+ tenantId: uuid(),
367
+ storeId: uuid(),
368
+ salesChannelId: uuid(),
369
+ priceKindId: clearableUuidSchema,
370
+ assortmentScope: ecommerceAssortmentScopeSchema.optional(),
371
+ priceSortFallback: ecommercePriceSortFallbackSchema,
372
+ isDefault: z.boolean(),
373
+ requireAuthentication: z.boolean(),
374
+ }
375
+
376
+ export const ecommerceStoreChannelBindingCreateSchema = z
377
+ .object({
378
+ ...ecommerceStoreChannelBindingBaseShape,
379
+ priceSortFallback: ecommercePriceSortFallbackSchema.optional().default('approximate'),
380
+ isDefault: z.boolean().optional().default(false),
381
+ requireAuthentication: z.boolean().optional().default(false),
382
+ })
383
+ .strict()
384
+
385
+ export type EcommerceStoreChannelBindingCreateInput = z.infer<typeof ecommerceStoreChannelBindingCreateSchema>
386
+
387
+ export const ecommerceStoreChannelBindingUpdateSchema = z
388
+ .object({
389
+ id: uuid(),
390
+ ...z.object(ecommerceStoreChannelBindingBaseShape).partial().shape,
391
+ })
392
+ .strict()
393
+
394
+ export type EcommerceStoreChannelBindingUpdateInput = z.infer<typeof ecommerceStoreChannelBindingUpdateSchema>
395
+
396
+ export const ecommerceStoreChannelBindingDeleteSchema = z.object({ id: uuid() }).strict()
397
+
398
+ export type EcommerceStoreChannelBindingDeleteInput = z.infer<typeof ecommerceStoreChannelBindingDeleteSchema>
399
+
400
+ export const ecommerceStorefrontContextQuerySchema = z
401
+ .object({
402
+ storeSlug: z.string().max(120).optional(),
403
+ locale: z.string().max(35).optional(),
404
+ path: z.string().max(2048).optional(),
405
+ })
406
+ .strict()
407
+
408
+ export type EcommerceStorefrontContextQuery = z.infer<typeof ecommerceStorefrontContextQuerySchema>
409
+
410
+ export const ecommerceStorefrontProductSortValues = [
411
+ 'relevance',
412
+ 'price_asc',
413
+ 'price_desc',
414
+ 'title_asc',
415
+ 'title_desc',
416
+ 'newest',
417
+ 'featured',
418
+ ] as const
419
+ export const ecommerceStorefrontProductSortSchema = z.enum(ecommerceStorefrontProductSortValues)
420
+ export type EcommerceStorefrontProductSort = z.infer<typeof ecommerceStorefrontProductSortSchema>
421
+
422
+ export const ecommerceStorefrontAvailabilityFilterValues = ['in_stock', 'available', 'all'] as const
423
+ export const ecommerceStorefrontAvailabilityFilterSchema = z.enum(ecommerceStorefrontAvailabilityFilterValues)
424
+ export type EcommerceStorefrontAvailabilityFilter = z.infer<typeof ecommerceStorefrontAvailabilityFilterSchema>
425
+
426
+ export const ECOMMERCE_STOREFRONT_MAX_PAGE_SIZE = 100
427
+ export const ECOMMERCE_STOREFRONT_DEFAULT_PAGE_SIZE = 24
428
+
429
+ const storefrontOptionCodeRegex = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/
430
+
431
+ const commaSeparatedList = (maxItems: number, itemSchema: z.ZodString) =>
432
+ z.preprocess(
433
+ (value) => {
434
+ if (typeof value !== 'string') return value
435
+ const items = value
436
+ .split(',')
437
+ .map((entry) => entry.trim())
438
+ .filter((entry) => entry.length > 0)
439
+ return items.length ? Array.from(new Set(items)) : undefined
440
+ },
441
+ z.array(itemSchema).min(1).max(maxItems).optional(),
442
+ )
443
+
444
+ const optionalNonNegativeAmount = z.preprocess(
445
+ emptyStringToUndefined,
446
+ z.coerce.number().finite().min(0).max(1_000_000_000).optional(),
447
+ )
448
+
449
+ const storefrontProductListFilterShape = {
450
+ page: z.preprocess(emptyStringToUndefined, z.coerce.number().int().min(1).max(10_000).optional().default(1)),
451
+ pageSize: z.preprocess(
452
+ emptyStringToUndefined,
453
+ z.coerce
454
+ .number()
455
+ .int()
456
+ .min(1)
457
+ .max(ECOMMERCE_STOREFRONT_MAX_PAGE_SIZE)
458
+ .optional()
459
+ .default(ECOMMERCE_STOREFRONT_DEFAULT_PAGE_SIZE),
460
+ ),
461
+ search: z.preprocess(emptyStringToUndefined, z.string().max(200).optional()),
462
+ tagSlugs: commaSeparatedList(20, z.string().max(255)),
463
+ priceMin: optionalNonNegativeAmount,
464
+ priceMax: optionalNonNegativeAmount,
465
+ options: z
466
+ .record(
467
+ z.string().regex(storefrontOptionCodeRegex),
468
+ z.array(z.string().min(1).max(255)).min(1).max(50),
469
+ )
470
+ .refine((value) => Object.keys(value).length <= 20)
471
+ .optional(),
472
+ productType: z.preprocess(emptyStringToUndefined, z.enum(CATALOG_PRODUCT_TYPES).optional()),
473
+ availability: z.preprocess(
474
+ emptyStringToUndefined,
475
+ ecommerceStorefrontAvailabilityFilterSchema.optional().default('all'),
476
+ ),
477
+ sort: z.preprocess(emptyStringToUndefined, ecommerceStorefrontProductSortSchema.optional()),
478
+ locale: z.string().max(35).optional(),
479
+ path: z.string().max(2048).optional(),
480
+ storeSlug: z.string().max(120).optional(),
481
+ }
482
+
483
+ const storefrontProductListCategoryShape = {
484
+ categoryId: z.preprocess(emptyStringToUndefined, uuid().optional()),
485
+ categorySlug: z.preprocess(emptyStringToUndefined, z.string().max(255).optional()),
486
+ }
487
+
488
+ const priceRangeIsOrdered = (value: { priceMin?: number; priceMax?: number }) =>
489
+ value.priceMin === undefined || value.priceMax === undefined || value.priceMin <= value.priceMax
490
+
491
+ export const ecommerceStorefrontProductListQuerySchema = z
492
+ .object({ ...storefrontProductListFilterShape, ...storefrontProductListCategoryShape })
493
+ .strict()
494
+ .refine((value) => !(value.categoryId && value.categorySlug), {
495
+ path: ['categorySlug'],
496
+ message: 'categoryId and categorySlug are mutually exclusive',
497
+ })
498
+ .refine(priceRangeIsOrdered, {
499
+ path: ['priceMax'],
500
+ message: 'priceMax must not be lower than priceMin',
501
+ })
502
+
503
+ export type EcommerceStorefrontProductListQuery = z.infer<typeof ecommerceStorefrontProductListQuerySchema>
504
+
505
+ export const ecommerceStorefrontCategoryLandingQuerySchema = z
506
+ .object(storefrontProductListFilterShape)
507
+ .strict()
508
+ .refine(priceRangeIsOrdered, {
509
+ path: ['priceMax'],
510
+ message: 'priceMax must not be lower than priceMin',
511
+ })
512
+
513
+ export type EcommerceStorefrontCategoryLandingQuery = z.infer<typeof ecommerceStorefrontCategoryLandingQuerySchema>
514
+
515
+ export const ECOMMERCE_STOREFRONT_MAX_CATEGORY_DEPTH = 20
516
+
517
+ const storefrontBooleanParameter = z.preprocess((value) => {
518
+ if (typeof value !== 'string') return value
519
+ const token = value.trim().toLowerCase()
520
+ if (token === 'true' || token === '1') return true
521
+ if (token === 'false' || token === '0') return false
522
+ return value
523
+ }, z.boolean())
524
+
525
+ export const ecommerceStorefrontCategoryTreeQuerySchema = z
526
+ .object({
527
+ parentId: z.preprocess(emptyStringToUndefined, uuid().optional()),
528
+ depth: z.preprocess(
529
+ emptyStringToUndefined,
530
+ z.coerce.number().int().min(1).max(ECOMMERCE_STOREFRONT_MAX_CATEGORY_DEPTH).optional(),
531
+ ),
532
+ includeEmpty: z.preprocess(emptyStringToUndefined, storefrontBooleanParameter.optional().default(false)),
533
+ locale: z.string().max(35).optional(),
534
+ path: z.string().max(2048).optional(),
535
+ storeSlug: z.string().max(120).optional(),
536
+ })
537
+ .strict()
538
+
539
+ export type EcommerceStorefrontCategoryTreeQuery = z.infer<typeof ecommerceStorefrontCategoryTreeQuerySchema>
540
+
541
+ export const ecommerceStorefrontCategoryParamsSchema = z.object({
542
+ slug: z.string().trim().min(1).max(255),
543
+ })
544
+
545
+ export type EcommerceStorefrontCategoryParams = z.infer<typeof ecommerceStorefrontCategoryParamsSchema>
546
+
547
+ export const ecommerceStorefrontProductDetailQuerySchema = z
548
+ .object({
549
+ variantId: z.preprocess(emptyStringToUndefined, uuid().optional()),
550
+ locale: z.string().max(35).optional(),
551
+ path: z.string().max(2048).optional(),
552
+ storeSlug: z.string().max(120).optional(),
553
+ })
554
+ .strict()
555
+
556
+ export type EcommerceStorefrontProductDetailQuery = z.infer<typeof ecommerceStorefrontProductDetailQuerySchema>
557
+
558
+ export const ecommerceStorefrontProductParamsSchema = z.object({
559
+ idOrHandle: z.string().trim().min(1).max(255),
560
+ })
561
+
562
+ export type EcommerceStorefrontProductParams = z.infer<typeof ecommerceStorefrontProductParamsSchema>
563
+
564
+ export const ECOMMERCE_STOREFRONT_SUGGEST_MIN_QUERY_LENGTH = 2
565
+ export const ECOMMERCE_STOREFRONT_SUGGEST_DEFAULT_LIMIT = 8
566
+ export const ECOMMERCE_STOREFRONT_SUGGEST_MAX_LIMIT = 20
567
+
568
+ export const ecommerceStorefrontSearchSuggestQuerySchema = z
569
+ .object({
570
+ q: z.string().max(200),
571
+ limit: z.preprocess(
572
+ emptyStringToUndefined,
573
+ z.coerce
574
+ .number()
575
+ .int()
576
+ .min(1)
577
+ .max(ECOMMERCE_STOREFRONT_SUGGEST_MAX_LIMIT)
578
+ .optional()
579
+ .default(ECOMMERCE_STOREFRONT_SUGGEST_DEFAULT_LIMIT),
580
+ ),
581
+ locale: z.string().max(35).optional(),
582
+ path: z.string().max(2048).optional(),
583
+ storeSlug: z.string().max(120).optional(),
584
+ })
585
+ .strict()
586
+
587
+ export type EcommerceStorefrontSearchSuggestQuery = z.infer<typeof ecommerceStorefrontSearchSuggestQuerySchema>
@@ -0,0 +1,9 @@
1
+ import { asFunction } from 'awilix'
2
+ import type { AppContainer } from '@open-mercato/shared/lib/di/container'
3
+ import { createStoreContextService } from './lib/storeContextService'
4
+
5
+ export function register(container: AppContainer) {
6
+ container.register({
7
+ storeContextService: asFunction(() => createStoreContextService(container)).scoped(),
8
+ })
9
+ }
@@ -0,0 +1,27 @@
1
+ import { createModuleEvents } from '@open-mercato/shared/modules/events'
2
+
3
+ const events = [
4
+ { id: 'ecommerce.store.created', label: 'Store Created', entity: 'store', category: 'crud' },
5
+ { id: 'ecommerce.store.updated', label: 'Store Updated', entity: 'store', category: 'crud' },
6
+ { id: 'ecommerce.store.deleted', label: 'Store Deleted', entity: 'store', category: 'crud' },
7
+ { id: 'ecommerce.store_domain_binding.created', label: 'Store Domain Binding Created', entity: 'store_domain_binding', category: 'crud' },
8
+ { id: 'ecommerce.store_domain_binding.updated', label: 'Store Domain Binding Updated', entity: 'store_domain_binding', category: 'crud' },
9
+ { id: 'ecommerce.store_domain_binding.deleted', label: 'Store Domain Binding Deleted', entity: 'store_domain_binding', category: 'crud' },
10
+ { id: 'ecommerce.store_channel_binding.created', label: 'Store Channel Binding Created', entity: 'store_channel_binding', category: 'crud' },
11
+ { id: 'ecommerce.store_channel_binding.updated', label: 'Store Channel Binding Updated', entity: 'store_channel_binding', category: 'crud' },
12
+ { id: 'ecommerce.store_channel_binding.deleted', label: 'Store Channel Binding Deleted', entity: 'store_channel_binding', category: 'crud' },
13
+ { id: 'ecommerce.store.branding_updated', label: 'Store Branding Updated', entity: 'store', category: 'crud' },
14
+ { id: 'ecommerce.store.misconfigured', label: 'Store Misconfigured', entity: 'store', category: 'lifecycle' },
15
+ { id: 'ecommerce.assortment.empty_detected', label: 'Empty Store Assortment Detected', entity: 'assortment', category: 'lifecycle' },
16
+ ] as const
17
+
18
+ export const eventsConfig = createModuleEvents({
19
+ moduleId: 'ecommerce',
20
+ events,
21
+ })
22
+
23
+ export const emitEcommerceEvent = eventsConfig.emit
24
+
25
+ export type EcommerceEventId = typeof events[number]['id']
26
+
27
+ export default eventsConfig