@oronts/vendure-data-hub-plugin 0.1.3 → 0.1.5

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 (491) hide show
  1. package/CHANGELOG.md +46 -1
  2. package/README.md +30 -8
  3. package/dashboard/components/pipelines/PipelineEditor.tsx +159 -5
  4. package/dashboard/components/pipelines/ReactFlowPipelineEditor.tsx +3 -3
  5. package/dashboard/components/pipelines/shared/NodePropertiesPanel.tsx +42 -4
  6. package/dashboard/components/pipelines/shared/StepListItem.tsx +2 -2
  7. package/dashboard/components/shared/CodeEditor.tsx +289 -0
  8. package/dashboard/components/shared/schema-form/fields/TextareaField.tsx +19 -4
  9. package/dashboard/components/shared/step-config/AdapterSelector.tsx +2 -2
  10. package/dashboard/components/shared/step-config/OperatorFieldInput.tsx +19 -0
  11. package/dashboard/components/shared/step-config/RouteConfigComponent.tsx +218 -29
  12. package/dashboard/components/shared/step-config/StepConfigPanel.tsx +37 -17
  13. package/dashboard/components/shared/step-config/ValidateConfigComponent.tsx +2 -2
  14. package/dashboard/constants/ui-dimensions.ts +2 -1
  15. package/dashboard/constants/ui-states.ts +1 -0
  16. package/dashboard/gql/graphql.ts +13 -1
  17. package/dashboard/hooks/use-adapter-catalog.ts +4 -32
  18. package/dashboard/routes/connections/ConnectionDetail.tsx +7 -1
  19. package/dashboard/routes/pipelines/RunDetailsPanel.tsx +1 -1
  20. package/dashboard/routes/pipelines/components/PipelineActionButtons.tsx +3 -3
  21. package/dashboard/routes/pipelines/utils/pipeline-conversion.ts +3 -5
  22. package/dashboard/utils/formatters.ts +6 -4
  23. package/dist/dashboard/components/pipelines/PipelineEditor.tsx +159 -5
  24. package/dist/dashboard/components/pipelines/ReactFlowPipelineEditor.tsx +3 -3
  25. package/dist/dashboard/components/pipelines/shared/NodePropertiesPanel.tsx +42 -4
  26. package/dist/dashboard/components/pipelines/shared/StepListItem.tsx +2 -2
  27. package/dist/dashboard/components/shared/CodeEditor.tsx +289 -0
  28. package/dist/dashboard/components/shared/schema-form/fields/TextareaField.tsx +19 -4
  29. package/dist/dashboard/components/shared/step-config/AdapterSelector.tsx +2 -2
  30. package/dist/dashboard/components/shared/step-config/OperatorFieldInput.tsx +19 -0
  31. package/dist/dashboard/components/shared/step-config/RouteConfigComponent.tsx +218 -29
  32. package/dist/dashboard/components/shared/step-config/StepConfigPanel.tsx +37 -17
  33. package/dist/dashboard/components/shared/step-config/ValidateConfigComponent.tsx +2 -2
  34. package/dist/dashboard/constants/ui-dimensions.ts +2 -1
  35. package/dist/dashboard/constants/ui-states.ts +1 -0
  36. package/dist/dashboard/gql/graphql.ts +13 -1
  37. package/dist/dashboard/hooks/use-adapter-catalog.ts +4 -32
  38. package/dist/dashboard/routes/connections/ConnectionDetail.tsx +7 -1
  39. package/dist/dashboard/routes/pipelines/RunDetailsPanel.tsx +1 -1
  40. package/dist/dashboard/routes/pipelines/components/PipelineActionButtons.tsx +3 -3
  41. package/dist/dashboard/routes/pipelines/utils/pipeline-conversion.ts +3 -5
  42. package/dist/dashboard/utils/formatters.ts +6 -4
  43. package/dist/shared/types/adapter-config.types.d.ts +148 -4
  44. package/dist/shared/types/adapter-config.types.d.ts.map +1 -1
  45. package/dist/shared/types/index.d.ts +1 -1
  46. package/dist/shared/types/index.d.ts.map +1 -1
  47. package/dist/shared/types/index.js.map +1 -1
  48. package/dist/shared/types/loader.types.d.ts +4 -0
  49. package/dist/shared/types/loader.types.d.ts.map +1 -1
  50. package/dist/shared/types/step.types.d.ts +6 -0
  51. package/dist/shared/types/step.types.d.ts.map +1 -1
  52. package/dist/shared/types/trigger.types.d.ts +0 -4
  53. package/dist/shared/types/trigger.types.d.ts.map +1 -1
  54. package/dist/src/adapters/registry.d.ts.map +1 -1
  55. package/dist/src/adapters/registry.js +2 -1
  56. package/dist/src/adapters/registry.js.map +1 -1
  57. package/dist/src/api/controllers/webhook.controller.d.ts +10 -0
  58. package/dist/src/api/controllers/webhook.controller.d.ts.map +1 -1
  59. package/dist/src/api/controllers/webhook.controller.js +50 -10
  60. package/dist/src/api/controllers/webhook.controller.js.map +1 -1
  61. package/dist/src/api/resolvers/queue.resolver.d.ts +3 -1
  62. package/dist/src/api/resolvers/queue.resolver.d.ts.map +1 -1
  63. package/dist/src/api/resolvers/queue.resolver.js +6 -5
  64. package/dist/src/api/resolvers/queue.resolver.js.map +1 -1
  65. package/dist/src/api/schema/pipeline.schema.d.ts +1 -1
  66. package/dist/src/api/schema/pipeline.schema.d.ts.map +1 -1
  67. package/dist/src/api/schema/pipeline.schema.js +4 -0
  68. package/dist/src/api/schema/pipeline.schema.js.map +1 -1
  69. package/dist/src/api/schema/test.schema.d.ts +1 -1
  70. package/dist/src/api/schema/test.schema.d.ts.map +1 -1
  71. package/dist/src/api/schema/test.schema.js +5 -1
  72. package/dist/src/api/schema/test.schema.js.map +1 -1
  73. package/dist/src/bootstrap/seed-data.js +1 -1
  74. package/dist/src/bootstrap/seed-data.js.map +1 -1
  75. package/dist/src/constants/adapter-schema-options.d.ts +65 -0
  76. package/dist/src/constants/adapter-schema-options.d.ts.map +1 -1
  77. package/dist/src/constants/adapter-schema-options.js +91 -7
  78. package/dist/src/constants/adapter-schema-options.js.map +1 -1
  79. package/dist/src/constants/builtin-adapters.d.ts +1 -1
  80. package/dist/src/constants/builtin-adapters.d.ts.map +1 -1
  81. package/dist/src/constants/builtin-adapters.js +19 -1
  82. package/dist/src/constants/builtin-adapters.js.map +1 -1
  83. package/dist/src/constants/core.d.ts +10 -0
  84. package/dist/src/constants/core.d.ts.map +1 -1
  85. package/dist/src/constants/core.js +10 -0
  86. package/dist/src/constants/core.js.map +1 -1
  87. package/dist/src/constants/defaults/webhook-defaults.d.ts +2 -0
  88. package/dist/src/constants/defaults/webhook-defaults.d.ts.map +1 -1
  89. package/dist/src/constants/defaults/webhook-defaults.js +2 -0
  90. package/dist/src/constants/defaults/webhook-defaults.js.map +1 -1
  91. package/dist/src/constants/enum-metadata.d.ts.map +1 -1
  92. package/dist/src/constants/enum-metadata.js +3 -0
  93. package/dist/src/constants/enum-metadata.js.map +1 -1
  94. package/dist/src/constants/hook-stage-metadata.d.ts.map +1 -1
  95. package/dist/src/constants/hook-stage-metadata.js +42 -0
  96. package/dist/src/constants/hook-stage-metadata.js.map +1 -1
  97. package/dist/src/constants/services.d.ts.map +1 -1
  98. package/dist/src/constants/services.js +7 -0
  99. package/dist/src/constants/services.js.map +1 -1
  100. package/dist/src/constants/time.d.ts +2 -0
  101. package/dist/src/constants/time.d.ts.map +1 -1
  102. package/dist/src/constants/time.js +2 -0
  103. package/dist/src/constants/time.js.map +1 -1
  104. package/dist/src/data-hub.plugin.d.ts.map +1 -1
  105. package/dist/src/data-hub.plugin.js +2 -2
  106. package/dist/src/data-hub.plugin.js.map +1 -1
  107. package/dist/src/entities/pipeline/pipeline-run.entity.d.ts +4 -0
  108. package/dist/src/entities/pipeline/pipeline-run.entity.d.ts.map +1 -1
  109. package/dist/src/entities/pipeline/pipeline-run.entity.js +8 -0
  110. package/dist/src/entities/pipeline/pipeline-run.entity.js.map +1 -1
  111. package/dist/src/extractors/cdc/cdc.extractor.d.ts.map +1 -1
  112. package/dist/src/extractors/cdc/cdc.extractor.js +7 -2
  113. package/dist/src/extractors/cdc/cdc.extractor.js.map +1 -1
  114. package/dist/src/extractors/cdc/types.d.ts +1 -1
  115. package/dist/src/extractors/cdc/types.d.ts.map +1 -1
  116. package/dist/src/extractors/extractor-handler-registry.d.ts.map +1 -1
  117. package/dist/src/extractors/extractor-handler-registry.js +3 -0
  118. package/dist/src/extractors/extractor-handler-registry.js.map +1 -1
  119. package/dist/src/extractors/vendure-query/helpers.d.ts +9 -4
  120. package/dist/src/extractors/vendure-query/helpers.d.ts.map +1 -1
  121. package/dist/src/extractors/vendure-query/helpers.js +98 -32
  122. package/dist/src/extractors/vendure-query/helpers.js.map +1 -1
  123. package/dist/src/extractors/vendure-query/schema.d.ts.map +1 -1
  124. package/dist/src/extractors/vendure-query/schema.js +13 -0
  125. package/dist/src/extractors/vendure-query/schema.js.map +1 -1
  126. package/dist/src/feeds/generators/csv-feed.generator.d.ts.map +1 -1
  127. package/dist/src/feeds/generators/csv-feed.generator.js +5 -4
  128. package/dist/src/feeds/generators/csv-feed.generator.js.map +1 -1
  129. package/dist/src/feeds/generators/facebook-catalog.generator.d.ts.map +1 -1
  130. package/dist/src/feeds/generators/facebook-catalog.generator.js +83 -114
  131. package/dist/src/feeds/generators/facebook-catalog.generator.js.map +1 -1
  132. package/dist/src/feeds/generators/feed-constants.d.ts +1 -0
  133. package/dist/src/feeds/generators/feed-constants.d.ts.map +1 -1
  134. package/dist/src/feeds/generators/feed-constants.js +1 -0
  135. package/dist/src/feeds/generators/feed-constants.js.map +1 -1
  136. package/dist/src/feeds/generators/feed-helpers.d.ts +10 -8
  137. package/dist/src/feeds/generators/feed-helpers.d.ts.map +1 -1
  138. package/dist/src/feeds/generators/feed-helpers.js +24 -4
  139. package/dist/src/feeds/generators/feed-helpers.js.map +1 -1
  140. package/dist/src/feeds/generators/feed-item-builder.d.ts +59 -0
  141. package/dist/src/feeds/generators/feed-item-builder.d.ts.map +1 -0
  142. package/dist/src/feeds/generators/feed-item-builder.js +93 -0
  143. package/dist/src/feeds/generators/feed-item-builder.js.map +1 -0
  144. package/dist/src/feeds/generators/google-shopping.generator.d.ts.map +1 -1
  145. package/dist/src/feeds/generators/google-shopping.generator.js +52 -64
  146. package/dist/src/feeds/generators/google-shopping.generator.js.map +1 -1
  147. package/dist/src/feeds/generators/json-feed.generator.d.ts.map +1 -1
  148. package/dist/src/feeds/generators/json-feed.generator.js +4 -3
  149. package/dist/src/feeds/generators/json-feed.generator.js.map +1 -1
  150. package/dist/src/feeds/generators/xml-feed.generator.d.ts.map +1 -1
  151. package/dist/src/feeds/generators/xml-feed.generator.js +6 -5
  152. package/dist/src/feeds/generators/xml-feed.generator.js.map +1 -1
  153. package/dist/src/gql/generated.d.ts +13 -1
  154. package/dist/src/gql/generated.d.ts.map +1 -1
  155. package/dist/src/gql/generated.js.map +1 -1
  156. package/dist/src/index.d.ts +3 -1
  157. package/dist/src/index.d.ts.map +1 -1
  158. package/dist/src/index.js +7 -4
  159. package/dist/src/index.js.map +1 -1
  160. package/dist/src/loaders/asset/asset.loader.d.ts.map +1 -1
  161. package/dist/src/loaders/asset/asset.loader.js +5 -1
  162. package/dist/src/loaders/asset/asset.loader.js.map +1 -1
  163. package/dist/src/loaders/base/validation-builder.d.ts +128 -3
  164. package/dist/src/loaders/base/validation-builder.d.ts.map +1 -1
  165. package/dist/src/loaders/base/validation-builder.js +177 -6
  166. package/dist/src/loaders/base/validation-builder.js.map +1 -1
  167. package/dist/src/loaders/collection/collection.loader.d.ts.map +1 -1
  168. package/dist/src/loaders/collection/collection.loader.js +22 -1
  169. package/dist/src/loaders/collection/collection.loader.js.map +1 -1
  170. package/dist/src/loaders/collection/helpers.d.ts +16 -1
  171. package/dist/src/loaders/collection/helpers.d.ts.map +1 -1
  172. package/dist/src/loaders/collection/helpers.js +37 -0
  173. package/dist/src/loaders/collection/helpers.js.map +1 -1
  174. package/dist/src/loaders/customer/customer.loader.d.ts.map +1 -1
  175. package/dist/src/loaders/customer/customer.loader.js +13 -1
  176. package/dist/src/loaders/customer/customer.loader.js.map +1 -1
  177. package/dist/src/loaders/customer/helpers.d.ts +15 -3
  178. package/dist/src/loaders/customer/helpers.d.ts.map +1 -1
  179. package/dist/src/loaders/customer/helpers.js +188 -7
  180. package/dist/src/loaders/customer/helpers.js.map +1 -1
  181. package/dist/src/loaders/facet-value/facet-value.loader.d.ts.map +1 -1
  182. package/dist/src/loaders/facet-value/facet-value.loader.js +18 -0
  183. package/dist/src/loaders/facet-value/facet-value.loader.js.map +1 -1
  184. package/dist/src/loaders/facet-value/types.d.ts +1 -1
  185. package/dist/src/loaders/facet-value/types.js +1 -1
  186. package/dist/src/loaders/facet-value/types.js.map +1 -1
  187. package/dist/src/loaders/order/helpers.d.ts +16 -2
  188. package/dist/src/loaders/order/helpers.d.ts.map +1 -1
  189. package/dist/src/loaders/order/helpers.js +108 -0
  190. package/dist/src/loaders/order/helpers.js.map +1 -1
  191. package/dist/src/loaders/order/order.loader.d.ts +38 -0
  192. package/dist/src/loaders/order/order.loader.d.ts.map +1 -1
  193. package/dist/src/loaders/order/order.loader.js +238 -24
  194. package/dist/src/loaders/order/order.loader.js.map +1 -1
  195. package/dist/src/loaders/order/types.d.ts +10 -3
  196. package/dist/src/loaders/order/types.d.ts.map +1 -1
  197. package/dist/src/loaders/order/types.js +13 -2
  198. package/dist/src/loaders/order/types.js.map +1 -1
  199. package/dist/src/loaders/product/product.loader.d.ts.map +1 -1
  200. package/dist/src/loaders/product/product.loader.js +18 -2
  201. package/dist/src/loaders/product/product.loader.js.map +1 -1
  202. package/dist/src/loaders/product-variant/helpers.d.ts +20 -0
  203. package/dist/src/loaders/product-variant/helpers.d.ts.map +1 -0
  204. package/dist/src/loaders/product-variant/helpers.js +103 -0
  205. package/dist/src/loaders/product-variant/helpers.js.map +1 -0
  206. package/dist/src/loaders/product-variant/product-variant.loader.d.ts.map +1 -1
  207. package/dist/src/loaders/product-variant/product-variant.loader.js +76 -10
  208. package/dist/src/loaders/product-variant/product-variant.loader.js.map +1 -1
  209. package/dist/src/loaders/product-variant/types.d.ts +7 -0
  210. package/dist/src/loaders/product-variant/types.d.ts.map +1 -1
  211. package/dist/src/loaders/product-variant/types.js.map +1 -1
  212. package/dist/src/loaders/promotion/helpers.d.ts +29 -0
  213. package/dist/src/loaders/promotion/helpers.d.ts.map +1 -1
  214. package/dist/src/loaders/promotion/helpers.js +68 -0
  215. package/dist/src/loaders/promotion/helpers.js.map +1 -1
  216. package/dist/src/loaders/promotion/promotion.loader.d.ts.map +1 -1
  217. package/dist/src/loaders/promotion/promotion.loader.js +12 -2
  218. package/dist/src/loaders/promotion/promotion.loader.js.map +1 -1
  219. package/dist/src/loaders/shared-helpers.d.ts +42 -2
  220. package/dist/src/loaders/shared-helpers.d.ts.map +1 -1
  221. package/dist/src/loaders/shared-helpers.js +384 -5
  222. package/dist/src/loaders/shared-helpers.js.map +1 -1
  223. package/dist/src/operators/data/copy.operator.js +2 -2
  224. package/dist/src/operators/data/copy.operator.js.map +1 -1
  225. package/dist/src/operators/data/rename.operator.js +1 -1
  226. package/dist/src/operators/data/rename.operator.js.map +1 -1
  227. package/dist/src/operators/helpers.d.ts.map +1 -1
  228. package/dist/src/operators/helpers.js +11 -1
  229. package/dist/src/operators/helpers.js.map +1 -1
  230. package/dist/src/operators/operator-runtime-registry.d.ts +2 -2
  231. package/dist/src/operators/operator-runtime-registry.d.ts.map +1 -1
  232. package/dist/src/operators/operator-runtime-registry.js +1 -1
  233. package/dist/src/operators/operator-runtime-registry.js.map +1 -1
  234. package/dist/src/operators/script/script.operators.d.ts.map +1 -1
  235. package/dist/src/operators/script/script.operators.js +9 -3
  236. package/dist/src/operators/script/script.operators.js.map +1 -1
  237. package/dist/src/runtime/config-types.d.ts +6 -0
  238. package/dist/src/runtime/config-types.d.ts.map +1 -1
  239. package/dist/src/runtime/executor-helpers.d.ts +77 -0
  240. package/dist/src/runtime/executor-helpers.d.ts.map +1 -0
  241. package/dist/src/runtime/executor-helpers.js +143 -0
  242. package/dist/src/runtime/executor-helpers.js.map +1 -0
  243. package/dist/src/runtime/executors/export.executor.d.ts +3 -1
  244. package/dist/src/runtime/executors/export.executor.d.ts.map +1 -1
  245. package/dist/src/runtime/executors/export.executor.js +15 -3
  246. package/dist/src/runtime/executors/export.executor.js.map +1 -1
  247. package/dist/src/runtime/executors/exporters/export-handler-registry.d.ts.map +1 -1
  248. package/dist/src/runtime/executors/exporters/export-handler-registry.js +5 -0
  249. package/dist/src/runtime/executors/exporters/export-handler-registry.js.map +1 -1
  250. package/dist/src/runtime/executors/exporters/export-handler.types.d.ts +3 -0
  251. package/dist/src/runtime/executors/exporters/export-handler.types.d.ts.map +1 -1
  252. package/dist/src/runtime/executors/exporters/export-handler.types.js.map +1 -1
  253. package/dist/src/runtime/executors/exporters/export-helpers.d.ts +1 -0
  254. package/dist/src/runtime/executors/exporters/export-helpers.d.ts.map +1 -1
  255. package/dist/src/runtime/executors/exporters/export-helpers.js +32 -3
  256. package/dist/src/runtime/executors/exporters/export-helpers.js.map +1 -1
  257. package/dist/src/runtime/executors/exporters/http-export.handler.js +4 -4
  258. package/dist/src/runtime/executors/exporters/http-export.handler.js.map +1 -1
  259. package/dist/src/runtime/executors/extractors/file-extract.handler.d.ts.map +1 -1
  260. package/dist/src/runtime/executors/extractors/file-extract.handler.js +33 -13
  261. package/dist/src/runtime/executors/extractors/file-extract.handler.js.map +1 -1
  262. package/dist/src/runtime/executors/extractors/memory-extract.handler.d.ts.map +1 -1
  263. package/dist/src/runtime/executors/extractors/memory-extract.handler.js +17 -9
  264. package/dist/src/runtime/executors/extractors/memory-extract.handler.js.map +1 -1
  265. package/dist/src/runtime/executors/feed.executor.d.ts.map +1 -1
  266. package/dist/src/runtime/executors/feed.executor.js +11 -2
  267. package/dist/src/runtime/executors/feed.executor.js.map +1 -1
  268. package/dist/src/runtime/executors/feeds/feed-handler-registry.d.ts.map +1 -1
  269. package/dist/src/runtime/executors/feeds/feed-handler-registry.js +4 -0
  270. package/dist/src/runtime/executors/feeds/feed-handler-registry.js.map +1 -1
  271. package/dist/src/runtime/executors/gate.executor.d.ts +3 -1
  272. package/dist/src/runtime/executors/gate.executor.d.ts.map +1 -1
  273. package/dist/src/runtime/executors/gate.executor.js +47 -26
  274. package/dist/src/runtime/executors/gate.executor.js.map +1 -1
  275. package/dist/src/runtime/executors/loaders/channel-handler.d.ts +3 -1
  276. package/dist/src/runtime/executors/loaders/channel-handler.d.ts.map +1 -1
  277. package/dist/src/runtime/executors/loaders/channel-handler.js +14 -4
  278. package/dist/src/runtime/executors/loaders/channel-handler.js.map +1 -1
  279. package/dist/src/runtime/executors/loaders/collection-handler.d.ts +14 -2
  280. package/dist/src/runtime/executors/loaders/collection-handler.d.ts.map +1 -1
  281. package/dist/src/runtime/executors/loaders/collection-handler.js +93 -22
  282. package/dist/src/runtime/executors/loaders/collection-handler.js.map +1 -1
  283. package/dist/src/runtime/executors/loaders/customer-group-handler.d.ts.map +1 -1
  284. package/dist/src/runtime/executors/loaders/customer-group-handler.js +2 -27
  285. package/dist/src/runtime/executors/loaders/customer-group-handler.js.map +1 -1
  286. package/dist/src/runtime/executors/loaders/customer-handler.d.ts +6 -1
  287. package/dist/src/runtime/executors/loaders/customer-handler.d.ts.map +1 -1
  288. package/dist/src/runtime/executors/loaders/customer-handler.js +95 -13
  289. package/dist/src/runtime/executors/loaders/customer-handler.js.map +1 -1
  290. package/dist/src/runtime/executors/loaders/deletion-handler.d.ts +39 -0
  291. package/dist/src/runtime/executors/loaders/deletion-handler.d.ts.map +1 -0
  292. package/dist/src/runtime/executors/loaders/deletion-handler.js +414 -0
  293. package/dist/src/runtime/executors/loaders/deletion-handler.js.map +1 -0
  294. package/dist/src/runtime/executors/loaders/facet-handler.d.ts +18 -3
  295. package/dist/src/runtime/executors/loaders/facet-handler.d.ts.map +1 -1
  296. package/dist/src/runtime/executors/loaders/facet-handler.js +127 -26
  297. package/dist/src/runtime/executors/loaders/facet-handler.js.map +1 -1
  298. package/dist/src/runtime/executors/loaders/index.d.ts +2 -0
  299. package/dist/src/runtime/executors/loaders/index.d.ts.map +1 -1
  300. package/dist/src/runtime/executors/loaders/index.js +5 -1
  301. package/dist/src/runtime/executors/loaders/index.js.map +1 -1
  302. package/dist/src/runtime/executors/loaders/inventory-adjust-handler.d.ts.map +1 -1
  303. package/dist/src/runtime/executors/loaders/inventory-adjust-handler.js +2 -28
  304. package/dist/src/runtime/executors/loaders/inventory-adjust-handler.js.map +1 -1
  305. package/dist/src/runtime/executors/loaders/inventory-handler.d.ts +2 -1
  306. package/dist/src/runtime/executors/loaders/inventory-handler.d.ts.map +1 -1
  307. package/dist/src/runtime/executors/loaders/inventory-handler.js +8 -6
  308. package/dist/src/runtime/executors/loaders/inventory-handler.js.map +1 -1
  309. package/dist/src/runtime/executors/loaders/loader-handler-registry.d.ts.map +1 -1
  310. package/dist/src/runtime/executors/loaders/loader-handler-registry.js +117 -3
  311. package/dist/src/runtime/executors/loaders/loader-handler-registry.js.map +1 -1
  312. package/dist/src/runtime/executors/loaders/order-handler.d.ts +31 -3
  313. package/dist/src/runtime/executors/loaders/order-handler.d.ts.map +1 -1
  314. package/dist/src/runtime/executors/loaders/order-handler.js +194 -14
  315. package/dist/src/runtime/executors/loaders/order-handler.js.map +1 -1
  316. package/dist/src/runtime/executors/loaders/order-upsert-handler.d.ts +15 -0
  317. package/dist/src/runtime/executors/loaders/order-upsert-handler.d.ts.map +1 -0
  318. package/dist/src/runtime/executors/loaders/order-upsert-handler.js +89 -0
  319. package/dist/src/runtime/executors/loaders/order-upsert-handler.js.map +1 -0
  320. package/dist/src/runtime/executors/loaders/payment-method-handler.d.ts +11 -2
  321. package/dist/src/runtime/executors/loaders/payment-method-handler.d.ts.map +1 -1
  322. package/dist/src/runtime/executors/loaders/payment-method-handler.js +78 -33
  323. package/dist/src/runtime/executors/loaders/payment-method-handler.js.map +1 -1
  324. package/dist/src/runtime/executors/loaders/product-handler.d.ts +14 -0
  325. package/dist/src/runtime/executors/loaders/product-handler.d.ts.map +1 -1
  326. package/dist/src/runtime/executors/loaders/product-handler.js +91 -19
  327. package/dist/src/runtime/executors/loaders/product-handler.js.map +1 -1
  328. package/dist/src/runtime/executors/loaders/promotion-handler.d.ts +9 -2
  329. package/dist/src/runtime/executors/loaders/promotion-handler.d.ts.map +1 -1
  330. package/dist/src/runtime/executors/loaders/promotion-handler.js +115 -68
  331. package/dist/src/runtime/executors/loaders/promotion-handler.js.map +1 -1
  332. package/dist/src/runtime/executors/loaders/shared-lookups.d.ts +35 -1
  333. package/dist/src/runtime/executors/loaders/shared-lookups.d.ts.map +1 -1
  334. package/dist/src/runtime/executors/loaders/shared-lookups.js +102 -0
  335. package/dist/src/runtime/executors/loaders/shared-lookups.js.map +1 -1
  336. package/dist/src/runtime/executors/loaders/shipping-method-handler.d.ts +11 -6
  337. package/dist/src/runtime/executors/loaders/shipping-method-handler.d.ts.map +1 -1
  338. package/dist/src/runtime/executors/loaders/shipping-method-handler.js +168 -61
  339. package/dist/src/runtime/executors/loaders/shipping-method-handler.js.map +1 -1
  340. package/dist/src/runtime/executors/loaders/stock-location-handler.d.ts.map +1 -1
  341. package/dist/src/runtime/executors/loaders/stock-location-handler.js +2 -27
  342. package/dist/src/runtime/executors/loaders/stock-location-handler.js.map +1 -1
  343. package/dist/src/runtime/executors/loaders/variant-handler.d.ts.map +1 -1
  344. package/dist/src/runtime/executors/loaders/variant-handler.js +85 -12
  345. package/dist/src/runtime/executors/loaders/variant-handler.js.map +1 -1
  346. package/dist/src/runtime/executors/sink-handler-registry.d.ts +7 -11
  347. package/dist/src/runtime/executors/sink-handler-registry.d.ts.map +1 -1
  348. package/dist/src/runtime/executors/sink-handler-registry.js +374 -8
  349. package/dist/src/runtime/executors/sink-handler-registry.js.map +1 -1
  350. package/dist/src/runtime/executors/sink.executor.d.ts +1 -0
  351. package/dist/src/runtime/executors/sink.executor.d.ts.map +1 -1
  352. package/dist/src/runtime/executors/sink.executor.js +82 -12
  353. package/dist/src/runtime/executors/sink.executor.js.map +1 -1
  354. package/dist/src/runtime/executors/transform.executor.d.ts.map +1 -1
  355. package/dist/src/runtime/executors/transform.executor.js +31 -2
  356. package/dist/src/runtime/executors/transform.executor.js.map +1 -1
  357. package/dist/src/runtime/orchestration/graph-executor.d.ts.map +1 -1
  358. package/dist/src/runtime/orchestration/graph-executor.js +3 -2
  359. package/dist/src/runtime/orchestration/graph-executor.js.map +1 -1
  360. package/dist/src/runtime/orchestration/helpers.d.ts +4 -1
  361. package/dist/src/runtime/orchestration/helpers.d.ts.map +1 -1
  362. package/dist/src/runtime/orchestration/helpers.js +7 -2
  363. package/dist/src/runtime/orchestration/helpers.js.map +1 -1
  364. package/dist/src/runtime/orchestration/linear-executor.d.ts.map +1 -1
  365. package/dist/src/runtime/orchestration/linear-executor.js +3 -2
  366. package/dist/src/runtime/orchestration/linear-executor.js.map +1 -1
  367. package/dist/src/runtime/orchestration/replay-executor.d.ts.map +1 -1
  368. package/dist/src/runtime/orchestration/replay-executor.js +3 -2
  369. package/dist/src/runtime/orchestration/replay-executor.js.map +1 -1
  370. package/dist/src/runtime/orchestration/step-strategies/export-step.strategy.d.ts.map +1 -1
  371. package/dist/src/runtime/orchestration/step-strategies/export-step.strategy.js +12 -12
  372. package/dist/src/runtime/orchestration/step-strategies/export-step.strategy.js.map +1 -1
  373. package/dist/src/runtime/orchestration/step-strategies/feed-step.strategy.d.ts.map +1 -1
  374. package/dist/src/runtime/orchestration/step-strategies/feed-step.strategy.js +12 -12
  375. package/dist/src/runtime/orchestration/step-strategies/feed-step.strategy.js.map +1 -1
  376. package/dist/src/runtime/orchestration/step-strategies/load-step.strategy.js +2 -2
  377. package/dist/src/runtime/orchestration/step-strategies/load-step.strategy.js.map +1 -1
  378. package/dist/src/runtime/orchestration/step-strategies/sink-step.strategy.d.ts.map +1 -1
  379. package/dist/src/runtime/orchestration/step-strategies/sink-step.strategy.js +12 -12
  380. package/dist/src/runtime/orchestration/step-strategies/sink-step.strategy.js.map +1 -1
  381. package/dist/src/runtime/orchestration/step-strategies/step-dispatcher.d.ts.map +1 -1
  382. package/dist/src/runtime/orchestration/step-strategies/step-dispatcher.js +4 -3
  383. package/dist/src/runtime/orchestration/step-strategies/step-dispatcher.js.map +1 -1
  384. package/dist/src/runtime/orchestration/step-strategies/transform-step.strategy.js +4 -4
  385. package/dist/src/runtime/orchestration/step-strategies/transform-step.strategy.js.map +1 -1
  386. package/dist/src/runtime/orchestration/types.d.ts +1 -0
  387. package/dist/src/runtime/orchestration/types.d.ts.map +1 -1
  388. package/dist/src/runtime/utils.d.ts.map +1 -1
  389. package/dist/src/runtime/utils.js +8 -1
  390. package/dist/src/runtime/utils.js.map +1 -1
  391. package/dist/src/sdk/adapters/queue/index.d.ts +1 -0
  392. package/dist/src/sdk/adapters/queue/index.d.ts.map +1 -1
  393. package/dist/src/sdk/adapters/queue/index.js +1 -0
  394. package/dist/src/sdk/adapters/queue/index.js.map +1 -1
  395. package/dist/src/sdk/adapters/queue/internal.adapter.d.ts +32 -0
  396. package/dist/src/sdk/adapters/queue/internal.adapter.d.ts.map +1 -0
  397. package/dist/src/sdk/adapters/queue/internal.adapter.js +68 -0
  398. package/dist/src/sdk/adapters/queue/internal.adapter.js.map +1 -0
  399. package/dist/src/sdk/adapters/queue/queue-adapter.registry.d.ts.map +1 -1
  400. package/dist/src/sdk/adapters/queue/queue-adapter.registry.js +3 -0
  401. package/dist/src/sdk/adapters/queue/queue-adapter.registry.js.map +1 -1
  402. package/dist/src/sdk/adapters/queue/rabbitmq.adapter.d.ts.map +1 -1
  403. package/dist/src/sdk/adapters/queue/rabbitmq.adapter.js +2 -1
  404. package/dist/src/sdk/adapters/queue/rabbitmq.adapter.js.map +1 -1
  405. package/dist/src/sdk/constants.d.ts +2 -2
  406. package/dist/src/sdk/constants.d.ts.map +1 -1
  407. package/dist/src/sdk/dsl/pipeline-builder.d.ts +8 -2
  408. package/dist/src/sdk/dsl/pipeline-builder.d.ts.map +1 -1
  409. package/dist/src/sdk/dsl/pipeline-builder.js +115 -19
  410. package/dist/src/sdk/dsl/pipeline-builder.js.map +1 -1
  411. package/dist/src/sdk/dsl/step-configs.d.ts +73 -7
  412. package/dist/src/sdk/dsl/step-configs.d.ts.map +1 -1
  413. package/dist/src/services/events/consumer-discovery.d.ts.map +1 -1
  414. package/dist/src/services/events/consumer-discovery.js +13 -11
  415. package/dist/src/services/events/consumer-discovery.js.map +1 -1
  416. package/dist/src/services/events/consumer-lifecycle.d.ts.map +1 -1
  417. package/dist/src/services/events/consumer-lifecycle.js +19 -15
  418. package/dist/src/services/events/consumer-lifecycle.js.map +1 -1
  419. package/dist/src/services/events/event-trigger.service.d.ts.map +1 -1
  420. package/dist/src/services/events/event-trigger.service.js +8 -3
  421. package/dist/src/services/events/event-trigger.service.js.map +1 -1
  422. package/dist/src/services/events/hook.service.d.ts.map +1 -1
  423. package/dist/src/services/events/hook.service.js +7 -3
  424. package/dist/src/services/events/hook.service.js.map +1 -1
  425. package/dist/src/services/events/message-processing.d.ts.map +1 -1
  426. package/dist/src/services/events/message-processing.js +13 -8
  427. package/dist/src/services/events/message-processing.js.map +1 -1
  428. package/dist/src/services/logger/datahub-logger.d.ts +7 -0
  429. package/dist/src/services/logger/datahub-logger.d.ts.map +1 -1
  430. package/dist/src/services/logger/datahub-logger.js +9 -0
  431. package/dist/src/services/logger/datahub-logger.js.map +1 -1
  432. package/dist/src/services/pipeline/pipeline-runner.service.d.ts +3 -1
  433. package/dist/src/services/pipeline/pipeline-runner.service.d.ts.map +1 -1
  434. package/dist/src/services/pipeline/pipeline-runner.service.js +14 -4
  435. package/dist/src/services/pipeline/pipeline-runner.service.js.map +1 -1
  436. package/dist/src/services/pipeline/pipeline.service.d.ts.map +1 -1
  437. package/dist/src/services/pipeline/pipeline.service.js +8 -2
  438. package/dist/src/services/pipeline/pipeline.service.js.map +1 -1
  439. package/dist/src/services/storage/retention.service.d.ts.map +1 -1
  440. package/dist/src/services/storage/retention.service.js +22 -0
  441. package/dist/src/services/storage/retention.service.js.map +1 -1
  442. package/dist/src/services/testing/step-test.service.d.ts.map +1 -1
  443. package/dist/src/services/testing/step-test.service.js +17 -1
  444. package/dist/src/services/testing/step-test.service.js.map +1 -1
  445. package/dist/src/services/validation/definition-validation.service.d.ts.map +1 -1
  446. package/dist/src/services/validation/definition-validation.service.js +4 -1
  447. package/dist/src/services/validation/definition-validation.service.js.map +1 -1
  448. package/dist/src/services/validation/trigger-validation.d.ts.map +1 -1
  449. package/dist/src/services/validation/trigger-validation.js +79 -12
  450. package/dist/src/services/validation/trigger-validation.js.map +1 -1
  451. package/dist/src/types/index.d.ts +1 -0
  452. package/dist/src/types/index.d.ts.map +1 -1
  453. package/dist/src/types/index.js.map +1 -1
  454. package/dist/src/types/loader-configs.d.ts +1071 -0
  455. package/dist/src/types/loader-configs.d.ts.map +1 -0
  456. package/dist/src/types/loader-configs.js +54 -0
  457. package/dist/src/types/loader-configs.js.map +1 -0
  458. package/dist/src/types/step-configs.d.ts +14 -5
  459. package/dist/src/types/step-configs.d.ts.map +1 -1
  460. package/dist/src/types/step-configs.js +3 -0
  461. package/dist/src/types/step-configs.js.map +1 -1
  462. package/dist/src/utils/code-security.utils.d.ts +18 -0
  463. package/dist/src/utils/code-security.utils.d.ts.map +1 -1
  464. package/dist/src/utils/code-security.utils.js +125 -9
  465. package/dist/src/utils/code-security.utils.js.map +1 -1
  466. package/dist/src/validation/pipeline-definition.validator.js +2 -1
  467. package/dist/src/validation/pipeline-definition.validator.js.map +1 -1
  468. package/docs/developer-guide/README.md +2 -0
  469. package/docs/developer-guide/dsl/pipeline-builder.md +12 -0
  470. package/docs/developer-guide/extending/README.md +230 -10
  471. package/docs/developer-guide/extending/custom-sinks.md +87 -0
  472. package/docs/developer-guide/extending/events.md +4 -1
  473. package/docs/examples/validation-error-messages.md +246 -0
  474. package/docs/guides/multi-channel.md +1190 -0
  475. package/docs/guides/multi-currency.md +881 -0
  476. package/docs/guides/multi-entity.md +597 -0
  477. package/docs/guides/multi-language.md +957 -0
  478. package/docs/reference/README.md +11 -4
  479. package/docs/reference/extractors.md +30 -0
  480. package/docs/reference/loaders.md +359 -21
  481. package/docs/reference/operators-complete.md +1251 -0
  482. package/docs/reference/operators.md +36 -2
  483. package/docs/reference/sinks.md +7 -6
  484. package/docs/reference/step-types.md +12 -5
  485. package/docs/user-guide/pipelines.md +82 -13
  486. package/package.json +1 -1
  487. package/shared/types/adapter-config.types.ts +162 -2
  488. package/shared/types/index.ts +12 -0
  489. package/shared/types/loader.types.ts +4 -0
  490. package/shared/types/step.types.ts +6 -0
  491. package/shared/types/trigger.types.ts +0 -4
package/CHANGELOG.md CHANGED
@@ -2,6 +2,50 @@
2
2
 
3
3
  All notable changes to the Data Hub Plugin are documented here.
4
4
 
5
+ ## [0.1.5] - 2026-03-05
6
+
7
+ ### Added
8
+ - **Operation-aware sink CRUD**: Sink executor partitions records by `__operation` field (UPSERT/DELETE) and dispatches to appropriate handlers. Delete handlers for all 7 sink engines: MeiliSearch, Elasticsearch, OpenSearch, Algolia, Typesense, Webhook, Queue Producer
9
+ - **Event trigger operation injection**: Vendure entity events (ProductEvent, OrderEvent, etc.) now inject `__operation` (CREATE/UPDATE/DELETE) into seed records, enabling operation-aware pipelines
10
+ - **BEFORE_SINK / AFTER_SINK hooks**: Sink step strategy now supports record-modifying interceptor hooks before and after search index operations
11
+ - **5 hook demo pipelines**: Interceptor demo, Script demo (DI closure), Search enrichment (BEFORE_SINK), Multi-hook chain (proves modifications flow through all stages), All-stages demo (hooks at every step boundary)
12
+ - **Hook stage metadata**: Extended hook stage constants with sink-specific stages and error handling stages
13
+ - **117 e2e test implementations** across 14 loader test files: customer addresses (5 modes), product facet values (4 modes), product assets (4 modes + featured), variant modes (facets/assets/options), order lines (4 modes), collection modes (assets + filters), promotion modes (conditions + actions) — all using shared test helpers
14
+ - **All 257 e2e tests passing** (was 204/259 in v0.1.4)
15
+
16
+ ### Fixed
17
+ - Shared-helpers `updateViaService()` for ProductVariantService array signature
18
+ - Product variant loader `updateEntity()` uses translations array correctly
19
+ - Security and operator tests: query vs mutation, uppercase adapter types
20
+ - Pipeline execution + error recovery tests: isolated `beforeAll`/`afterAll` per block
21
+ - Variant/collection/promotion mode tests: use correct loader classes (not raw handlers)
22
+ - Customer address handler: UPDATE_BY_ID falls back to APPEND_ONLY correctly
23
+ - Order lines: customer setup + linesMode propagation
24
+ - 14 unused imports removed, `let` → `const` fixes, lint-clean codebase
25
+
26
+ ### Changed
27
+ - **DRY feed generators**: Extracted `buildBaseFeedItem()` shared across Google/Facebook generators, `flattenTranslationFields()` + `isJsonPrimitive()` in vendure-query helpers, `MAX_SERIALIZATION_DEPTH` constant
28
+
29
+ ## [0.1.4] - 2026-03-03
30
+
31
+ ### Added
32
+ - **ROUTE step** with condition-based branching: per-branch condition editors using 19 comparison operators (eq, ne, gt, gte, lt, lte, in, notIn, contains, notContains, startsWith, endsWith, regex, exists, notExists, isNull, isEmpty, isNotEmpty, matches)
33
+ - **dependencyOnly edge type** for graph execution: edges that enforce ordering without passing data
34
+ - **Internal queue adapter** for testing sink/message pipelines without external infrastructure
35
+ - **Stale run cleanup**: runs exceeding 1 hour automatically transition to TIMEOUT status
36
+ - **Webhook HMAC-SHA256 signing** for sink webhook deliveries
37
+ - **Export file registration** in REST API: exported files accessible via `/data-hub/files/:id`
38
+ - **Per-branch condition editors** in dashboard route step configuration
39
+ - **Resizable Configure Node panel** in workflow graph editor
40
+ - **45 example pipelines** (previously 28) covering all step types, operators, and adapter combinations
41
+
42
+ ### Fixed
43
+ - 9 critical runtime bugs: feed executor batch accumulation, gate timeout scheduling, slugify regex metacharacter injection, dot-notation field access in nested objects, trigger validation for FILE/MESSAGE types, event subscription field name mismatch, schedule activation field propagation, export format selection, and sink error serialization
44
+ - Order import no longer produces NaN on completed orders with calculated totals
45
+ - Trigger validation is now case-insensitive for trigger type matching
46
+ - Webhook authentication errors now return 401 (was 500) for invalid credentials
47
+ - Meilisearch sink correctly indexes both EN and DE translations
48
+
5
49
  ## [0.1.3] - 2026-02-26
6
50
 
7
51
  ### Added
@@ -167,7 +211,7 @@ Initial production release of the Data Hub Plugin for Vendure.
167
211
  - **Typesense** - Open-source search engine
168
212
  - **Queue Producer** - RabbitMQ/Redis Streams/SQS message publishing
169
213
  - **Webhook** - HTTP POST to external services
170
- - **PDF Generator** - Generate PDF documents from templates
214
+ - **OpenSearch** - Open-source search and analytics engine
171
215
 
172
216
  ### Advanced Features
173
217
 
@@ -451,4 +495,5 @@ Pre-built integration for Pimcore PIM/DAM → Vendure sync:
451
495
 
452
496
  ## Version History
453
497
 
498
+ - **0.1.5** (2026-03-05) - Operation-aware sink CRUD, hook demos, 257 e2e tests passing
454
499
  - **0.1.0** (2026-02-24) - Initial production release
package/README.md CHANGED
@@ -37,18 +37,19 @@ A full-featured ETL (Extract, Transform, Load) plugin for [Vendure](https://www.
37
37
  - **Visual Pipeline Builder** - Drag-and-drop workflow editor with live validation
38
38
  - **Code-First DSL** - TypeScript API for defining pipelines programmatically
39
39
  - **9 Data Extractors** - HTTP/REST API, GraphQL, Vendure Query, File (CSV/JSON/XML/XLSX/NDJSON/TSV), Database (SQL), S3, FTP/SFTP, Webhook, CDC (Change Data Capture)
40
- - **22 Entity Loaders (16 entity types with multiple operations)** - Products, Variants, Customers, Customer Groups, Collections, Facets, Facet Values, Promotions, Orders (notes, transitions, coupons), Shipping Methods, Stock Locations, Stock/Inventory, Assets, Tax Rates, Payment Methods, Channels, REST POST, GraphQL Mutation
40
+ - **24 Entity Loaders (16 entity types, 4 order operations, 1 deletion, 2 external API, 1 inventory)** - Products, Variants, Customers, Customer Groups, Collections, Facets, Facet Values, Promotions, Orders (upsert, notes, transitions, coupons), Shipping Methods, Stock Locations, Stock/Inventory, Assets, Tax Rates, Payment Methods, Channels, Entity Deletion, REST POST, GraphQL Mutation
41
41
  - **61 Transform Operators** - String (12), Date (5), Numeric (9), Logic (4), JSON (4), Data (8), Enrichment (5), Aggregation (8), Validation (2), Script (1), File (3) - **includes HTTP Lookup with caching, circuit breaker, and rate limiting**
42
42
  - **4 Feed Generators** - Google Merchant Center, Meta/Facebook Catalog, Amazon Seller Central, Custom Feed (CSV/JSON/XML/TSV)
43
- - **7 Search & Integration Sinks** - Elasticsearch, OpenSearch, MeiliSearch, Algolia, Typesense, Queue Producer (RabbitMQ/SQS/Redis), Webhook
43
+ - **7 Search & Integration Sinks** - Elasticsearch, OpenSearch, MeiliSearch, Algolia, Typesense, Queue Producer (RabbitMQ/SQS/Redis), Webhook (with HMAC signing)
44
44
  - **24 Hook Stages** (18 for step types and 6 global) - Interceptors and scripts to modify data at any pipeline stage
45
45
  - **7 Connection Types** - HTTP/REST, S3, FTP, SFTP, Database (PostgreSQL/MySQL/SQLite/MSSQL/Oracle), Message Queue (RabbitMQ/SQS/Redis), Custom
46
46
  - **6 Trigger Types** - Manual, Scheduled (cron), Webhook, Vendure Events, File Watch, **Message Queue Consumer**
47
- - **Bi-directional Queue Support** - Consume from and produce to RabbitMQ (AMQP), Amazon SQS, Redis Streams
47
+ - **Bi-directional Queue Support** - Consume from and produce to RabbitMQ (AMQP), Amazon SQS, Redis Streams, and internal queue adapter
48
48
  - **Horizontal Scaling** - Distributed locks via Redis or PostgreSQL for multi-instance deployments
49
49
  - **Checkpoint Recovery** - Resume failed pipelines from last successful record
50
50
  - **File Upload** - Drag-and-drop CSV/JSON file upload with automatic processing
51
51
  - **Real-time Monitoring** - Logs, analytics, error tracking, and dead letter queue
52
+ - **Nested Entity Modes** - Configurable behavior for all nested entities (addresses, facet values, order lines, assets, etc.) to prevent duplicates and provide full control over data management
52
53
 
53
54
  ## Screenshots
54
55
 
@@ -339,7 +340,7 @@ Math operations: `add`, `subtract`, `multiply`, `divide`, `modulo`, `power`, `ro
339
340
  | `ifThenElse` | Conditional value | `{ op: 'ifThenElse', args: { condition: { field: 'type', cmp: 'eq', value: 'digital' }, thenValue: true, elseValue: false, target: 'isDigital' } }` |
340
341
  | `switch` | Multi-case mapping | `{ op: 'switch', args: { source: 'code', cases: [{ value: 'A', result: 'Active' }], default: 'Unknown', target: 'status' } }` |
341
342
 
342
- Comparison operators: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `contains`, `notContains`, `startsWith`, `endsWith`, `regex`, `exists`, `isNull`
343
+ Comparison operators (19): `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `contains`, `notContains`, `startsWith`, `endsWith`, `regex`, `exists`, `notExists`, `isNull`, `isEmpty`, `isNotEmpty`, `matches` (glob)
343
344
 
344
345
  ### Validation Operators
345
346
 
@@ -437,6 +438,7 @@ Execute custom JavaScript for complex transformations:
437
438
  | Customer Group Loader | `customerGroupUpsert` | Create/update customer groups by name; assign customers by email |
438
439
  | Collection Loader | `collectionUpsert` | Create/update collections with parent relationships |
439
440
  | Promotion Loader | `promotionUpsert` | Create/update promotions with conditions and actions |
441
+ | Order Upsert Loader | `orderUpsert` | Order create/update for migrations with state transitions and line management |
440
442
  | Order Note Loader | `orderNote` | Attach notes to orders by code or id |
441
443
  | Order Transition Loader | `orderTransition` | Transition orders to new states |
442
444
  | Stock Adjust Loader | `stockAdjust` | Adjust inventory levels by SKU and stock location map |
@@ -450,6 +452,7 @@ Execute custom JavaScript for complex transformations:
450
452
  | Stock Location Loader | `stockLocationUpsert` | Create/update stock locations and warehouses |
451
453
  | Facet Loader | `facetUpsert` | Create/update facets with translations |
452
454
  | Facet Value Loader | `facetValueUpsert` | Create/update facet values with translations |
455
+ | Entity Deletion Loader | `entityDeletion` | Soft-delete any of 13 entity types (Products, Variants, Collections, Facets, FacetValues, Customers, CustomerGroups, Promotions, ShippingMethods, PaymentMethods, TaxRates, Assets, StockLocations) by slug, SKU, ID, code, email, or name |
453
456
  | GraphQL Mutation Loader | `graphqlMutation` | Execute arbitrary GraphQL mutations against Vendure |
454
457
  | Asset Import Loader | `assetImport` | Import assets from URLs or file paths |
455
458
  | REST POST Loader | `restPost` | POST/PUT records to external REST endpoints |
@@ -506,25 +509,41 @@ Execute custom JavaScript for complex transformations:
506
509
  })
507
510
  ```
508
511
 
512
+ ### Condition-Based Routing (ROUTE Step)
513
+
514
+ Route records to different branches based on field conditions using 19 comparison operators. Supports AND logic (multiple conditions per branch), automatic `default` branch for unmatched records, and `dependencyOnly` edges for execution ordering without data flow.
515
+
516
+ ```typescript
517
+ .route('split-by-type', {
518
+ branches: [
519
+ { name: 'physical', when: [{ field: 'type', cmp: 'eq', value: 'physical' }] },
520
+ { name: 'digital', when: [{ field: 'type', cmp: 'eq', value: 'digital' }] },
521
+ ],
522
+ })
523
+ ```
524
+
509
525
  ---
510
526
 
511
527
  ## Hooks
512
528
 
513
- Hooks let you run code at 18 different pipeline stages. Two types:
529
+ Hooks let you run code at 24 different pipeline stages (18 step-level + 6 global). Two types:
514
530
  - **Interceptors**: Modify the record array (return modified records)
515
531
  - **Observation hooks**: Side effects only (webhooks, events, logging)
516
532
 
517
533
  ### Hook Stages
518
534
 
519
- **Data Processing:**
535
+ **Data Processing (18 step-level):**
520
536
  - `BEFORE_EXTRACT`, `AFTER_EXTRACT`
521
537
  - `BEFORE_TRANSFORM`, `AFTER_TRANSFORM`
522
538
  - `BEFORE_VALIDATE`, `AFTER_VALIDATE`
523
539
  - `BEFORE_ENRICH`, `AFTER_ENRICH`
524
540
  - `BEFORE_ROUTE`, `AFTER_ROUTE`
525
541
  - `BEFORE_LOAD`, `AFTER_LOAD`
542
+ - `BEFORE_EXPORT`, `AFTER_EXPORT`
543
+ - `BEFORE_FEED`, `AFTER_FEED`
544
+ - `BEFORE_SINK`, `AFTER_SINK`
526
545
 
527
- **Pipeline Lifecycle:**
546
+ **Pipeline Lifecycle (6 global):**
528
547
  - `PIPELINE_STARTED`, `PIPELINE_COMPLETED`, `PIPELINE_FAILED`
529
548
  - `ON_ERROR`, `ON_RETRY`, `ON_DEAD_LETTER`
530
549
 
@@ -850,6 +869,8 @@ The plugin includes a full-featured admin dashboard:
850
869
  - **Visual Mode**: Drag-and-drop workflow builder with node palette
851
870
  - Live validation with error highlighting
852
871
  - Step tester for testing individual steps
872
+ - `dependencyOnly` edges for execution ordering without data flow in graph mode
873
+ - Stale run cleanup with automatic TIMEOUT status for stuck pipeline runs
853
874
 
854
875
  ### Dry Run
855
876
  - Execute pipeline without persisting changes
@@ -862,6 +883,7 @@ The plugin includes a full-featured admin dashboard:
862
883
  - Analytics dashboard with metrics
863
884
  - Per-pipeline health stats
864
885
  - Error rate tracking
886
+ - `completedAt` and `errorMessage` fields on pipeline runs for precise tracking
865
887
 
866
888
  ### Queue Management
867
889
  - View pending, running, and failed jobs
@@ -890,7 +912,7 @@ DataHubPlugin.init({
890
912
 
891
913
  ### Code-First Connections
892
914
 
893
- Supported connection types: `http`, `postgres`, `mysql`, `s3`, `ftp`, `sftp`
915
+ Supported connection types: `http`, `postgres`, `mysql`, `s3`, `ftp`, `sftp`, `rabbitmq`, `custom`
894
916
 
895
917
  ```typescript
896
918
  DataHubPlugin.init({
@@ -8,6 +8,7 @@ import {
8
8
  AlertTriangle,
9
9
  Zap,
10
10
  Bell,
11
+ Webhook,
11
12
  } from 'lucide-react';
12
13
  import { TriggersPanel } from '../shared/triggers-panel';
13
14
  import { StepConfigPanel } from '../shared/step-config';
@@ -19,9 +20,10 @@ import {
19
20
  PIPELINE_EDITOR_PANEL,
20
21
  DEFAULT_STEP_CONFIGS,
21
22
  } from '../../constants';
22
- import { useStepConfigs, useTriggerTypes } from '../../hooks';
23
+ import { useStepConfigs, useTriggerTypes, useHookStages, useHookStageCategories } from '../../hooks';
23
24
  import type { MoveDirection, PipelineEditorPanel } from '../../constants';
24
25
  import { useAdapterCatalog } from '../../hooks';
26
+ import { FALLBACK_STAGE_CATEGORIES } from '../../constants';
25
27
  import type {
26
28
  StepType,
27
29
  PipelineStepDefinition,
@@ -29,7 +31,7 @@ import type {
29
31
  PipelineEditorProps,
30
32
  JsonObject,
31
33
  } from '../../types';
32
- import { getCombinedTriggers, updateDefinitionWithTriggers } from '../../utils';
34
+ import { getCombinedTriggers, updateDefinitionWithTriggers, resolveIconName } from '../../utils';
33
35
 
34
36
  const ADDABLE_STEP_TYPES = Object.keys(DEFAULT_STEP_CONFIGS).filter(
35
37
  t => t !== STEP_TYPE.ROUTE && t !== STEP_TYPE.GATE
@@ -157,10 +159,21 @@ export function PipelineEditor({ definition, onChange, issues = [] }: PipelineEd
157
159
  // Get combined triggers from both steps and triggers array
158
160
  const combinedTriggers = useMemo(() => getCombinedTriggers(definition), [definition]);
159
161
 
162
+ // Hook stage metadata
163
+ const { hookStages: backendStages } = useHookStages();
164
+ const { categories: backendCategories } = useHookStageCategories();
165
+ const stageCategories = useMemo(
166
+ () => backendCategories.length > 0 ? backendCategories : FALLBACK_STAGE_CATEGORIES,
167
+ [backendCategories],
168
+ );
169
+ const hooks = definition.hooks ?? {};
170
+ const hookCount = useMemo(() => Object.values(hooks).reduce((sum, arr) => sum + (Array.isArray(arr) ? arr.length : 0), 0), [hooks]);
171
+
160
172
  // Panel switch handlers
161
173
  const handleSwitchToSteps = useCallback(() => setActivePanel(PIPELINE_EDITOR_PANEL.STEPS), []);
162
174
  const handleSwitchToTriggers = useCallback(() => setActivePanel(PIPELINE_EDITOR_PANEL.TRIGGERS), []);
163
175
  const handleSwitchToSettings = useCallback(() => setActivePanel(PIPELINE_EDITOR_PANEL.SETTINGS), []);
176
+ const handleSwitchToHooks = useCallback(() => setActivePanel(PIPELINE_EDITOR_PANEL.HOOKS), []);
164
177
 
165
178
  // Settings change handler
166
179
  const handleContextChange = useCallback((context: JsonObject) => {
@@ -192,7 +205,8 @@ export function PipelineEditor({ definition, onChange, issues = [] }: PipelineEd
192
205
  ...selectedStep,
193
206
  key: updated.key,
194
207
  type: updated.type as StepType,
195
- config: { ...updated.config, adapterCode: updated.adapterCode },
208
+ adapterCode: updated.adapterCode || selectedStep.adapterCode,
209
+ config: updated.config,
196
210
  });
197
211
  }, [selectedStepIndex, selectedStep, updateStep]);
198
212
 
@@ -249,6 +263,25 @@ export function PipelineEditor({ definition, onChange, issues = [] }: PipelineEd
249
263
  <Settings className="h-3 w-3 inline mr-1" />
250
264
  Settings
251
265
  </button>
266
+ <button
267
+ type="button"
268
+ role="tab"
269
+ aria-selected={activePanel === PIPELINE_EDITOR_PANEL.HOOKS}
270
+ aria-controls="panel-hooks"
271
+ className={`flex-1 px-3 py-2 text-xs font-medium transition-colors ${
272
+ activePanel === PIPELINE_EDITOR_PANEL.HOOKS
273
+ ? 'bg-primary/10 text-primary border-b-2 border-primary'
274
+ : 'text-muted-foreground hover:bg-muted'
275
+ }`}
276
+ onClick={handleSwitchToHooks}
277
+ data-testid="datahub-editor-tab-hooks"
278
+ >
279
+ <Webhook className="h-3 w-3 inline mr-1" />
280
+ Hooks
281
+ {hookCount > 0 && (
282
+ <span className="ml-1 px-1 py-0.5 text-[10px] rounded-full bg-primary/20 text-primary">{hookCount}</span>
283
+ )}
284
+ </button>
252
285
  </div>
253
286
  </div>
254
287
 
@@ -309,6 +342,58 @@ export function PipelineEditor({ definition, onChange, issues = [] }: PipelineEd
309
342
  onChange={handleContextChange}
310
343
  />
311
344
  )}
345
+
346
+ {activePanel === PIPELINE_EDITOR_PANEL.HOOKS && (
347
+ <div className="flex-1 overflow-auto">
348
+ <div className="p-3 border-b bg-muted/50">
349
+ <h3 className="font-semibold text-sm">Pipeline Hooks</h3>
350
+ <p className="text-xs text-muted-foreground">
351
+ {hookCount > 0 ? `${hookCount} hook${hookCount === 1 ? '' : 's'} configured (read-only)` : 'No hooks configured'}
352
+ </p>
353
+ </div>
354
+ <div className="p-2 space-y-3">
355
+ {stageCategories.map(cat => {
356
+ const catStages = backendStages.filter(s => s.category === cat.key);
357
+ const configuredStages = catStages.filter(s => {
358
+ const stageHooks = (hooks as Record<string, unknown[]>)[s.key];
359
+ return Array.isArray(stageHooks) && stageHooks.length > 0;
360
+ });
361
+ if (configuredStages.length === 0) return null;
362
+ return (
363
+ <div key={cat.key}>
364
+ <div className="flex items-center gap-1.5 mb-1.5 px-1">
365
+ <span className={`text-[10px] px-1.5 py-0.5 rounded-full font-medium ${cat.color}`}>
366
+ {cat.label}
367
+ </span>
368
+ </div>
369
+ <div className="space-y-1">
370
+ {configuredStages.map(stage => {
371
+ const stageHooks = (hooks as Record<string, unknown[]>)[stage.key] ?? [];
372
+ const StageIcon = resolveIconName(stage.icon) ?? Zap;
373
+ return (
374
+ <div key={stage.key} className="px-2 py-1.5 rounded bg-muted/50 border text-xs">
375
+ <div className="flex items-center gap-1.5 font-medium">
376
+ <StageIcon className="h-3 w-3 text-muted-foreground" />
377
+ {stage.label}
378
+ <span className="text-muted-foreground">({stageHooks.length})</span>
379
+ </div>
380
+ </div>
381
+ );
382
+ })}
383
+ </div>
384
+ </div>
385
+ );
386
+ })}
387
+ {hookCount === 0 && (
388
+ <div className="p-4 text-center text-muted-foreground text-xs">
389
+ <Webhook className="h-6 w-6 mx-auto mb-2 opacity-30" />
390
+ <p>No hooks configured.</p>
391
+ <p className="mt-1">Hooks are defined in code via the pipeline builder DSL.</p>
392
+ </div>
393
+ )}
394
+ </div>
395
+ </div>
396
+ )}
312
397
  </div>
313
398
 
314
399
  <div className="flex-1 overflow-auto">
@@ -319,7 +404,7 @@ export function PipelineEditor({ definition, onChange, issues = [] }: PipelineEd
319
404
  key: selectedStep.key,
320
405
  type: selectedStep.type,
321
406
  config: selectedStep.config ?? {},
322
- adapterCode: selectedStep.config?.adapterCode as string | undefined,
407
+ adapterCode: selectedStep.adapterCode ?? selectedStep.config?.adapterCode as string | undefined,
323
408
  }}
324
409
  onChange={handleSelectedStepChange}
325
410
  catalog={adapters}
@@ -369,7 +454,7 @@ export function PipelineEditor({ definition, onChange, issues = [] }: PipelineEd
369
454
  )}
370
455
  </div>
371
456
  </div>
372
- ) : (
457
+ ) : activePanel === PIPELINE_EDITOR_PANEL.SETTINGS ? (
373
458
  <div className="p-6">
374
459
  <h3 className="font-semibold mb-4">Pipeline Settings</h3>
375
460
  <p className="text-sm text-muted-foreground">
@@ -406,6 +491,75 @@ export function PipelineEditor({ definition, onChange, issues = [] }: PipelineEd
406
491
  </div>
407
492
  </div>
408
493
  </div>
494
+ ) : (
495
+ <div className="p-6">
496
+ <div className="flex items-center gap-2 mb-4">
497
+ <Webhook className="h-5 w-5 text-primary" />
498
+ <h3 className="font-semibold">Pipeline Hooks</h3>
499
+ <span className="text-xs text-muted-foreground">(read-only)</span>
500
+ </div>
501
+ <p className="text-sm text-muted-foreground mb-4">
502
+ Hooks run custom code at specific points during pipeline execution.
503
+ They are defined in code via the pipeline builder DSL.
504
+ </p>
505
+ {hookCount > 0 ? (
506
+ <div className="space-y-4">
507
+ {stageCategories.map(cat => {
508
+ const catStages = backendStages.filter(s => s.category === cat.key);
509
+ const configuredStages = catStages.filter(s => {
510
+ const stageHooks = (hooks as Record<string, unknown[]>)[s.key];
511
+ return Array.isArray(stageHooks) && stageHooks.length > 0;
512
+ });
513
+ if (configuredStages.length === 0) return null;
514
+ return (
515
+ <div key={cat.key}>
516
+ <div className="flex items-center gap-2 mb-2">
517
+ <span className={`text-xs px-2 py-0.5 rounded-full font-medium ${cat.color}`}>
518
+ {cat.label}
519
+ </span>
520
+ <span className="text-xs text-muted-foreground">{cat.description}</span>
521
+ </div>
522
+ <div className="space-y-2">
523
+ {configuredStages.map(stage => {
524
+ const stageHooks = (hooks as Record<string, Array<Record<string, unknown>>>)[stage.key] ?? [];
525
+ const StageIcon = resolveIconName(stage.icon) ?? Zap;
526
+ return (
527
+ <div key={stage.key} className="p-3 rounded-lg border bg-muted/30">
528
+ <div className="flex items-center gap-2 mb-2">
529
+ <StageIcon className="h-4 w-4 text-primary" />
530
+ <span className="text-sm font-medium">{stage.label}</span>
531
+ </div>
532
+ <p className="text-xs text-muted-foreground mb-2">{stage.description}</p>
533
+ <div className="space-y-1">
534
+ {stageHooks.map((hook, i) => (
535
+ <div key={i} className="flex items-center gap-2 text-xs px-2 py-1 rounded bg-background border">
536
+ <span className="px-1.5 py-0.5 rounded bg-primary/10 text-primary font-mono">
537
+ {String(hook.type || 'UNKNOWN')}
538
+ </span>
539
+ <span className="text-muted-foreground truncate">
540
+ {String(hook.name || hook.scriptName || hook.event || hook.message || '')}
541
+ </span>
542
+ </div>
543
+ ))}
544
+ </div>
545
+ </div>
546
+ );
547
+ })}
548
+ </div>
549
+ </div>
550
+ );
551
+ })}
552
+ </div>
553
+ ) : (
554
+ <div className="flex flex-col items-center justify-center py-12 text-muted-foreground">
555
+ <Webhook className="h-12 w-12 mb-4 opacity-20" />
556
+ <p className="text-sm font-medium">No hooks configured</p>
557
+ <p className="text-xs mt-1 text-center max-w-xs">
558
+ Add hooks via the pipeline builder DSL using <code className="px-1 py-0.5 bg-muted rounded text-xs">.hooks()</code>
559
+ </p>
560
+ </div>
561
+ )}
562
+ </div>
409
563
  )}
410
564
  </div>
411
565
  </div>
@@ -156,7 +156,7 @@ export function ReactFlowPipelineEditor({
156
156
  label,
157
157
  type: category,
158
158
  adapterCode: nodeType,
159
- config: { adapterCode: nodeType },
159
+ config: {},
160
160
  },
161
161
  };
162
162
 
@@ -194,7 +194,7 @@ export function ReactFlowPipelineEditor({
194
194
  label,
195
195
  type: category,
196
196
  adapterCode: nodeType,
197
- config: { adapterCode: nodeType },
197
+ config: {},
198
198
  },
199
199
  };
200
200
 
@@ -487,7 +487,7 @@ function NodePaletteDynamic({ adapters, onDragStart, onAddNode }: { adapters: Ad
487
487
  const items = adapters.filter(a => a.type === adapterType);
488
488
  return {
489
489
  key: category,
490
- label: config.label === 'Source' ? 'Data Sources' : `${config.label}s`,
490
+ label: config.label === 'Source' ? 'Data Sources' : config.label === 'Enrich' ? 'Enrichment' : `${config.label}s`,
491
491
  items,
492
492
  category,
493
493
  icon: config.icon,
@@ -16,6 +16,9 @@ import { useAdapterCatalog, AdapterMetadata } from '../../../hooks';
16
16
  import { StepConfigPanel, StepConfigData, OperatorCheatSheetButton } from '../../shared/step-config';
17
17
  import { PANEL_WIDTHS, SCROLL_HEIGHTS } from '../../../constants';
18
18
 
19
+ /** Minimum panel width (pixels) when resizing */
20
+ const MIN_PANEL_WIDTH = parseInt(PANEL_WIDTHS.PROPERTIES_MIN, 10) || 380;
21
+
19
22
  export interface NodePropertiesPanelProps {
20
23
  node: Node<PipelineNodeData> | null;
21
24
  onUpdate: (node: Node<PipelineNodeData>) => void;
@@ -48,6 +51,31 @@ function NodePropertiesPanelComponent({
48
51
  const connectionCodes = externalConnectionCodes ?? hookResult.connectionCodes;
49
52
  const secretOptions = externalSecretOptions ?? hookResult.secretOptions;
50
53
 
54
+ // Resizable panel width
55
+ const defaultWidth = parseInt(panelWidth, 10) || 520;
56
+ const [width, setWidth] = React.useState(defaultWidth);
57
+ const dragging = React.useRef(false);
58
+
59
+ const onResizeStart = useCallback((e: React.MouseEvent) => {
60
+ e.preventDefault();
61
+ dragging.current = true;
62
+ const startX = e.clientX;
63
+ const startW = width;
64
+ const onMove = (ev: MouseEvent) => {
65
+ if (!dragging.current) return;
66
+ // Panel opens from right — dragging left increases width
67
+ const delta = startX - ev.clientX;
68
+ setWidth(Math.max(MIN_PANEL_WIDTH, Math.min(window.innerWidth * 0.9, startW + delta)));
69
+ };
70
+ const onUp = () => {
71
+ dragging.current = false;
72
+ document.removeEventListener('mousemove', onMove);
73
+ document.removeEventListener('mouseup', onUp);
74
+ };
75
+ document.addEventListener('mousemove', onMove);
76
+ document.addEventListener('mouseup', onUp);
77
+ }, [width]);
78
+
51
79
  const data = node?.data;
52
80
 
53
81
  const selectedAdapter = useMemo(
@@ -73,8 +101,8 @@ function NodePropertiesPanelComponent({
73
101
  ...data,
74
102
  label: updated.key,
75
103
  type: updated.type,
76
- config: { ...updated.config, adapterCode: updated.adapterCode },
77
- adapterCode: updated.adapterCode,
104
+ config: updated.config,
105
+ adapterCode: updated.adapterCode || data.adapterCode,
78
106
  },
79
107
  });
80
108
  }, [node, data, onUpdate]);
@@ -85,9 +113,19 @@ function NodePropertiesPanelComponent({
85
113
  return (
86
114
  <Sheet open={!!node} onOpenChange={() => onClose()}>
87
115
  <SheetContent
88
- className="overflow-y-auto p-0"
89
- style={{ width: panelWidth, maxWidth: PANEL_WIDTHS.MAX_VW }}
116
+ side="right"
117
+ className="overflow-y-auto p-0 !max-w-none"
118
+ style={{ width: `${width}px`, maxWidth: PANEL_WIDTHS.MAX_VW }}
90
119
  >
120
+ {/* Resize drag handle (left edge) */}
121
+ <div
122
+ className="absolute left-0 top-0 bottom-0 w-1.5 cursor-col-resize z-50
123
+ hover:bg-primary/20 active:bg-primary/30 transition-colors"
124
+ onMouseDown={onResizeStart}
125
+ role="separator"
126
+ aria-orientation="vertical"
127
+ aria-label="Resize panel"
128
+ />
91
129
  <SheetHeader className="px-4 py-3 border-b bg-muted/30">
92
130
  <SheetTitle className="flex items-center justify-between">
93
131
  <div className="flex items-center gap-2">
@@ -96,9 +96,9 @@ function StepListItemComponent({
96
96
  {config?.label ?? step.type}
97
97
  </Badge>
98
98
  </div>
99
- {step.config?.adapterCode && (
99
+ {(step.adapterCode || step.config?.adapterCode) && (
100
100
  <p className="text-xs text-muted-foreground truncate">
101
- {String(step.config.adapterCode)}
101
+ {String(step.adapterCode || step.config?.adapterCode)}
102
102
  </p>
103
103
  )}
104
104
  </div>