@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,275 @@
1
+ import { Product } from '../entities/product.entity.js';
2
+ import { toCatalogProductRecord } from './catalog-product-read.service.js';
3
+ /**
4
+ * The sellable-product filter `catalog` publishes (feature 075).
5
+ *
6
+ * `product_feeds` compiles an operator's selection rule into a predicate and
7
+ * walks the catalogue with it. Until this port existed it did that by holding
8
+ * `Product` and handing MikroORM a `where` object of its own construction —
9
+ * the one demand Phase P declined to guess at, because a query object is the
10
+ * ORM rather than a contract.
11
+ *
12
+ * Three things move across the boundary with the translation, and each of them
13
+ * is why the port is worth more than the import it replaces:
14
+ *
15
+ * 1. **The floor is applied here.** Feature 067's FR-026 says an operator's
16
+ * rule may only ever narrow "active, visible to the feed's reader, not
17
+ * archived, not soft-deleted, in the feed's channel". On the caller's side
18
+ * that was a conjunction a future edit could spread into one object and
19
+ * lose; here it is one `$and` clause the caller cannot reach. Who "the
20
+ * feed's reader" is has one answer and it is not this file's to invent —
21
+ * see {@link ANONYMOUS_AUDIENCE_CLAUSE}.
22
+ * 2. **The cursor is applied here.** A keyset walk and the floor both
23
+ * constrain `id`, and so does a category criterion. Composing all three
24
+ * was the caller's problem and is now nobody's.
25
+ * 3. **Rows leave as records.** The caller reads six fields off each row and
26
+ * yields ids; it never needed a managed entity, and holding one made the
27
+ * identity map grow with the catalogue rather than with the page.
28
+ *
29
+ * ## What the translation may and may not do
30
+ *
31
+ * The filter grammar is deliberately narrower than MikroORM: six columns, the
32
+ * JSONB attribute bag, twelve operators, `and` / `or`, and the two constants.
33
+ * There is no node this function could translate into a join, a relation walk
34
+ * or a raw fragment, which is what stops the port becoming the general query
35
+ * surface publishing the DSL would have made it.
36
+ *
37
+ * `contains` and `startsWith` build their own patterns, so the caller never
38
+ * writes `LIKE` syntax and the escaping rule has exactly one home — this file.
39
+ * See {@link escapeLikeLiteral} for what that rule is and why the value has to
40
+ * go through it.
41
+ */
42
+ /**
43
+ * The one place a `contains` / `startsWith` value becomes part of a pattern.
44
+ *
45
+ * Both operators name a **literal**: `contains "50%"` means the three
46
+ * characters `5`, `0`, `%`. `LIKE` reads `%` as "anything", `_` as "any one
47
+ * character" and — in PostgreSQL, absent an explicit `ESCAPE` clause — `\` as
48
+ * the escape character, so a value carrying any of the three used to mean
49
+ * something other than what the operator promises. Issue #181: an unescaped
50
+ * `contains "50%"` selected every product with "50" followed by anything.
51
+ *
52
+ * `\` is the escape character used here rather than an explicit `ESCAPE`
53
+ * clause, because there is nowhere to put one: MikroORM renders `$ilike` as
54
+ * `column ilike ?` with the pattern bound as a parameter, and reaching for a
55
+ * raw fragment to append `ESCAPE` would put SQL text back into a translation
56
+ * whose whole point is that it has no node for one. PostgreSQL's default escape
57
+ * character already *is* `\`, so escaping with it needs no clause — and it has
58
+ * to be escaped first in its own right, or a value ending in a backslash would
59
+ * escape the wildcard this function's callers append.
60
+ *
61
+ * Note the failure was not only over-matching: PostgreSQL degrades an escape
62
+ * sequence it does not recognise to the plain character, so the unescaped
63
+ * pattern for `C\D` also *missed* the row that actually holds the backslash.
64
+ */
65
+ export function escapeLikeLiteral(value) {
66
+ return value.replace(/[\\%_]/g, (character) => `\\${character}`);
67
+ }
68
+ /** The page size the feed pipeline already walks in. */
69
+ const DEFAULT_PAGE_SIZE = 500;
70
+ /**
71
+ * A predicate that can never be satisfied — `id` is the primary key, so no row
72
+ * has a null one.
73
+ */
74
+ const NEVER = { id: null };
75
+ /**
76
+ * An explicit tautology, for the one place emptiness is not neutral: a branch
77
+ * of `$or`, where an empty object collapses the branch instead of matching
78
+ * every row.
79
+ */
80
+ const ALWAYS = { id: { $ne: null } };
81
+ export class CatalogProductFilterService {
82
+ emFactory;
83
+ constructor(emFactory) {
84
+ this.emFactory = emFactory;
85
+ }
86
+ async listSellable(query) {
87
+ if (query.productIds.length === 0)
88
+ return [];
89
+ const em = this.emFactory();
90
+ const rows = await em.find(Product, this.where(query), {
91
+ orderBy: { id: 'asc' },
92
+ limit: query.limit ?? DEFAULT_PAGE_SIZE,
93
+ });
94
+ const records = rows.map(toCatalogProductRecord);
95
+ // This manager is ours — `emFactory()` forks — and clearing it is what keeps
96
+ // a long walk O(page) rather than O(catalogue). Nothing survives the call
97
+ // but the records above, which are plain objects.
98
+ em.clear();
99
+ return records;
100
+ }
101
+ async countSellable(query) {
102
+ if (query.productIds.length === 0)
103
+ return 0;
104
+ return this.emFactory().count(Product, this.where({ ...query, afterId: null }));
105
+ }
106
+ /**
107
+ * Floor AND filter AND cursor, as an explicit `$and`.
108
+ *
109
+ * Never an object spread: all three constrain `id`, and spreading them keeps
110
+ * only the last one — which for a category criterion would drop the channel
111
+ * scoping altogether.
112
+ */
113
+ where(query) {
114
+ const clauses = [sellableFloor(query.productIds)];
115
+ const predicate = translateFilter(query.filter);
116
+ if (predicate !== null)
117
+ clauses.push(predicate);
118
+ if (query.afterId)
119
+ clauses.push({ id: { $gt: query.afterId } });
120
+ return { $and: clauses };
121
+ }
122
+ }
123
+ /**
124
+ * `isProductVisibleTo(row, ANONYMOUS_PRODUCT_AUDIENCE)`, written as SQL.
125
+ *
126
+ * The only consumer of this port is a **product feed**, and a feed is read by
127
+ * Google: an anonymous, unauthenticated consumer with no organisation and no
128
+ * session. That is the same audience the sitemap answers for, and it is now
129
+ * answered with the same words — the platform has one predicate for "may this
130
+ * caller see this product" and this clause is its SQL half, not a second
131
+ * opinion (issue #259).
132
+ *
133
+ * The floor used to say `visibility: 'public'` and stop, which is not the whole
134
+ * answer: an operator can save `public` **with** a non-empty
135
+ * `allowed_organization_ids`, and the allow-list restricts whatever the
136
+ * visibility column says. A feed carrying such a row advertises a URL an
137
+ * anonymous visitor gets a 404 from, and advertises the existence of an
138
+ * assortment reserved for one distributor to everybody else's crawler.
139
+ *
140
+ * ## Why it collapses to two equalities
141
+ *
142
+ * The general SQL form of the predicate is the containment `catalog`'s
143
+ * quick-search applies — `allowed_organization_ids @> '[<buyer org>]'`, so the
144
+ * buyer's id is an *element* of the array rather than a substring of the
145
+ * serialised bag. For the **anonymous** audience there is no organisation to
146
+ * contain, so that branch can never match, and what is left is the predicate's
147
+ * second branch: an empty allow-list, decided by `visibility` alone, which for
148
+ * an unauthenticated caller means `public`.
149
+ *
150
+ * That difference is the point, not an omission (issue #262). The other SQL
151
+ * statement of this rule is in `catalog-quick-search.service.ts`, it answers
152
+ * for a **signed-in buyer** — `{ organizationId, authenticated: true }`, an
153
+ * audience that surface's port requires — and it therefore keeps the
154
+ * containment branch and admits `logged_in_only`. Neither clause may be
155
+ * aligned with the other: the containment branch would be dead weight here,
156
+ * and these two equalities over there would hide from a buyer every row his own
157
+ * organisation is named on. Each site has its own parity test instead, and both
158
+ * derive their expectations from `isProductVisibleTo`.
159
+ *
160
+ * ## Why the empty test is spelled `{ $eq: [] }`
161
+ *
162
+ * It renders `allowed_organization_ids = '[]'`, and `jsonb` equality is
163
+ * structural, so it matches the empty array and nothing else. Do **not**
164
+ * "simplify" it to a bare `allowedOrganizationIds: []`: MikroORM reads a bare
165
+ * array as an `$in` list, and an empty one matches no row at all — every
166
+ * product would silently leave every feed.
167
+ *
168
+ * A raw `jsonb_array_length(...) = 0` fragment was the other candidate and is
169
+ * refused for a sharper reason: as a `raw()` key it survives `em.find` and
170
+ * breaks in `em.count`, which re-quotes the fragment as an identifier. That is
171
+ * precisely the half this port must never differ on — `countSellable` is the
172
+ * number an operator is shown before saving and `listSellable` is what the run
173
+ * emits.
174
+ *
175
+ * ## How this stays in step with the TypeScript predicate
176
+ *
177
+ * `backend/test/integration/catalog/product-filter-port.test.ts` seeds every
178
+ * `productVisibilitySchema.options` × (empty, non-empty) state and derives its
179
+ * expectation from `isProductVisibleTo` itself, for `listSellable` and
180
+ * `countSellable` both. Neither side can drift without that file going red, and
181
+ * a fourth visibility value enters the sweep as soon as the enum grows.
182
+ *
183
+ * `backend/test/integration/catalog/quick-search-audience-parity.test.ts` is
184
+ * the same mechanism for the buyer-facing statement — the states this sweep
185
+ * cannot reach, an allow-list naming the viewer's own organisation among
186
+ * others, being exactly what an anonymous audience has no way to express.
187
+ */
188
+ const ANONYMOUS_AUDIENCE_CLAUSE = {
189
+ visibility: 'public',
190
+ allowedOrganizationIds: { $eq: [] },
191
+ };
192
+ /**
193
+ * The non-overridable floor. One function so there is exactly one place a
194
+ * reviewer has to read to know what this port can return.
195
+ *
196
+ * The audience half of it — the two clauses over `visibility` and
197
+ * `allowed_organization_ids` — is {@link ANONYMOUS_AUDIENCE_CLAUSE}.
198
+ */
199
+ function sellableFloor(productIds) {
200
+ return {
201
+ id: { $in: [...productIds] },
202
+ status: 'active',
203
+ // Two keys nothing else in this object names, so the spread cannot lose a
204
+ // clause the way `where()`'s comment warns an `id` spread would.
205
+ ...ANONYMOUS_AUDIENCE_CLAUSE,
206
+ archivedAt: null,
207
+ deletedAt: null,
208
+ };
209
+ }
210
+ /** `null` when the node constrains nothing, so the caller can omit the clause. */
211
+ export function translateFilter(filter) {
212
+ if (filter.kind === 'all')
213
+ return null;
214
+ if (filter.kind === 'none')
215
+ return NEVER;
216
+ if (filter.kind === 'group') {
217
+ const children = filter.children.map((child) => translateFilter(child) ?? ALWAYS);
218
+ if (children.length === 0)
219
+ return null;
220
+ return { [filter.op === 'or' ? '$or' : '$and']: children };
221
+ }
222
+ return translateCondition(filter);
223
+ }
224
+ function translateCondition(condition) {
225
+ const comparison = comparisonFor(condition);
226
+ if (comparison === null)
227
+ return NEVER;
228
+ if (condition.field.kind === 'column') {
229
+ return { [condition.field.column]: comparison.value };
230
+ }
231
+ return { attributeValues: { [condition.field.key]: comparison.value } };
232
+ }
233
+ /**
234
+ * One operator, as the ORM spells it. `null` means the condition cannot be
235
+ * satisfied — an operator that needs a value and was given none, which is a
236
+ * half-filled criterion and must select nothing rather than everything.
237
+ */
238
+ function comparisonFor(condition) {
239
+ const { op, values } = condition;
240
+ if (op === 'isNull')
241
+ return { value: null };
242
+ if (op === 'isNotNull')
243
+ return { value: { $ne: null } };
244
+ if (values.length === 0)
245
+ return null;
246
+ const first = values[0];
247
+ switch (op) {
248
+ case 'eq':
249
+ return { value: first };
250
+ case 'ne':
251
+ return { value: { $ne: first } };
252
+ case 'in':
253
+ return { value: { $in: [...values] } };
254
+ case 'nin':
255
+ return { value: { $nin: [...values] } };
256
+ case 'gt':
257
+ return { value: { $gt: first } };
258
+ case 'gte':
259
+ return { value: { $gte: first } };
260
+ case 'lt':
261
+ return { value: { $lt: first } };
262
+ case 'lte':
263
+ return { value: { $lte: first } };
264
+ case 'contains':
265
+ return { value: { $ilike: `%${escapeLikeLiteral(String(first))}%` } };
266
+ case 'startsWith':
267
+ return { value: { $ilike: `${escapeLikeLiteral(String(first))}%` } };
268
+ /* c8 ignore next 4 -- unreachable while the contract union and this switch
269
+ agree; a future operator with no branch selects nothing rather than
270
+ everything. */
271
+ default:
272
+ return null;
273
+ }
274
+ }
275
+ //# sourceMappingURL=catalog-product-filter.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-product-filter.service.js","sourceRoot":"","sources":["../../../src/backend/services/catalog-product-filter.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql';
2
+ import type { CatalogPackagingUnitRecord, CatalogProductLinkRow, CatalogProductLookupOptions, CatalogProductReadPort, CatalogProductRecord, CatalogProductValueOverrideRecord, CatalogProductVariantRecord, ProductLinkKind } from '@endora-commerce/contracts';
3
+ import { Product } from '../entities/product.entity.js';
4
+ import { ProductLink } from '../entities/product-link.entity.js';
5
+ import { ProductPackagingUnit } from '../entities/product-packaging-unit.entity.js';
6
+ import { ProductValueOverride } from '../entities/product-value-override.entity.js';
7
+ import { ProductVariant } from '../entities/product-variant.entity.js';
8
+ /**
9
+ * The row-level read model `catalog` publishes (feature 075, Phase P).
10
+ *
11
+ * Forty-six of this module's 107 inbound import sites are a read of the
12
+ * `Product` entity, and the sixty across `Product` and `Category` together are
13
+ * the largest single cluster in the sweep. They reduce to four questions — by
14
+ * id, by ids, by sku, by skus — differing only in which of the three
15
+ * soft-delete / status filters each caller happened to apply.
16
+ *
17
+ * That variation is the reason the filters are an **options object** rather
18
+ * than separate methods. Sixteen call sites pass `deletedAt: null`, four also
19
+ * pass `status: 'active'`, and the rest deliberately pass neither, because an
20
+ * inactive or soft-deleted product still has to resolve from a historical
21
+ * order, invoice, RFQ or shopping list. Naming the two narrowings is what
22
+ * makes each caller's choice visible; defaulting both to `false` keeps the
23
+ * wider read the default it already is.
24
+ */
25
+ export declare class CatalogProductReadService implements CatalogProductReadPort {
26
+ private readonly emFactory;
27
+ constructor(emFactory: () => EntityManager);
28
+ findById(id: string, options?: CatalogProductLookupOptions): Promise<CatalogProductRecord | null>;
29
+ findByIds(ids: readonly string[], options?: CatalogProductLookupOptions): Promise<CatalogProductRecord[]>;
30
+ findBySku(sku: string, options?: CatalogProductLookupOptions): Promise<CatalogProductRecord | null>;
31
+ findBySkus(skus: readonly string[], options?: CatalogProductLookupOptions): Promise<CatalogProductRecord[]>;
32
+ countByIds(ids: readonly string[]): Promise<number>;
33
+ listAll(options?: CatalogProductLookupOptions): Promise<CatalogProductRecord[]>;
34
+ listVariantsByProductIds(productIds: readonly string[]): Promise<CatalogProductVariantRecord[]>;
35
+ findVariantsBySkus(skus: readonly string[]): Promise<CatalogProductVariantRecord[]>;
36
+ findVariantInProduct(parentProductId: string, variantId: string): Promise<CatalogProductVariantRecord | null>;
37
+ findPackagingUnitInProduct(productId: string, packagingUnitId: string): Promise<CatalogPackagingUnitRecord | null>;
38
+ listLinksBySourceIds(sourceProductIds: readonly string[], kind?: ProductLinkKind): Promise<CatalogProductLinkRow[]>;
39
+ listValueOverridesByProductIds(productIds: readonly string[]): Promise<CatalogProductValueOverrideRecord[]>;
40
+ }
41
+ export declare function toCatalogProductRecord(product: Product): CatalogProductRecord;
42
+ export declare function toCatalogProductVariantRecord(variant: ProductVariant): CatalogProductVariantRecord;
43
+ export declare function toCatalogPackagingUnitRecord(unit: ProductPackagingUnit): CatalogPackagingUnitRecord;
44
+ export declare function toCatalogProductLinkRow(link: ProductLink): CatalogProductLinkRow;
45
+ export declare function toCatalogProductValueOverrideRecord(override: ProductValueOverride): CatalogProductValueOverrideRecord;
46
+ //# sourceMappingURL=catalog-product-read.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-product-read.service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/catalog-product-read.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,uBAAuB,CAAC;AACxE,OAAO,KAAK,EACV,0BAA0B,EAC1B,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,EACpB,iCAAiC,EACjC,2BAA2B,EAC3B,eAAe,EAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,yBAA0B,YAAW,sBAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM,aAAa;IAErD,QAAQ,CACZ,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAQjC,SAAS,CACb,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAS5B,SAAS,CACb,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAQjC,UAAU,CACd,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAS5B,UAAU,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAKnD,OAAO,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAS/E,wBAAwB,CAC5B,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,2BAA2B,EAAE,CAAC;IAUnC,kBAAkB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC;IAMnF,oBAAoB,CACxB,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC;IAQxC,0BAA0B,CAC9B,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC;IAQvC,oBAAoB,CACxB,gBAAgB,EAAE,SAAS,MAAM,EAAE,EACnC,IAAI,CAAC,EAAE,eAAe,GACrB,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAa7B,8BAA8B,CAClC,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,iCAAiC,EAAE,CAAC;CAOhD;AAgBD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,oBAAoB,CA2B7E;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,cAAc,GACtB,2BAA2B,CAW7B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,oBAAoB,GACzB,0BAA0B,CAW5B;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,qBAAqB,CAQhF;AAED,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,oBAAoB,GAC7B,iCAAiC,CASnC"}
@@ -0,0 +1,197 @@
1
+ import { Product } from '../entities/product.entity.js';
2
+ import { ProductLink } from '../entities/product-link.entity.js';
3
+ import { ProductPackagingUnit } from '../entities/product-packaging-unit.entity.js';
4
+ import { ProductValueOverride } from '../entities/product-value-override.entity.js';
5
+ import { ProductVariant } from '../entities/product-variant.entity.js';
6
+ /**
7
+ * The row-level read model `catalog` publishes (feature 075, Phase P).
8
+ *
9
+ * Forty-six of this module's 107 inbound import sites are a read of the
10
+ * `Product` entity, and the sixty across `Product` and `Category` together are
11
+ * the largest single cluster in the sweep. They reduce to four questions — by
12
+ * id, by ids, by sku, by skus — differing only in which of the three
13
+ * soft-delete / status filters each caller happened to apply.
14
+ *
15
+ * That variation is the reason the filters are an **options object** rather
16
+ * than separate methods. Sixteen call sites pass `deletedAt: null`, four also
17
+ * pass `status: 'active'`, and the rest deliberately pass neither, because an
18
+ * inactive or soft-deleted product still has to resolve from a historical
19
+ * order, invoice, RFQ or shopping list. Naming the two narrowings is what
20
+ * makes each caller's choice visible; defaulting both to `false` keeps the
21
+ * wider read the default it already is.
22
+ */
23
+ export class CatalogProductReadService {
24
+ emFactory;
25
+ constructor(emFactory) {
26
+ this.emFactory = emFactory;
27
+ }
28
+ async findById(id, options) {
29
+ const product = await this.emFactory().findOne(Product, {
30
+ id,
31
+ ...productFilter(options),
32
+ });
33
+ return product ? toCatalogProductRecord(product) : null;
34
+ }
35
+ async findByIds(ids, options) {
36
+ if (ids.length === 0)
37
+ return [];
38
+ const products = await this.emFactory().find(Product, {
39
+ id: { $in: [...ids] },
40
+ ...productFilter(options),
41
+ });
42
+ return products.map(toCatalogProductRecord);
43
+ }
44
+ async findBySku(sku, options) {
45
+ const product = await this.emFactory().findOne(Product, {
46
+ sku,
47
+ ...productFilter(options),
48
+ });
49
+ return product ? toCatalogProductRecord(product) : null;
50
+ }
51
+ async findBySkus(skus, options) {
52
+ if (skus.length === 0)
53
+ return [];
54
+ const products = await this.emFactory().find(Product, {
55
+ sku: { $in: [...skus] },
56
+ ...productFilter(options),
57
+ });
58
+ return products.map(toCatalogProductRecord);
59
+ }
60
+ async countByIds(ids) {
61
+ if (ids.length === 0)
62
+ return 0;
63
+ return this.emFactory().count(Product, { id: { $in: [...ids] } });
64
+ }
65
+ async listAll(options) {
66
+ const products = await this.emFactory().find(Product, productFilter(options), { orderBy: { sku: 'asc' } });
67
+ return products.map(toCatalogProductRecord);
68
+ }
69
+ async listVariantsByProductIds(productIds) {
70
+ if (productIds.length === 0)
71
+ return [];
72
+ const variants = await this.emFactory().find(ProductVariant, { parentProductId: { $in: [...productIds] } }, { orderBy: { sku: 'asc' } });
73
+ return variants.map(toCatalogProductVariantRecord);
74
+ }
75
+ async findVariantsBySkus(skus) {
76
+ if (skus.length === 0)
77
+ return [];
78
+ const variants = await this.emFactory().find(ProductVariant, { sku: { $in: [...skus] } });
79
+ return variants.map(toCatalogProductVariantRecord);
80
+ }
81
+ async findVariantInProduct(parentProductId, variantId) {
82
+ const variant = await this.emFactory().findOne(ProductVariant, {
83
+ id: variantId,
84
+ parentProductId,
85
+ });
86
+ return variant ? toCatalogProductVariantRecord(variant) : null;
87
+ }
88
+ async findPackagingUnitInProduct(productId, packagingUnitId) {
89
+ const unit = await this.emFactory().findOne(ProductPackagingUnit, {
90
+ id: packagingUnitId,
91
+ productId,
92
+ });
93
+ return unit ? toCatalogPackagingUnitRecord(unit) : null;
94
+ }
95
+ async listLinksBySourceIds(sourceProductIds, kind) {
96
+ if (sourceProductIds.length === 0)
97
+ return [];
98
+ const links = await this.emFactory().find(ProductLink, {
99
+ sourceProductId: { $in: [...sourceProductIds] },
100
+ ...(kind === undefined ? {} : { kind }),
101
+ }, { orderBy: { position: 'asc', id: 'asc' } });
102
+ return links.map(toCatalogProductLinkRow);
103
+ }
104
+ async listValueOverridesByProductIds(productIds) {
105
+ if (productIds.length === 0)
106
+ return [];
107
+ const overrides = await this.emFactory().find(ProductValueOverride, {
108
+ productId: { $in: [...productIds] },
109
+ });
110
+ return overrides.map(toCatalogProductValueOverrideRecord);
111
+ }
112
+ }
113
+ /**
114
+ * `{}` by default — the wider read. `liveOnly` drops soft-deleted rows,
115
+ * `activeOnly` implies it and narrows to `status === 'active'`; a caller
116
+ * asking for active rows never wants the deleted ones as well, and letting the
117
+ * two be set independently would publish a combination nobody means.
118
+ */
119
+ function productFilter(options) {
120
+ if (options?.activeOnly)
121
+ return { deletedAt: null, status: 'active' };
122
+ if (options?.liveOnly)
123
+ return { deletedAt: null };
124
+ return {};
125
+ }
126
+ export function toCatalogProductRecord(product) {
127
+ return {
128
+ id: product.id,
129
+ sku: product.sku,
130
+ slug: product.slug,
131
+ type: product.type,
132
+ status: product.status,
133
+ name: product.name,
134
+ description: product.description,
135
+ stockMode: product.stockMode ?? null,
136
+ visibility: product.visibility,
137
+ attributeValues: product.attributeValues ?? {},
138
+ allowedOrganizationIds: product.allowedOrganizationIds ?? [],
139
+ attributeSetId: product.attributeSetId,
140
+ downloadAssetId: product.downloadAssetId ?? null,
141
+ downloadUrl: product.downloadUrl ?? null,
142
+ createdAt: product.createdAt,
143
+ updatedAt: product.updatedAt,
144
+ archivedAt: product.archivedAt ?? null,
145
+ deletedAt: product.deletedAt ?? null,
146
+ manageStock: product.manageStock,
147
+ backorderEnabled: product.backorderEnabled,
148
+ lowStockThreshold: product.lowStockThreshold ?? null,
149
+ lowStockThresholdMode: product.lowStockThresholdMode,
150
+ fulfilmentStrategy: product.fulfilmentStrategy ?? null,
151
+ fulfilmentStrategyWarehouseOrder: product.fulfilmentStrategyWarehouseOrder ?? null,
152
+ };
153
+ }
154
+ export function toCatalogProductVariantRecord(variant) {
155
+ return {
156
+ id: variant.id,
157
+ parentProductId: variant.parentProductId,
158
+ sku: variant.sku,
159
+ variantAttributeValues: variant.variantAttributeValues ?? {},
160
+ priceOverride: variant.priceOverride ?? null,
161
+ stockLevel: variant.stockLevel ?? null,
162
+ createdAt: variant.createdAt,
163
+ updatedAt: variant.updatedAt,
164
+ };
165
+ }
166
+ export function toCatalogPackagingUnitRecord(unit) {
167
+ return {
168
+ id: unit.id,
169
+ productId: unit.productId,
170
+ name: unit.name,
171
+ baseQuantity: unit.baseQuantity,
172
+ position: unit.position,
173
+ isDefault: unit.isDefault,
174
+ createdAt: unit.createdAt,
175
+ updatedAt: unit.updatedAt,
176
+ };
177
+ }
178
+ export function toCatalogProductLinkRow(link) {
179
+ return {
180
+ id: link.id,
181
+ sourceProductId: link.sourceProductId,
182
+ targetProductId: link.targetProductId,
183
+ kind: link.kind,
184
+ position: link.position,
185
+ };
186
+ }
187
+ export function toCatalogProductValueOverrideRecord(override) {
188
+ return {
189
+ id: override.id,
190
+ productId: override.productId,
191
+ attributeKey: override.attributeKey,
192
+ channelId: override.channelId,
193
+ languageCode: override.languageCode ?? null,
194
+ value: override.value,
195
+ };
196
+ }
197
+ //# sourceMappingURL=catalog-product-read.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-product-read.service.js","sourceRoot":"","sources":["../../../src/backend/services/catalog-product-read.service.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,yBAAyB;IACP;IAA7B,YAA6B,SAA8B;QAA9B,cAAS,GAAT,SAAS,CAAqB;IAAG,CAAC;IAE/D,KAAK,CAAC,QAAQ,CACZ,EAAU,EACV,OAAqC;QAErC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YACtD,EAAE;YACF,GAAG,aAAa,CAAC,OAAO,CAAC;SAC1B,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,SAAS,CACb,GAAsB,EACtB,OAAqC;QAErC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;YACpD,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE;YACrB,GAAG,aAAa,CAAC,OAAO,CAAC;SAC1B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,SAAS,CACb,GAAW,EACX,OAAqC;QAErC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YACtD,GAAG;YACH,GAAG,aAAa,CAAC,OAAO,CAAC;SAC1B,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,UAAU,CACd,IAAuB,EACvB,OAAqC;QAErC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;YACpD,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;YACvB,GAAG,aAAa,CAAC,OAAO,CAAC;SAC1B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAsB;QACrC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAqC;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAC1C,OAAO,EACP,aAAa,CAAC,OAAO,CAAyB,EAC9C,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAC5B,CAAC;QACF,OAAO,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,UAA6B;QAE7B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAC1C,cAAc,EACd,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,EAC7C,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAC5B,CAAC;QACF,OAAO,QAAQ,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,IAAuB;QAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1F,OAAO,QAAQ,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,eAAuB,EACvB,SAAiB;QAEjB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE;YAC7D,EAAE,EAAE,SAAS;YACb,eAAe;SAChB,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC9B,SAAiB,EACjB,eAAuB;QAEvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,oBAAoB,EAAE;YAChE,EAAE,EAAE,eAAe;YACnB,SAAS;SACV,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,CAAC,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,gBAAmC,EACnC,IAAsB;QAEtB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CACvC,WAAW,EACX;YACE,eAAe,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,gBAAgB,CAAC,EAAE;YAC/C,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;SACxC,EACD,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAC5C,CAAC;QACF,OAAO,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,8BAA8B,CAClC,UAA6B;QAE7B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAClE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE;SACpC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAC5D,CAAC;CACF;AAED;;;;;GAKG;AACH,SAAS,aAAa,CACpB,OAAqC;IAErC,IAAI,OAAO,EAAE,UAAU;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACtE,IAAI,OAAO,EAAE,QAAQ;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAClD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE;QAC9C,sBAAsB,EAAE,OAAO,CAAC,sBAAsB,IAAI,EAAE;QAC5D,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI;QAChD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,IAAI;QACpD,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;QACpD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,IAAI;QACtD,gCAAgC,EAAE,OAAO,CAAC,gCAAgC,IAAI,IAAI;KACnF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,OAAuB;IAEvB,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,sBAAsB,EAAE,OAAO,CAAC,sBAAsB,IAAI,EAAE;QAC5D,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;QAC5C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,IAA0B;IAE1B,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAiB;IACvD,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,QAA8B;IAE9B,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,IAAI;QAC3C,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CAAC;AACJ,CAAC"}