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