@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.
- package/.turbo/turbo-build.log +2 -2
- package/dist/generated/entities/catalog_price_history_entry/index.js +53 -0
- package/dist/generated/entities/catalog_price_history_entry/index.js.map +7 -0
- package/dist/generated/entities/customer_group_terms/index.js +2 -0
- package/dist/generated/entities/customer_group_terms/index.js.map +2 -2
- package/dist/generated/entities/ecommerce_store/index.js +33 -0
- package/dist/generated/entities/ecommerce_store/index.js.map +7 -0
- package/dist/generated/entities/ecommerce_store_channel_binding/index.js +29 -0
- package/dist/generated/entities/ecommerce_store_channel_binding/index.js.map +7 -0
- package/dist/generated/entities/ecommerce_store_domain_binding/index.js +23 -0
- package/dist/generated/entities/ecommerce_store_domain_binding/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +8 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +72 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/customerGroupsFixtures.js.map +2 -2
- package/dist/modules/catalog/acl.js +8 -1
- package/dist/modules/catalog/acl.js.map +2 -2
- package/dist/modules/catalog/api/config/omnibus/route.js +184 -0
- package/dist/modules/catalog/api/config/omnibus/route.js.map +7 -0
- package/dist/modules/catalog/api/prices/history/route.js +131 -0
- package/dist/modules/catalog/api/prices/history/route.js.map +7 -0
- package/dist/modules/catalog/api/prices/omnibus-preview/route.js +184 -0
- package/dist/modules/catalog/api/prices/omnibus-preview/route.js.map +7 -0
- package/dist/modules/catalog/api/products/route.js +54 -245
- package/dist/modules/catalog/api/products/route.js.map +3 -3
- package/dist/modules/catalog/api/tags/route.js +6 -0
- package/dist/modules/catalog/api/tags/route.js.map +2 -2
- package/dist/modules/catalog/backend/config/catalog/page.js +3 -1
- package/dist/modules/catalog/backend/config/catalog/page.js.map +2 -2
- package/dist/modules/catalog/cli.js +80 -2
- package/dist/modules/catalog/cli.js.map +2 -2
- package/dist/modules/catalog/commands/categories.js +51 -2
- package/dist/modules/catalog/commands/categories.js.map +2 -2
- package/dist/modules/catalog/commands/prices.js +43 -1
- package/dist/modules/catalog/commands/prices.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +71 -0
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/commands/variants.js +7 -0
- package/dist/modules/catalog/commands/variants.js.map +2 -2
- package/dist/modules/catalog/components/OmnibusSettings.js +703 -0
- package/dist/modules/catalog/components/OmnibusSettings.js.map +7 -0
- package/dist/modules/catalog/components/PriceEditorOmnibusRow.js +152 -0
- package/dist/modules/catalog/components/PriceEditorOmnibusRow.js.map +7 -0
- package/dist/modules/catalog/components/lookupSources.js +31 -0
- package/dist/modules/catalog/components/lookupSources.js.map +7 -0
- package/dist/modules/catalog/components/prices/PriceScopeSelectors.js +8 -2
- package/dist/modules/catalog/components/prices/PriceScopeSelectors.js.map +2 -2
- package/dist/modules/catalog/components/products/VariantBuilder.js +11 -1
- package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
- package/dist/modules/catalog/data/entities.js +122 -1
- package/dist/modules/catalog/data/entities.js.map +2 -2
- package/dist/modules/catalog/data/validators.js +78 -0
- package/dist/modules/catalog/data/validators.js.map +2 -2
- package/dist/modules/catalog/di.js +18 -0
- package/dist/modules/catalog/di.js.map +2 -2
- package/dist/modules/catalog/lib/omnibus.js +285 -0
- package/dist/modules/catalog/lib/omnibus.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusBackfill.js +146 -0
- package/dist/modules/catalog/lib/omnibusBackfill.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusCache.js +89 -0
- package/dist/modules/catalog/lib/omnibusCache.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusConfig.js +64 -0
- package/dist/modules/catalog/lib/omnibusConfig.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusHistoryQueries.js +191 -0
- package/dist/modules/catalog/lib/omnibusHistoryQueries.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusPresentedEntry.js +73 -0
- package/dist/modules/catalog/lib/omnibusPresentedEntry.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusProductListEnrichment.js +94 -0
- package/dist/modules/catalog/lib/omnibusProductListEnrichment.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusTypes.js +115 -0
- package/dist/modules/catalog/lib/omnibusTypes.js.map +7 -0
- package/dist/modules/catalog/lib/optionSchemaTranslations.js +55 -0
- package/dist/modules/catalog/lib/optionSchemaTranslations.js.map +7 -0
- package/dist/modules/catalog/lib/priceHistoryQuery.js +103 -0
- package/dist/modules/catalog/lib/priceHistoryQuery.js.map +7 -0
- package/dist/modules/catalog/lib/pricing.js +26 -2
- package/dist/modules/catalog/lib/pricing.js.map +2 -2
- package/dist/modules/catalog/lib/productFilters.js +273 -0
- package/dist/modules/catalog/lib/productFilters.js.map +7 -0
- package/dist/modules/catalog/lib/productScopeKeys.js +105 -0
- package/dist/modules/catalog/lib/productScopeKeys.js.map +7 -0
- package/dist/modules/catalog/lib/productScopeReindex.js +73 -0
- package/dist/modules/catalog/lib/productScopeReindex.js.map +7 -0
- package/dist/modules/catalog/migrations/Migration20261005105352_catalog.js +39 -0
- package/dist/modules/catalog/migrations/Migration20261005105352_catalog.js.map +7 -0
- package/dist/modules/catalog/migrations/Migration20261005150824_catalog.js +39 -0
- package/dist/modules/catalog/migrations/Migration20261005150824_catalog.js.map +7 -0
- package/dist/modules/catalog/services/catalogOmnibusService.js +480 -0
- package/dist/modules/catalog/services/catalogOmnibusService.js.map +7 -0
- package/dist/modules/catalog/setup.js +3 -1
- package/dist/modules/catalog/setup.js.map +2 -2
- package/dist/modules/catalog/subscribers/product-scope-keys-category-deleted.js +16 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-deleted.js.map +7 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-updated.js +17 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-updated.js.map +7 -0
- package/dist/modules/catalog/translations.js +10 -0
- package/dist/modules/catalog/translations.js.map +2 -2
- package/dist/modules/configs/lib/upgrade-actions.js +28 -0
- package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
- package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js +5 -0
- package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js.map +2 -2
- package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js +111 -3
- package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js.map +2 -2
- package/dist/modules/customer_groups/components/customerGroupAssortmentScope.js +43 -0
- package/dist/modules/customer_groups/components/customerGroupAssortmentScope.js.map +7 -0
- package/dist/modules/customer_groups/data/entities.js +3 -0
- package/dist/modules/customer_groups/data/entities.js.map +2 -2
- package/dist/modules/customer_groups/data/validators.js +9 -0
- package/dist/modules/customer_groups/data/validators.js.map +2 -2
- package/dist/modules/customer_groups/migrations/Migration20261005110250_customer_groups.js +17 -0
- package/dist/modules/customer_groups/migrations/Migration20261005110250_customer_groups.js.map +7 -0
- package/dist/modules/customer_groups/services/customerGroupsService.js +62 -15
- package/dist/modules/customer_groups/services/customerGroupsService.js.map +2 -2
- package/dist/modules/ecommerce/acl.js +13 -0
- package/dist/modules/ecommerce/acl.js.map +7 -0
- package/dist/modules/ecommerce/api/domain-mappings/route.js +72 -0
- package/dist/modules/ecommerce/api/domain-mappings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/openapi.js +27 -0
- package/dist/modules/ecommerce/api/openapi.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.js +109 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/crud.js +265 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/route.js +67 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/crud.js +296 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/route.js +73 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/[slug]/route.js +87 -0
- package/dist/modules/ecommerce/api/storefront/categories/[slug]/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/openapiSchemas.js +50 -0
- package/dist/modules/ecommerce/api/storefront/categories/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/route.js +75 -0
- package/dist/modules/ecommerce/api/storefront/categories/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/context/route.js +163 -0
- package/dist/modules/ecommerce/api/storefront/context/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/[idOrHandle]/route.js +87 -0
- package/dist/modules/ecommerce/api/storefront/products/[idOrHandle]/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/openapiSchemas.js +177 -0
- package/dist/modules/ecommerce/api/storefront/products/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/route.js +78 -0
- package/dist/modules/ecommerce/api/storefront/products/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.js +25 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/route.js +75 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/storefrontRouteSupport.js +58 -0
- package/dist/modules/ecommerce/api/storefront/storefrontRouteSupport.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/[id]/branding/route.js +183 -0
- package/dist/modules/ecommerce/api/stores/[id]/branding/route.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/[id]/preview-branding/route.js +92 -0
- package/dist/modules/ecommerce/api/stores/[id]/preview-branding/route.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/crud.js +401 -0
- package/dist/modules/ecommerce/api/stores/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/route.js +64 -0
- package/dist/modules/ecommerce/api/stores/route.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.js +9 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.js +16 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.js +9 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.meta.js +16 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.meta.js.map +7 -0
- package/dist/modules/ecommerce/commands/stores.js +110 -0
- package/dist/modules/ecommerce/commands/stores.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelAssortmentCount.js +90 -0
- package/dist/modules/ecommerce/components/ChannelAssortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelBindingFormSections.js +33 -0
- package/dist/modules/ecommerce/components/ChannelBindingFormSections.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelLookupPicker.js +11 -0
- package/dist/modules/ecommerce/components/ChannelLookupPicker.js.map +7 -0
- package/dist/modules/ecommerce/components/DomainStatusWarning.js +24 -0
- package/dist/modules/ecommerce/components/DomainStatusWarning.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreAvailabilityDefaultsSection.js +190 -0
- package/dist/modules/ecommerce/components/StoreAvailabilityDefaultsSection.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingControls.js +67 -0
- package/dist/modules/ecommerce/components/StoreBrandingControls.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingPreview.js +69 -0
- package/dist/modules/ecommerce/components/StoreBrandingPreview.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingTab.js +218 -0
- package/dist/modules/ecommerce/components/StoreBrandingTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreChannelBindingDialog.js +270 -0
- package/dist/modules/ecommerce/components/StoreChannelBindingDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreChannelsTab.js +313 -0
- package/dist/modules/ecommerce/components/StoreChannelsTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreCreateDialog.js +164 -0
- package/dist/modules/ecommerce/components/StoreCreateDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreDomainBindingDialog.js +162 -0
- package/dist/modules/ecommerce/components/StoreDomainBindingDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreDomainsTab.js +357 -0
- package/dist/modules/ecommerce/components/StoreDomainsTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreEditPage.js +155 -0
- package/dist/modules/ecommerce/components/StoreEditPage.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreGeneralTab.js +167 -0
- package/dist/modules/ecommerce/components/StoreGeneralTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreListPage.js +290 -0
- package/dist/modules/ecommerce/components/StoreListPage.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreSeoTab.js +132 -0
- package/dist/modules/ecommerce/components/StoreSeoTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreStatusBadge.js +20 -0
- package/dist/modules/ecommerce/components/StoreStatusBadge.js.map +7 -0
- package/dist/modules/ecommerce/components/channelLookups.js +28 -0
- package/dist/modules/ecommerce/components/channelLookups.js.map +7 -0
- package/dist/modules/ecommerce/components/storeAdmin.js +41 -0
- package/dist/modules/ecommerce/components/storeAdmin.js.map +7 -0
- package/dist/modules/ecommerce/components/storeBrandingForm.js +197 -0
- package/dist/modules/ecommerce/components/storeBrandingForm.js.map +7 -0
- package/dist/modules/ecommerce/components/storeChannels.js +140 -0
- package/dist/modules/ecommerce/components/storeChannels.js.map +7 -0
- package/dist/modules/ecommerce/components/storeDomains.js +167 -0
- package/dist/modules/ecommerce/components/storeDomains.js.map +7 -0
- package/dist/modules/ecommerce/components/storeEditTabs.js +62 -0
- package/dist/modules/ecommerce/components/storeEditTabs.js.map +7 -0
- package/dist/modules/ecommerce/components/storeGeneral.js +95 -0
- package/dist/modules/ecommerce/components/storeGeneral.js.map +7 -0
- package/dist/modules/ecommerce/components/storeSeo.js +69 -0
- package/dist/modules/ecommerce/components/storeSeo.js.map +7 -0
- package/dist/modules/ecommerce/components/useChannelAssortmentCount.js +45 -0
- package/dist/modules/ecommerce/components/useChannelAssortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/components/useStoreAccess.js +28 -0
- package/dist/modules/ecommerce/components/useStoreAccess.js.map +7 -0
- package/dist/modules/ecommerce/data/enrichers.js +157 -0
- package/dist/modules/ecommerce/data/enrichers.js.map +7 -0
- package/dist/modules/ecommerce/data/entities.js +197 -0
- package/dist/modules/ecommerce/data/entities.js.map +7 -0
- package/dist/modules/ecommerce/data/validators.js +406 -0
- package/dist/modules/ecommerce/data/validators.js.map +7 -0
- package/dist/modules/ecommerce/di.js +11 -0
- package/dist/modules/ecommerce/di.js.map +7 -0
- package/dist/modules/ecommerce/events.js +27 -0
- package/dist/modules/ecommerce/events.js.map +7 -0
- package/dist/modules/ecommerce/index.js +16 -0
- package/dist/modules/ecommerce/index.js.map +7 -0
- package/dist/modules/ecommerce/lib/assortmentCount.js +112 -0
- package/dist/modules/ecommerce/lib/assortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/lib/brandingStyles.js +184 -0
- package/dist/modules/ecommerce/lib/brandingStyles.js.map +7 -0
- package/dist/modules/ecommerce/lib/buyerContext.js +284 -0
- package/dist/modules/ecommerce/lib/buyerContext.js.map +7 -0
- package/dist/modules/ecommerce/lib/cacheInvalidation.js +186 -0
- package/dist/modules/ecommerce/lib/cacheInvalidation.js.map +7 -0
- package/dist/modules/ecommerce/lib/cacheKeys.js +236 -0
- package/dist/modules/ecommerce/lib/cacheKeys.js.map +7 -0
- package/dist/modules/ecommerce/lib/createConflictRecheck.js +29 -0
- package/dist/modules/ecommerce/lib/createConflictRecheck.js.map +7 -0
- package/dist/modules/ecommerce/lib/crudEvents.js +94 -0
- package/dist/modules/ecommerce/lib/crudEvents.js.map +7 -0
- package/dist/modules/ecommerce/lib/crudSupport.js +64 -0
- package/dist/modules/ecommerce/lib/crudSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/domainBindingRebind.js +99 -0
- package/dist/modules/ecommerce/lib/domainBindingRebind.js.map +7 -0
- package/dist/modules/ecommerce/lib/domainMappingSummaries.js +39 -0
- package/dist/modules/ecommerce/lib/domainMappingSummaries.js.map +7 -0
- package/dist/modules/ecommerce/lib/exclusiveFlag.js +57 -0
- package/dist/modules/ecommerce/lib/exclusiveFlag.js.map +7 -0
- package/dist/modules/ecommerce/lib/references.js +70 -0
- package/dist/modules/ecommerce/lib/references.js.map +7 -0
- package/dist/modules/ecommerce/lib/seedDraftStore.js +99 -0
- package/dist/modules/ecommerce/lib/seedDraftStore.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBindingCascade.js +109 -0
- package/dist/modules/ecommerce/lib/storeBindingCascade.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBranding.js +40 -0
- package/dist/modules/ecommerce/lib/storeBranding.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBrandingRoute.js +76 -0
- package/dist/modules/ecommerce/lib/storeBrandingRoute.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeContext.js +393 -0
- package/dist/modules/ecommerce/lib/storeContext.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeContextService.js +43 -0
- package/dist/modules/ecommerce/lib/storeContextService.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeLocale.js +60 -0
- package/dist/modules/ecommerce/lib/storeLocale.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeNotifications.js +41 -0
- package/dist/modules/ecommerce/lib/storeNotifications.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCatalogSupport.js +248 -0
- package/dist/modules/ecommerce/lib/storefrontCatalogSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCategories.js +241 -0
- package/dist/modules/ecommerce/lib/storefrontCategories.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCategoryCache.js +71 -0
- package/dist/modules/ecommerce/lib/storefrontCategoryCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontDetail.js +447 -0
- package/dist/modules/ecommerce/lib/storefrontDetail.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontFacets.js +441 -0
- package/dist/modules/ecommerce/lib/storefrontFacets.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontOptionFilter.js +15 -0
- package/dist/modules/ecommerce/lib/storefrontOptionFilter.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontPricing.js +393 -0
- package/dist/modules/ecommerce/lib/storefrontPricing.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProductCache.js +90 -0
- package/dist/modules/ecommerce/lib/storefrontProductCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProductScope.js +107 -0
- package/dist/modules/ecommerce/lib/storefrontProductScope.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProducts.js +670 -0
- package/dist/modules/ecommerce/lib/storefrontProducts.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontQuery.js +156 -0
- package/dist/modules/ecommerce/lib/storefrontQuery.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontRateLimit.js +99 -0
- package/dist/modules/ecommerce/lib/storefrontRateLimit.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontSearch.js +303 -0
- package/dist/modules/ecommerce/lib/storefrontSearch.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontSearchCache.js +35 -0
- package/dist/modules/ecommerce/lib/storefrontSearchCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/subscriberSupport.js +33 -0
- package/dist/modules/ecommerce/lib/subscriberSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/types.js +1 -0
- package/dist/modules/ecommerce/lib/types.js.map +7 -0
- package/dist/modules/ecommerce/migrations/Migration20261005113233_ecommerce.js +32 -0
- package/dist/modules/ecommerce/migrations/Migration20261005113233_ecommerce.js.map +7 -0
- package/dist/modules/ecommerce/migrations/Migration20261006112733_ecommerce.js +17 -0
- package/dist/modules/ecommerce/migrations/Migration20261006112733_ecommerce.js.map +7 -0
- package/dist/modules/ecommerce/notifications.client.js +47 -0
- package/dist/modules/ecommerce/notifications.client.js.map +7 -0
- package/dist/modules/ecommerce/notifications.js +48 -0
- package/dist/modules/ecommerce/notifications.js.map +7 -0
- package/dist/modules/ecommerce/search.js +83 -0
- package/dist/modules/ecommerce/search.js.map +7 -0
- package/dist/modules/ecommerce/setup.js +17 -0
- package/dist/modules/ecommerce/setup.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/assortment-empty-notifications.js +14 -0
- package/dist/modules/ecommerce/subscribers/assortment-empty-notifications.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/availability-policy-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/availability-policy-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-category-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-category-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-price-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-price-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-product-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-product-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/domain-binding-rebind.js +16 -0
- package/dist/modules/ecommerce/subscribers/domain-binding-rebind.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-notifications.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-notifications.js.map +7 -0
- package/dist/modules/query_index/lib/batch.js +23 -9
- package/dist/modules/query_index/lib/batch.js.map +2 -2
- package/dist/modules/query_index/lib/doc-enrichers.js +212 -0
- package/dist/modules/query_index/lib/doc-enrichers.js.map +7 -0
- package/dist/modules/query_index/lib/document.js +2 -0
- package/dist/modules/query_index/lib/document.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +68 -1
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/indexer.js +7 -0
- package/dist/modules/query_index/lib/indexer.js.map +2 -2
- package/dist/modules/query_index/lib/search-tokens.js +2 -0
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/query_index/migrations/Migration20261005201500_query_index.js +17 -0
- package/dist/modules/query_index/migrations/Migration20261005201500_query_index.js.map +7 -0
- package/dist/modules/translations/components/TranslationManager.js +3 -3
- package/dist/modules/translations/components/TranslationManager.js.map +2 -2
- package/dist/modules/translations/data/validators.js +1 -1
- package/dist/modules/translations/data/validators.js.map +1 -1
- package/dist/modules/translations/lib/batch.js +21 -1
- package/dist/modules/translations/lib/batch.js.map +2 -2
- package/dist/modules/translations/lib/helpers.js +3 -0
- package/dist/modules/translations/lib/helpers.js.map +2 -2
- package/dist/modules/translations/lib/resolve-field-list.js +14 -2
- package/dist/modules/translations/lib/resolve-field-list.js.map +2 -2
- package/generated/entities/catalog_price_history_entry/index.ts +25 -0
- package/generated/entities/customer_group_terms/index.ts +1 -0
- package/generated/entities/ecommerce_store/index.ts +15 -0
- package/generated/entities/ecommerce_store_channel_binding/index.ts +13 -0
- package/generated/entities/ecommerce_store_domain_binding/index.ts +10 -0
- package/generated/entities.ids.generated.ts +8 -1
- package/generated/entity-fields-registry.ts +72 -0
- package/package.json +7 -7
- package/src/helpers/integration/customerGroupsFixtures.ts +2 -0
- package/src/modules/auth/i18n/de.json +8 -0
- package/src/modules/auth/i18n/en.json +8 -0
- package/src/modules/auth/i18n/es.json +8 -0
- package/src/modules/auth/i18n/ko.json +8 -0
- package/src/modules/auth/i18n/pl.json +8 -0
- package/src/modules/catalog/AGENTS.md +5 -2
- package/src/modules/catalog/acl.ts +7 -0
- package/src/modules/catalog/api/config/omnibus/route.ts +204 -0
- package/src/modules/catalog/api/prices/history/route.ts +139 -0
- package/src/modules/catalog/api/prices/omnibus-preview/route.ts +202 -0
- package/src/modules/catalog/api/products/route.ts +53 -308
- package/src/modules/catalog/api/tags/route.ts +6 -0
- package/src/modules/catalog/backend/config/catalog/page.tsx +2 -0
- package/src/modules/catalog/cli.ts +84 -1
- package/src/modules/catalog/commands/categories.ts +54 -2
- package/src/modules/catalog/commands/prices.ts +43 -1
- package/src/modules/catalog/commands/products.ts +84 -1
- package/src/modules/catalog/commands/variants.ts +7 -0
- package/src/modules/catalog/components/OmnibusSettings.tsx +832 -0
- package/src/modules/catalog/components/PriceEditorOmnibusRow.tsx +219 -0
- package/src/modules/catalog/components/lookupSources.ts +29 -0
- package/src/modules/catalog/components/prices/PriceScopeSelectors.tsx +9 -0
- package/src/modules/catalog/components/products/VariantBuilder.tsx +9 -0
- package/src/modules/catalog/data/entities.ts +123 -1
- package/src/modules/catalog/data/validators.ts +118 -0
- package/src/modules/catalog/di.ts +23 -0
- package/src/modules/catalog/i18n/de.json +77 -0
- package/src/modules/catalog/i18n/en.json +77 -0
- package/src/modules/catalog/i18n/es.json +77 -0
- package/src/modules/catalog/i18n/ko.json +77 -0
- package/src/modules/catalog/i18n/pl.json +77 -0
- package/src/modules/catalog/lib/omnibus.ts +406 -0
- package/src/modules/catalog/lib/omnibusBackfill.ts +198 -0
- package/src/modules/catalog/lib/omnibusCache.ts +111 -0
- package/src/modules/catalog/lib/omnibusConfig.ts +73 -0
- package/src/modules/catalog/lib/omnibusHistoryQueries.ts +248 -0
- package/src/modules/catalog/lib/omnibusPresentedEntry.ts +76 -0
- package/src/modules/catalog/lib/omnibusProductListEnrichment.ts +125 -0
- package/src/modules/catalog/lib/omnibusTypes.ts +202 -0
- package/src/modules/catalog/lib/optionSchemaTranslations.ts +55 -0
- package/src/modules/catalog/lib/priceHistoryQuery.ts +155 -0
- package/src/modules/catalog/lib/pricing.ts +42 -4
- package/src/modules/catalog/lib/productFilters.ts +349 -0
- package/src/modules/catalog/lib/productScopeKeys.ts +162 -0
- package/src/modules/catalog/lib/productScopeReindex.ts +139 -0
- package/src/modules/catalog/migrations/.snapshot-open-mercato.json +572 -0
- package/src/modules/catalog/migrations/Migration20261005105352_catalog.ts +39 -0
- package/src/modules/catalog/migrations/Migration20261005150824_catalog.ts +39 -0
- package/src/modules/catalog/services/catalogOmnibusService.ts +642 -0
- package/src/modules/catalog/setup.ts +2 -0
- package/src/modules/catalog/subscribers/product-scope-keys-category-deleted.ts +18 -0
- package/src/modules/catalog/subscribers/product-scope-keys-category-updated.ts +19 -0
- package/src/modules/catalog/translations.ts +12 -0
- package/src/modules/configs/i18n/de.json +5 -1
- package/src/modules/configs/i18n/en.json +5 -1
- package/src/modules/configs/i18n/es.json +5 -1
- package/src/modules/configs/i18n/ko.json +5 -1
- package/src/modules/configs/i18n/pl.json +5 -1
- package/src/modules/configs/lib/upgrade-actions.ts +35 -0
- package/src/modules/customer_groups/api/customer-groups/[id]/terms/route.ts +7 -0
- package/src/modules/customer_groups/components/CustomerGroupTermsSection.tsx +124 -2
- package/src/modules/customer_groups/components/customerGroupAssortmentScope.ts +46 -0
- package/src/modules/customer_groups/data/entities.ts +4 -0
- package/src/modules/customer_groups/data/validators.ts +14 -0
- package/src/modules/customer_groups/i18n/de.json +12 -0
- package/src/modules/customer_groups/i18n/en.json +12 -0
- package/src/modules/customer_groups/i18n/es.json +12 -0
- package/src/modules/customer_groups/i18n/ko.json +12 -0
- package/src/modules/customer_groups/i18n/pl.json +12 -0
- package/src/modules/customer_groups/migrations/.snapshot-open-mercato.json +17 -0
- package/src/modules/customer_groups/migrations/Migration20261005110250_customer_groups.ts +15 -0
- package/src/modules/customer_groups/services/customerGroupsService.ts +74 -23
- package/src/modules/ecommerce/acl.ts +9 -0
- package/src/modules/ecommerce/api/domain-mappings/route.ts +76 -0
- package/src/modules/ecommerce/api/openapi.ts +28 -0
- package/src/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.ts +141 -0
- package/src/modules/ecommerce/api/store-channel-bindings/crud.ts +283 -0
- package/src/modules/ecommerce/api/store-channel-bindings/route.ts +67 -0
- package/src/modules/ecommerce/api/store-domain-bindings/crud.ts +324 -0
- package/src/modules/ecommerce/api/store-domain-bindings/route.ts +73 -0
- package/src/modules/ecommerce/api/storefront/categories/[slug]/route.ts +94 -0
- package/src/modules/ecommerce/api/storefront/categories/openapiSchemas.ts +63 -0
- package/src/modules/ecommerce/api/storefront/categories/route.ts +78 -0
- package/src/modules/ecommerce/api/storefront/context/route.ts +203 -0
- package/src/modules/ecommerce/api/storefront/products/[idOrHandle]/route.ts +94 -0
- package/src/modules/ecommerce/api/storefront/products/openapiSchemas.ts +193 -0
- package/src/modules/ecommerce/api/storefront/products/route.ts +81 -0
- package/src/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.ts +25 -0
- package/src/modules/ecommerce/api/storefront/search/suggest/route.ts +78 -0
- package/src/modules/ecommerce/api/storefront/storefrontRouteSupport.ts +68 -0
- package/src/modules/ecommerce/api/stores/[id]/branding/route.ts +205 -0
- package/src/modules/ecommerce/api/stores/[id]/preview-branding/route.ts +99 -0
- package/src/modules/ecommerce/api/stores/crud.ts +457 -0
- package/src/modules/ecommerce/api/stores/route.ts +66 -0
- package/src/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.ts +12 -0
- package/src/modules/ecommerce/backend/config/ecommerce/[id]/page.tsx +5 -0
- package/src/modules/ecommerce/backend/config/ecommerce/page.meta.ts +12 -0
- package/src/modules/ecommerce/backend/config/ecommerce/page.tsx +5 -0
- package/src/modules/ecommerce/commands/stores.ts +154 -0
- package/src/modules/ecommerce/components/ChannelAssortmentCount.tsx +138 -0
- package/src/modules/ecommerce/components/ChannelBindingFormSections.tsx +40 -0
- package/src/modules/ecommerce/components/ChannelLookupPicker.tsx +5 -0
- package/src/modules/ecommerce/components/DomainStatusWarning.tsx +32 -0
- package/src/modules/ecommerce/components/StoreAvailabilityDefaultsSection.tsx +219 -0
- package/src/modules/ecommerce/components/StoreBrandingControls.tsx +73 -0
- package/src/modules/ecommerce/components/StoreBrandingPreview.tsx +77 -0
- package/src/modules/ecommerce/components/StoreBrandingTab.tsx +242 -0
- package/src/modules/ecommerce/components/StoreChannelBindingDialog.tsx +306 -0
- package/src/modules/ecommerce/components/StoreChannelsTab.tsx +375 -0
- package/src/modules/ecommerce/components/StoreCreateDialog.tsx +204 -0
- package/src/modules/ecommerce/components/StoreDomainBindingDialog.tsx +198 -0
- package/src/modules/ecommerce/components/StoreDomainsTab.tsx +426 -0
- package/src/modules/ecommerce/components/StoreEditPage.tsx +193 -0
- package/src/modules/ecommerce/components/StoreGeneralTab.tsx +189 -0
- package/src/modules/ecommerce/components/StoreListPage.tsx +326 -0
- package/src/modules/ecommerce/components/StoreSeoTab.tsx +152 -0
- package/src/modules/ecommerce/components/StoreStatusBadge.tsx +22 -0
- package/src/modules/ecommerce/components/channelLookups.ts +24 -0
- package/src/modules/ecommerce/components/storeAdmin.ts +56 -0
- package/src/modules/ecommerce/components/storeBrandingForm.ts +230 -0
- package/src/modules/ecommerce/components/storeChannels.ts +210 -0
- package/src/modules/ecommerce/components/storeDomains.ts +221 -0
- package/src/modules/ecommerce/components/storeEditTabs.tsx +76 -0
- package/src/modules/ecommerce/components/storeGeneral.ts +155 -0
- package/src/modules/ecommerce/components/storeSeo.ts +78 -0
- package/src/modules/ecommerce/components/useChannelAssortmentCount.ts +67 -0
- package/src/modules/ecommerce/components/useStoreAccess.ts +36 -0
- package/src/modules/ecommerce/data/enrichers.ts +213 -0
- package/src/modules/ecommerce/data/entities.ts +168 -0
- package/src/modules/ecommerce/data/validators.ts +587 -0
- package/src/modules/ecommerce/di.ts +9 -0
- package/src/modules/ecommerce/events.ts +27 -0
- package/src/modules/ecommerce/i18n/de.json +341 -0
- package/src/modules/ecommerce/i18n/en.json +341 -0
- package/src/modules/ecommerce/i18n/es.json +341 -0
- package/src/modules/ecommerce/i18n/ko.json +341 -0
- package/src/modules/ecommerce/i18n/pl.json +341 -0
- package/src/modules/ecommerce/index.ts +14 -0
- package/src/modules/ecommerce/lib/assortmentCount.ts +175 -0
- package/src/modules/ecommerce/lib/brandingStyles.ts +215 -0
- package/src/modules/ecommerce/lib/buyerContext.ts +401 -0
- package/src/modules/ecommerce/lib/cacheInvalidation.ts +302 -0
- package/src/modules/ecommerce/lib/cacheKeys.ts +340 -0
- package/src/modules/ecommerce/lib/createConflictRecheck.ts +31 -0
- package/src/modules/ecommerce/lib/crudEvents.ts +128 -0
- package/src/modules/ecommerce/lib/crudSupport.ts +85 -0
- package/src/modules/ecommerce/lib/domainBindingRebind.ts +138 -0
- package/src/modules/ecommerce/lib/domainMappingSummaries.ts +71 -0
- package/src/modules/ecommerce/lib/exclusiveFlag.ts +90 -0
- package/src/modules/ecommerce/lib/references.ts +93 -0
- package/src/modules/ecommerce/lib/seedDraftStore.ts +125 -0
- package/src/modules/ecommerce/lib/storeBindingCascade.ts +138 -0
- package/src/modules/ecommerce/lib/storeBranding.ts +48 -0
- package/src/modules/ecommerce/lib/storeBrandingRoute.ts +91 -0
- package/src/modules/ecommerce/lib/storeContext.ts +669 -0
- package/src/modules/ecommerce/lib/storeContextService.ts +71 -0
- package/src/modules/ecommerce/lib/storeLocale.ts +88 -0
- package/src/modules/ecommerce/lib/storeNotifications.ts +55 -0
- package/src/modules/ecommerce/lib/storefrontCatalogSupport.ts +427 -0
- package/src/modules/ecommerce/lib/storefrontCategories.ts +419 -0
- package/src/modules/ecommerce/lib/storefrontCategoryCache.ts +113 -0
- package/src/modules/ecommerce/lib/storefrontDetail.ts +654 -0
- package/src/modules/ecommerce/lib/storefrontFacets.ts +697 -0
- package/src/modules/ecommerce/lib/storefrontOptionFilter.ts +44 -0
- package/src/modules/ecommerce/lib/storefrontPricing.ts +583 -0
- package/src/modules/ecommerce/lib/storefrontProductCache.ts +126 -0
- package/src/modules/ecommerce/lib/storefrontProductScope.ts +181 -0
- package/src/modules/ecommerce/lib/storefrontProducts.ts +963 -0
- package/src/modules/ecommerce/lib/storefrontQuery.ts +215 -0
- package/src/modules/ecommerce/lib/storefrontRateLimit.ts +126 -0
- package/src/modules/ecommerce/lib/storefrontSearch.ts +454 -0
- package/src/modules/ecommerce/lib/storefrontSearchCache.ts +49 -0
- package/src/modules/ecommerce/lib/subscriberSupport.ts +41 -0
- package/src/modules/ecommerce/lib/types.ts +69 -0
- package/src/modules/ecommerce/migrations/.snapshot-open-mercato.json +829 -0
- package/src/modules/ecommerce/migrations/Migration20261005113233_ecommerce.ts +32 -0
- package/src/modules/ecommerce/migrations/Migration20261006112733_ecommerce.ts +15 -0
- package/src/modules/ecommerce/notifications.client.ts +46 -0
- package/src/modules/ecommerce/notifications.ts +46 -0
- package/src/modules/ecommerce/search.ts +93 -0
- package/src/modules/ecommerce/setup.ts +15 -0
- package/src/modules/ecommerce/subscribers/assortment-empty-notifications.ts +12 -0
- package/src/modules/ecommerce/subscribers/availability-policy-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-category-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-price-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-product-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/domain-binding-rebind.ts +14 -0
- package/src/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-notifications.ts +12 -0
- package/src/modules/query_index/lib/batch.ts +25 -9
- package/src/modules/query_index/lib/doc-enrichers.ts +306 -0
- package/src/modules/query_index/lib/document.ts +2 -0
- package/src/modules/query_index/lib/engine.ts +58 -1
- package/src/modules/query_index/lib/indexer.ts +8 -0
- package/src/modules/query_index/lib/search-tokens.ts +2 -0
- package/src/modules/query_index/migrations/Migration20261005201500_query_index.ts +42 -0
- package/src/modules/translations/components/TranslationManager.tsx +3 -3
- package/src/modules/translations/data/validators.ts +1 -1
- package/src/modules/translations/lib/batch.ts +47 -0
- package/src/modules/translations/lib/helpers.ts +4 -0
- 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
|