codika 3.0.0
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/LICENSE +21 -0
- package/README.md +68 -0
- package/dist/cli/commands/completion.d.ts +15 -0
- package/dist/cli/commands/completion.d.ts.map +1 -0
- package/dist/cli/commands/completion.js +810 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/config/clear.d.ts +12 -0
- package/dist/cli/commands/config/clear.d.ts.map +1 -0
- package/dist/cli/commands/config/clear.js +35 -0
- package/dist/cli/commands/config/clear.js.map +1 -0
- package/dist/cli/commands/config/index.d.ts +15 -0
- package/dist/cli/commands/config/index.d.ts.map +1 -0
- package/dist/cli/commands/config/index.js +21 -0
- package/dist/cli/commands/config/index.js.map +1 -0
- package/dist/cli/commands/config/set.d.ts +41 -0
- package/dist/cli/commands/config/set.d.ts.map +1 -0
- package/dist/cli/commands/config/set.js +185 -0
- package/dist/cli/commands/config/set.js.map +1 -0
- package/dist/cli/commands/config/show.d.ts +12 -0
- package/dist/cli/commands/config/show.d.ts.map +1 -0
- package/dist/cli/commands/config/show.js +45 -0
- package/dist/cli/commands/config/show.js.map +1 -0
- package/dist/cli/commands/deploy/documents.d.ts +12 -0
- package/dist/cli/commands/deploy/documents.d.ts.map +1 -0
- package/dist/cli/commands/deploy/documents.js +217 -0
- package/dist/cli/commands/deploy/documents.js.map +1 -0
- package/dist/cli/commands/deploy/index.d.ts +14 -0
- package/dist/cli/commands/deploy/index.d.ts.map +1 -0
- package/dist/cli/commands/deploy/index.js +21 -0
- package/dist/cli/commands/deploy/index.js.map +1 -0
- package/dist/cli/commands/deploy/process-data-ingestion.d.ts +13 -0
- package/dist/cli/commands/deploy/process-data-ingestion.d.ts.map +1 -0
- package/dist/cli/commands/deploy/process-data-ingestion.js +226 -0
- package/dist/cli/commands/deploy/process-data-ingestion.js.map +1 -0
- package/dist/cli/commands/deploy/use-case.d.ts +9 -0
- package/dist/cli/commands/deploy/use-case.d.ts.map +1 -0
- package/dist/cli/commands/deploy/use-case.js +212 -0
- package/dist/cli/commands/deploy/use-case.js.map +1 -0
- package/dist/cli/commands/get/execution.d.ts +9 -0
- package/dist/cli/commands/get/execution.d.ts.map +1 -0
- package/dist/cli/commands/get/execution.js +159 -0
- package/dist/cli/commands/get/execution.js.map +1 -0
- package/dist/cli/commands/get/index.d.ts +13 -0
- package/dist/cli/commands/get/index.d.ts.map +1 -0
- package/dist/cli/commands/get/index.js +20 -0
- package/dist/cli/commands/get/index.js.map +1 -0
- package/dist/cli/commands/get/skills.d.ts +15 -0
- package/dist/cli/commands/get/skills.d.ts.map +1 -0
- package/dist/cli/commands/get/skills.js +135 -0
- package/dist/cli/commands/get/skills.js.map +1 -0
- package/dist/cli/commands/get/use-case.d.ts +9 -0
- package/dist/cli/commands/get/use-case.d.ts.map +1 -0
- package/dist/cli/commands/get/use-case.js +186 -0
- package/dist/cli/commands/get/use-case.js.map +1 -0
- package/dist/cli/commands/init.d.ts +14 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +347 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/integration/delete.d.ts +13 -0
- package/dist/cli/commands/integration/delete.d.ts.map +1 -0
- package/dist/cli/commands/integration/delete.js +140 -0
- package/dist/cli/commands/integration/delete.js.map +1 -0
- package/dist/cli/commands/integration/index.d.ts +13 -0
- package/dist/cli/commands/integration/index.d.ts.map +1 -0
- package/dist/cli/commands/integration/index.js +20 -0
- package/dist/cli/commands/integration/index.js.map +1 -0
- package/dist/cli/commands/integration/list.d.ts +13 -0
- package/dist/cli/commands/integration/list.d.ts.map +1 -0
- package/dist/cli/commands/integration/list.js +129 -0
- package/dist/cli/commands/integration/list.js.map +1 -0
- package/dist/cli/commands/integration/set.d.ts +13 -0
- package/dist/cli/commands/integration/set.d.ts.map +1 -0
- package/dist/cli/commands/integration/set.js +253 -0
- package/dist/cli/commands/integration/set.js.map +1 -0
- package/dist/cli/commands/list/executions.d.ts +12 -0
- package/dist/cli/commands/list/executions.d.ts.map +1 -0
- package/dist/cli/commands/list/executions.js +168 -0
- package/dist/cli/commands/list/executions.js.map +1 -0
- package/dist/cli/commands/list/index.d.ts +11 -0
- package/dist/cli/commands/list/index.d.ts.map +1 -0
- package/dist/cli/commands/list/index.js +14 -0
- package/dist/cli/commands/list/index.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +12 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +58 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/project/create.d.ts +8 -0
- package/dist/cli/commands/project/create.d.ts.map +1 -0
- package/dist/cli/commands/project/create.js +109 -0
- package/dist/cli/commands/project/create.js.map +1 -0
- package/dist/cli/commands/project/index.d.ts +12 -0
- package/dist/cli/commands/project/index.d.ts.map +1 -0
- package/dist/cli/commands/project/index.js +15 -0
- package/dist/cli/commands/project/index.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +12 -0
- package/dist/cli/commands/publish.d.ts.map +1 -0
- package/dist/cli/commands/publish.js +152 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/redeploy.d.ts +11 -0
- package/dist/cli/commands/redeploy.d.ts.map +1 -0
- package/dist/cli/commands/redeploy.js +166 -0
- package/dist/cli/commands/redeploy.js.map +1 -0
- package/dist/cli/commands/status.d.ts +63 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +290 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/trigger.d.ts +8 -0
- package/dist/cli/commands/trigger.d.ts.map +1 -0
- package/dist/cli/commands/trigger.js +247 -0
- package/dist/cli/commands/trigger.js.map +1 -0
- package/dist/cli/commands/use.d.ts +13 -0
- package/dist/cli/commands/use.d.ts.map +1 -0
- package/dist/cli/commands/use.js +92 -0
- package/dist/cli/commands/use.js.map +1 -0
- package/dist/cli/commands/verify/index.d.ts +13 -0
- package/dist/cli/commands/verify/index.d.ts.map +1 -0
- package/dist/cli/commands/verify/index.js +18 -0
- package/dist/cli/commands/verify/index.js.map +1 -0
- package/dist/cli/commands/verify/use-case.d.ts +23 -0
- package/dist/cli/commands/verify/use-case.d.ts.map +1 -0
- package/dist/cli/commands/verify/use-case.js +94 -0
- package/dist/cli/commands/verify/use-case.js.map +1 -0
- package/dist/cli/commands/verify/workflow.d.ts +22 -0
- package/dist/cli/commands/verify/workflow.d.ts.map +1 -0
- package/dist/cli/commands/verify/workflow.js +82 -0
- package/dist/cli/commands/verify/workflow.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +13 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +126 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/cli/index.d.ts +24 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +90 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/templates/claude-md-template.d.ts +12 -0
- package/dist/cli/templates/claude-md-template.d.ts.map +1 -0
- package/dist/cli/templates/claude-md-template.js +162 -0
- package/dist/cli/templates/claude-md-template.js.map +1 -0
- package/dist/cli/templates/config-template.d.ts +18 -0
- package/dist/cli/templates/config-template.d.ts.map +1 -0
- package/dist/cli/templates/config-template.js +350 -0
- package/dist/cli/templates/config-template.js.map +1 -0
- package/dist/cli/templates/skill-templates.d.ts +24 -0
- package/dist/cli/templates/skill-templates.d.ts.map +1 -0
- package/dist/cli/templates/skill-templates.js +117 -0
- package/dist/cli/templates/skill-templates.js.map +1 -0
- package/dist/cli/templates/slug.d.ts +9 -0
- package/dist/cli/templates/slug.d.ts.map +1 -0
- package/dist/cli/templates/slug.js +17 -0
- package/dist/cli/templates/slug.js.map +1 -0
- package/dist/cli/templates/workflow-templates.d.ts +693 -0
- package/dist/cli/templates/workflow-templates.d.ts.map +1 -0
- package/dist/cli/templates/workflow-templates.js +516 -0
- package/dist/cli/templates/workflow-templates.js.map +1 -0
- package/dist/cli/utils/output.d.ts +65 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +188 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/cli/utils/validation-output.d.ts +21 -0
- package/dist/cli/utils/validation-output.d.ts.map +1 -0
- package/dist/cli/utils/validation-output.js +204 -0
- package/dist/cli/utils/validation-output.js.map +1 -0
- package/dist/data/integration-fields.d.ts +27 -0
- package/dist/data/integration-fields.d.ts.map +1 -0
- package/dist/data/integration-fields.js +361 -0
- package/dist/data/integration-fields.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/types/process-types.d.ts +740 -0
- package/dist/types/process-types.d.ts.map +1 -0
- package/dist/types/process-types.js +22 -0
- package/dist/types/process-types.js.map +1 -0
- package/dist/utils/config.d.ts +127 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +315 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/data-ingestion-deploy-client.d.ts +53 -0
- package/dist/utils/data-ingestion-deploy-client.d.ts.map +1 -0
- package/dist/utils/data-ingestion-deploy-client.js +63 -0
- package/dist/utils/data-ingestion-deploy-client.js.map +1 -0
- package/dist/utils/data-ingestion-deployer.d.ts +78 -0
- package/dist/utils/data-ingestion-deployer.d.ts.map +1 -0
- package/dist/utils/data-ingestion-deployer.js +119 -0
- package/dist/utils/data-ingestion-deployer.js.map +1 -0
- package/dist/utils/deploy-client.d.ts +55 -0
- package/dist/utils/deploy-client.d.ts.map +1 -0
- package/dist/utils/deploy-client.js +73 -0
- package/dist/utils/deploy-client.js.map +1 -0
- package/dist/utils/deployment-archiver.d.ts +110 -0
- package/dist/utils/deployment-archiver.d.ts.map +1 -0
- package/dist/utils/deployment-archiver.js +158 -0
- package/dist/utils/deployment-archiver.js.map +1 -0
- package/dist/utils/document-deploy-client.d.ts +41 -0
- package/dist/utils/document-deploy-client.d.ts.map +1 -0
- package/dist/utils/document-deploy-client.js +46 -0
- package/dist/utils/document-deploy-client.js.map +1 -0
- package/dist/utils/encryption.d.ts +85 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +162 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/execution-client.d.ts +71 -0
- package/dist/utils/execution-client.d.ts.map +1 -0
- package/dist/utils/execution-client.js +56 -0
- package/dist/utils/execution-client.js.map +1 -0
- package/dist/utils/integration-client.d.ts +134 -0
- package/dist/utils/integration-client.d.ts.map +1 -0
- package/dist/utils/integration-client.js +109 -0
- package/dist/utils/integration-client.js.map +1 -0
- package/dist/utils/list-executions-client.d.ts +47 -0
- package/dist/utils/list-executions-client.d.ts.map +1 -0
- package/dist/utils/list-executions-client.js +50 -0
- package/dist/utils/list-executions-client.js.map +1 -0
- package/dist/utils/metadata-client.d.ts +90 -0
- package/dist/utils/metadata-client.d.ts.map +1 -0
- package/dist/utils/metadata-client.js +66 -0
- package/dist/utils/metadata-client.js.map +1 -0
- package/dist/utils/project-client.d.ts +70 -0
- package/dist/utils/project-client.d.ts.map +1 -0
- package/dist/utils/project-client.js +63 -0
- package/dist/utils/project-client.js.map +1 -0
- package/dist/utils/project-json.d.ts +71 -0
- package/dist/utils/project-json.d.ts.map +1 -0
- package/dist/utils/project-json.js +129 -0
- package/dist/utils/project-json.js.map +1 -0
- package/dist/utils/publish-client.d.ts +53 -0
- package/dist/utils/publish-client.d.ts.map +1 -0
- package/dist/utils/publish-client.js +64 -0
- package/dist/utils/publish-client.js.map +1 -0
- package/dist/utils/redeploy-client.d.ts +39 -0
- package/dist/utils/redeploy-client.d.ts.map +1 -0
- package/dist/utils/redeploy-client.js +51 -0
- package/dist/utils/redeploy-client.js.map +1 -0
- package/dist/utils/skill-parser.d.ts +52 -0
- package/dist/utils/skill-parser.d.ts.map +1 -0
- package/dist/utils/skill-parser.js +127 -0
- package/dist/utils/skill-parser.js.map +1 -0
- package/dist/utils/skills-client.d.ts +39 -0
- package/dist/utils/skills-client.d.ts.map +1 -0
- package/dist/utils/skills-client.js +32 -0
- package/dist/utils/skills-client.js.map +1 -0
- package/dist/utils/trigger-client.d.ts +78 -0
- package/dist/utils/trigger-client.d.ts.map +1 -0
- package/dist/utils/trigger-client.js +81 -0
- package/dist/utils/trigger-client.js.map +1 -0
- package/dist/utils/use-case-deployer.d.ts +93 -0
- package/dist/utils/use-case-deployer.d.ts.map +1 -0
- package/dist/utils/use-case-deployer.js +270 -0
- package/dist/utils/use-case-deployer.js.map +1 -0
- package/dist/utils/version-manager.d.ts +63 -0
- package/dist/utils/version-manager.d.ts.map +1 -0
- package/dist/utils/version-manager.js +91 -0
- package/dist/utils/version-manager.js.map +1 -0
- package/dist/utils/workflow-encoding.d.ts +26 -0
- package/dist/utils/workflow-encoding.d.ts.map +1 -0
- package/dist/utils/workflow-encoding.js +41 -0
- package/dist/utils/workflow-encoding.js.map +1 -0
- package/dist/validation/fixer.d.ts +56 -0
- package/dist/validation/fixer.d.ts.map +1 -0
- package/dist/validation/fixer.js +168 -0
- package/dist/validation/fixer.js.map +1 -0
- package/dist/validation/rules/codika-init-required.d.ts +18 -0
- package/dist/validation/rules/codika-init-required.d.ts.map +1 -0
- package/dist/validation/rules/codika-init-required.js +70 -0
- package/dist/validation/rules/codika-init-required.js.map +1 -0
- package/dist/validation/rules/codika-submit-result.d.ts +22 -0
- package/dist/validation/rules/codika-submit-result.d.ts.map +1 -0
- package/dist/validation/rules/codika-submit-result.js +144 -0
- package/dist/validation/rules/codika-submit-result.js.map +1 -0
- package/dist/validation/rules/error-branch-required.d.ts +24 -0
- package/dist/validation/rules/error-branch-required.d.ts.map +1 -0
- package/dist/validation/rules/error-branch-required.js +103 -0
- package/dist/validation/rules/error-branch-required.js.map +1 -0
- package/dist/validation/rules/index.d.ts +18 -0
- package/dist/validation/rules/index.d.ts.map +1 -0
- package/dist/validation/rules/index.js +28 -0
- package/dist/validation/rules/index.js.map +1 -0
- package/dist/validation/rules/schedule-webhook-convergence.d.ts +24 -0
- package/dist/validation/rules/schedule-webhook-convergence.d.ts.map +1 -0
- package/dist/validation/rules/schedule-webhook-convergence.js +129 -0
- package/dist/validation/rules/schedule-webhook-convergence.js.map +1 -0
- package/dist/validation/rules/subworkflow-min-params.d.ts +21 -0
- package/dist/validation/rules/subworkflow-min-params.d.ts.map +1 -0
- package/dist/validation/rules/subworkflow-min-params.js +84 -0
- package/dist/validation/rules/subworkflow-min-params.js.map +1 -0
- package/dist/validation/runner.d.ts +43 -0
- package/dist/validation/runner.d.ts.map +1 -0
- package/dist/validation/runner.js +335 -0
- package/dist/validation/runner.js.map +1 -0
- package/dist/validation/types.d.ts +155 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +8 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/use-case-scripts/calledby-consistency.d.ts +23 -0
- package/dist/validation/use-case-scripts/calledby-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/calledby-consistency.js +236 -0
- package/dist/validation/use-case-scripts/calledby-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/config-exports.d.ts +17 -0
- package/dist/validation/use-case-scripts/config-exports.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/config-exports.js +93 -0
- package/dist/validation/use-case-scripts/config-exports.js.map +1 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.d.ts +21 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.js +378 -0
- package/dist/validation/use-case-scripts/custom-integration-schema.js.map +1 -0
- package/dist/validation/use-case-scripts/index.d.ts +27 -0
- package/dist/validation/use-case-scripts/index.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/index.js +52 -0
- package/dist/validation/use-case-scripts/index.js.map +1 -0
- package/dist/validation/use-case-scripts/integration-inheritance.d.ts +35 -0
- package/dist/validation/use-case-scripts/integration-inheritance.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/integration-inheritance.js +348 -0
- package/dist/validation/use-case-scripts/integration-inheritance.js.map +1 -0
- package/dist/validation/use-case-scripts/schema-types.d.ts +21 -0
- package/dist/validation/use-case-scripts/schema-types.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/schema-types.js +134 -0
- package/dist/validation/use-case-scripts/schema-types.js.map +1 -0
- package/dist/validation/use-case-scripts/skill-consistency.d.ts +21 -0
- package/dist/validation/use-case-scripts/skill-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/skill-consistency.js +180 -0
- package/dist/validation/use-case-scripts/skill-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/subworkflow-references.d.ts +22 -0
- package/dist/validation/use-case-scripts/subworkflow-references.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/subworkflow-references.js +139 -0
- package/dist/validation/use-case-scripts/subworkflow-references.js.map +1 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.d.ts +25 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.js +265 -0
- package/dist/validation/use-case-scripts/trigger-type-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/trigger-types.d.ts +20 -0
- package/dist/validation/use-case-scripts/trigger-types.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/trigger-types.js +177 -0
- package/dist/validation/use-case-scripts/trigger-types.js.map +1 -0
- package/dist/validation/use-case-scripts/triggers-required.d.ts +23 -0
- package/dist/validation/use-case-scripts/triggers-required.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/triggers-required.js +111 -0
- package/dist/validation/use-case-scripts/triggers-required.js.map +1 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.d.ts +28 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.js +288 -0
- package/dist/validation/use-case-scripts/webhook-path-consistency.js.map +1 -0
- package/dist/validation/use-case-scripts/workflow-imports.d.ts +16 -0
- package/dist/validation/use-case-scripts/workflow-imports.d.ts.map +1 -0
- package/dist/validation/use-case-scripts/workflow-imports.js +206 -0
- package/dist/validation/use-case-scripts/workflow-imports.js.map +1 -0
- package/dist/validation/workflow-scripts/credential-placeholders.d.ts +21 -0
- package/dist/validation/workflow-scripts/credential-placeholders.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/credential-placeholders.js +278 -0
- package/dist/validation/workflow-scripts/credential-placeholders.js.map +1 -0
- package/dist/validation/workflow-scripts/db-always-output.d.ts +16 -0
- package/dist/validation/workflow-scripts/db-always-output.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/db-always-output.js +95 -0
- package/dist/validation/workflow-scripts/db-always-output.js.map +1 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.d.ts +15 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.js +85 -0
- package/dist/validation/workflow-scripts/exec-workflow-wait.js.map +1 -0
- package/dist/validation/workflow-scripts/index.d.ts +31 -0
- package/dist/validation/workflow-scripts/index.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/index.js +58 -0
- package/dist/validation/workflow-scripts/index.js.map +1 -0
- package/dist/validation/workflow-scripts/instparm-quoting.d.ts +21 -0
- package/dist/validation/workflow-scripts/instparm-quoting.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/instparm-quoting.js +59 -0
- package/dist/validation/workflow-scripts/instparm-quoting.js.map +1 -0
- package/dist/validation/workflow-scripts/llm-model-id.d.ts +17 -0
- package/dist/validation/workflow-scripts/llm-model-id.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/llm-model-id.js +171 -0
- package/dist/validation/workflow-scripts/llm-model-id.js.map +1 -0
- package/dist/validation/workflow-scripts/llm-output-access.d.ts +23 -0
- package/dist/validation/workflow-scripts/llm-output-access.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/llm-output-access.js +274 -0
- package/dist/validation/workflow-scripts/llm-output-access.js.map +1 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.d.ts +20 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.js +87 -0
- package/dist/validation/workflow-scripts/merge-before-terminal.js.map +1 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.d.ts +29 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.js +154 -0
- package/dist/validation/workflow-scripts/placeholder-syntax.js.map +1 -0
- package/dist/validation/workflow-scripts/retry-backoff.d.ts +16 -0
- package/dist/validation/workflow-scripts/retry-backoff.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/retry-backoff.js +197 -0
- package/dist/validation/workflow-scripts/retry-backoff.js.map +1 -0
- package/dist/validation/workflow-scripts/webhook-id.d.ts +17 -0
- package/dist/validation/workflow-scripts/webhook-id.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/webhook-id.js +79 -0
- package/dist/validation/workflow-scripts/webhook-id.js.map +1 -0
- package/dist/validation/workflow-scripts/workflow-format.d.ts +16 -0
- package/dist/validation/workflow-scripts/workflow-format.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/workflow-format.js +51 -0
- package/dist/validation/workflow-scripts/workflow-format.js.map +1 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.d.ts +21 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.js +78 -0
- package/dist/validation/workflow-scripts/workflow-sanitization.js.map +1 -0
- package/dist/validation/workflow-scripts/workflow-settings.d.ts +19 -0
- package/dist/validation/workflow-scripts/workflow-settings.d.ts.map +1 -0
- package/dist/validation/workflow-scripts/workflow-settings.js +131 -0
- package/dist/validation/workflow-scripts/workflow-settings.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: CRED-PLACEHOLDER
|
|
3
|
+
*
|
|
4
|
+
* Validates that credential references in workflows use proper placeholders.
|
|
5
|
+
*
|
|
6
|
+
* Valid credential placeholder patterns:
|
|
7
|
+
* - {{FLEXCRED_CREDNAME_ID_DERCXELF}} / {{FLEXCRED_CREDNAME_NAME_DERCXELF}} (flexible - tries org first, falls back to user)
|
|
8
|
+
* - {{USERCRED_CREDNAME_ID_DERCRESU}} / {{USERCRED_CREDNAME_NAME_DERCRESU}} (user credentials)
|
|
9
|
+
* - {{ORGCRED_CREDNAME_ID_DERCGRO}} / {{ORGCRED_CREDNAME_NAME_DERCGRO}} (organization credentials)
|
|
10
|
+
* - {{INSTCRED_CREDNAME_ID_DERCTSNI}} / {{INSTCRED_CREDNAME_NAME_DERCTSNI}} (instance credentials)
|
|
11
|
+
*
|
|
12
|
+
* Both `id` and `name` fields must use proper placeholders with _ID_ and _NAME_ markers respectively.
|
|
13
|
+
*/
|
|
14
|
+
export const metadata = {
|
|
15
|
+
id: 'CRED-PLACEHOLDER',
|
|
16
|
+
name: 'credential_placeholders',
|
|
17
|
+
severity: 'should',
|
|
18
|
+
description: 'Credential references should use proper placeholders',
|
|
19
|
+
details: 'Replace hardcoded credential values with FLEXCRED, USERCRED, ORGCRED, or INSTCRED placeholders. ' +
|
|
20
|
+
'Use _ID_ suffix for id field and _NAME_ suffix for name field.',
|
|
21
|
+
category: 'credentials',
|
|
22
|
+
};
|
|
23
|
+
// Credential types and their corresponding suffixes
|
|
24
|
+
const CREDENTIAL_TYPES = {
|
|
25
|
+
FLEXCRED: 'DERCXELF',
|
|
26
|
+
USERCRED: 'DERCRESU',
|
|
27
|
+
ORGCRED: 'DERCGRO',
|
|
28
|
+
INSTCRED: 'DERCTSNI',
|
|
29
|
+
};
|
|
30
|
+
// Pattern to extract credential type from a placeholder
|
|
31
|
+
const PLACEHOLDER_PATTERN = /^\{\{(FLEXCRED|USERCRED|ORGCRED|INSTCRED)_([A-Z0-9_]+)_(ID|NAME)_(DERCXELF|DERCRESU|DERCGRO|DERCTSNI)\}\}$/;
|
|
32
|
+
// Pattern to detect if something looks like a placeholder but has wrong format
|
|
33
|
+
const LOOKS_LIKE_PLACEHOLDER = /^\{\{[A-Z_]+.*\}\}$/;
|
|
34
|
+
/**
|
|
35
|
+
* Validates a credential ID placeholder
|
|
36
|
+
* Returns null if valid, error message if invalid
|
|
37
|
+
*/
|
|
38
|
+
function validateIdPlaceholder(value) {
|
|
39
|
+
const match = value.match(PLACEHOLDER_PATTERN);
|
|
40
|
+
if (!match) {
|
|
41
|
+
// Check if it looks like a placeholder but has wrong format
|
|
42
|
+
if (LOOKS_LIKE_PLACEHOLDER.test(value)) {
|
|
43
|
+
// Check for missing _ID_ marker
|
|
44
|
+
if (!value.includes('_ID_')) {
|
|
45
|
+
return { valid: false, error: 'missing _ID_ marker in placeholder' };
|
|
46
|
+
}
|
|
47
|
+
// Check for unknown credential type
|
|
48
|
+
const typeMatch = value.match(/^\{\{([A-Z]+)_/);
|
|
49
|
+
if (typeMatch && !(typeMatch[1] in CREDENTIAL_TYPES)) {
|
|
50
|
+
return { valid: false, error: `unknown credential type "${typeMatch[1]}"` };
|
|
51
|
+
}
|
|
52
|
+
// Check for wrong suffix
|
|
53
|
+
for (const [type, suffix] of Object.entries(CREDENTIAL_TYPES)) {
|
|
54
|
+
if (value.includes(`{{${type}_`)) {
|
|
55
|
+
if (!value.endsWith(`_${suffix}}}`)) {
|
|
56
|
+
return { valid: false, error: `wrong suffix for ${type} (expected ${suffix})` };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { valid: false, error: 'invalid placeholder format' };
|
|
61
|
+
}
|
|
62
|
+
return { valid: false };
|
|
63
|
+
}
|
|
64
|
+
const [, credType, , marker, suffix] = match;
|
|
65
|
+
// Validate marker is ID for id field
|
|
66
|
+
if (marker !== 'ID') {
|
|
67
|
+
return { valid: false, error: 'id field should use _ID_ marker, not _NAME_' };
|
|
68
|
+
}
|
|
69
|
+
// Validate suffix matches credential type
|
|
70
|
+
const expectedSuffix = CREDENTIAL_TYPES[credType];
|
|
71
|
+
if (suffix !== expectedSuffix) {
|
|
72
|
+
return { valid: false, error: `wrong suffix for ${credType} (expected ${expectedSuffix}, got ${suffix})` };
|
|
73
|
+
}
|
|
74
|
+
return { valid: true, type: credType };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validates a credential NAME placeholder
|
|
78
|
+
* Returns null if valid, error message if invalid
|
|
79
|
+
*/
|
|
80
|
+
function validateNamePlaceholder(value) {
|
|
81
|
+
const match = value.match(PLACEHOLDER_PATTERN);
|
|
82
|
+
if (!match) {
|
|
83
|
+
// Check if it looks like a placeholder but has wrong format
|
|
84
|
+
if (LOOKS_LIKE_PLACEHOLDER.test(value)) {
|
|
85
|
+
// Check for missing _NAME_ marker
|
|
86
|
+
if (!value.includes('_NAME_')) {
|
|
87
|
+
return { valid: false, error: 'missing _NAME_ marker in placeholder' };
|
|
88
|
+
}
|
|
89
|
+
// Check for unknown credential type
|
|
90
|
+
const typeMatch = value.match(/^\{\{([A-Z]+)_/);
|
|
91
|
+
if (typeMatch && !(typeMatch[1] in CREDENTIAL_TYPES)) {
|
|
92
|
+
return { valid: false, error: `unknown credential type "${typeMatch[1]}"` };
|
|
93
|
+
}
|
|
94
|
+
// Check for wrong suffix
|
|
95
|
+
for (const [type, suffix] of Object.entries(CREDENTIAL_TYPES)) {
|
|
96
|
+
if (value.includes(`{{${type}_`)) {
|
|
97
|
+
if (!value.endsWith(`_${suffix}}}`)) {
|
|
98
|
+
return { valid: false, error: `wrong suffix for ${type} (expected ${suffix})` };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return { valid: false, error: 'invalid placeholder format' };
|
|
103
|
+
}
|
|
104
|
+
return { valid: false };
|
|
105
|
+
}
|
|
106
|
+
const [, credType, , marker, suffix] = match;
|
|
107
|
+
// Validate marker is NAME for name field
|
|
108
|
+
if (marker !== 'NAME') {
|
|
109
|
+
return { valid: false, error: 'name field should use _NAME_ marker, not _ID_' };
|
|
110
|
+
}
|
|
111
|
+
// Validate suffix matches credential type
|
|
112
|
+
const expectedSuffix = CREDENTIAL_TYPES[credType];
|
|
113
|
+
if (suffix !== expectedSuffix) {
|
|
114
|
+
return { valid: false, error: `wrong suffix for ${credType} (expected ${expectedSuffix}, got ${suffix})` };
|
|
115
|
+
}
|
|
116
|
+
return { valid: true, type: credType };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Check if a value looks like a hardcoded credential ID
|
|
120
|
+
*/
|
|
121
|
+
function looksLikeHardcodedValue(value) {
|
|
122
|
+
// UUID pattern
|
|
123
|
+
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
// Numeric ID
|
|
127
|
+
if (/^\d+$/.test(value)) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
// Firebase-style ID (alphanumeric, 20+ chars)
|
|
131
|
+
if (/^[A-Za-z0-9]{20,}$/.test(value)) {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
// Plain text name (not a placeholder)
|
|
135
|
+
if (!value.startsWith('{{') && value.length > 0) {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Generate helpful fix instructions
|
|
142
|
+
*/
|
|
143
|
+
function generateFixInstructions(credType, field) {
|
|
144
|
+
const marker = field === 'id' ? 'ID' : 'NAME';
|
|
145
|
+
const example = `{{FLEXCRED_${credType.toUpperCase()}_${marker}_DERCXELF}}`;
|
|
146
|
+
return (`Use a proper credential placeholder with _${marker}_ marker. ` +
|
|
147
|
+
`Available types: FLEXCRED (suffix: DERCXELF), USERCRED (suffix: DERCRESU), ORGCRED (suffix: DERCGRO), INSTCRED (suffix: DERCTSNI). ` +
|
|
148
|
+
`Example: ${example}`);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check for credential placeholder issues
|
|
152
|
+
*/
|
|
153
|
+
export function checkCredentialPlaceholders(content, path) {
|
|
154
|
+
const findings = [];
|
|
155
|
+
// Parse as JSON to properly inspect credential blocks
|
|
156
|
+
let parsed;
|
|
157
|
+
try {
|
|
158
|
+
parsed = JSON.parse(content);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// If not valid JSON, skip this check
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
// Check each node's credentials
|
|
165
|
+
if (Array.isArray(parsed.nodes)) {
|
|
166
|
+
for (const node of parsed.nodes) {
|
|
167
|
+
if (node.credentials) {
|
|
168
|
+
for (const [credType, credValue] of Object.entries(node.credentials)) {
|
|
169
|
+
const credObj = credValue;
|
|
170
|
+
if (!credObj)
|
|
171
|
+
continue;
|
|
172
|
+
const nodeName = node.name || node.id;
|
|
173
|
+
let idType;
|
|
174
|
+
let nameType;
|
|
175
|
+
// Check ID field
|
|
176
|
+
if (credObj.id !== undefined) {
|
|
177
|
+
const idValue = String(credObj.id);
|
|
178
|
+
// First check if it looks like a placeholder
|
|
179
|
+
if (LOOKS_LIKE_PLACEHOLDER.test(idValue)) {
|
|
180
|
+
const validation = validateIdPlaceholder(idValue);
|
|
181
|
+
if (!validation.valid) {
|
|
182
|
+
findings.push({
|
|
183
|
+
rule: metadata.id,
|
|
184
|
+
severity: metadata.severity,
|
|
185
|
+
path,
|
|
186
|
+
message: `Node "${nodeName}" credential "${credType}" id: ${validation.error || 'invalid placeholder'}`,
|
|
187
|
+
raw_details: generateFixInstructions(credType, 'id'),
|
|
188
|
+
nodeId: node.id,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
idType = validation.type;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else if (looksLikeHardcodedValue(idValue)) {
|
|
196
|
+
// It's a hardcoded value, not a placeholder
|
|
197
|
+
findings.push({
|
|
198
|
+
rule: metadata.id,
|
|
199
|
+
severity: metadata.severity,
|
|
200
|
+
path,
|
|
201
|
+
message: `Node "${nodeName}" has hardcoded credential id for "${credType}"`,
|
|
202
|
+
raw_details: generateFixInstructions(credType, 'id'),
|
|
203
|
+
nodeId: node.id,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
// Missing id field entirely
|
|
209
|
+
findings.push({
|
|
210
|
+
rule: metadata.id,
|
|
211
|
+
severity: metadata.severity,
|
|
212
|
+
path,
|
|
213
|
+
message: `Node "${nodeName}" credential "${credType}" is missing id field`,
|
|
214
|
+
raw_details: generateFixInstructions(credType, 'id'),
|
|
215
|
+
nodeId: node.id,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// Check NAME field
|
|
219
|
+
if (credObj.name !== undefined) {
|
|
220
|
+
const nameValue = String(credObj.name);
|
|
221
|
+
// First check if it looks like a placeholder
|
|
222
|
+
if (LOOKS_LIKE_PLACEHOLDER.test(nameValue)) {
|
|
223
|
+
const validation = validateNamePlaceholder(nameValue);
|
|
224
|
+
if (!validation.valid) {
|
|
225
|
+
findings.push({
|
|
226
|
+
rule: metadata.id,
|
|
227
|
+
severity: metadata.severity,
|
|
228
|
+
path,
|
|
229
|
+
message: `Node "${nodeName}" credential "${credType}" name: ${validation.error || 'invalid placeholder'}`,
|
|
230
|
+
raw_details: generateFixInstructions(credType, 'name'),
|
|
231
|
+
nodeId: node.id,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
nameType = validation.type;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
else if (looksLikeHardcodedValue(nameValue)) {
|
|
239
|
+
// It's a hardcoded value, not a placeholder
|
|
240
|
+
findings.push({
|
|
241
|
+
rule: metadata.id,
|
|
242
|
+
severity: metadata.severity,
|
|
243
|
+
path,
|
|
244
|
+
message: `Node "${nodeName}" has hardcoded credential name for "${credType}"`,
|
|
245
|
+
raw_details: generateFixInstructions(credType, 'name'),
|
|
246
|
+
nodeId: node.id,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
// Missing name field entirely
|
|
252
|
+
findings.push({
|
|
253
|
+
rule: metadata.id,
|
|
254
|
+
severity: metadata.severity,
|
|
255
|
+
path,
|
|
256
|
+
message: `Node "${nodeName}" credential "${credType}" is missing name field`,
|
|
257
|
+
raw_details: generateFixInstructions(credType, 'name'),
|
|
258
|
+
nodeId: node.id,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
// Check for mismatched types between id and name
|
|
262
|
+
if (idType && nameType && idType !== nameType) {
|
|
263
|
+
findings.push({
|
|
264
|
+
rule: metadata.id,
|
|
265
|
+
severity: metadata.severity,
|
|
266
|
+
path,
|
|
267
|
+
message: `Node "${nodeName}" credential "${credType}" has mismatched types: id uses ${idType} but name uses ${nameType}`,
|
|
268
|
+
raw_details: 'Both id and name should use the same credential type (FLEXCRED, USERCRED, ORGCRED, or INSTCRED)',
|
|
269
|
+
nodeId: node.id,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return findings;
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=credential-placeholders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-placeholders.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/credential-placeholders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: DB-ALWAYS-OUTPUT
|
|
3
|
+
*
|
|
4
|
+
* Validates that database nodes have alwaysOutputData: true set.
|
|
5
|
+
* Without this, empty query results cause all downstream nodes to
|
|
6
|
+
* be silently skipped — the #1 gotcha in n8n workflow development.
|
|
7
|
+
*
|
|
8
|
+
* This is a top-level node property (not inside parameters).
|
|
9
|
+
*/
|
|
10
|
+
import type { Finding, RuleMetadata } from '../types.js';
|
|
11
|
+
export declare const metadata: RuleMetadata;
|
|
12
|
+
/**
|
|
13
|
+
* Check that all database nodes have alwaysOutputData: true
|
|
14
|
+
*/
|
|
15
|
+
export declare function checkDbAlwaysOutput(content: string, path: string): Finding[];
|
|
16
|
+
//# sourceMappingURL=db-always-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-always-output.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/db-always-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,QAAQ,EAAE,YAWtB,CAAC;AAwCF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAwC5E"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: DB-ALWAYS-OUTPUT
|
|
3
|
+
*
|
|
4
|
+
* Validates that database nodes have alwaysOutputData: true set.
|
|
5
|
+
* Without this, empty query results cause all downstream nodes to
|
|
6
|
+
* be silently skipped — the #1 gotcha in n8n workflow development.
|
|
7
|
+
*
|
|
8
|
+
* This is a top-level node property (not inside parameters).
|
|
9
|
+
*/
|
|
10
|
+
export const metadata = {
|
|
11
|
+
id: 'DB-ALWAYS-OUTPUT',
|
|
12
|
+
name: 'db_always_output',
|
|
13
|
+
severity: 'should',
|
|
14
|
+
description: 'Database nodes should have alwaysOutputData: true',
|
|
15
|
+
details: 'Without alwaysOutputData: true, a database query that returns zero rows will ' +
|
|
16
|
+
'cause all downstream nodes to be silently skipped. Set this property to ensure ' +
|
|
17
|
+
'downstream nodes always receive input (even if empty).',
|
|
18
|
+
fixable: true,
|
|
19
|
+
category: 'resilience',
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Database node types that should have alwaysOutputData: true.
|
|
23
|
+
* Matched by checking the last segment of the node type.
|
|
24
|
+
*/
|
|
25
|
+
const DATABASE_NODE_NAMES = new Set([
|
|
26
|
+
'supabase',
|
|
27
|
+
'postgres',
|
|
28
|
+
'mysql',
|
|
29
|
+
'microsoftSql',
|
|
30
|
+
'mongoDb',
|
|
31
|
+
'redis',
|
|
32
|
+
'elasticsearch',
|
|
33
|
+
]);
|
|
34
|
+
/**
|
|
35
|
+
* Check if a node type is a database node
|
|
36
|
+
*/
|
|
37
|
+
function isDatabaseNode(type) {
|
|
38
|
+
const segments = type.split('.');
|
|
39
|
+
const nodeName = segments[segments.length - 1];
|
|
40
|
+
return DATABASE_NODE_NAMES.has(nodeName);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Set alwaysOutputData: true on a node. Simple JSON parse/modify/stringify.
|
|
44
|
+
* Formatting is handled by WORKFLOW-FORMAT which runs last.
|
|
45
|
+
*/
|
|
46
|
+
function patchAlwaysOutputData(content, nodeId) {
|
|
47
|
+
const workflow = JSON.parse(content);
|
|
48
|
+
for (const n of workflow.nodes) {
|
|
49
|
+
if (n.id === nodeId) {
|
|
50
|
+
n.alwaysOutputData = true;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return JSON.stringify(workflow, null, 2) + '\n';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check that all database nodes have alwaysOutputData: true
|
|
58
|
+
*/
|
|
59
|
+
export function checkDbAlwaysOutput(content, path) {
|
|
60
|
+
const findings = [];
|
|
61
|
+
let parsed;
|
|
62
|
+
try {
|
|
63
|
+
parsed = JSON.parse(content);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
const nodes = parsed.nodes || [];
|
|
69
|
+
for (const node of nodes) {
|
|
70
|
+
if (!isDatabaseNode(node.type))
|
|
71
|
+
continue;
|
|
72
|
+
if (node.alwaysOutputData !== true) {
|
|
73
|
+
const nodeName = node.name || node.id;
|
|
74
|
+
const nodeId = node.id;
|
|
75
|
+
findings.push({
|
|
76
|
+
rule: metadata.id,
|
|
77
|
+
severity: metadata.severity,
|
|
78
|
+
path,
|
|
79
|
+
message: `Database node "${nodeName}" is missing alwaysOutputData: true — empty results will skip downstream nodes`,
|
|
80
|
+
raw_details: 'Set alwaysOutputData: true on the node to ensure downstream nodes always ' +
|
|
81
|
+
'receive input, even when the query returns zero rows.',
|
|
82
|
+
nodeId,
|
|
83
|
+
fixable: true,
|
|
84
|
+
fix: {
|
|
85
|
+
description: `Add alwaysOutputData: true to "${nodeName}"`,
|
|
86
|
+
apply: (fileContent) => {
|
|
87
|
+
return patchAlwaysOutputData(fileContent, nodeId);
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return findings;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=db-always-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-always-output.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/db-always-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,CAAC,MAAM,QAAQ,GAAiB;IACpC,EAAE,EAAE,kBAAkB;IACtB,IAAI,EAAE,kBAAkB;IACxB,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,mDAAmD;IAChE,OAAO,EACL,+EAA+E;QAC/E,iFAAiF;QACjF,wDAAwD;IAC1D,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,YAAY;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,UAAU;IACV,UAAU;IACV,OAAO;IACP,cAAc;IACd,SAAS;IACT,OAAO;IACP,eAAe;CAChB,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAAC,OAAe,EAAE,MAAc;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;YACpB,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC1B,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,IAAY;IAC/D,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAU,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAEzC,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;YAEvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ,CAAC,EAAE;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI;gBACJ,OAAO,EAAE,kBAAkB,QAAQ,gFAAgF;gBACnH,WAAW,EACT,2EAA2E;oBAC3E,uDAAuD;gBACzD,MAAM;gBACN,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE;oBACH,WAAW,EAAE,kCAAkC,QAAQ,GAAG;oBAC1D,KAAK,EAAE,CAAC,WAAmB,EAAE,EAAE;wBAC7B,OAAO,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;oBACpD,CAAC;iBACF;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: EXEC-WORKFLOW-WAIT
|
|
3
|
+
*
|
|
4
|
+
* Validates that Execute Workflow nodes have waitForSubWorkflow: true
|
|
5
|
+
* in their options. Without this setting, the parent workflow does not
|
|
6
|
+
* wait for the sub-workflow to complete and return values are silently
|
|
7
|
+
* lost — leading to undefined data in downstream nodes.
|
|
8
|
+
*/
|
|
9
|
+
import type { Finding, RuleMetadata } from '../types.js';
|
|
10
|
+
export declare const metadata: RuleMetadata;
|
|
11
|
+
/**
|
|
12
|
+
* Check that all executeWorkflow nodes have waitForSubWorkflow: true
|
|
13
|
+
*/
|
|
14
|
+
export declare function checkExecWorkflowWait(content: string, path: string): Finding[];
|
|
15
|
+
//# sourceMappingURL=exec-workflow-wait.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-workflow-wait.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/exec-workflow-wait.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,QAAQ,EAAE,YAWtB,CAAC;AAqBF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAgD9E"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: EXEC-WORKFLOW-WAIT
|
|
3
|
+
*
|
|
4
|
+
* Validates that Execute Workflow nodes have waitForSubWorkflow: true
|
|
5
|
+
* in their options. Without this setting, the parent workflow does not
|
|
6
|
+
* wait for the sub-workflow to complete and return values are silently
|
|
7
|
+
* lost — leading to undefined data in downstream nodes.
|
|
8
|
+
*/
|
|
9
|
+
export const metadata = {
|
|
10
|
+
id: 'EXEC-WORKFLOW-WAIT',
|
|
11
|
+
name: 'exec_workflow_wait',
|
|
12
|
+
severity: 'should',
|
|
13
|
+
description: 'Execute Workflow nodes should have waitForSubWorkflow: true',
|
|
14
|
+
details: 'Without waitForSubWorkflow: true, the parent workflow does not wait for the ' +
|
|
15
|
+
'sub-workflow to complete. Return values are silently lost, causing undefined ' +
|
|
16
|
+
'data in downstream nodes.',
|
|
17
|
+
fixable: true,
|
|
18
|
+
category: 'structure',
|
|
19
|
+
};
|
|
20
|
+
const EXEC_WORKFLOW_TYPE = 'n8n-nodes-base.executeWorkflow';
|
|
21
|
+
/**
|
|
22
|
+
* Set waitForSubWorkflow: true on a node. Simple JSON parse/modify/stringify.
|
|
23
|
+
* Formatting is handled by WORKFLOW-FORMAT which runs last.
|
|
24
|
+
*/
|
|
25
|
+
function patchWaitForSubWorkflow(content, nodeId) {
|
|
26
|
+
const workflow = JSON.parse(content);
|
|
27
|
+
for (const n of workflow.nodes) {
|
|
28
|
+
if (n.id === nodeId) {
|
|
29
|
+
if (!n.parameters)
|
|
30
|
+
n.parameters = {};
|
|
31
|
+
if (!n.parameters.options)
|
|
32
|
+
n.parameters.options = {};
|
|
33
|
+
n.parameters.options.waitForSubWorkflow = true;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return JSON.stringify(workflow, null, 2) + '\n';
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check that all executeWorkflow nodes have waitForSubWorkflow: true
|
|
41
|
+
*/
|
|
42
|
+
export function checkExecWorkflowWait(content, path) {
|
|
43
|
+
const findings = [];
|
|
44
|
+
let parsed;
|
|
45
|
+
try {
|
|
46
|
+
parsed = JSON.parse(content);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
const nodes = parsed.nodes || [];
|
|
52
|
+
for (const node of nodes) {
|
|
53
|
+
if (node.type !== EXEC_WORKFLOW_TYPE)
|
|
54
|
+
continue;
|
|
55
|
+
const options = node.parameters?.options;
|
|
56
|
+
const waitForSubWorkflow = options?.waitForSubWorkflow;
|
|
57
|
+
// Skip if explicitly set to false — that's a deliberate fire-and-forget choice
|
|
58
|
+
if (waitForSubWorkflow === false)
|
|
59
|
+
continue;
|
|
60
|
+
// Only flag when waitForSubWorkflow is missing entirely (oversight)
|
|
61
|
+
if (waitForSubWorkflow !== true) {
|
|
62
|
+
const nodeName = node.name || node.id;
|
|
63
|
+
const nodeId = node.id;
|
|
64
|
+
findings.push({
|
|
65
|
+
rule: metadata.id,
|
|
66
|
+
severity: metadata.severity,
|
|
67
|
+
path,
|
|
68
|
+
message: `Node "${nodeName}" is missing waitForSubWorkflow: true — sub-workflow return values will be lost`,
|
|
69
|
+
raw_details: 'Add waitForSubWorkflow: true to the node\'s options to ensure the parent ' +
|
|
70
|
+
'workflow waits for the sub-workflow to complete before continuing. ' +
|
|
71
|
+
'Set to false explicitly if fire-and-forget is intentional.',
|
|
72
|
+
nodeId,
|
|
73
|
+
fixable: true,
|
|
74
|
+
fix: {
|
|
75
|
+
description: `Add waitForSubWorkflow: true to "${nodeName}"`,
|
|
76
|
+
apply: (fileContent) => {
|
|
77
|
+
return patchWaitForSubWorkflow(fileContent, nodeId);
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return findings;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=exec-workflow-wait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-workflow-wait.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/exec-workflow-wait.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,CAAC,MAAM,QAAQ,GAAiB;IACpC,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,oBAAoB;IAC1B,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,6DAA6D;IAC1E,OAAO,EACL,8EAA8E;QAC9E,+EAA+E;QAC/E,2BAA2B;IAC7B,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,WAAW;CACtB,CAAC;AAEF,MAAM,kBAAkB,GAAG,gCAAgC,CAAC;AAE5D;;;GAGG;AACH,SAAS,uBAAuB,CAAC,OAAe,EAAE,MAAc;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,CAAC,CAAC,UAAU;gBAAE,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC;YACrC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO;gBAAE,CAAC,CAAC,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC;YACrD,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/C,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,IAAY;IACjE,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAU,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB;YAAE,SAAS;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;QACzC,MAAM,kBAAkB,GAAG,OAAO,EAAE,kBAAkB,CAAC;QAEvD,+EAA+E;QAC/E,IAAI,kBAAkB,KAAK,KAAK;YAAE,SAAS;QAE3C,oEAAoE;QACpE,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;YAEvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ,CAAC,EAAE;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI;gBACJ,OAAO,EAAE,SAAS,QAAQ,iFAAiF;gBAC3G,WAAW,EACT,2EAA2E;oBAC3E,qEAAqE;oBACrE,4DAA4D;gBAC9D,MAAM;gBACN,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE;oBACH,WAAW,EAAE,oCAAoC,QAAQ,GAAG;oBAC5D,KAAK,EAAE,CAAC,WAAmB,EAAE,EAAE;wBAC7B,OAAO,uBAAuB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;oBACtD,CAAC;iBACF;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Scripts
|
|
3
|
+
*
|
|
4
|
+
* Non-Flowlint validation scripts that operate on raw workflow content.
|
|
5
|
+
* These are used for checks that don't fit the graph-based rule pattern.
|
|
6
|
+
*/
|
|
7
|
+
import type { WorkflowScript } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* All workflow scripts to run during validation
|
|
10
|
+
*
|
|
11
|
+
* Each script receives the raw file content and path,
|
|
12
|
+
* and returns an array of findings.
|
|
13
|
+
*
|
|
14
|
+
* IMPORTANT: checkWorkflowFormat MUST be last — it normalizes
|
|
15
|
+
* formatting after all other fixes have been applied.
|
|
16
|
+
*/
|
|
17
|
+
export declare const workflowScripts: WorkflowScript[];
|
|
18
|
+
export { checkInstparmQuoting } from './instparm-quoting.js';
|
|
19
|
+
export { checkPlaceholderSyntax } from './placeholder-syntax.js';
|
|
20
|
+
export { checkCredentialPlaceholders } from './credential-placeholders.js';
|
|
21
|
+
export { checkWorkflowSettings } from './workflow-settings.js';
|
|
22
|
+
export { checkWorkflowSanitization } from './workflow-sanitization.js';
|
|
23
|
+
export { checkLlmOutputAccess } from './llm-output-access.js';
|
|
24
|
+
export { checkWebhookId } from './webhook-id.js';
|
|
25
|
+
export { checkLlmModelId } from './llm-model-id.js';
|
|
26
|
+
export { checkRetryBackoff } from './retry-backoff.js';
|
|
27
|
+
export { checkMergeBeforeTerminal } from './merge-before-terminal.js';
|
|
28
|
+
export { checkExecWorkflowWait } from './exec-workflow-wait.js';
|
|
29
|
+
export { checkDbAlwaysOutput } from './db-always-output.js';
|
|
30
|
+
export { checkWorkflowFormat } from './workflow-format.js';
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAelD;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,EAc3C,CAAC;AAGF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Scripts
|
|
3
|
+
*
|
|
4
|
+
* Non-Flowlint validation scripts that operate on raw workflow content.
|
|
5
|
+
* These are used for checks that don't fit the graph-based rule pattern.
|
|
6
|
+
*/
|
|
7
|
+
import { checkInstparmQuoting } from './instparm-quoting.js';
|
|
8
|
+
import { checkPlaceholderSyntax } from './placeholder-syntax.js';
|
|
9
|
+
import { checkCredentialPlaceholders } from './credential-placeholders.js';
|
|
10
|
+
import { checkWorkflowSettings } from './workflow-settings.js';
|
|
11
|
+
import { checkWorkflowSanitization } from './workflow-sanitization.js';
|
|
12
|
+
import { checkLlmOutputAccess } from './llm-output-access.js';
|
|
13
|
+
import { checkWebhookId } from './webhook-id.js';
|
|
14
|
+
import { checkLlmModelId } from './llm-model-id.js';
|
|
15
|
+
import { checkRetryBackoff } from './retry-backoff.js';
|
|
16
|
+
import { checkMergeBeforeTerminal } from './merge-before-terminal.js';
|
|
17
|
+
import { checkExecWorkflowWait } from './exec-workflow-wait.js';
|
|
18
|
+
import { checkDbAlwaysOutput } from './db-always-output.js';
|
|
19
|
+
import { checkWorkflowFormat } from './workflow-format.js';
|
|
20
|
+
/**
|
|
21
|
+
* All workflow scripts to run during validation
|
|
22
|
+
*
|
|
23
|
+
* Each script receives the raw file content and path,
|
|
24
|
+
* and returns an array of findings.
|
|
25
|
+
*
|
|
26
|
+
* IMPORTANT: checkWorkflowFormat MUST be last — it normalizes
|
|
27
|
+
* formatting after all other fixes have been applied.
|
|
28
|
+
*/
|
|
29
|
+
export const workflowScripts = [
|
|
30
|
+
checkInstparmQuoting,
|
|
31
|
+
checkPlaceholderSyntax,
|
|
32
|
+
checkCredentialPlaceholders,
|
|
33
|
+
checkWorkflowSettings,
|
|
34
|
+
checkWorkflowSanitization,
|
|
35
|
+
checkLlmOutputAccess,
|
|
36
|
+
checkWebhookId,
|
|
37
|
+
checkLlmModelId,
|
|
38
|
+
checkRetryBackoff,
|
|
39
|
+
checkMergeBeforeTerminal,
|
|
40
|
+
checkExecWorkflowWait,
|
|
41
|
+
checkDbAlwaysOutput,
|
|
42
|
+
checkWorkflowFormat,
|
|
43
|
+
];
|
|
44
|
+
// Re-export individual scripts
|
|
45
|
+
export { checkInstparmQuoting } from './instparm-quoting.js';
|
|
46
|
+
export { checkPlaceholderSyntax } from './placeholder-syntax.js';
|
|
47
|
+
export { checkCredentialPlaceholders } from './credential-placeholders.js';
|
|
48
|
+
export { checkWorkflowSettings } from './workflow-settings.js';
|
|
49
|
+
export { checkWorkflowSanitization } from './workflow-sanitization.js';
|
|
50
|
+
export { checkLlmOutputAccess } from './llm-output-access.js';
|
|
51
|
+
export { checkWebhookId } from './webhook-id.js';
|
|
52
|
+
export { checkLlmModelId } from './llm-model-id.js';
|
|
53
|
+
export { checkRetryBackoff } from './retry-backoff.js';
|
|
54
|
+
export { checkMergeBeforeTerminal } from './merge-before-terminal.js';
|
|
55
|
+
export { checkExecWorkflowWait } from './exec-workflow-wait.js';
|
|
56
|
+
export { checkDbAlwaysOutput } from './db-always-output.js';
|
|
57
|
+
export { checkWorkflowFormat } from './workflow-format.js';
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,oBAAoB;IACpB,sBAAsB;IACtB,2BAA2B;IAC3B,qBAAqB;IACrB,yBAAyB;IACzB,oBAAoB;IACpB,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,wBAAwB;IACxB,qBAAqB;IACrB,mBAAmB;IACnB,mBAAmB;CACpB,CAAC;AAEF,+BAA+B;AAC/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script: INSTPARM-QUOTE
|
|
3
|
+
*
|
|
4
|
+
* Checks that INSTPARM placeholders are not incorrectly quoted.
|
|
5
|
+
*
|
|
6
|
+
* CORRECT: const x = {{INSTPARM_NAME_MRAPTSNI}};
|
|
7
|
+
* INCORRECT: const x = '{{INSTPARM_NAME_MRAPTSNI}}';
|
|
8
|
+
*
|
|
9
|
+
* When INSTPARM placeholders are quoted, they become string literals
|
|
10
|
+
* instead of being replaced with the actual value at runtime.
|
|
11
|
+
*
|
|
12
|
+
* This script provides auto-fix capability to remove the quotes.
|
|
13
|
+
*/
|
|
14
|
+
import type { Finding } from '../types.js';
|
|
15
|
+
import type { RuleMetadata } from '../types.js';
|
|
16
|
+
export declare const metadata: RuleMetadata;
|
|
17
|
+
/**
|
|
18
|
+
* Check for incorrectly quoted INSTPARM placeholders
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkInstparmQuoting(content: string, path: string): Finding[];
|
|
21
|
+
//# sourceMappingURL=instparm-quoting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instparm-quoting.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/instparm-quoting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,QAAQ,EAAE,YAQtB,CAAC;AAMF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAkC7E"}
|