@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.
Files changed (443) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +63 -0
  3. package/dist/admin/components/PackagingUnitsEditor.d.ts +12 -0
  4. package/dist/admin/components/PackagingUnitsEditor.d.ts.map +1 -0
  5. package/dist/admin/components/PackagingUnitsEditor.js +99 -0
  6. package/dist/admin/components/PackagingUnitsEditor.js.map +1 -0
  7. package/dist/admin/components/ProductAttributesTab.d.ts +13 -0
  8. package/dist/admin/components/ProductAttributesTab.d.ts.map +1 -0
  9. package/dist/admin/components/ProductAttributesTab.js +140 -0
  10. package/dist/admin/components/ProductAttributesTab.js.map +1 -0
  11. package/dist/admin/components/ProductInventoryTab.d.ts +14 -0
  12. package/dist/admin/components/ProductInventoryTab.d.ts.map +1 -0
  13. package/dist/admin/components/ProductInventoryTab.js +284 -0
  14. package/dist/admin/components/ProductInventoryTab.js.map +1 -0
  15. package/dist/admin/components/ProductScopeEditor.d.ts +94 -0
  16. package/dist/admin/components/ProductScopeEditor.d.ts.map +1 -0
  17. package/dist/admin/components/ProductScopeEditor.js +395 -0
  18. package/dist/admin/components/ProductScopeEditor.js.map +1 -0
  19. package/dist/admin/components/ProductsBulkEditDialog.d.ts +11 -0
  20. package/dist/admin/components/ProductsBulkEditDialog.d.ts.map +1 -0
  21. package/dist/admin/components/ProductsBulkEditDialog.js +304 -0
  22. package/dist/admin/components/ProductsBulkEditDialog.js.map +1 -0
  23. package/dist/admin/index.d.ts +45 -0
  24. package/dist/admin/index.d.ts.map +1 -0
  25. package/dist/admin/index.js +184 -0
  26. package/dist/admin/index.js.map +1 -0
  27. package/dist/admin/lib/resolve-product-selection.d.ts +21 -0
  28. package/dist/admin/lib/resolve-product-selection.d.ts.map +1 -0
  29. package/dist/admin/lib/resolve-product-selection.js +25 -0
  30. package/dist/admin/lib/resolve-product-selection.js.map +1 -0
  31. package/dist/admin/pages/AttachmentTypesPage.d.ts +18 -0
  32. package/dist/admin/pages/AttachmentTypesPage.d.ts.map +1 -0
  33. package/dist/admin/pages/AttachmentTypesPage.js +92 -0
  34. package/dist/admin/pages/AttachmentTypesPage.js.map +1 -0
  35. package/dist/admin/pages/AttributeSetsPage.d.ts +21 -0
  36. package/dist/admin/pages/AttributeSetsPage.d.ts.map +1 -0
  37. package/dist/admin/pages/AttributeSetsPage.js +158 -0
  38. package/dist/admin/pages/AttributeSetsPage.js.map +1 -0
  39. package/dist/admin/pages/AttributesManager.d.ts +9 -0
  40. package/dist/admin/pages/AttributesManager.d.ts.map +1 -0
  41. package/dist/admin/pages/AttributesManager.js +305 -0
  42. package/dist/admin/pages/AttributesManager.js.map +1 -0
  43. package/dist/admin/pages/BulkOperationDetailPage.d.ts +9 -0
  44. package/dist/admin/pages/BulkOperationDetailPage.d.ts.map +1 -0
  45. package/dist/admin/pages/BulkOperationDetailPage.js +187 -0
  46. package/dist/admin/pages/BulkOperationDetailPage.js.map +1 -0
  47. package/dist/admin/pages/BulkOperationsPage.d.ts +9 -0
  48. package/dist/admin/pages/BulkOperationsPage.d.ts.map +1 -0
  49. package/dist/admin/pages/BulkOperationsPage.js +98 -0
  50. package/dist/admin/pages/BulkOperationsPage.js.map +1 -0
  51. package/dist/admin/pages/CategoriesTree.d.ts +9 -0
  52. package/dist/admin/pages/CategoriesTree.d.ts.map +1 -0
  53. package/dist/admin/pages/CategoriesTree.js +176 -0
  54. package/dist/admin/pages/CategoriesTree.js.map +1 -0
  55. package/dist/admin/pages/ProductEditor.d.ts +13 -0
  56. package/dist/admin/pages/ProductEditor.d.ts.map +1 -0
  57. package/dist/admin/pages/ProductEditor.js +1050 -0
  58. package/dist/admin/pages/ProductEditor.js.map +1 -0
  59. package/dist/admin/pages/ProductsList.d.ts +9 -0
  60. package/dist/admin/pages/ProductsList.d.ts.map +1 -0
  61. package/dist/admin/pages/ProductsList.js +399 -0
  62. package/dist/admin/pages/ProductsList.js.map +1 -0
  63. package/dist/backend/commands/attribute-commands.d.ts +111 -0
  64. package/dist/backend/commands/attribute-commands.d.ts.map +1 -0
  65. package/dist/backend/commands/attribute-commands.js +482 -0
  66. package/dist/backend/commands/attribute-commands.js.map +1 -0
  67. package/dist/backend/demo/reset.d.ts +23 -0
  68. package/dist/backend/demo/reset.d.ts.map +1 -0
  69. package/dist/backend/demo/reset.js +41 -0
  70. package/dist/backend/demo/reset.js.map +1 -0
  71. package/dist/backend/demo/rows.d.ts +103 -0
  72. package/dist/backend/demo/rows.d.ts.map +1 -0
  73. package/dist/backend/demo/rows.js +162 -0
  74. package/dist/backend/demo/rows.js.map +1 -0
  75. package/dist/backend/demo/seed.d.ts +35 -0
  76. package/dist/backend/demo/seed.d.ts.map +1 -0
  77. package/dist/backend/demo/seed.js +177 -0
  78. package/dist/backend/demo/seed.js.map +1 -0
  79. package/dist/backend/entities/attachment-type.entity.d.ts +16 -0
  80. package/dist/backend/entities/attachment-type.entity.d.ts.map +1 -0
  81. package/dist/backend/entities/attachment-type.entity.js +57 -0
  82. package/dist/backend/entities/attachment-type.entity.js.map +1 -0
  83. package/dist/backend/entities/attribute-set-attribute.entity.d.ts +26 -0
  84. package/dist/backend/entities/attribute-set-attribute.entity.d.ts.map +1 -0
  85. package/dist/backend/entities/attribute-set-attribute.entity.js +55 -0
  86. package/dist/backend/entities/attribute-set-attribute.entity.js.map +1 -0
  87. package/dist/backend/entities/attribute-set.entity.d.ts +22 -0
  88. package/dist/backend/entities/attribute-set.entity.d.ts.map +1 -0
  89. package/dist/backend/entities/attribute-set.entity.js +67 -0
  90. package/dist/backend/entities/attribute-set.entity.js.map +1 -0
  91. package/dist/backend/entities/bulk-operation.entity.d.ts +78 -0
  92. package/dist/backend/entities/bulk-operation.entity.d.ts.map +1 -0
  93. package/dist/backend/entities/bulk-operation.entity.js +138 -0
  94. package/dist/backend/entities/bulk-operation.entity.js.map +1 -0
  95. package/dist/backend/entities/bundle-slot-option.entity.d.ts +23 -0
  96. package/dist/backend/entities/bundle-slot-option.entity.d.ts.map +1 -0
  97. package/dist/backend/entities/bundle-slot-option.entity.js +68 -0
  98. package/dist/backend/entities/bundle-slot-option.entity.js.map +1 -0
  99. package/dist/backend/entities/bundle-slot.entity.d.ts +25 -0
  100. package/dist/backend/entities/bundle-slot.entity.d.ts.map +1 -0
  101. package/dist/backend/entities/bundle-slot.entity.js +74 -0
  102. package/dist/backend/entities/bundle-slot.entity.js.map +1 -0
  103. package/dist/backend/entities/category.entity.d.ts +26 -0
  104. package/dist/backend/entities/category.entity.d.ts.map +1 -0
  105. package/dist/backend/entities/category.entity.js +119 -0
  106. package/dist/backend/entities/category.entity.js.map +1 -0
  107. package/dist/backend/entities/gallery-item-label.entity.d.ts +22 -0
  108. package/dist/backend/entities/gallery-item-label.entity.d.ts.map +1 -0
  109. package/dist/backend/entities/gallery-item-label.entity.js +50 -0
  110. package/dist/backend/entities/gallery-item-label.entity.js.map +1 -0
  111. package/dist/backend/entities/gallery-item.entity.d.ts +17 -0
  112. package/dist/backend/entities/gallery-item.entity.d.ts.map +1 -0
  113. package/dist/backend/entities/gallery-item.entity.js +58 -0
  114. package/dist/backend/entities/gallery-item.entity.js.map +1 -0
  115. package/dist/backend/entities/grouped-item.entity.d.ts +23 -0
  116. package/dist/backend/entities/grouped-item.entity.d.ts.map +1 -0
  117. package/dist/backend/entities/grouped-item.entity.js +68 -0
  118. package/dist/backend/entities/grouped-item.entity.js.map +1 -0
  119. package/dist/backend/entities/product-attachment.entity.d.ts +23 -0
  120. package/dist/backend/entities/product-attachment.entity.d.ts.map +1 -0
  121. package/dist/backend/entities/product-attachment.entity.js +77 -0
  122. package/dist/backend/entities/product-attachment.entity.js.map +1 -0
  123. package/dist/backend/entities/product-attribute.entity.d.ts +72 -0
  124. package/dist/backend/entities/product-attribute.entity.d.ts.map +1 -0
  125. package/dist/backend/entities/product-attribute.entity.js +161 -0
  126. package/dist/backend/entities/product-attribute.entity.js.map +1 -0
  127. package/dist/backend/entities/product-editor-preference.entity.d.ts +28 -0
  128. package/dist/backend/entities/product-editor-preference.entity.d.ts.map +1 -0
  129. package/dist/backend/entities/product-editor-preference.entity.js +63 -0
  130. package/dist/backend/entities/product-editor-preference.entity.js.map +1 -0
  131. package/dist/backend/entities/product-link.entity.d.ts +25 -0
  132. package/dist/backend/entities/product-link.entity.d.ts.map +1 -0
  133. package/dist/backend/entities/product-link.entity.js +70 -0
  134. package/dist/backend/entities/product-link.entity.js.map +1 -0
  135. package/dist/backend/entities/product-packaging-unit.entity.d.ts +26 -0
  136. package/dist/backend/entities/product-packaging-unit.entity.d.ts.map +1 -0
  137. package/dist/backend/entities/product-packaging-unit.entity.js +76 -0
  138. package/dist/backend/entities/product-packaging-unit.entity.js.map +1 -0
  139. package/dist/backend/entities/product-value-override.entity.d.ts +43 -0
  140. package/dist/backend/entities/product-value-override.entity.d.ts.map +1 -0
  141. package/dist/backend/entities/product-value-override.entity.js +90 -0
  142. package/dist/backend/entities/product-value-override.entity.js.map +1 -0
  143. package/dist/backend/entities/product-variant.entity.d.ts +18 -0
  144. package/dist/backend/entities/product-variant.entity.d.ts.map +1 -0
  145. package/dist/backend/entities/product-variant.entity.js +68 -0
  146. package/dist/backend/entities/product-variant.entity.js.map +1 -0
  147. package/dist/backend/entities/product.entity.d.ts +108 -0
  148. package/dist/backend/entities/product.entity.d.ts.map +1 -0
  149. package/dist/backend/entities/product.entity.js +230 -0
  150. package/dist/backend/entities/product.entity.js.map +1 -0
  151. package/dist/backend/index.d.ts +262 -0
  152. package/dist/backend/index.d.ts.map +1 -0
  153. package/dist/backend/index.js +642 -0
  154. package/dist/backend/index.js.map +1 -0
  155. package/dist/backend/plugin.d.ts +216 -0
  156. package/dist/backend/plugin.d.ts.map +1 -0
  157. package/dist/backend/plugin.js +223 -0
  158. package/dist/backend/plugin.js.map +1 -0
  159. package/dist/backend/prompt-tools.d.ts +47 -0
  160. package/dist/backend/prompt-tools.d.ts.map +1 -0
  161. package/dist/backend/prompt-tools.js +284 -0
  162. package/dist/backend/prompt-tools.js.map +1 -0
  163. package/dist/backend/routes.admin.d.ts +105 -0
  164. package/dist/backend/routes.admin.d.ts.map +1 -0
  165. package/dist/backend/routes.admin.js +1162 -0
  166. package/dist/backend/routes.admin.js.map +1 -0
  167. package/dist/backend/routes.api-key.d.ts +33 -0
  168. package/dist/backend/routes.api-key.d.ts.map +1 -0
  169. package/dist/backend/routes.api-key.js +43 -0
  170. package/dist/backend/routes.api-key.js.map +1 -0
  171. package/dist/backend/routes.external.d.ts +32 -0
  172. package/dist/backend/routes.external.d.ts.map +1 -0
  173. package/dist/backend/routes.external.js +115 -0
  174. package/dist/backend/routes.external.js.map +1 -0
  175. package/dist/backend/routes.public.d.ts +46 -0
  176. package/dist/backend/routes.public.d.ts.map +1 -0
  177. package/dist/backend/routes.public.js +318 -0
  178. package/dist/backend/routes.public.js.map +1 -0
  179. package/dist/backend/services/asset-references.d.ts +4 -0
  180. package/dist/backend/services/asset-references.d.ts.map +1 -0
  181. package/dist/backend/services/asset-references.js +104 -0
  182. package/dist/backend/services/asset-references.js.map +1 -0
  183. package/dist/backend/services/attachment.service.d.ts +45 -0
  184. package/dist/backend/services/attachment.service.d.ts.map +1 -0
  185. package/dist/backend/services/attachment.service.js +268 -0
  186. package/dist/backend/services/attachment.service.js.map +1 -0
  187. package/dist/backend/services/attribute-option-validator.d.ts +47 -0
  188. package/dist/backend/services/attribute-option-validator.d.ts.map +1 -0
  189. package/dist/backend/services/attribute-option-validator.js +69 -0
  190. package/dist/backend/services/attribute-option-validator.js.map +1 -0
  191. package/dist/backend/services/attribute-set-validations.d.ts +65 -0
  192. package/dist/backend/services/attribute-set-validations.d.ts.map +1 -0
  193. package/dist/backend/services/attribute-set-validations.js +89 -0
  194. package/dist/backend/services/attribute-set-validations.js.map +1 -0
  195. package/dist/backend/services/attribute-set.service.d.ts +50 -0
  196. package/dist/backend/services/attribute-set.service.d.ts.map +1 -0
  197. package/dist/backend/services/attribute-set.service.js +401 -0
  198. package/dist/backend/services/attribute-set.service.js.map +1 -0
  199. package/dist/backend/services/attribute-type-mapping.d.ts +66 -0
  200. package/dist/backend/services/attribute-type-mapping.d.ts.map +1 -0
  201. package/dist/backend/services/attribute-type-mapping.js +121 -0
  202. package/dist/backend/services/attribute-type-mapping.js.map +1 -0
  203. package/dist/backend/services/attribute-value-key.service.d.ts +48 -0
  204. package/dist/backend/services/attribute-value-key.service.d.ts.map +1 -0
  205. package/dist/backend/services/attribute-value-key.service.js +118 -0
  206. package/dist/backend/services/attribute-value-key.service.js.map +1 -0
  207. package/dist/backend/services/audit-references.d.ts +13 -0
  208. package/dist/backend/services/audit-references.d.ts.map +1 -0
  209. package/dist/backend/services/audit-references.js +51 -0
  210. package/dist/backend/services/audit-references.js.map +1 -0
  211. package/dist/backend/services/bulk-operation-queue.d.ts +26 -0
  212. package/dist/backend/services/bulk-operation-queue.d.ts.map +1 -0
  213. package/dist/backend/services/bulk-operation-queue.js +34 -0
  214. package/dist/backend/services/bulk-operation-queue.js.map +1 -0
  215. package/dist/backend/services/bulk-operation.service.d.ts +195 -0
  216. package/dist/backend/services/bulk-operation.service.d.ts.map +1 -0
  217. package/dist/backend/services/bulk-operation.service.js +510 -0
  218. package/dist/backend/services/bulk-operation.service.js.map +1 -0
  219. package/dist/backend/services/bundle.service.d.ts +87 -0
  220. package/dist/backend/services/bundle.service.d.ts.map +1 -0
  221. package/dist/backend/services/bundle.service.js +286 -0
  222. package/dist/backend/services/bundle.service.js.map +1 -0
  223. package/dist/backend/services/catalog-admin.service.d.ts +398 -0
  224. package/dist/backend/services/catalog-admin.service.d.ts.map +1 -0
  225. package/dist/backend/services/catalog-admin.service.js +1516 -0
  226. package/dist/backend/services/catalog-admin.service.js.map +1 -0
  227. package/dist/backend/services/catalog-attribute-read.service.d.ts +78 -0
  228. package/dist/backend/services/catalog-attribute-read.service.d.ts.map +1 -0
  229. package/dist/backend/services/catalog-attribute-read.service.js +216 -0
  230. package/dist/backend/services/catalog-attribute-read.service.js.map +1 -0
  231. package/dist/backend/services/catalog-bulk-import.service.d.ts +30 -0
  232. package/dist/backend/services/catalog-bulk-import.service.d.ts.map +1 -0
  233. package/dist/backend/services/catalog-bulk-import.service.js +136 -0
  234. package/dist/backend/services/catalog-bulk-import.service.js.map +1 -0
  235. package/dist/backend/services/catalog-bulk-update.service.d.ts +91 -0
  236. package/dist/backend/services/catalog-bulk-update.service.d.ts.map +1 -0
  237. package/dist/backend/services/catalog-bulk-update.service.js +330 -0
  238. package/dist/backend/services/catalog-bulk-update.service.js.map +1 -0
  239. package/dist/backend/services/catalog-category-read.service.d.ts +66 -0
  240. package/dist/backend/services/catalog-category-read.service.d.ts.map +1 -0
  241. package/dist/backend/services/catalog-category-read.service.js +248 -0
  242. package/dist/backend/services/catalog-category-read.service.js.map +1 -0
  243. package/dist/backend/services/catalog-org-price-decorator.d.ts +90 -0
  244. package/dist/backend/services/catalog-org-price-decorator.d.ts.map +1 -0
  245. package/dist/backend/services/catalog-org-price-decorator.js +184 -0
  246. package/dist/backend/services/catalog-org-price-decorator.js.map +1 -0
  247. package/dist/backend/services/catalog-product-filter.service.d.ts +82 -0
  248. package/dist/backend/services/catalog-product-filter.service.d.ts.map +1 -0
  249. package/dist/backend/services/catalog-product-filter.service.js +275 -0
  250. package/dist/backend/services/catalog-product-filter.service.js.map +1 -0
  251. package/dist/backend/services/catalog-product-read.service.d.ts +46 -0
  252. package/dist/backend/services/catalog-product-read.service.d.ts.map +1 -0
  253. package/dist/backend/services/catalog-product-read.service.js +197 -0
  254. package/dist/backend/services/catalog-product-read.service.js.map +1 -0
  255. package/dist/backend/services/catalog-query.service.d.ts +444 -0
  256. package/dist/backend/services/catalog-query.service.d.ts.map +1 -0
  257. package/dist/backend/services/catalog-query.service.js +1633 -0
  258. package/dist/backend/services/catalog-query.service.js.map +1 -0
  259. package/dist/backend/services/catalog-quick-search.service.d.ts +78 -0
  260. package/dist/backend/services/catalog-quick-search.service.d.ts.map +1 -0
  261. package/dist/backend/services/catalog-quick-search.service.js +159 -0
  262. package/dist/backend/services/catalog-quick-search.service.js.map +1 -0
  263. package/dist/backend/services/catalog-write-ports.d.ts +25 -0
  264. package/dist/backend/services/catalog-write-ports.d.ts.map +1 -0
  265. package/dist/backend/services/catalog-write-ports.js +63 -0
  266. package/dist/backend/services/catalog-write-ports.js.map +1 -0
  267. package/dist/backend/services/category-admin.service.d.ts +102 -0
  268. package/dist/backend/services/category-admin.service.d.ts.map +1 -0
  269. package/dist/backend/services/category-admin.service.js +271 -0
  270. package/dist/backend/services/category-admin.service.js.map +1 -0
  271. package/dist/backend/services/gallery.service.d.ts +85 -0
  272. package/dist/backend/services/gallery.service.d.ts.map +1 -0
  273. package/dist/backend/services/gallery.service.js +326 -0
  274. package/dist/backend/services/gallery.service.js.map +1 -0
  275. package/dist/backend/services/grouped.service.d.ts +39 -0
  276. package/dist/backend/services/grouped.service.d.ts.map +1 -0
  277. package/dist/backend/services/grouped.service.js +136 -0
  278. package/dist/backend/services/grouped.service.js.map +1 -0
  279. package/dist/backend/services/label-resolver.d.ts +16 -0
  280. package/dist/backend/services/label-resolver.d.ts.map +1 -0
  281. package/dist/backend/services/label-resolver.js +43 -0
  282. package/dist/backend/services/label-resolver.js.map +1 -0
  283. package/dist/backend/services/packaging-unit.service.d.ts +28 -0
  284. package/dist/backend/services/packaging-unit.service.d.ts.map +1 -0
  285. package/dist/backend/services/packaging-unit.service.js +197 -0
  286. package/dist/backend/services/packaging-unit.service.js.map +1 -0
  287. package/dist/backend/services/primary-asset-url.d.ts +4 -0
  288. package/dist/backend/services/primary-asset-url.d.ts.map +1 -0
  289. package/dist/backend/services/primary-asset-url.js +55 -0
  290. package/dist/backend/services/primary-asset-url.js.map +1 -0
  291. package/dist/backend/services/product-editor-preferences.service.d.ts +20 -0
  292. package/dist/backend/services/product-editor-preferences.service.d.ts.map +1 -0
  293. package/dist/backend/services/product-editor-preferences.service.js +44 -0
  294. package/dist/backend/services/product-editor-preferences.service.js.map +1 -0
  295. package/dist/backend/services/product-link.service.d.ts +169 -0
  296. package/dist/backend/services/product-link.service.d.ts.map +1 -0
  297. package/dist/backend/services/product-link.service.js +297 -0
  298. package/dist/backend/services/product-link.service.js.map +1 -0
  299. package/dist/backend/services/product-overrides.service.d.ts +77 -0
  300. package/dist/backend/services/product-overrides.service.d.ts.map +1 -0
  301. package/dist/backend/services/product-overrides.service.js +204 -0
  302. package/dist/backend/services/product-overrides.service.js.map +1 -0
  303. package/dist/backend/services/product-scope-context.service.d.ts +36 -0
  304. package/dist/backend/services/product-scope-context.service.d.ts.map +1 -0
  305. package/dist/backend/services/product-scope-context.service.js +106 -0
  306. package/dist/backend/services/product-scope-context.service.js.map +1 -0
  307. package/dist/backend/services/product-type-validations.d.ts +42 -0
  308. package/dist/backend/services/product-type-validations.d.ts.map +1 -0
  309. package/dist/backend/services/product-type-validations.js +55 -0
  310. package/dist/backend/services/product-type-validations.js.map +1 -0
  311. package/dist/backend/services/product-value-resolver.service.d.ts +59 -0
  312. package/dist/backend/services/product-value-resolver.service.d.ts.map +1 -0
  313. package/dist/backend/services/product-value-resolver.service.js +111 -0
  314. package/dist/backend/services/product-value-resolver.service.js.map +1 -0
  315. package/dist/backend/services/system-attribute-scopes.d.ts +18 -0
  316. package/dist/backend/services/system-attribute-scopes.d.ts.map +1 -0
  317. package/dist/backend/services/system-attribute-scopes.js +18 -0
  318. package/dist/backend/services/system-attribute-scopes.js.map +1 -0
  319. package/dist/backend/services/viewer-organization.d.ts +25 -0
  320. package/dist/backend/services/viewer-organization.d.ts.map +1 -0
  321. package/dist/backend/services/viewer-organization.js +31 -0
  322. package/dist/backend/services/viewer-organization.js.map +1 -0
  323. package/dist/manifest.d.ts +204 -0
  324. package/dist/manifest.d.ts.map +1 -0
  325. package/dist/manifest.js +686 -0
  326. package/dist/manifest.js.map +1 -0
  327. package/dist/migrations/20260429T064146_catalog_attribute_sets_init.d.ts +33 -0
  328. package/dist/migrations/20260429T064146_catalog_attribute_sets_init.d.ts.map +1 -0
  329. package/dist/migrations/20260429T064146_catalog_attribute_sets_init.js +118 -0
  330. package/dist/migrations/20260429T064146_catalog_attribute_sets_init.js.map +1 -0
  331. package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.d.ts +24 -0
  332. package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.d.ts.map +1 -0
  333. package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.js +31 -0
  334. package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.js.map +1 -0
  335. package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.d.ts +32 -0
  336. package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.d.ts.map +1 -0
  337. package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.js +58 -0
  338. package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.js.map +1 -0
  339. package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.d.ts +22 -0
  340. package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.d.ts.map +1 -0
  341. package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.js +66 -0
  342. package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.js.map +1 -0
  343. package/dist/migrations/20260429T112543_catalog_product_attachments.d.ts +18 -0
  344. package/dist/migrations/20260429T112543_catalog_product_attachments.d.ts.map +1 -0
  345. package/dist/migrations/20260429T112543_catalog_product_attachments.js +73 -0
  346. package/dist/migrations/20260429T112543_catalog_product_attachments.js.map +1 -0
  347. package/dist/migrations/20260429T123726_catalog_product_links.d.ts +21 -0
  348. package/dist/migrations/20260429T123726_catalog_product_links.d.ts.map +1 -0
  349. package/dist/migrations/20260429T123726_catalog_product_links.js +48 -0
  350. package/dist/migrations/20260429T123726_catalog_product_links.js.map +1 -0
  351. package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.d.ts +23 -0
  352. package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.d.ts.map +1 -0
  353. package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.js +94 -0
  354. package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.js.map +1 -0
  355. package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.d.ts +24 -0
  356. package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.d.ts.map +1 -0
  357. package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.js +31 -0
  358. package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.js.map +1 -0
  359. package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.d.ts +31 -0
  360. package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.d.ts.map +1 -0
  361. package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.js +133 -0
  362. package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.js.map +1 -0
  363. package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.d.ts +16 -0
  364. package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.d.ts.map +1 -0
  365. package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.js +23 -0
  366. package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.js.map +1 -0
  367. package/dist/migrations/20260526T124736_catalog_product_status_inactive.d.ts +10 -0
  368. package/dist/migrations/20260526T124736_catalog_product_status_inactive.d.ts.map +1 -0
  369. package/dist/migrations/20260526T124736_catalog_product_status_inactive.js +22 -0
  370. package/dist/migrations/20260526T124736_catalog_product_status_inactive.js.map +1 -0
  371. package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.d.ts +38 -0
  372. package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.d.ts.map +1 -0
  373. package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.js +98 -0
  374. package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.js.map +1 -0
  375. package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.d.ts +13 -0
  376. package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.d.ts.map +1 -0
  377. package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.js +17 -0
  378. package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.js.map +1 -0
  379. package/dist/migrations/20260611T140407_catalog_bulk_operations.d.ts +16 -0
  380. package/dist/migrations/20260611T140407_catalog_bulk_operations.d.ts.map +1 -0
  381. package/dist/migrations/20260611T140407_catalog_bulk_operations.js +42 -0
  382. package/dist/migrations/20260611T140407_catalog_bulk_operations.js.map +1 -0
  383. package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.d.ts +14 -0
  384. package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.d.ts.map +1 -0
  385. package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.js +18 -0
  386. package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.js.map +1 -0
  387. package/dist/migrations/20260611T140412_catalog_product_packaging_units.d.ts +11 -0
  388. package/dist/migrations/20260611T140412_catalog_product_packaging_units.d.ts.map +1 -0
  389. package/dist/migrations/20260611T140412_catalog_product_packaging_units.js +29 -0
  390. package/dist/migrations/20260611T140412_catalog_product_packaging_units.js.map +1 -0
  391. package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.d.ts +23 -0
  392. package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.d.ts.map +1 -0
  393. package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.js +35 -0
  394. package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.js.map +1 -0
  395. package/dist/migrations/20260718T200343_catalog_category_custom_field_values.d.ts +12 -0
  396. package/dist/migrations/20260718T200343_catalog_category_custom_field_values.d.ts.map +1 -0
  397. package/dist/migrations/20260718T200343_catalog_category_custom_field_values.js +16 -0
  398. package/dist/migrations/20260718T200343_catalog_category_custom_field_values.js.map +1 -0
  399. package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.d.ts +32 -0
  400. package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.d.ts.map +1 -0
  401. package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.js +286 -0
  402. package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.js.map +1 -0
  403. package/dist/migrations/20260804T152604_catalog_widen_product_sku.d.ts +36 -0
  404. package/dist/migrations/20260804T152604_catalog_widen_product_sku.d.ts.map +1 -0
  405. package/dist/migrations/20260804T152604_catalog_widen_product_sku.js +63 -0
  406. package/dist/migrations/20260804T152604_catalog_widen_product_sku.js.map +1 -0
  407. package/dist/migrations/20260804T160244_catalog_category_activation.d.ts +18 -0
  408. package/dist/migrations/20260804T160244_catalog_category_activation.d.ts.map +1 -0
  409. package/dist/migrations/20260804T160244_catalog_category_activation.js +22 -0
  410. package/dist/migrations/20260804T160244_catalog_category_activation.js.map +1 -0
  411. package/dist/migrations/20260912T094557_catalog_sales_channel_products.d.ts +27 -0
  412. package/dist/migrations/20260912T094557_catalog_sales_channel_products.d.ts.map +1 -0
  413. package/dist/migrations/20260912T094557_catalog_sales_channel_products.js +44 -0
  414. package/dist/migrations/20260912T094557_catalog_sales_channel_products.js.map +1 -0
  415. package/dist/migrations/20260912T094623_catalog_sales_channel_categories.d.ts +27 -0
  416. package/dist/migrations/20260912T094623_catalog_sales_channel_categories.d.ts.map +1 -0
  417. package/dist/migrations/20260912T094623_catalog_sales_channel_categories.js +44 -0
  418. package/dist/migrations/20260912T094623_catalog_sales_channel_categories.js.map +1 -0
  419. package/dist/migrations/20260925T125527_catalog_inventory_columns.d.ts +36 -0
  420. package/dist/migrations/20260925T125527_catalog_inventory_columns.d.ts.map +1 -0
  421. package/dist/migrations/20260925T125527_catalog_inventory_columns.js +87 -0
  422. package/dist/migrations/20260925T125527_catalog_inventory_columns.js.map +1 -0
  423. package/dist/migrations/index.d.ts +55 -0
  424. package/dist/migrations/index.d.ts.map +1 -0
  425. package/dist/migrations/index.js +80 -0
  426. package/dist/migrations/index.js.map +1 -0
  427. package/dist/ports/index.d.ts +96 -0
  428. package/dist/ports/index.d.ts.map +1 -0
  429. package/dist/ports/index.js +2 -0
  430. package/dist/ports/index.js.map +1 -0
  431. package/docs/catalog/attachments.md +69 -0
  432. package/docs/catalog/attribute-sets.md +63 -0
  433. package/docs/catalog/attributes.md +244 -0
  434. package/docs/catalog/composite-products.md +115 -0
  435. package/docs/catalog/gallery-and-labels.md +73 -0
  436. package/docs/catalog/packaging-units.md +67 -0
  437. package/docs/catalog/per-channel-per-language-overrides.md +234 -0
  438. package/docs/catalog/product-links.md +79 -0
  439. package/docs/catalog.md +207 -0
  440. package/i18n/en.json +649 -0
  441. package/i18n/pl.json +649 -0
  442. package/package.json +109 -0
  443. package/tailwind.css +14 -0
@@ -0,0 +1,398 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql';
2
+ import { type CatalogAdminAuditContext, type CreateAttributeRequest, type CreateProductRequest, type CreateVariantRequest, type UpdateAttributeRequest, type UpdateProductRequest, type UpdateVariantRequest } from '@endora-commerce/contracts';
3
+ import type { EventBase, EventBus } from '@endora-commerce/platform/events';
4
+ export interface CatalogEvents extends Record<string, EventBase> {
5
+ 'product.created.v1': EventBase & {
6
+ productId: string;
7
+ sku: string;
8
+ };
9
+ 'product.updated.v1': EventBase & {
10
+ productId: string;
11
+ changedFields: string[];
12
+ };
13
+ 'product.archived.v1': EventBase & {
14
+ productId: string;
15
+ };
16
+ 'product.deleted.v1': EventBase & {
17
+ productId: string;
18
+ };
19
+ 'attribute.updated.v1': EventBase & {
20
+ attributeKey: string;
21
+ isSearchable: boolean;
22
+ isFilterable: boolean;
23
+ };
24
+ }
25
+ export type CatalogEventBus = EventBus<CatalogEvents>;
26
+ /**
27
+ * How a duplicate inherits the source's per-warehouse low-stock thresholds
28
+ * (issue #185).
29
+ *
30
+ * The rows live in `inventory`'s `product_warehouse_low_stock_thresholds`, and
31
+ * this service used to write them with an `insert … select` of its own — no
32
+ * import specifier for the boundary check to see, no gate, and no audit row on
33
+ * the owner's side. `inventory` publishes the copy now.
34
+ *
35
+ * `'not-present'` rather than a throw or a `catch`: `inventory` is
36
+ * deactivatable and this module declares the edge `degrades-without`, so
37
+ * absence is **decided** in front of the gate by the wiring in `backend.ts` and
38
+ * arrives here in the return type. A duplicate made while the module is off
39
+ * carries no per-warehouse thresholds and falls back to the product-level and
40
+ * warehouse-level chain — which is what a duplicate looks like on a deployment
41
+ * that never installed `inventory`.
42
+ */
43
+ export type CatalogWarehouseThresholdCopy = (input: {
44
+ sourceProductId: string;
45
+ targetProductId: string;
46
+ }) => Promise<{
47
+ copied: number;
48
+ } | 'not-present'>;
49
+ import { Product } from '../entities/product.entity.js';
50
+ import { ProductVariant } from '../entities/product-variant.entity.js';
51
+ import type { AuditPort } from '@endora-commerce/platform/kernel';
52
+ import type { SalesChannelMembershipPort } from '@endora-commerce/platform/kernel';
53
+ import type { CommandBus } from '@endora-commerce/platform/commands';
54
+ import type { CustomFieldDefinitionApplyApi } from '../commands/attribute-commands.js';
55
+ import type { CatalogAttributeReadService, CatalogAttributeView } from './catalog-attribute-read.service.js';
56
+ import { type AttributeOptionResult } from '../commands/attribute-commands.js';
57
+ export { dbToApiAttributeType, resolveAttributeApiType } from './attribute-type-mapping.js';
58
+ /**
59
+ * Optional metadata used to attach audit entries to admin mutations.
60
+ *
61
+ * Published as `CatalogAdminAuditContext` in feature 075's Phase P — the
62
+ * write port's two audited methods take it — and aliased back here so the two
63
+ * cannot drift.
64
+ */
65
+ export type AdminAuditContext = CatalogAdminAuditContext;
66
+ /**
67
+ * Catalog write-path service (admin write surface).
68
+ * Every mutation emits a typed event on the shared bus so the search indexer
69
+ * (T067) and webhook bridge (Phase 2 T037) can react.
70
+ */
71
+ export declare class CatalogAdminService {
72
+ #private;
73
+ private readonly emFactory;
74
+ private readonly events;
75
+ private readonly auditLog?;
76
+ /**
77
+ * Feature 005 / T027 — when injected, every newly-created Product
78
+ * that does not declare explicit channel membership lands in the
79
+ * system-default Sales Channel automatically (FR-011). Optional so
80
+ * existing tests that construct this service without sales-channels
81
+ * keep compiling; production composition.ts always provides it.
82
+ */
83
+ private readonly salesChannelMembership?;
84
+ /**
85
+ * Feature 054 — when injected, `updateProductAudited` records the admin
86
+ * single-update through the Command Bus (co-transactional audit + event).
87
+ */
88
+ private readonly commandBus?;
89
+ /**
90
+ * Feature 061 — composed attribute read model. Required for every
91
+ * attribute/option method; optional in the signature so legacy product-only
92
+ * fixtures keep constructing the service without attribute wiring.
93
+ */
94
+ private readonly attributeRead?;
95
+ /**
96
+ * Feature 061 — the custom_fields transactional apply seam. Required for
97
+ * attribute/option mutations. The committed-state definition read it used
98
+ * to carry alongside them is `attributeRead`'s since T053(b).
99
+ */
100
+ private readonly customFields?;
101
+ /**
102
+ * Issue #185 — `inventory`'s per-warehouse threshold copy, presence-decided
103
+ * by the wiring. Optional for the same reason every collaborator above it
104
+ * is: fixtures that duplicate a product without an inventory composition
105
+ * keep constructing this service, and a duplicate with no thresholds copied
106
+ * is the module's declared degrade rather than a failure.
107
+ */
108
+ private readonly copyWarehouseThresholds?;
109
+ constructor(emFactory: () => EntityManager, events: CatalogEventBus, auditLog?: AuditPort | undefined,
110
+ /**
111
+ * Feature 005 / T027 — when injected, every newly-created Product
112
+ * that does not declare explicit channel membership lands in the
113
+ * system-default Sales Channel automatically (FR-011). Optional so
114
+ * existing tests that construct this service without sales-channels
115
+ * keep compiling; production composition.ts always provides it.
116
+ */
117
+ salesChannelMembership?: SalesChannelMembershipPort | undefined,
118
+ /**
119
+ * Feature 054 — when injected, `updateProductAudited` records the admin
120
+ * single-update through the Command Bus (co-transactional audit + event).
121
+ */
122
+ commandBus?: CommandBus | undefined,
123
+ /**
124
+ * Feature 061 — composed attribute read model. Required for every
125
+ * attribute/option method; optional in the signature so legacy product-only
126
+ * fixtures keep constructing the service without attribute wiring.
127
+ */
128
+ attributeRead?: CatalogAttributeReadService | undefined,
129
+ /**
130
+ * Feature 061 — the custom_fields transactional apply seam. Required for
131
+ * attribute/option mutations. The committed-state definition read it used
132
+ * to carry alongside them is `attributeRead`'s since T053(b).
133
+ */
134
+ customFields?: CustomFieldDefinitionApplyApi | undefined,
135
+ /**
136
+ * Issue #185 — `inventory`'s per-warehouse threshold copy, presence-decided
137
+ * by the wiring. Optional for the same reason every collaborator above it
138
+ * is: fixtures that duplicate a product without an inventory composition
139
+ * keep constructing this service, and a duplicate with no thresholds copied
140
+ * is the module's declared degrade rather than a failure.
141
+ */
142
+ copyWarehouseThresholds?: CatalogWarehouseThresholdCopy | undefined);
143
+ /**
144
+ * Enqueues a full Meilisearch reindex (a `search_reindex` bulk operation)
145
+ * when an attribute's `searchable` flag flips. Set by the catalog plugin
146
+ * once the BulkOperationService exists (it is constructed after this
147
+ * service). When unset, a flag change still emits `attribute.updated.v1`
148
+ * (the lightweight settings refresh) but no reindex is queued.
149
+ */
150
+ private enqueueSearchReindex?;
151
+ setSearchReindexEnqueuer(fn: (ctx: {
152
+ actorAdminUserId: string | null;
153
+ attributeKey: string;
154
+ }) => Promise<void>): void;
155
+ /**
156
+ * Feature 068 — product creation runs as the `product.create` Command, so the
157
+ * audit entry, the domain event and the row commit or roll back as one unit
158
+ * (Principle XIII). This closed the gap that made every worker-created product
159
+ * unaudited: the audit used to be a hand-written post-commit call that only
160
+ * fired when the caller supplied `auditCtx`, which no background caller has.
161
+ *
162
+ * `_auditCtx` is retained so the long-standing admin call site keeps compiling;
163
+ * the actor is now derived server-side from the ambient TenantContext.
164
+ */
165
+ createProduct(req: CreateProductRequest, _auditCtx?: AdminAuditContext): Promise<Product>;
166
+ updateProduct(id: string, req: UpdateProductRequest, auditCtx?: AdminAuditContext): Promise<Product>;
167
+ /**
168
+ * Feature 054 — admin single-update path, audited co-transactionally via the
169
+ * Command Bus (one audit row + the event on commit, none on rollback). Falls
170
+ * back to the legacy `updateProduct` when no bus is injected (bus-less tests).
171
+ */
172
+ updateProductAudited(id: string, req: UpdateProductRequest): Promise<Product>;
173
+ duplicateProduct(id: string): Promise<Product>;
174
+ /**
175
+ * Find a free SKU derived from `baseSku` by appending `-copy`,
176
+ * `-copy-2`, `-copy-3`, … until both Product and ProductVariant tables
177
+ * are clear (SKUs share a global namespace per `createVariant`).
178
+ * Bounded by 1000 attempts so a pathological collision can't hang.
179
+ *
180
+ * Feature 068 — the result must fit `SKU_MAX_LENGTH`. It is the *base* that
181
+ * gets shortened to make room, never the suffix: cutting the suffix would
182
+ * collapse every attempt onto the same string, so a long-SKU product could
183
+ * never be duplicated at all.
184
+ */
185
+ private allocateCopySku;
186
+ private allocateCopySlug;
187
+ /**
188
+ * Find a free slug derived from `source`: the slugified value itself, then
189
+ * `-2`, `-3`, … until `products.slug` (which is `@Unique()`) is clear.
190
+ * Bounded by 1000 attempts so a pathological collision can't hang.
191
+ *
192
+ * Feature 068 — used by the create path as well as the duplication path; a
193
+ * name collision on create used to reach the database and be reported as a
194
+ * SKU conflict.
195
+ */
196
+ private allocateUniqueSlug;
197
+ /**
198
+ * Multilingual `name`: tag every locale with a "(copy)" suffix so the
199
+ * duplicated product is obviously a clone in lists. Empty locales are
200
+ * left untouched.
201
+ */
202
+ private suffixCopyNames;
203
+ /**
204
+ * @deprecated Use `updateProduct` with `status: 'inactive'` instead.
205
+ * Kept for internal callers that still emit `product.archived.v1`.
206
+ */
207
+ archiveProduct(id: string, auditCtx?: AdminAuditContext): Promise<void>;
208
+ assertProductDeletable(em: EntityManager, productId: string): Promise<void>;
209
+ /**
210
+ * Feature 068 — soft-delete runs as the `product.delete` Command: the write,
211
+ * the audit entry and `product.deleted.v1` share one transaction. `_auditCtx`
212
+ * is retained for the existing admin call site; the actor is server-derived.
213
+ */
214
+ deleteProduct(id: string, _auditCtx?: AdminAuditContext): Promise<void>;
215
+ createAttribute(req: CreateAttributeRequest): Promise<CatalogAttributeView>;
216
+ updateAttributeByIdOrKey(idOrKey: string, req: UpdateAttributeRequest, auditCtx?: AdminAuditContext): Promise<CatalogAttributeView>;
217
+ updateAttribute(key: string, req: UpdateAttributeRequest, auditCtx?: AdminAuditContext): Promise<CatalogAttributeView>;
218
+ private applyAttributeUpdate;
219
+ listProducts(options?: {
220
+ includeArchived?: boolean;
221
+ status?: 'active' | 'draft' | 'inactive';
222
+ type?: 'simple' | 'configurable' | 'grouped' | 'bundle' | 'virtual';
223
+ q?: string;
224
+ /** When set, restrict to products in this category or any descendant. */
225
+ categorySlug?: string;
226
+ page?: number;
227
+ pageSize?: number;
228
+ }): Promise<{
229
+ items: Product[];
230
+ page: number;
231
+ pageSize: number;
232
+ total: number;
233
+ counts: {
234
+ all: number;
235
+ active: number;
236
+ draft: number;
237
+ inactive: number;
238
+ };
239
+ }>;
240
+ /**
241
+ * Feature 033 — return all product ids matching list filters (no pagination).
242
+ * Reuses the same filter semantics as {@link listProducts}.
243
+ */
244
+ resolveProductIds(options?: {
245
+ includeArchived?: boolean;
246
+ status?: 'active' | 'draft' | 'inactive';
247
+ type?: 'simple' | 'configurable' | 'grouped' | 'bundle' | 'virtual';
248
+ q?: string;
249
+ }): Promise<{
250
+ productIds: string[];
251
+ total: number;
252
+ }>;
253
+ getProductById(id: string): Promise<Product>;
254
+ /** Category membership ids for admin product editor (feature 031). */
255
+ getProductCategoryIds(productId: string): Promise<string[]>;
256
+ /** Product ids in a category tree (root + descendants), for admin list filters. */
257
+ private productIdsInCategoryTree;
258
+ /**
259
+ * Batch-by-id read. Returns matching products for the given id set,
260
+ * deduped server-side. Includes archived rows so callers can resolve
261
+ * names for already-attached references (e.g. ProductEditor's link
262
+ * tables) regardless of current status. Paginated for callers that
263
+ * stream large id sets across multiple requests.
264
+ */
265
+ listProductsByIds(input: {
266
+ ids: string[];
267
+ page?: number;
268
+ pageSize?: number;
269
+ }): Promise<{
270
+ items: Product[];
271
+ page: number;
272
+ pageSize: number;
273
+ total: number;
274
+ }>;
275
+ listAttributes(): Promise<CatalogAttributeView[]>;
276
+ /**
277
+ * Feature 012 — read every attribute carrying a given boolean flag.
278
+ * Used by the Promotion Rule editor's criterion picker
279
+ * (`flag = isPromoRule`) and the Compare-page column picker
280
+ * (`flag = isComparable`). Other flags are surfaced for symmetry.
281
+ */
282
+ listAttributesByFlag(flag: 'isSearchable' | 'isFilterable' | 'isComparable' | 'isVariantAxis' | 'isPromoRule' | 'isVisibleOnProductPage' | 'isRequired' | 'isMassEditable'): Promise<CatalogAttributeView[]>;
283
+ /**
284
+ * Feature 012 / US4 — list every option for one attribute, ordered
285
+ * by sortOrder ASC then value ASC. Backed by `custom_field_options`
286
+ * through the composed view (feature 061); `attributeId` on the result
287
+ * is the attribute (extension) id the admin API has always exposed.
288
+ */
289
+ listAttributeOptions(attributeId: string): Promise<AttributeOptionResult[]>;
290
+ /** Feature 012 / US4 — append an option (validated cross-list). */
291
+ addAttributeOption(attributeIdOrKey: string, input: {
292
+ value: string;
293
+ label?: Record<string, string>;
294
+ labelDefault: string;
295
+ isDefault?: boolean;
296
+ sortOrder?: number;
297
+ }): Promise<AttributeOptionResult>;
298
+ /** Feature 012 / US4 — patch one option (value is immutable per FR-026). */
299
+ patchAttributeOption(optionId: string, input: {
300
+ label?: Record<string, string>;
301
+ labelDefault?: string;
302
+ isDefault?: boolean;
303
+ sortOrder?: number;
304
+ }): Promise<AttributeOptionResult>;
305
+ /** Feature 012 / US4 — remove one option. Refused while products carry it (FR-025). */
306
+ removeAttributeOption(optionId: string): Promise<void>;
307
+ /**
308
+ * Feature 012 — projection of the legacy `enumValues: string[]` shape
309
+ * from the option rows for one attribute. Returns `null` when the
310
+ * attribute has no options.
311
+ */
312
+ getAttributeOptionValues(attributeId: string): Promise<string[] | null>;
313
+ /** Feature 012 — bulk variant of getAttributeOptionValues for the list endpoint. */
314
+ getAttributeOptionValuesByIds(attributeIds: readonly string[]): Promise<Map<string, string[]>>;
315
+ /** Feature 012 — read a single attribute by UUID or snake_case key. */
316
+ getAttributeByIdOrKey(idOrKey: string): Promise<CatalogAttributeView>;
317
+ /**
318
+ * Feature 012 — delete an attribute. Refused while any Attribute Set or
319
+ * product still references it (FR-006). The structured error names the
320
+ * dependent rows so the admin UI can guide the operator. Deletes the
321
+ * extension AND the backing definition (+ options cascade) in one
322
+ * transaction (feature 061).
323
+ */
324
+ deleteAttribute(idOrKey: string): Promise<void>;
325
+ createVariant(parentProductId: string, req: CreateVariantRequest): Promise<ProductVariant>;
326
+ updateVariant(parentProductId: string, variantId: string, req: UpdateVariantRequest): Promise<ProductVariant>;
327
+ deleteVariant(parentProductId: string, variantId: string): Promise<void>;
328
+ /**
329
+ * Feature 002 (T023) — reject unknown keys in `attributeValues` against
330
+ * the Product's AttributeSet. Empty input is a no-op (a Product with
331
+ * zero attribute values is always valid).
332
+ *
333
+ * Throws 400 ATTRIBUTE_VALUE_REJECTED with `details: [{ path, issue }]`
334
+ * listing the rejected keys.
335
+ */
336
+ private assertAttributeValueKeysAllowed;
337
+ /**
338
+ * Feature 012 / FR-013 — refuse a product save that leaves any
339
+ * required attribute (from the assigned set) without a value. Called
340
+ * after `assertAttributeValueKeysAllowed`; uses the merged
341
+ * (existing + patched) value map so a previously-set value satisfies
342
+ * the requirement even when the current patch omits it.
343
+ */
344
+ assertRequiredAttributesPresent(em: EntityManager, attributeSetId: string, mergedAttributeValues: Record<string, unknown>): Promise<void>;
345
+ /**
346
+ * Feature 012 / US2 — preview a Set swap on a Product. Returns the
347
+ * shape documented in `contracts/attribute-sets.contract.md` —
348
+ * attributesAdded, attributesRemoved, valuesPreserved (R-7),
349
+ * requiredButMissing.
350
+ */
351
+ previewAttributeSetSwap(productId: string, targetSetId: string | null): Promise<{
352
+ attributesAdded: Array<{
353
+ key: string;
354
+ labelDefault: string;
355
+ isRequired: boolean;
356
+ }>;
357
+ attributesRemoved: Array<{
358
+ key: string;
359
+ labelDefault: string;
360
+ }>;
361
+ valuesPreserved: Array<{
362
+ key: string;
363
+ valueSample: unknown;
364
+ }>;
365
+ requiredButMissing: Array<{
366
+ key: string;
367
+ labelDefault: string;
368
+ }>;
369
+ }>;
370
+ /**
371
+ * A product slug — the value that becomes a storefront URL and sits under
372
+ * `products.slug`'s unique index. Callers go through `allocateUniqueSlug`,
373
+ * which allocates against the live table rather than trusting this to be free.
374
+ *
375
+ * The fold is `slugify` from `@endora-commerce/contracts`, **imported, never
376
+ * re-implemented** (issue #245). The private chain this carried normalised
377
+ * with `NFKD` and stripped the combining marks, which does nothing to `ł` —
378
+ * U+0142 has no canonical decomposition — so the `[^a-z0-9]+` collapse
379
+ * deleted it: `Łączniki` produced `aczniki` and `Wiertła` produced `wiert-a`.
380
+ * Every Polish product name reached the storefront a letter short.
381
+ *
382
+ * **The shared fold is NFD, so this gives up NFKD's compatibility mappings**,
383
+ * and here that is worth stating precisely because the slug is
384
+ * unique-constrained: two names `NFKD` kept apart can now fold together
385
+ * (`Kabel²` and `Kabel³` both give `kabel`). It cannot become a constraint
386
+ * violation — `allocateUniqueSlug` probes the table and suffixes `-2`, `-3`,
387
+ * … exactly as it already does for two products sharing a plain name — and
388
+ * the characters that can cause it (`fi`, superscripts, full-width forms) are
389
+ * not typed into product names, while `ł` is in most of them.
390
+ *
391
+ * Slugs already stored are **not** migrated (owner's ruling, 2026-08-19).
392
+ * Nothing re-derives a slug to find an existing product: this runs on create
393
+ * and on duplicate, and duplicate re-slugs an already-slugged string.
394
+ */
395
+ private slugify;
396
+ private anyValue;
397
+ }
398
+ //# sourceMappingURL=catalog-admin.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-admin.service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/catalog-admin.service.ts"],"names":[],"mappings":"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"}