@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
@@ -1,8 +1,19 @@
1
1
  import React, { useCallback } from 'react';
2
- import { Plus, Trash2, AlertTriangle } from 'lucide-react';
3
- import { Button, Input, Label } from '@vendure/dashboard';
2
+ import { Plus, Trash2, AlertTriangle, ChevronDown, ChevronRight } from 'lucide-react';
3
+ import {
4
+ Button,
5
+ Input,
6
+ Label,
7
+ Select,
8
+ SelectContent,
9
+ SelectItem,
10
+ SelectTrigger,
11
+ SelectValue,
12
+ } from '@vendure/dashboard';
4
13
  import { ROUTE_BRANCH_DEFAULTS, ERROR_MESSAGES } from '../../../constants';
5
14
  import { useStableKeys } from '../../../hooks';
15
+ import { useComparisonOperators } from '../../../hooks/api/use-config-options';
16
+ import type { ComparisonOperatorOption } from '../../../hooks/api/use-config-options';
6
17
 
7
18
  export interface RouteConfigComponentProps {
8
19
  readonly config: Record<string, unknown>;
@@ -10,9 +21,15 @@ export interface RouteConfigComponentProps {
10
21
  readonly showDuplicateWarning?: boolean;
11
22
  }
12
23
 
24
+ interface BranchCondition {
25
+ field: string;
26
+ cmp: string;
27
+ value?: unknown;
28
+ }
29
+
13
30
  interface Branch {
14
31
  name: string;
15
- conditions?: unknown[];
32
+ when?: BranchCondition[];
16
33
  }
17
34
 
18
35
  export function RouteConfigComponent({
@@ -22,6 +39,7 @@ export function RouteConfigComponent({
22
39
  }: RouteConfigComponentProps) {
23
40
  const branches = (config.branches as Branch[]) ?? [];
24
41
  const branchKeys = useStableKeys(branches, 'branch');
42
+ const { operators: comparisonOperators } = useComparisonOperators();
25
43
 
26
44
  const getDuplicateBranches = React.useCallback((branchList: Branch[]) => {
27
45
  const names = branchList.map((b) => b.name.trim().toLowerCase());
@@ -50,11 +68,11 @@ export function RouteConfigComponent({
50
68
 
51
69
  onChange({
52
70
  ...config,
53
- branches: [...branches, { name: newName, conditions: [] }],
71
+ branches: [...branches, { name: newName, when: [] }],
54
72
  });
55
73
  }, [branches, config, onChange]);
56
74
 
57
- const updateBranch = useCallback((index: number, patch: Record<string, unknown>) => {
75
+ const updateBranch = useCallback((index: number, patch: Partial<Branch>) => {
58
76
  const newBranches = [...branches];
59
77
  newBranches[index] = { ...newBranches[index], ...patch };
60
78
  onChange({ ...config, branches: newBranches });
@@ -78,41 +96,28 @@ export function RouteConfigComponent({
78
96
  </Button>
79
97
  </div>
80
98
 
81
- {showDuplicateWarning && hasDuplicates && (
99
+ {showDuplicateWarning && hasDuplicates && (
82
100
  <div className="p-3 bg-amber-50 dark:bg-amber-950/30 border border-amber-200 dark:border-amber-800 rounded-md">
83
101
  <div className="flex items-center gap-2 text-amber-800 dark:text-amber-400">
84
102
  <AlertTriangle className="h-4 w-4" />
85
103
  <span className="text-sm font-medium">Duplicate branch names detected</span>
86
104
  </div>
87
- <p className="text-xs text-amber-700 mt-1">
105
+ <p className="text-xs text-amber-700 dark:text-amber-500 mt-1">
88
106
  {ERROR_MESSAGES.DUPLICATE_BRANCH_NAMES}. Duplicate: {Array.from(duplicates).join(', ')}
89
107
  </p>
90
108
  </div>
91
109
  )}
92
110
 
93
111
  {branches.map((branch, i) => (
94
- <div key={branchKeys[i]} className="flex items-center gap-2 p-2 border rounded">
95
- <div className="flex-1">
96
- <Input
97
- value={branch.name}
98
- onChange={(e) => updateBranch(i, { name: e.target.value })}
99
- placeholder="Branch name"
100
- className={isBranchDuplicate(branch.name) ? 'border-amber-300 focus:border-amber-500' : ''}
101
- />
102
- {!branch.name.trim() && (
103
- <p className="text-xs text-destructive mt-1">{ERROR_MESSAGES.BRANCH_NAME_EMPTY}</p>
104
- )}
105
- </div>
106
- <Button
107
- variant="ghost"
108
- size="sm"
109
- onClick={() => removeBranch(i)}
110
- className="text-destructive"
111
- aria-label={`Remove branch ${branch.name || i + 1}`}
112
- >
113
- <Trash2 className="h-4 w-4" />
114
- </Button>
115
- </div>
112
+ <BranchEditor
113
+ key={branchKeys[i]}
114
+ branch={branch}
115
+ isDuplicate={isBranchDuplicate(branch.name)}
116
+ comparisonOperators={comparisonOperators}
117
+ onUpdate={(patch) => updateBranch(i, patch)}
118
+ onRemove={() => removeBranch(i)}
119
+ index={i}
120
+ />
116
121
  ))}
117
122
 
118
123
  {branches.length === 0 && (
@@ -123,3 +128,187 @@ export function RouteConfigComponent({
123
128
  </div>
124
129
  );
125
130
  }
131
+
132
+ interface BranchEditorProps {
133
+ branch: Branch;
134
+ isDuplicate: boolean;
135
+ comparisonOperators: ComparisonOperatorOption[];
136
+ onUpdate: (patch: Partial<Branch>) => void;
137
+ onRemove: () => void;
138
+ index: number;
139
+ }
140
+
141
+ function BranchEditor({
142
+ branch,
143
+ isDuplicate,
144
+ comparisonOperators,
145
+ onUpdate,
146
+ onRemove,
147
+ index,
148
+ }: BranchEditorProps) {
149
+ const conditions = branch.when ?? [];
150
+ const [expanded, setExpanded] = React.useState(conditions.length > 0);
151
+
152
+ const addCondition = useCallback(() => {
153
+ const newConditions: BranchCondition[] = [...conditions, { field: '', cmp: 'eq', value: '' }];
154
+ onUpdate({ when: newConditions });
155
+ setExpanded(true);
156
+ }, [conditions, onUpdate]);
157
+
158
+ const updateCondition = useCallback((condIndex: number, patch: Partial<BranchCondition>) => {
159
+ const newConditions = [...conditions];
160
+ newConditions[condIndex] = { ...newConditions[condIndex], ...patch };
161
+ onUpdate({ when: newConditions });
162
+ }, [conditions, onUpdate]);
163
+
164
+ const removeCondition = useCallback((condIndex: number) => {
165
+ onUpdate({ when: conditions.filter((_, i) => i !== condIndex) });
166
+ }, [conditions, onUpdate]);
167
+
168
+ return (
169
+ <div className="border rounded-md overflow-hidden">
170
+ {/* Branch header: name + delete */}
171
+ <div className="flex items-center gap-2 p-2 bg-muted/30">
172
+ <button
173
+ type="button"
174
+ className="flex items-center text-muted-foreground hover:text-foreground transition-colors"
175
+ onClick={() => setExpanded(!expanded)}
176
+ aria-label={expanded ? 'Collapse conditions' : 'Expand conditions'}
177
+ >
178
+ {expanded ? <ChevronDown className="h-3.5 w-3.5" /> : <ChevronRight className="h-3.5 w-3.5" />}
179
+ </button>
180
+ <div className="flex-1">
181
+ <Input
182
+ value={branch.name}
183
+ onChange={(e) => onUpdate({ name: e.target.value })}
184
+ placeholder="Branch name"
185
+ className={`h-8 ${isDuplicate ? 'border-amber-300 focus:border-amber-500' : ''}`}
186
+ />
187
+ {!branch.name.trim() && (
188
+ <p className="text-xs text-destructive mt-1">{ERROR_MESSAGES.BRANCH_NAME_EMPTY}</p>
189
+ )}
190
+ </div>
191
+ <span className="text-xs text-muted-foreground tabular-nums whitespace-nowrap">
192
+ {conditions.length === 0 ? 'catch-all' : `${conditions.length} rule${conditions.length !== 1 ? 's' : ''}`}
193
+ </span>
194
+ <Button
195
+ variant="ghost"
196
+ size="sm"
197
+ onClick={onRemove}
198
+ className="text-destructive h-8 w-8 p-0"
199
+ aria-label={`Remove branch ${branch.name || index + 1}`}
200
+ >
201
+ <Trash2 className="h-4 w-4" />
202
+ </Button>
203
+ </div>
204
+
205
+ {/* Conditions section */}
206
+ {expanded && (
207
+ <div className="p-2 space-y-2 border-t">
208
+ {conditions.length === 0 ? (
209
+ <p className="text-xs text-muted-foreground italic py-1">
210
+ All records (catch-all) -- add conditions to filter records into this branch
211
+ </p>
212
+ ) : (
213
+ <>
214
+ <p className="text-xs text-muted-foreground font-medium">
215
+ Conditions (all must match):
216
+ </p>
217
+ {conditions.map((cond, ci) => (
218
+ <ConditionRow
219
+ key={ci}
220
+ condition={cond}
221
+ comparisonOperators={comparisonOperators}
222
+ onUpdate={(patch) => updateCondition(ci, patch)}
223
+ onRemove={() => removeCondition(ci)}
224
+ />
225
+ ))}
226
+ </>
227
+ )}
228
+ <Button variant="outline" size="sm" className="h-7 text-xs" onClick={addCondition}>
229
+ <Plus className="h-3 w-3 mr-1" />
230
+ Add Condition
231
+ </Button>
232
+ </div>
233
+ )}
234
+ </div>
235
+ );
236
+ }
237
+
238
+ interface ConditionRowProps {
239
+ condition: BranchCondition;
240
+ comparisonOperators: ComparisonOperatorOption[];
241
+ onUpdate: (patch: Partial<BranchCondition>) => void;
242
+ onRemove: () => void;
243
+ }
244
+
245
+ function ConditionRow({ condition, comparisonOperators, onUpdate, onRemove }: ConditionRowProps) {
246
+ const operatorDef = comparisonOperators.find((op) => op.value === condition.cmp);
247
+ const showValueInput = !operatorDef?.noValue;
248
+
249
+ return (
250
+ <div className="flex items-center gap-1.5">
251
+ {/* Field path */}
252
+ <Input
253
+ value={condition.field}
254
+ onChange={(e) => onUpdate({ field: e.target.value })}
255
+ placeholder="field.path"
256
+ className="flex-1 h-7 text-xs font-mono"
257
+ />
258
+
259
+ {/* Comparison operator */}
260
+ <Select value={condition.cmp} onValueChange={(v) => onUpdate({ cmp: v })}>
261
+ <SelectTrigger className="w-[120px] h-7 text-xs">
262
+ <SelectValue />
263
+ </SelectTrigger>
264
+ <SelectContent>
265
+ {comparisonOperators.map((op) => (
266
+ <SelectItem key={op.value} value={op.value}>
267
+ {op.label}
268
+ </SelectItem>
269
+ ))}
270
+ </SelectContent>
271
+ </Select>
272
+
273
+ {/* Value */}
274
+ {showValueInput && (
275
+ <Input
276
+ value={formatConditionValue(condition.value)}
277
+ onChange={(e) => onUpdate({ value: parseConditionValue(e.target.value) })}
278
+ placeholder="value"
279
+ className="flex-1 h-7 text-xs"
280
+ />
281
+ )}
282
+
283
+ {/* Remove */}
284
+ <Button
285
+ variant="ghost"
286
+ size="sm"
287
+ className="h-7 w-7 p-0 shrink-0"
288
+ onClick={onRemove}
289
+ aria-label="Remove condition"
290
+ >
291
+ <Trash2 className="h-3 w-3 text-destructive" />
292
+ </Button>
293
+ </div>
294
+ );
295
+ }
296
+
297
+ function formatConditionValue(value: unknown): string {
298
+ if (value === null) return 'null';
299
+ if (value === undefined) return '';
300
+ if (typeof value === 'boolean') return String(value);
301
+ if (typeof value === 'number') return String(value);
302
+ return String(value);
303
+ }
304
+
305
+ function parseConditionValue(raw: string): unknown {
306
+ const trimmed = raw.trim();
307
+ if (trimmed === 'null') return null;
308
+ if (trimmed === 'true') return true;
309
+ if (trimmed === 'false') return false;
310
+ if (trimmed !== '' && !isNaN(Number(trimmed)) && trimmed === String(Number(trimmed))) {
311
+ return Number(trimmed);
312
+ }
313
+ return raw;
314
+ }
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { useMemo, useCallback } from 'react';
2
+ import { useMemo, useCallback, useEffect } from 'react';
3
3
  import {
4
4
  Button,
5
5
  Input,
@@ -158,9 +158,11 @@ export function StepConfigPanel({
158
158
  [stepType, data.config?.operators]
159
159
  );
160
160
 
161
+ const hasSpecialConfigEditor = stepType in SPECIAL_CONFIG_EDITORS;
162
+
161
163
  const needsAdapterSelection = useMemo(
162
- () => !adapterCode && !hasMultiOperatorConfig && stepType !== STEP_TYPE.TRIGGER,
163
- [adapterCode, hasMultiOperatorConfig, stepType]
164
+ () => !adapterCode && !hasMultiOperatorConfig && stepType !== STEP_TYPE.TRIGGER && !hasSpecialConfigEditor,
165
+ [adapterCode, hasMultiOperatorConfig, stepType, hasSpecialConfigEditor]
164
166
  );
165
167
 
166
168
  const dynamicFields = React.useMemo<AdapterSchemaField[]>(
@@ -194,7 +196,6 @@ export function StepConfigPanel({
194
196
  onChange({
195
197
  ...data,
196
198
  adapterCode: code,
197
- config: { ...data.config, adapterCode: code },
198
199
  });
199
200
  }, [onChange, data]);
200
201
 
@@ -210,11 +211,24 @@ export function StepConfigPanel({
210
211
  }, [updateKey]);
211
212
 
212
213
  const handleAdapterCodeChange = useCallback((code: string) => {
213
- if (code !== adapterCode) {
214
+ if (code && code !== adapterCode) {
214
215
  updateAdapterCode(code);
215
216
  }
216
217
  }, [adapterCode, updateAdapterCode]);
217
218
 
219
+ // Auto-select the sole adapter for step types with a special config editor
220
+ // (e.g., ROUTE has exactly one ROUTER adapter: "condition"). This prevents
221
+ // the user from having to manually pick the only available adapter.
222
+ useEffect(() => {
223
+ if (
224
+ stepType in SPECIAL_CONFIG_EDITORS &&
225
+ !adapterCode &&
226
+ availableAdapters.length === 1
227
+ ) {
228
+ handleAdapterCodeChange(availableAdapters[0].code);
229
+ }
230
+ }, [stepType, adapterCode, availableAdapters, handleAdapterCodeChange]);
231
+
218
232
  const handleResetDefaults = useCallback(() => {
219
233
  const defaults: Record<string, unknown> = {};
220
234
  for (const f of dynamicFields) {
@@ -226,7 +240,7 @@ export function StepConfigPanel({
226
240
  }, [dynamicFields, updateConfigBatch]);
227
241
 
228
242
  const handleTriggerChange = useCallback((trigger: PipelineTrigger) => {
229
- updateConfigBatch({
243
+ const batch: Record<string, unknown> = {
230
244
  type: trigger.type,
231
245
  enabled: trigger.enabled,
232
246
  cron: trigger.cron,
@@ -234,9 +248,12 @@ export function StepConfigPanel({
234
248
  webhookCode: trigger.webhookCode,
235
249
  authentication: trigger.authentication,
236
250
  secretCode: trigger.secretCode,
237
- event: trigger.eventType,
238
- eventType: trigger.eventType,
239
- });
251
+ event: trigger.event,
252
+ };
253
+ // Preserve nested config objects (message, fileWatch) for complex triggers
254
+ if (trigger.message) batch.message = trigger.message;
255
+ if (trigger.fileWatch) batch.fileWatch = trigger.fileWatch;
256
+ updateConfigBatch(batch);
240
257
  }, [updateConfigBatch]);
241
258
 
242
259
  const triggerValue = useMemo(() => ({
@@ -247,8 +264,10 @@ export function StepConfigPanel({
247
264
  webhookCode: data.config?.webhookCode as string,
248
265
  authentication: data.config?.authentication as PipelineTrigger['authentication'],
249
266
  secretCode: data.config?.secretCode as string,
250
- eventType: (data.config?.event as string) || (data.config?.eventType as string),
251
- }), [data.config?.type, data.config?.enabled, data.config?.cron, data.config?.timezone, data.config?.webhookCode, data.config?.authentication, data.config?.secretCode, data.config?.event, data.config?.eventType]);
267
+ event: data.config?.event as string,
268
+ message: data.config?.message as Record<string, unknown> | undefined,
269
+ fileWatch: data.config?.fileWatch as Record<string, unknown> | undefined,
270
+ }), [data.config?.type, data.config?.enabled, data.config?.cron, data.config?.timezone, data.config?.webhookCode, data.config?.authentication, data.config?.secretCode, data.config?.event, data.config?.message, data.config?.fileWatch]);
252
271
 
253
272
  const renderHeader = () => {
254
273
  if (!showHeader) return null;
@@ -339,6 +358,7 @@ export function StepConfigPanel({
339
358
  trigger={triggerValue}
340
359
  onChange={handleTriggerChange}
341
360
  compact={compact}
361
+ secretCodes={secretOptions.map(s => s.code)}
342
362
  />
343
363
  );
344
364
  };
@@ -363,9 +383,9 @@ export function StepConfigPanel({
363
383
  );
364
384
  }
365
385
 
366
- // Steps with built-in config editors don't need the adapter selector empty state
386
+ // Steps with built-in config editors handle their own source/type selection
367
387
  const hasBuiltInConfig = stepType in SPECIAL_CONFIG_EDITORS;
368
- if (hasBuiltInConfig && availableAdapters.length === 0) return null;
388
+ if (hasBuiltInConfig) return null;
369
389
 
370
390
  return (
371
391
  <div className={compact ? 'space-y-2' : 'space-y-3'}>
@@ -404,16 +424,16 @@ export function StepConfigPanel({
404
424
  )}
405
425
 
406
426
  {selectedAdapter && (
407
- <div className="flex items-center gap-2 p-2 bg-muted/50 rounded border">
427
+ <div className="flex items-start gap-2 p-2 bg-muted/50 rounded border">
408
428
  <div
409
- className="w-7 h-7 rounded flex items-center justify-center text-white shrink-0"
429
+ className="w-7 h-7 rounded flex items-center justify-center text-white shrink-0 mt-0.5"
410
430
  style={{ backgroundColor: selectedAdapter.color }}
411
431
  >
412
432
  <selectedAdapter.icon className="w-3.5 h-3.5" />
413
433
  </div>
414
- <div className="min-w-0">
434
+ <div className="min-w-0 flex-1">
415
435
  <div className="font-medium text-sm truncate">{selectedAdapter.name}</div>
416
- <div className="text-xs text-muted-foreground truncate">
436
+ <div className="text-xs text-muted-foreground line-clamp-2">
417
437
  {selectedAdapter.description}
418
438
  </div>
419
439
  </div>
@@ -76,8 +76,8 @@ export function ValidateConfigComponent({
76
76
  const ruleTypes = ruleTypeSchemas;
77
77
  const { options: validationModes } = useOptionValues('validationModes');
78
78
  const errorHandlingOptions = validationModes;
79
- const errorHandlingMode = (config.errorHandlingMode as string) || 'FAIL_FAST';
80
- const validationMode = (config.validationMode as string) || 'STRICT';
79
+ const errorHandlingMode = (config.errorHandlingMode as string) || '';
80
+ const validationMode = (config.validationMode as string) || '';
81
81
  const rawRules = (config.rules as ValidationRule[]) || [];
82
82
  const stableIds = useStableIndexIds(rawRules, 'validation-rule');
83
83
  const rules = useMemo<ValidationRuleWithId[]>(() =>
@@ -93,7 +93,8 @@ export const SKELETON_WIDTHS = [80, 120, 100, 140] as const;
93
93
  * Panel widths for drawers and side panels
94
94
  */
95
95
  export const PANEL_WIDTHS = {
96
- PROPERTIES_DEFAULT: '420px',
96
+ PROPERTIES_DEFAULT: '520px',
97
+ PROPERTIES_MIN: '380px',
97
98
  NODE_PALETTE: 'w-[260px]',
98
99
  MAX_VW: '90vw',
99
100
  } as const;
@@ -7,6 +7,7 @@ export const PIPELINE_EDITOR_PANEL = {
7
7
  STEPS: 'steps',
8
8
  TRIGGERS: 'triggers',
9
9
  SETTINGS: 'settings',
10
+ HOOKS: 'hooks',
10
11
  } as const;
11
12
  export type PipelineEditorPanel = typeof PIPELINE_EDITOR_PANEL[keyof typeof PIPELINE_EDITOR_PANEL];
12
13
 
@@ -2673,9 +2673,13 @@ export type DataHubPipelineRun = Node & {
2673
2673
  __typename?: 'DataHubPipelineRun';
2674
2674
  /** Checkpoint data for resumable pipelines: { lastProcessedId, cursor, state } */
2675
2675
  checkpoint?: Maybe<Scalars['JSON']['output']>;
2676
+ /** Alias for finishedAt — when the run reached a terminal state */
2677
+ completedAt?: Maybe<Scalars['DateTime']['output']>;
2676
2678
  createdAt: Scalars['DateTime']['output'];
2677
2679
  /** Error message if run failed */
2678
2680
  error?: Maybe<Scalars['String']['output']>;
2681
+ /** Alias for error — error message if the run failed */
2682
+ errorMessage?: Maybe<Scalars['String']['output']>;
2679
2683
  finishedAt?: Maybe<Scalars['DateTime']['output']>;
2680
2684
  id: Scalars['ID']['output'];
2681
2685
  /** Execution metrics: { recordsProcessed, recordsFailed, stepMetrics, duration, etc. } */
@@ -2693,8 +2697,10 @@ export type DataHubPipelineRun = Node & {
2693
2697
  export type DataHubPipelineRunFilterParameter = {
2694
2698
  _and?: InputMaybe<Array<DataHubPipelineRunFilterParameter>>;
2695
2699
  _or?: InputMaybe<Array<DataHubPipelineRunFilterParameter>>;
2700
+ completedAt?: InputMaybe<DateOperators>;
2696
2701
  createdAt?: InputMaybe<DateOperators>;
2697
2702
  error?: InputMaybe<StringOperators>;
2703
+ errorMessage?: InputMaybe<StringOperators>;
2698
2704
  finishedAt?: InputMaybe<DateOperators>;
2699
2705
  id?: InputMaybe<IdOperators>;
2700
2706
  startedAt?: InputMaybe<DateOperators>;
@@ -2724,8 +2730,10 @@ export type DataHubPipelineRunListOptions = {
2724
2730
  };
2725
2731
 
2726
2732
  export type DataHubPipelineRunSortParameter = {
2733
+ completedAt?: InputMaybe<SortOrder>;
2727
2734
  createdAt?: InputMaybe<SortOrder>;
2728
2735
  error?: InputMaybe<SortOrder>;
2736
+ errorMessage?: InputMaybe<SortOrder>;
2729
2737
  finishedAt?: InputMaybe<SortOrder>;
2730
2738
  id?: InputMaybe<SortOrder>;
2731
2739
  startedAt?: InputMaybe<SortOrder>;
@@ -5280,7 +5288,11 @@ export type Mutation = {
5280
5288
  settleRefund: SettleRefundResult;
5281
5289
  /** Simulate load step - checks what would be created/updated without writing */
5282
5290
  simulateDataHubLoad: Scalars['JSON']['output'];
5283
- /** Simulate transform step - applies transforms to input records */
5291
+ /**
5292
+ * Simulate transform step - applies transforms to input records.
5293
+ * The step argument expects a JSON object with shape:
5294
+ * { config: { operators: [{ op: string, args: Record<string, any> }] } }
5295
+ */
5284
5296
  simulateDataHubTransform: Array<Scalars['JSON']['output']>;
5285
5297
  /** Simulate validate step - runs validation rules on input records */
5286
5298
  simulateDataHubValidate: DataHubValidateResult;
@@ -1,6 +1,5 @@
1
1
  import * as React from 'react';
2
2
  import {
3
- GitBranch,
4
3
  Settings,
5
4
  type LucideIcon,
6
5
  } from 'lucide-react';
@@ -143,24 +142,6 @@ function buildAdapterMetadata(adapter: {
143
142
  };
144
143
  }
145
144
 
146
- const CORE_ADAPTERS: AdapterMetadata[] = [
147
- {
148
- code: 'condition',
149
- type: 'ROUTER',
150
- name: 'Condition',
151
- description: 'Route records based on conditions',
152
- icon: GitBranch,
153
- color: '#f97316',
154
- category: UI_ADAPTER_CATEGORY.ROUTING,
155
- nodeType: 'condition',
156
- schema: {
157
- fields: [
158
- { key: 'expression', label: 'Condition Expression', type: 'text', required: true, description: 'JavaScript expression to evaluate (e.g., price > 100)' },
159
- ],
160
- },
161
- },
162
- ];
163
-
164
145
  interface UseAdapterCatalogResult {
165
146
  catalog: AdapterCatalog;
166
147
  adapters: AdapterMetadata[];
@@ -178,19 +159,10 @@ export function useAdapterCatalog(): UseAdapterCatalogResult {
178
159
  const { data: connectionCodesData } = useConnectionCodes();
179
160
  const { data: secretsData } = useSecrets({ take: QUERY_LIMITS.SECRETS_LIST });
180
161
 
181
- const adapters: AdapterMetadata[] = React.useMemo(() => {
182
- const rawAdapters = adaptersData ?? [];
183
- const mapped = rawAdapters.map(buildAdapterMetadata);
184
-
185
- const codes = new Set(mapped.map(a => a.code));
186
- for (const core of CORE_ADAPTERS) {
187
- if (!codes.has(core.code)) {
188
- mapped.push(core);
189
- }
190
- }
191
-
192
- return mapped;
193
- }, [adaptersData]);
162
+ const adapters: AdapterMetadata[] = React.useMemo(
163
+ () => (adaptersData ?? []).map(buildAdapterMetadata),
164
+ [adaptersData],
165
+ );
194
166
 
195
167
  const catalog: AdapterCatalog = React.useMemo(() => {
196
168
  const sources = adapters.filter(a => a.category === UI_ADAPTER_CATEGORY.SOURCES);
@@ -24,7 +24,13 @@ import {
24
24
 
25
25
  export const connectionDetail: DashboardRouteDefinition = {
26
26
  path: `${ROUTES.CONNECTIONS}/$id`,
27
- loader: detailPageRouteLoader({ queryDocument: connectionDetailDocument, breadcrumb: (isNew, entity) => ['Data Hub', 'Connections', isNew ? 'New connection' : (entity?.code ?? '')] }),
27
+ loader: detailPageRouteLoader({
28
+ queryDocument: connectionDetailDocument,
29
+ breadcrumb: (isNew, entity) => [
30
+ { path: ROUTES.CONNECTIONS, label: 'Connections' },
31
+ isNew ? 'New connection' : (entity?.code ?? ''),
32
+ ],
33
+ }),
28
34
  component: route => (
29
35
  <PermissionGuard requires={[DATAHUB_PERMISSIONS.MANAGE_CONNECTIONS]}>
30
36
  <ConnectionDetailPage route={route} />
@@ -174,7 +174,7 @@ export function RunDetailsPanel({ runId, initialData, onCancel, onRerun, isCance
174
174
  </div>
175
175
  <div className="text-sm">
176
176
  <div className="text-sm font-medium mb-1">Finished</div>
177
- <div>{formatDateTime(run?.finishedAt ?? initialData.finishedAt)}</div>
177
+ <div>{(run?.finishedAt ?? initialData.finishedAt) ? formatDateTime(run?.finishedAt ?? initialData.finishedAt) : '—'}</div>
178
178
  </div>
179
179
 
180
180
  {run?.error && (
@@ -134,11 +134,11 @@ export function PipelineActionButtons({
134
134
  const canPublish = status === PIPELINE_STATUS.DRAFT || status === PIPELINE_STATUS.REVIEW;
135
135
 
136
136
  return (
137
- <div className="flex items-center gap-2">
137
+ <div className="flex flex-wrap items-center gap-2">
138
138
  <PipelineImportDialog onImport={onImport} />
139
139
  <PipelineExportDialog definition={definition} />
140
140
 
141
- <div className="mx-1 h-6 w-px bg-border" />
141
+ <div className="mx-1 hidden sm:block h-6 w-px bg-border" />
142
142
 
143
143
  <PermissionGuard requires={[DATAHUB_PERMISSIONS.RUN_PIPELINE]}>
144
144
  <Button
@@ -168,7 +168,7 @@ export function PipelineActionButtons({
168
168
  </Button>
169
169
  </PermissionGuard>
170
170
 
171
- <div className="mx-1 h-6 w-px bg-border" />
171
+ <div className="mx-1 hidden sm:block h-6 w-px bg-border" />
172
172
 
173
173
  <Button
174
174
  variant="ghost"
@@ -148,7 +148,7 @@ export function toVisualDefinition(
148
148
  const nodes: PipelineNode[] = steps.map((step, i) => {
149
149
  const id = String(step.key ?? `step-${i}`);
150
150
  const category = mapStepTypeToCategory(step.type);
151
- const adapterCode = step.config?.adapterCode;
151
+ const adapterCode = step.adapterCode ?? step.config?.adapterCode;
152
152
  const label = step.name || step.key || `Step ${i + 1}`;
153
153
 
154
154
  return {
@@ -220,10 +220,8 @@ export function toCanonicalDefinition(
220
220
  key: node.id ?? `step-${idx}`,
221
221
  type: stepType,
222
222
  name: node.data?.label,
223
- config: {
224
- ...restConfig,
225
- adapterCode,
226
- },
223
+ adapterCode: adapterCode || undefined,
224
+ config: restConfig,
227
225
  };
228
226
  });
229
227
 
@@ -27,9 +27,10 @@ export function formatKey(key: string): string {
27
27
  .trim();
28
28
  }
29
29
 
30
- export function formatDateTime(date: Date | string | number, options?: Intl.DateTimeFormatOptions): string {
30
+ export function formatDateTime(date: Date | string | number | null | undefined, options?: Intl.DateTimeFormatOptions): string {
31
+ if (date == null || date === '') return '\u2014';
31
32
  const dateObj = date instanceof Date ? date : new Date(date);
32
- if (isNaN(dateObj.getTime())) return '\u2014';
33
+ if (isNaN(dateObj.getTime()) || dateObj.getFullYear() < 2000) return '\u2014';
33
34
 
34
35
  const defaultOptions: Intl.DateTimeFormatOptions = {
35
36
  year: 'numeric',
@@ -42,9 +43,10 @@ export function formatDateTime(date: Date | string | number, options?: Intl.Date
42
43
  return dateObj.toLocaleString('en-US', options || defaultOptions);
43
44
  }
44
45
 
45
- export function formatSmartDateTime(date: Date | string | number): string {
46
+ export function formatSmartDateTime(date: Date | string | number | null | undefined): string {
47
+ if (date == null || date === '') return '\u2014';
46
48
  const dateObj = date instanceof Date ? date : new Date(date);
47
- if (isNaN(dateObj.getTime())) return '\u2014';
49
+ if (isNaN(dateObj.getTime()) || dateObj.getFullYear() < 2000) return '\u2014';
48
50
 
49
51
  const now = new Date();
50
52
  const isToday = dateObj.toDateString() === now.toDateString();