@oronts/vendure-data-hub-plugin 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -1
- package/README.md +30 -8
- package/dashboard/components/pipelines/PipelineEditor.tsx +159 -5
- package/dashboard/components/pipelines/ReactFlowPipelineEditor.tsx +3 -3
- package/dashboard/components/pipelines/shared/NodePropertiesPanel.tsx +42 -4
- package/dashboard/components/pipelines/shared/StepListItem.tsx +2 -2
- package/dashboard/components/shared/CodeEditor.tsx +289 -0
- package/dashboard/components/shared/schema-form/fields/TextareaField.tsx +19 -4
- package/dashboard/components/shared/step-config/AdapterSelector.tsx +2 -2
- package/dashboard/components/shared/step-config/OperatorFieldInput.tsx +19 -0
- package/dashboard/components/shared/step-config/RouteConfigComponent.tsx +218 -29
- package/dashboard/components/shared/step-config/StepConfigPanel.tsx +37 -17
- package/dashboard/components/shared/step-config/ValidateConfigComponent.tsx +2 -2
- package/dashboard/constants/ui-dimensions.ts +2 -1
- package/dashboard/constants/ui-states.ts +1 -0
- package/dashboard/gql/graphql.ts +13 -1
- package/dashboard/hooks/use-adapter-catalog.ts +4 -32
- package/dashboard/routes/connections/ConnectionDetail.tsx +7 -1
- package/dashboard/routes/pipelines/RunDetailsPanel.tsx +1 -1
- package/dashboard/routes/pipelines/components/PipelineActionButtons.tsx +3 -3
- package/dashboard/routes/pipelines/utils/pipeline-conversion.ts +3 -5
- package/dashboard/utils/formatters.ts +6 -4
- package/dist/dashboard/components/pipelines/PipelineEditor.tsx +159 -5
- package/dist/dashboard/components/pipelines/ReactFlowPipelineEditor.tsx +3 -3
- package/dist/dashboard/components/pipelines/shared/NodePropertiesPanel.tsx +42 -4
- package/dist/dashboard/components/pipelines/shared/StepListItem.tsx +2 -2
- package/dist/dashboard/components/shared/CodeEditor.tsx +289 -0
- package/dist/dashboard/components/shared/schema-form/fields/TextareaField.tsx +19 -4
- package/dist/dashboard/components/shared/step-config/AdapterSelector.tsx +2 -2
- package/dist/dashboard/components/shared/step-config/OperatorFieldInput.tsx +19 -0
- package/dist/dashboard/components/shared/step-config/RouteConfigComponent.tsx +218 -29
- package/dist/dashboard/components/shared/step-config/StepConfigPanel.tsx +37 -17
- package/dist/dashboard/components/shared/step-config/ValidateConfigComponent.tsx +2 -2
- package/dist/dashboard/constants/ui-dimensions.ts +2 -1
- package/dist/dashboard/constants/ui-states.ts +1 -0
- package/dist/dashboard/gql/graphql.ts +13 -1
- package/dist/dashboard/hooks/use-adapter-catalog.ts +4 -32
- package/dist/dashboard/routes/connections/ConnectionDetail.tsx +7 -1
- package/dist/dashboard/routes/pipelines/RunDetailsPanel.tsx +1 -1
- package/dist/dashboard/routes/pipelines/components/PipelineActionButtons.tsx +3 -3
- package/dist/dashboard/routes/pipelines/utils/pipeline-conversion.ts +3 -5
- package/dist/dashboard/utils/formatters.ts +6 -4
- package/dist/shared/types/adapter-config.types.d.ts +148 -4
- package/dist/shared/types/adapter-config.types.d.ts.map +1 -1
- package/dist/shared/types/index.d.ts +1 -1
- package/dist/shared/types/index.d.ts.map +1 -1
- package/dist/shared/types/index.js.map +1 -1
- package/dist/shared/types/loader.types.d.ts +4 -0
- package/dist/shared/types/loader.types.d.ts.map +1 -1
- package/dist/shared/types/step.types.d.ts +6 -0
- package/dist/shared/types/step.types.d.ts.map +1 -1
- package/dist/shared/types/trigger.types.d.ts +0 -4
- package/dist/shared/types/trigger.types.d.ts.map +1 -1
- package/dist/src/adapters/registry.d.ts.map +1 -1
- package/dist/src/adapters/registry.js +2 -1
- package/dist/src/adapters/registry.js.map +1 -1
- package/dist/src/api/controllers/webhook.controller.d.ts +10 -0
- package/dist/src/api/controllers/webhook.controller.d.ts.map +1 -1
- package/dist/src/api/controllers/webhook.controller.js +50 -10
- package/dist/src/api/controllers/webhook.controller.js.map +1 -1
- package/dist/src/api/resolvers/queue.resolver.d.ts +3 -1
- package/dist/src/api/resolvers/queue.resolver.d.ts.map +1 -1
- package/dist/src/api/resolvers/queue.resolver.js +6 -5
- package/dist/src/api/resolvers/queue.resolver.js.map +1 -1
- package/dist/src/api/schema/pipeline.schema.d.ts +1 -1
- package/dist/src/api/schema/pipeline.schema.d.ts.map +1 -1
- package/dist/src/api/schema/pipeline.schema.js +4 -0
- package/dist/src/api/schema/pipeline.schema.js.map +1 -1
- package/dist/src/api/schema/test.schema.d.ts +1 -1
- package/dist/src/api/schema/test.schema.d.ts.map +1 -1
- package/dist/src/api/schema/test.schema.js +5 -1
- package/dist/src/api/schema/test.schema.js.map +1 -1
- package/dist/src/bootstrap/seed-data.js +1 -1
- package/dist/src/bootstrap/seed-data.js.map +1 -1
- package/dist/src/constants/adapter-schema-options.d.ts +65 -0
- package/dist/src/constants/adapter-schema-options.d.ts.map +1 -1
- package/dist/src/constants/adapter-schema-options.js +91 -7
- package/dist/src/constants/adapter-schema-options.js.map +1 -1
- package/dist/src/constants/builtin-adapters.d.ts +1 -1
- package/dist/src/constants/builtin-adapters.d.ts.map +1 -1
- package/dist/src/constants/builtin-adapters.js +19 -1
- package/dist/src/constants/builtin-adapters.js.map +1 -1
- package/dist/src/constants/core.d.ts +10 -0
- package/dist/src/constants/core.d.ts.map +1 -1
- package/dist/src/constants/core.js +10 -0
- package/dist/src/constants/core.js.map +1 -1
- package/dist/src/constants/defaults/webhook-defaults.d.ts +2 -0
- package/dist/src/constants/defaults/webhook-defaults.d.ts.map +1 -1
- package/dist/src/constants/defaults/webhook-defaults.js +2 -0
- package/dist/src/constants/defaults/webhook-defaults.js.map +1 -1
- package/dist/src/constants/enum-metadata.d.ts.map +1 -1
- package/dist/src/constants/enum-metadata.js +3 -0
- package/dist/src/constants/enum-metadata.js.map +1 -1
- package/dist/src/constants/hook-stage-metadata.d.ts.map +1 -1
- package/dist/src/constants/hook-stage-metadata.js +42 -0
- package/dist/src/constants/hook-stage-metadata.js.map +1 -1
- package/dist/src/constants/services.d.ts.map +1 -1
- package/dist/src/constants/services.js +7 -0
- package/dist/src/constants/services.js.map +1 -1
- package/dist/src/constants/time.d.ts +2 -0
- package/dist/src/constants/time.d.ts.map +1 -1
- package/dist/src/constants/time.js +2 -0
- package/dist/src/constants/time.js.map +1 -1
- package/dist/src/data-hub.plugin.d.ts.map +1 -1
- package/dist/src/data-hub.plugin.js +2 -2
- package/dist/src/data-hub.plugin.js.map +1 -1
- package/dist/src/entities/pipeline/pipeline-run.entity.d.ts +4 -0
- package/dist/src/entities/pipeline/pipeline-run.entity.d.ts.map +1 -1
- package/dist/src/entities/pipeline/pipeline-run.entity.js +8 -0
- package/dist/src/entities/pipeline/pipeline-run.entity.js.map +1 -1
- package/dist/src/extractors/cdc/cdc.extractor.d.ts.map +1 -1
- package/dist/src/extractors/cdc/cdc.extractor.js +7 -2
- package/dist/src/extractors/cdc/cdc.extractor.js.map +1 -1
- package/dist/src/extractors/cdc/types.d.ts +1 -1
- package/dist/src/extractors/cdc/types.d.ts.map +1 -1
- package/dist/src/extractors/extractor-handler-registry.d.ts.map +1 -1
- package/dist/src/extractors/extractor-handler-registry.js +3 -0
- package/dist/src/extractors/extractor-handler-registry.js.map +1 -1
- package/dist/src/extractors/vendure-query/helpers.d.ts +9 -4
- package/dist/src/extractors/vendure-query/helpers.d.ts.map +1 -1
- package/dist/src/extractors/vendure-query/helpers.js +98 -32
- package/dist/src/extractors/vendure-query/helpers.js.map +1 -1
- package/dist/src/extractors/vendure-query/schema.d.ts.map +1 -1
- package/dist/src/extractors/vendure-query/schema.js +13 -0
- package/dist/src/extractors/vendure-query/schema.js.map +1 -1
- package/dist/src/feeds/generators/csv-feed.generator.d.ts.map +1 -1
- package/dist/src/feeds/generators/csv-feed.generator.js +5 -4
- package/dist/src/feeds/generators/csv-feed.generator.js.map +1 -1
- package/dist/src/feeds/generators/facebook-catalog.generator.d.ts.map +1 -1
- package/dist/src/feeds/generators/facebook-catalog.generator.js +83 -114
- package/dist/src/feeds/generators/facebook-catalog.generator.js.map +1 -1
- package/dist/src/feeds/generators/feed-constants.d.ts +1 -0
- package/dist/src/feeds/generators/feed-constants.d.ts.map +1 -1
- package/dist/src/feeds/generators/feed-constants.js +1 -0
- package/dist/src/feeds/generators/feed-constants.js.map +1 -1
- package/dist/src/feeds/generators/feed-helpers.d.ts +10 -8
- package/dist/src/feeds/generators/feed-helpers.d.ts.map +1 -1
- package/dist/src/feeds/generators/feed-helpers.js +24 -4
- package/dist/src/feeds/generators/feed-helpers.js.map +1 -1
- package/dist/src/feeds/generators/feed-item-builder.d.ts +59 -0
- package/dist/src/feeds/generators/feed-item-builder.d.ts.map +1 -0
- package/dist/src/feeds/generators/feed-item-builder.js +93 -0
- package/dist/src/feeds/generators/feed-item-builder.js.map +1 -0
- package/dist/src/feeds/generators/google-shopping.generator.d.ts.map +1 -1
- package/dist/src/feeds/generators/google-shopping.generator.js +52 -64
- package/dist/src/feeds/generators/google-shopping.generator.js.map +1 -1
- package/dist/src/feeds/generators/json-feed.generator.d.ts.map +1 -1
- package/dist/src/feeds/generators/json-feed.generator.js +4 -3
- package/dist/src/feeds/generators/json-feed.generator.js.map +1 -1
- package/dist/src/feeds/generators/xml-feed.generator.d.ts.map +1 -1
- package/dist/src/feeds/generators/xml-feed.generator.js +6 -5
- package/dist/src/feeds/generators/xml-feed.generator.js.map +1 -1
- package/dist/src/gql/generated.d.ts +13 -1
- package/dist/src/gql/generated.d.ts.map +1 -1
- package/dist/src/gql/generated.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/loaders/asset/asset.loader.d.ts.map +1 -1
- package/dist/src/loaders/asset/asset.loader.js +5 -1
- package/dist/src/loaders/asset/asset.loader.js.map +1 -1
- package/dist/src/loaders/base/validation-builder.d.ts +128 -3
- package/dist/src/loaders/base/validation-builder.d.ts.map +1 -1
- package/dist/src/loaders/base/validation-builder.js +177 -6
- package/dist/src/loaders/base/validation-builder.js.map +1 -1
- package/dist/src/loaders/collection/collection.loader.d.ts.map +1 -1
- package/dist/src/loaders/collection/collection.loader.js +22 -1
- package/dist/src/loaders/collection/collection.loader.js.map +1 -1
- package/dist/src/loaders/collection/helpers.d.ts +16 -1
- package/dist/src/loaders/collection/helpers.d.ts.map +1 -1
- package/dist/src/loaders/collection/helpers.js +37 -0
- package/dist/src/loaders/collection/helpers.js.map +1 -1
- package/dist/src/loaders/customer/customer.loader.d.ts.map +1 -1
- package/dist/src/loaders/customer/customer.loader.js +13 -1
- package/dist/src/loaders/customer/customer.loader.js.map +1 -1
- package/dist/src/loaders/customer/helpers.d.ts +15 -3
- package/dist/src/loaders/customer/helpers.d.ts.map +1 -1
- package/dist/src/loaders/customer/helpers.js +188 -7
- package/dist/src/loaders/customer/helpers.js.map +1 -1
- package/dist/src/loaders/facet-value/facet-value.loader.d.ts.map +1 -1
- package/dist/src/loaders/facet-value/facet-value.loader.js +18 -0
- package/dist/src/loaders/facet-value/facet-value.loader.js.map +1 -1
- package/dist/src/loaders/facet-value/types.d.ts +1 -1
- package/dist/src/loaders/facet-value/types.js +1 -1
- package/dist/src/loaders/facet-value/types.js.map +1 -1
- package/dist/src/loaders/order/helpers.d.ts +16 -2
- package/dist/src/loaders/order/helpers.d.ts.map +1 -1
- package/dist/src/loaders/order/helpers.js +108 -0
- package/dist/src/loaders/order/helpers.js.map +1 -1
- package/dist/src/loaders/order/order.loader.d.ts +38 -0
- package/dist/src/loaders/order/order.loader.d.ts.map +1 -1
- package/dist/src/loaders/order/order.loader.js +238 -24
- package/dist/src/loaders/order/order.loader.js.map +1 -1
- package/dist/src/loaders/order/types.d.ts +10 -3
- package/dist/src/loaders/order/types.d.ts.map +1 -1
- package/dist/src/loaders/order/types.js +13 -2
- package/dist/src/loaders/order/types.js.map +1 -1
- package/dist/src/loaders/product/product.loader.d.ts.map +1 -1
- package/dist/src/loaders/product/product.loader.js +18 -2
- package/dist/src/loaders/product/product.loader.js.map +1 -1
- package/dist/src/loaders/product-variant/helpers.d.ts +20 -0
- package/dist/src/loaders/product-variant/helpers.d.ts.map +1 -0
- package/dist/src/loaders/product-variant/helpers.js +103 -0
- package/dist/src/loaders/product-variant/helpers.js.map +1 -0
- package/dist/src/loaders/product-variant/product-variant.loader.d.ts.map +1 -1
- package/dist/src/loaders/product-variant/product-variant.loader.js +76 -10
- package/dist/src/loaders/product-variant/product-variant.loader.js.map +1 -1
- package/dist/src/loaders/product-variant/types.d.ts +7 -0
- package/dist/src/loaders/product-variant/types.d.ts.map +1 -1
- package/dist/src/loaders/product-variant/types.js.map +1 -1
- package/dist/src/loaders/promotion/helpers.d.ts +29 -0
- package/dist/src/loaders/promotion/helpers.d.ts.map +1 -1
- package/dist/src/loaders/promotion/helpers.js +68 -0
- package/dist/src/loaders/promotion/helpers.js.map +1 -1
- package/dist/src/loaders/promotion/promotion.loader.d.ts.map +1 -1
- package/dist/src/loaders/promotion/promotion.loader.js +12 -2
- package/dist/src/loaders/promotion/promotion.loader.js.map +1 -1
- package/dist/src/loaders/shared-helpers.d.ts +42 -2
- package/dist/src/loaders/shared-helpers.d.ts.map +1 -1
- package/dist/src/loaders/shared-helpers.js +384 -5
- package/dist/src/loaders/shared-helpers.js.map +1 -1
- package/dist/src/operators/data/copy.operator.js +2 -2
- package/dist/src/operators/data/copy.operator.js.map +1 -1
- package/dist/src/operators/data/rename.operator.js +1 -1
- package/dist/src/operators/data/rename.operator.js.map +1 -1
- package/dist/src/operators/helpers.d.ts.map +1 -1
- package/dist/src/operators/helpers.js +11 -1
- package/dist/src/operators/helpers.js.map +1 -1
- package/dist/src/operators/operator-runtime-registry.d.ts +2 -2
- package/dist/src/operators/operator-runtime-registry.d.ts.map +1 -1
- package/dist/src/operators/operator-runtime-registry.js +1 -1
- package/dist/src/operators/operator-runtime-registry.js.map +1 -1
- package/dist/src/operators/script/script.operators.d.ts.map +1 -1
- package/dist/src/operators/script/script.operators.js +9 -3
- package/dist/src/operators/script/script.operators.js.map +1 -1
- package/dist/src/runtime/config-types.d.ts +6 -0
- package/dist/src/runtime/config-types.d.ts.map +1 -1
- package/dist/src/runtime/executor-helpers.d.ts +77 -0
- package/dist/src/runtime/executor-helpers.d.ts.map +1 -0
- package/dist/src/runtime/executor-helpers.js +143 -0
- package/dist/src/runtime/executor-helpers.js.map +1 -0
- package/dist/src/runtime/executors/export.executor.d.ts +3 -1
- package/dist/src/runtime/executors/export.executor.d.ts.map +1 -1
- package/dist/src/runtime/executors/export.executor.js +15 -3
- package/dist/src/runtime/executors/export.executor.js.map +1 -1
- package/dist/src/runtime/executors/exporters/export-handler-registry.d.ts.map +1 -1
- package/dist/src/runtime/executors/exporters/export-handler-registry.js +5 -0
- package/dist/src/runtime/executors/exporters/export-handler-registry.js.map +1 -1
- package/dist/src/runtime/executors/exporters/export-handler.types.d.ts +3 -0
- package/dist/src/runtime/executors/exporters/export-handler.types.d.ts.map +1 -1
- package/dist/src/runtime/executors/exporters/export-handler.types.js.map +1 -1
- package/dist/src/runtime/executors/exporters/export-helpers.d.ts +1 -0
- package/dist/src/runtime/executors/exporters/export-helpers.d.ts.map +1 -1
- package/dist/src/runtime/executors/exporters/export-helpers.js +32 -3
- package/dist/src/runtime/executors/exporters/export-helpers.js.map +1 -1
- package/dist/src/runtime/executors/exporters/http-export.handler.js +4 -4
- package/dist/src/runtime/executors/exporters/http-export.handler.js.map +1 -1
- package/dist/src/runtime/executors/extractors/file-extract.handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/extractors/file-extract.handler.js +33 -13
- package/dist/src/runtime/executors/extractors/file-extract.handler.js.map +1 -1
- package/dist/src/runtime/executors/extractors/memory-extract.handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/extractors/memory-extract.handler.js +17 -9
- package/dist/src/runtime/executors/extractors/memory-extract.handler.js.map +1 -1
- package/dist/src/runtime/executors/feed.executor.d.ts.map +1 -1
- package/dist/src/runtime/executors/feed.executor.js +11 -2
- package/dist/src/runtime/executors/feed.executor.js.map +1 -1
- package/dist/src/runtime/executors/feeds/feed-handler-registry.d.ts.map +1 -1
- package/dist/src/runtime/executors/feeds/feed-handler-registry.js +4 -0
- package/dist/src/runtime/executors/feeds/feed-handler-registry.js.map +1 -1
- package/dist/src/runtime/executors/gate.executor.d.ts +3 -1
- package/dist/src/runtime/executors/gate.executor.d.ts.map +1 -1
- package/dist/src/runtime/executors/gate.executor.js +47 -26
- package/dist/src/runtime/executors/gate.executor.js.map +1 -1
- package/dist/src/runtime/executors/loaders/channel-handler.d.ts +3 -1
- package/dist/src/runtime/executors/loaders/channel-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/channel-handler.js +14 -4
- package/dist/src/runtime/executors/loaders/channel-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/collection-handler.d.ts +14 -2
- package/dist/src/runtime/executors/loaders/collection-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/collection-handler.js +93 -22
- package/dist/src/runtime/executors/loaders/collection-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/customer-group-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/customer-group-handler.js +2 -27
- package/dist/src/runtime/executors/loaders/customer-group-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/customer-handler.d.ts +6 -1
- package/dist/src/runtime/executors/loaders/customer-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/customer-handler.js +95 -13
- package/dist/src/runtime/executors/loaders/customer-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/deletion-handler.d.ts +39 -0
- package/dist/src/runtime/executors/loaders/deletion-handler.d.ts.map +1 -0
- package/dist/src/runtime/executors/loaders/deletion-handler.js +414 -0
- package/dist/src/runtime/executors/loaders/deletion-handler.js.map +1 -0
- package/dist/src/runtime/executors/loaders/facet-handler.d.ts +18 -3
- package/dist/src/runtime/executors/loaders/facet-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/facet-handler.js +127 -26
- package/dist/src/runtime/executors/loaders/facet-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/index.d.ts +2 -0
- package/dist/src/runtime/executors/loaders/index.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/index.js +5 -1
- package/dist/src/runtime/executors/loaders/index.js.map +1 -1
- package/dist/src/runtime/executors/loaders/inventory-adjust-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/inventory-adjust-handler.js +2 -28
- package/dist/src/runtime/executors/loaders/inventory-adjust-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/inventory-handler.d.ts +2 -1
- package/dist/src/runtime/executors/loaders/inventory-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/inventory-handler.js +8 -6
- package/dist/src/runtime/executors/loaders/inventory-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/loader-handler-registry.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/loader-handler-registry.js +117 -3
- package/dist/src/runtime/executors/loaders/loader-handler-registry.js.map +1 -1
- package/dist/src/runtime/executors/loaders/order-handler.d.ts +31 -3
- package/dist/src/runtime/executors/loaders/order-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/order-handler.js +194 -14
- package/dist/src/runtime/executors/loaders/order-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/order-upsert-handler.d.ts +15 -0
- package/dist/src/runtime/executors/loaders/order-upsert-handler.d.ts.map +1 -0
- package/dist/src/runtime/executors/loaders/order-upsert-handler.js +89 -0
- package/dist/src/runtime/executors/loaders/order-upsert-handler.js.map +1 -0
- package/dist/src/runtime/executors/loaders/payment-method-handler.d.ts +11 -2
- package/dist/src/runtime/executors/loaders/payment-method-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/payment-method-handler.js +78 -33
- package/dist/src/runtime/executors/loaders/payment-method-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/product-handler.d.ts +14 -0
- package/dist/src/runtime/executors/loaders/product-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/product-handler.js +91 -19
- package/dist/src/runtime/executors/loaders/product-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/promotion-handler.d.ts +9 -2
- package/dist/src/runtime/executors/loaders/promotion-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/promotion-handler.js +115 -68
- package/dist/src/runtime/executors/loaders/promotion-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/shared-lookups.d.ts +35 -1
- package/dist/src/runtime/executors/loaders/shared-lookups.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/shared-lookups.js +102 -0
- package/dist/src/runtime/executors/loaders/shared-lookups.js.map +1 -1
- package/dist/src/runtime/executors/loaders/shipping-method-handler.d.ts +11 -6
- package/dist/src/runtime/executors/loaders/shipping-method-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/shipping-method-handler.js +168 -61
- package/dist/src/runtime/executors/loaders/shipping-method-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/stock-location-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/stock-location-handler.js +2 -27
- package/dist/src/runtime/executors/loaders/stock-location-handler.js.map +1 -1
- package/dist/src/runtime/executors/loaders/variant-handler.d.ts.map +1 -1
- package/dist/src/runtime/executors/loaders/variant-handler.js +85 -12
- package/dist/src/runtime/executors/loaders/variant-handler.js.map +1 -1
- package/dist/src/runtime/executors/sink-handler-registry.d.ts +7 -11
- package/dist/src/runtime/executors/sink-handler-registry.d.ts.map +1 -1
- package/dist/src/runtime/executors/sink-handler-registry.js +374 -8
- package/dist/src/runtime/executors/sink-handler-registry.js.map +1 -1
- package/dist/src/runtime/executors/sink.executor.d.ts +1 -0
- package/dist/src/runtime/executors/sink.executor.d.ts.map +1 -1
- package/dist/src/runtime/executors/sink.executor.js +82 -12
- package/dist/src/runtime/executors/sink.executor.js.map +1 -1
- package/dist/src/runtime/executors/transform.executor.d.ts.map +1 -1
- package/dist/src/runtime/executors/transform.executor.js +31 -2
- package/dist/src/runtime/executors/transform.executor.js.map +1 -1
- package/dist/src/runtime/orchestration/graph-executor.d.ts.map +1 -1
- package/dist/src/runtime/orchestration/graph-executor.js +3 -2
- package/dist/src/runtime/orchestration/graph-executor.js.map +1 -1
- package/dist/src/runtime/orchestration/helpers.d.ts +4 -1
- package/dist/src/runtime/orchestration/helpers.d.ts.map +1 -1
- package/dist/src/runtime/orchestration/helpers.js +7 -2
- package/dist/src/runtime/orchestration/helpers.js.map +1 -1
- package/dist/src/runtime/orchestration/linear-executor.d.ts.map +1 -1
- package/dist/src/runtime/orchestration/linear-executor.js +3 -2
- package/dist/src/runtime/orchestration/linear-executor.js.map +1 -1
- package/dist/src/runtime/orchestration/replay-executor.d.ts.map +1 -1
- package/dist/src/runtime/orchestration/replay-executor.js +3 -2
- package/dist/src/runtime/orchestration/replay-executor.js.map +1 -1
- package/dist/src/runtime/orchestration/step-strategies/export-step.strategy.d.ts.map +1 -1
- package/dist/src/runtime/orchestration/step-strategies/export-step.strategy.js +12 -12
- package/dist/src/runtime/orchestration/step-strategies/export-step.strategy.js.map +1 -1
- package/dist/src/runtime/orchestration/step-strategies/feed-step.strategy.d.ts.map +1 -1
- package/dist/src/runtime/orchestration/step-strategies/feed-step.strategy.js +12 -12
- package/dist/src/runtime/orchestration/step-strategies/feed-step.strategy.js.map +1 -1
- package/dist/src/runtime/orchestration/step-strategies/load-step.strategy.js +2 -2
- package/dist/src/runtime/orchestration/step-strategies/load-step.strategy.js.map +1 -1
- package/dist/src/runtime/orchestration/step-strategies/sink-step.strategy.d.ts.map +1 -1
- package/dist/src/runtime/orchestration/step-strategies/sink-step.strategy.js +12 -12
- package/dist/src/runtime/orchestration/step-strategies/sink-step.strategy.js.map +1 -1
- package/dist/src/runtime/orchestration/step-strategies/step-dispatcher.d.ts.map +1 -1
- package/dist/src/runtime/orchestration/step-strategies/step-dispatcher.js +4 -3
- package/dist/src/runtime/orchestration/step-strategies/step-dispatcher.js.map +1 -1
- package/dist/src/runtime/orchestration/step-strategies/transform-step.strategy.js +4 -4
- package/dist/src/runtime/orchestration/step-strategies/transform-step.strategy.js.map +1 -1
- package/dist/src/runtime/orchestration/types.d.ts +1 -0
- package/dist/src/runtime/orchestration/types.d.ts.map +1 -1
- package/dist/src/runtime/utils.d.ts.map +1 -1
- package/dist/src/runtime/utils.js +8 -1
- package/dist/src/runtime/utils.js.map +1 -1
- package/dist/src/sdk/adapters/queue/index.d.ts +1 -0
- package/dist/src/sdk/adapters/queue/index.d.ts.map +1 -1
- package/dist/src/sdk/adapters/queue/index.js +1 -0
- package/dist/src/sdk/adapters/queue/index.js.map +1 -1
- package/dist/src/sdk/adapters/queue/internal.adapter.d.ts +32 -0
- package/dist/src/sdk/adapters/queue/internal.adapter.d.ts.map +1 -0
- package/dist/src/sdk/adapters/queue/internal.adapter.js +68 -0
- package/dist/src/sdk/adapters/queue/internal.adapter.js.map +1 -0
- package/dist/src/sdk/adapters/queue/queue-adapter.registry.d.ts.map +1 -1
- package/dist/src/sdk/adapters/queue/queue-adapter.registry.js +3 -0
- package/dist/src/sdk/adapters/queue/queue-adapter.registry.js.map +1 -1
- package/dist/src/sdk/adapters/queue/rabbitmq.adapter.d.ts.map +1 -1
- package/dist/src/sdk/adapters/queue/rabbitmq.adapter.js +2 -1
- package/dist/src/sdk/adapters/queue/rabbitmq.adapter.js.map +1 -1
- package/dist/src/sdk/constants.d.ts +2 -2
- package/dist/src/sdk/constants.d.ts.map +1 -1
- package/dist/src/sdk/dsl/pipeline-builder.d.ts +8 -2
- package/dist/src/sdk/dsl/pipeline-builder.d.ts.map +1 -1
- package/dist/src/sdk/dsl/pipeline-builder.js +115 -19
- package/dist/src/sdk/dsl/pipeline-builder.js.map +1 -1
- package/dist/src/sdk/dsl/step-configs.d.ts +73 -7
- package/dist/src/sdk/dsl/step-configs.d.ts.map +1 -1
- package/dist/src/services/events/consumer-discovery.d.ts.map +1 -1
- package/dist/src/services/events/consumer-discovery.js +13 -11
- package/dist/src/services/events/consumer-discovery.js.map +1 -1
- package/dist/src/services/events/consumer-lifecycle.d.ts.map +1 -1
- package/dist/src/services/events/consumer-lifecycle.js +19 -15
- package/dist/src/services/events/consumer-lifecycle.js.map +1 -1
- package/dist/src/services/events/event-trigger.service.d.ts.map +1 -1
- package/dist/src/services/events/event-trigger.service.js +8 -3
- package/dist/src/services/events/event-trigger.service.js.map +1 -1
- package/dist/src/services/events/hook.service.d.ts.map +1 -1
- package/dist/src/services/events/hook.service.js +7 -3
- package/dist/src/services/events/hook.service.js.map +1 -1
- package/dist/src/services/events/message-processing.d.ts.map +1 -1
- package/dist/src/services/events/message-processing.js +13 -8
- package/dist/src/services/events/message-processing.js.map +1 -1
- package/dist/src/services/logger/datahub-logger.d.ts +7 -0
- package/dist/src/services/logger/datahub-logger.d.ts.map +1 -1
- package/dist/src/services/logger/datahub-logger.js +9 -0
- package/dist/src/services/logger/datahub-logger.js.map +1 -1
- package/dist/src/services/pipeline/pipeline-runner.service.d.ts +3 -1
- package/dist/src/services/pipeline/pipeline-runner.service.d.ts.map +1 -1
- package/dist/src/services/pipeline/pipeline-runner.service.js +14 -4
- package/dist/src/services/pipeline/pipeline-runner.service.js.map +1 -1
- package/dist/src/services/pipeline/pipeline.service.d.ts.map +1 -1
- package/dist/src/services/pipeline/pipeline.service.js +8 -2
- package/dist/src/services/pipeline/pipeline.service.js.map +1 -1
- package/dist/src/services/storage/retention.service.d.ts.map +1 -1
- package/dist/src/services/storage/retention.service.js +22 -0
- package/dist/src/services/storage/retention.service.js.map +1 -1
- package/dist/src/services/testing/step-test.service.d.ts.map +1 -1
- package/dist/src/services/testing/step-test.service.js +17 -1
- package/dist/src/services/testing/step-test.service.js.map +1 -1
- package/dist/src/services/validation/definition-validation.service.d.ts.map +1 -1
- package/dist/src/services/validation/definition-validation.service.js +4 -1
- package/dist/src/services/validation/definition-validation.service.js.map +1 -1
- package/dist/src/services/validation/trigger-validation.d.ts.map +1 -1
- package/dist/src/services/validation/trigger-validation.js +79 -12
- package/dist/src/services/validation/trigger-validation.js.map +1 -1
- package/dist/src/types/index.d.ts +1 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/loader-configs.d.ts +1071 -0
- package/dist/src/types/loader-configs.d.ts.map +1 -0
- package/dist/src/types/loader-configs.js +54 -0
- package/dist/src/types/loader-configs.js.map +1 -0
- package/dist/src/types/step-configs.d.ts +14 -5
- package/dist/src/types/step-configs.d.ts.map +1 -1
- package/dist/src/types/step-configs.js +3 -0
- package/dist/src/types/step-configs.js.map +1 -1
- package/dist/src/utils/code-security.utils.d.ts +18 -0
- package/dist/src/utils/code-security.utils.d.ts.map +1 -1
- package/dist/src/utils/code-security.utils.js +125 -9
- package/dist/src/utils/code-security.utils.js.map +1 -1
- package/dist/src/validation/pipeline-definition.validator.js +2 -1
- package/dist/src/validation/pipeline-definition.validator.js.map +1 -1
- package/docs/developer-guide/README.md +2 -0
- package/docs/developer-guide/dsl/pipeline-builder.md +12 -0
- package/docs/developer-guide/extending/README.md +230 -10
- package/docs/developer-guide/extending/custom-sinks.md +87 -0
- package/docs/developer-guide/extending/events.md +4 -1
- package/docs/examples/validation-error-messages.md +246 -0
- package/docs/guides/multi-channel.md +1190 -0
- package/docs/guides/multi-currency.md +881 -0
- package/docs/guides/multi-entity.md +597 -0
- package/docs/guides/multi-language.md +957 -0
- package/docs/reference/README.md +11 -4
- package/docs/reference/extractors.md +30 -0
- package/docs/reference/loaders.md +359 -21
- package/docs/reference/operators-complete.md +1251 -0
- package/docs/reference/operators.md +36 -2
- package/docs/reference/sinks.md +7 -6
- package/docs/reference/step-types.md +12 -5
- package/docs/user-guide/pipelines.md +82 -13
- package/package.json +1 -1
- package/shared/types/adapter-config.types.ts +162 -2
- package/shared/types/index.ts +12 -0
- package/shared/types/loader.types.ts +4 -0
- package/shared/types/step.types.ts +6 -0
- package/shared/types/trigger.types.ts +0 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,50 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to the Data Hub Plugin are documented here.
|
|
4
4
|
|
|
5
|
+
## [0.1.5] - 2026-03-05
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Operation-aware sink CRUD**: Sink executor partitions records by `__operation` field (UPSERT/DELETE) and dispatches to appropriate handlers. Delete handlers for all 7 sink engines: MeiliSearch, Elasticsearch, OpenSearch, Algolia, Typesense, Webhook, Queue Producer
|
|
9
|
+
- **Event trigger operation injection**: Vendure entity events (ProductEvent, OrderEvent, etc.) now inject `__operation` (CREATE/UPDATE/DELETE) into seed records, enabling operation-aware pipelines
|
|
10
|
+
- **BEFORE_SINK / AFTER_SINK hooks**: Sink step strategy now supports record-modifying interceptor hooks before and after search index operations
|
|
11
|
+
- **5 hook demo pipelines**: Interceptor demo, Script demo (DI closure), Search enrichment (BEFORE_SINK), Multi-hook chain (proves modifications flow through all stages), All-stages demo (hooks at every step boundary)
|
|
12
|
+
- **Hook stage metadata**: Extended hook stage constants with sink-specific stages and error handling stages
|
|
13
|
+
- **117 e2e test implementations** across 14 loader test files: customer addresses (5 modes), product facet values (4 modes), product assets (4 modes + featured), variant modes (facets/assets/options), order lines (4 modes), collection modes (assets + filters), promotion modes (conditions + actions) — all using shared test helpers
|
|
14
|
+
- **All 257 e2e tests passing** (was 204/259 in v0.1.4)
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
- Shared-helpers `updateViaService()` for ProductVariantService array signature
|
|
18
|
+
- Product variant loader `updateEntity()` uses translations array correctly
|
|
19
|
+
- Security and operator tests: query vs mutation, uppercase adapter types
|
|
20
|
+
- Pipeline execution + error recovery tests: isolated `beforeAll`/`afterAll` per block
|
|
21
|
+
- Variant/collection/promotion mode tests: use correct loader classes (not raw handlers)
|
|
22
|
+
- Customer address handler: UPDATE_BY_ID falls back to APPEND_ONLY correctly
|
|
23
|
+
- Order lines: customer setup + linesMode propagation
|
|
24
|
+
- 14 unused imports removed, `let` → `const` fixes, lint-clean codebase
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- **DRY feed generators**: Extracted `buildBaseFeedItem()` shared across Google/Facebook generators, `flattenTranslationFields()` + `isJsonPrimitive()` in vendure-query helpers, `MAX_SERIALIZATION_DEPTH` constant
|
|
28
|
+
|
|
29
|
+
## [0.1.4] - 2026-03-03
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
- **ROUTE step** with condition-based branching: per-branch condition editors using 19 comparison operators (eq, ne, gt, gte, lt, lte, in, notIn, contains, notContains, startsWith, endsWith, regex, exists, notExists, isNull, isEmpty, isNotEmpty, matches)
|
|
33
|
+
- **dependencyOnly edge type** for graph execution: edges that enforce ordering without passing data
|
|
34
|
+
- **Internal queue adapter** for testing sink/message pipelines without external infrastructure
|
|
35
|
+
- **Stale run cleanup**: runs exceeding 1 hour automatically transition to TIMEOUT status
|
|
36
|
+
- **Webhook HMAC-SHA256 signing** for sink webhook deliveries
|
|
37
|
+
- **Export file registration** in REST API: exported files accessible via `/data-hub/files/:id`
|
|
38
|
+
- **Per-branch condition editors** in dashboard route step configuration
|
|
39
|
+
- **Resizable Configure Node panel** in workflow graph editor
|
|
40
|
+
- **45 example pipelines** (previously 28) covering all step types, operators, and adapter combinations
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
- 9 critical runtime bugs: feed executor batch accumulation, gate timeout scheduling, slugify regex metacharacter injection, dot-notation field access in nested objects, trigger validation for FILE/MESSAGE types, event subscription field name mismatch, schedule activation field propagation, export format selection, and sink error serialization
|
|
44
|
+
- Order import no longer produces NaN on completed orders with calculated totals
|
|
45
|
+
- Trigger validation is now case-insensitive for trigger type matching
|
|
46
|
+
- Webhook authentication errors now return 401 (was 500) for invalid credentials
|
|
47
|
+
- Meilisearch sink correctly indexes both EN and DE translations
|
|
48
|
+
|
|
5
49
|
## [0.1.3] - 2026-02-26
|
|
6
50
|
|
|
7
51
|
### Added
|
|
@@ -167,7 +211,7 @@ Initial production release of the Data Hub Plugin for Vendure.
|
|
|
167
211
|
- **Typesense** - Open-source search engine
|
|
168
212
|
- **Queue Producer** - RabbitMQ/Redis Streams/SQS message publishing
|
|
169
213
|
- **Webhook** - HTTP POST to external services
|
|
170
|
-
- **
|
|
214
|
+
- **OpenSearch** - Open-source search and analytics engine
|
|
171
215
|
|
|
172
216
|
### Advanced Features
|
|
173
217
|
|
|
@@ -451,4 +495,5 @@ Pre-built integration for Pimcore PIM/DAM → Vendure sync:
|
|
|
451
495
|
|
|
452
496
|
## Version History
|
|
453
497
|
|
|
498
|
+
- **0.1.5** (2026-03-05) - Operation-aware sink CRUD, hook demos, 257 e2e tests passing
|
|
454
499
|
- **0.1.0** (2026-02-24) - Initial production release
|
package/README.md
CHANGED
|
@@ -37,18 +37,19 @@ A full-featured ETL (Extract, Transform, Load) plugin for [Vendure](https://www.
|
|
|
37
37
|
- **Visual Pipeline Builder** - Drag-and-drop workflow editor with live validation
|
|
38
38
|
- **Code-First DSL** - TypeScript API for defining pipelines programmatically
|
|
39
39
|
- **9 Data Extractors** - HTTP/REST API, GraphQL, Vendure Query, File (CSV/JSON/XML/XLSX/NDJSON/TSV), Database (SQL), S3, FTP/SFTP, Webhook, CDC (Change Data Capture)
|
|
40
|
-
- **
|
|
40
|
+
- **24 Entity Loaders (16 entity types, 4 order operations, 1 deletion, 2 external API, 1 inventory)** - Products, Variants, Customers, Customer Groups, Collections, Facets, Facet Values, Promotions, Orders (upsert, notes, transitions, coupons), Shipping Methods, Stock Locations, Stock/Inventory, Assets, Tax Rates, Payment Methods, Channels, Entity Deletion, REST POST, GraphQL Mutation
|
|
41
41
|
- **61 Transform Operators** - String (12), Date (5), Numeric (9), Logic (4), JSON (4), Data (8), Enrichment (5), Aggregation (8), Validation (2), Script (1), File (3) - **includes HTTP Lookup with caching, circuit breaker, and rate limiting**
|
|
42
42
|
- **4 Feed Generators** - Google Merchant Center, Meta/Facebook Catalog, Amazon Seller Central, Custom Feed (CSV/JSON/XML/TSV)
|
|
43
|
-
- **7 Search & Integration Sinks** - Elasticsearch, OpenSearch, MeiliSearch, Algolia, Typesense, Queue Producer (RabbitMQ/SQS/Redis), Webhook
|
|
43
|
+
- **7 Search & Integration Sinks** - Elasticsearch, OpenSearch, MeiliSearch, Algolia, Typesense, Queue Producer (RabbitMQ/SQS/Redis), Webhook (with HMAC signing)
|
|
44
44
|
- **24 Hook Stages** (18 for step types and 6 global) - Interceptors and scripts to modify data at any pipeline stage
|
|
45
45
|
- **7 Connection Types** - HTTP/REST, S3, FTP, SFTP, Database (PostgreSQL/MySQL/SQLite/MSSQL/Oracle), Message Queue (RabbitMQ/SQS/Redis), Custom
|
|
46
46
|
- **6 Trigger Types** - Manual, Scheduled (cron), Webhook, Vendure Events, File Watch, **Message Queue Consumer**
|
|
47
|
-
- **Bi-directional Queue Support** - Consume from and produce to RabbitMQ (AMQP), Amazon SQS, Redis Streams
|
|
47
|
+
- **Bi-directional Queue Support** - Consume from and produce to RabbitMQ (AMQP), Amazon SQS, Redis Streams, and internal queue adapter
|
|
48
48
|
- **Horizontal Scaling** - Distributed locks via Redis or PostgreSQL for multi-instance deployments
|
|
49
49
|
- **Checkpoint Recovery** - Resume failed pipelines from last successful record
|
|
50
50
|
- **File Upload** - Drag-and-drop CSV/JSON file upload with automatic processing
|
|
51
51
|
- **Real-time Monitoring** - Logs, analytics, error tracking, and dead letter queue
|
|
52
|
+
- **Nested Entity Modes** - Configurable behavior for all nested entities (addresses, facet values, order lines, assets, etc.) to prevent duplicates and provide full control over data management
|
|
52
53
|
|
|
53
54
|
## Screenshots
|
|
54
55
|
|
|
@@ -339,7 +340,7 @@ Math operations: `add`, `subtract`, `multiply`, `divide`, `modulo`, `power`, `ro
|
|
|
339
340
|
| `ifThenElse` | Conditional value | `{ op: 'ifThenElse', args: { condition: { field: 'type', cmp: 'eq', value: 'digital' }, thenValue: true, elseValue: false, target: 'isDigital' } }` |
|
|
340
341
|
| `switch` | Multi-case mapping | `{ op: 'switch', args: { source: 'code', cases: [{ value: 'A', result: 'Active' }], default: 'Unknown', target: 'status' } }` |
|
|
341
342
|
|
|
342
|
-
Comparison operators: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `contains`, `notContains`, `startsWith`, `endsWith`, `regex`, `exists`, `isNull`
|
|
343
|
+
Comparison operators (19): `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `contains`, `notContains`, `startsWith`, `endsWith`, `regex`, `exists`, `notExists`, `isNull`, `isEmpty`, `isNotEmpty`, `matches` (glob)
|
|
343
344
|
|
|
344
345
|
### Validation Operators
|
|
345
346
|
|
|
@@ -437,6 +438,7 @@ Execute custom JavaScript for complex transformations:
|
|
|
437
438
|
| Customer Group Loader | `customerGroupUpsert` | Create/update customer groups by name; assign customers by email |
|
|
438
439
|
| Collection Loader | `collectionUpsert` | Create/update collections with parent relationships |
|
|
439
440
|
| Promotion Loader | `promotionUpsert` | Create/update promotions with conditions and actions |
|
|
441
|
+
| Order Upsert Loader | `orderUpsert` | Order create/update for migrations with state transitions and line management |
|
|
440
442
|
| Order Note Loader | `orderNote` | Attach notes to orders by code or id |
|
|
441
443
|
| Order Transition Loader | `orderTransition` | Transition orders to new states |
|
|
442
444
|
| Stock Adjust Loader | `stockAdjust` | Adjust inventory levels by SKU and stock location map |
|
|
@@ -450,6 +452,7 @@ Execute custom JavaScript for complex transformations:
|
|
|
450
452
|
| Stock Location Loader | `stockLocationUpsert` | Create/update stock locations and warehouses |
|
|
451
453
|
| Facet Loader | `facetUpsert` | Create/update facets with translations |
|
|
452
454
|
| Facet Value Loader | `facetValueUpsert` | Create/update facet values with translations |
|
|
455
|
+
| Entity Deletion Loader | `entityDeletion` | Soft-delete any of 13 entity types (Products, Variants, Collections, Facets, FacetValues, Customers, CustomerGroups, Promotions, ShippingMethods, PaymentMethods, TaxRates, Assets, StockLocations) by slug, SKU, ID, code, email, or name |
|
|
453
456
|
| GraphQL Mutation Loader | `graphqlMutation` | Execute arbitrary GraphQL mutations against Vendure |
|
|
454
457
|
| Asset Import Loader | `assetImport` | Import assets from URLs or file paths |
|
|
455
458
|
| REST POST Loader | `restPost` | POST/PUT records to external REST endpoints |
|
|
@@ -506,25 +509,41 @@ Execute custom JavaScript for complex transformations:
|
|
|
506
509
|
})
|
|
507
510
|
```
|
|
508
511
|
|
|
512
|
+
### Condition-Based Routing (ROUTE Step)
|
|
513
|
+
|
|
514
|
+
Route records to different branches based on field conditions using 19 comparison operators. Supports AND logic (multiple conditions per branch), automatic `default` branch for unmatched records, and `dependencyOnly` edges for execution ordering without data flow.
|
|
515
|
+
|
|
516
|
+
```typescript
|
|
517
|
+
.route('split-by-type', {
|
|
518
|
+
branches: [
|
|
519
|
+
{ name: 'physical', when: [{ field: 'type', cmp: 'eq', value: 'physical' }] },
|
|
520
|
+
{ name: 'digital', when: [{ field: 'type', cmp: 'eq', value: 'digital' }] },
|
|
521
|
+
],
|
|
522
|
+
})
|
|
523
|
+
```
|
|
524
|
+
|
|
509
525
|
---
|
|
510
526
|
|
|
511
527
|
## Hooks
|
|
512
528
|
|
|
513
|
-
Hooks let you run code at
|
|
529
|
+
Hooks let you run code at 24 different pipeline stages (18 step-level + 6 global). Two types:
|
|
514
530
|
- **Interceptors**: Modify the record array (return modified records)
|
|
515
531
|
- **Observation hooks**: Side effects only (webhooks, events, logging)
|
|
516
532
|
|
|
517
533
|
### Hook Stages
|
|
518
534
|
|
|
519
|
-
**Data Processing:**
|
|
535
|
+
**Data Processing (18 step-level):**
|
|
520
536
|
- `BEFORE_EXTRACT`, `AFTER_EXTRACT`
|
|
521
537
|
- `BEFORE_TRANSFORM`, `AFTER_TRANSFORM`
|
|
522
538
|
- `BEFORE_VALIDATE`, `AFTER_VALIDATE`
|
|
523
539
|
- `BEFORE_ENRICH`, `AFTER_ENRICH`
|
|
524
540
|
- `BEFORE_ROUTE`, `AFTER_ROUTE`
|
|
525
541
|
- `BEFORE_LOAD`, `AFTER_LOAD`
|
|
542
|
+
- `BEFORE_EXPORT`, `AFTER_EXPORT`
|
|
543
|
+
- `BEFORE_FEED`, `AFTER_FEED`
|
|
544
|
+
- `BEFORE_SINK`, `AFTER_SINK`
|
|
526
545
|
|
|
527
|
-
**Pipeline Lifecycle:**
|
|
546
|
+
**Pipeline Lifecycle (6 global):**
|
|
528
547
|
- `PIPELINE_STARTED`, `PIPELINE_COMPLETED`, `PIPELINE_FAILED`
|
|
529
548
|
- `ON_ERROR`, `ON_RETRY`, `ON_DEAD_LETTER`
|
|
530
549
|
|
|
@@ -850,6 +869,8 @@ The plugin includes a full-featured admin dashboard:
|
|
|
850
869
|
- **Visual Mode**: Drag-and-drop workflow builder with node palette
|
|
851
870
|
- Live validation with error highlighting
|
|
852
871
|
- Step tester for testing individual steps
|
|
872
|
+
- `dependencyOnly` edges for execution ordering without data flow in graph mode
|
|
873
|
+
- Stale run cleanup with automatic TIMEOUT status for stuck pipeline runs
|
|
853
874
|
|
|
854
875
|
### Dry Run
|
|
855
876
|
- Execute pipeline without persisting changes
|
|
@@ -862,6 +883,7 @@ The plugin includes a full-featured admin dashboard:
|
|
|
862
883
|
- Analytics dashboard with metrics
|
|
863
884
|
- Per-pipeline health stats
|
|
864
885
|
- Error rate tracking
|
|
886
|
+
- `completedAt` and `errorMessage` fields on pipeline runs for precise tracking
|
|
865
887
|
|
|
866
888
|
### Queue Management
|
|
867
889
|
- View pending, running, and failed jobs
|
|
@@ -890,7 +912,7 @@ DataHubPlugin.init({
|
|
|
890
912
|
|
|
891
913
|
### Code-First Connections
|
|
892
914
|
|
|
893
|
-
Supported connection types: `http`, `postgres`, `mysql`, `s3`, `ftp`, `sftp`
|
|
915
|
+
Supported connection types: `http`, `postgres`, `mysql`, `s3`, `ftp`, `sftp`, `rabbitmq`, `custom`
|
|
894
916
|
|
|
895
917
|
```typescript
|
|
896
918
|
DataHubPlugin.init({
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
AlertTriangle,
|
|
9
9
|
Zap,
|
|
10
10
|
Bell,
|
|
11
|
+
Webhook,
|
|
11
12
|
} from 'lucide-react';
|
|
12
13
|
import { TriggersPanel } from '../shared/triggers-panel';
|
|
13
14
|
import { StepConfigPanel } from '../shared/step-config';
|
|
@@ -19,9 +20,10 @@ import {
|
|
|
19
20
|
PIPELINE_EDITOR_PANEL,
|
|
20
21
|
DEFAULT_STEP_CONFIGS,
|
|
21
22
|
} from '../../constants';
|
|
22
|
-
import { useStepConfigs, useTriggerTypes } from '../../hooks';
|
|
23
|
+
import { useStepConfigs, useTriggerTypes, useHookStages, useHookStageCategories } from '../../hooks';
|
|
23
24
|
import type { MoveDirection, PipelineEditorPanel } from '../../constants';
|
|
24
25
|
import { useAdapterCatalog } from '../../hooks';
|
|
26
|
+
import { FALLBACK_STAGE_CATEGORIES } from '../../constants';
|
|
25
27
|
import type {
|
|
26
28
|
StepType,
|
|
27
29
|
PipelineStepDefinition,
|
|
@@ -29,7 +31,7 @@ import type {
|
|
|
29
31
|
PipelineEditorProps,
|
|
30
32
|
JsonObject,
|
|
31
33
|
} from '../../types';
|
|
32
|
-
import { getCombinedTriggers, updateDefinitionWithTriggers } from '../../utils';
|
|
34
|
+
import { getCombinedTriggers, updateDefinitionWithTriggers, resolveIconName } from '../../utils';
|
|
33
35
|
|
|
34
36
|
const ADDABLE_STEP_TYPES = Object.keys(DEFAULT_STEP_CONFIGS).filter(
|
|
35
37
|
t => t !== STEP_TYPE.ROUTE && t !== STEP_TYPE.GATE
|
|
@@ -157,10 +159,21 @@ export function PipelineEditor({ definition, onChange, issues = [] }: PipelineEd
|
|
|
157
159
|
// Get combined triggers from both steps and triggers array
|
|
158
160
|
const combinedTriggers = useMemo(() => getCombinedTriggers(definition), [definition]);
|
|
159
161
|
|
|
162
|
+
// Hook stage metadata
|
|
163
|
+
const { hookStages: backendStages } = useHookStages();
|
|
164
|
+
const { categories: backendCategories } = useHookStageCategories();
|
|
165
|
+
const stageCategories = useMemo(
|
|
166
|
+
() => backendCategories.length > 0 ? backendCategories : FALLBACK_STAGE_CATEGORIES,
|
|
167
|
+
[backendCategories],
|
|
168
|
+
);
|
|
169
|
+
const hooks = definition.hooks ?? {};
|
|
170
|
+
const hookCount = useMemo(() => Object.values(hooks).reduce((sum, arr) => sum + (Array.isArray(arr) ? arr.length : 0), 0), [hooks]);
|
|
171
|
+
|
|
160
172
|
// Panel switch handlers
|
|
161
173
|
const handleSwitchToSteps = useCallback(() => setActivePanel(PIPELINE_EDITOR_PANEL.STEPS), []);
|
|
162
174
|
const handleSwitchToTriggers = useCallback(() => setActivePanel(PIPELINE_EDITOR_PANEL.TRIGGERS), []);
|
|
163
175
|
const handleSwitchToSettings = useCallback(() => setActivePanel(PIPELINE_EDITOR_PANEL.SETTINGS), []);
|
|
176
|
+
const handleSwitchToHooks = useCallback(() => setActivePanel(PIPELINE_EDITOR_PANEL.HOOKS), []);
|
|
164
177
|
|
|
165
178
|
// Settings change handler
|
|
166
179
|
const handleContextChange = useCallback((context: JsonObject) => {
|
|
@@ -192,7 +205,8 @@ export function PipelineEditor({ definition, onChange, issues = [] }: PipelineEd
|
|
|
192
205
|
...selectedStep,
|
|
193
206
|
key: updated.key,
|
|
194
207
|
type: updated.type as StepType,
|
|
195
|
-
|
|
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: {
|
|
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: {
|
|
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:
|
|
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
|
-
|
|
89
|
-
|
|
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
|
|
101
|
+
{String(step.adapterCode || step.config?.adapterCode)}
|
|
102
102
|
</p>
|
|
103
103
|
)}
|
|
104
104
|
</div>
|