@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
@@ -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>
@@ -0,0 +1,289 @@
1
+ import * as React from 'react';
2
+ import { useCallback, useRef, useMemo, useState } from 'react';
3
+ import {
4
+ Button,
5
+ Dialog,
6
+ DialogContent,
7
+ DialogHeader,
8
+ DialogTitle,
9
+ } from '@vendure/dashboard';
10
+ import { Maximize2, Minimize2, WandSparkles } from 'lucide-react';
11
+
12
+ /**
13
+ * Lightweight JavaScript formatter. Handles indentation, brace/bracket alignment,
14
+ * semicolon insertion, and basic whitespace normalization without external deps.
15
+ */
16
+ function formatJavaScript(code: string): string {
17
+ if (!code.trim()) return code;
18
+
19
+ const lines = code.split('\n');
20
+ let indent = 0;
21
+ const indentStr = ' ';
22
+ const result: string[] = [];
23
+
24
+ for (const rawLine of lines) {
25
+ let line = rawLine.trim();
26
+ if (!line) {
27
+ // Preserve blank lines (max 1 consecutive)
28
+ if (result.length > 0 && result[result.length - 1] !== '') {
29
+ result.push('');
30
+ }
31
+ continue;
32
+ }
33
+
34
+ // Decrease indent for closing braces/brackets/parens
35
+ if (/^[}\])]/.test(line)) {
36
+ indent = Math.max(0, indent - 1);
37
+ }
38
+
39
+ // Apply current indentation
40
+ result.push(indentStr.repeat(indent) + line);
41
+
42
+ // Increase indent for opening braces/brackets (not in strings/comments)
43
+ const stripped = line.replace(/\/\/.*$/, '').replace(/'[^']*'|"[^"]*"|`[^`]*`/g, '""');
44
+ const opens = (stripped.match(/[{(\[]/g) || []).length;
45
+ const closes = (stripped.match(/[})\]]/g) || []).length;
46
+ indent = Math.max(0, indent + opens - closes);
47
+ }
48
+
49
+ // Remove trailing blank lines
50
+ while (result.length > 0 && result[result.length - 1] === '') {
51
+ result.pop();
52
+ }
53
+
54
+ return result.join('\n');
55
+ }
56
+
57
+ export interface CodeEditorProps {
58
+ id: string;
59
+ value: string;
60
+ onChange: (value: string) => void;
61
+ placeholder?: string;
62
+ disabled?: boolean;
63
+ rows: number;
64
+ className?: string;
65
+ showFormatButton?: boolean;
66
+ }
67
+
68
+ /**
69
+ * Code editor with line numbers, Tab key support, and synchronized scroll.
70
+ * Used by both SchemaFormRenderer (TextareaField) and OperatorFieldInput.
71
+ */
72
+ export function CodeEditor({
73
+ id,
74
+ value,
75
+ onChange,
76
+ placeholder,
77
+ disabled,
78
+ rows,
79
+ className,
80
+ showFormatButton,
81
+ }: CodeEditorProps) {
82
+ const textareaRef = useRef<HTMLTextAreaElement>(null);
83
+
84
+ const lineCount = useMemo(() => {
85
+ const lines = (value || '').split('\n').length;
86
+ return Math.max(lines, rows);
87
+ }, [value, rows]);
88
+
89
+ const lineNumbers = useMemo(
90
+ () => Array.from({ length: lineCount }, (_, i) => i + 1),
91
+ [lineCount],
92
+ );
93
+
94
+ const handleChange = useCallback(
95
+ (e: React.ChangeEvent<HTMLTextAreaElement>) => {
96
+ onChange(e.target.value);
97
+ },
98
+ [onChange],
99
+ );
100
+
101
+ const handleKeyDown = useCallback(
102
+ (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
103
+ if (e.key === 'Tab') {
104
+ e.preventDefault();
105
+ const ta = e.currentTarget;
106
+ const start = ta.selectionStart;
107
+ const end = ta.selectionEnd;
108
+ const newValue = value.substring(0, start) + ' ' + value.substring(end);
109
+ onChange(newValue);
110
+ requestAnimationFrame(() => {
111
+ ta.selectionStart = ta.selectionEnd = start + 2;
112
+ });
113
+ }
114
+ // Enter key: auto-indent to match current line
115
+ if (e.key === 'Enter') {
116
+ const ta = e.currentTarget;
117
+ const start = ta.selectionStart;
118
+ const lineStart = value.lastIndexOf('\n', start - 1) + 1;
119
+ const currentLine = value.substring(lineStart, start);
120
+ const match = currentLine.match(/^(\s*)/);
121
+ const currentIndent = match ? match[1] : '';
122
+
123
+ // Add extra indent if line ends with { or (
124
+ const trimmed = currentLine.trimEnd();
125
+ const extraIndent = /[{(\[]$/.test(trimmed) ? ' ' : '';
126
+
127
+ e.preventDefault();
128
+ const newValue = value.substring(0, start) + '\n' + currentIndent + extraIndent + value.substring(ta.selectionEnd);
129
+ onChange(newValue);
130
+ const newPos = start + 1 + currentIndent.length + extraIndent.length;
131
+ requestAnimationFrame(() => {
132
+ ta.selectionStart = ta.selectionEnd = newPos;
133
+ });
134
+ }
135
+ },
136
+ [value, onChange],
137
+ );
138
+
139
+ const handleScroll = useCallback(() => {
140
+ const ta = textareaRef.current;
141
+ const gutter = ta?.parentElement?.querySelector('[data-gutter]') as HTMLElement | null;
142
+ if (ta && gutter) {
143
+ gutter.scrollTop = ta.scrollTop;
144
+ }
145
+ }, []);
146
+
147
+ const handleFormat = useCallback(() => {
148
+ onChange(formatJavaScript(value));
149
+ }, [value, onChange]);
150
+
151
+ return (
152
+ <div className={`relative rounded-md border border-input bg-background overflow-hidden focus-within:ring-1 focus-within:ring-ring ${className ?? ''}`}>
153
+ {showFormatButton && (
154
+ <div className="flex items-center justify-between px-2 py-1 bg-muted/30 border-b border-input">
155
+ <span className="text-[10px] font-mono text-muted-foreground uppercase tracking-wider">JavaScript</span>
156
+ <Button
157
+ variant="ghost"
158
+ size="sm"
159
+ className="h-5 text-[10px] gap-1 px-1.5 text-muted-foreground hover:text-foreground"
160
+ onClick={handleFormat}
161
+ type="button"
162
+ disabled={disabled}
163
+ >
164
+ <WandSparkles className="h-3 w-3" />
165
+ Format
166
+ </Button>
167
+ </div>
168
+ )}
169
+ <div className="flex">
170
+ <div
171
+ data-gutter
172
+ className="flex flex-col items-end pt-2 pb-2 px-2 bg-muted/50 text-muted-foreground text-xs font-mono select-none overflow-hidden border-r border-input"
173
+ style={{ minWidth: '2.5rem' }}
174
+ aria-hidden="true"
175
+ >
176
+ {lineNumbers.map((n) => (
177
+ <div key={n} className="leading-5 h-5">{n}</div>
178
+ ))}
179
+ </div>
180
+ <textarea
181
+ ref={textareaRef}
182
+ id={id}
183
+ value={value ?? ''}
184
+ onChange={handleChange}
185
+ onKeyDown={handleKeyDown}
186
+ onScroll={handleScroll}
187
+ placeholder={placeholder}
188
+ disabled={disabled}
189
+ rows={rows}
190
+ spellCheck={false}
191
+ className="flex-1 resize-none bg-transparent p-2 font-mono text-sm leading-5 outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50"
192
+ style={{ tabSize: 2 }}
193
+ />
194
+ </div>
195
+ </div>
196
+ );
197
+ }
198
+
199
+ export interface CodeEditorWithExpandProps {
200
+ id: string;
201
+ label: string;
202
+ value: string;
203
+ onChange: (value: string) => void;
204
+ placeholder?: string;
205
+ disabled?: boolean;
206
+ rows?: number;
207
+ description?: string;
208
+ }
209
+
210
+ /**
211
+ * Code editor with an Expand button that opens a fullscreen dialog.
212
+ * Wraps CodeEditor with expand/collapse functionality.
213
+ * Includes Format button for JavaScript code formatting.
214
+ */
215
+ export function CodeEditorWithExpand({
216
+ id,
217
+ label,
218
+ value,
219
+ onChange,
220
+ placeholder,
221
+ disabled,
222
+ rows = 10,
223
+ description,
224
+ }: CodeEditorWithExpandProps) {
225
+ const [expanded, setExpanded] = useState(false);
226
+
227
+ return (
228
+ <div className="space-y-1">
229
+ <div className="flex justify-end">
230
+ <Button
231
+ variant="ghost"
232
+ size="sm"
233
+ className="h-6 text-xs gap-1"
234
+ onClick={() => setExpanded(true)}
235
+ type="button"
236
+ >
237
+ <Maximize2 className="h-3 w-3" />
238
+ Expand
239
+ </Button>
240
+ </div>
241
+
242
+ <CodeEditor
243
+ id={id}
244
+ value={value}
245
+ onChange={onChange}
246
+ placeholder={placeholder}
247
+ disabled={disabled}
248
+ rows={rows}
249
+ showFormatButton
250
+ />
251
+
252
+ {description && (
253
+ <p className="text-[11px] text-muted-foreground leading-relaxed mt-1">{description}</p>
254
+ )}
255
+
256
+ <Dialog open={expanded} onOpenChange={setExpanded}>
257
+ <DialogContent className="max-w-4xl h-[80vh] flex flex-col">
258
+ <DialogHeader className="flex-row items-center justify-between pr-8">
259
+ <DialogTitle className="font-mono text-sm">
260
+ {label}
261
+ </DialogTitle>
262
+ <Button
263
+ variant="ghost"
264
+ size="sm"
265
+ className="h-6 text-xs gap-1"
266
+ onClick={() => setExpanded(false)}
267
+ type="button"
268
+ >
269
+ <Minimize2 className="h-3 w-3" />
270
+ Collapse
271
+ </Button>
272
+ </DialogHeader>
273
+ <div className="flex-1 min-h-0">
274
+ <CodeEditor
275
+ id={`${id}-expanded`}
276
+ value={value}
277
+ onChange={onChange}
278
+ placeholder={placeholder}
279
+ disabled={disabled}
280
+ rows={30}
281
+ className="h-full"
282
+ showFormatButton
283
+ />
284
+ </div>
285
+ </DialogContent>
286
+ </Dialog>
287
+ </div>
288
+ );
289
+ }