@synergenius/flow-weaver 0.2.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 +122 -0
- package/README.md +315 -0
- package/dist/annotation-generator.d.ts +45 -0
- package/dist/annotation-generator.js +557 -0
- package/dist/api/builder.d.ts +223 -0
- package/dist/api/builder.js +345 -0
- package/dist/api/compile.d.ts +92 -0
- package/dist/api/compile.js +149 -0
- package/dist/api/extract-types.d.ts +29 -0
- package/dist/api/extract-types.js +57 -0
- package/dist/api/generate-in-place.d.ts +73 -0
- package/dist/api/generate-in-place.js +1353 -0
- package/dist/api/generate.d.ts +83 -0
- package/dist/api/generate.js +510 -0
- package/dist/api/helpers.d.ts +248 -0
- package/dist/api/helpers.js +285 -0
- package/dist/api/index.d.ts +46 -0
- package/dist/api/index.js +45 -0
- package/dist/api/inline-runtime.d.ts +27 -0
- package/dist/api/inline-runtime.js +551 -0
- package/dist/api/manipulation/connections.d.ts +79 -0
- package/dist/api/manipulation/connections.js +151 -0
- package/dist/api/manipulation/index.d.ts +34 -0
- package/dist/api/manipulation/index.js +41 -0
- package/dist/api/manipulation/node-types.d.ts +123 -0
- package/dist/api/manipulation/node-types.js +200 -0
- package/dist/api/manipulation/nodes.d.ts +144 -0
- package/dist/api/manipulation/nodes.js +333 -0
- package/dist/api/manipulation/ports.d.ts +59 -0
- package/dist/api/manipulation/ports.js +228 -0
- package/dist/api/manipulation/scopes.d.ts +52 -0
- package/dist/api/manipulation/scopes.js +156 -0
- package/dist/api/manipulation/validation.d.ts +6 -0
- package/dist/api/manipulation/validation.js +6 -0
- package/dist/api/manipulation/workflow.d.ts +81 -0
- package/dist/api/manipulation/workflow.js +116 -0
- package/dist/api/manipulation.d.ts +8 -0
- package/dist/api/manipulation.js +8 -0
- package/dist/api/parse.d.ts +48 -0
- package/dist/api/parse.js +110 -0
- package/dist/api/patterns.d.ts +112 -0
- package/dist/api/patterns.js +306 -0
- package/dist/api/query.d.ts +429 -0
- package/dist/api/query.js +816 -0
- package/dist/api/templates.d.ts +98 -0
- package/dist/api/templates.js +117 -0
- package/dist/api/transform.d.ts +31 -0
- package/dist/api/transform.js +40 -0
- package/dist/api/validate.d.ts +25 -0
- package/dist/api/validate.js +39 -0
- package/dist/api/workflow-file-operations.d.ts +29 -0
- package/dist/api/workflow-file-operations.js +180 -0
- package/dist/ast/builder.d.ts +210 -0
- package/dist/ast/builder.js +395 -0
- package/dist/ast/index.d.ts +5 -0
- package/dist/ast/index.js +5 -0
- package/dist/ast/serialization-node.d.ts +6 -0
- package/dist/ast/serialization-node.js +30 -0
- package/dist/ast/serialization.d.ts +43 -0
- package/dist/ast/serialization.js +134 -0
- package/dist/ast/types.d.ts +852 -0
- package/dist/ast/types.js +2 -0
- package/dist/ast/workflow-utils.d.ts +54 -0
- package/dist/ast/workflow-utils.js +114 -0
- package/dist/body-generator.d.ts +31 -0
- package/dist/body-generator.js +35 -0
- package/dist/built-in-nodes/delay.d.ts +11 -0
- package/dist/built-in-nodes/delay.js +29 -0
- package/dist/built-in-nodes/index.d.ts +5 -0
- package/dist/built-in-nodes/index.js +4 -0
- package/dist/built-in-nodes/invoke-workflow.d.ts +13 -0
- package/dist/built-in-nodes/invoke-workflow.js +25 -0
- package/dist/built-in-nodes/mock-types.d.ts +18 -0
- package/dist/built-in-nodes/mock-types.js +12 -0
- package/dist/built-in-nodes/wait-for-event.d.ts +13 -0
- package/dist/built-in-nodes/wait-for-event.js +25 -0
- package/dist/chevrotain-parser/connect-parser.d.ts +24 -0
- package/dist/chevrotain-parser/connect-parser.js +98 -0
- package/dist/chevrotain-parser/grammar-diagrams.d.ts +29 -0
- package/dist/chevrotain-parser/grammar-diagrams.js +264 -0
- package/dist/chevrotain-parser/index.d.ts +25 -0
- package/dist/chevrotain-parser/index.js +27 -0
- package/dist/chevrotain-parser/map-parser.d.ts +33 -0
- package/dist/chevrotain-parser/map-parser.js +130 -0
- package/dist/chevrotain-parser/node-parser.d.ts +36 -0
- package/dist/chevrotain-parser/node-parser.js +466 -0
- package/dist/chevrotain-parser/path-parser.d.ts +28 -0
- package/dist/chevrotain-parser/path-parser.js +118 -0
- package/dist/chevrotain-parser/port-parser.d.ts +36 -0
- package/dist/chevrotain-parser/port-parser.js +442 -0
- package/dist/chevrotain-parser/position-parser.d.ts +20 -0
- package/dist/chevrotain-parser/position-parser.js +83 -0
- package/dist/chevrotain-parser/scope-parser.d.ts +19 -0
- package/dist/chevrotain-parser/scope-parser.js +104 -0
- package/dist/chevrotain-parser/tokens.d.ts +78 -0
- package/dist/chevrotain-parser/tokens.js +384 -0
- package/dist/chevrotain-parser/trigger-cancel-parser.d.ts +50 -0
- package/dist/chevrotain-parser/trigger-cancel-parser.js +282 -0
- package/dist/cli/commands/changelog.d.ts +13 -0
- package/dist/cli/commands/changelog.js +135 -0
- package/dist/cli/commands/compile.d.ts +64 -0
- package/dist/cli/commands/compile.js +278 -0
- package/dist/cli/commands/create.d.ts +33 -0
- package/dist/cli/commands/create.js +147 -0
- package/dist/cli/commands/describe.d.ts +68 -0
- package/dist/cli/commands/describe.js +377 -0
- package/dist/cli/commands/dev.d.ts +32 -0
- package/dist/cli/commands/dev.js +384 -0
- package/dist/cli/commands/diagram.d.ts +13 -0
- package/dist/cli/commands/diagram.js +33 -0
- package/dist/cli/commands/diff.d.ts +11 -0
- package/dist/cli/commands/diff.js +59 -0
- package/dist/cli/commands/doctor.d.ts +57 -0
- package/dist/cli/commands/doctor.js +719 -0
- package/dist/cli/commands/export.d.ts +57 -0
- package/dist/cli/commands/export.js +163 -0
- package/dist/cli/commands/grammar.d.ts +9 -0
- package/dist/cli/commands/grammar.js +39 -0
- package/dist/cli/commands/init.d.ts +59 -0
- package/dist/cli/commands/init.js +435 -0
- package/dist/cli/commands/listen.d.ts +16 -0
- package/dist/cli/commands/listen.js +39 -0
- package/dist/cli/commands/market.d.ts +52 -0
- package/dist/cli/commands/market.js +436 -0
- package/dist/cli/commands/migrate.d.ts +13 -0
- package/dist/cli/commands/migrate.js +89 -0
- package/dist/cli/commands/openapi.d.ts +37 -0
- package/dist/cli/commands/openapi.js +67 -0
- package/dist/cli/commands/pattern.d.ts +34 -0
- package/dist/cli/commands/pattern.js +185 -0
- package/dist/cli/commands/plugin.d.ts +16 -0
- package/dist/cli/commands/plugin.js +176 -0
- package/dist/cli/commands/run.d.ts +49 -0
- package/dist/cli/commands/run.js +191 -0
- package/dist/cli/commands/serve.d.ts +45 -0
- package/dist/cli/commands/serve.js +81 -0
- package/dist/cli/commands/templates.d.ts +8 -0
- package/dist/cli/commands/templates.js +54 -0
- package/dist/cli/commands/ui.d.ts +16 -0
- package/dist/cli/commands/ui.js +130 -0
- package/dist/cli/commands/validate.d.ts +12 -0
- package/dist/cli/commands/validate.js +247 -0
- package/dist/cli/commands/watch.d.ts +9 -0
- package/dist/cli/commands/watch.js +70 -0
- package/dist/cli/flow-weaver.mjs +92924 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.js +742 -0
- package/dist/cli/templates/ai/mock-provider.d.ts +7 -0
- package/dist/cli/templates/ai/mock-provider.js +64 -0
- package/dist/cli/templates/ai/types.d.ts +47 -0
- package/dist/cli/templates/ai/types.js +5 -0
- package/dist/cli/templates/approvals/index.d.ts +15 -0
- package/dist/cli/templates/approvals/index.js +241 -0
- package/dist/cli/templates/index.d.ts +102 -0
- package/dist/cli/templates/index.js +101 -0
- package/dist/cli/templates/nodes/agent-router.d.ts +3 -0
- package/dist/cli/templates/nodes/agent-router.js +114 -0
- package/dist/cli/templates/nodes/aggregator.d.ts +7 -0
- package/dist/cli/templates/nodes/aggregator.js +63 -0
- package/dist/cli/templates/nodes/conversation-memory.d.ts +3 -0
- package/dist/cli/templates/nodes/conversation-memory.js +85 -0
- package/dist/cli/templates/nodes/http.d.ts +7 -0
- package/dist/cli/templates/nodes/http.js +80 -0
- package/dist/cli/templates/nodes/human-approval.d.ts +3 -0
- package/dist/cli/templates/nodes/human-approval.js +110 -0
- package/dist/cli/templates/nodes/json-extractor.d.ts +3 -0
- package/dist/cli/templates/nodes/json-extractor.js +119 -0
- package/dist/cli/templates/nodes/llm-call.d.ts +3 -0
- package/dist/cli/templates/nodes/llm-call.js +106 -0
- package/dist/cli/templates/nodes/prompt-template.d.ts +3 -0
- package/dist/cli/templates/nodes/prompt-template.js +52 -0
- package/dist/cli/templates/nodes/rag-retriever.d.ts +3 -0
- package/dist/cli/templates/nodes/rag-retriever.js +128 -0
- package/dist/cli/templates/nodes/tool-executor.d.ts +3 -0
- package/dist/cli/templates/nodes/tool-executor.js +108 -0
- package/dist/cli/templates/nodes/transformer.d.ts +7 -0
- package/dist/cli/templates/nodes/transformer.js +68 -0
- package/dist/cli/templates/nodes/validator.d.ts +7 -0
- package/dist/cli/templates/nodes/validator.js +62 -0
- package/dist/cli/templates/providers/index.d.ts +14 -0
- package/dist/cli/templates/providers/index.js +239 -0
- package/dist/cli/templates/shared/approval-types.d.ts +9 -0
- package/dist/cli/templates/shared/approval-types.js +31 -0
- package/dist/cli/templates/shared/llm-types.d.ts +15 -0
- package/dist/cli/templates/shared/llm-types.js +104 -0
- package/dist/cli/templates/workflows/aggregator.d.ts +7 -0
- package/dist/cli/templates/workflows/aggregator.js +104 -0
- package/dist/cli/templates/workflows/ai-agent-durable.d.ts +8 -0
- package/dist/cli/templates/workflows/ai-agent-durable.js +338 -0
- package/dist/cli/templates/workflows/ai-agent.d.ts +31 -0
- package/dist/cli/templates/workflows/ai-agent.js +326 -0
- package/dist/cli/templates/workflows/ai-chat.d.ts +7 -0
- package/dist/cli/templates/workflows/ai-chat.js +169 -0
- package/dist/cli/templates/workflows/ai-pipeline-durable.d.ts +8 -0
- package/dist/cli/templates/workflows/ai-pipeline-durable.js +330 -0
- package/dist/cli/templates/workflows/ai-rag.d.ts +7 -0
- package/dist/cli/templates/workflows/ai-rag.js +186 -0
- package/dist/cli/templates/workflows/ai-react.d.ts +7 -0
- package/dist/cli/templates/workflows/ai-react.js +294 -0
- package/dist/cli/templates/workflows/conditional.d.ts +12 -0
- package/dist/cli/templates/workflows/conditional.js +142 -0
- package/dist/cli/templates/workflows/error-handler.d.ts +7 -0
- package/dist/cli/templates/workflows/error-handler.js +147 -0
- package/dist/cli/templates/workflows/foreach.d.ts +7 -0
- package/dist/cli/templates/workflows/foreach.js +143 -0
- package/dist/cli/templates/workflows/sequential.d.ts +7 -0
- package/dist/cli/templates/workflows/sequential.js +198 -0
- package/dist/cli/templates/workflows/webhook.d.ts +7 -0
- package/dist/cli/templates/workflows/webhook.js +161 -0
- package/dist/cli/utils/logger.d.ts +15 -0
- package/dist/cli/utils/logger.js +46 -0
- package/dist/constants.d.ts +100 -0
- package/dist/constants.js +125 -0
- package/dist/defaults.d.ts +3 -0
- package/dist/defaults.js +3 -0
- package/dist/deployment/config/defaults.d.ts +29 -0
- package/dist/deployment/config/defaults.js +98 -0
- package/dist/deployment/config/loader.d.ts +24 -0
- package/dist/deployment/config/loader.js +236 -0
- package/dist/deployment/config/types.d.ts +117 -0
- package/dist/deployment/config/types.js +5 -0
- package/dist/deployment/core/adapters.d.ts +90 -0
- package/dist/deployment/core/adapters.js +251 -0
- package/dist/deployment/core/executor.d.ts +62 -0
- package/dist/deployment/core/executor.js +197 -0
- package/dist/deployment/core/formatters.d.ts +57 -0
- package/dist/deployment/core/formatters.js +170 -0
- package/dist/deployment/index.d.ts +31 -0
- package/dist/deployment/index.js +48 -0
- package/dist/deployment/openapi/generator.d.ts +146 -0
- package/dist/deployment/openapi/generator.js +347 -0
- package/dist/deployment/openapi/schema-converter.d.ts +49 -0
- package/dist/deployment/openapi/schema-converter.js +192 -0
- package/dist/deployment/targets/base.d.ts +316 -0
- package/dist/deployment/targets/base.js +823 -0
- package/dist/deployment/targets/cloudflare.d.ts +23 -0
- package/dist/deployment/targets/cloudflare.js +1125 -0
- package/dist/deployment/targets/inngest.d.ts +38 -0
- package/dist/deployment/targets/inngest.js +926 -0
- package/dist/deployment/targets/lambda.d.ts +23 -0
- package/dist/deployment/targets/lambda.js +1289 -0
- package/dist/deployment/targets/vercel.d.ts +23 -0
- package/dist/deployment/targets/vercel.js +886 -0
- package/dist/deployment/types.d.ts +183 -0
- package/dist/deployment/types.js +8 -0
- package/dist/diagram/geometry.d.ts +26 -0
- package/dist/diagram/geometry.js +850 -0
- package/dist/diagram/index.d.ts +16 -0
- package/dist/diagram/index.js +42 -0
- package/dist/diagram/layout.d.ts +11 -0
- package/dist/diagram/layout.js +143 -0
- package/dist/diagram/orthogonal-router.d.ts +79 -0
- package/dist/diagram/orthogonal-router.js +568 -0
- package/dist/diagram/renderer.d.ts +3 -0
- package/dist/diagram/renderer.js +207 -0
- package/dist/diagram/theme.d.ts +20 -0
- package/dist/diagram/theme.js +189 -0
- package/dist/diagram/types.d.ts +70 -0
- package/dist/diagram/types.js +2 -0
- package/dist/diff/WorkflowDiffer.d.ts +13 -0
- package/dist/diff/WorkflowDiffer.js +429 -0
- package/dist/diff/formatDiff.d.ts +10 -0
- package/dist/diff/formatDiff.js +220 -0
- package/dist/diff/impact.d.ts +29 -0
- package/dist/diff/impact.js +119 -0
- package/dist/diff/index.d.ts +10 -0
- package/dist/diff/index.js +9 -0
- package/dist/diff/types.d.ts +138 -0
- package/dist/diff/types.js +35 -0
- package/dist/doc-metadata/extractors/annotations.d.ts +56 -0
- package/dist/doc-metadata/extractors/annotations.js +337 -0
- package/dist/doc-metadata/extractors/cli-commands.d.ts +17 -0
- package/dist/doc-metadata/extractors/cli-commands.js +355 -0
- package/dist/doc-metadata/extractors/mcp-tools.d.ts +16 -0
- package/dist/doc-metadata/extractors/mcp-tools.js +689 -0
- package/dist/doc-metadata/extractors/plugin-api.d.ts +19 -0
- package/dist/doc-metadata/extractors/plugin-api.js +279 -0
- package/dist/doc-metadata/index.d.ts +5 -0
- package/dist/doc-metadata/index.js +4 -0
- package/dist/doc-metadata/types.d.ts +120 -0
- package/dist/doc-metadata/types.js +5 -0
- package/dist/editor-completions/annotationValues.d.ts +12 -0
- package/dist/editor-completions/annotationValues.js +138 -0
- package/dist/editor-completions/contextParser.d.ts +40 -0
- package/dist/editor-completions/contextParser.js +410 -0
- package/dist/editor-completions/dataTypes.d.ts +16 -0
- package/dist/editor-completions/dataTypes.js +95 -0
- package/dist/editor-completions/goToDefinition.d.ts +27 -0
- package/dist/editor-completions/goToDefinition.js +112 -0
- package/dist/editor-completions/index.d.ts +39 -0
- package/dist/editor-completions/index.js +181 -0
- package/dist/editor-completions/jsDocAnnotations.d.ts +29 -0
- package/dist/editor-completions/jsDocAnnotations.js +357 -0
- package/dist/editor-completions/modifierCompletions.d.ts +17 -0
- package/dist/editor-completions/modifierCompletions.js +197 -0
- package/dist/editor-completions/types.d.ts +119 -0
- package/dist/editor-completions/types.js +8 -0
- package/dist/export/index.d.ts +68 -0
- package/dist/export/index.js +1074 -0
- package/dist/export/templates.d.ts +24 -0
- package/dist/export/templates.js +186 -0
- package/dist/friendly-errors.d.ts +35 -0
- package/dist/friendly-errors.js +375 -0
- package/dist/function-like.d.ts +38 -0
- package/dist/function-like.js +83 -0
- package/dist/generated-branding.d.ts +16 -0
- package/dist/generated-branding.js +22 -0
- package/dist/generator/async-detection.d.ts +27 -0
- package/dist/generator/async-detection.js +56 -0
- package/dist/generator/code-utils.d.ts +76 -0
- package/dist/generator/code-utils.js +410 -0
- package/dist/generator/control-flow.d.ts +54 -0
- package/dist/generator/control-flow.js +284 -0
- package/dist/generator/inngest.d.ts +53 -0
- package/dist/generator/inngest.js +1126 -0
- package/dist/generator/scope-function-generator.d.ts +78 -0
- package/dist/generator/scope-function-generator.js +360 -0
- package/dist/generator/unified.d.ts +42 -0
- package/dist/generator/unified.js +1504 -0
- package/dist/generator.d.ts +54 -0
- package/dist/generator.js +100 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.js +89 -0
- package/dist/jsdoc-parser.d.ts +308 -0
- package/dist/jsdoc-parser.js +923 -0
- package/dist/jsdoc-port-sync/constants.d.ts +41 -0
- package/dist/jsdoc-port-sync/constants.js +103 -0
- package/dist/jsdoc-port-sync/diff.d.ts +76 -0
- package/dist/jsdoc-port-sync/diff.js +319 -0
- package/dist/jsdoc-port-sync/index.d.ts +42 -0
- package/dist/jsdoc-port-sync/index.js +45 -0
- package/dist/jsdoc-port-sync/port-parser.d.ts +68 -0
- package/dist/jsdoc-port-sync/port-parser.js +579 -0
- package/dist/jsdoc-port-sync/rename.d.ts +21 -0
- package/dist/jsdoc-port-sync/rename.js +256 -0
- package/dist/jsdoc-port-sync/signature-parser.d.ts +104 -0
- package/dist/jsdoc-port-sync/signature-parser.js +559 -0
- package/dist/jsdoc-port-sync/sync.d.ts +36 -0
- package/dist/jsdoc-port-sync/sync.js +644 -0
- package/dist/jsdoc-port-sync.d.ts +10 -0
- package/dist/jsdoc-port-sync.js +10 -0
- package/dist/marketplace/index.d.ts +11 -0
- package/dist/marketplace/index.js +10 -0
- package/dist/marketplace/manifest.d.ts +32 -0
- package/dist/marketplace/manifest.js +176 -0
- package/dist/marketplace/registry.d.ts +30 -0
- package/dist/marketplace/registry.js +100 -0
- package/dist/marketplace/types.d.ts +154 -0
- package/dist/marketplace/types.js +9 -0
- package/dist/marketplace/validator.d.ts +13 -0
- package/dist/marketplace/validator.js +131 -0
- package/dist/mcp/auto-registration.d.ts +3 -0
- package/dist/mcp/auto-registration.js +62 -0
- package/dist/mcp/editor-connection.d.ts +50 -0
- package/dist/mcp/editor-connection.js +125 -0
- package/dist/mcp/event-buffer.d.ts +62 -0
- package/dist/mcp/event-buffer.js +150 -0
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/resources.d.ts +14 -0
- package/dist/mcp/resources.js +55 -0
- package/dist/mcp/response-utils.d.ts +63 -0
- package/dist/mcp/response-utils.js +89 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.js +99 -0
- package/dist/mcp/tools-diagram.d.ts +8 -0
- package/dist/mcp/tools-diagram.js +53 -0
- package/dist/mcp/tools-editor.d.ts +5 -0
- package/dist/mcp/tools-editor.js +190 -0
- package/dist/mcp/tools-export.d.ts +9 -0
- package/dist/mcp/tools-export.js +180 -0
- package/dist/mcp/tools-marketplace.d.ts +9 -0
- package/dist/mcp/tools-marketplace.js +132 -0
- package/dist/mcp/tools-pattern.d.ts +3 -0
- package/dist/mcp/tools-pattern.js +783 -0
- package/dist/mcp/tools-query.d.ts +3 -0
- package/dist/mcp/tools-query.js +364 -0
- package/dist/mcp/tools-template.d.ts +10 -0
- package/dist/mcp/tools-template.js +119 -0
- package/dist/mcp/types.d.ts +70 -0
- package/dist/mcp/types.js +8 -0
- package/dist/mcp/workflow-executor.d.ts +47 -0
- package/dist/mcp/workflow-executor.js +133 -0
- package/dist/migration/registry.d.ts +30 -0
- package/dist/migration/registry.js +29 -0
- package/dist/node-types-generator.d.ts +49 -0
- package/dist/node-types-generator.js +139 -0
- package/dist/npm-packages.d.ts +56 -0
- package/dist/npm-packages.js +255 -0
- package/dist/parser.d.ts +204 -0
- package/dist/parser.js +2100 -0
- package/dist/plugin/PluginPanel.d.ts +12 -0
- package/dist/plugin/PluginPanel.js +5 -0
- package/dist/plugin/index.d.ts +13 -0
- package/dist/plugin/index.js +14 -0
- package/dist/plugin/types.d.ts +75 -0
- package/dist/plugin/types.js +8 -0
- package/dist/resolve-package-types.d.ts +17 -0
- package/dist/resolve-package-types.js +123 -0
- package/dist/runtime/CancellationError.d.ts +11 -0
- package/dist/runtime/CancellationError.js +20 -0
- package/dist/runtime/ExecutionContext.d.ts +146 -0
- package/dist/runtime/ExecutionContext.js +235 -0
- package/dist/runtime/builtin-functions.d.ts +8 -0
- package/dist/runtime/builtin-functions.js +549 -0
- package/dist/runtime/events.d.ts +50 -0
- package/dist/runtime/events.js +2 -0
- package/dist/runtime/function-registry.d.ts +59 -0
- package/dist/runtime/function-registry.js +66 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.js +7 -0
- package/dist/runtime/parameter-resolver.d.ts +62 -0
- package/dist/runtime/parameter-resolver.js +113 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.js +6 -0
- package/dist/server/types.d.ts +93 -0
- package/dist/server/types.js +5 -0
- package/dist/server/webhook-server.d.ts +50 -0
- package/dist/server/webhook-server.js +269 -0
- package/dist/server/workflow-registry.d.ts +61 -0
- package/dist/server/workflow-registry.js +202 -0
- package/dist/shared-project.d.ts +9 -0
- package/dist/shared-project.js +28 -0
- package/dist/sugar-optimizer.d.ts +40 -0
- package/dist/sugar-optimizer.js +387 -0
- package/dist/testing/assertions.d.ts +51 -0
- package/dist/testing/assertions.js +127 -0
- package/dist/testing/index.d.ts +30 -0
- package/dist/testing/index.js +24 -0
- package/dist/testing/mock-approval.d.ts +81 -0
- package/dist/testing/mock-approval.js +98 -0
- package/dist/testing/mock-llm.d.ts +124 -0
- package/dist/testing/mock-llm.js +119 -0
- package/dist/testing/recorder.d.ts +72 -0
- package/dist/testing/recorder.js +70 -0
- package/dist/testing/replayer.d.ts +56 -0
- package/dist/testing/replayer.js +143 -0
- package/dist/testing/token-tracker.d.ts +71 -0
- package/dist/testing/token-tracker.js +94 -0
- package/dist/type-checker.d.ts +42 -0
- package/dist/type-checker.js +190 -0
- package/dist/type-mappings.d.ts +29 -0
- package/dist/type-mappings.js +125 -0
- package/dist/types/branded-ports.d.ts +151 -0
- package/dist/types/branded-ports.js +121 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +5 -0
- package/dist/types.d.ts +139 -0
- package/dist/types.js +15 -0
- package/dist/utils/error-utils.d.ts +15 -0
- package/dist/utils/error-utils.js +27 -0
- package/dist/utils/lru-cache.d.ts +15 -0
- package/dist/utils/lru-cache.js +40 -0
- package/dist/utils/port-ordering.d.ts +26 -0
- package/dist/utils/port-ordering.js +88 -0
- package/dist/utils/port-tag-utils.d.ts +23 -0
- package/dist/utils/port-tag-utils.js +41 -0
- package/dist/utils/string-distance.d.ts +14 -0
- package/dist/utils/string-distance.js +56 -0
- package/dist/validation/agent-detection.d.ts +33 -0
- package/dist/validation/agent-detection.js +115 -0
- package/dist/validation/agent-rules.d.ts +48 -0
- package/dist/validation/agent-rules.js +262 -0
- package/dist/validator.d.ts +92 -0
- package/dist/validator.js +970 -0
- package/package.json +109 -0
|
@@ -0,0 +1,926 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inngest export target
|
|
3
|
+
*
|
|
4
|
+
* Generates durable, event-driven functions using the Inngest platform.
|
|
5
|
+
* Each workflow becomes an Inngest function triggered by a custom event,
|
|
6
|
+
* served via an HTTP endpoint compatible with any framework (Express, Next.js, etc.).
|
|
7
|
+
*/
|
|
8
|
+
import { BaseExportTarget, } from './base.js';
|
|
9
|
+
import { getGeneratedBranding } from '../../generated-branding.js';
|
|
10
|
+
import { generateStandaloneRuntimeModule } from '../../api/inline-runtime.js';
|
|
11
|
+
import { generateInngestFunction } from '../../generator/inngest.js';
|
|
12
|
+
import { AnnotationParser } from '../../parser.js';
|
|
13
|
+
/**
|
|
14
|
+
* Single-workflow Inngest handler template
|
|
15
|
+
*/
|
|
16
|
+
const INNGEST_HANDLER_TEMPLATE = `{{GENERATED_HEADER}}
|
|
17
|
+
import { Inngest } from 'inngest';
|
|
18
|
+
import { serve } from 'inngest/express';
|
|
19
|
+
{{WORKFLOW_IMPORT}}
|
|
20
|
+
|
|
21
|
+
const inngest = new Inngest({ id: '{{SERVICE_ID}}' });
|
|
22
|
+
|
|
23
|
+
export const {{FUNCTION_VAR}} = inngest.createFunction(
|
|
24
|
+
{ id: '{{FUNCTION_ID}}', name: '{{FUNCTION_DISPLAY_NAME}}' },
|
|
25
|
+
{ event: '{{EVENT_NAME}}' },
|
|
26
|
+
async ({ event, step }) => {
|
|
27
|
+
const params = event.data ?? {};
|
|
28
|
+
|
|
29
|
+
const result = await step.run('execute-workflow', async () => {
|
|
30
|
+
return {{FUNCTION_NAME}}(true, params);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
return { success: true, result };
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
// Serve endpoint — mount this on your HTTP framework
|
|
38
|
+
// Express: app.use('/api/inngest', serve({ client: inngest, functions: [{{FUNCTION_VAR}}] }));
|
|
39
|
+
// Next.js: export default serve({ client: inngest, functions: [{{FUNCTION_VAR}}] });
|
|
40
|
+
export const handler = serve({ client: inngest, functions: [{{FUNCTION_VAR}}] });
|
|
41
|
+
export default handler;
|
|
42
|
+
`;
|
|
43
|
+
/**
|
|
44
|
+
* Single-workflow Inngest handler template with docs routes
|
|
45
|
+
*/
|
|
46
|
+
const INNGEST_HANDLER_WITH_DOCS_TEMPLATE = `{{GENERATED_HEADER}}
|
|
47
|
+
import { Inngest } from 'inngest';
|
|
48
|
+
import { serve } from 'inngest/express';
|
|
49
|
+
import express from 'express';
|
|
50
|
+
{{WORKFLOW_IMPORT}}
|
|
51
|
+
import { openApiSpec } from './openapi.js';
|
|
52
|
+
|
|
53
|
+
const inngest = new Inngest({ id: '{{SERVICE_ID}}' });
|
|
54
|
+
|
|
55
|
+
export const {{FUNCTION_VAR}} = inngest.createFunction(
|
|
56
|
+
{ id: '{{FUNCTION_ID}}', name: '{{FUNCTION_DISPLAY_NAME}}' },
|
|
57
|
+
{ event: '{{EVENT_NAME}}' },
|
|
58
|
+
async ({ event, step }) => {
|
|
59
|
+
const params = event.data ?? {};
|
|
60
|
+
|
|
61
|
+
const result = await step.run('execute-workflow', async () => {
|
|
62
|
+
return {{FUNCTION_NAME}}(true, params);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return { success: true, result };
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
// Create Express app with Inngest serve + docs routes
|
|
70
|
+
const app = express();
|
|
71
|
+
|
|
72
|
+
// Inngest serve endpoint
|
|
73
|
+
app.use('/api/inngest', serve({ client: inngest, functions: [{{FUNCTION_VAR}}] }));
|
|
74
|
+
|
|
75
|
+
// OpenAPI spec
|
|
76
|
+
app.get('/api/openapi.json', (_req, res) => {
|
|
77
|
+
res.json(openApiSpec);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Swagger UI
|
|
81
|
+
app.get('/api/docs', (_req, res) => {
|
|
82
|
+
res.setHeader('Content-Type', 'text/html');
|
|
83
|
+
res.send(\`<!DOCTYPE html>
|
|
84
|
+
<html lang="en">
|
|
85
|
+
<head>
|
|
86
|
+
<meta charset="UTF-8">
|
|
87
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
88
|
+
<title>{{FUNCTION_DISPLAY_NAME}} API Documentation</title>
|
|
89
|
+
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css">
|
|
90
|
+
</head>
|
|
91
|
+
<body>
|
|
92
|
+
<div id="swagger-ui"></div>
|
|
93
|
+
<script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
|
|
94
|
+
<script>
|
|
95
|
+
SwaggerUIBundle({
|
|
96
|
+
url: '/api/openapi.json',
|
|
97
|
+
dom_id: '#swagger-ui',
|
|
98
|
+
presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],
|
|
99
|
+
layout: 'BaseLayout'
|
|
100
|
+
});
|
|
101
|
+
</script>
|
|
102
|
+
</body>
|
|
103
|
+
</html>\`);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
export const handler = app;
|
|
107
|
+
export default app;
|
|
108
|
+
`;
|
|
109
|
+
/**
|
|
110
|
+
* OpenAPI spec file template
|
|
111
|
+
*/
|
|
112
|
+
const OPENAPI_SPEC_TEMPLATE = `// Generated OpenAPI specification
|
|
113
|
+
export const openApiSpec = {{OPENAPI_SPEC}};
|
|
114
|
+
`;
|
|
115
|
+
/**
|
|
116
|
+
* Multi-workflow Inngest handler template
|
|
117
|
+
*/
|
|
118
|
+
const INNGEST_MULTI_HANDLER_TEMPLATE = `{{GENERATED_HEADER}}
|
|
119
|
+
import { Inngest } from 'inngest';
|
|
120
|
+
import { serve } from 'inngest/express';
|
|
121
|
+
import express from 'express';
|
|
122
|
+
{{WORKFLOW_IMPORTS}}
|
|
123
|
+
import { functionRegistry } from './runtime/function-registry.js';
|
|
124
|
+
import './runtime/builtin-functions.js';
|
|
125
|
+
import { openApiSpec } from './openapi.js';
|
|
126
|
+
|
|
127
|
+
const inngest = new Inngest({ id: '{{SERVICE_ID}}' });
|
|
128
|
+
|
|
129
|
+
{{FUNCTION_DEFINITIONS}}
|
|
130
|
+
|
|
131
|
+
const functions = [{{FUNCTION_LIST}}];
|
|
132
|
+
|
|
133
|
+
// Create Express app with Inngest serve + API routes
|
|
134
|
+
const app = express();
|
|
135
|
+
app.use(express.json());
|
|
136
|
+
|
|
137
|
+
// Inngest serve endpoint
|
|
138
|
+
app.use('/api/inngest', serve({ client: inngest, functions }));
|
|
139
|
+
|
|
140
|
+
// OpenAPI spec
|
|
141
|
+
app.get('/api/openapi.json', (_req, res) => {
|
|
142
|
+
res.json(openApiSpec);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// Swagger UI
|
|
146
|
+
app.get('/api/docs', (_req, res) => {
|
|
147
|
+
res.setHeader('Content-Type', 'text/html');
|
|
148
|
+
res.send(\`<!DOCTYPE html>
|
|
149
|
+
<html lang="en">
|
|
150
|
+
<head>
|
|
151
|
+
<meta charset="UTF-8">
|
|
152
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
153
|
+
<title>{{SERVICE_NAME}} API Documentation</title>
|
|
154
|
+
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css">
|
|
155
|
+
</head>
|
|
156
|
+
<body>
|
|
157
|
+
<div id="swagger-ui"></div>
|
|
158
|
+
<script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
|
|
159
|
+
<script>
|
|
160
|
+
SwaggerUIBundle({
|
|
161
|
+
url: '/api/openapi.json',
|
|
162
|
+
dom_id: '#swagger-ui',
|
|
163
|
+
presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],
|
|
164
|
+
layout: 'BaseLayout'
|
|
165
|
+
});
|
|
166
|
+
</script>
|
|
167
|
+
</body>
|
|
168
|
+
</html>\`);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// List available functions
|
|
172
|
+
app.get('/api/functions', (req, res) => {
|
|
173
|
+
const category = req.query.category as string | undefined;
|
|
174
|
+
res.json(functionRegistry.list(category as any));
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// Direct invocation endpoint (bypasses Inngest event system)
|
|
178
|
+
app.post('/api/invoke/:workflowName', async (req, res) => {
|
|
179
|
+
const { workflowName } = req.params;
|
|
180
|
+
const handler = directHandlers[workflowName];
|
|
181
|
+
if (!handler) {
|
|
182
|
+
return res.status(404).json({ error: \`Workflow '\${workflowName}' not found\`, availableWorkflows: Object.keys(directHandlers) });
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
try {
|
|
186
|
+
const startTime = Date.now();
|
|
187
|
+
const result = await handler(true, req.body || {});
|
|
188
|
+
res.json({ success: true, result, executionTime: Date.now() - startTime });
|
|
189
|
+
} catch (error) {
|
|
190
|
+
res.status(500).json({ success: false, error: error instanceof Error ? error.message : String(error) });
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
// Direct handler map for synchronous invocation
|
|
195
|
+
type WorkflowHandler = (execute: boolean, params: Record<string, unknown>) => unknown;
|
|
196
|
+
const directHandlers: Record<string, WorkflowHandler> = {
|
|
197
|
+
{{WORKFLOW_ENTRIES}}
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
export const handler = app;
|
|
201
|
+
export default app;
|
|
202
|
+
`;
|
|
203
|
+
/**
|
|
204
|
+
* Node type handler template for Inngest
|
|
205
|
+
*/
|
|
206
|
+
const INNGEST_NODE_TYPE_HANDLER_TEMPLATE = `{{GENERATED_HEADER}}
|
|
207
|
+
import { Inngest } from 'inngest';
|
|
208
|
+
import { serve } from 'inngest/express';
|
|
209
|
+
import express from 'express';
|
|
210
|
+
{{NODE_TYPE_IMPORTS}}
|
|
211
|
+
import { openApiSpec } from './openapi.js';
|
|
212
|
+
|
|
213
|
+
const inngest = new Inngest({ id: '{{SERVICE_ID}}' });
|
|
214
|
+
|
|
215
|
+
{{FUNCTION_DEFINITIONS}}
|
|
216
|
+
|
|
217
|
+
const functions = [{{FUNCTION_LIST}}];
|
|
218
|
+
|
|
219
|
+
// Node type handler map for direct invocation
|
|
220
|
+
type NodeTypeHandler = (execute: boolean, params: Record<string, unknown>) => unknown;
|
|
221
|
+
const nodeTypes: Record<string, NodeTypeHandler> = {
|
|
222
|
+
{{NODE_TYPE_ENTRIES}}
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// Create Express app with Inngest serve + API routes
|
|
226
|
+
const app = express();
|
|
227
|
+
app.use(express.json());
|
|
228
|
+
|
|
229
|
+
// Inngest serve endpoint
|
|
230
|
+
app.use('/api/inngest', serve({ client: inngest, functions }));
|
|
231
|
+
|
|
232
|
+
// OpenAPI spec
|
|
233
|
+
app.get('/api/openapi.json', (_req, res) => {
|
|
234
|
+
res.json(openApiSpec);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
// Swagger UI
|
|
238
|
+
app.get('/api/docs', (_req, res) => {
|
|
239
|
+
res.setHeader('Content-Type', 'text/html');
|
|
240
|
+
res.send(\`<!DOCTYPE html>
|
|
241
|
+
<html lang="en">
|
|
242
|
+
<head>
|
|
243
|
+
<meta charset="UTF-8">
|
|
244
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
245
|
+
<title>{{SERVICE_NAME}} API Documentation</title>
|
|
246
|
+
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css">
|
|
247
|
+
</head>
|
|
248
|
+
<body>
|
|
249
|
+
<div id="swagger-ui"></div>
|
|
250
|
+
<script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
|
|
251
|
+
<script>
|
|
252
|
+
SwaggerUIBundle({
|
|
253
|
+
url: '/api/openapi.json',
|
|
254
|
+
dom_id: '#swagger-ui',
|
|
255
|
+
presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],
|
|
256
|
+
layout: 'BaseLayout'
|
|
257
|
+
});
|
|
258
|
+
</script>
|
|
259
|
+
</body>
|
|
260
|
+
</html>\`);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
// Direct invocation endpoint
|
|
264
|
+
app.post('/api/nodes/:nodeTypeName', async (req, res) => {
|
|
265
|
+
const { nodeTypeName } = req.params;
|
|
266
|
+
const nodeType = nodeTypes[nodeTypeName];
|
|
267
|
+
if (!nodeType) {
|
|
268
|
+
return res.status(404).json({ error: \`Node type '\${nodeTypeName}' not found\`, availableNodeTypes: Object.keys(nodeTypes) });
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
try {
|
|
272
|
+
const startTime = Date.now();
|
|
273
|
+
const result = await nodeType(true, req.body || {});
|
|
274
|
+
res.json({ success: true, result, executionTime: Date.now() - startTime });
|
|
275
|
+
} catch (error) {
|
|
276
|
+
res.status(500).json({ success: false, error: error instanceof Error ? error.message : String(error) });
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
export const handler = app;
|
|
281
|
+
export default app;
|
|
282
|
+
`;
|
|
283
|
+
/**
|
|
284
|
+
* Bundle handler template for Inngest — unified workflows and node types
|
|
285
|
+
*/
|
|
286
|
+
const INNGEST_BUNDLE_HANDLER_TEMPLATE = `{{GENERATED_HEADER}}
|
|
287
|
+
import { Inngest } from 'inngest';
|
|
288
|
+
import { serve } from 'inngest/express';
|
|
289
|
+
import express from 'express';
|
|
290
|
+
{{WORKFLOW_IMPORTS}}
|
|
291
|
+
{{NODE_TYPE_IMPORTS}}
|
|
292
|
+
import { functionRegistry } from './runtime/function-registry.js';
|
|
293
|
+
import './runtime/builtin-functions.js';
|
|
294
|
+
import { openApiSpec } from './openapi.js';
|
|
295
|
+
|
|
296
|
+
const inngest = new Inngest({ id: '{{SERVICE_ID}}' });
|
|
297
|
+
|
|
298
|
+
// --- Inngest function definitions ---
|
|
299
|
+
{{FUNCTION_DEFINITIONS}}
|
|
300
|
+
|
|
301
|
+
const functions = [{{FUNCTION_LIST}}];
|
|
302
|
+
|
|
303
|
+
// --- Direct handler maps for synchronous invocation ---
|
|
304
|
+
type FunctionHandler = (execute: boolean, params: Record<string, unknown>) => unknown;
|
|
305
|
+
|
|
306
|
+
const exposedWorkflows: Record<string, FunctionHandler> = {
|
|
307
|
+
{{EXPOSED_WORKFLOW_ENTRIES}}
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
const exposedNodeTypes: Record<string, FunctionHandler> = {
|
|
311
|
+
{{EXPOSED_NODE_TYPE_ENTRIES}}
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
// Create Express app with Inngest serve + API routes
|
|
315
|
+
const app = express();
|
|
316
|
+
app.use(express.json());
|
|
317
|
+
|
|
318
|
+
// Inngest serve endpoint
|
|
319
|
+
app.use('/api/inngest', serve({ client: inngest, functions }));
|
|
320
|
+
|
|
321
|
+
// OpenAPI spec
|
|
322
|
+
app.get('/api/openapi.json', (_req, res) => {
|
|
323
|
+
res.json(openApiSpec);
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
// Swagger UI
|
|
327
|
+
app.get('/api/docs', (_req, res) => {
|
|
328
|
+
res.setHeader('Content-Type', 'text/html');
|
|
329
|
+
res.send(\`<!DOCTYPE html>
|
|
330
|
+
<html lang="en">
|
|
331
|
+
<head>
|
|
332
|
+
<meta charset="UTF-8">
|
|
333
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
334
|
+
<title>{{SERVICE_NAME}} API Documentation</title>
|
|
335
|
+
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css">
|
|
336
|
+
</head>
|
|
337
|
+
<body>
|
|
338
|
+
<div id="swagger-ui"></div>
|
|
339
|
+
<script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
|
|
340
|
+
<script>
|
|
341
|
+
SwaggerUIBundle({
|
|
342
|
+
url: '/api/openapi.json',
|
|
343
|
+
dom_id: '#swagger-ui',
|
|
344
|
+
presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],
|
|
345
|
+
layout: 'BaseLayout'
|
|
346
|
+
});
|
|
347
|
+
</script>
|
|
348
|
+
</body>
|
|
349
|
+
</html>\`);
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
// List available functions
|
|
353
|
+
app.get('/api/functions', (req, res) => {
|
|
354
|
+
const category = req.query.category as string | undefined;
|
|
355
|
+
res.json(functionRegistry.list(category as any));
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
// Direct invocation: workflows
|
|
359
|
+
app.post('/api/workflows/:name', async (req, res) => {
|
|
360
|
+
const workflow = exposedWorkflows[req.params.name];
|
|
361
|
+
if (!workflow) {
|
|
362
|
+
return res.status(404).json({ error: \`Workflow '\${req.params.name}' not found\`, availableWorkflows: Object.keys(exposedWorkflows) });
|
|
363
|
+
}
|
|
364
|
+
try {
|
|
365
|
+
const startTime = Date.now();
|
|
366
|
+
const result = await workflow(true, req.body || {});
|
|
367
|
+
res.json({ success: true, result, executionTime: Date.now() - startTime });
|
|
368
|
+
} catch (error) {
|
|
369
|
+
res.status(500).json({ success: false, error: error instanceof Error ? error.message : String(error) });
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
// Direct invocation: node types
|
|
374
|
+
app.post('/api/nodes/:name', async (req, res) => {
|
|
375
|
+
const nodeType = exposedNodeTypes[req.params.name];
|
|
376
|
+
if (!nodeType) {
|
|
377
|
+
return res.status(404).json({ error: \`Node type '\${req.params.name}' not found\`, availableNodeTypes: Object.keys(exposedNodeTypes) });
|
|
378
|
+
}
|
|
379
|
+
try {
|
|
380
|
+
const startTime = Date.now();
|
|
381
|
+
const result = await nodeType(true, req.body || {});
|
|
382
|
+
res.json({ success: true, result, executionTime: Date.now() - startTime });
|
|
383
|
+
} catch (error) {
|
|
384
|
+
res.status(500).json({ success: false, error: error instanceof Error ? error.message : String(error) });
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
export const handler = app;
|
|
389
|
+
export default app;
|
|
390
|
+
`;
|
|
391
|
+
/**
|
|
392
|
+
* Inngest export target — durable, event-driven functions
|
|
393
|
+
*/
|
|
394
|
+
export class InngestTarget extends BaseExportTarget {
|
|
395
|
+
name = 'inngest';
|
|
396
|
+
description = 'Inngest — durable, event-driven workflow functions';
|
|
397
|
+
/**
|
|
398
|
+
* Sanitize a name into a valid Inngest ID (lowercase, alphanumeric + hyphens)
|
|
399
|
+
*/
|
|
400
|
+
toInngestId(name) {
|
|
401
|
+
return name
|
|
402
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
403
|
+
.replace(/[^a-zA-Z0-9-]/g, '-')
|
|
404
|
+
.replace(/-+/g, '-')
|
|
405
|
+
.toLowerCase();
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Convert a name to a valid JS variable name
|
|
409
|
+
*/
|
|
410
|
+
toVarName(name) {
|
|
411
|
+
return name.replace(/[^a-zA-Z0-9_$]/g, '_').replace(/^(\d)/, '_$1');
|
|
412
|
+
}
|
|
413
|
+
async generate(options) {
|
|
414
|
+
const files = [];
|
|
415
|
+
const includeDocs = options.includeDocs ?? false;
|
|
416
|
+
const durableSteps = options.targetOptions?.durableSteps === true;
|
|
417
|
+
const serviceId = this.toInngestId(options.displayName);
|
|
418
|
+
const functionId = this.toInngestId(options.workflowName);
|
|
419
|
+
const functionVar = `fn_${this.toVarName(options.workflowName)}`;
|
|
420
|
+
let handlerContent;
|
|
421
|
+
if (durableSteps && options.sourceFile) {
|
|
422
|
+
// Use deep generator: parse source file and generate per-node step.run() code
|
|
423
|
+
const parser = new AnnotationParser();
|
|
424
|
+
const parseResult = parser.parse(options.sourceFile);
|
|
425
|
+
const workflow = parseResult.workflows.find((w) => w.name === options.workflowName || w.functionName === options.workflowName) ?? parseResult.workflows[0];
|
|
426
|
+
if (workflow) {
|
|
427
|
+
const allNodeTypes = [...(workflow.nodeTypes || [])];
|
|
428
|
+
handlerContent = generateInngestFunction(workflow, allNodeTypes, {
|
|
429
|
+
serviceName: serviceId,
|
|
430
|
+
production: options.production ?? true,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
// Fallback to shallow template if workflow not found
|
|
435
|
+
handlerContent = this.generateShallowHandler(options, includeDocs, serviceId, functionId, functionVar);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
handlerContent = this.generateShallowHandler(options, includeDocs, serviceId, functionId, functionVar);
|
|
440
|
+
}
|
|
441
|
+
files.push(this.createFile(options.outputDir, 'handler.ts', handlerContent, 'handler'));
|
|
442
|
+
// Generate OpenAPI spec file if docs enabled
|
|
443
|
+
if (includeDocs) {
|
|
444
|
+
const openApiSpec = this.generateOpenAPISpec(options);
|
|
445
|
+
const openApiContent = OPENAPI_SPEC_TEMPLATE.replace('{{OPENAPI_SPEC}}', JSON.stringify(openApiSpec, null, 2));
|
|
446
|
+
files.push(this.createFile(options.outputDir, 'openapi.ts', openApiContent, 'config'));
|
|
447
|
+
}
|
|
448
|
+
// Generate package.json
|
|
449
|
+
const packageJson = this.generatePackageJson({
|
|
450
|
+
name: options.displayName,
|
|
451
|
+
description: options.description,
|
|
452
|
+
main: 'handler.js',
|
|
453
|
+
scripts: {
|
|
454
|
+
build: 'tsc',
|
|
455
|
+
dev: 'npx inngest-cli@latest dev & npx tsx handler.ts',
|
|
456
|
+
serve: 'npx tsx handler.ts',
|
|
457
|
+
},
|
|
458
|
+
dependencies: {
|
|
459
|
+
inngest: '^3.0.0',
|
|
460
|
+
...(includeDocs ? { express: '^4.18.0' } : {}),
|
|
461
|
+
},
|
|
462
|
+
devDependencies: {
|
|
463
|
+
...(includeDocs ? { '@types/express': '^4.17.0' } : {}),
|
|
464
|
+
},
|
|
465
|
+
});
|
|
466
|
+
files.push(this.createFile(options.outputDir, 'package.json', packageJson, 'package'));
|
|
467
|
+
// Generate tsconfig.json
|
|
468
|
+
const tsConfig = this.generateTsConfig({
|
|
469
|
+
outDir: './dist',
|
|
470
|
+
module: 'NodeNext',
|
|
471
|
+
moduleResolution: 'NodeNext',
|
|
472
|
+
});
|
|
473
|
+
files.push(this.createFile(options.outputDir, 'tsconfig.json', tsConfig, 'config'));
|
|
474
|
+
// Generate README from deploy instructions
|
|
475
|
+
const artifacts = {
|
|
476
|
+
files,
|
|
477
|
+
target: this.name,
|
|
478
|
+
workflowName: options.displayName,
|
|
479
|
+
entryPoint: 'handler.ts',
|
|
480
|
+
};
|
|
481
|
+
const instructions = this.getDeployInstructions(artifacts);
|
|
482
|
+
const readme = this.generateReadme(instructions, options.displayName, 'Inngest');
|
|
483
|
+
files.push(this.createFile(options.outputDir, 'README.md', readme, 'other'));
|
|
484
|
+
return artifacts;
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* Generate the shallow (template-based) handler content.
|
|
488
|
+
* Wraps the entire workflow in a single step.run() call.
|
|
489
|
+
*/
|
|
490
|
+
generateShallowHandler(options, includeDocs, serviceId, functionId, functionVar) {
|
|
491
|
+
const handlerTemplate = includeDocs
|
|
492
|
+
? INNGEST_HANDLER_WITH_DOCS_TEMPLATE
|
|
493
|
+
: INNGEST_HANDLER_TEMPLATE;
|
|
494
|
+
return handlerTemplate
|
|
495
|
+
.replace('{{GENERATED_HEADER}}', getGeneratedBranding().header('export --target inngest'))
|
|
496
|
+
.replace('{{WORKFLOW_IMPORT}}', `import { ${options.workflowName} } from './workflow.js';`)
|
|
497
|
+
.replace(/\{\{SERVICE_ID\}\}/g, serviceId)
|
|
498
|
+
.replace(/\{\{FUNCTION_ID\}\}/g, functionId)
|
|
499
|
+
.replace(/\{\{FUNCTION_VAR\}\}/g, functionVar)
|
|
500
|
+
.replace(/\{\{FUNCTION_DISPLAY_NAME\}\}/g, options.displayName)
|
|
501
|
+
.replace(/\{\{FUNCTION_NAME\}\}/g, options.workflowName)
|
|
502
|
+
.replace(/\{\{EVENT_NAME\}\}/g, `fw/${functionId}.execute`);
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Generate OpenAPI specification for a single workflow
|
|
506
|
+
*/
|
|
507
|
+
generateOpenAPISpec(options) {
|
|
508
|
+
return {
|
|
509
|
+
openapi: '3.0.3',
|
|
510
|
+
info: {
|
|
511
|
+
title: `${options.displayName} API`,
|
|
512
|
+
version: '1.0.0',
|
|
513
|
+
description: options.description || `Inngest-powered API for the ${options.displayName} workflow`,
|
|
514
|
+
},
|
|
515
|
+
servers: [{ url: '/', description: 'Current deployment' }],
|
|
516
|
+
paths: {
|
|
517
|
+
'/api/inngest': {
|
|
518
|
+
post: {
|
|
519
|
+
operationId: 'inngest_webhook',
|
|
520
|
+
summary: 'Inngest webhook endpoint',
|
|
521
|
+
description: 'Receives events from Inngest. Send events via the Inngest SDK or dashboard.',
|
|
522
|
+
tags: ['inngest'],
|
|
523
|
+
requestBody: {
|
|
524
|
+
description: 'Inngest event payload',
|
|
525
|
+
required: true,
|
|
526
|
+
content: { 'application/json': { schema: { type: 'object' } } },
|
|
527
|
+
},
|
|
528
|
+
responses: {
|
|
529
|
+
'200': { description: 'Event acknowledged' },
|
|
530
|
+
},
|
|
531
|
+
},
|
|
532
|
+
},
|
|
533
|
+
},
|
|
534
|
+
tags: [
|
|
535
|
+
{ name: 'inngest', description: 'Inngest event endpoints' },
|
|
536
|
+
],
|
|
537
|
+
'x-inngest-events': {
|
|
538
|
+
[`fw/${this.toInngestId(options.workflowName)}.execute`]: {
|
|
539
|
+
description: `Trigger ${options.displayName} workflow execution`,
|
|
540
|
+
schema: {
|
|
541
|
+
type: 'object',
|
|
542
|
+
properties: {
|
|
543
|
+
name: { type: 'string', const: `fw/${this.toInngestId(options.workflowName)}.execute` },
|
|
544
|
+
data: { type: 'object', description: 'Workflow input parameters' },
|
|
545
|
+
},
|
|
546
|
+
},
|
|
547
|
+
},
|
|
548
|
+
},
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
async generateMultiWorkflow(workflows, options) {
|
|
552
|
+
const files = [];
|
|
553
|
+
const serviceName = options.displayName || 'multi-workflow-service';
|
|
554
|
+
const serviceId = this.toInngestId(serviceName);
|
|
555
|
+
// Generate workflow imports
|
|
556
|
+
const workflowImports = workflows
|
|
557
|
+
.map((w) => `import { ${w.functionName} } from './workflows/${w.name}.js';`)
|
|
558
|
+
.join('\n');
|
|
559
|
+
// Generate Inngest function definitions
|
|
560
|
+
const functionDefs = workflows.map((w) => {
|
|
561
|
+
const fnId = this.toInngestId(w.name);
|
|
562
|
+
const fnVar = `fn_${this.toVarName(w.functionName)}`;
|
|
563
|
+
return `export const ${fnVar} = inngest.createFunction(
|
|
564
|
+
{ id: '${fnId}', name: '${w.name}' },
|
|
565
|
+
{ event: 'fw/${fnId}.execute' },
|
|
566
|
+
async ({ event, step }) => {
|
|
567
|
+
const params = event.data ?? {};
|
|
568
|
+
const result = await step.run('execute-workflow', async () => {
|
|
569
|
+
return ${w.functionName}(true, params);
|
|
570
|
+
});
|
|
571
|
+
return { success: true, result };
|
|
572
|
+
}
|
|
573
|
+
);`;
|
|
574
|
+
}).join('\n\n');
|
|
575
|
+
const functionList = workflows
|
|
576
|
+
.map((w) => `fn_${this.toVarName(w.functionName)}`)
|
|
577
|
+
.join(', ');
|
|
578
|
+
const workflowEntries = workflows
|
|
579
|
+
.map((w) => ` '${w.name}': ${w.functionName},`)
|
|
580
|
+
.join('\n');
|
|
581
|
+
// Generate handler
|
|
582
|
+
const handlerContent = INNGEST_MULTI_HANDLER_TEMPLATE
|
|
583
|
+
.replace('{{GENERATED_HEADER}}', getGeneratedBranding().header('export --target inngest --multi'))
|
|
584
|
+
.replace('{{WORKFLOW_IMPORTS}}', workflowImports)
|
|
585
|
+
.replace('{{FUNCTION_DEFINITIONS}}', functionDefs)
|
|
586
|
+
.replace('{{FUNCTION_LIST}}', functionList)
|
|
587
|
+
.replace('{{WORKFLOW_ENTRIES}}', workflowEntries)
|
|
588
|
+
.replace(/\{\{SERVICE_ID\}\}/g, serviceId)
|
|
589
|
+
.replace(/\{\{SERVICE_NAME\}\}/g, serviceName);
|
|
590
|
+
files.push(this.createFile(options.outputDir, 'handler.ts', handlerContent, 'handler'));
|
|
591
|
+
// Generate consolidated OpenAPI spec
|
|
592
|
+
const openApiSpec = this.generateConsolidatedOpenAPI(workflows, {
|
|
593
|
+
title: `${serviceName} API`,
|
|
594
|
+
version: '1.0.0',
|
|
595
|
+
});
|
|
596
|
+
const openApiContent = `// Generated OpenAPI specification\nexport const openApiSpec = ${JSON.stringify(openApiSpec, null, 2)};\n`;
|
|
597
|
+
files.push(this.createFile(options.outputDir, 'openapi.ts', openApiContent, 'config'));
|
|
598
|
+
// Generate package.json
|
|
599
|
+
const packageJson = this.generatePackageJson({
|
|
600
|
+
name: serviceName,
|
|
601
|
+
description: `Inngest multi-workflow service with ${workflows.length} workflows`,
|
|
602
|
+
main: 'handler.js',
|
|
603
|
+
scripts: {
|
|
604
|
+
build: 'tsc',
|
|
605
|
+
dev: 'npx inngest-cli@latest dev & npx tsx handler.ts',
|
|
606
|
+
serve: 'npx tsx handler.ts',
|
|
607
|
+
},
|
|
608
|
+
dependencies: {
|
|
609
|
+
inngest: '^3.0.0',
|
|
610
|
+
express: '^4.18.0',
|
|
611
|
+
},
|
|
612
|
+
devDependencies: {
|
|
613
|
+
'@types/express': '^4.17.0',
|
|
614
|
+
},
|
|
615
|
+
});
|
|
616
|
+
files.push(this.createFile(options.outputDir, 'package.json', packageJson, 'package'));
|
|
617
|
+
// Generate tsconfig.json
|
|
618
|
+
const tsConfig = this.generateTsConfig({
|
|
619
|
+
outDir: './dist',
|
|
620
|
+
module: 'NodeNext',
|
|
621
|
+
moduleResolution: 'NodeNext',
|
|
622
|
+
});
|
|
623
|
+
files.push(this.createFile(options.outputDir, 'tsconfig.json', tsConfig, 'config'));
|
|
624
|
+
// Generate workflow content files
|
|
625
|
+
files.push(...this.generateWorkflowContentFiles(workflows, options.outputDir));
|
|
626
|
+
return {
|
|
627
|
+
files,
|
|
628
|
+
target: this.name,
|
|
629
|
+
workflowName: serviceName,
|
|
630
|
+
workflowNames: workflows.map((w) => w.name),
|
|
631
|
+
entryPoint: 'handler.ts',
|
|
632
|
+
openApiSpec,
|
|
633
|
+
};
|
|
634
|
+
}
|
|
635
|
+
async generateNodeTypeService(nodeTypes, options) {
|
|
636
|
+
const files = [];
|
|
637
|
+
const serviceName = options.serviceName || 'node-type-service';
|
|
638
|
+
const serviceId = this.toInngestId(serviceName);
|
|
639
|
+
// Generate node type imports
|
|
640
|
+
const nodeTypeImports = nodeTypes
|
|
641
|
+
.map((nt) => `import { ${nt.functionName} } from './node-types/${nt.functionName.toLowerCase()}.js';`)
|
|
642
|
+
.join('\n');
|
|
643
|
+
// Generate Inngest function definitions
|
|
644
|
+
const functionDefs = nodeTypes.map((nt) => {
|
|
645
|
+
const fnId = this.toInngestId(nt.name);
|
|
646
|
+
const fnVar = `fn_${this.toVarName(nt.functionName)}`;
|
|
647
|
+
return `export const ${fnVar} = inngest.createFunction(
|
|
648
|
+
{ id: '${fnId}', name: '${nt.name}' },
|
|
649
|
+
{ event: 'fw/${fnId}.execute' },
|
|
650
|
+
async ({ event, step }) => {
|
|
651
|
+
const params = event.data ?? {};
|
|
652
|
+
const result = await step.run('execute-node-type', async () => {
|
|
653
|
+
return ${nt.functionName}(true, params);
|
|
654
|
+
});
|
|
655
|
+
return { success: true, result };
|
|
656
|
+
}
|
|
657
|
+
);`;
|
|
658
|
+
}).join('\n\n');
|
|
659
|
+
const functionList = nodeTypes
|
|
660
|
+
.map((nt) => `fn_${this.toVarName(nt.functionName)}`)
|
|
661
|
+
.join(', ');
|
|
662
|
+
const nodeTypeEntries = nodeTypes
|
|
663
|
+
.map((nt) => ` '${nt.name}': ${nt.functionName},`)
|
|
664
|
+
.join('\n');
|
|
665
|
+
// Generate handler
|
|
666
|
+
const handlerContent = INNGEST_NODE_TYPE_HANDLER_TEMPLATE
|
|
667
|
+
.replace('{{GENERATED_HEADER}}', getGeneratedBranding().header('export --target inngest --node-types'))
|
|
668
|
+
.replace('{{NODE_TYPE_IMPORTS}}', nodeTypeImports)
|
|
669
|
+
.replace('{{FUNCTION_DEFINITIONS}}', functionDefs)
|
|
670
|
+
.replace('{{FUNCTION_LIST}}', functionList)
|
|
671
|
+
.replace('{{NODE_TYPE_ENTRIES}}', nodeTypeEntries)
|
|
672
|
+
.replace(/\{\{SERVICE_ID\}\}/g, serviceId)
|
|
673
|
+
.replace(/\{\{SERVICE_NAME\}\}/g, serviceName);
|
|
674
|
+
files.push(this.createFile(options.outputDir, 'handler.ts', handlerContent, 'handler'));
|
|
675
|
+
// Generate OpenAPI spec
|
|
676
|
+
const openApiSpec = this.generateNodeTypeOpenAPI(nodeTypes, {
|
|
677
|
+
title: `${serviceName} API`,
|
|
678
|
+
version: '1.0.0',
|
|
679
|
+
});
|
|
680
|
+
const openApiContent = `// Generated OpenAPI specification\nexport const openApiSpec = ${JSON.stringify(openApiSpec, null, 2)};\n`;
|
|
681
|
+
files.push(this.createFile(options.outputDir, 'openapi.ts', openApiContent, 'config'));
|
|
682
|
+
// Generate package.json
|
|
683
|
+
const packageJson = this.generatePackageJson({
|
|
684
|
+
name: serviceName,
|
|
685
|
+
description: `Inngest node type service with ${nodeTypes.length} endpoints`,
|
|
686
|
+
main: 'handler.js',
|
|
687
|
+
scripts: {
|
|
688
|
+
build: 'tsc',
|
|
689
|
+
dev: 'npx inngest-cli@latest dev & npx tsx handler.ts',
|
|
690
|
+
serve: 'npx tsx handler.ts',
|
|
691
|
+
},
|
|
692
|
+
dependencies: {
|
|
693
|
+
inngest: '^3.0.0',
|
|
694
|
+
express: '^4.18.0',
|
|
695
|
+
},
|
|
696
|
+
devDependencies: {
|
|
697
|
+
'@types/express': '^4.17.0',
|
|
698
|
+
},
|
|
699
|
+
});
|
|
700
|
+
files.push(this.createFile(options.outputDir, 'package.json', packageJson, 'package'));
|
|
701
|
+
// Generate tsconfig.json
|
|
702
|
+
const tsConfig = this.generateTsConfig({
|
|
703
|
+
outDir: './dist',
|
|
704
|
+
module: 'NodeNext',
|
|
705
|
+
moduleResolution: 'NodeNext',
|
|
706
|
+
});
|
|
707
|
+
files.push(this.createFile(options.outputDir, 'tsconfig.json', tsConfig, 'config'));
|
|
708
|
+
// Generate node-type content files
|
|
709
|
+
files.push(...this.generateNodeTypeContentFiles(nodeTypes, options.outputDir));
|
|
710
|
+
return {
|
|
711
|
+
files,
|
|
712
|
+
target: this.name,
|
|
713
|
+
workflowName: serviceName,
|
|
714
|
+
nodeTypeNames: nodeTypes.map((nt) => nt.name),
|
|
715
|
+
entryPoint: 'handler.ts',
|
|
716
|
+
openApiSpec,
|
|
717
|
+
};
|
|
718
|
+
}
|
|
719
|
+
async generateBundle(workflows, nodeTypes, options) {
|
|
720
|
+
const files = [];
|
|
721
|
+
const serviceName = options.displayName || 'bundle-service';
|
|
722
|
+
const serviceId = this.toInngestId(serviceName);
|
|
723
|
+
// Filter to items with code, skip npm imports
|
|
724
|
+
const workflowsWithCode = workflows.filter((w) => w.code);
|
|
725
|
+
const nodeTypesWithCode = nodeTypes.filter((nt) => nt.code && !nt.name.includes('/'));
|
|
726
|
+
// Separate exposed and bundled-only items
|
|
727
|
+
const exposedWorkflows = workflows.filter((w) => w.expose);
|
|
728
|
+
const exposedNodeTypes = nodeTypes.filter((nt) => nt.expose);
|
|
729
|
+
// Detect name collisions
|
|
730
|
+
const workflowNames = new Set(workflowsWithCode.map((w) => w.functionName));
|
|
731
|
+
const nodeTypeAliases = new Map();
|
|
732
|
+
for (const nt of nodeTypesWithCode) {
|
|
733
|
+
if (workflowNames.has(nt.functionName)) {
|
|
734
|
+
nodeTypeAliases.set(nt.functionName, `${nt.functionName}_nodeType`);
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
// Generate workflow imports
|
|
738
|
+
const workflowImports = workflowsWithCode.length > 0
|
|
739
|
+
? workflowsWithCode
|
|
740
|
+
.map((w) => `import { ${w.functionName} } from './workflows/${w.name}.js';`)
|
|
741
|
+
.join('\n')
|
|
742
|
+
: '// No workflows';
|
|
743
|
+
// Generate node type imports with aliases
|
|
744
|
+
const nodeTypeImports = nodeTypesWithCode.length > 0
|
|
745
|
+
? nodeTypesWithCode
|
|
746
|
+
.map((nt) => {
|
|
747
|
+
const alias = nodeTypeAliases.get(nt.functionName);
|
|
748
|
+
const lowerFunctionName = nt.functionName.toLowerCase();
|
|
749
|
+
if (alias) {
|
|
750
|
+
return `import { ${nt.functionName} as ${alias} } from './node-types/${lowerFunctionName}.js';`;
|
|
751
|
+
}
|
|
752
|
+
return `import { ${nt.functionName} } from './node-types/${lowerFunctionName}.js';`;
|
|
753
|
+
})
|
|
754
|
+
.join('\n')
|
|
755
|
+
: '// No node types';
|
|
756
|
+
// Filter exposed items with code
|
|
757
|
+
const exposedWorkflowsWithCode = exposedWorkflows.filter((w) => w.code);
|
|
758
|
+
const exposedNodeTypesWithCode = exposedNodeTypes.filter((nt) => nt.code);
|
|
759
|
+
// Generate Inngest function definitions for exposed items
|
|
760
|
+
const allExposed = [
|
|
761
|
+
...exposedWorkflowsWithCode.map((w) => ({
|
|
762
|
+
type: 'workflow',
|
|
763
|
+
name: w.name,
|
|
764
|
+
functionName: w.functionName,
|
|
765
|
+
})),
|
|
766
|
+
...exposedNodeTypesWithCode.map((nt) => ({
|
|
767
|
+
type: 'nodeType',
|
|
768
|
+
name: nt.name,
|
|
769
|
+
functionName: nodeTypeAliases.get(nt.functionName) || nt.functionName,
|
|
770
|
+
})),
|
|
771
|
+
];
|
|
772
|
+
const functionDefs = allExposed.map((item) => {
|
|
773
|
+
const fnId = this.toInngestId(item.name);
|
|
774
|
+
const fnVar = `fn_${this.toVarName(item.functionName)}`;
|
|
775
|
+
const stepName = item.type === 'workflow' ? 'execute-workflow' : 'execute-node-type';
|
|
776
|
+
return `export const ${fnVar} = inngest.createFunction(
|
|
777
|
+
{ id: '${fnId}', name: '${item.name}' },
|
|
778
|
+
{ event: 'fw/${fnId}.execute' },
|
|
779
|
+
async ({ event, step }) => {
|
|
780
|
+
const params = event.data ?? {};
|
|
781
|
+
const result = await step.run('${stepName}', async () => {
|
|
782
|
+
return ${item.functionName}(true, params);
|
|
783
|
+
});
|
|
784
|
+
return { success: true, result };
|
|
785
|
+
}
|
|
786
|
+
);`;
|
|
787
|
+
}).join('\n\n');
|
|
788
|
+
const functionList = allExposed
|
|
789
|
+
.map((item) => `fn_${this.toVarName(item.functionName)}`)
|
|
790
|
+
.join(', ');
|
|
791
|
+
// Generate entries for exposed items
|
|
792
|
+
const exposedWorkflowEntries = exposedWorkflowsWithCode.length > 0
|
|
793
|
+
? exposedWorkflowsWithCode.map((w) => ` '${w.name}': ${w.functionName},`).join('\n')
|
|
794
|
+
: ' // No exposed workflows';
|
|
795
|
+
const exposedNodeTypeEntries = exposedNodeTypesWithCode.length > 0
|
|
796
|
+
? exposedNodeTypesWithCode
|
|
797
|
+
.map((nt) => {
|
|
798
|
+
const alias = nodeTypeAliases.get(nt.functionName);
|
|
799
|
+
return ` '${nt.name}': ${alias || nt.functionName},`;
|
|
800
|
+
})
|
|
801
|
+
.join('\n')
|
|
802
|
+
: ' // No exposed node types';
|
|
803
|
+
// Generate handler
|
|
804
|
+
const handlerContent = INNGEST_BUNDLE_HANDLER_TEMPLATE
|
|
805
|
+
.replace('{{GENERATED_HEADER}}', getGeneratedBranding().header('export --target inngest --bundle'))
|
|
806
|
+
.replace('{{WORKFLOW_IMPORTS}}', workflowImports)
|
|
807
|
+
.replace('{{NODE_TYPE_IMPORTS}}', nodeTypeImports)
|
|
808
|
+
.replace('{{FUNCTION_DEFINITIONS}}', functionDefs)
|
|
809
|
+
.replace('{{FUNCTION_LIST}}', functionList)
|
|
810
|
+
.replace('{{EXPOSED_WORKFLOW_ENTRIES}}', exposedWorkflowEntries)
|
|
811
|
+
.replace('{{EXPOSED_NODE_TYPE_ENTRIES}}', exposedNodeTypeEntries)
|
|
812
|
+
.replace(/\{\{SERVICE_ID\}\}/g, serviceId)
|
|
813
|
+
.replace(/\{\{SERVICE_NAME\}\}/g, serviceName);
|
|
814
|
+
files.push(this.createFile(options.outputDir, 'handler.ts', handlerContent, 'handler'));
|
|
815
|
+
// Generate OpenAPI spec for exposed items
|
|
816
|
+
const openApiSpec = this.generateBundleOpenAPI(workflows, nodeTypes, {
|
|
817
|
+
title: `${serviceName} API`,
|
|
818
|
+
version: '1.0.0',
|
|
819
|
+
});
|
|
820
|
+
const openApiContent = `// Generated OpenAPI specification\nexport const openApiSpec = ${JSON.stringify(openApiSpec, null, 2)};\n`;
|
|
821
|
+
files.push(this.createFile(options.outputDir, 'openapi.ts', openApiContent, 'config'));
|
|
822
|
+
// Collect npm package dependencies
|
|
823
|
+
const npmDependencies = {};
|
|
824
|
+
for (const nt of nodeTypes) {
|
|
825
|
+
if (nt.name.startsWith('npm/')) {
|
|
826
|
+
const rest = nt.name.slice(4);
|
|
827
|
+
let packageName;
|
|
828
|
+
if (rest.startsWith('@')) {
|
|
829
|
+
const segments = rest.split('/');
|
|
830
|
+
packageName = `${segments[0]}/${segments[1]}`;
|
|
831
|
+
}
|
|
832
|
+
else {
|
|
833
|
+
packageName = rest.split('/')[0];
|
|
834
|
+
}
|
|
835
|
+
npmDependencies[packageName] = '*';
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
// Generate package.json
|
|
839
|
+
const packageJson = this.generatePackageJson({
|
|
840
|
+
name: serviceName,
|
|
841
|
+
description: `Inngest bundle service with ${workflows.length} workflows and ${nodeTypes.length} node types`,
|
|
842
|
+
main: 'handler.js',
|
|
843
|
+
scripts: {
|
|
844
|
+
build: 'tsc',
|
|
845
|
+
dev: 'npx inngest-cli@latest dev & npx tsx handler.ts',
|
|
846
|
+
serve: 'npx tsx handler.ts',
|
|
847
|
+
},
|
|
848
|
+
dependencies: {
|
|
849
|
+
inngest: '^3.0.0',
|
|
850
|
+
express: '^4.18.0',
|
|
851
|
+
...npmDependencies,
|
|
852
|
+
},
|
|
853
|
+
devDependencies: {
|
|
854
|
+
'@types/express': '^4.17.0',
|
|
855
|
+
},
|
|
856
|
+
});
|
|
857
|
+
files.push(this.createFile(options.outputDir, 'package.json', packageJson, 'package'));
|
|
858
|
+
// Generate tsconfig.json
|
|
859
|
+
const tsConfig = this.generateTsConfig({
|
|
860
|
+
outDir: './dist',
|
|
861
|
+
module: 'NodeNext',
|
|
862
|
+
moduleResolution: 'NodeNext',
|
|
863
|
+
});
|
|
864
|
+
files.push(this.createFile(options.outputDir, 'tsconfig.json', tsConfig, 'config'));
|
|
865
|
+
// Generate shared runtime types module
|
|
866
|
+
const isProduction = options.production ?? true;
|
|
867
|
+
const runtimeTypesContent = generateStandaloneRuntimeModule(isProduction, 'esm');
|
|
868
|
+
files.push(this.createFile(options.outputDir, 'runtime/types.ts', runtimeTypesContent, 'other'));
|
|
869
|
+
// Generate runtime files
|
|
870
|
+
files.push(...this.generateRuntimeFiles(options.outputDir, workflows, nodeTypes));
|
|
871
|
+
// Generate workflow and node-type content files
|
|
872
|
+
files.push(...this.generateBundleContentFiles(workflows, nodeTypes, options.outputDir));
|
|
873
|
+
return {
|
|
874
|
+
files,
|
|
875
|
+
target: this.name,
|
|
876
|
+
workflowName: serviceName,
|
|
877
|
+
workflowNames: workflows.map((w) => w.name),
|
|
878
|
+
nodeTypeNames: nodeTypes.map((nt) => nt.name),
|
|
879
|
+
entryPoint: 'handler.ts',
|
|
880
|
+
openApiSpec,
|
|
881
|
+
};
|
|
882
|
+
}
|
|
883
|
+
getDeployInstructions(artifacts) {
|
|
884
|
+
const outputDir = artifacts.files[0]?.absolutePath
|
|
885
|
+
? artifacts.files[0].absolutePath.replace(/\/[^/]+$/, '')
|
|
886
|
+
: '.';
|
|
887
|
+
return {
|
|
888
|
+
title: 'Deploy with Inngest',
|
|
889
|
+
prerequisites: [
|
|
890
|
+
'Node.js 18+ installed',
|
|
891
|
+
'Inngest account (https://www.inngest.com/) — free tier available',
|
|
892
|
+
'Inngest CLI for local development: npx inngest-cli@latest',
|
|
893
|
+
],
|
|
894
|
+
steps: [
|
|
895
|
+
`cd ${outputDir}`,
|
|
896
|
+
'npm install',
|
|
897
|
+
'npm run build',
|
|
898
|
+
'# Deploy your HTTP server (e.g., Vercel, Railway, Fly.io)',
|
|
899
|
+
'# Then register the Inngest serve URL in your Inngest dashboard',
|
|
900
|
+
],
|
|
901
|
+
localTestSteps: [
|
|
902
|
+
`cd ${outputDir}`,
|
|
903
|
+
'npm install',
|
|
904
|
+
'npm run dev',
|
|
905
|
+
'# Inngest Dev Server: http://localhost:8288',
|
|
906
|
+
'# Your functions will auto-register with the dev server',
|
|
907
|
+
'# Send test events from the Inngest Dev Server UI',
|
|
908
|
+
],
|
|
909
|
+
links: [
|
|
910
|
+
{
|
|
911
|
+
label: 'Inngest Documentation',
|
|
912
|
+
url: 'https://www.inngest.com/docs',
|
|
913
|
+
},
|
|
914
|
+
{
|
|
915
|
+
label: 'Inngest TypeScript SDK',
|
|
916
|
+
url: 'https://www.inngest.com/docs/reference/typescript',
|
|
917
|
+
},
|
|
918
|
+
{
|
|
919
|
+
label: 'Inngest Pricing',
|
|
920
|
+
url: 'https://www.inngest.com/pricing',
|
|
921
|
+
},
|
|
922
|
+
],
|
|
923
|
+
};
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
//# sourceMappingURL=inngest.js.map
|