@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
@@ -0,0 +1,597 @@
1
+ # Multi-Entity Mode Guide
2
+
3
+ Complete guide to configurable nested entity modes in the Data Hub plugin.
4
+
5
+ ---
6
+
7
+ ## Introduction
8
+
9
+ ### What Are Nested Entity Modes?
10
+
11
+ Nested entity modes control how arrays of related entities are handled during imports:
12
+ - **Customer addresses** - array of address objects
13
+ - **Product facet values** - array of facet assignments
14
+ - **Order line items** - array of products in the order
15
+ - **Product assets** - array of images
16
+ - And more...
17
+
18
+ ### The Problem
19
+
20
+ **Without explicit modes**, re-running import pipelines can cause data corruption:
21
+
22
+ ```typescript
23
+ // Import customer with 2 addresses
24
+ .load('import-customers', {
25
+ addressesField: 'addresses'
26
+ })
27
+
28
+ // Run 1: Customer has 2 addresses ✅
29
+ // Run 2: Customer has 4 addresses ❌ (duplicates!)
30
+ // Run 3: Customer has 6 addresses ❌ (more duplicates!)
31
+ ```
32
+
33
+ The root cause: The loader always created new nested entities without checking for existing ones.
34
+
35
+ ### The Solution
36
+
37
+ **Configurable modes** give you full control over how nested entities are managed:
38
+
39
+ ```typescript
40
+ .load('import-customers', {
41
+ addressesMode: 'UPSERT_BY_MATCH', // ← Smart matching prevents duplicates
42
+ addressMatchFields: 'streetLine1,city,postalCode,countryCode'
43
+ })
44
+
45
+ // Run 1-10: Customer always has exactly 2 addresses ✅
46
+ ```
47
+
48
+ ---
49
+
50
+ ## Mode Categories
51
+
52
+ ### 1. Matching Modes (Smart Upsert)
53
+
54
+ **Pattern**: Match by specific fields, update if exists, create if not
55
+
56
+ **Modes**: `UPSERT_BY_MATCH`, `UPSERT_BY_URL`, `UPSERT_BY_NAME`, `MERGE_BY_SKU`, `UPDATE_BY_ID`
57
+
58
+ **When to use**:
59
+ - Source system doesn't track Vendure IDs
60
+ - Want to prevent duplicates automatically
61
+ - Data can be uniquely identified by business fields
62
+ - **Most common use case** - recommended default
63
+
64
+ **Example - Customer addresses:**
65
+ ```typescript
66
+ .load('import-customers', {
67
+ addressesMode: 'UPSERT_BY_MATCH', // ← Prevents duplicate addresses
68
+ addressMatchFields: 'streetLine1,city,countryCode'
69
+ })
70
+
71
+ // Without addressesMode: Run 1 = 2 addresses, Run 2 = 4 addresses (duplicates)
72
+ // With addressesMode: Run 1-100 = always 2 addresses
73
+ ```
74
+
75
+ **How it works**:
76
+ 1. For each new address, check existing addresses
77
+ 2. Match by specified fields (e.g., street + city + country)
78
+ 3. If match found → update existing address
79
+ 4. If no match → create new address
80
+ 5. Result: No duplicates!
81
+
82
+ **Customizable matching**:
83
+ ```typescript
84
+ // Match by street + city + country (default)
85
+ addressMatchFields: 'streetLine1,city,countryCode'
86
+
87
+ // Match by street + city + postal code + country (more specific)
88
+ addressMatchFields: 'streetLine1,city,postalCode,countryCode'
89
+
90
+ // Match by street only (less specific - may incorrectly match)
91
+ addressMatchFields: 'streetLine1' // ⚠️ Too broad
92
+ ```
93
+
94
+ ---
95
+
96
+ ### 2. Replacement Modes (Full Control)
97
+
98
+ **Pattern**: Remove all existing, create new from source data
99
+
100
+ **Modes**: `REPLACE_ALL`
101
+
102
+ **When to use**:
103
+ - Source system is single source of truth
104
+ - Want complete control over nested entities
105
+ - Cleaning up old/stale data
106
+
107
+ **Example - Product facets:**
108
+ ```typescript
109
+ .load('sync-products-from-pim', {
110
+ adapterCode: 'productUpsert',
111
+ strategy: 'UPSERT',
112
+ facetValuesMode: 'REPLACE_ALL' // PIM controls all facet assignments
113
+ })
114
+
115
+ // PIM says: [color-red, size-large]
116
+ // Result: Vendure has exactly [color-red, size-large]
117
+ // Old facets removed, new facets added
118
+ ```
119
+
120
+ **Supported by**: All modes support `REPLACE_ALL`
121
+
122
+ ---
123
+
124
+ ### 2. Merge Modes (Additive)
125
+
126
+ **Pattern**: Add new items, keep existing ones
127
+
128
+ **Modes**: `MERGE`, `APPEND_ONLY`, `MERGE_BY_SKU`
129
+
130
+ **When to use**:
131
+ - Multiple data sources contribute to same entity
132
+ - Never want to lose existing data
133
+ - Incremental updates only
134
+
135
+ **Example - Facet values from multiple sources:**
136
+ ```typescript
137
+ // Run 1: PIM imports base facets
138
+ .load('import-from-pim', {
139
+ facetValuesMode: 'MERGE'
140
+ })
141
+ // Input: [color-red, size-large]
142
+ // Result: [color-red, size-large]
143
+
144
+ // Run 2: Admin adds manual facets
145
+ .load('enrich-from-admin', {
146
+ facetValuesMode: 'MERGE'
147
+ })
148
+ // Input: [material-cotton, eco-friendly]
149
+ // Result: [color-red, size-large, material-cotton, eco-friendly] ✅
150
+ ```
151
+
152
+ **Example - Order lines smart merging:**
153
+ ```typescript
154
+ .load('add-order-items', {
155
+ adapterCode: 'orderUpsert',
156
+ linesMode: 'MERGE_BY_SKU' // Update quantities, add new SKUs
157
+ })
158
+
159
+ // Existing order: PROD-A qty:2
160
+ // Input: PROD-A qty:5, PROD-B qty:1
161
+ // Result: PROD-A qty:5 (updated), PROD-B qty:1 (added) ✅
162
+ ```
163
+
164
+ **Difference between MERGE and APPEND_ONLY**:
165
+ - `MERGE`: Deduplicates (same facet won't be added twice)
166
+ - `APPEND_ONLY`: Allows duplicates (useful for history tracking)
167
+ - `MERGE_BY_SKU`: Smart merging based on SKU match (order lines only)
168
+
169
+ ---
170
+
171
+ ### 3. Removal Modes
172
+
173
+ **Pattern**: Remove specified items from entity
174
+
175
+ **Modes**: `REMOVE`
176
+
177
+ **When to use**:
178
+ - Removing discontinued or incorrect assignments
179
+ - Cleaning up specific facets/groups
180
+
181
+ **Example - Remove discontinued facets:**
182
+ ```typescript
183
+ .load('remove-old-facets', {
184
+ adapterCode: 'productUpsert',
185
+ strategy: 'UPDATE',
186
+ facetValuesMode: 'REMOVE'
187
+ })
188
+
189
+ // Existing facets: [color-red, size-large, season-2023]
190
+ // Input: [season-2023] // Remove this facet
191
+ // Result: [color-red, size-large] ✅
192
+ ```
193
+
194
+ ---
195
+
196
+ ### 4. Skip Mode
197
+
198
+ **Pattern**: Don't touch nested entities at all
199
+
200
+ **Modes**: `SKIP`
201
+
202
+ **When to use**:
203
+ - Partial updates - only modifying specific fields
204
+ - Want to leave nested entities completely unchanged
205
+
206
+ **Example - Update prices without touching facets:**
207
+ ```typescript
208
+ .load('update-prices-only', {
209
+ adapterCode: 'productUpsert',
210
+ strategy: 'UPDATE',
211
+ priceField: 'newPrice',
212
+ facetValuesMode: 'SKIP', // Don't modify facets
213
+ assetsMode: 'SKIP' // Don't modify images
214
+ })
215
+
216
+ // Only updates price field, everything else unchanged ✅
217
+ ```
218
+
219
+ ---
220
+
221
+ ## All Implemented Modes Reference
222
+
223
+ ### Customer Loader
224
+
225
+ **addressesMode** - Control customer address management
226
+
227
+ | Mode | Behavior |
228
+ |------|----------|
229
+ | `UPSERT_BY_MATCH` | Match by fields, update existing or create new (default, **recommended**) |
230
+ | `REPLACE_ALL` | Delete all addresses, create new from source |
231
+ | `APPEND_ONLY` | Always create new (allows duplicates - rare) |
232
+ | `UPDATE_BY_ID` | Update by Vendure ID, create if no ID |
233
+ | `SKIP` | Don't modify addresses |
234
+
235
+ **Configuration:**
236
+ ```typescript
237
+ .load('import-customers', {
238
+ adapterCode: 'customerUpsert',
239
+ addressesMode: 'UPSERT_BY_MATCH', // Default
240
+ addressMatchFields: 'streetLine1,city,countryCode' // Customizable
241
+ })
242
+ ```
243
+
244
+ **This mode prevents duplicate addresses** by matching existing addresses before creating new ones. Without it, every pipeline run would create duplicate addresses.
245
+
246
+ **groupsMode** - Control customer group assignments
247
+
248
+ | Mode | Behavior |
249
+ |------|----------|
250
+ | `REPLACE_ALL` | Remove all groups, assign new (default) |
251
+ | `MERGE` | Add new groups, keep existing |
252
+ | `REMOVE` | Remove specified groups |
253
+ | `SKIP` | Don't modify groups |
254
+
255
+ ---
256
+
257
+ ### Product Loader
258
+
259
+ **facetValuesMode** - Control facet value assignments
260
+
261
+ | Mode | Behavior |
262
+ |------|----------|
263
+ | `REPLACE_ALL` | Replace all facets (default) |
264
+ | `MERGE` | Add new, keep existing |
265
+ | `REMOVE` | Remove specified facets |
266
+ | `SKIP` | Don't touch facets |
267
+
268
+ **Configuration:**
269
+ ```typescript
270
+ .load('upsert-products', {
271
+ adapterCode: 'productUpsert',
272
+ facetValuesMode: 'MERGE'
273
+ })
274
+ ```
275
+
276
+ ---
277
+
278
+ ### Product Variant Loader
279
+
280
+ **facetValuesMode** - Control facet value assignments (same as Product)
281
+
282
+ | Mode | Behavior |
283
+ |------|----------|
284
+ | `REPLACE_ALL` | Replace all facets (default) |
285
+ | `MERGE` | Add new, keep existing |
286
+ | `REMOVE` | Remove specified facets |
287
+ | `SKIP` | Don't touch facets |
288
+
289
+ **Configuration:**
290
+ ```typescript
291
+ .load('upsert-variants', {
292
+ adapterCode: 'variantUpsert',
293
+ skuField: 'sku',
294
+ facetValuesMode: 'SKIP' // Don't modify facets
295
+ })
296
+ ```
297
+
298
+ ---
299
+
300
+ ### Order Loader
301
+
302
+ **linesMode** - Control order line item management
303
+
304
+ | Mode | Behavior |
305
+ |------|----------|
306
+ | `REPLACE_ALL` | Remove all lines, add new (default) |
307
+ | `MERGE_BY_SKU` | Update quantities for existing SKUs, add new |
308
+ | `APPEND_ONLY` | Always add new lines (allows duplicates) |
309
+ | `SKIP` | Don't modify order lines |
310
+
311
+ **Configuration:**
312
+ ```typescript
313
+ .load('update-orders', {
314
+ adapterCode: 'orderUpsert',
315
+ codeField: 'orderCode',
316
+ linesMode: 'MERGE_BY_SKU'
317
+ })
318
+ ```
319
+
320
+ ---
321
+
322
+ ## Decision Guide: Which Mode to Use?
323
+
324
+ ### For Facet Values (Product/Variant)
325
+
326
+ | Scenario | Recommended Mode |
327
+ |----------|-----------------|
328
+ | PIM is single source of truth | `REPLACE_ALL` |
329
+ | Multiple sources add facets | `MERGE` |
330
+ | Removing specific facets | `REMOVE` |
331
+ | Only updating prices/stock | `SKIP` |
332
+
333
+ ### For Order Lines
334
+
335
+ | Scenario | Recommended Mode |
336
+ |----------|-----------------|
337
+ | Full order import/migration | `REPLACE_ALL` |
338
+ | Adding items to existing order | `MERGE_BY_SKU` |
339
+ | Order modification history | `APPEND_ONLY` |
340
+ | Only updating order state | `SKIP` |
341
+
342
+ ---
343
+
344
+ ## Best Practices
345
+
346
+ ### 1. Always Specify Modes Explicitly
347
+
348
+ ```typescript
349
+ // ❌ Bad: Relies on defaults
350
+ .load('upsert-products', {})
351
+
352
+ // ✅ Good: Explicit configuration
353
+ .load('upsert-products', {
354
+ facetValuesMode: 'REPLACE_ALL'
355
+ })
356
+ ```
357
+
358
+ **Why**: Defaults may change in future versions, explicit config prevents surprises.
359
+
360
+ ---
361
+
362
+ ### 2. Use SKIP for Partial Updates
363
+
364
+ When updating only specific fields, explicitly skip nested entities:
365
+
366
+ ```typescript
367
+ // Updating product descriptions only
368
+ .load('update-descriptions', {
369
+ strategy: 'UPDATE',
370
+ descriptionField: 'newDescription',
371
+ facetValuesMode: 'SKIP', // ← Don't accidentally clear facets
372
+ })
373
+ ```
374
+
375
+ ---
376
+
377
+ ### 3. Document Your Mode Choices
378
+
379
+ Add comments explaining why you chose each mode:
380
+
381
+ ```typescript
382
+ .load('import-products', {
383
+ // PIM controls all facet assignments - replace completely
384
+ facetValuesMode: 'REPLACE_ALL',
385
+
386
+ // Images come from multiple sources - merge them
387
+ assetsMode: 'MERGE',
388
+ })
389
+ ```
390
+
391
+ ---
392
+
393
+ ### 4. Test with Dry Run First
394
+
395
+ Always test mode configuration before production:
396
+
397
+ ```bash
398
+ npm run pipeline:run my-pipeline --dry-run
399
+ ```
400
+
401
+ ---
402
+
403
+ ### 5. Choose the Right Merge Strategy
404
+
405
+ **For deduplication**: Use `MERGE`
406
+ ```typescript
407
+ facetValuesMode: 'MERGE' // Won't add duplicate facets
408
+ ```
409
+
410
+ **For history tracking**: Use `APPEND_ONLY`
411
+ ```typescript
412
+ addressesMode: 'APPEND_ONLY' // Keeps address history (rare)
413
+ ```
414
+
415
+ **For smart updates**: Use SKU-based merging
416
+ ```typescript
417
+ linesMode: 'MERGE_BY_SKU' // Updates quantities intelligently
418
+ ```
419
+
420
+ ---
421
+
422
+ ## Complete Examples
423
+
424
+ ### Example 1: Product Catalog from Multiple Sources
425
+
426
+ ```typescript
427
+ // Step 1: Import base products from PIM
428
+ PipelineBuilder.create('import-from-pim')
429
+ .extract('pim-products', {
430
+ adapterCode: 'httpApi',
431
+ url: 'https://pim.example.com/api/products'
432
+ })
433
+ .load('create-products', {
434
+ adapterCode: 'productUpsert',
435
+ strategy: 'UPSERT',
436
+ facetValuesMode: 'REPLACE_ALL', // PIM controls facets
437
+ assetsMode: 'REPLACE_ALL' // PIM controls images
438
+ })
439
+
440
+ // Step 2: Enrich with additional facets from admin
441
+ PipelineBuilder.create('enrich-from-admin')
442
+ .extract('admin-enrichment', {
443
+ adapterCode: 'csv',
444
+ filePath: 'admin-facets.csv'
445
+ })
446
+ .load('add-facets', {
447
+ adapterCode: 'productUpsert',
448
+ strategy: 'UPDATE',
449
+ facetValuesMode: 'MERGE', // Add to existing facets
450
+ assetsMode: 'SKIP' // Don't touch images
451
+ })
452
+ ```
453
+
454
+ ---
455
+
456
+ ### Example 2: Order Migration with Line Management
457
+
458
+ ```typescript
459
+ PipelineBuilder.create('migrate-legacy-orders')
460
+ .extract('legacy-orders', {
461
+ adapterCode: 'database',
462
+ query: 'SELECT * FROM legacy_orders'
463
+ })
464
+ .transform('map-fields', {
465
+ operators: [
466
+ { op: 'copy', args: { source: 'order_id', target: 'code' } },
467
+ { op: 'copy', args: { source: 'customer_email', target: 'customerEmail' } },
468
+ ]
469
+ })
470
+ .load('create-orders', {
471
+ adapterCode: 'orderUpsert',
472
+ strategy: 'CREATE',
473
+ codeField: 'code',
474
+ linesMode: 'REPLACE_ALL', // Complete order import
475
+ stateField: 'finalState',
476
+ orderPlacedAtField: 'originalDate'
477
+ })
478
+ ```
479
+
480
+ ---
481
+
482
+ ### Example 3: Incremental Product Updates
483
+
484
+ ```typescript
485
+ // Daily price updates - don't touch anything else
486
+ PipelineBuilder.create('update-prices-daily')
487
+ .extract('price-feed', {
488
+ adapterCode: 'ftp',
489
+ host: 'ftp.supplier.com',
490
+ path: '/prices/daily.csv'
491
+ })
492
+ .load('update-prices', {
493
+ adapterCode: 'variantUpsert',
494
+ strategy: 'UPDATE',
495
+ skuField: 'sku',
496
+ priceField: 'newPrice',
497
+ facetValuesMode: 'SKIP', // Don't modify facets
498
+ assetsMode: 'SKIP' // Don't modify images
499
+ })
500
+ ```
501
+
502
+ ---
503
+
504
+ ## Troubleshooting
505
+
506
+ ### "I'm still getting duplicates!"
507
+
508
+ **Check**:
509
+ 1. Is the mode explicitly set? Defaults may not match your expectation
510
+ 2. Using `MERGE` instead of `APPEND_ONLY`? MERGE deduplicates
511
+ 3. For order lines: Using `MERGE_BY_SKU` instead of `APPEND_ONLY`?
512
+
513
+ **Solution**: Set explicit mode
514
+ ```typescript
515
+ facetValuesMode: 'REPLACE_ALL' // or MERGE, never APPEND_ONLY for facets
516
+ linesMode: 'MERGE_BY_SKU' // for smart order line merging
517
+ ```
518
+
519
+ ---
520
+
521
+ ### "My nested entities aren't updating"
522
+
523
+ **Check**:
524
+ 1. Mode set to `SKIP`? Change to `REPLACE_ALL` or `MERGE`
525
+ 2. Field name correct? (`linesField`, not `lineItems`)
526
+ 3. Strategy allows updates? Must be `UPDATE` or `UPSERT`
527
+
528
+ **Solution**:
529
+ ```typescript
530
+ .load('update-entity', {
531
+ strategy: 'UPDATE', // ← Allow updates
532
+ facetValuesMode: 'MERGE', // ← Not SKIP
533
+ facetValueCodesField: 'facets' // ← Correct field name
534
+ })
535
+ ```
536
+
537
+ ---
538
+
539
+ ### "MERGE_BY_SKU isn't working for my order lines"
540
+
541
+ **Requirements**:
542
+ - Order must exist (use `UPDATE` or `UPSERT` strategy)
543
+ - SKU field must be correctly mapped
544
+ - Variants must exist in Vendure
545
+
546
+ **Correct configuration**:
547
+ ```typescript
548
+ .load('update-order-lines', {
549
+ adapterCode: 'orderUpsert',
550
+ strategy: 'UPDATE', // ← Order must exist
551
+ codeField: 'orderCode',
552
+ linesField: 'items',
553
+ linesMode: 'MERGE_BY_SKU'
554
+ })
555
+ ```
556
+
557
+ ---
558
+
559
+ ## Migration Guide
560
+
561
+ ### Adding Explicit Modes to Existing Pipelines
562
+
563
+ **Step 1**: Update pipeline configuration with explicit modes
564
+
565
+ ```typescript
566
+ // Without explicit mode
567
+ .load('import-products', {
568
+ facetValueCodesField: 'facets'
569
+ })
570
+
571
+ // With explicit mode
572
+ .load('import-products', {
573
+ facetValueCodesField: 'facets',
574
+ facetValuesMode: 'REPLACE_ALL' // ← Add this
575
+ })
576
+ ```
577
+
578
+ **Step 2**: Test with dry run
579
+
580
+ ```bash
581
+ npm run pipeline:run my-pipeline --dry-run
582
+ ```
583
+
584
+ **Step 3**: Deploy to production
585
+
586
+ The default modes are chosen to be safe and match most use cases:
587
+ - `facetValuesMode` → `REPLACE_ALL`
588
+ - `linesMode` → `REPLACE_ALL`
589
+
590
+ ---
591
+
592
+ ## Related Documentation
593
+
594
+ - [Loaders Reference](../reference/loaders.md) - Complete API reference
595
+ - [Production Standards](../../PIPELINE-PRODUCTION-STANDARDS.md) - Best practices
596
+ - [Multi-Language Guide](./multi-language.md) - Translation handling
597
+ - [Multi-Channel Guide](./multi-channel.md) - Channel assignment