@endora-commerce/mod-catalog 0.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +63 -0
- package/dist/admin/components/PackagingUnitsEditor.d.ts +12 -0
- package/dist/admin/components/PackagingUnitsEditor.d.ts.map +1 -0
- package/dist/admin/components/PackagingUnitsEditor.js +99 -0
- package/dist/admin/components/PackagingUnitsEditor.js.map +1 -0
- package/dist/admin/components/ProductAttributesTab.d.ts +13 -0
- package/dist/admin/components/ProductAttributesTab.d.ts.map +1 -0
- package/dist/admin/components/ProductAttributesTab.js +140 -0
- package/dist/admin/components/ProductAttributesTab.js.map +1 -0
- package/dist/admin/components/ProductInventoryTab.d.ts +14 -0
- package/dist/admin/components/ProductInventoryTab.d.ts.map +1 -0
- package/dist/admin/components/ProductInventoryTab.js +284 -0
- package/dist/admin/components/ProductInventoryTab.js.map +1 -0
- package/dist/admin/components/ProductScopeEditor.d.ts +94 -0
- package/dist/admin/components/ProductScopeEditor.d.ts.map +1 -0
- package/dist/admin/components/ProductScopeEditor.js +395 -0
- package/dist/admin/components/ProductScopeEditor.js.map +1 -0
- package/dist/admin/components/ProductsBulkEditDialog.d.ts +11 -0
- package/dist/admin/components/ProductsBulkEditDialog.d.ts.map +1 -0
- package/dist/admin/components/ProductsBulkEditDialog.js +304 -0
- package/dist/admin/components/ProductsBulkEditDialog.js.map +1 -0
- package/dist/admin/index.d.ts +45 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +184 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/lib/resolve-product-selection.d.ts +21 -0
- package/dist/admin/lib/resolve-product-selection.d.ts.map +1 -0
- package/dist/admin/lib/resolve-product-selection.js +25 -0
- package/dist/admin/lib/resolve-product-selection.js.map +1 -0
- package/dist/admin/pages/AttachmentTypesPage.d.ts +18 -0
- package/dist/admin/pages/AttachmentTypesPage.d.ts.map +1 -0
- package/dist/admin/pages/AttachmentTypesPage.js +92 -0
- package/dist/admin/pages/AttachmentTypesPage.js.map +1 -0
- package/dist/admin/pages/AttributeSetsPage.d.ts +21 -0
- package/dist/admin/pages/AttributeSetsPage.d.ts.map +1 -0
- package/dist/admin/pages/AttributeSetsPage.js +158 -0
- package/dist/admin/pages/AttributeSetsPage.js.map +1 -0
- package/dist/admin/pages/AttributesManager.d.ts +9 -0
- package/dist/admin/pages/AttributesManager.d.ts.map +1 -0
- package/dist/admin/pages/AttributesManager.js +305 -0
- package/dist/admin/pages/AttributesManager.js.map +1 -0
- package/dist/admin/pages/BulkOperationDetailPage.d.ts +9 -0
- package/dist/admin/pages/BulkOperationDetailPage.d.ts.map +1 -0
- package/dist/admin/pages/BulkOperationDetailPage.js +187 -0
- package/dist/admin/pages/BulkOperationDetailPage.js.map +1 -0
- package/dist/admin/pages/BulkOperationsPage.d.ts +9 -0
- package/dist/admin/pages/BulkOperationsPage.d.ts.map +1 -0
- package/dist/admin/pages/BulkOperationsPage.js +98 -0
- package/dist/admin/pages/BulkOperationsPage.js.map +1 -0
- package/dist/admin/pages/CategoriesTree.d.ts +9 -0
- package/dist/admin/pages/CategoriesTree.d.ts.map +1 -0
- package/dist/admin/pages/CategoriesTree.js +176 -0
- package/dist/admin/pages/CategoriesTree.js.map +1 -0
- package/dist/admin/pages/ProductEditor.d.ts +13 -0
- package/dist/admin/pages/ProductEditor.d.ts.map +1 -0
- package/dist/admin/pages/ProductEditor.js +1050 -0
- package/dist/admin/pages/ProductEditor.js.map +1 -0
- package/dist/admin/pages/ProductsList.d.ts +9 -0
- package/dist/admin/pages/ProductsList.d.ts.map +1 -0
- package/dist/admin/pages/ProductsList.js +399 -0
- package/dist/admin/pages/ProductsList.js.map +1 -0
- package/dist/backend/commands/attribute-commands.d.ts +111 -0
- package/dist/backend/commands/attribute-commands.d.ts.map +1 -0
- package/dist/backend/commands/attribute-commands.js +482 -0
- package/dist/backend/commands/attribute-commands.js.map +1 -0
- package/dist/backend/demo/reset.d.ts +23 -0
- package/dist/backend/demo/reset.d.ts.map +1 -0
- package/dist/backend/demo/reset.js +41 -0
- package/dist/backend/demo/reset.js.map +1 -0
- package/dist/backend/demo/rows.d.ts +103 -0
- package/dist/backend/demo/rows.d.ts.map +1 -0
- package/dist/backend/demo/rows.js +162 -0
- package/dist/backend/demo/rows.js.map +1 -0
- package/dist/backend/demo/seed.d.ts +35 -0
- package/dist/backend/demo/seed.d.ts.map +1 -0
- package/dist/backend/demo/seed.js +177 -0
- package/dist/backend/demo/seed.js.map +1 -0
- package/dist/backend/entities/attachment-type.entity.d.ts +16 -0
- package/dist/backend/entities/attachment-type.entity.d.ts.map +1 -0
- package/dist/backend/entities/attachment-type.entity.js +57 -0
- package/dist/backend/entities/attachment-type.entity.js.map +1 -0
- package/dist/backend/entities/attribute-set-attribute.entity.d.ts +26 -0
- package/dist/backend/entities/attribute-set-attribute.entity.d.ts.map +1 -0
- package/dist/backend/entities/attribute-set-attribute.entity.js +55 -0
- package/dist/backend/entities/attribute-set-attribute.entity.js.map +1 -0
- package/dist/backend/entities/attribute-set.entity.d.ts +22 -0
- package/dist/backend/entities/attribute-set.entity.d.ts.map +1 -0
- package/dist/backend/entities/attribute-set.entity.js +67 -0
- package/dist/backend/entities/attribute-set.entity.js.map +1 -0
- package/dist/backend/entities/bulk-operation.entity.d.ts +78 -0
- package/dist/backend/entities/bulk-operation.entity.d.ts.map +1 -0
- package/dist/backend/entities/bulk-operation.entity.js +138 -0
- package/dist/backend/entities/bulk-operation.entity.js.map +1 -0
- package/dist/backend/entities/bundle-slot-option.entity.d.ts +23 -0
- package/dist/backend/entities/bundle-slot-option.entity.d.ts.map +1 -0
- package/dist/backend/entities/bundle-slot-option.entity.js +68 -0
- package/dist/backend/entities/bundle-slot-option.entity.js.map +1 -0
- package/dist/backend/entities/bundle-slot.entity.d.ts +25 -0
- package/dist/backend/entities/bundle-slot.entity.d.ts.map +1 -0
- package/dist/backend/entities/bundle-slot.entity.js +74 -0
- package/dist/backend/entities/bundle-slot.entity.js.map +1 -0
- package/dist/backend/entities/category.entity.d.ts +26 -0
- package/dist/backend/entities/category.entity.d.ts.map +1 -0
- package/dist/backend/entities/category.entity.js +119 -0
- package/dist/backend/entities/category.entity.js.map +1 -0
- package/dist/backend/entities/gallery-item-label.entity.d.ts +22 -0
- package/dist/backend/entities/gallery-item-label.entity.d.ts.map +1 -0
- package/dist/backend/entities/gallery-item-label.entity.js +50 -0
- package/dist/backend/entities/gallery-item-label.entity.js.map +1 -0
- package/dist/backend/entities/gallery-item.entity.d.ts +17 -0
- package/dist/backend/entities/gallery-item.entity.d.ts.map +1 -0
- package/dist/backend/entities/gallery-item.entity.js +58 -0
- package/dist/backend/entities/gallery-item.entity.js.map +1 -0
- package/dist/backend/entities/grouped-item.entity.d.ts +23 -0
- package/dist/backend/entities/grouped-item.entity.d.ts.map +1 -0
- package/dist/backend/entities/grouped-item.entity.js +68 -0
- package/dist/backend/entities/grouped-item.entity.js.map +1 -0
- package/dist/backend/entities/product-attachment.entity.d.ts +23 -0
- package/dist/backend/entities/product-attachment.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-attachment.entity.js +77 -0
- package/dist/backend/entities/product-attachment.entity.js.map +1 -0
- package/dist/backend/entities/product-attribute.entity.d.ts +72 -0
- package/dist/backend/entities/product-attribute.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-attribute.entity.js +161 -0
- package/dist/backend/entities/product-attribute.entity.js.map +1 -0
- package/dist/backend/entities/product-editor-preference.entity.d.ts +28 -0
- package/dist/backend/entities/product-editor-preference.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-editor-preference.entity.js +63 -0
- package/dist/backend/entities/product-editor-preference.entity.js.map +1 -0
- package/dist/backend/entities/product-link.entity.d.ts +25 -0
- package/dist/backend/entities/product-link.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-link.entity.js +70 -0
- package/dist/backend/entities/product-link.entity.js.map +1 -0
- package/dist/backend/entities/product-packaging-unit.entity.d.ts +26 -0
- package/dist/backend/entities/product-packaging-unit.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-packaging-unit.entity.js +76 -0
- package/dist/backend/entities/product-packaging-unit.entity.js.map +1 -0
- package/dist/backend/entities/product-value-override.entity.d.ts +43 -0
- package/dist/backend/entities/product-value-override.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-value-override.entity.js +90 -0
- package/dist/backend/entities/product-value-override.entity.js.map +1 -0
- package/dist/backend/entities/product-variant.entity.d.ts +18 -0
- package/dist/backend/entities/product-variant.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-variant.entity.js +68 -0
- package/dist/backend/entities/product-variant.entity.js.map +1 -0
- package/dist/backend/entities/product.entity.d.ts +108 -0
- package/dist/backend/entities/product.entity.d.ts.map +1 -0
- package/dist/backend/entities/product.entity.js +230 -0
- package/dist/backend/entities/product.entity.js.map +1 -0
- package/dist/backend/index.d.ts +262 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +642 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +216 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +223 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/prompt-tools.d.ts +47 -0
- package/dist/backend/prompt-tools.d.ts.map +1 -0
- package/dist/backend/prompt-tools.js +284 -0
- package/dist/backend/prompt-tools.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +105 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +1162 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.api-key.d.ts +33 -0
- package/dist/backend/routes.api-key.d.ts.map +1 -0
- package/dist/backend/routes.api-key.js +43 -0
- package/dist/backend/routes.api-key.js.map +1 -0
- package/dist/backend/routes.external.d.ts +32 -0
- package/dist/backend/routes.external.d.ts.map +1 -0
- package/dist/backend/routes.external.js +115 -0
- package/dist/backend/routes.external.js.map +1 -0
- package/dist/backend/routes.public.d.ts +46 -0
- package/dist/backend/routes.public.d.ts.map +1 -0
- package/dist/backend/routes.public.js +318 -0
- package/dist/backend/routes.public.js.map +1 -0
- package/dist/backend/services/asset-references.d.ts +4 -0
- package/dist/backend/services/asset-references.d.ts.map +1 -0
- package/dist/backend/services/asset-references.js +104 -0
- package/dist/backend/services/asset-references.js.map +1 -0
- package/dist/backend/services/attachment.service.d.ts +45 -0
- package/dist/backend/services/attachment.service.d.ts.map +1 -0
- package/dist/backend/services/attachment.service.js +268 -0
- package/dist/backend/services/attachment.service.js.map +1 -0
- package/dist/backend/services/attribute-option-validator.d.ts +47 -0
- package/dist/backend/services/attribute-option-validator.d.ts.map +1 -0
- package/dist/backend/services/attribute-option-validator.js +69 -0
- package/dist/backend/services/attribute-option-validator.js.map +1 -0
- package/dist/backend/services/attribute-set-validations.d.ts +65 -0
- package/dist/backend/services/attribute-set-validations.d.ts.map +1 -0
- package/dist/backend/services/attribute-set-validations.js +89 -0
- package/dist/backend/services/attribute-set-validations.js.map +1 -0
- package/dist/backend/services/attribute-set.service.d.ts +50 -0
- package/dist/backend/services/attribute-set.service.d.ts.map +1 -0
- package/dist/backend/services/attribute-set.service.js +401 -0
- package/dist/backend/services/attribute-set.service.js.map +1 -0
- package/dist/backend/services/attribute-type-mapping.d.ts +66 -0
- package/dist/backend/services/attribute-type-mapping.d.ts.map +1 -0
- package/dist/backend/services/attribute-type-mapping.js +121 -0
- package/dist/backend/services/attribute-type-mapping.js.map +1 -0
- package/dist/backend/services/attribute-value-key.service.d.ts +48 -0
- package/dist/backend/services/attribute-value-key.service.d.ts.map +1 -0
- package/dist/backend/services/attribute-value-key.service.js +118 -0
- package/dist/backend/services/attribute-value-key.service.js.map +1 -0
- package/dist/backend/services/audit-references.d.ts +13 -0
- package/dist/backend/services/audit-references.d.ts.map +1 -0
- package/dist/backend/services/audit-references.js +51 -0
- package/dist/backend/services/audit-references.js.map +1 -0
- package/dist/backend/services/bulk-operation-queue.d.ts +26 -0
- package/dist/backend/services/bulk-operation-queue.d.ts.map +1 -0
- package/dist/backend/services/bulk-operation-queue.js +34 -0
- package/dist/backend/services/bulk-operation-queue.js.map +1 -0
- package/dist/backend/services/bulk-operation.service.d.ts +195 -0
- package/dist/backend/services/bulk-operation.service.d.ts.map +1 -0
- package/dist/backend/services/bulk-operation.service.js +510 -0
- package/dist/backend/services/bulk-operation.service.js.map +1 -0
- package/dist/backend/services/bundle.service.d.ts +87 -0
- package/dist/backend/services/bundle.service.d.ts.map +1 -0
- package/dist/backend/services/bundle.service.js +286 -0
- package/dist/backend/services/bundle.service.js.map +1 -0
- package/dist/backend/services/catalog-admin.service.d.ts +398 -0
- package/dist/backend/services/catalog-admin.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-admin.service.js +1516 -0
- package/dist/backend/services/catalog-admin.service.js.map +1 -0
- package/dist/backend/services/catalog-attribute-read.service.d.ts +78 -0
- package/dist/backend/services/catalog-attribute-read.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-attribute-read.service.js +216 -0
- package/dist/backend/services/catalog-attribute-read.service.js.map +1 -0
- package/dist/backend/services/catalog-bulk-import.service.d.ts +30 -0
- package/dist/backend/services/catalog-bulk-import.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-bulk-import.service.js +136 -0
- package/dist/backend/services/catalog-bulk-import.service.js.map +1 -0
- package/dist/backend/services/catalog-bulk-update.service.d.ts +91 -0
- package/dist/backend/services/catalog-bulk-update.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-bulk-update.service.js +330 -0
- package/dist/backend/services/catalog-bulk-update.service.js.map +1 -0
- package/dist/backend/services/catalog-category-read.service.d.ts +66 -0
- package/dist/backend/services/catalog-category-read.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-category-read.service.js +248 -0
- package/dist/backend/services/catalog-category-read.service.js.map +1 -0
- package/dist/backend/services/catalog-org-price-decorator.d.ts +90 -0
- package/dist/backend/services/catalog-org-price-decorator.d.ts.map +1 -0
- package/dist/backend/services/catalog-org-price-decorator.js +184 -0
- package/dist/backend/services/catalog-org-price-decorator.js.map +1 -0
- package/dist/backend/services/catalog-product-filter.service.d.ts +82 -0
- package/dist/backend/services/catalog-product-filter.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-product-filter.service.js +275 -0
- package/dist/backend/services/catalog-product-filter.service.js.map +1 -0
- package/dist/backend/services/catalog-product-read.service.d.ts +46 -0
- package/dist/backend/services/catalog-product-read.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-product-read.service.js +197 -0
- package/dist/backend/services/catalog-product-read.service.js.map +1 -0
- package/dist/backend/services/catalog-query.service.d.ts +444 -0
- package/dist/backend/services/catalog-query.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-query.service.js +1633 -0
- package/dist/backend/services/catalog-query.service.js.map +1 -0
- package/dist/backend/services/catalog-quick-search.service.d.ts +78 -0
- package/dist/backend/services/catalog-quick-search.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-quick-search.service.js +159 -0
- package/dist/backend/services/catalog-quick-search.service.js.map +1 -0
- package/dist/backend/services/catalog-write-ports.d.ts +25 -0
- package/dist/backend/services/catalog-write-ports.d.ts.map +1 -0
- package/dist/backend/services/catalog-write-ports.js +63 -0
- package/dist/backend/services/catalog-write-ports.js.map +1 -0
- package/dist/backend/services/category-admin.service.d.ts +102 -0
- package/dist/backend/services/category-admin.service.d.ts.map +1 -0
- package/dist/backend/services/category-admin.service.js +271 -0
- package/dist/backend/services/category-admin.service.js.map +1 -0
- package/dist/backend/services/gallery.service.d.ts +85 -0
- package/dist/backend/services/gallery.service.d.ts.map +1 -0
- package/dist/backend/services/gallery.service.js +326 -0
- package/dist/backend/services/gallery.service.js.map +1 -0
- package/dist/backend/services/grouped.service.d.ts +39 -0
- package/dist/backend/services/grouped.service.d.ts.map +1 -0
- package/dist/backend/services/grouped.service.js +136 -0
- package/dist/backend/services/grouped.service.js.map +1 -0
- package/dist/backend/services/label-resolver.d.ts +16 -0
- package/dist/backend/services/label-resolver.d.ts.map +1 -0
- package/dist/backend/services/label-resolver.js +43 -0
- package/dist/backend/services/label-resolver.js.map +1 -0
- package/dist/backend/services/packaging-unit.service.d.ts +28 -0
- package/dist/backend/services/packaging-unit.service.d.ts.map +1 -0
- package/dist/backend/services/packaging-unit.service.js +197 -0
- package/dist/backend/services/packaging-unit.service.js.map +1 -0
- package/dist/backend/services/primary-asset-url.d.ts +4 -0
- package/dist/backend/services/primary-asset-url.d.ts.map +1 -0
- package/dist/backend/services/primary-asset-url.js +55 -0
- package/dist/backend/services/primary-asset-url.js.map +1 -0
- package/dist/backend/services/product-editor-preferences.service.d.ts +20 -0
- package/dist/backend/services/product-editor-preferences.service.d.ts.map +1 -0
- package/dist/backend/services/product-editor-preferences.service.js +44 -0
- package/dist/backend/services/product-editor-preferences.service.js.map +1 -0
- package/dist/backend/services/product-link.service.d.ts +169 -0
- package/dist/backend/services/product-link.service.d.ts.map +1 -0
- package/dist/backend/services/product-link.service.js +297 -0
- package/dist/backend/services/product-link.service.js.map +1 -0
- package/dist/backend/services/product-overrides.service.d.ts +77 -0
- package/dist/backend/services/product-overrides.service.d.ts.map +1 -0
- package/dist/backend/services/product-overrides.service.js +204 -0
- package/dist/backend/services/product-overrides.service.js.map +1 -0
- package/dist/backend/services/product-scope-context.service.d.ts +36 -0
- package/dist/backend/services/product-scope-context.service.d.ts.map +1 -0
- package/dist/backend/services/product-scope-context.service.js +106 -0
- package/dist/backend/services/product-scope-context.service.js.map +1 -0
- package/dist/backend/services/product-type-validations.d.ts +42 -0
- package/dist/backend/services/product-type-validations.d.ts.map +1 -0
- package/dist/backend/services/product-type-validations.js +55 -0
- package/dist/backend/services/product-type-validations.js.map +1 -0
- package/dist/backend/services/product-value-resolver.service.d.ts +59 -0
- package/dist/backend/services/product-value-resolver.service.d.ts.map +1 -0
- package/dist/backend/services/product-value-resolver.service.js +111 -0
- package/dist/backend/services/product-value-resolver.service.js.map +1 -0
- package/dist/backend/services/system-attribute-scopes.d.ts +18 -0
- package/dist/backend/services/system-attribute-scopes.d.ts.map +1 -0
- package/dist/backend/services/system-attribute-scopes.js +18 -0
- package/dist/backend/services/system-attribute-scopes.js.map +1 -0
- package/dist/backend/services/viewer-organization.d.ts +25 -0
- package/dist/backend/services/viewer-organization.d.ts.map +1 -0
- package/dist/backend/services/viewer-organization.js +31 -0
- package/dist/backend/services/viewer-organization.js.map +1 -0
- package/dist/manifest.d.ts +204 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +686 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.d.ts +33 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.d.ts.map +1 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.js +118 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.js.map +1 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.d.ts +24 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.d.ts.map +1 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.js +31 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.js.map +1 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.d.ts +32 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.d.ts.map +1 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.js +58 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.js.map +1 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.d.ts +22 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.d.ts.map +1 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.js +66 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.js.map +1 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.d.ts +18 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.d.ts.map +1 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.js +73 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.js.map +1 -0
- package/dist/migrations/20260429T123726_catalog_product_links.d.ts +21 -0
- package/dist/migrations/20260429T123726_catalog_product_links.d.ts.map +1 -0
- package/dist/migrations/20260429T123726_catalog_product_links.js +48 -0
- package/dist/migrations/20260429T123726_catalog_product_links.js.map +1 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.d.ts +23 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.d.ts.map +1 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.js +94 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.js.map +1 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.d.ts +24 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.d.ts.map +1 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.js +31 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.js.map +1 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.d.ts +31 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.d.ts.map +1 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.js +133 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.js.map +1 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.d.ts +16 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.d.ts.map +1 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.js +23 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.js.map +1 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.d.ts +10 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.d.ts.map +1 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.js +22 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.js.map +1 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.d.ts +38 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.d.ts.map +1 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.js +98 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.js.map +1 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.d.ts +13 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.d.ts.map +1 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.js +17 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.js.map +1 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.d.ts +16 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.d.ts.map +1 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.js +42 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.js.map +1 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.d.ts +14 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.d.ts.map +1 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.js +18 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.js.map +1 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.d.ts +11 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.d.ts.map +1 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.js +29 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.js.map +1 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.d.ts +23 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.d.ts.map +1 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.js +35 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.js.map +1 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.d.ts +12 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.d.ts.map +1 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.js +16 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.js.map +1 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.d.ts +32 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.d.ts.map +1 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.js +286 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.js.map +1 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.d.ts +36 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.d.ts.map +1 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.js +63 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.js.map +1 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.d.ts +18 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.d.ts.map +1 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.js +22 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.js.map +1 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.d.ts +27 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.d.ts.map +1 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.js +44 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.js.map +1 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.d.ts +27 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.d.ts.map +1 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.js +44 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.js.map +1 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.d.ts +36 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.d.ts.map +1 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.js +87 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.js.map +1 -0
- package/dist/migrations/index.d.ts +55 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +80 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/ports/index.d.ts +96 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +2 -0
- package/dist/ports/index.js.map +1 -0
- package/docs/catalog/attachments.md +69 -0
- package/docs/catalog/attribute-sets.md +63 -0
- package/docs/catalog/attributes.md +244 -0
- package/docs/catalog/composite-products.md +115 -0
- package/docs/catalog/gallery-and-labels.md +73 -0
- package/docs/catalog/packaging-units.md +67 -0
- package/docs/catalog/per-channel-per-language-overrides.md +234 -0
- package/docs/catalog/product-links.md +79 -0
- package/docs/catalog.md +207 -0
- package/i18n/en.json +649 -0
- package/i18n/pl.json +649 -0
- package/package.json +109 -0
- package/tailwind.css +14 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Catalog 002 — Composite product structure (T123, US5, data-model.md §2.8/§2.9).
|
|
4
|
+
*
|
|
5
|
+
* Three tables:
|
|
6
|
+
* - grouped_items: parent product (type='grouped') has a fixed list of
|
|
7
|
+
* child products with quantities. UNIQUE (parent, child) so the same
|
|
8
|
+
* child can't be listed twice.
|
|
9
|
+
* - bundle_slots: parent product (type='bundle') has named slots, each
|
|
10
|
+
* with a min/max quantity range. Position is admin-curated.
|
|
11
|
+
* - bundle_slot_options: each slot can choose between option products.
|
|
12
|
+
* UNIQUE (slot_id, product_id) so the same product can't be both
|
|
13
|
+
* "default" and "alternative" inside a slot.
|
|
14
|
+
*
|
|
15
|
+
* The "no nested composites" invariant (research R-8) is enforced at the
|
|
16
|
+
* service layer, not by DDL — a CHECK constraint would need to JOIN
|
|
17
|
+
* products which PG doesn't support inside CHECK.
|
|
18
|
+
*/
|
|
19
|
+
export declare class Migration20260429T130803CatalogGroupedAndBundle extends Migration {
|
|
20
|
+
up(): Promise<void>;
|
|
21
|
+
down(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=20260429T130803_catalog_grouped_and_bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260429T130803_catalog_grouped_and_bundle.d.ts","sourceRoot":"","sources":["../../src/migrations/20260429T130803_catalog_grouped_and_bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,+CAAgD,SAAQ,SAAS;IAC7D,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;IA6EnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAKrC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Catalog 002 — Composite product structure (T123, US5, data-model.md §2.8/§2.9).
|
|
4
|
+
*
|
|
5
|
+
* Three tables:
|
|
6
|
+
* - grouped_items: parent product (type='grouped') has a fixed list of
|
|
7
|
+
* child products with quantities. UNIQUE (parent, child) so the same
|
|
8
|
+
* child can't be listed twice.
|
|
9
|
+
* - bundle_slots: parent product (type='bundle') has named slots, each
|
|
10
|
+
* with a min/max quantity range. Position is admin-curated.
|
|
11
|
+
* - bundle_slot_options: each slot can choose between option products.
|
|
12
|
+
* UNIQUE (slot_id, product_id) so the same product can't be both
|
|
13
|
+
* "default" and "alternative" inside a slot.
|
|
14
|
+
*
|
|
15
|
+
* The "no nested composites" invariant (research R-8) is enforced at the
|
|
16
|
+
* service layer, not by DDL — a CHECK constraint would need to JOIN
|
|
17
|
+
* products which PG doesn't support inside CHECK.
|
|
18
|
+
*/
|
|
19
|
+
export class Migration20260429T130803CatalogGroupedAndBundle extends Migration {
|
|
20
|
+
async up() {
|
|
21
|
+
this.addSql(`
|
|
22
|
+
create table "grouped_items" (
|
|
23
|
+
"id" uuid not null,
|
|
24
|
+
"parent_product_id" uuid not null,
|
|
25
|
+
"child_product_id" uuid not null,
|
|
26
|
+
"quantity" int not null,
|
|
27
|
+
"position" int not null default 0,
|
|
28
|
+
"created_at" timestamptz not null,
|
|
29
|
+
"updated_at" timestamptz not null,
|
|
30
|
+
constraint "grouped_items_pkey" primary key ("id"),
|
|
31
|
+
constraint "uniq_grouped_items_parent_child"
|
|
32
|
+
unique ("parent_product_id", "child_product_id"),
|
|
33
|
+
constraint "chk_grouped_items_quantity_positive"
|
|
34
|
+
check ("quantity" > 0),
|
|
35
|
+
constraint "chk_grouped_items_no_self"
|
|
36
|
+
check ("parent_product_id" <> "child_product_id"),
|
|
37
|
+
constraint "fk_grouped_items_parent"
|
|
38
|
+
foreign key ("parent_product_id") references "products" ("id") on delete cascade,
|
|
39
|
+
constraint "fk_grouped_items_child"
|
|
40
|
+
foreign key ("child_product_id") references "products" ("id") on delete restrict
|
|
41
|
+
);
|
|
42
|
+
`);
|
|
43
|
+
this.addSql('create index "grouped_items_parent_index" on "grouped_items" ("parent_product_id");');
|
|
44
|
+
this.addSql(`
|
|
45
|
+
create table "bundle_slots" (
|
|
46
|
+
"id" uuid not null,
|
|
47
|
+
"parent_product_id" uuid not null,
|
|
48
|
+
"name" jsonb not null,
|
|
49
|
+
"min_quantity" int not null default 0,
|
|
50
|
+
"max_quantity" int not null,
|
|
51
|
+
"position" int not null default 0,
|
|
52
|
+
"created_at" timestamptz not null,
|
|
53
|
+
"updated_at" timestamptz not null,
|
|
54
|
+
constraint "bundle_slots_pkey" primary key ("id"),
|
|
55
|
+
constraint "chk_bundle_slots_min_le_max"
|
|
56
|
+
check ("min_quantity" <= "max_quantity"),
|
|
57
|
+
constraint "chk_bundle_slots_min_nonneg"
|
|
58
|
+
check ("min_quantity" >= 0),
|
|
59
|
+
constraint "chk_bundle_slots_max_positive"
|
|
60
|
+
check ("max_quantity" > 0),
|
|
61
|
+
constraint "fk_bundle_slots_parent"
|
|
62
|
+
foreign key ("parent_product_id") references "products" ("id") on delete cascade
|
|
63
|
+
);
|
|
64
|
+
`);
|
|
65
|
+
this.addSql('create index "bundle_slots_parent_index" on "bundle_slots" ("parent_product_id");');
|
|
66
|
+
this.addSql(`
|
|
67
|
+
create table "bundle_slot_options" (
|
|
68
|
+
"id" uuid not null,
|
|
69
|
+
"slot_id" uuid not null,
|
|
70
|
+
"option_product_id" uuid not null,
|
|
71
|
+
"default_quantity" int not null default 1,
|
|
72
|
+
"position" int not null default 0,
|
|
73
|
+
"created_at" timestamptz not null,
|
|
74
|
+
"updated_at" timestamptz not null,
|
|
75
|
+
constraint "bundle_slot_options_pkey" primary key ("id"),
|
|
76
|
+
constraint "uniq_bundle_slot_options_slot_product"
|
|
77
|
+
unique ("slot_id", "option_product_id"),
|
|
78
|
+
constraint "chk_bundle_slot_options_qty_positive"
|
|
79
|
+
check ("default_quantity" > 0),
|
|
80
|
+
constraint "fk_bundle_slot_options_slot"
|
|
81
|
+
foreign key ("slot_id") references "bundle_slots" ("id") on delete cascade,
|
|
82
|
+
constraint "fk_bundle_slot_options_option"
|
|
83
|
+
foreign key ("option_product_id") references "products" ("id") on delete restrict
|
|
84
|
+
);
|
|
85
|
+
`);
|
|
86
|
+
this.addSql('create index "bundle_slot_options_slot_index" on "bundle_slot_options" ("slot_id");');
|
|
87
|
+
}
|
|
88
|
+
async down() {
|
|
89
|
+
this.addSql('drop table if exists "bundle_slot_options" cascade;');
|
|
90
|
+
this.addSql('drop table if exists "bundle_slots" cascade;');
|
|
91
|
+
this.addSql('drop table if exists "grouped_items" cascade;');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=20260429T130803_catalog_grouped_and_bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260429T130803_catalog_grouped_and_bundle.js","sourceRoot":"","sources":["../../src/migrations/20260429T130803_catalog_grouped_and_bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,+CAAgD,SAAQ,SAAS;IACnE,KAAK,CAAC,EAAE;QACf,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;KAqBX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CACT,qFAAqF,CACtF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;KAoBX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CACT,mFAAmF,CACpF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;KAmBX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CACT,qFAAqF,CACtF,CAAC;IACJ,CAAC;IAEQ,KAAK,CAAC,IAAI;QACjB,IAAI,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Catalog 007 / T004 — ProductAttribute extension for the Compare module.
|
|
4
|
+
*
|
|
5
|
+
* Adds the `is_comparable` boolean column on `product_attributes`. Default
|
|
6
|
+
* `false`, NOT NULL — backfill is the default itself, no row needs the
|
|
7
|
+
* flag flipped on at install time.
|
|
8
|
+
*
|
|
9
|
+
* The flag is owned by the catalog module (research.md R-5): a property
|
|
10
|
+
* of an attribute, just like `is_searchable` and `is_filterable`. The
|
|
11
|
+
* comparisons module reads it through `CatalogQueryService` but never
|
|
12
|
+
* writes to it.
|
|
13
|
+
*
|
|
14
|
+
* Side effects on flip: none. Unlike `is_searchable` (which triggers a
|
|
15
|
+
* Meilisearch settings update via `attribute.updated.v1`), comparability
|
|
16
|
+
* is read at comparison-render time directly from Postgres.
|
|
17
|
+
*
|
|
18
|
+
* See specs/007-compare-module/data-model.md §1.3, research.md R-5.
|
|
19
|
+
*/
|
|
20
|
+
export declare class Migration20260501T185835CatalogProductAttributeIsComparable extends Migration {
|
|
21
|
+
up(): Promise<void>;
|
|
22
|
+
down(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=20260501T185835_catalog_product_attribute_is_comparable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260501T185835_catalog_product_attribute_is_comparable.d.ts","sourceRoot":"","sources":["../../src/migrations/20260501T185835_catalog_product_attribute_is_comparable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,2DAA4D,SAAQ,SAAS;IACzE,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;IAOnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAKrC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Catalog 007 / T004 — ProductAttribute extension for the Compare module.
|
|
4
|
+
*
|
|
5
|
+
* Adds the `is_comparable` boolean column on `product_attributes`. Default
|
|
6
|
+
* `false`, NOT NULL — backfill is the default itself, no row needs the
|
|
7
|
+
* flag flipped on at install time.
|
|
8
|
+
*
|
|
9
|
+
* The flag is owned by the catalog module (research.md R-5): a property
|
|
10
|
+
* of an attribute, just like `is_searchable` and `is_filterable`. The
|
|
11
|
+
* comparisons module reads it through `CatalogQueryService` but never
|
|
12
|
+
* writes to it.
|
|
13
|
+
*
|
|
14
|
+
* Side effects on flip: none. Unlike `is_searchable` (which triggers a
|
|
15
|
+
* Meilisearch settings update via `attribute.updated.v1`), comparability
|
|
16
|
+
* is read at comparison-render time directly from Postgres.
|
|
17
|
+
*
|
|
18
|
+
* See specs/007-compare-module/data-model.md §1.3, research.md R-5.
|
|
19
|
+
*/
|
|
20
|
+
export class Migration20260501T185835CatalogProductAttributeIsComparable extends Migration {
|
|
21
|
+
async up() {
|
|
22
|
+
this.addSql(`
|
|
23
|
+
alter table "product_attributes"
|
|
24
|
+
add column "is_comparable" boolean not null default false;
|
|
25
|
+
`);
|
|
26
|
+
}
|
|
27
|
+
async down() {
|
|
28
|
+
this.addSql('alter table "product_attributes" drop column if exists "is_comparable";');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=20260501T185835_catalog_product_attribute_is_comparable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260501T185835_catalog_product_attribute_is_comparable.js","sourceRoot":"","sources":["../../src/migrations/20260501T185835_catalog_product_attribute_is_comparable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,2DAA4D,SAAQ,SAAS;IAC/E,KAAK,CAAC,EAAE;QACf,IAAI,CAAC,MAAM,CAAC;;;KAGX,CAAC,CAAC;IACL,CAAC;IAEQ,KAAK,CAAC,IAAI;QACjB,IAAI,CAAC,MAAM,CACT,yEAAyE,CAC1E,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Catalog feature 012 / T004 — Attributes module reshape.
|
|
4
|
+
*
|
|
5
|
+
* Step-by-step reshape:
|
|
6
|
+
*
|
|
7
|
+
* 1. Add `label_default varchar(200) NOT NULL` on `product_attributes`,
|
|
8
|
+
* backfilled from the existing per-locale `label` JSONB.
|
|
9
|
+
* 2. Add the four new behavioural columns + the numeric `filter_position`,
|
|
10
|
+
* defaulted to `false` / `0` so existing rows opt in only via operator
|
|
11
|
+
* action.
|
|
12
|
+
* 3. Create the `attribute_options` table (rich per-option metadata for
|
|
13
|
+
* `select` / `enum` / `multiselect` types) with a UNIQUE on
|
|
14
|
+
* `(attribute_id, value)` and supporting indexes.
|
|
15
|
+
* 4. Migrate every legacy `enum_values: string[]` JSONB into one
|
|
16
|
+
* `attribute_options` row per array element keyed by `(attribute_id,
|
|
17
|
+
* value)` with `label_default = value`. After this step the catalog
|
|
18
|
+
* module's reader code is migrated to the new table.
|
|
19
|
+
* 5. Drop the legacy `enum_values` column.
|
|
20
|
+
*
|
|
21
|
+
* The `value_type` column is `varchar(16)` (not a PG enum) so the new
|
|
22
|
+
* `'select'` literal is a service-layer change only — no DB migration
|
|
23
|
+
* step needed for the type list itself.
|
|
24
|
+
*
|
|
25
|
+
* See specs/012-attributes/data-model.md §2 + research.md R-1, R-3, R-4.
|
|
26
|
+
*/
|
|
27
|
+
export declare class Migration20260505T060113CatalogAttributeOptionsAndFlags extends Migration {
|
|
28
|
+
up(): Promise<void>;
|
|
29
|
+
down(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=20260505T060113_catalog_attribute_options_and_flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260505T060113_catalog_attribute_options_and_flags.d.ts","sourceRoot":"","sources":["../../src/migrations/20260505T060113_catalog_attribute_options_and_flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,uDAAwD,SAAQ,SAAS;IACrE,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;IA+EnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAiCrC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Catalog feature 012 / T004 — Attributes module reshape.
|
|
4
|
+
*
|
|
5
|
+
* Step-by-step reshape:
|
|
6
|
+
*
|
|
7
|
+
* 1. Add `label_default varchar(200) NOT NULL` on `product_attributes`,
|
|
8
|
+
* backfilled from the existing per-locale `label` JSONB.
|
|
9
|
+
* 2. Add the four new behavioural columns + the numeric `filter_position`,
|
|
10
|
+
* defaulted to `false` / `0` so existing rows opt in only via operator
|
|
11
|
+
* action.
|
|
12
|
+
* 3. Create the `attribute_options` table (rich per-option metadata for
|
|
13
|
+
* `select` / `enum` / `multiselect` types) with a UNIQUE on
|
|
14
|
+
* `(attribute_id, value)` and supporting indexes.
|
|
15
|
+
* 4. Migrate every legacy `enum_values: string[]` JSONB into one
|
|
16
|
+
* `attribute_options` row per array element keyed by `(attribute_id,
|
|
17
|
+
* value)` with `label_default = value`. After this step the catalog
|
|
18
|
+
* module's reader code is migrated to the new table.
|
|
19
|
+
* 5. Drop the legacy `enum_values` column.
|
|
20
|
+
*
|
|
21
|
+
* The `value_type` column is `varchar(16)` (not a PG enum) so the new
|
|
22
|
+
* `'select'` literal is a service-layer change only — no DB migration
|
|
23
|
+
* step needed for the type list itself.
|
|
24
|
+
*
|
|
25
|
+
* See specs/012-attributes/data-model.md §2 + research.md R-1, R-3, R-4.
|
|
26
|
+
*/
|
|
27
|
+
export class Migration20260505T060113CatalogAttributeOptionsAndFlags extends Migration {
|
|
28
|
+
async up() {
|
|
29
|
+
// 1. label_default — backfill from existing per-locale label JSONB.
|
|
30
|
+
this.addSql(`
|
|
31
|
+
alter table "product_attributes"
|
|
32
|
+
add column "label_default" varchar(200) not null default '';
|
|
33
|
+
`);
|
|
34
|
+
this.addSql(`
|
|
35
|
+
update "product_attributes"
|
|
36
|
+
set "label_default" = coalesce(
|
|
37
|
+
nullif(("label"->>'en-US'), ''),
|
|
38
|
+
nullif(("label"->>'pl-PL'), ''),
|
|
39
|
+
(select value from jsonb_each_text("label") limit 1),
|
|
40
|
+
"key"
|
|
41
|
+
)
|
|
42
|
+
where "label_default" = '';
|
|
43
|
+
`);
|
|
44
|
+
this.addSql(`alter table "product_attributes" alter column "label_default" drop default;`);
|
|
45
|
+
// 2. Four new flags + filter_position.
|
|
46
|
+
this.addSql(`
|
|
47
|
+
alter table "product_attributes"
|
|
48
|
+
add column "is_required" boolean not null default false,
|
|
49
|
+
add column "is_promo_rule" boolean not null default false,
|
|
50
|
+
add column "filter_position" integer not null default 0,
|
|
51
|
+
add column "is_visible_on_product_page" boolean not null default false;
|
|
52
|
+
`);
|
|
53
|
+
this.addSql(`
|
|
54
|
+
create index "product_attributes_filter_position_idx"
|
|
55
|
+
on "product_attributes" ("filter_position")
|
|
56
|
+
where "is_filterable" = true;
|
|
57
|
+
`);
|
|
58
|
+
// 3. attribute_options table.
|
|
59
|
+
this.addSql(`
|
|
60
|
+
create table "attribute_options" (
|
|
61
|
+
"id" uuid primary key default gen_random_uuid(),
|
|
62
|
+
"attribute_id" uuid not null references "product_attributes"("id") on delete cascade,
|
|
63
|
+
"value" varchar(200) not null,
|
|
64
|
+
"label" jsonb not null default '{}'::jsonb,
|
|
65
|
+
"label_default" varchar(200) not null,
|
|
66
|
+
"is_default" boolean not null default false,
|
|
67
|
+
"sort_order" integer not null default 0,
|
|
68
|
+
"created_at" timestamptz not null default now(),
|
|
69
|
+
"updated_at" timestamptz not null default now(),
|
|
70
|
+
unique ("attribute_id", "value")
|
|
71
|
+
);
|
|
72
|
+
`);
|
|
73
|
+
this.addSql(`
|
|
74
|
+
create index "attribute_options_by_attr_order_idx"
|
|
75
|
+
on "attribute_options" ("attribute_id", "sort_order");
|
|
76
|
+
`);
|
|
77
|
+
this.addSql(`
|
|
78
|
+
create index "attribute_options_default_per_attr_idx"
|
|
79
|
+
on "attribute_options" ("attribute_id")
|
|
80
|
+
where "is_default" = true;
|
|
81
|
+
`);
|
|
82
|
+
// 4. Migrate legacy enum_values → attribute_options rows.
|
|
83
|
+
this.addSql(`
|
|
84
|
+
insert into "attribute_options" ("attribute_id", "value", "label_default", "sort_order")
|
|
85
|
+
select
|
|
86
|
+
pa."id",
|
|
87
|
+
v.value,
|
|
88
|
+
v.value,
|
|
89
|
+
(v.ord - 1)::integer
|
|
90
|
+
from "product_attributes" pa
|
|
91
|
+
cross join lateral jsonb_array_elements_text(pa."enum_values") with ordinality as v(value, ord)
|
|
92
|
+
where pa."value_type" in ('enum', 'multiselect')
|
|
93
|
+
and pa."enum_values" is not null
|
|
94
|
+
and jsonb_array_length(pa."enum_values") > 0
|
|
95
|
+
and v.value is not null
|
|
96
|
+
and length(v.value) > 0
|
|
97
|
+
on conflict ("attribute_id", "value") do nothing;
|
|
98
|
+
`);
|
|
99
|
+
// 5. Drop the legacy column.
|
|
100
|
+
this.addSql(`alter table "product_attributes" drop column "enum_values";`);
|
|
101
|
+
}
|
|
102
|
+
async down() {
|
|
103
|
+
// Reverse step 5 — recreate enum_values, repopulate from attribute_options.
|
|
104
|
+
this.addSql(`alter table "product_attributes" add column "enum_values" jsonb null;`);
|
|
105
|
+
this.addSql(`
|
|
106
|
+
update "product_attributes" pa
|
|
107
|
+
set "enum_values" = sub.values
|
|
108
|
+
from (
|
|
109
|
+
select "attribute_id", jsonb_agg("value" order by "sort_order") as values
|
|
110
|
+
from "attribute_options"
|
|
111
|
+
group by "attribute_id"
|
|
112
|
+
) sub
|
|
113
|
+
where pa."id" = sub."attribute_id"
|
|
114
|
+
and pa."value_type" in ('enum', 'multiselect');
|
|
115
|
+
`);
|
|
116
|
+
// Reverse step 3 — drop attribute_options.
|
|
117
|
+
this.addSql(`drop index if exists "attribute_options_default_per_attr_idx";`);
|
|
118
|
+
this.addSql(`drop index if exists "attribute_options_by_attr_order_idx";`);
|
|
119
|
+
this.addSql(`drop table if exists "attribute_options";`);
|
|
120
|
+
// Reverse step 2 — drop new flags.
|
|
121
|
+
this.addSql(`drop index if exists "product_attributes_filter_position_idx";`);
|
|
122
|
+
this.addSql(`
|
|
123
|
+
alter table "product_attributes"
|
|
124
|
+
drop column if exists "is_visible_on_product_page",
|
|
125
|
+
drop column if exists "filter_position",
|
|
126
|
+
drop column if exists "is_promo_rule",
|
|
127
|
+
drop column if exists "is_required";
|
|
128
|
+
`);
|
|
129
|
+
// Reverse step 1 — drop label_default.
|
|
130
|
+
this.addSql(`alter table "product_attributes" drop column if exists "label_default";`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=20260505T060113_catalog_attribute_options_and_flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260505T060113_catalog_attribute_options_and_flags.js","sourceRoot":"","sources":["../../src/migrations/20260505T060113_catalog_attribute_options_and_flags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,OAAO,uDAAwD,SAAQ,SAAS;IAC3E,KAAK,CAAC,EAAE;QACf,oEAAoE;QACpE,IAAI,CAAC,MAAM,CAAC;;;KAGX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC;;;;;;;;;KASX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,6EAA6E,CAAC,CAAC;QAE3F,uCAAuC;QACvC,IAAI,CAAC,MAAM,CAAC;;;;;;KAMX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC;;;;KAIX,CAAC,CAAC;QAEH,8BAA8B;QAC9B,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;;;;KAaX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC;;;KAGX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC;;;;KAIX,CAAC,CAAC;QAEH,0DAA0D;QAC1D,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;KAeX,CAAC,CAAC;QAEH,6BAA6B;QAC7B,IAAI,CAAC,MAAM,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;IAEQ,KAAK,CAAC,IAAI;QACjB,4EAA4E;QAC5E,IAAI,CAAC,MAAM,CAAC,uEAAuE,CAAC,CAAC;QACrF,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;KAUX,CAAC,CAAC;QAEH,2CAA2C;QAC3C,IAAI,CAAC,MAAM,CAAC,gEAAgE,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,CAAC,6DAA6D,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC;QAEzD,mCAAmC;QACnC,IAAI,CAAC,MAAM,CAAC,gEAAgE,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,CAAC;;;;;;KAMX,CAAC,CAAC;QAEH,uCAAuC;QACvC,IAAI,CAAC,MAAM,CAAC,yEAAyE,CAAC,CAAC;IACzF,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Catalog feature 022 / T028 — Add the `mass_editable` flag to
|
|
4
|
+
* `product_attributes`.
|
|
5
|
+
*
|
|
6
|
+
* The flag gates whether an attribute appears in the Products Bulk Edit
|
|
7
|
+
* dialog (admin UI). Default `false` so no attribute becomes bulk-editable
|
|
8
|
+
* on rollout until an operator opts it in explicitly.
|
|
9
|
+
*
|
|
10
|
+
* See specs/022-products-bulk-edit/data-model.md §1 and research.md R-2.
|
|
11
|
+
*/
|
|
12
|
+
export declare class Migration20260515T082629CatalogAttributeMassEditable extends Migration {
|
|
13
|
+
up(): Promise<void>;
|
|
14
|
+
down(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=20260515T082629_catalog_attribute_mass_editable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260515T082629_catalog_attribute_mass_editable.d.ts","sourceRoot":"","sources":["../../src/migrations/20260515T082629_catalog_attribute_mass_editable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;;;;;;GASG;AACH,qBAAa,oDAAqD,SAAQ,SAAS;IAClE,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;IAOnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAGrC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Catalog feature 022 / T028 — Add the `mass_editable` flag to
|
|
4
|
+
* `product_attributes`.
|
|
5
|
+
*
|
|
6
|
+
* The flag gates whether an attribute appears in the Products Bulk Edit
|
|
7
|
+
* dialog (admin UI). Default `false` so no attribute becomes bulk-editable
|
|
8
|
+
* on rollout until an operator opts it in explicitly.
|
|
9
|
+
*
|
|
10
|
+
* See specs/022-products-bulk-edit/data-model.md §1 and research.md R-2.
|
|
11
|
+
*/
|
|
12
|
+
export class Migration20260515T082629CatalogAttributeMassEditable extends Migration {
|
|
13
|
+
async up() {
|
|
14
|
+
this.addSql(`
|
|
15
|
+
alter table "product_attributes"
|
|
16
|
+
add column "mass_editable" boolean not null default false;
|
|
17
|
+
`);
|
|
18
|
+
}
|
|
19
|
+
async down() {
|
|
20
|
+
this.addSql(`alter table "product_attributes" drop column "mass_editable";`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=20260515T082629_catalog_attribute_mass_editable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260515T082629_catalog_attribute_mass_editable.js","sourceRoot":"","sources":["../../src/migrations/20260515T082629_catalog_attribute_mass_editable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;;;;;;GASG;AACH,MAAM,OAAO,oDAAqD,SAAQ,SAAS;IACxE,KAAK,CAAC,EAAE;QACf,IAAI,CAAC,MAAM,CAAC;;;KAGX,CAAC,CAAC;IACL,CAAC;IAEQ,KAAK,CAAC,IAAI;QACjB,IAAI,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC;IAC/E,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Feature 032 — Rename product lifecycle status `archived` → `inactive`.
|
|
4
|
+
* Column is `varchar(16)`; no PG enum change required.
|
|
5
|
+
*/
|
|
6
|
+
export declare class Migration20260526T124736CatalogProductStatusInactive extends Migration {
|
|
7
|
+
up(): Promise<void>;
|
|
8
|
+
down(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=20260526T124736_catalog_product_status_inactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260526T124736_catalog_product_status_inactive.d.ts","sourceRoot":"","sources":["../../src/migrations/20260526T124736_catalog_product_status_inactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;GAGG;AACH,qBAAa,oDAAqD,SAAQ,SAAS;IAClE,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;IAQnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAOrC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Feature 032 — Rename product lifecycle status `archived` → `inactive`.
|
|
4
|
+
* Column is `varchar(16)`; no PG enum change required.
|
|
5
|
+
*/
|
|
6
|
+
export class Migration20260526T124736CatalogProductStatusInactive extends Migration {
|
|
7
|
+
async up() {
|
|
8
|
+
this.addSql(`
|
|
9
|
+
update "products"
|
|
10
|
+
set "status" = 'inactive'
|
|
11
|
+
where "status" = 'archived';
|
|
12
|
+
`);
|
|
13
|
+
}
|
|
14
|
+
async down() {
|
|
15
|
+
this.addSql(`
|
|
16
|
+
update "products"
|
|
17
|
+
set "status" = 'archived'
|
|
18
|
+
where "status" = 'inactive';
|
|
19
|
+
`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=20260526T124736_catalog_product_status_inactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260526T124736_catalog_product_status_inactive.js","sourceRoot":"","sources":["../../src/migrations/20260526T124736_catalog_product_status_inactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;GAGG;AACH,MAAM,OAAO,oDAAqD,SAAQ,SAAS;IACxE,KAAK,CAAC,EAAE;QACf,IAAI,CAAC,MAAM,CAAC;;;;KAIX,CAAC,CAAC;IACL,CAAC;IAEQ,KAAK,CAAC,IAAI;QACjB,IAAI,CAAC,MAAM,CAAC;;;;KAIX,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Feature 022 / Product Scope Editor — per Sales Channel + per Language.
|
|
4
|
+
*
|
|
5
|
+
* Three schema changes shipped atomically:
|
|
6
|
+
*
|
|
7
|
+
* 1. Add `channel_scoped` and `language_scoped` boolean flags to
|
|
8
|
+
* `product_attributes`. Both default to `false` so all existing
|
|
9
|
+
* attributes behave as global-only — the new scope dimensions are
|
|
10
|
+
* opt-in per attribute. System attributes `name` and `description`
|
|
11
|
+
* are NOT rows in `product_attributes`; their scope is hard-coded
|
|
12
|
+
* in `SYSTEM_ATTRIBUTE_SCOPES` (see
|
|
13
|
+
* services/system-attribute-scopes.ts).
|
|
14
|
+
*
|
|
15
|
+
* 2. Create `product_value_overrides`. Holds the channel-aware slots
|
|
16
|
+
* (channel-only and channel+language) for every attribute whose
|
|
17
|
+
* scope flags permit them. The global baseline still lives in
|
|
18
|
+
* `products.name` / `products.description` JSONB (per-language)
|
|
19
|
+
* and `products.attribute_values` JSONB (per-attribute) — this
|
|
20
|
+
* migration does NOT touch the baseline storage.
|
|
21
|
+
*
|
|
22
|
+
* `language_code` is NULLABLE — a NULL means "channel-only override
|
|
23
|
+
* (no language scope)"; a non-null means "channel + language slot".
|
|
24
|
+
* Two partial UNIQUE indexes model the rule "tuple is unique
|
|
25
|
+
* regardless of whether language_code is null".
|
|
26
|
+
*
|
|
27
|
+
* 3. Create `product_editor_preferences`. Per-(admin user, product)
|
|
28
|
+
* memory of the last-selected Sales Channel + Language on the
|
|
29
|
+
* product edit page so the switchers seed back to the editor's
|
|
30
|
+
* previous context on return.
|
|
31
|
+
*
|
|
32
|
+
* See specs/023-product-scope-editor/data-model.md §1.
|
|
33
|
+
*/
|
|
34
|
+
export declare class Migration20260611T140346CatalogProductValueOverridesInit extends Migration {
|
|
35
|
+
up(): Promise<void>;
|
|
36
|
+
down(): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=20260611T140346_catalog_product_value_overrides_init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260611T140346_catalog_product_value_overrides_init.d.ts","sourceRoot":"","sources":["../../src/migrations/20260611T140346_catalog_product_value_overrides_init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,wDAAyD,SAAQ,SAAS;IACtE,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;IAsDnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAYrC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Feature 022 / Product Scope Editor — per Sales Channel + per Language.
|
|
4
|
+
*
|
|
5
|
+
* Three schema changes shipped atomically:
|
|
6
|
+
*
|
|
7
|
+
* 1. Add `channel_scoped` and `language_scoped` boolean flags to
|
|
8
|
+
* `product_attributes`. Both default to `false` so all existing
|
|
9
|
+
* attributes behave as global-only — the new scope dimensions are
|
|
10
|
+
* opt-in per attribute. System attributes `name` and `description`
|
|
11
|
+
* are NOT rows in `product_attributes`; their scope is hard-coded
|
|
12
|
+
* in `SYSTEM_ATTRIBUTE_SCOPES` (see
|
|
13
|
+
* services/system-attribute-scopes.ts).
|
|
14
|
+
*
|
|
15
|
+
* 2. Create `product_value_overrides`. Holds the channel-aware slots
|
|
16
|
+
* (channel-only and channel+language) for every attribute whose
|
|
17
|
+
* scope flags permit them. The global baseline still lives in
|
|
18
|
+
* `products.name` / `products.description` JSONB (per-language)
|
|
19
|
+
* and `products.attribute_values` JSONB (per-attribute) — this
|
|
20
|
+
* migration does NOT touch the baseline storage.
|
|
21
|
+
*
|
|
22
|
+
* `language_code` is NULLABLE — a NULL means "channel-only override
|
|
23
|
+
* (no language scope)"; a non-null means "channel + language slot".
|
|
24
|
+
* Two partial UNIQUE indexes model the rule "tuple is unique
|
|
25
|
+
* regardless of whether language_code is null".
|
|
26
|
+
*
|
|
27
|
+
* 3. Create `product_editor_preferences`. Per-(admin user, product)
|
|
28
|
+
* memory of the last-selected Sales Channel + Language on the
|
|
29
|
+
* product edit page so the switchers seed back to the editor's
|
|
30
|
+
* previous context on return.
|
|
31
|
+
*
|
|
32
|
+
* See specs/023-product-scope-editor/data-model.md §1.
|
|
33
|
+
*/
|
|
34
|
+
export class Migration20260611T140346CatalogProductValueOverridesInit extends Migration {
|
|
35
|
+
async up() {
|
|
36
|
+
// 1. Scope flags on product_attributes (opt-in, default false).
|
|
37
|
+
this.addSql(`
|
|
38
|
+
alter table "product_attributes"
|
|
39
|
+
add column "channel_scoped" boolean not null default false,
|
|
40
|
+
add column "language_scoped" boolean not null default false;
|
|
41
|
+
`);
|
|
42
|
+
// 2. product_value_overrides — channel-aware slots.
|
|
43
|
+
this.addSql(`
|
|
44
|
+
create table "product_value_overrides" (
|
|
45
|
+
"id" uuid primary key default gen_random_uuid(),
|
|
46
|
+
"product_id" uuid not null references "products"("id") on delete cascade,
|
|
47
|
+
"attribute_key" varchar(64) not null,
|
|
48
|
+
"channel_id" uuid not null references "sales_channels"("id") on delete cascade,
|
|
49
|
+
"language_code" varchar(16) null,
|
|
50
|
+
"value" jsonb not null,
|
|
51
|
+
"created_at" timestamptz not null default now(),
|
|
52
|
+
"updated_at" timestamptz not null default now()
|
|
53
|
+
);
|
|
54
|
+
`);
|
|
55
|
+
// Partial UNIQUE indexes — model "tuple unique regardless of NULL
|
|
56
|
+
// semantics" via two complementary partial indexes.
|
|
57
|
+
this.addSql(`
|
|
58
|
+
create unique index "product_value_overrides_channel_only_uniq"
|
|
59
|
+
on "product_value_overrides" ("product_id", "attribute_key", "channel_id")
|
|
60
|
+
where "language_code" is null;
|
|
61
|
+
`);
|
|
62
|
+
this.addSql(`
|
|
63
|
+
create unique index "product_value_overrides_channel_lang_uniq"
|
|
64
|
+
on "product_value_overrides" ("product_id", "attribute_key", "channel_id", "language_code")
|
|
65
|
+
where "language_code" is not null;
|
|
66
|
+
`);
|
|
67
|
+
// Per-product per-attribute lookup index for the resolver's batch fetch.
|
|
68
|
+
this.addSql(`
|
|
69
|
+
create index "product_value_overrides_product_attr_idx"
|
|
70
|
+
on "product_value_overrides" ("product_id", "attribute_key");
|
|
71
|
+
`);
|
|
72
|
+
// 3. product_editor_preferences — per-editor switcher memory.
|
|
73
|
+
this.addSql(`
|
|
74
|
+
create table "product_editor_preferences" (
|
|
75
|
+
"admin_user_id" uuid not null references "admin_users"("id") on delete cascade,
|
|
76
|
+
"product_id" uuid not null references "products"("id") on delete cascade,
|
|
77
|
+
"last_channel_id" uuid null,
|
|
78
|
+
"last_language_code" varchar(16) null,
|
|
79
|
+
"updated_at" timestamptz not null default now(),
|
|
80
|
+
constraint "product_editor_preferences_pkey"
|
|
81
|
+
primary key ("admin_user_id", "product_id")
|
|
82
|
+
);
|
|
83
|
+
`);
|
|
84
|
+
}
|
|
85
|
+
async down() {
|
|
86
|
+
this.addSql(`drop table if exists "product_editor_preferences";`);
|
|
87
|
+
this.addSql(`drop index if exists "product_value_overrides_product_attr_idx";`);
|
|
88
|
+
this.addSql(`drop index if exists "product_value_overrides_channel_lang_uniq";`);
|
|
89
|
+
this.addSql(`drop index if exists "product_value_overrides_channel_only_uniq";`);
|
|
90
|
+
this.addSql(`drop table if exists "product_value_overrides";`);
|
|
91
|
+
this.addSql(`
|
|
92
|
+
alter table "product_attributes"
|
|
93
|
+
drop column if exists "language_scoped",
|
|
94
|
+
drop column if exists "channel_scoped";
|
|
95
|
+
`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=20260611T140346_catalog_product_value_overrides_init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260611T140346_catalog_product_value_overrides_init.js","sourceRoot":"","sources":["../../src/migrations/20260611T140346_catalog_product_value_overrides_init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,OAAO,wDAAyD,SAAQ,SAAS;IAC5E,KAAK,CAAC,EAAE;QACf,gEAAgE;QAChE,IAAI,CAAC,MAAM,CAAC;;;;KAIX,CAAC,CAAC;QAEH,oDAAoD;QACpD,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;;KAWX,CAAC,CAAC;QAEH,kEAAkE;QAClE,oDAAoD;QACpD,IAAI,CAAC,MAAM,CAAC;;;;KAIX,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC;;;;KAIX,CAAC,CAAC;QACH,yEAAyE;QACzE,IAAI,CAAC,MAAM,CAAC;;;KAGX,CAAC,CAAC;QAEH,8DAA8D;QAC9D,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;KAUX,CAAC,CAAC;IACL,CAAC;IAEQ,KAAK,CAAC,IAAI;QACjB,IAAI,CAAC,MAAM,CAAC,oDAAoD,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,kEAAkE,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM,CAAC,mEAAmE,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,mEAAmE,CAAC,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,iDAAiD,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC;;;;KAIX,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Quick-searchable attribute flag (feature 039 — US3).
|
|
4
|
+
*
|
|
5
|
+
* Adds `product_attributes.quick_searchable` (default false). Independent of
|
|
6
|
+
* `is_searchable`: it controls whether the attribute's values participate in
|
|
7
|
+
* Quick Order search (FR-012 / FR-013).
|
|
8
|
+
*/
|
|
9
|
+
export declare class Migration20260611T140400CatalogAttributeQuickSearchable extends Migration {
|
|
10
|
+
up(): Promise<void>;
|
|
11
|
+
down(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=20260611T140400_catalog_attribute_quick_searchable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20260611T140400_catalog_attribute_quick_searchable.d.ts","sourceRoot":"","sources":["../../src/migrations/20260611T140400_catalog_attribute_quick_searchable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;;;GAMG;AACH,qBAAa,uDAAwD,SAAQ,SAAS;IACrE,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;IAMnB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAGrC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Migration } from '@mikro-orm/migrations';
|
|
2
|
+
/**
|
|
3
|
+
* Quick-searchable attribute flag (feature 039 — US3).
|
|
4
|
+
*
|
|
5
|
+
* Adds `product_attributes.quick_searchable` (default false). Independent of
|
|
6
|
+
* `is_searchable`: it controls whether the attribute's values participate in
|
|
7
|
+
* Quick Order search (FR-012 / FR-013).
|
|
8
|
+
*/
|
|
9
|
+
export class Migration20260611T140400CatalogAttributeQuickSearchable extends Migration {
|
|
10
|
+
async up() {
|
|
11
|
+
this.addSql('alter table "product_attributes" add column "quick_searchable" boolean not null default false;');
|
|
12
|
+
}
|
|
13
|
+
async down() {
|
|
14
|
+
this.addSql('alter table "product_attributes" drop column "quick_searchable";');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=20260611T140400_catalog_attribute_quick_searchable.js.map
|