@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,559 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module jsdoc-port-sync/signature-parser
|
|
3
|
+
*
|
|
4
|
+
* Parse TypeScript function signatures to extract parameters and return types.
|
|
5
|
+
* Browser-compatible (regex-based, no ts-morph).
|
|
6
|
+
*/
|
|
7
|
+
import { FUNC_DECL_START, ARROW_START, RETURN_OBJECT_REGEX, RESERVED_RETURN_FIELDS, findBalancedClose, splitParams, } from "./constants.js";
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// Function Signature Parsing
|
|
10
|
+
// =============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Parse function signature to extract parameters.
|
|
13
|
+
* Supports both function declarations and arrow functions.
|
|
14
|
+
* Uses balanced paren matching to handle nested callback types.
|
|
15
|
+
*/
|
|
16
|
+
export function parseFunctionSignature(functionText) {
|
|
17
|
+
const params = [];
|
|
18
|
+
let functionType = "expression";
|
|
19
|
+
let paramsStr = "";
|
|
20
|
+
// Try function declaration first - use balanced matching for nested parens
|
|
21
|
+
const funcDeclMatch = functionText.match(FUNC_DECL_START);
|
|
22
|
+
if (funcDeclMatch && funcDeclMatch.index !== undefined) {
|
|
23
|
+
functionType = "declaration";
|
|
24
|
+
const openParenIndex = funcDeclMatch.index + funcDeclMatch[0].length - 1;
|
|
25
|
+
const closeParenIndex = findBalancedClose(functionText, openParenIndex);
|
|
26
|
+
if (closeParenIndex !== -1) {
|
|
27
|
+
paramsStr = functionText.substring(openParenIndex + 1, closeParenIndex);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Try arrow function
|
|
32
|
+
const arrowMatch = functionText.match(ARROW_START);
|
|
33
|
+
if (arrowMatch && arrowMatch.index !== undefined) {
|
|
34
|
+
functionType = "arrow";
|
|
35
|
+
const openParenIndex = arrowMatch.index + arrowMatch[0].length - 1;
|
|
36
|
+
const closeParenIndex = findBalancedClose(functionText, openParenIndex);
|
|
37
|
+
if (closeParenIndex !== -1) {
|
|
38
|
+
paramsStr = functionText.substring(openParenIndex + 1, closeParenIndex);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (!paramsStr.trim()) {
|
|
43
|
+
return { params, functionType };
|
|
44
|
+
}
|
|
45
|
+
// Parse individual parameters
|
|
46
|
+
const paramTokens = splitParams(paramsStr);
|
|
47
|
+
paramTokens.forEach((paramStr, index) => {
|
|
48
|
+
const param = parseParam(paramStr.trim(), index);
|
|
49
|
+
if (param) {
|
|
50
|
+
params.push(param);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return { params, functionType };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse a single parameter string like "name?: type = default"
|
|
57
|
+
* Handles multiline callback types with nested parens/braces.
|
|
58
|
+
*/
|
|
59
|
+
function parseParam(paramStr, position) {
|
|
60
|
+
if (!paramStr)
|
|
61
|
+
return null;
|
|
62
|
+
const trimmed = paramStr.trim();
|
|
63
|
+
if (!trimmed)
|
|
64
|
+
return null;
|
|
65
|
+
// Extract name first (must be valid identifier)
|
|
66
|
+
const nameMatch = trimmed.match(/^(\w+)(\?)?/);
|
|
67
|
+
if (!nameMatch)
|
|
68
|
+
return null;
|
|
69
|
+
const name = nameMatch[1];
|
|
70
|
+
const questionMark = nameMatch[2];
|
|
71
|
+
let rest = trimmed.substring(nameMatch[0].length).trim();
|
|
72
|
+
let tsType;
|
|
73
|
+
let defaultValue;
|
|
74
|
+
// Check for type annotation (: type)
|
|
75
|
+
if (rest.startsWith(":")) {
|
|
76
|
+
rest = rest.substring(1).trim();
|
|
77
|
+
// Find where type ends - either at unbalanced = (not =>) or end of string
|
|
78
|
+
let depth = 0;
|
|
79
|
+
let typeEnd = rest.length;
|
|
80
|
+
for (let i = 0; i < rest.length; i++) {
|
|
81
|
+
const ch = rest[i];
|
|
82
|
+
if (ch === "(" || ch === "{" || ch === "[" || ch === "<") {
|
|
83
|
+
depth++;
|
|
84
|
+
}
|
|
85
|
+
else if (ch === ")" || ch === "}" || ch === "]" || ch === ">") {
|
|
86
|
+
depth--;
|
|
87
|
+
}
|
|
88
|
+
else if (ch === "=" && depth === 0) {
|
|
89
|
+
// Check if this is => (arrow) vs = (assignment)
|
|
90
|
+
if (rest[i + 1] === ">") {
|
|
91
|
+
i++; // skip >
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
typeEnd = i;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
tsType = rest.substring(0, typeEnd).trim();
|
|
99
|
+
rest = rest.substring(typeEnd).trim();
|
|
100
|
+
}
|
|
101
|
+
// Check for default value (= value)
|
|
102
|
+
if (rest.startsWith("=")) {
|
|
103
|
+
defaultValue = rest.substring(1).trim();
|
|
104
|
+
}
|
|
105
|
+
const hasDefault = defaultValue !== undefined;
|
|
106
|
+
const optional = !!questionMark || hasDefault;
|
|
107
|
+
return {
|
|
108
|
+
name,
|
|
109
|
+
tsType: tsType || undefined,
|
|
110
|
+
optional,
|
|
111
|
+
defaultValue,
|
|
112
|
+
position,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// =============================================================================
|
|
116
|
+
// Return Type Parsing
|
|
117
|
+
// =============================================================================
|
|
118
|
+
/**
|
|
119
|
+
* Parse return statement to extract object field names.
|
|
120
|
+
* Returns unique field names from all return statements.
|
|
121
|
+
*/
|
|
122
|
+
export function parseReturnFields(functionText) {
|
|
123
|
+
const fields = new Set();
|
|
124
|
+
RETURN_OBJECT_REGEX.lastIndex = 0;
|
|
125
|
+
let match;
|
|
126
|
+
while ((match = RETURN_OBJECT_REGEX.exec(functionText)) != null) {
|
|
127
|
+
const objectContent = match[1];
|
|
128
|
+
const fieldParts = objectContent.split(",");
|
|
129
|
+
for (const part of fieldParts) {
|
|
130
|
+
const trimmed = part.trim();
|
|
131
|
+
if (!trimmed)
|
|
132
|
+
continue;
|
|
133
|
+
// Check for "key: value" pattern
|
|
134
|
+
const colonMatch = trimmed.match(/^(\w+)\s*:/);
|
|
135
|
+
if (colonMatch) {
|
|
136
|
+
const fieldName = colonMatch[1];
|
|
137
|
+
if (!RESERVED_RETURN_FIELDS.includes(fieldName)) {
|
|
138
|
+
fields.add(fieldName);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Shorthand property - just the identifier
|
|
143
|
+
const shorthandMatch = trimmed.match(/^(\w+)$/);
|
|
144
|
+
if (shorthandMatch) {
|
|
145
|
+
const fieldName = shorthandMatch[1];
|
|
146
|
+
if (!RESERVED_RETURN_FIELDS.includes(fieldName)) {
|
|
147
|
+
fields.add(fieldName);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return Array.from(fields);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Parse return body fields WITH inferred types.
|
|
157
|
+
* Analyzes `return { field: value }` statements to infer types from values.
|
|
158
|
+
*
|
|
159
|
+
* @returns Map of field name → inferred TypeScript type
|
|
160
|
+
*/
|
|
161
|
+
export function parseReturnBodyFieldsWithTypes(functionText) {
|
|
162
|
+
const fields = new Map();
|
|
163
|
+
RETURN_OBJECT_REGEX.lastIndex = 0;
|
|
164
|
+
let match;
|
|
165
|
+
while ((match = RETURN_OBJECT_REGEX.exec(functionText)) != null) {
|
|
166
|
+
const objectContent = match[1];
|
|
167
|
+
const fieldParts = objectContent.split(",");
|
|
168
|
+
for (const part of fieldParts) {
|
|
169
|
+
const trimmed = part.trim();
|
|
170
|
+
if (!trimmed)
|
|
171
|
+
continue;
|
|
172
|
+
// Check for "key: value" pattern
|
|
173
|
+
const colonMatch = trimmed.match(/^(\w+)\s*:\s*(.+)$/);
|
|
174
|
+
if (colonMatch) {
|
|
175
|
+
const fieldName = colonMatch[1];
|
|
176
|
+
const value = colonMatch[2].trim();
|
|
177
|
+
if (!RESERVED_RETURN_FIELDS.includes(fieldName)) {
|
|
178
|
+
const inferredType = inferTypeFromValue(value);
|
|
179
|
+
if (!fields.has(fieldName) || fields.get(fieldName) === "any") {
|
|
180
|
+
fields.set(fieldName, inferredType);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// Shorthand property - just the identifier
|
|
186
|
+
const shorthandMatch = trimmed.match(/^(\w+)$/);
|
|
187
|
+
if (shorthandMatch) {
|
|
188
|
+
const fieldName = shorthandMatch[1];
|
|
189
|
+
if (!RESERVED_RETURN_FIELDS.includes(fieldName) && !fields.has(fieldName)) {
|
|
190
|
+
fields.set(fieldName, "any");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return fields;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Infer TypeScript type from a value in return statement.
|
|
200
|
+
* Simple heuristic-based detection.
|
|
201
|
+
*/
|
|
202
|
+
function inferTypeFromValue(value) {
|
|
203
|
+
value = value.trim();
|
|
204
|
+
if (value.startsWith("["))
|
|
205
|
+
return "any[]";
|
|
206
|
+
if (value.startsWith("{"))
|
|
207
|
+
return "any";
|
|
208
|
+
if (/^["'`]/.test(value))
|
|
209
|
+
return "string";
|
|
210
|
+
if (/^-?\d+(\.\d+)?$/.test(value))
|
|
211
|
+
return "number";
|
|
212
|
+
if (value === "true" || value === "false")
|
|
213
|
+
return "boolean";
|
|
214
|
+
if (value === "null" || value === "undefined")
|
|
215
|
+
return "any";
|
|
216
|
+
return "any";
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Parse return type annotation fields from function signature.
|
|
220
|
+
* Matches:
|
|
221
|
+
* - function foo(): { fieldName: type, ... }
|
|
222
|
+
* - const foo: TFlowWeaverNodeType<{...}, { fieldName: type, ... }> = ...
|
|
223
|
+
*/
|
|
224
|
+
export function parseReturnTypeFields(functionText) {
|
|
225
|
+
// Try standard return type syntax first: ): { ... } or )=> { ... }
|
|
226
|
+
let returnTypeMatch = functionText.match(/\)\s*:\s*\{([^}]+)\}\s*(?:\{|=>)/);
|
|
227
|
+
// If not found, try TFlowWeaverNodeType<InputType, OutputType> syntax
|
|
228
|
+
if (!returnTypeMatch) {
|
|
229
|
+
const genericStart = functionText.indexOf("TFlowWeaverNodeType<");
|
|
230
|
+
if (genericStart !== -1) {
|
|
231
|
+
let braceCount = 0;
|
|
232
|
+
let inFirstParam = false;
|
|
233
|
+
let firstParamEnd = -1;
|
|
234
|
+
let secondParamStart = -1;
|
|
235
|
+
let secondParamEnd = -1;
|
|
236
|
+
for (let i = genericStart + "TFlowWeaverNodeType<".length; i < functionText.length; i++) {
|
|
237
|
+
const char = functionText[i];
|
|
238
|
+
if (char === "{") {
|
|
239
|
+
if (!inFirstParam && braceCount === 0) {
|
|
240
|
+
inFirstParam = true;
|
|
241
|
+
}
|
|
242
|
+
else if (firstParamEnd !== -1 && secondParamStart === -1) {
|
|
243
|
+
secondParamStart = i + 1;
|
|
244
|
+
}
|
|
245
|
+
braceCount++;
|
|
246
|
+
}
|
|
247
|
+
else if (char === "}") {
|
|
248
|
+
braceCount--;
|
|
249
|
+
if (braceCount === 0) {
|
|
250
|
+
if (inFirstParam && firstParamEnd === -1) {
|
|
251
|
+
firstParamEnd = i;
|
|
252
|
+
inFirstParam = false;
|
|
253
|
+
}
|
|
254
|
+
else if (secondParamStart !== -1) {
|
|
255
|
+
secondParamEnd = i;
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (secondParamStart !== -1 && secondParamEnd !== -1) {
|
|
262
|
+
const objectContent = functionText.substring(secondParamStart, secondParamEnd);
|
|
263
|
+
returnTypeMatch = [functionText, objectContent];
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (!returnTypeMatch)
|
|
268
|
+
return [];
|
|
269
|
+
const fields = [];
|
|
270
|
+
const objectContent = returnTypeMatch[1];
|
|
271
|
+
const fieldParts = objectContent.split(/[,;]/);
|
|
272
|
+
for (const part of fieldParts) {
|
|
273
|
+
const trimmed = part.trim();
|
|
274
|
+
if (!trimmed)
|
|
275
|
+
continue;
|
|
276
|
+
const colonMatch = trimmed.match(/^(\w+)\s*:/);
|
|
277
|
+
if (colonMatch) {
|
|
278
|
+
const fieldName = colonMatch[1];
|
|
279
|
+
if (!RESERVED_RETURN_FIELDS.includes(fieldName)) {
|
|
280
|
+
fields.push(fieldName);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return fields;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Parse return type fields WITH their TypeScript types.
|
|
288
|
+
* Returns array of { name, tsType } for each field in the return type.
|
|
289
|
+
*/
|
|
290
|
+
export function parseReturnTypeFieldsWithTypes(functionText) {
|
|
291
|
+
const fields = [];
|
|
292
|
+
// Match return type: ): { field: type; ... } or ): Promise<{ field: type; ... }>
|
|
293
|
+
const returnTypeMatch = functionText.match(/\)\s*:\s*(?:Promise\s*<\s*)?\{([^}]+)\}/);
|
|
294
|
+
if (!returnTypeMatch)
|
|
295
|
+
return fields;
|
|
296
|
+
const returnTypeContent = returnTypeMatch[1];
|
|
297
|
+
// Parse individual fields: name: type or name?: type
|
|
298
|
+
const fieldRegex = /(\w+)\s*\??\s*:\s*([^;,}]+)/g;
|
|
299
|
+
let match;
|
|
300
|
+
while ((match = fieldRegex.exec(returnTypeContent)) != null) {
|
|
301
|
+
const [, name, tsType] = match;
|
|
302
|
+
fields.push({ name, tsType: tsType.trim() });
|
|
303
|
+
}
|
|
304
|
+
return fields;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Split object type fields by comma or semicolon, respecting nested angle brackets,
|
|
308
|
+
* square brackets, braces, and parentheses.
|
|
309
|
+
* e.g. "report: Record<string, unknown>; count: number" → ["report: Record<string, unknown>", "count: number"]
|
|
310
|
+
*/
|
|
311
|
+
function splitObjectFields(content) {
|
|
312
|
+
const result = [];
|
|
313
|
+
let current = "";
|
|
314
|
+
let angleDepth = 0;
|
|
315
|
+
let bracketDepth = 0;
|
|
316
|
+
let braceDepth = 0;
|
|
317
|
+
let parenDepth = 0;
|
|
318
|
+
for (const char of content) {
|
|
319
|
+
if (char === "<")
|
|
320
|
+
angleDepth++;
|
|
321
|
+
else if (char === ">" && angleDepth > 0)
|
|
322
|
+
angleDepth--;
|
|
323
|
+
else if (char === "[")
|
|
324
|
+
bracketDepth++;
|
|
325
|
+
else if (char === "]" && bracketDepth > 0)
|
|
326
|
+
bracketDepth--;
|
|
327
|
+
else if (char === "{")
|
|
328
|
+
braceDepth++;
|
|
329
|
+
else if (char === "}" && braceDepth > 0)
|
|
330
|
+
braceDepth--;
|
|
331
|
+
else if (char === "(")
|
|
332
|
+
parenDepth++;
|
|
333
|
+
else if (char === ")" && parenDepth > 0)
|
|
334
|
+
parenDepth--;
|
|
335
|
+
else if ((char === "," || char === ";") && angleDepth === 0 && bracketDepth === 0 && braceDepth === 0 && parenDepth === 0) {
|
|
336
|
+
result.push(current);
|
|
337
|
+
current = "";
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
current += char;
|
|
341
|
+
}
|
|
342
|
+
if (current.trim()) {
|
|
343
|
+
result.push(current);
|
|
344
|
+
}
|
|
345
|
+
return result;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Parse input type fields from TFlowWeaverNodeType<{inputs}, {outputs}> syntax.
|
|
349
|
+
* Returns field names and their types from the first type parameter (input type).
|
|
350
|
+
*/
|
|
351
|
+
export function parseInputTypeFields(functionText) {
|
|
352
|
+
const genericStart = functionText.indexOf("TFlowWeaverNodeType<");
|
|
353
|
+
if (genericStart === -1)
|
|
354
|
+
return [];
|
|
355
|
+
let braceCount = 0;
|
|
356
|
+
let firstParamStart = -1;
|
|
357
|
+
let firstParamEnd = -1;
|
|
358
|
+
for (let i = genericStart + "TFlowWeaverNodeType<".length; i < functionText.length; i++) {
|
|
359
|
+
const char = functionText[i];
|
|
360
|
+
if (char === "{") {
|
|
361
|
+
if (braceCount === 0) {
|
|
362
|
+
firstParamStart = i + 1;
|
|
363
|
+
}
|
|
364
|
+
braceCount++;
|
|
365
|
+
}
|
|
366
|
+
else if (char === "}") {
|
|
367
|
+
braceCount--;
|
|
368
|
+
if (braceCount === 0) {
|
|
369
|
+
firstParamEnd = i;
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (firstParamStart === -1 || firstParamEnd === -1)
|
|
375
|
+
return [];
|
|
376
|
+
const objectContent = functionText.substring(firstParamStart, firstParamEnd);
|
|
377
|
+
const fields = [];
|
|
378
|
+
const fieldParts = splitObjectFields(objectContent);
|
|
379
|
+
for (const part of fieldParts) {
|
|
380
|
+
const trimmed = part.trim();
|
|
381
|
+
if (!trimmed)
|
|
382
|
+
continue;
|
|
383
|
+
const colonMatch = trimmed.match(/^(\w+)\s*:\s*(.+)$/);
|
|
384
|
+
if (colonMatch) {
|
|
385
|
+
fields.push({ name: colonMatch[1], tsType: colonMatch[2].trim() });
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return fields;
|
|
389
|
+
}
|
|
390
|
+
// =============================================================================
|
|
391
|
+
// Type Mapping
|
|
392
|
+
// =============================================================================
|
|
393
|
+
/**
|
|
394
|
+
* Map TypeScript type to port type.
|
|
395
|
+
*/
|
|
396
|
+
export function tsTypeToPortType(tsType) {
|
|
397
|
+
if (!tsType)
|
|
398
|
+
return "ANY";
|
|
399
|
+
const normalized = tsType.trim().toLowerCase();
|
|
400
|
+
switch (normalized) {
|
|
401
|
+
case "number":
|
|
402
|
+
return "NUMBER";
|
|
403
|
+
case "string":
|
|
404
|
+
return "STRING";
|
|
405
|
+
case "boolean":
|
|
406
|
+
return "BOOLEAN";
|
|
407
|
+
case "any[]":
|
|
408
|
+
case "array":
|
|
409
|
+
return "ARRAY";
|
|
410
|
+
case "object":
|
|
411
|
+
return "OBJECT";
|
|
412
|
+
case "function":
|
|
413
|
+
return "FUNCTION";
|
|
414
|
+
default:
|
|
415
|
+
return "ANY";
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Map port type to TypeScript type string.
|
|
420
|
+
*/
|
|
421
|
+
export function portTypeToTsType(portType) {
|
|
422
|
+
switch (portType) {
|
|
423
|
+
case "NUMBER":
|
|
424
|
+
return "number";
|
|
425
|
+
case "STRING":
|
|
426
|
+
return "string";
|
|
427
|
+
case "BOOLEAN":
|
|
428
|
+
return "boolean";
|
|
429
|
+
case "ARRAY":
|
|
430
|
+
return "any[]";
|
|
431
|
+
case "OBJECT":
|
|
432
|
+
return "any";
|
|
433
|
+
case "FUNCTION":
|
|
434
|
+
return "(...args: any[]) => any";
|
|
435
|
+
case "STEP":
|
|
436
|
+
return "boolean";
|
|
437
|
+
case "ANY":
|
|
438
|
+
default:
|
|
439
|
+
return "any";
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
// =============================================================================
|
|
443
|
+
// Callback Type Parsing
|
|
444
|
+
// =============================================================================
|
|
445
|
+
/**
|
|
446
|
+
* Parse callback type string to extract params and return type.
|
|
447
|
+
* E.g., "(execute: boolean, item: string) => { result: number }"
|
|
448
|
+
*/
|
|
449
|
+
export function parseCallbackType(callbackType) {
|
|
450
|
+
const params = [];
|
|
451
|
+
const returnFields = [];
|
|
452
|
+
let returnType = "";
|
|
453
|
+
const arrowIdx = callbackType.indexOf("=>");
|
|
454
|
+
if (arrowIdx === -1)
|
|
455
|
+
return { params, returnType, returnFields };
|
|
456
|
+
const beforeArrow = callbackType.substring(0, arrowIdx).trim();
|
|
457
|
+
const openParen = beforeArrow.indexOf("(");
|
|
458
|
+
const closeParen = beforeArrow.lastIndexOf(")");
|
|
459
|
+
if (openParen === -1 || closeParen === -1)
|
|
460
|
+
return { params, returnType, returnFields };
|
|
461
|
+
const paramsStr = beforeArrow.substring(openParen + 1, closeParen);
|
|
462
|
+
const paramTokens = splitParams(paramsStr);
|
|
463
|
+
for (const token of paramTokens) {
|
|
464
|
+
const trimmed = token.trim();
|
|
465
|
+
if (!trimmed)
|
|
466
|
+
continue;
|
|
467
|
+
const colonIdx = trimmed.indexOf(":");
|
|
468
|
+
if (colonIdx !== -1) {
|
|
469
|
+
const name = trimmed.substring(0, colonIdx).trim().replace(/\?$/, "");
|
|
470
|
+
const typeStr = trimmed.substring(colonIdx + 1).trim();
|
|
471
|
+
params.push({ name, typeStr });
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
returnType = callbackType.substring(arrowIdx + 2).trim();
|
|
475
|
+
const returnMatch = returnType.match(/^\{\s*([\s\S]*?)\s*\}$/);
|
|
476
|
+
if (returnMatch) {
|
|
477
|
+
const fieldsStr = returnMatch[1];
|
|
478
|
+
const fieldParts = fieldsStr.split(/[;\n]/).filter(s => s.trim());
|
|
479
|
+
for (const part of fieldParts) {
|
|
480
|
+
const trimmed = part.trim();
|
|
481
|
+
if (!trimmed)
|
|
482
|
+
continue;
|
|
483
|
+
const colonIdx = trimmed.indexOf(":");
|
|
484
|
+
if (colonIdx !== -1) {
|
|
485
|
+
const name = trimmed.substring(0, colonIdx).trim();
|
|
486
|
+
const typeStr = trimmed.substring(colonIdx + 1).trim();
|
|
487
|
+
returnFields.push({ name, typeStr });
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return { params, returnType, returnFields };
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Build callback type string from scoped ports, preserving existing non-scoped params.
|
|
495
|
+
* Scoped OUTPUT ports → callback parameters
|
|
496
|
+
* Scoped INPUT ports → callback return type
|
|
497
|
+
*/
|
|
498
|
+
export function buildCallbackType(callbackParams, callbackReturns, existingCallbackType) {
|
|
499
|
+
const scopedParamNames = new Set(callbackParams.map(([name]) => name));
|
|
500
|
+
const scopedReturnNames = new Set(callbackReturns.map(([name]) => name));
|
|
501
|
+
const isParamsMultiline = existingCallbackType?.includes("(\n") || false;
|
|
502
|
+
const isReturnMultiline = existingCallbackType?.match(/=>\s*\{\n/) != null;
|
|
503
|
+
const scopedParamsList = callbackParams
|
|
504
|
+
.sort((a, b) => (a[1].metadata?.order ?? Infinity) - (b[1].metadata?.order ?? Infinity))
|
|
505
|
+
.map(([name, port]) => `${name}: ${portTypeToTsType(port.dataType)}`);
|
|
506
|
+
let preservedParams = [];
|
|
507
|
+
let preservedReturns = [];
|
|
508
|
+
if (existingCallbackType) {
|
|
509
|
+
const parsed = parseCallbackType(existingCallbackType);
|
|
510
|
+
preservedParams = parsed.params
|
|
511
|
+
.filter(({ name }) => !scopedParamNames.has(name))
|
|
512
|
+
.map(({ name, typeStr }) => `${name}: ${typeStr}`);
|
|
513
|
+
preservedReturns = parsed.returnFields
|
|
514
|
+
.filter(({ name }) => !scopedReturnNames.has(name))
|
|
515
|
+
.map(({ name, typeStr }) => `${name}: ${typeStr}`);
|
|
516
|
+
}
|
|
517
|
+
const allParamsList = [...preservedParams, ...scopedParamsList].filter(Boolean);
|
|
518
|
+
const scopedReturnFields = callbackReturns
|
|
519
|
+
.sort((a, b) => (a[1].metadata?.order ?? Infinity) - (b[1].metadata?.order ?? Infinity))
|
|
520
|
+
.map(([name, port]) => `${name}: ${portTypeToTsType(port.dataType)}`);
|
|
521
|
+
const allReturnFields = [...preservedReturns, ...scopedReturnFields];
|
|
522
|
+
let paramsStr;
|
|
523
|
+
if (isParamsMultiline && allParamsList.length > 0) {
|
|
524
|
+
paramsStr = `\n ${allParamsList.join(",\n ")},\n `;
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
paramsStr = allParamsList.join(", ");
|
|
528
|
+
}
|
|
529
|
+
if (isReturnMultiline && allReturnFields.length > 0) {
|
|
530
|
+
const returnFieldsStr = allReturnFields.map(f => ` ${f};`).join("\n");
|
|
531
|
+
return `(${paramsStr}) => {\n${returnFieldsStr}\n }`;
|
|
532
|
+
}
|
|
533
|
+
else {
|
|
534
|
+
const returnFieldsStr = allReturnFields.join("; ");
|
|
535
|
+
return `(${paramsStr}) => { ${returnFieldsStr} }`;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Check if callback signature already has all required ports.
|
|
540
|
+
* Returns true if no update needed.
|
|
541
|
+
*/
|
|
542
|
+
export function callbackHasAllPorts(callbackType, callbackParams, callbackReturns) {
|
|
543
|
+
for (const [name] of callbackParams) {
|
|
544
|
+
const paramRegex = new RegExp(`\\b${name}\\s*:`);
|
|
545
|
+
if (!paramRegex.test(callbackType))
|
|
546
|
+
return false;
|
|
547
|
+
}
|
|
548
|
+
for (const [name] of callbackReturns) {
|
|
549
|
+
const arrowIdx = callbackType.indexOf("=>");
|
|
550
|
+
if (arrowIdx === -1)
|
|
551
|
+
return false;
|
|
552
|
+
const returnPart = callbackType.substring(arrowIdx);
|
|
553
|
+
const returnRegex = new RegExp(`\\b${name}\\s*:`);
|
|
554
|
+
if (!returnRegex.test(returnPart))
|
|
555
|
+
return false;
|
|
556
|
+
}
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
//# sourceMappingURL=signature-parser.js.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module jsdoc-port-sync/sync
|
|
3
|
+
*
|
|
4
|
+
* Bidirectional sync between JSDoc annotations and TypeScript signatures.
|
|
5
|
+
* - syncSignatureToJSDoc: Code → JSDoc (regenerate tags from signature)
|
|
6
|
+
* - syncJSDocToSignature: JSDoc → Code (add params/fields to signature)
|
|
7
|
+
*/
|
|
8
|
+
import type { TPortDefinition } from "../ast/types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Sync function signature to JSDoc (Code → JSDoc).
|
|
11
|
+
*
|
|
12
|
+
* **What it does:**
|
|
13
|
+
* - Adds `@input` tags for params in signature but not in JSDoc
|
|
14
|
+
* - Adds `@output` tags for return fields not in JSDoc
|
|
15
|
+
* - Removes orphan `@input`/`@output` tags (port deleted from signature)
|
|
16
|
+
* - Preserves existing JSDoc content (description, `@label`, etc.)
|
|
17
|
+
*
|
|
18
|
+
* **When to call:** Only on explicit format (Ctrl+P), NOT every keystroke.
|
|
19
|
+
*/
|
|
20
|
+
export declare function syncSignatureToJSDoc(functionText: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Sync JSDoc to function signature (JSDoc → Code).
|
|
23
|
+
*
|
|
24
|
+
* **What it does:**
|
|
25
|
+
* - Adds missing params from `@input` tags to function signature
|
|
26
|
+
* - Updates return type with fields from `@output` tags
|
|
27
|
+
* - Ensures `execute: boolean` is first param
|
|
28
|
+
* - Builds/updates callback types for scoped ports
|
|
29
|
+
*
|
|
30
|
+
* **When to call:** On every keystroke during editing.
|
|
31
|
+
*/
|
|
32
|
+
export declare function syncJSDocToSignature(functionText: string, authoritativePorts?: {
|
|
33
|
+
inputs?: Record<string, TPortDefinition>;
|
|
34
|
+
outputs?: Record<string, TPortDefinition>;
|
|
35
|
+
}): string;
|
|
36
|
+
//# sourceMappingURL=sync.d.ts.map
|