@oronts/vendure-data-hub-plugin 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +6 -2
  3. package/dashboard/gql/gql.ts +6 -6
  4. package/dashboard/gql/graphql.ts +9 -4
  5. package/dashboard/hooks/api/use-pipeline-runs.ts +1 -0
  6. package/dashboard/hooks/api/use-queues.ts +1 -0
  7. package/dist/dashboard/components/common/ConnectionConfigEditor.tsx +589 -0
  8. package/dist/dashboard/components/common/HeadersEditor.tsx +90 -0
  9. package/dist/dashboard/components/common/ValidationFeedback.tsx +17 -0
  10. package/dist/dashboard/components/common/index.ts +10 -0
  11. package/dist/dashboard/components/pipelines/PipelineEditor.tsx +504 -0
  12. package/dist/dashboard/components/pipelines/PipelineExport.tsx +63 -0
  13. package/dist/dashboard/components/pipelines/PipelineImport.tsx +87 -0
  14. package/dist/dashboard/components/pipelines/ReactFlowPipelineEditor.tsx +539 -0
  15. package/dist/dashboard/components/pipelines/shared/NodePropertiesPanel.tsx +146 -0
  16. package/dist/dashboard/components/pipelines/shared/PipelineNode.tsx +155 -0
  17. package/dist/dashboard/components/pipelines/shared/PipelineSettingsPanel.tsx +392 -0
  18. package/dist/dashboard/components/pipelines/shared/StepListItem.tsx +144 -0
  19. package/dist/dashboard/components/pipelines/shared/index.ts +33 -0
  20. package/dist/dashboard/components/pipelines/shared/visual-node-config.ts +169 -0
  21. package/dist/dashboard/components/shared/LoadMoreButton.tsx +18 -0
  22. package/dist/dashboard/components/shared/entity-selector/EntitySelector.tsx +59 -0
  23. package/dist/dashboard/components/shared/entity-selector/index.ts +1 -0
  24. package/dist/dashboard/components/shared/error-boundary/ErrorBoundary.tsx +90 -0
  25. package/dist/dashboard/components/shared/error-boundary/index.ts +1 -0
  26. package/dist/dashboard/components/shared/feedback/EmptyState.tsx +36 -0
  27. package/dist/dashboard/components/shared/feedback/ErrorState.tsx +69 -0
  28. package/dist/dashboard/components/shared/feedback/LoadingState.tsx +104 -0
  29. package/dist/dashboard/components/shared/feedback/ValidationErrorDisplay.tsx +29 -0
  30. package/dist/dashboard/components/shared/feedback/index.ts +4 -0
  31. package/dist/dashboard/components/shared/file-dropzone/FileDropzone.tsx +167 -0
  32. package/dist/dashboard/components/shared/file-dropzone/index.ts +1 -0
  33. package/dist/dashboard/components/shared/filter-conditions-editor/FilterConditionsEditor.tsx +226 -0
  34. package/dist/dashboard/components/shared/filter-conditions-editor/index.ts +1 -0
  35. package/dist/dashboard/components/shared/index.ts +45 -0
  36. package/dist/dashboard/components/shared/schema-form/SchemaFormRenderer.tsx +248 -0
  37. package/dist/dashboard/components/shared/schema-form/fields/BooleanField.tsx +26 -0
  38. package/dist/dashboard/components/shared/schema-form/fields/FieldWrapper.tsx +28 -0
  39. package/dist/dashboard/components/shared/schema-form/fields/FileUploadField.tsx +171 -0
  40. package/dist/dashboard/components/shared/schema-form/fields/JsonField.tsx +132 -0
  41. package/dist/dashboard/components/shared/schema-form/fields/NumberField.tsx +33 -0
  42. package/dist/dashboard/components/shared/schema-form/fields/SelectField.tsx +70 -0
  43. package/dist/dashboard/components/shared/schema-form/fields/StringField.tsx +36 -0
  44. package/dist/dashboard/components/shared/schema-form/fields/TextareaField.tsx +31 -0
  45. package/dist/dashboard/components/shared/schema-form/fields/index.ts +23 -0
  46. package/dist/dashboard/components/shared/schema-form/index.ts +2 -0
  47. package/dist/dashboard/components/shared/schema-form/utils.ts +3 -0
  48. package/dist/dashboard/components/shared/selectable-card/SelectableCard.tsx +65 -0
  49. package/dist/dashboard/components/shared/selectable-card/index.ts +1 -0
  50. package/dist/dashboard/components/shared/stat-card/StatCard.tsx +121 -0
  51. package/dist/dashboard/components/shared/stat-card/index.ts +1 -0
  52. package/dist/dashboard/components/shared/step-config/AdapterRequiredWarning.tsx +25 -0
  53. package/dist/dashboard/components/shared/step-config/AdapterSelector.tsx +109 -0
  54. package/dist/dashboard/components/shared/step-config/AdvancedEditors.tsx +634 -0
  55. package/dist/dashboard/components/shared/step-config/EnrichConfigComponent.tsx +295 -0
  56. package/dist/dashboard/components/shared/step-config/ExtractTestResults.tsx +143 -0
  57. package/dist/dashboard/components/shared/step-config/GateConfigComponent.tsx +127 -0
  58. package/dist/dashboard/components/shared/step-config/LoadTestResults.tsx +104 -0
  59. package/dist/dashboard/components/shared/step-config/OperatorCard.tsx +266 -0
  60. package/dist/dashboard/components/shared/step-config/OperatorCheatSheetButton.tsx +54 -0
  61. package/dist/dashboard/components/shared/step-config/OperatorFieldInput.tsx +209 -0
  62. package/dist/dashboard/components/shared/step-config/RetrySettingsComponent.tsx +111 -0
  63. package/dist/dashboard/components/shared/step-config/RouteConfigComponent.tsx +125 -0
  64. package/dist/dashboard/components/shared/step-config/StepConfigPanel.tsx +564 -0
  65. package/dist/dashboard/components/shared/step-config/StepTester.tsx +165 -0
  66. package/dist/dashboard/components/shared/step-config/TestResultContainer.tsx +57 -0
  67. package/dist/dashboard/components/shared/step-config/TransformTestResults.tsx +130 -0
  68. package/dist/dashboard/components/shared/step-config/ValidateConfigComponent.tsx +334 -0
  69. package/dist/dashboard/components/shared/step-config/index.ts +29 -0
  70. package/dist/dashboard/components/shared/step-config/step-test-handlers.ts +297 -0
  71. package/dist/dashboard/components/shared/trigger-config/TriggerForm.tsx +478 -0
  72. package/dist/dashboard/components/shared/trigger-config/index.ts +1 -0
  73. package/dist/dashboard/components/shared/triggers-panel/TriggersPanel.tsx +281 -0
  74. package/dist/dashboard/components/shared/triggers-panel/index.ts +1 -0
  75. package/dist/dashboard/components/shared/wizard/ConfigurationNameCard.tsx +59 -0
  76. package/dist/dashboard/components/shared/wizard/SummaryCard.tsx +53 -0
  77. package/dist/dashboard/components/shared/wizard/WizardFooter.tsx +47 -0
  78. package/dist/dashboard/components/shared/wizard/WizardProgressBar.tsx +78 -0
  79. package/dist/dashboard/components/shared/wizard/index.ts +4 -0
  80. package/dist/dashboard/components/shared/wizard-trigger/TriggerSchemaFields.tsx +128 -0
  81. package/dist/dashboard/components/shared/wizard-trigger/TriggerSelector.tsx +33 -0
  82. package/dist/dashboard/components/shared/wizard-trigger/index.ts +2 -0
  83. package/dist/dashboard/components/templates/TemplateGallery.tsx +210 -0
  84. package/dist/dashboard/components/templates/TemplatePreview.tsx +214 -0
  85. package/dist/dashboard/components/templates/index.ts +4 -0
  86. package/dist/dashboard/components/wizards/export-wizard/DestinationStep.tsx +207 -0
  87. package/dist/dashboard/components/wizards/export-wizard/ExportWizard.tsx +221 -0
  88. package/dist/dashboard/components/wizards/export-wizard/FieldsStep.tsx +159 -0
  89. package/dist/dashboard/components/wizards/export-wizard/FormatStep.tsx +246 -0
  90. package/dist/dashboard/components/wizards/export-wizard/ReviewStep.tsx +231 -0
  91. package/dist/dashboard/components/wizards/export-wizard/SourceStep.tsx +154 -0
  92. package/dist/dashboard/components/wizards/export-wizard/TriggerStep.tsx +234 -0
  93. package/dist/dashboard/components/wizards/export-wizard/constants.ts +73 -0
  94. package/dist/dashboard/components/wizards/export-wizard/index.ts +2 -0
  95. package/dist/dashboard/components/wizards/export-wizard/types.ts +39 -0
  96. package/dist/dashboard/components/wizards/import-wizard/ImportWizard.tsx +350 -0
  97. package/dist/dashboard/components/wizards/import-wizard/MappingStep.tsx +286 -0
  98. package/dist/dashboard/components/wizards/import-wizard/PreviewStep.tsx +79 -0
  99. package/dist/dashboard/components/wizards/import-wizard/ReviewStep.tsx +266 -0
  100. package/dist/dashboard/components/wizards/import-wizard/SourceStep.tsx +537 -0
  101. package/dist/dashboard/components/wizards/import-wizard/StrategyStep.tsx +328 -0
  102. package/dist/dashboard/components/wizards/import-wizard/TargetStep.tsx +76 -0
  103. package/dist/dashboard/components/wizards/import-wizard/TemplateStep.tsx +116 -0
  104. package/dist/dashboard/components/wizards/import-wizard/TransformStep.tsx +666 -0
  105. package/dist/dashboard/components/wizards/import-wizard/TriggerStep.tsx +51 -0
  106. package/dist/dashboard/components/wizards/import-wizard/constants.ts +104 -0
  107. package/dist/dashboard/components/wizards/import-wizard/index.ts +3 -0
  108. package/dist/dashboard/components/wizards/import-wizard/types.ts +35 -0
  109. package/dist/dashboard/components/wizards/index.ts +7 -0
  110. package/dist/dashboard/components/wizards/shared/WizardStepContainer.tsx +27 -0
  111. package/dist/dashboard/components/wizards/shared/constants.ts +16 -0
  112. package/dist/dashboard/components/wizards/shared/index.ts +10 -0
  113. package/dist/dashboard/constants/colors.ts +25 -0
  114. package/dist/dashboard/constants/connection-defaults.ts +7 -0
  115. package/dist/dashboard/constants/connection-types.ts +1 -0
  116. package/dist/dashboard/constants/defaults.ts +18 -0
  117. package/dist/dashboard/constants/editor.ts +69 -0
  118. package/dist/dashboard/constants/enum-maps.ts +18 -0
  119. package/dist/dashboard/constants/fallbacks.ts +44 -0
  120. package/dist/dashboard/constants/file-format-registry.ts +206 -0
  121. package/dist/dashboard/constants/index.ts +24 -0
  122. package/dist/dashboard/constants/navigation.ts +29 -0
  123. package/dist/dashboard/constants/permissions.ts +41 -0
  124. package/dist/dashboard/constants/placeholders.ts +77 -0
  125. package/dist/dashboard/constants/routes.ts +12 -0
  126. package/dist/dashboard/constants/run-status.ts +1 -0
  127. package/dist/dashboard/constants/sentinel-values.ts +12 -0
  128. package/dist/dashboard/constants/step-configs.ts +9 -0
  129. package/dist/dashboard/constants/step-mappings.ts +170 -0
  130. package/dist/dashboard/constants/steps.ts +37 -0
  131. package/dist/dashboard/constants/toast-messages.ts +149 -0
  132. package/dist/dashboard/constants/triggers.ts +5 -0
  133. package/dist/dashboard/constants/ui-config.ts +139 -0
  134. package/dist/dashboard/constants/ui-dimensions.ts +145 -0
  135. package/dist/dashboard/constants/ui-states.ts +28 -0
  136. package/dist/dashboard/constants/ui-types.ts +85 -0
  137. package/dist/dashboard/constants/validation-patterns.ts +26 -0
  138. package/dist/dashboard/gql/gql.ts +370 -0
  139. package/dist/dashboard/gql/graphql.ts +10383 -0
  140. package/dist/dashboard/gql/index.ts +1 -0
  141. package/dist/dashboard/hooks/api/index.ts +115 -0
  142. package/dist/dashboard/hooks/api/mutation-helpers.ts +34 -0
  143. package/dist/dashboard/hooks/api/use-adapters.ts +92 -0
  144. package/dist/dashboard/hooks/api/use-config-options.ts +513 -0
  145. package/dist/dashboard/hooks/api/use-connections.ts +84 -0
  146. package/dist/dashboard/hooks/api/use-entity-field-schemas.ts +99 -0
  147. package/dist/dashboard/hooks/api/use-entity-loaders.ts +45 -0
  148. package/dist/dashboard/hooks/api/use-hooks.ts +68 -0
  149. package/dist/dashboard/hooks/api/use-logs.ts +102 -0
  150. package/dist/dashboard/hooks/api/use-pipeline-runs.ts +222 -0
  151. package/dist/dashboard/hooks/api/use-pipelines.ts +279 -0
  152. package/dist/dashboard/hooks/api/use-queues.ts +142 -0
  153. package/dist/dashboard/hooks/api/use-secrets.ts +75 -0
  154. package/dist/dashboard/hooks/api/use-settings.ts +55 -0
  155. package/dist/dashboard/hooks/api/use-step-tester.ts +79 -0
  156. package/dist/dashboard/hooks/index.ts +13 -0
  157. package/dist/dashboard/hooks/use-adapter-catalog.ts +253 -0
  158. package/dist/dashboard/hooks/use-export-templates.ts +80 -0
  159. package/dist/dashboard/hooks/use-import-templates.ts +139 -0
  160. package/dist/dashboard/hooks/use-load-more.ts +29 -0
  161. package/dist/dashboard/hooks/use-stable-keys.ts +54 -0
  162. package/dist/dashboard/hooks/use-trigger-types.ts +100 -0
  163. package/dist/dashboard/hooks/use-wizard-navigation.ts +128 -0
  164. package/dist/dashboard/index.tsx +55 -0
  165. package/dist/dashboard/routes/adapters/AdapterCard.tsx +102 -0
  166. package/dist/dashboard/routes/adapters/AdapterConstants.tsx +20 -0
  167. package/dist/dashboard/routes/adapters/AdapterDetail.tsx +208 -0
  168. package/dist/dashboard/routes/adapters/AdapterTypeSection.tsx +105 -0
  169. package/dist/dashboard/routes/adapters/AdaptersPage.tsx +276 -0
  170. package/dist/dashboard/routes/adapters/AdaptersTable.tsx +107 -0
  171. package/dist/dashboard/routes/adapters/index.ts +1 -0
  172. package/dist/dashboard/routes/connections/ConnectionDetail.tsx +218 -0
  173. package/dist/dashboard/routes/connections/ConnectionsList.tsx +34 -0
  174. package/dist/dashboard/routes/connections/index.ts +2 -0
  175. package/dist/dashboard/routes/hooks/Hooks.tsx +425 -0
  176. package/dist/dashboard/routes/hooks/hook-stages.ts +52 -0
  177. package/dist/dashboard/routes/hooks/index.ts +1 -0
  178. package/dist/dashboard/routes/index.ts +8 -0
  179. package/dist/dashboard/routes/logs/Logs.tsx +93 -0
  180. package/dist/dashboard/routes/logs/components/LogDetailDrawer.tsx +118 -0
  181. package/dist/dashboard/routes/logs/components/LogExplorerTab.tsx +367 -0
  182. package/dist/dashboard/routes/logs/components/LogLevelBadge.tsx +34 -0
  183. package/dist/dashboard/routes/logs/components/LogTableRow.tsx +70 -0
  184. package/dist/dashboard/routes/logs/components/LogsOverviewTab.tsx +178 -0
  185. package/dist/dashboard/routes/logs/components/RealtimeLogTab.tsx +122 -0
  186. package/dist/dashboard/routes/logs/index.ts +1 -0
  187. package/dist/dashboard/routes/pipelines/ErrorAuditList.tsx +39 -0
  188. package/dist/dashboard/routes/pipelines/ExportWizardPage.tsx +96 -0
  189. package/dist/dashboard/routes/pipelines/ImportWizardPage.tsx +104 -0
  190. package/dist/dashboard/routes/pipelines/PipelineDetail.tsx +211 -0
  191. package/dist/dashboard/routes/pipelines/PipelineRunsBlock.tsx +377 -0
  192. package/dist/dashboard/routes/pipelines/PipelinesList.tsx +87 -0
  193. package/dist/dashboard/routes/pipelines/RetryPatchHelper.tsx +51 -0
  194. package/dist/dashboard/routes/pipelines/RunDetailsPanel.tsx +238 -0
  195. package/dist/dashboard/routes/pipelines/RunErrorsList.tsx +116 -0
  196. package/dist/dashboard/routes/pipelines/StepCounters.tsx +24 -0
  197. package/dist/dashboard/routes/pipelines/StepSummaryTable.tsx +36 -0
  198. package/dist/dashboard/routes/pipelines/components/DryRunDialog.tsx +341 -0
  199. package/dist/dashboard/routes/pipelines/components/PipelineActionButtons.tsx +201 -0
  200. package/dist/dashboard/routes/pipelines/components/PipelineEditorToggle.tsx +116 -0
  201. package/dist/dashboard/routes/pipelines/components/PipelineFormFields.tsx +156 -0
  202. package/dist/dashboard/routes/pipelines/components/PipelineWebhookInfo.tsx +111 -0
  203. package/dist/dashboard/routes/pipelines/components/ReviewActionsPanel.tsx +342 -0
  204. package/dist/dashboard/routes/pipelines/components/ValidationPanel.tsx +121 -0
  205. package/dist/dashboard/routes/pipelines/components/VersionHistoryDialog.tsx +131 -0
  206. package/dist/dashboard/routes/pipelines/components/index.ts +25 -0
  207. package/dist/dashboard/routes/pipelines/hooks/index.ts +1 -0
  208. package/dist/dashboard/routes/pipelines/hooks/use-pipeline-validation.ts +114 -0
  209. package/dist/dashboard/routes/pipelines/index.ts +4 -0
  210. package/dist/dashboard/routes/pipelines/utils/index.ts +1 -0
  211. package/dist/dashboard/routes/pipelines/utils/pipeline-conversion.ts +261 -0
  212. package/dist/dashboard/routes/queues/ConsumersTable.tsx +134 -0
  213. package/dist/dashboard/routes/queues/DeadLettersTable.tsx +118 -0
  214. package/dist/dashboard/routes/queues/FailedRunsTable.tsx +74 -0
  215. package/dist/dashboard/routes/queues/QueuesPage.tsx +290 -0
  216. package/dist/dashboard/routes/queues/index.ts +1 -0
  217. package/dist/dashboard/routes/queues/types.ts +22 -0
  218. package/dist/dashboard/routes/secrets/SecretDetail.tsx +278 -0
  219. package/dist/dashboard/routes/secrets/SecretsList.tsx +34 -0
  220. package/dist/dashboard/routes/secrets/index.ts +2 -0
  221. package/dist/dashboard/routes/settings/Settings.tsx +343 -0
  222. package/dist/dashboard/routes/settings/index.ts +1 -0
  223. package/dist/dashboard/types/index.ts +89 -0
  224. package/dist/dashboard/types/pipeline.ts +51 -0
  225. package/dist/dashboard/types/ui-types.ts +400 -0
  226. package/dist/dashboard/types/wizard.ts +235 -0
  227. package/dist/dashboard/utils/adapter-grouping.ts +43 -0
  228. package/dist/dashboard/utils/column-analysis.ts +11 -0
  229. package/dist/dashboard/utils/field-preparation.ts +31 -0
  230. package/dist/dashboard/utils/form-validation.ts +373 -0
  231. package/dist/dashboard/utils/formatters.ts +92 -0
  232. package/dist/dashboard/utils/icon-resolver.ts +35 -0
  233. package/dist/dashboard/utils/index.ts +60 -0
  234. package/dist/dashboard/utils/query-key-factory.ts +54 -0
  235. package/dist/dashboard/utils/step-helpers.ts +32 -0
  236. package/dist/dashboard/utils/string-helpers.ts +4 -0
  237. package/dist/dashboard/utils/template-helpers.ts +26 -0
  238. package/dist/dashboard/utils/trigger-sync.ts +138 -0
  239. package/dist/dashboard/utils/wizard-to-pipeline.ts +569 -0
  240. package/dist/shared/types/adapter-config.types.d.ts +254 -11
  241. package/dist/shared/types/adapter-config.types.d.ts.map +1 -1
  242. package/dist/shared/types/index.d.ts +1 -1
  243. package/dist/shared/types/index.d.ts.map +1 -1
  244. package/dist/shared/types/index.js.map +1 -1
  245. package/dist/shared/utils/error.d.ts +5 -0
  246. package/dist/shared/utils/error.d.ts.map +1 -1
  247. package/dist/shared/utils/error.js +11 -0
  248. package/dist/shared/utils/error.js.map +1 -1
  249. package/dist/src/api/schema/pipeline.schema.d.ts +1 -1
  250. package/dist/src/api/schema/pipeline.schema.d.ts.map +1 -1
  251. package/dist/src/api/schema/pipeline.schema.js +2 -0
  252. package/dist/src/api/schema/pipeline.schema.js.map +1 -1
  253. package/dist/src/bootstrap/initialization.d.ts.map +1 -1
  254. package/dist/src/bootstrap/initialization.js +6 -0
  255. package/dist/src/bootstrap/initialization.js.map +1 -1
  256. package/dist/src/entities/data/error-record.entity.d.ts +1 -0
  257. package/dist/src/entities/data/error-record.entity.d.ts.map +1 -1
  258. package/dist/src/entities/data/error-record.entity.js +4 -0
  259. package/dist/src/entities/data/error-record.entity.js.map +1 -1
  260. package/dist/src/gql/generated.d.ts +5 -0
  261. package/dist/src/gql/generated.d.ts.map +1 -1
  262. package/dist/src/gql/generated.js.map +1 -1
  263. package/dist/src/loaders/inventory/inventory.loader.d.ts.map +1 -1
  264. package/dist/src/loaders/inventory/inventory.loader.js +1 -2
  265. package/dist/src/loaders/inventory/inventory.loader.js.map +1 -1
  266. package/dist/src/runtime/executor-types.d.ts +3 -2
  267. package/dist/src/runtime/executor-types.d.ts.map +1 -1
  268. package/dist/src/runtime/executors/loaders/asset-handler.js +1 -1
  269. package/dist/src/runtime/executors/loaders/asset-handler.js.map +1 -1
  270. package/dist/src/runtime/executors/loaders/asset-import-handler.js +1 -1
  271. package/dist/src/runtime/executors/loaders/asset-import-handler.js.map +1 -1
  272. package/dist/src/runtime/executors/loaders/channel-handler.d.ts.map +1 -1
  273. package/dist/src/runtime/executors/loaders/channel-handler.js +14 -1
  274. package/dist/src/runtime/executors/loaders/channel-handler.js.map +1 -1
  275. package/dist/src/runtime/executors/loaders/collection-handler.d.ts.map +1 -1
  276. package/dist/src/runtime/executors/loaders/collection-handler.js +22 -3
  277. package/dist/src/runtime/executors/loaders/collection-handler.js.map +1 -1
  278. package/dist/src/runtime/executors/loaders/customer-group-handler.d.ts.map +1 -1
  279. package/dist/src/runtime/executors/loaders/customer-group-handler.js +8 -1
  280. package/dist/src/runtime/executors/loaders/customer-group-handler.js.map +1 -1
  281. package/dist/src/runtime/executors/loaders/customer-handler.d.ts.map +1 -1
  282. package/dist/src/runtime/executors/loaders/customer-handler.js +33 -2
  283. package/dist/src/runtime/executors/loaders/customer-handler.js.map +1 -1
  284. package/dist/src/runtime/executors/loaders/facet-handler.d.ts.map +1 -1
  285. package/dist/src/runtime/executors/loaders/facet-handler.js +34 -2
  286. package/dist/src/runtime/executors/loaders/facet-handler.js.map +1 -1
  287. package/dist/src/runtime/executors/loaders/graphql-mutation-handler.js +1 -1
  288. package/dist/src/runtime/executors/loaders/graphql-mutation-handler.js.map +1 -1
  289. package/dist/src/runtime/executors/loaders/inventory-adjust-handler.d.ts.map +1 -1
  290. package/dist/src/runtime/executors/loaders/inventory-adjust-handler.js +8 -1
  291. package/dist/src/runtime/executors/loaders/inventory-adjust-handler.js.map +1 -1
  292. package/dist/src/runtime/executors/loaders/inventory-handler.js +3 -3
  293. package/dist/src/runtime/executors/loaders/inventory-handler.js.map +1 -1
  294. package/dist/src/runtime/executors/loaders/loader-handler-registry.d.ts.map +1 -1
  295. package/dist/src/runtime/executors/loaders/loader-handler-registry.js +35 -10
  296. package/dist/src/runtime/executors/loaders/loader-handler-registry.js.map +1 -1
  297. package/dist/src/runtime/executors/loaders/order-handler.d.ts +1 -1
  298. package/dist/src/runtime/executors/loaders/order-handler.d.ts.map +1 -1
  299. package/dist/src/runtime/executors/loaders/order-handler.js +7 -4
  300. package/dist/src/runtime/executors/loaders/order-handler.js.map +1 -1
  301. package/dist/src/runtime/executors/loaders/payment-method-handler.d.ts.map +1 -1
  302. package/dist/src/runtime/executors/loaders/payment-method-handler.js +14 -1
  303. package/dist/src/runtime/executors/loaders/payment-method-handler.js.map +1 -1
  304. package/dist/src/runtime/executors/loaders/product-handler.d.ts +6 -0
  305. package/dist/src/runtime/executors/loaders/product-handler.d.ts.map +1 -1
  306. package/dist/src/runtime/executors/loaders/product-handler.js +31 -13
  307. package/dist/src/runtime/executors/loaders/product-handler.js.map +1 -1
  308. package/dist/src/runtime/executors/loaders/promotion-handler.d.ts.map +1 -1
  309. package/dist/src/runtime/executors/loaders/promotion-handler.js +21 -2
  310. package/dist/src/runtime/executors/loaders/promotion-handler.js.map +1 -1
  311. package/dist/src/runtime/executors/loaders/rest-handler.js +1 -1
  312. package/dist/src/runtime/executors/loaders/rest-handler.js.map +1 -1
  313. package/dist/src/runtime/executors/loaders/shared-lookups.d.ts +28 -1
  314. package/dist/src/runtime/executors/loaders/shared-lookups.d.ts.map +1 -1
  315. package/dist/src/runtime/executors/loaders/shared-lookups.js +136 -0
  316. package/dist/src/runtime/executors/loaders/shared-lookups.js.map +1 -1
  317. package/dist/src/runtime/executors/loaders/shipping-method-handler.d.ts.map +1 -1
  318. package/dist/src/runtime/executors/loaders/shipping-method-handler.js +8 -1
  319. package/dist/src/runtime/executors/loaders/shipping-method-handler.js.map +1 -1
  320. package/dist/src/runtime/executors/loaders/stock-location-handler.d.ts.map +1 -1
  321. package/dist/src/runtime/executors/loaders/stock-location-handler.js +8 -1
  322. package/dist/src/runtime/executors/loaders/stock-location-handler.js.map +1 -1
  323. package/dist/src/runtime/executors/loaders/tax-rate-handler.d.ts.map +1 -1
  324. package/dist/src/runtime/executors/loaders/tax-rate-handler.js +14 -1
  325. package/dist/src/runtime/executors/loaders/tax-rate-handler.js.map +1 -1
  326. package/dist/src/runtime/executors/loaders/types.d.ts +2 -0
  327. package/dist/src/runtime/executors/loaders/types.d.ts.map +1 -1
  328. package/dist/src/runtime/executors/loaders/variant-handler.d.ts +24 -2
  329. package/dist/src/runtime/executors/loaders/variant-handler.d.ts.map +1 -1
  330. package/dist/src/runtime/executors/loaders/variant-handler.js +190 -44
  331. package/dist/src/runtime/executors/loaders/variant-handler.js.map +1 -1
  332. package/dist/src/runtime/executors/sink-handler-registry.js +2 -2
  333. package/dist/src/runtime/executors/sink-handler-registry.js.map +1 -1
  334. package/dist/src/services/data/record-error.service.d.ts +1 -1
  335. package/dist/src/services/data/record-error.service.d.ts.map +1 -1
  336. package/dist/src/services/data/record-error.service.js +4 -1
  337. package/dist/src/services/data/record-error.service.js.map +1 -1
  338. package/dist/src/services/logger/execution-logger.d.ts +1 -1
  339. package/dist/src/services/logger/execution-logger.d.ts.map +1 -1
  340. package/dist/src/services/logger/execution-logger.js +8 -4
  341. package/dist/src/services/logger/execution-logger.js.map +1 -1
  342. package/dist/src/services/pipeline/pipeline-runner.service.d.ts.map +1 -1
  343. package/dist/src/services/pipeline/pipeline-runner.service.js +3 -3
  344. package/dist/src/services/pipeline/pipeline-runner.service.js.map +1 -1
  345. package/dist/src/utils/error.utils.d.ts +1 -1
  346. package/dist/src/utils/error.utils.d.ts.map +1 -1
  347. package/dist/src/utils/error.utils.js +2 -1
  348. package/dist/src/utils/error.utils.js.map +1 -1
  349. package/dist/src/utils/url-security.utils.d.ts +5 -3
  350. package/dist/src/utils/url-security.utils.d.ts.map +1 -1
  351. package/dist/src/utils/url-security.utils.js +20 -4
  352. package/dist/src/utils/url-security.utils.js.map +1 -1
  353. package/docs/reference/loaders.md +39 -2
  354. package/package.json +2 -2
  355. package/shared/types/adapter-config.types.ts +278 -9
  356. package/shared/types/index.ts +13 -0
  357. package/shared/utils/error.ts +11 -0
@@ -0,0 +1,253 @@
1
+ import * as React from 'react';
2
+ import {
3
+ GitBranch,
4
+ Settings,
5
+ type LucideIcon,
6
+ } from 'lucide-react';
7
+ import { useAdapters } from './api/use-adapters';
8
+ import { useConnectionCodes } from './api/use-connections';
9
+ import { useSecrets } from './api/use-secrets';
10
+ import { QUERY_LIMITS, FALLBACK_COLORS, UI_ADAPTER_CATEGORY, ADAPTER_TYPE_TO_NODE_TYPE, ADAPTER_TYPE_TO_CATEGORY } from '../constants';
11
+ import { resolveIconName } from '../utils/icon-resolver';
12
+
13
+ interface CatalogSchemaField {
14
+ key: string;
15
+ label?: string;
16
+ type: string;
17
+ required?: boolean;
18
+ description?: string;
19
+ defaultValue?: unknown;
20
+ placeholder?: string;
21
+ options?: Array<{ value: string; label: string }>;
22
+ }
23
+
24
+ export interface AdapterMetadata {
25
+ code: string;
26
+ type: string;
27
+ name: string;
28
+ description?: string;
29
+ icon: LucideIcon;
30
+ color: string;
31
+ category: string;
32
+ nodeType: AdapterNodeType;
33
+ schema?: {
34
+ fields: CatalogSchemaField[];
35
+ };
36
+ entityType?: string;
37
+ formatType?: string;
38
+ patchableFields?: string[];
39
+ editorType?: string;
40
+ summaryTemplate?: string;
41
+ categoryLabel?: string;
42
+ categoryOrder?: number;
43
+ wizardHidden?: boolean;
44
+ builtIn?: boolean;
45
+ }
46
+
47
+ type AdapterNodeType = import('../types').VisualNodeCategory;
48
+
49
+ interface AdapterCatalog {
50
+ sources: AdapterMetadata[];
51
+ transforms: AdapterMetadata[];
52
+ validation: AdapterMetadata[];
53
+ routing: AdapterMetadata[];
54
+ destinations: AdapterMetadata[];
55
+ feeds: AdapterMetadata[];
56
+ exports: AdapterMetadata[];
57
+ sinks: AdapterMetadata[];
58
+ all: AdapterMetadata[];
59
+ }
60
+
61
+ function adapterTypeToNodeType(adapterType: string): AdapterNodeType {
62
+ return (ADAPTER_TYPE_TO_NODE_TYPE[adapterType] ?? 'transform') as AdapterNodeType;
63
+ }
64
+
65
+ function adapterTypeToCategory(adapterType: string): string {
66
+ return ADAPTER_TYPE_TO_CATEGORY[adapterType] ?? 'other';
67
+ }
68
+
69
+ function buildAdapterMetadata(adapter: {
70
+ code: string;
71
+ type: string;
72
+ name?: string | null;
73
+ description?: string | null;
74
+ icon?: string | null;
75
+ color?: string | null;
76
+ schema?: {
77
+ fields: Array<{
78
+ key: string;
79
+ label?: string | null;
80
+ type: string;
81
+ required?: boolean | null;
82
+ description?: string | null;
83
+ defaultValue?: unknown;
84
+ placeholder?: string | null;
85
+ options?: Array<{ value: string; label: string }> | null;
86
+ }>;
87
+ };
88
+ entityType?: string | null;
89
+ formatType?: string | null;
90
+ patchableFields?: readonly string[] | null;
91
+ editorType?: string | null;
92
+ summaryTemplate?: string | null;
93
+ categoryLabel?: string | null;
94
+ categoryOrder?: number | null;
95
+ wizardHidden?: boolean | null;
96
+ builtIn?: boolean | null;
97
+ }): AdapterMetadata {
98
+ const code = adapter.code;
99
+ const type = adapter.type;
100
+
101
+ const icon = resolveIconName(adapter.icon) ?? Settings;
102
+ const color = adapter.color ?? FALLBACK_COLORS.UNKNOWN_STEP_COLOR;
103
+
104
+ let schema = adapter.schema;
105
+ if (typeof schema === 'string') {
106
+ try {
107
+ schema = JSON.parse(schema);
108
+ } catch {
109
+ schema = { fields: [] };
110
+ }
111
+ }
112
+
113
+ const mappedFields: CatalogSchemaField[] = (schema?.fields ?? []).map((f) => ({
114
+ key: f.key,
115
+ label: f.label ?? undefined,
116
+ type: f.type,
117
+ required: f.required ?? undefined,
118
+ description: f.description ?? undefined,
119
+ defaultValue: f.defaultValue ?? undefined,
120
+ placeholder: f.placeholder ?? undefined,
121
+ options: f.options ?? undefined,
122
+ }));
123
+
124
+ return {
125
+ code,
126
+ type,
127
+ name: adapter.name ?? code,
128
+ description: adapter.description ?? undefined,
129
+ icon,
130
+ color,
131
+ category: adapterTypeToCategory(type),
132
+ nodeType: adapterTypeToNodeType(type),
133
+ schema: { fields: mappedFields },
134
+ entityType: adapter.entityType ?? undefined,
135
+ formatType: adapter.formatType ?? undefined,
136
+ patchableFields: adapter.patchableFields ? [...adapter.patchableFields] : undefined,
137
+ editorType: adapter.editorType ?? undefined,
138
+ summaryTemplate: adapter.summaryTemplate ?? undefined,
139
+ categoryLabel: adapter.categoryLabel ?? undefined,
140
+ categoryOrder: adapter.categoryOrder ?? undefined,
141
+ wizardHidden: adapter.wizardHidden ?? undefined,
142
+ builtIn: adapter.builtIn ?? undefined,
143
+ };
144
+ }
145
+
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
+ interface UseAdapterCatalogResult {
165
+ catalog: AdapterCatalog;
166
+ adapters: AdapterMetadata[];
167
+ connectionCodes: string[];
168
+ secretOptions: Array<{ code: string; provider?: string }>;
169
+ isLoading: boolean;
170
+ error: Error | null;
171
+ getAdapter: (code: string) => AdapterMetadata | undefined;
172
+ getAdaptersByType: (type: string) => AdapterMetadata[];
173
+ getAdaptersByNodeType: (nodeType: AdapterNodeType) => AdapterMetadata[];
174
+ }
175
+
176
+ export function useAdapterCatalog(): UseAdapterCatalogResult {
177
+ const { data: adaptersData, isLoading: adaptersLoading, error: adaptersError } = useAdapters();
178
+ const { data: connectionCodesData } = useConnectionCodes();
179
+ const { data: secretsData } = useSecrets({ take: QUERY_LIMITS.SECRETS_LIST });
180
+
181
+ const adapters: AdapterMetadata[] = React.useMemo(() => {
182
+ const rawAdapters = adaptersData ?? [];
183
+ const mapped = rawAdapters.map(buildAdapterMetadata);
184
+
185
+ const codes = new Set(mapped.map(a => a.code));
186
+ for (const core of CORE_ADAPTERS) {
187
+ if (!codes.has(core.code)) {
188
+ mapped.push(core);
189
+ }
190
+ }
191
+
192
+ return mapped;
193
+ }, [adaptersData]);
194
+
195
+ const catalog: AdapterCatalog = React.useMemo(() => {
196
+ const sources = adapters.filter(a => a.category === UI_ADAPTER_CATEGORY.SOURCES);
197
+ const transforms = adapters.filter(a => a.category === UI_ADAPTER_CATEGORY.TRANSFORMS);
198
+ const validation = adapters.filter(a => a.category === UI_ADAPTER_CATEGORY.VALIDATION);
199
+ const routing = adapters.filter(a => a.category === UI_ADAPTER_CATEGORY.ROUTING);
200
+ const destinations = adapters.filter(a => a.category === UI_ADAPTER_CATEGORY.DESTINATIONS);
201
+ const feeds = adapters.filter(a => a.category === UI_ADAPTER_CATEGORY.FEEDS);
202
+ const exports = adapters.filter(a => a.category === UI_ADAPTER_CATEGORY.EXPORTS);
203
+ const sinks = adapters.filter(a => a.category === UI_ADAPTER_CATEGORY.SINKS);
204
+
205
+ return {
206
+ sources,
207
+ transforms,
208
+ validation,
209
+ routing,
210
+ destinations,
211
+ feeds,
212
+ exports,
213
+ sinks,
214
+ all: adapters,
215
+ };
216
+ }, [adapters]);
217
+
218
+ const connectionCodes = React.useMemo(() => {
219
+ return connectionCodesData ?? [];
220
+ }, [connectionCodesData]);
221
+
222
+ const secretOptions = React.useMemo(() => {
223
+ return (secretsData?.items ?? []).map(s => ({
224
+ code: s.code,
225
+ provider: s.provider ?? undefined,
226
+ }));
227
+ }, [secretsData]);
228
+
229
+ const getAdapter = React.useCallback((code: string) => {
230
+ return adapters.find(a => a.code === code);
231
+ }, [adapters]);
232
+
233
+ const getAdaptersByType = React.useCallback((type: string) => {
234
+ return adapters.filter(a => a.type === type);
235
+ }, [adapters]);
236
+
237
+ const getAdaptersByNodeType = React.useCallback((nodeType: AdapterNodeType) => {
238
+ return adapters.filter(a => a.nodeType === nodeType);
239
+ }, [adapters]);
240
+
241
+ return {
242
+ catalog,
243
+ adapters,
244
+ connectionCodes,
245
+ secretOptions,
246
+ isLoading: adaptersLoading,
247
+ error: adaptersError as Error | null,
248
+ getAdapter,
249
+ getAdaptersByType,
250
+ getAdaptersByNodeType,
251
+ };
252
+ }
253
+
@@ -0,0 +1,80 @@
1
+ import * as React from 'react';
2
+ import { useQuery } from '@tanstack/react-query';
3
+ import { api } from '@vendure/dashboard';
4
+ import { parse } from 'graphql';
5
+ import { CACHE_TIMES } from '../constants';
6
+ import { filterTemplates } from '../utils/template-helpers';
7
+ import { createQueryKeys } from '../utils/query-key-factory';
8
+
9
+ export interface ExportTemplate {
10
+ id: string;
11
+ name: string;
12
+ description: string;
13
+ icon?: string;
14
+ format: string;
15
+ requiredFields: string[];
16
+ tags?: string[];
17
+ featured?: boolean;
18
+ definition?: {
19
+ sourceEntity?: string;
20
+ format?: string;
21
+ formatOptions?: Record<string, unknown>;
22
+ fields?: { sourceField: string; outputName: string }[];
23
+ destinationType?: string;
24
+ };
25
+ }
26
+
27
+ const exportTemplatesDocument = parse(`
28
+ query DataHubExportTemplatesApi {
29
+ dataHubExportTemplates {
30
+ id
31
+ name
32
+ description
33
+ icon
34
+ format
35
+ requiredFields
36
+ tags
37
+ definition
38
+ }
39
+ }
40
+ `);
41
+
42
+ const exportTemplateKeys = createQueryKeys('export-templates');
43
+
44
+ export interface UseExportTemplatesResult {
45
+ templates: ExportTemplate[];
46
+ getTemplateById: (id: string) => ExportTemplate | undefined;
47
+ searchTemplates: (query: string) => ExportTemplate[];
48
+ isLoading: boolean;
49
+ }
50
+
51
+ export function useExportTemplates(): UseExportTemplatesResult {
52
+ const { data: templates = [], isLoading } = useQuery({
53
+ queryKey: exportTemplateKeys.lists(),
54
+ queryFn: () =>
55
+ api.query(exportTemplatesDocument)
56
+ .then((res: Record<string, unknown>) => {
57
+ const items = res?.dataHubExportTemplates;
58
+ return Array.isArray(items) ? items as ExportTemplate[] : [];
59
+ })
60
+ .catch(() => [] as ExportTemplate[]),
61
+ staleTime: CACHE_TIMES.ADAPTER_CATALOG,
62
+ });
63
+
64
+ const getTemplateById = React.useCallback(
65
+ (id: string) => templates.find(t => t.id === id),
66
+ [templates],
67
+ );
68
+
69
+ const searchTemplates = React.useCallback(
70
+ (query: string) => filterTemplates(templates, query),
71
+ [templates],
72
+ );
73
+
74
+ return {
75
+ templates,
76
+ getTemplateById,
77
+ searchTemplates,
78
+ isLoading,
79
+ };
80
+ }
@@ -0,0 +1,139 @@
1
+ import * as React from 'react';
2
+ import { useQuery } from '@tanstack/react-query';
3
+ import { api } from '@vendure/dashboard';
4
+ import { parse } from 'graphql';
5
+ import type { TemplateCategory } from '../types';
6
+ import { CACHE_TIMES } from '../constants';
7
+ import { filterTemplates } from '../utils/template-helpers';
8
+ import { createQueryKeys } from '../utils/query-key-factory';
9
+
10
+ export interface ImportTemplate {
11
+ id: string;
12
+ name: string;
13
+ description: string;
14
+ category: TemplateCategory;
15
+ icon?: string;
16
+ requiredFields: string[];
17
+ optionalFields: string[];
18
+ sampleData?: Record<string, unknown>[];
19
+ featured?: boolean;
20
+ tags?: string[];
21
+ formats?: string[];
22
+ definition?: {
23
+ sourceType?: string;
24
+ fileFormat?: string;
25
+ targetEntity?: string;
26
+ existingRecords?: string;
27
+ lookupFields?: string[];
28
+ fieldMappings?: { sourceField: string; targetField: string }[];
29
+ };
30
+ }
31
+
32
+ export interface CategoryInfo {
33
+ category: TemplateCategory;
34
+ label: string;
35
+ description: string;
36
+ icon: string;
37
+ count: number;
38
+ }
39
+
40
+ const importTemplatesDocument = parse(`
41
+ query DataHubImportTemplatesApi {
42
+ dataHubImportTemplates {
43
+ id
44
+ name
45
+ description
46
+ category
47
+ icon
48
+ requiredFields
49
+ optionalFields
50
+ sampleData
51
+ featured
52
+ tags
53
+ formats
54
+ definition
55
+ }
56
+ }
57
+ `);
58
+
59
+ const importTemplateCategoriesDocument = parse(`
60
+ query DataHubImportTemplateCategoriesApi {
61
+ dataHubImportTemplateCategories {
62
+ category
63
+ label
64
+ description
65
+ icon
66
+ count
67
+ }
68
+ }
69
+ `);
70
+
71
+ const base = createQueryKeys('import-templates');
72
+ const importTemplateKeys = {
73
+ ...base,
74
+ categories: () => [...base.all, 'categories'] as const,
75
+ };
76
+
77
+ export interface UseImportTemplatesResult {
78
+ templates: ImportTemplate[];
79
+ categories: CategoryInfo[];
80
+ getTemplateById: (id: string) => ImportTemplate | undefined;
81
+ getTemplatesByCategory: (category: TemplateCategory) => ImportTemplate[];
82
+ searchTemplates: (query: string) => ImportTemplate[];
83
+ isLoading: boolean;
84
+ }
85
+
86
+ export function useImportTemplates(): UseImportTemplatesResult {
87
+ const { data: templates = [], isLoading: templatesLoading } = useQuery({
88
+ queryKey: importTemplateKeys.lists(),
89
+ queryFn: () =>
90
+ api.query(importTemplatesDocument)
91
+ .then((res: Record<string, unknown>) => {
92
+ const items = res?.dataHubImportTemplates;
93
+ return Array.isArray(items) ? items as ImportTemplate[] : [];
94
+ })
95
+ .catch(() => [] as ImportTemplate[]),
96
+ staleTime: CACHE_TIMES.ADAPTER_CATALOG,
97
+ });
98
+
99
+ const { data: backendCategories, isLoading: categoriesLoading } = useQuery({
100
+ queryKey: importTemplateKeys.categories(),
101
+ queryFn: () =>
102
+ api.query(importTemplateCategoriesDocument)
103
+ .then((res: Record<string, unknown>) => {
104
+ const items = res?.dataHubImportTemplateCategories;
105
+ return Array.isArray(items) ? items as CategoryInfo[] : [];
106
+ })
107
+ .catch(() => [] as CategoryInfo[]),
108
+ staleTime: CACHE_TIMES.ADAPTER_CATALOG,
109
+ });
110
+
111
+ const categories = React.useMemo(
112
+ () => backendCategories ?? [],
113
+ [backendCategories],
114
+ );
115
+
116
+ const getTemplateById = React.useCallback(
117
+ (id: string) => templates.find(t => t.id === id),
118
+ [templates],
119
+ );
120
+
121
+ const getTemplatesByCategory = React.useCallback(
122
+ (category: TemplateCategory) => templates.filter(t => t.category === category),
123
+ [templates],
124
+ );
125
+
126
+ const searchTemplates = React.useCallback(
127
+ (query: string) => filterTemplates(templates, query),
128
+ [templates],
129
+ );
130
+
131
+ return {
132
+ templates,
133
+ categories,
134
+ getTemplateById,
135
+ getTemplatesByCategory,
136
+ searchTemplates,
137
+ isLoading: templatesLoading || categoriesLoading,
138
+ };
139
+ }
@@ -0,0 +1,29 @@
1
+ import { useState, useCallback, useMemo, useRef, useEffect } from 'react';
2
+
3
+ interface UseLoadMoreOptions {
4
+ pageSize?: number;
5
+ }
6
+
7
+ export function useLoadMore<T>(items: T[], options?: UseLoadMoreOptions) {
8
+ const pageSize = options?.pageSize ?? 10;
9
+ const [displayCount, setDisplayCount] = useState(pageSize);
10
+ const prevLengthRef = useRef(items.length);
11
+
12
+ // Reset displayCount when items array changes length (new data loaded)
13
+ useEffect(() => {
14
+ if (items.length !== prevLengthRef.current) {
15
+ prevLengthRef.current = items.length;
16
+ setDisplayCount(pageSize);
17
+ }
18
+ }, [items.length, pageSize]);
19
+
20
+ const displayed = useMemo(() => items.slice(0, displayCount), [items, displayCount]);
21
+ const hasMore = displayCount < items.length;
22
+ const remaining = items.length - displayCount;
23
+
24
+ const loadMore = useCallback(() => {
25
+ setDisplayCount(c => c + pageSize);
26
+ }, [pageSize]);
27
+
28
+ return { displayed, hasMore, remaining, loadMore };
29
+ }
@@ -0,0 +1,54 @@
1
+ import { useMemo, useRef } from 'react';
2
+
3
+ let keyCounter = 0;
4
+ function generateStableKey(prefix: string): string {
5
+ return `${prefix}-${++keyCounter}-${Date.now()}`;
6
+ }
7
+
8
+ /**
9
+ * Generate stable React keys for items that may be reordered.
10
+ * Uses object identity to track items across renders.
11
+ */
12
+ export function useStableKeys<T extends object>(items: T[], prefix: string): string[] {
13
+ const keysRef = useRef<Map<T, string>>(new Map());
14
+ const prevItemsRef = useRef<T[]>([]);
15
+
16
+ if (prevItemsRef.current !== items) {
17
+ const newMap = new Map<T, string>();
18
+ for (const item of items) {
19
+ const existingKey = keysRef.current.get(item);
20
+ newMap.set(item, existingKey ?? generateStableKey(prefix));
21
+ }
22
+ keysRef.current = newMap;
23
+ prevItemsRef.current = items;
24
+ }
25
+
26
+ return items.map(item => keysRef.current.get(item) ?? generateStableKey(prefix));
27
+ }
28
+
29
+ /**
30
+ * Generate stable IDs for list items that lack referential identity.
31
+ * Uses index-based tracking: IDs persist at the same position across renders.
32
+ * Items at existing indices keep their IDs; new indices get fresh IDs.
33
+ *
34
+ * Use this instead of useStableKeys when items are recreated each render
35
+ * (e.g. from config objects, form state) and cannot be tracked by identity.
36
+ */
37
+ export function useStableIndexIds(items: readonly unknown[], prefix: string): string[] {
38
+ const idMapRef = useRef<Map<number, string>>(new Map());
39
+
40
+ return useMemo(() => {
41
+ const prevMap = idMapRef.current;
42
+ const newMap = new Map<number, string>();
43
+
44
+ const ids = items.map((_, index) => {
45
+ const existing = prevMap.get(index);
46
+ const id = existing ?? generateStableKey(prefix);
47
+ newMap.set(index, id);
48
+ return id;
49
+ });
50
+
51
+ idMapRef.current = newMap;
52
+ return ids;
53
+ }, [items, prefix]);
54
+ }
@@ -0,0 +1,100 @@
1
+ import { useMemo } from 'react';
2
+ import { Play, type LucideIcon } from 'lucide-react';
3
+ import type { TriggerType } from '../../shared/types';
4
+ import { useTriggerTypeSchemas, type TypedOptionValue, type ConfigOptionValue } from './api/use-config-options';
5
+ import { resolveIconName } from '../utils/icon-resolver';
6
+
7
+ export interface TriggerTypeConfig {
8
+ readonly type: TriggerType;
9
+ readonly label: string;
10
+ readonly description: string;
11
+ readonly icon: string;
12
+ }
13
+
14
+ export interface WizardTriggerOption {
15
+ readonly id: string;
16
+ readonly label: string;
17
+ readonly desc: string;
18
+ }
19
+
20
+ function toTriggerTypeConfig(opt: ConfigOptionValue | TypedOptionValue): TriggerTypeConfig {
21
+ return {
22
+ type: opt.value as TriggerType,
23
+ label: opt.label,
24
+ description: opt.description ?? '',
25
+ icon: opt.icon ?? 'play',
26
+ };
27
+ }
28
+
29
+ function toWizardOption(opt: ConfigOptionValue | TypedOptionValue): WizardTriggerOption {
30
+ return {
31
+ id: opt.value,
32
+ label: opt.label,
33
+ desc: opt.description ?? '',
34
+ };
35
+ }
36
+
37
+ /**
38
+ * Provides trigger type metadata from the backend.
39
+ * Replaces the hardcoded TRIGGER_TYPE_CONFIGS, TRIGGER_ICONS,
40
+ * IMPORT_WIZARD_TRIGGERS, and EXPORT_WIZARD_TRIGGERS constants.
41
+ *
42
+ * Trigger wizard scoping is now driven by backend `wizardScopes` metadata
43
+ * instead of hardcoded Sets.
44
+ */
45
+ export function useTriggerTypes() {
46
+ const { schemas: triggerSchemas, isLoading } = useTriggerTypeSchemas();
47
+
48
+ const configs = useMemo(() => {
49
+ const map: Partial<Record<TriggerType, TriggerTypeConfig>> = {};
50
+ for (const schema of triggerSchemas) {
51
+ map[schema.value as TriggerType] = toTriggerTypeConfig(schema);
52
+ }
53
+ return map as Record<TriggerType, TriggerTypeConfig>;
54
+ }, [triggerSchemas]);
55
+
56
+ const configList = useMemo(
57
+ () => triggerSchemas.map(toTriggerTypeConfig),
58
+ [triggerSchemas],
59
+ );
60
+
61
+ const importWizardTriggers = useMemo(
62
+ () => triggerSchemas
63
+ .filter(schema => schema.wizardScopes?.includes('import'))
64
+ .map(toWizardOption),
65
+ [triggerSchemas],
66
+ );
67
+
68
+ const exportWizardTriggers = useMemo(
69
+ () => triggerSchemas
70
+ .filter(schema => schema.wizardScopes?.includes('export'))
71
+ .map(toWizardOption),
72
+ [triggerSchemas],
73
+ );
74
+
75
+ return {
76
+ /** Record<TriggerType, TriggerTypeConfig> for keyed access. */
77
+ configs,
78
+ /** Flat list of all trigger type configs. */
79
+ configList,
80
+ /** Filtered trigger options for import wizard. */
81
+ importWizardTriggers,
82
+ /** Filtered trigger options for export wizard. */
83
+ exportWizardTriggers,
84
+ /** Raw trigger type schemas for schema-driven rendering */
85
+ triggerSchemas,
86
+ isLoading,
87
+ };
88
+ }
89
+
90
+ /**
91
+ * Returns a function that resolves a trigger type string to a LucideIcon.
92
+ * Useful for map/list rendering where a hook cannot be called per item.
93
+ */
94
+ export function useTriggerIconResolver(): (triggerType: TriggerType) => LucideIcon {
95
+ const { configs } = useTriggerTypes();
96
+ return useMemo(
97
+ () => (triggerType: TriggerType) => resolveIconName(configs[triggerType]?.icon) ?? Play,
98
+ [configs],
99
+ );
100
+ }