@oronts/vendure-data-hub-plugin 0.1.2 → 0.1.4

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 (534) hide show
  1. package/CHANGELOG.md +33 -1
  2. package/README.md +36 -10
  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 +24 -10
  13. package/dashboard/constants/ui-dimensions.ts +2 -1
  14. package/dashboard/constants/ui-states.ts +1 -0
  15. package/dashboard/gql/gql.ts +6 -6
  16. package/dashboard/gql/graphql.ts +9 -4
  17. package/dashboard/hooks/api/use-pipeline-runs.ts +1 -0
  18. package/dashboard/hooks/api/use-queues.ts +1 -0
  19. package/dashboard/hooks/use-adapter-catalog.ts +4 -32
  20. package/dashboard/routes/connections/ConnectionDetail.tsx +7 -1
  21. package/dashboard/routes/pipelines/RunDetailsPanel.tsx +1 -1
  22. package/dashboard/routes/pipelines/components/PipelineActionButtons.tsx +3 -3
  23. package/dashboard/routes/pipelines/utils/pipeline-conversion.ts +3 -5
  24. package/dashboard/utils/formatters.ts +6 -4
  25. package/dist/dashboard/components/pipelines/PipelineEditor.tsx +159 -5
  26. package/dist/dashboard/components/pipelines/ReactFlowPipelineEditor.tsx +3 -3
  27. package/dist/dashboard/components/pipelines/shared/NodePropertiesPanel.tsx +42 -4
  28. package/dist/dashboard/components/pipelines/shared/StepListItem.tsx +2 -2
  29. package/dist/dashboard/components/shared/CodeEditor.tsx +289 -0
  30. package/dist/dashboard/components/shared/schema-form/fields/TextareaField.tsx +19 -4
  31. package/dist/dashboard/components/shared/step-config/AdapterSelector.tsx +2 -2
  32. package/dist/dashboard/components/shared/step-config/OperatorFieldInput.tsx +19 -0
  33. package/dist/dashboard/components/shared/step-config/RouteConfigComponent.tsx +218 -29
  34. package/dist/dashboard/components/shared/step-config/StepConfigPanel.tsx +24 -10
  35. package/dist/dashboard/constants/ui-dimensions.ts +2 -1
  36. package/dist/dashboard/constants/ui-states.ts +1 -0
  37. package/dist/dashboard/gql/gql.ts +6 -6
  38. package/dist/dashboard/gql/graphql.ts +9 -4
  39. package/dist/dashboard/hooks/api/use-pipeline-runs.ts +1 -0
  40. package/dist/dashboard/hooks/api/use-queues.ts +1 -0
  41. package/dist/dashboard/hooks/use-adapter-catalog.ts +4 -32
  42. package/dist/dashboard/routes/connections/ConnectionDetail.tsx +7 -1
  43. package/dist/dashboard/routes/pipelines/RunDetailsPanel.tsx +1 -1
  44. package/dist/dashboard/routes/pipelines/components/PipelineActionButtons.tsx +3 -3
  45. package/dist/dashboard/routes/pipelines/utils/pipeline-conversion.ts +3 -5
  46. package/dist/dashboard/utils/formatters.ts +6 -4
  47. package/dist/shared/types/adapter-config.types.d.ts +400 -13
  48. package/dist/shared/types/adapter-config.types.d.ts.map +1 -1
  49. package/dist/shared/types/index.d.ts +1 -1
  50. package/dist/shared/types/index.d.ts.map +1 -1
  51. package/dist/shared/types/index.js.map +1 -1
  52. package/dist/shared/types/loader.types.d.ts +4 -0
  53. package/dist/shared/types/loader.types.d.ts.map +1 -1
  54. package/dist/shared/types/step.types.d.ts +6 -0
  55. package/dist/shared/types/step.types.d.ts.map +1 -1
  56. package/dist/shared/utils/error.d.ts +5 -0
  57. package/dist/shared/utils/error.d.ts.map +1 -1
  58. package/dist/shared/utils/error.js +11 -0
  59. package/dist/shared/utils/error.js.map +1 -1
  60. package/dist/src/adapters/registry.d.ts.map +1 -1
  61. package/dist/src/adapters/registry.js +2 -1
  62. package/dist/src/adapters/registry.js.map +1 -1
  63. package/dist/src/api/controllers/webhook.controller.d.ts +10 -0
  64. package/dist/src/api/controllers/webhook.controller.d.ts.map +1 -1
  65. package/dist/src/api/controllers/webhook.controller.js +50 -10
  66. package/dist/src/api/controllers/webhook.controller.js.map +1 -1
  67. package/dist/src/api/resolvers/queue.resolver.d.ts +3 -1
  68. package/dist/src/api/resolvers/queue.resolver.d.ts.map +1 -1
  69. package/dist/src/api/resolvers/queue.resolver.js +6 -5
  70. package/dist/src/api/resolvers/queue.resolver.js.map +1 -1
  71. package/dist/src/api/schema/pipeline.schema.d.ts +1 -1
  72. package/dist/src/api/schema/pipeline.schema.d.ts.map +1 -1
  73. package/dist/src/api/schema/pipeline.schema.js +6 -0
  74. package/dist/src/api/schema/pipeline.schema.js.map +1 -1
  75. package/dist/src/api/schema/test.schema.d.ts +1 -1
  76. package/dist/src/api/schema/test.schema.d.ts.map +1 -1
  77. package/dist/src/api/schema/test.schema.js +5 -1
  78. package/dist/src/api/schema/test.schema.js.map +1 -1
  79. package/dist/src/bootstrap/initialization.d.ts.map +1 -1
  80. package/dist/src/bootstrap/initialization.js +6 -0
  81. package/dist/src/bootstrap/initialization.js.map +1 -1
  82. package/dist/src/constants/adapter-schema-options.d.ts +65 -0
  83. package/dist/src/constants/adapter-schema-options.d.ts.map +1 -1
  84. package/dist/src/constants/adapter-schema-options.js +79 -3
  85. package/dist/src/constants/adapter-schema-options.js.map +1 -1
  86. package/dist/src/constants/builtin-adapters.d.ts +1 -1
  87. package/dist/src/constants/builtin-adapters.d.ts.map +1 -1
  88. package/dist/src/constants/builtin-adapters.js +19 -1
  89. package/dist/src/constants/builtin-adapters.js.map +1 -1
  90. package/dist/src/constants/core.d.ts +10 -0
  91. package/dist/src/constants/core.d.ts.map +1 -1
  92. package/dist/src/constants/core.js +10 -0
  93. package/dist/src/constants/core.js.map +1 -1
  94. package/dist/src/constants/defaults/webhook-defaults.d.ts +2 -0
  95. package/dist/src/constants/defaults/webhook-defaults.d.ts.map +1 -1
  96. package/dist/src/constants/defaults/webhook-defaults.js +2 -0
  97. package/dist/src/constants/defaults/webhook-defaults.js.map +1 -1
  98. package/dist/src/constants/enum-metadata.d.ts.map +1 -1
  99. package/dist/src/constants/enum-metadata.js +3 -0
  100. package/dist/src/constants/enum-metadata.js.map +1 -1
  101. package/dist/src/constants/hook-stage-metadata.d.ts.map +1 -1
  102. package/dist/src/constants/hook-stage-metadata.js +42 -0
  103. package/dist/src/constants/hook-stage-metadata.js.map +1 -1
  104. package/dist/src/constants/services.d.ts.map +1 -1
  105. package/dist/src/constants/services.js +7 -0
  106. package/dist/src/constants/services.js.map +1 -1
  107. package/dist/src/constants/time.d.ts +2 -0
  108. package/dist/src/constants/time.d.ts.map +1 -1
  109. package/dist/src/constants/time.js +2 -0
  110. package/dist/src/constants/time.js.map +1 -1
  111. package/dist/src/entities/data/error-record.entity.d.ts +1 -0
  112. package/dist/src/entities/data/error-record.entity.d.ts.map +1 -1
  113. package/dist/src/entities/data/error-record.entity.js +4 -0
  114. package/dist/src/entities/data/error-record.entity.js.map +1 -1
  115. package/dist/src/entities/pipeline/pipeline-run.entity.d.ts +4 -0
  116. package/dist/src/entities/pipeline/pipeline-run.entity.d.ts.map +1 -1
  117. package/dist/src/entities/pipeline/pipeline-run.entity.js +8 -0
  118. package/dist/src/entities/pipeline/pipeline-run.entity.js.map +1 -1
  119. package/dist/src/extractors/cdc/cdc.extractor.d.ts.map +1 -1
  120. package/dist/src/extractors/cdc/cdc.extractor.js +7 -2
  121. package/dist/src/extractors/cdc/cdc.extractor.js.map +1 -1
  122. package/dist/src/extractors/cdc/types.d.ts +1 -1
  123. package/dist/src/extractors/cdc/types.d.ts.map +1 -1
  124. package/dist/src/extractors/extractor-handler-registry.d.ts.map +1 -1
  125. package/dist/src/extractors/extractor-handler-registry.js +3 -0
  126. package/dist/src/extractors/extractor-handler-registry.js.map +1 -1
  127. package/dist/src/extractors/vendure-query/helpers.d.ts +9 -4
  128. package/dist/src/extractors/vendure-query/helpers.d.ts.map +1 -1
  129. package/dist/src/extractors/vendure-query/helpers.js +98 -32
  130. package/dist/src/extractors/vendure-query/helpers.js.map +1 -1
  131. package/dist/src/extractors/vendure-query/schema.d.ts.map +1 -1
  132. package/dist/src/extractors/vendure-query/schema.js +13 -0
  133. package/dist/src/extractors/vendure-query/schema.js.map +1 -1
  134. package/dist/src/feeds/generators/csv-feed.generator.d.ts.map +1 -1
  135. package/dist/src/feeds/generators/csv-feed.generator.js +5 -4
  136. package/dist/src/feeds/generators/csv-feed.generator.js.map +1 -1
  137. package/dist/src/feeds/generators/facebook-catalog.generator.d.ts.map +1 -1
  138. package/dist/src/feeds/generators/facebook-catalog.generator.js +83 -114
  139. package/dist/src/feeds/generators/facebook-catalog.generator.js.map +1 -1
  140. package/dist/src/feeds/generators/feed-constants.d.ts +1 -0
  141. package/dist/src/feeds/generators/feed-constants.d.ts.map +1 -1
  142. package/dist/src/feeds/generators/feed-constants.js +1 -0
  143. package/dist/src/feeds/generators/feed-constants.js.map +1 -1
  144. package/dist/src/feeds/generators/feed-helpers.d.ts +10 -8
  145. package/dist/src/feeds/generators/feed-helpers.d.ts.map +1 -1
  146. package/dist/src/feeds/generators/feed-helpers.js +23 -3
  147. package/dist/src/feeds/generators/feed-helpers.js.map +1 -1
  148. package/dist/src/feeds/generators/feed-item-builder.d.ts +59 -0
  149. package/dist/src/feeds/generators/feed-item-builder.d.ts.map +1 -0
  150. package/dist/src/feeds/generators/feed-item-builder.js +93 -0
  151. package/dist/src/feeds/generators/feed-item-builder.js.map +1 -0
  152. package/dist/src/feeds/generators/google-shopping.generator.d.ts.map +1 -1
  153. package/dist/src/feeds/generators/google-shopping.generator.js +52 -64
  154. package/dist/src/feeds/generators/google-shopping.generator.js.map +1 -1
  155. package/dist/src/feeds/generators/json-feed.generator.d.ts.map +1 -1
  156. package/dist/src/feeds/generators/json-feed.generator.js +4 -3
  157. package/dist/src/feeds/generators/json-feed.generator.js.map +1 -1
  158. package/dist/src/feeds/generators/xml-feed.generator.d.ts.map +1 -1
  159. package/dist/src/feeds/generators/xml-feed.generator.js +6 -5
  160. package/dist/src/feeds/generators/xml-feed.generator.js.map +1 -1
  161. package/dist/src/gql/generated.d.ts +5 -0
  162. package/dist/src/gql/generated.d.ts.map +1 -1
  163. package/dist/src/gql/generated.js.map +1 -1
  164. package/dist/src/index.d.ts +3 -1
  165. package/dist/src/index.d.ts.map +1 -1
  166. package/dist/src/index.js +7 -4
  167. package/dist/src/index.js.map +1 -1
  168. package/dist/src/loaders/asset/asset.loader.d.ts.map +1 -1
  169. package/dist/src/loaders/asset/asset.loader.js +5 -1
  170. package/dist/src/loaders/asset/asset.loader.js.map +1 -1
  171. package/dist/src/loaders/base/validation-builder.d.ts +128 -3
  172. package/dist/src/loaders/base/validation-builder.d.ts.map +1 -1
  173. package/dist/src/loaders/base/validation-builder.js +177 -6
  174. package/dist/src/loaders/base/validation-builder.js.map +1 -1
  175. package/dist/src/loaders/collection/collection.loader.d.ts.map +1 -1
  176. package/dist/src/loaders/collection/collection.loader.js +22 -1
  177. package/dist/src/loaders/collection/collection.loader.js.map +1 -1
  178. package/dist/src/loaders/collection/helpers.d.ts +16 -1
  179. package/dist/src/loaders/collection/helpers.d.ts.map +1 -1
  180. package/dist/src/loaders/collection/helpers.js +37 -0
  181. package/dist/src/loaders/collection/helpers.js.map +1 -1
  182. package/dist/src/loaders/customer/customer.loader.d.ts.map +1 -1
  183. package/dist/src/loaders/customer/customer.loader.js +13 -1
  184. package/dist/src/loaders/customer/customer.loader.js.map +1 -1
  185. package/dist/src/loaders/customer/helpers.d.ts +15 -3
  186. package/dist/src/loaders/customer/helpers.d.ts.map +1 -1
  187. package/dist/src/loaders/customer/helpers.js +188 -7
  188. package/dist/src/loaders/customer/helpers.js.map +1 -1
  189. package/dist/src/loaders/facet-value/facet-value.loader.d.ts.map +1 -1
  190. package/dist/src/loaders/facet-value/facet-value.loader.js +18 -0
  191. package/dist/src/loaders/facet-value/facet-value.loader.js.map +1 -1
  192. package/dist/src/loaders/facet-value/types.d.ts +1 -1
  193. package/dist/src/loaders/facet-value/types.js +1 -1
  194. package/dist/src/loaders/facet-value/types.js.map +1 -1
  195. package/dist/src/loaders/inventory/inventory.loader.d.ts.map +1 -1
  196. package/dist/src/loaders/inventory/inventory.loader.js +1 -2
  197. package/dist/src/loaders/inventory/inventory.loader.js.map +1 -1
  198. package/dist/src/loaders/order/helpers.d.ts +16 -2
  199. package/dist/src/loaders/order/helpers.d.ts.map +1 -1
  200. package/dist/src/loaders/order/helpers.js +108 -0
  201. package/dist/src/loaders/order/helpers.js.map +1 -1
  202. package/dist/src/loaders/order/order.loader.d.ts +38 -0
  203. package/dist/src/loaders/order/order.loader.d.ts.map +1 -1
  204. package/dist/src/loaders/order/order.loader.js +238 -24
  205. package/dist/src/loaders/order/order.loader.js.map +1 -1
  206. package/dist/src/loaders/order/types.d.ts +10 -3
  207. package/dist/src/loaders/order/types.d.ts.map +1 -1
  208. package/dist/src/loaders/order/types.js +13 -2
  209. package/dist/src/loaders/order/types.js.map +1 -1
  210. package/dist/src/loaders/product/product.loader.d.ts.map +1 -1
  211. package/dist/src/loaders/product/product.loader.js +18 -2
  212. package/dist/src/loaders/product/product.loader.js.map +1 -1
  213. package/dist/src/loaders/product-variant/helpers.d.ts +20 -0
  214. package/dist/src/loaders/product-variant/helpers.d.ts.map +1 -0
  215. package/dist/src/loaders/product-variant/helpers.js +103 -0
  216. package/dist/src/loaders/product-variant/helpers.js.map +1 -0
  217. package/dist/src/loaders/product-variant/product-variant.loader.d.ts.map +1 -1
  218. package/dist/src/loaders/product-variant/product-variant.loader.js +76 -10
  219. package/dist/src/loaders/product-variant/product-variant.loader.js.map +1 -1
  220. package/dist/src/loaders/product-variant/types.d.ts +7 -0
  221. package/dist/src/loaders/product-variant/types.d.ts.map +1 -1
  222. package/dist/src/loaders/product-variant/types.js.map +1 -1
  223. package/dist/src/loaders/promotion/helpers.d.ts +29 -0
  224. package/dist/src/loaders/promotion/helpers.d.ts.map +1 -1
  225. package/dist/src/loaders/promotion/helpers.js +68 -0
  226. package/dist/src/loaders/promotion/helpers.js.map +1 -1
  227. package/dist/src/loaders/promotion/promotion.loader.d.ts.map +1 -1
  228. package/dist/src/loaders/promotion/promotion.loader.js +12 -2
  229. package/dist/src/loaders/promotion/promotion.loader.js.map +1 -1
  230. package/dist/src/loaders/shared-helpers.d.ts +42 -2
  231. package/dist/src/loaders/shared-helpers.d.ts.map +1 -1
  232. package/dist/src/loaders/shared-helpers.js +384 -5
  233. package/dist/src/loaders/shared-helpers.js.map +1 -1
  234. package/dist/src/operators/data/copy.operator.js +2 -2
  235. package/dist/src/operators/data/copy.operator.js.map +1 -1
  236. package/dist/src/operators/data/rename.operator.js +1 -1
  237. package/dist/src/operators/data/rename.operator.js.map +1 -1
  238. package/dist/src/operators/helpers.d.ts.map +1 -1
  239. package/dist/src/operators/helpers.js +11 -1
  240. package/dist/src/operators/helpers.js.map +1 -1
  241. package/dist/src/operators/operator-runtime-registry.d.ts +2 -2
  242. package/dist/src/operators/operator-runtime-registry.d.ts.map +1 -1
  243. package/dist/src/operators/operator-runtime-registry.js +1 -1
  244. package/dist/src/operators/operator-runtime-registry.js.map +1 -1
  245. package/dist/src/operators/script/script.operators.d.ts.map +1 -1
  246. package/dist/src/operators/script/script.operators.js +9 -3
  247. package/dist/src/operators/script/script.operators.js.map +1 -1
  248. package/dist/src/runtime/config-types.d.ts +6 -0
  249. package/dist/src/runtime/config-types.d.ts.map +1 -1
  250. package/dist/src/runtime/executor-helpers.d.ts +77 -0
  251. package/dist/src/runtime/executor-helpers.d.ts.map +1 -0
  252. package/dist/src/runtime/executor-helpers.js +143 -0
  253. package/dist/src/runtime/executor-helpers.js.map +1 -0
  254. package/dist/src/runtime/executor-types.d.ts +3 -2
  255. package/dist/src/runtime/executor-types.d.ts.map +1 -1
  256. package/dist/src/runtime/executors/export.executor.d.ts +3 -1
  257. package/dist/src/runtime/executors/export.executor.d.ts.map +1 -1
  258. package/dist/src/runtime/executors/export.executor.js +15 -3
  259. package/dist/src/runtime/executors/export.executor.js.map +1 -1
  260. package/dist/src/runtime/executors/exporters/export-handler-registry.d.ts.map +1 -1
  261. package/dist/src/runtime/executors/exporters/export-handler-registry.js +5 -0
  262. package/dist/src/runtime/executors/exporters/export-handler-registry.js.map +1 -1
  263. package/dist/src/runtime/executors/exporters/export-handler.types.d.ts +3 -0
  264. package/dist/src/runtime/executors/exporters/export-handler.types.d.ts.map +1 -1
  265. package/dist/src/runtime/executors/exporters/export-handler.types.js.map +1 -1
  266. package/dist/src/runtime/executors/exporters/export-helpers.d.ts +1 -0
  267. package/dist/src/runtime/executors/exporters/export-helpers.d.ts.map +1 -1
  268. package/dist/src/runtime/executors/exporters/export-helpers.js +33 -4
  269. package/dist/src/runtime/executors/exporters/export-helpers.js.map +1 -1
  270. package/dist/src/runtime/executors/exporters/http-export.handler.js +4 -4
  271. package/dist/src/runtime/executors/exporters/http-export.handler.js.map +1 -1
  272. package/dist/src/runtime/executors/extractors/file-extract.handler.d.ts.map +1 -1
  273. package/dist/src/runtime/executors/extractors/file-extract.handler.js +33 -13
  274. package/dist/src/runtime/executors/extractors/file-extract.handler.js.map +1 -1
  275. package/dist/src/runtime/executors/extractors/memory-extract.handler.d.ts.map +1 -1
  276. package/dist/src/runtime/executors/extractors/memory-extract.handler.js +17 -9
  277. package/dist/src/runtime/executors/extractors/memory-extract.handler.js.map +1 -1
  278. package/dist/src/runtime/executors/feed.executor.d.ts.map +1 -1
  279. package/dist/src/runtime/executors/feed.executor.js +11 -2
  280. package/dist/src/runtime/executors/feed.executor.js.map +1 -1
  281. package/dist/src/runtime/executors/feeds/feed-handler-registry.d.ts.map +1 -1
  282. package/dist/src/runtime/executors/feeds/feed-handler-registry.js +4 -0
  283. package/dist/src/runtime/executors/feeds/feed-handler-registry.js.map +1 -1
  284. package/dist/src/runtime/executors/gate.executor.d.ts +3 -1
  285. package/dist/src/runtime/executors/gate.executor.d.ts.map +1 -1
  286. package/dist/src/runtime/executors/gate.executor.js +47 -26
  287. package/dist/src/runtime/executors/gate.executor.js.map +1 -1
  288. package/dist/src/runtime/executors/loaders/asset-handler.js +1 -1
  289. package/dist/src/runtime/executors/loaders/asset-handler.js.map +1 -1
  290. package/dist/src/runtime/executors/loaders/asset-import-handler.js +1 -1
  291. package/dist/src/runtime/executors/loaders/asset-import-handler.js.map +1 -1
  292. package/dist/src/runtime/executors/loaders/channel-handler.d.ts +3 -1
  293. package/dist/src/runtime/executors/loaders/channel-handler.d.ts.map +1 -1
  294. package/dist/src/runtime/executors/loaders/channel-handler.js +28 -5
  295. package/dist/src/runtime/executors/loaders/channel-handler.js.map +1 -1
  296. package/dist/src/runtime/executors/loaders/collection-handler.d.ts +14 -2
  297. package/dist/src/runtime/executors/loaders/collection-handler.d.ts.map +1 -1
  298. package/dist/src/runtime/executors/loaders/collection-handler.js +113 -23
  299. package/dist/src/runtime/executors/loaders/collection-handler.js.map +1 -1
  300. package/dist/src/runtime/executors/loaders/customer-group-handler.d.ts.map +1 -1
  301. package/dist/src/runtime/executors/loaders/customer-group-handler.js +2 -20
  302. package/dist/src/runtime/executors/loaders/customer-group-handler.js.map +1 -1
  303. package/dist/src/runtime/executors/loaders/customer-handler.d.ts +6 -1
  304. package/dist/src/runtime/executors/loaders/customer-handler.d.ts.map +1 -1
  305. package/dist/src/runtime/executors/loaders/customer-handler.js +128 -15
  306. package/dist/src/runtime/executors/loaders/customer-handler.js.map +1 -1
  307. package/dist/src/runtime/executors/loaders/deletion-handler.d.ts +39 -0
  308. package/dist/src/runtime/executors/loaders/deletion-handler.d.ts.map +1 -0
  309. package/dist/src/runtime/executors/loaders/deletion-handler.js +414 -0
  310. package/dist/src/runtime/executors/loaders/deletion-handler.js.map +1 -0
  311. package/dist/src/runtime/executors/loaders/facet-handler.d.ts +18 -3
  312. package/dist/src/runtime/executors/loaders/facet-handler.d.ts.map +1 -1
  313. package/dist/src/runtime/executors/loaders/facet-handler.js +161 -28
  314. package/dist/src/runtime/executors/loaders/facet-handler.js.map +1 -1
  315. package/dist/src/runtime/executors/loaders/graphql-mutation-handler.js +1 -1
  316. package/dist/src/runtime/executors/loaders/graphql-mutation-handler.js.map +1 -1
  317. package/dist/src/runtime/executors/loaders/index.d.ts +2 -0
  318. package/dist/src/runtime/executors/loaders/index.d.ts.map +1 -1
  319. package/dist/src/runtime/executors/loaders/index.js +5 -1
  320. package/dist/src/runtime/executors/loaders/index.js.map +1 -1
  321. package/dist/src/runtime/executors/loaders/inventory-adjust-handler.d.ts.map +1 -1
  322. package/dist/src/runtime/executors/loaders/inventory-adjust-handler.js +2 -21
  323. package/dist/src/runtime/executors/loaders/inventory-adjust-handler.js.map +1 -1
  324. package/dist/src/runtime/executors/loaders/inventory-handler.d.ts +2 -1
  325. package/dist/src/runtime/executors/loaders/inventory-handler.d.ts.map +1 -1
  326. package/dist/src/runtime/executors/loaders/inventory-handler.js +11 -9
  327. package/dist/src/runtime/executors/loaders/inventory-handler.js.map +1 -1
  328. package/dist/src/runtime/executors/loaders/loader-handler-registry.d.ts.map +1 -1
  329. package/dist/src/runtime/executors/loaders/loader-handler-registry.js +150 -11
  330. package/dist/src/runtime/executors/loaders/loader-handler-registry.js.map +1 -1
  331. package/dist/src/runtime/executors/loaders/order-handler.d.ts +32 -4
  332. package/dist/src/runtime/executors/loaders/order-handler.d.ts.map +1 -1
  333. package/dist/src/runtime/executors/loaders/order-handler.js +201 -18
  334. package/dist/src/runtime/executors/loaders/order-handler.js.map +1 -1
  335. package/dist/src/runtime/executors/loaders/order-upsert-handler.d.ts +15 -0
  336. package/dist/src/runtime/executors/loaders/order-upsert-handler.d.ts.map +1 -0
  337. package/dist/src/runtime/executors/loaders/order-upsert-handler.js +89 -0
  338. package/dist/src/runtime/executors/loaders/order-upsert-handler.js.map +1 -0
  339. package/dist/src/runtime/executors/loaders/payment-method-handler.d.ts +11 -2
  340. package/dist/src/runtime/executors/loaders/payment-method-handler.d.ts.map +1 -1
  341. package/dist/src/runtime/executors/loaders/payment-method-handler.js +92 -34
  342. package/dist/src/runtime/executors/loaders/payment-method-handler.js.map +1 -1
  343. package/dist/src/runtime/executors/loaders/product-handler.d.ts +20 -0
  344. package/dist/src/runtime/executors/loaders/product-handler.d.ts.map +1 -1
  345. package/dist/src/runtime/executors/loaders/product-handler.js +121 -31
  346. package/dist/src/runtime/executors/loaders/product-handler.js.map +1 -1
  347. package/dist/src/runtime/executors/loaders/promotion-handler.d.ts +9 -2
  348. package/dist/src/runtime/executors/loaders/promotion-handler.d.ts.map +1 -1
  349. package/dist/src/runtime/executors/loaders/promotion-handler.js +134 -68
  350. package/dist/src/runtime/executors/loaders/promotion-handler.js.map +1 -1
  351. package/dist/src/runtime/executors/loaders/rest-handler.js +1 -1
  352. package/dist/src/runtime/executors/loaders/rest-handler.js.map +1 -1
  353. package/dist/src/runtime/executors/loaders/shared-lookups.d.ts +62 -1
  354. package/dist/src/runtime/executors/loaders/shared-lookups.d.ts.map +1 -1
  355. package/dist/src/runtime/executors/loaders/shared-lookups.js +238 -0
  356. package/dist/src/runtime/executors/loaders/shared-lookups.js.map +1 -1
  357. package/dist/src/runtime/executors/loaders/shipping-method-handler.d.ts +11 -6
  358. package/dist/src/runtime/executors/loaders/shipping-method-handler.d.ts.map +1 -1
  359. package/dist/src/runtime/executors/loaders/shipping-method-handler.js +168 -54
  360. package/dist/src/runtime/executors/loaders/shipping-method-handler.js.map +1 -1
  361. package/dist/src/runtime/executors/loaders/stock-location-handler.d.ts.map +1 -1
  362. package/dist/src/runtime/executors/loaders/stock-location-handler.js +2 -20
  363. package/dist/src/runtime/executors/loaders/stock-location-handler.js.map +1 -1
  364. package/dist/src/runtime/executors/loaders/tax-rate-handler.d.ts.map +1 -1
  365. package/dist/src/runtime/executors/loaders/tax-rate-handler.js +14 -1
  366. package/dist/src/runtime/executors/loaders/tax-rate-handler.js.map +1 -1
  367. package/dist/src/runtime/executors/loaders/types.d.ts +2 -0
  368. package/dist/src/runtime/executors/loaders/types.d.ts.map +1 -1
  369. package/dist/src/runtime/executors/loaders/variant-handler.d.ts +24 -2
  370. package/dist/src/runtime/executors/loaders/variant-handler.d.ts.map +1 -1
  371. package/dist/src/runtime/executors/loaders/variant-handler.js +266 -47
  372. package/dist/src/runtime/executors/loaders/variant-handler.js.map +1 -1
  373. package/dist/src/runtime/executors/sink-handler-registry.d.ts +7 -11
  374. package/dist/src/runtime/executors/sink-handler-registry.d.ts.map +1 -1
  375. package/dist/src/runtime/executors/sink-handler-registry.js +376 -10
  376. package/dist/src/runtime/executors/sink-handler-registry.js.map +1 -1
  377. package/dist/src/runtime/executors/sink.executor.d.ts +1 -0
  378. package/dist/src/runtime/executors/sink.executor.d.ts.map +1 -1
  379. package/dist/src/runtime/executors/sink.executor.js +82 -12
  380. package/dist/src/runtime/executors/sink.executor.js.map +1 -1
  381. package/dist/src/runtime/executors/transform.executor.d.ts.map +1 -1
  382. package/dist/src/runtime/executors/transform.executor.js +31 -2
  383. package/dist/src/runtime/executors/transform.executor.js.map +1 -1
  384. package/dist/src/runtime/orchestration/graph-executor.d.ts.map +1 -1
  385. package/dist/src/runtime/orchestration/graph-executor.js +3 -2
  386. package/dist/src/runtime/orchestration/graph-executor.js.map +1 -1
  387. package/dist/src/runtime/orchestration/helpers.d.ts +4 -1
  388. package/dist/src/runtime/orchestration/helpers.d.ts.map +1 -1
  389. package/dist/src/runtime/orchestration/helpers.js +7 -2
  390. package/dist/src/runtime/orchestration/helpers.js.map +1 -1
  391. package/dist/src/runtime/orchestration/linear-executor.d.ts.map +1 -1
  392. package/dist/src/runtime/orchestration/linear-executor.js +3 -2
  393. package/dist/src/runtime/orchestration/linear-executor.js.map +1 -1
  394. package/dist/src/runtime/orchestration/replay-executor.d.ts.map +1 -1
  395. package/dist/src/runtime/orchestration/replay-executor.js +3 -2
  396. package/dist/src/runtime/orchestration/replay-executor.js.map +1 -1
  397. package/dist/src/runtime/orchestration/step-strategies/export-step.strategy.d.ts.map +1 -1
  398. package/dist/src/runtime/orchestration/step-strategies/export-step.strategy.js +12 -12
  399. package/dist/src/runtime/orchestration/step-strategies/export-step.strategy.js.map +1 -1
  400. package/dist/src/runtime/orchestration/step-strategies/feed-step.strategy.d.ts.map +1 -1
  401. package/dist/src/runtime/orchestration/step-strategies/feed-step.strategy.js +12 -12
  402. package/dist/src/runtime/orchestration/step-strategies/feed-step.strategy.js.map +1 -1
  403. package/dist/src/runtime/orchestration/step-strategies/load-step.strategy.js +2 -2
  404. package/dist/src/runtime/orchestration/step-strategies/load-step.strategy.js.map +1 -1
  405. package/dist/src/runtime/orchestration/step-strategies/sink-step.strategy.d.ts.map +1 -1
  406. package/dist/src/runtime/orchestration/step-strategies/sink-step.strategy.js +12 -12
  407. package/dist/src/runtime/orchestration/step-strategies/sink-step.strategy.js.map +1 -1
  408. package/dist/src/runtime/orchestration/step-strategies/step-dispatcher.d.ts.map +1 -1
  409. package/dist/src/runtime/orchestration/step-strategies/step-dispatcher.js +4 -3
  410. package/dist/src/runtime/orchestration/step-strategies/step-dispatcher.js.map +1 -1
  411. package/dist/src/runtime/orchestration/step-strategies/transform-step.strategy.js +4 -4
  412. package/dist/src/runtime/orchestration/step-strategies/transform-step.strategy.js.map +1 -1
  413. package/dist/src/runtime/orchestration/types.d.ts +1 -0
  414. package/dist/src/runtime/orchestration/types.d.ts.map +1 -1
  415. package/dist/src/runtime/utils.d.ts.map +1 -1
  416. package/dist/src/runtime/utils.js +8 -1
  417. package/dist/src/runtime/utils.js.map +1 -1
  418. package/dist/src/sdk/adapters/queue/index.d.ts +1 -0
  419. package/dist/src/sdk/adapters/queue/index.d.ts.map +1 -1
  420. package/dist/src/sdk/adapters/queue/index.js +1 -0
  421. package/dist/src/sdk/adapters/queue/index.js.map +1 -1
  422. package/dist/src/sdk/adapters/queue/internal.adapter.d.ts +32 -0
  423. package/dist/src/sdk/adapters/queue/internal.adapter.d.ts.map +1 -0
  424. package/dist/src/sdk/adapters/queue/internal.adapter.js +68 -0
  425. package/dist/src/sdk/adapters/queue/internal.adapter.js.map +1 -0
  426. package/dist/src/sdk/adapters/queue/queue-adapter.registry.d.ts.map +1 -1
  427. package/dist/src/sdk/adapters/queue/queue-adapter.registry.js +3 -0
  428. package/dist/src/sdk/adapters/queue/queue-adapter.registry.js.map +1 -1
  429. package/dist/src/sdk/adapters/queue/rabbitmq.adapter.d.ts.map +1 -1
  430. package/dist/src/sdk/adapters/queue/rabbitmq.adapter.js +2 -1
  431. package/dist/src/sdk/adapters/queue/rabbitmq.adapter.js.map +1 -1
  432. package/dist/src/sdk/constants.d.ts +2 -2
  433. package/dist/src/sdk/constants.d.ts.map +1 -1
  434. package/dist/src/sdk/dsl/pipeline-builder.d.ts +8 -2
  435. package/dist/src/sdk/dsl/pipeline-builder.d.ts.map +1 -1
  436. package/dist/src/sdk/dsl/pipeline-builder.js +115 -19
  437. package/dist/src/sdk/dsl/pipeline-builder.js.map +1 -1
  438. package/dist/src/sdk/dsl/step-configs.d.ts +24 -0
  439. package/dist/src/sdk/dsl/step-configs.d.ts.map +1 -1
  440. package/dist/src/services/data/record-error.service.d.ts +1 -1
  441. package/dist/src/services/data/record-error.service.d.ts.map +1 -1
  442. package/dist/src/services/data/record-error.service.js +4 -1
  443. package/dist/src/services/data/record-error.service.js.map +1 -1
  444. package/dist/src/services/events/consumer-discovery.d.ts.map +1 -1
  445. package/dist/src/services/events/consumer-discovery.js +2 -1
  446. package/dist/src/services/events/consumer-discovery.js.map +1 -1
  447. package/dist/src/services/events/consumer-lifecycle.d.ts.map +1 -1
  448. package/dist/src/services/events/consumer-lifecycle.js +19 -15
  449. package/dist/src/services/events/consumer-lifecycle.js.map +1 -1
  450. package/dist/src/services/events/event-trigger.service.d.ts.map +1 -1
  451. package/dist/src/services/events/event-trigger.service.js +9 -3
  452. package/dist/src/services/events/event-trigger.service.js.map +1 -1
  453. package/dist/src/services/events/hook.service.d.ts.map +1 -1
  454. package/dist/src/services/events/hook.service.js +7 -3
  455. package/dist/src/services/events/hook.service.js.map +1 -1
  456. package/dist/src/services/events/message-processing.d.ts.map +1 -1
  457. package/dist/src/services/events/message-processing.js +13 -8
  458. package/dist/src/services/events/message-processing.js.map +1 -1
  459. package/dist/src/services/logger/datahub-logger.d.ts +7 -0
  460. package/dist/src/services/logger/datahub-logger.d.ts.map +1 -1
  461. package/dist/src/services/logger/datahub-logger.js +9 -0
  462. package/dist/src/services/logger/datahub-logger.js.map +1 -1
  463. package/dist/src/services/logger/execution-logger.d.ts +1 -1
  464. package/dist/src/services/logger/execution-logger.d.ts.map +1 -1
  465. package/dist/src/services/logger/execution-logger.js +8 -4
  466. package/dist/src/services/logger/execution-logger.js.map +1 -1
  467. package/dist/src/services/pipeline/pipeline-runner.service.d.ts +3 -1
  468. package/dist/src/services/pipeline/pipeline-runner.service.d.ts.map +1 -1
  469. package/dist/src/services/pipeline/pipeline-runner.service.js +17 -7
  470. package/dist/src/services/pipeline/pipeline-runner.service.js.map +1 -1
  471. package/dist/src/services/pipeline/pipeline.service.d.ts.map +1 -1
  472. package/dist/src/services/pipeline/pipeline.service.js +8 -2
  473. package/dist/src/services/pipeline/pipeline.service.js.map +1 -1
  474. package/dist/src/services/storage/retention.service.d.ts.map +1 -1
  475. package/dist/src/services/storage/retention.service.js +22 -0
  476. package/dist/src/services/storage/retention.service.js.map +1 -1
  477. package/dist/src/services/testing/step-test.service.d.ts.map +1 -1
  478. package/dist/src/services/testing/step-test.service.js +17 -1
  479. package/dist/src/services/testing/step-test.service.js.map +1 -1
  480. package/dist/src/services/validation/definition-validation.service.d.ts.map +1 -1
  481. package/dist/src/services/validation/definition-validation.service.js +4 -1
  482. package/dist/src/services/validation/definition-validation.service.js.map +1 -1
  483. package/dist/src/services/validation/trigger-validation.d.ts.map +1 -1
  484. package/dist/src/services/validation/trigger-validation.js +76 -2
  485. package/dist/src/services/validation/trigger-validation.js.map +1 -1
  486. package/dist/src/types/index.d.ts +1 -0
  487. package/dist/src/types/index.d.ts.map +1 -1
  488. package/dist/src/types/index.js.map +1 -1
  489. package/dist/src/types/loader-configs.d.ts +1071 -0
  490. package/dist/src/types/loader-configs.d.ts.map +1 -0
  491. package/dist/src/types/loader-configs.js +54 -0
  492. package/dist/src/types/loader-configs.js.map +1 -0
  493. package/dist/src/types/step-configs.d.ts +1 -0
  494. package/dist/src/types/step-configs.d.ts.map +1 -1
  495. package/dist/src/types/step-configs.js +3 -0
  496. package/dist/src/types/step-configs.js.map +1 -1
  497. package/dist/src/utils/code-security.utils.d.ts +18 -0
  498. package/dist/src/utils/code-security.utils.d.ts.map +1 -1
  499. package/dist/src/utils/code-security.utils.js +125 -9
  500. package/dist/src/utils/code-security.utils.js.map +1 -1
  501. package/dist/src/utils/error.utils.d.ts +1 -1
  502. package/dist/src/utils/error.utils.d.ts.map +1 -1
  503. package/dist/src/utils/error.utils.js +2 -1
  504. package/dist/src/utils/error.utils.js.map +1 -1
  505. package/dist/src/utils/url-security.utils.d.ts +5 -3
  506. package/dist/src/utils/url-security.utils.d.ts.map +1 -1
  507. package/dist/src/utils/url-security.utils.js +20 -4
  508. package/dist/src/utils/url-security.utils.js.map +1 -1
  509. package/dist/src/validation/pipeline-definition.validator.js +2 -1
  510. package/dist/src/validation/pipeline-definition.validator.js.map +1 -1
  511. package/docs/developer-guide/README.md +2 -0
  512. package/docs/developer-guide/dsl/pipeline-builder.md +12 -0
  513. package/docs/developer-guide/extending/README.md +230 -10
  514. package/docs/developer-guide/extending/custom-sinks.md +87 -0
  515. package/docs/developer-guide/extending/events.md +4 -1
  516. package/docs/examples/validation-error-messages.md +246 -0
  517. package/docs/guides/multi-channel.md +1190 -0
  518. package/docs/guides/multi-currency.md +881 -0
  519. package/docs/guides/multi-entity.md +597 -0
  520. package/docs/guides/multi-language.md +957 -0
  521. package/docs/reference/README.md +11 -4
  522. package/docs/reference/extractors.md +30 -0
  523. package/docs/reference/loaders.md +396 -21
  524. package/docs/reference/operators-complete.md +1251 -0
  525. package/docs/reference/operators.md +36 -2
  526. package/docs/reference/sinks.md +7 -6
  527. package/docs/reference/step-types.md +12 -5
  528. package/docs/user-guide/pipelines.md +82 -13
  529. package/package.json +1 -1
  530. package/shared/types/adapter-config.types.ts +439 -10
  531. package/shared/types/index.ts +25 -0
  532. package/shared/types/loader.types.ts +4 -0
  533. package/shared/types/step.types.ts +6 -0
  534. package/shared/utils/error.ts +11 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,38 @@
2
2
 
3
3
  All notable changes to the Data Hub Plugin are documented here.
4
4
 
5
+ ## [0.1.4] - 2026-03-03
6
+
7
+ ### Added
8
+ - **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)
9
+ - **dependencyOnly edge type** for graph execution: edges that enforce ordering without passing data
10
+ - **Internal queue adapter** for testing sink/message pipelines without external infrastructure
11
+ - **Stale run cleanup**: runs exceeding 1 hour automatically transition to TIMEOUT status
12
+ - **Webhook HMAC-SHA256 signing** for sink webhook deliveries
13
+ - **Export file registration** in REST API: exported files accessible via `/data-hub/files/:id`
14
+ - **Per-branch condition editors** in dashboard route step configuration
15
+ - **Resizable Configure Node panel** in workflow graph editor
16
+ - **45 example pipelines** (previously 28) covering all step types, operators, and adapter combinations
17
+
18
+ ### Fixed
19
+ - 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
20
+ - Order import no longer produces NaN on completed orders with calculated totals
21
+ - Trigger validation is now case-insensitive for trigger type matching
22
+ - Webhook authentication errors now return 401 (was 500) for invalid credentials
23
+ - Meilisearch sink correctly indexes both EN and DE translations
24
+
25
+ ## [0.1.3] - 2026-02-26
26
+
27
+ ### Added
28
+ - **Option group auto-creation** in variant loader: new `optionGroupsField` config auto-creates option groups and options from key-value pairs (e.g. `{ size: 'S', color: 'Blue' }`), assigns them to the parent product, and links variants. Also supports `optionIdsField` (direct IDs) and `optionCodesField` (code lookup)
29
+ - **Stack traces on error records**: failed records now capture JavaScript stack traces for debugging. Visible in dashboard error viewer and dead letter queue
30
+ - **Load strategy support** for all entity loaders: configurable `strategy` field (`UPSERT`, `CREATE`, `UPDATE`) controls whether records are created, updated, or both
31
+ - **Custom fields support** for product, variant, customer, collection, promotion, facet, and facet value loaders via `customFieldsField` config
32
+ - **SSRF protection wiring**: global SSRF config from plugin options now passed to all loader handlers for URL validation
33
+
34
+ ### Fixed
35
+ - SSRF protection config was not propagated from plugin-level `security.ssrf` settings to individual loader handlers
36
+
5
37
  ## [0.1.2] - 2026-02-24
6
38
 
7
39
  ### Fixed
@@ -155,7 +187,7 @@ Initial production release of the Data Hub Plugin for Vendure.
155
187
  - **Typesense** - Open-source search engine
156
188
  - **Queue Producer** - RabbitMQ/Redis Streams/SQS message publishing
157
189
  - **Webhook** - HTTP POST to external services
158
- - **PDF Generator** - Generate PDF documents from templates
190
+ - **OpenSearch** - Open-source search and analytics engine
159
191
 
160
192
  ### Advanced Features
161
193
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <p align="center">
2
2
  <a href="https://oronts.com">
3
- <img src="https://oronts.com/_next/image?url=%2Fimages%2Flogo%2FLogo-white.png&w=256&q=75" alt="Oronts" width="80" height="80">
3
+ <img src="https://oronts.com/_next/image?url=%2Fimages%2Flogo%2FLogo-white.png&w=256&q=75" alt="Oronts">
4
4
  </a>
5
5
  </p>
6
6
 
@@ -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
 
@@ -432,11 +433,12 @@ Execute custom JavaScript for complex transformations:
432
433
  | Loader | Adapter Code | Description |
433
434
  |--------|--------------|-------------|
434
435
  | Product Loader | `productUpsert` | Create/update products with variants, prices, tax, and stock |
435
- | Variant Loader | `variantUpsert` | Update product variants by SKU with multi-currency prices |
436
+ | Variant Loader | `variantUpsert` | Update product variants by SKU with multi-currency prices and auto-create option groups |
436
437
  | Customer Loader | `customerUpsert` | Create/update customers with addresses and group memberships |
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({
@@ -1134,6 +1156,10 @@ const pipeline = createPipeline()
1134
1156
  })
1135
1157
  ```
1136
1158
 
1159
+ ### Stack Traces
1160
+
1161
+ Failed records automatically capture JavaScript stack traces when errors originate from exceptions. Stack traces are stored on the error record and visible in the dashboard error viewer and dead letter queue, aiding production debugging.
1162
+
1137
1163
  ---
1138
1164
 
1139
1165
  ## Requirements
@@ -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>