@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,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module jsdoc-port-sync/port-parser
|
|
3
|
+
*
|
|
4
|
+
* Parse and update @input/@output/@step annotations in JSDoc.
|
|
5
|
+
* Uses Chevrotain for parsing, browser-compatible.
|
|
6
|
+
*/
|
|
7
|
+
import type { TPortDefinition } from '../ast/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Check if the code has any @scope declarations in JSDoc.
|
|
10
|
+
* Used to automatically determine if the node should be in scoped mode.
|
|
11
|
+
*
|
|
12
|
+
* @param functionText - The function text containing JSDoc
|
|
13
|
+
* @returns true if the code has @scope declarations, false otherwise
|
|
14
|
+
*/
|
|
15
|
+
export declare function hasScopes(functionText: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Get all scope names declared in the code via @scope tags.
|
|
18
|
+
*
|
|
19
|
+
* @param functionText - The function text containing JSDoc
|
|
20
|
+
* @returns Array of scope names
|
|
21
|
+
*/
|
|
22
|
+
export declare function getScopeNames(functionText: string): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Check if the code has any orphan port lines (type but no name).
|
|
25
|
+
* Used to skip rename detection when user is editing port names.
|
|
26
|
+
*/
|
|
27
|
+
export declare function hasOrphanPortLines(functionText: string): {
|
|
28
|
+
inputs: boolean;
|
|
29
|
+
outputs: boolean;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Extract port names from incomplete JSDoc lines.
|
|
33
|
+
* These are lines where the user is still typing.
|
|
34
|
+
* Used to prevent generating duplicate tags for ports being edited.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getIncompletePortNames(functionText: string): {
|
|
37
|
+
inputs: Set<string>;
|
|
38
|
+
outputs: Set<string>;
|
|
39
|
+
steps: Set<string>;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Check if a line is incomplete (port tag but not fully valid).
|
|
43
|
+
* Also detects "incomplete description" patterns like "@input name -" (dash but no text).
|
|
44
|
+
*/
|
|
45
|
+
export declare function isIncompletePortLine(line: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Parse @input/@output/@step annotations from function text.
|
|
48
|
+
* Uses Chevrotain for parsing, browser-compatible.
|
|
49
|
+
*
|
|
50
|
+
* Types are derived from signature, not JSDoc:
|
|
51
|
+
* - JSDoc provides metadata: name, optional, default, scope, label, order, placement
|
|
52
|
+
* - Types are inferred from function signature using inferDataTypeFromTS()
|
|
53
|
+
* - @step annotation marks explicit STEP/control-flow ports
|
|
54
|
+
* - Reserved ports (execute, onSuccess, onFailure) auto-detect as STEP
|
|
55
|
+
*/
|
|
56
|
+
export declare function parsePortsFromFunctionText(functionText: string): {
|
|
57
|
+
inputs: Record<string, TPortDefinition>;
|
|
58
|
+
outputs: Record<string, TPortDefinition>;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Update @input/@output annotations in function text.
|
|
62
|
+
* Preserves other JSDoc content (description, @label, @scope, etc.).
|
|
63
|
+
*
|
|
64
|
+
* @param signatureInputOrder - Optional array of input names in signature order.
|
|
65
|
+
* When provided, new inputs are inserted at the correct position based on signature.
|
|
66
|
+
*/
|
|
67
|
+
export declare function updatePortsInFunctionText(functionText: string, inputs: Record<string, TPortDefinition>, outputs: Record<string, TPortDefinition>, signatureInputOrder?: string[]): string;
|
|
68
|
+
//# sourceMappingURL=port-parser.d.ts.map
|
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module jsdoc-port-sync/port-parser
|
|
3
|
+
*
|
|
4
|
+
* Parse and update @input/@output/@step annotations in JSDoc.
|
|
5
|
+
* Uses Chevrotain for parsing, browser-compatible.
|
|
6
|
+
*/
|
|
7
|
+
import { generateJSDocPortTag } from '../annotation-generator.js';
|
|
8
|
+
import { isExecutePort, isSuccessPort, isFailurePort, isScopedMandatoryPort } from '../constants.js';
|
|
9
|
+
import { inferDataTypeFromTS } from '../type-mappings.js';
|
|
10
|
+
import { parsePortLine, parsePortsFromJSDoc, isValidPortLine as chevrotainIsValidPortLine, } from '../chevrotain-parser/port-parser.js';
|
|
11
|
+
import { JSDOC_BLOCK_REGEX, PORT_TAG_REGEX, ORPHAN_PORT_LINE_REGEX } from './constants.js';
|
|
12
|
+
import { parseFunctionSignature, parseReturnTypeFieldsWithTypes } from './signature-parser.js';
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Scope Detection
|
|
15
|
+
// =============================================================================
|
|
16
|
+
/** Match @scope tags: @scope name */
|
|
17
|
+
const SCOPE_TAG_REGEX = /\*\s*@scope\s+(\w+)/g;
|
|
18
|
+
/**
|
|
19
|
+
* Check if the code has any @scope declarations in JSDoc.
|
|
20
|
+
* Used to automatically determine if the node should be in scoped mode.
|
|
21
|
+
*
|
|
22
|
+
* @param functionText - The function text containing JSDoc
|
|
23
|
+
* @returns true if the code has @scope declarations, false otherwise
|
|
24
|
+
*/
|
|
25
|
+
export function hasScopes(functionText) {
|
|
26
|
+
const jsdocMatch = functionText.match(JSDOC_BLOCK_REGEX);
|
|
27
|
+
if (!jsdocMatch)
|
|
28
|
+
return false;
|
|
29
|
+
SCOPE_TAG_REGEX.lastIndex = 0;
|
|
30
|
+
return SCOPE_TAG_REGEX.test(jsdocMatch[0]);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get all scope names declared in the code via @scope tags.
|
|
34
|
+
*
|
|
35
|
+
* @param functionText - The function text containing JSDoc
|
|
36
|
+
* @returns Array of scope names
|
|
37
|
+
*/
|
|
38
|
+
export function getScopeNames(functionText) {
|
|
39
|
+
const jsdocMatch = functionText.match(JSDOC_BLOCK_REGEX);
|
|
40
|
+
if (!jsdocMatch)
|
|
41
|
+
return [];
|
|
42
|
+
const scopes = [];
|
|
43
|
+
SCOPE_TAG_REGEX.lastIndex = 0;
|
|
44
|
+
let match;
|
|
45
|
+
while ((match = SCOPE_TAG_REGEX.exec(jsdocMatch[0])) != null) {
|
|
46
|
+
scopes.push(match[1]);
|
|
47
|
+
}
|
|
48
|
+
return scopes;
|
|
49
|
+
}
|
|
50
|
+
// =============================================================================
|
|
51
|
+
// Orphan/Incomplete Port Detection
|
|
52
|
+
// =============================================================================
|
|
53
|
+
/**
|
|
54
|
+
* Check if the code has any orphan port lines (type but no name).
|
|
55
|
+
* Used to skip rename detection when user is editing port names.
|
|
56
|
+
*/
|
|
57
|
+
export function hasOrphanPortLines(functionText) {
|
|
58
|
+
const jsdocMatch = functionText.match(JSDOC_BLOCK_REGEX);
|
|
59
|
+
if (!jsdocMatch)
|
|
60
|
+
return { inputs: false, outputs: false };
|
|
61
|
+
const lines = jsdocMatch[0].split('\n');
|
|
62
|
+
let hasOrphanInputs = false;
|
|
63
|
+
let hasOrphanOutputs = false;
|
|
64
|
+
for (const line of lines) {
|
|
65
|
+
const orphanMatch = line.match(ORPHAN_PORT_LINE_REGEX);
|
|
66
|
+
if (orphanMatch) {
|
|
67
|
+
const [, tagType] = orphanMatch;
|
|
68
|
+
if (tagType === 'input')
|
|
69
|
+
hasOrphanInputs = true;
|
|
70
|
+
else
|
|
71
|
+
hasOrphanOutputs = true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { inputs: hasOrphanInputs, outputs: hasOrphanOutputs };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Extract port names from incomplete JSDoc lines.
|
|
78
|
+
* These are lines where the user is still typing.
|
|
79
|
+
* Used to prevent generating duplicate tags for ports being edited.
|
|
80
|
+
*/
|
|
81
|
+
export function getIncompletePortNames(functionText) {
|
|
82
|
+
const inputs = new Set();
|
|
83
|
+
const outputs = new Set();
|
|
84
|
+
const steps = new Set();
|
|
85
|
+
const jsdocMatch = functionText.match(JSDOC_BLOCK_REGEX);
|
|
86
|
+
if (!jsdocMatch)
|
|
87
|
+
return { inputs, outputs, steps };
|
|
88
|
+
const lines = jsdocMatch[0].split('\n');
|
|
89
|
+
for (const line of lines) {
|
|
90
|
+
// Check if it looks like a port line but doesn't parse
|
|
91
|
+
if (!PORT_TAG_REGEX.test(line))
|
|
92
|
+
continue;
|
|
93
|
+
if (chevrotainIsValidPortLine(line))
|
|
94
|
+
continue;
|
|
95
|
+
// Try to extract partial port name from incomplete line
|
|
96
|
+
const partialMatch = line.match(/\*\s*@(input|output|step)\s+\[?(\w+)/);
|
|
97
|
+
if (partialMatch) {
|
|
98
|
+
const [, tagType, portName] = partialMatch;
|
|
99
|
+
if (tagType === 'input') {
|
|
100
|
+
inputs.add(portName);
|
|
101
|
+
}
|
|
102
|
+
else if (tagType === 'output') {
|
|
103
|
+
outputs.add(portName);
|
|
104
|
+
}
|
|
105
|
+
else if (tagType === 'step') {
|
|
106
|
+
steps.add(portName);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { inputs, outputs, steps };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if a line is incomplete (port tag but not fully valid).
|
|
114
|
+
* Also detects "incomplete description" patterns like "@input name -" (dash but no text).
|
|
115
|
+
*/
|
|
116
|
+
export function isIncompletePortLine(line) {
|
|
117
|
+
if (!PORT_TAG_REGEX.test(line))
|
|
118
|
+
return false;
|
|
119
|
+
// Check if Chevrotain considers it invalid
|
|
120
|
+
if (!chevrotainIsValidPortLine(line))
|
|
121
|
+
return true;
|
|
122
|
+
// Also treat trailing dash (user typing description) as incomplete
|
|
123
|
+
const cleanLine = line.replace(/^\s*\*\s*/, '').trim();
|
|
124
|
+
if (/\s-\s*$/.test(cleanLine))
|
|
125
|
+
return true;
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
// =============================================================================
|
|
129
|
+
// Port Parsing
|
|
130
|
+
// =============================================================================
|
|
131
|
+
/**
|
|
132
|
+
* Parse @input/@output/@step annotations from function text.
|
|
133
|
+
* Uses Chevrotain for parsing, browser-compatible.
|
|
134
|
+
*
|
|
135
|
+
* Types are derived from signature, not JSDoc:
|
|
136
|
+
* - JSDoc provides metadata: name, optional, default, scope, label, order, placement
|
|
137
|
+
* - Types are inferred from function signature using inferDataTypeFromTS()
|
|
138
|
+
* - @step annotation marks explicit STEP/control-flow ports
|
|
139
|
+
* - Reserved ports (execute, onSuccess, onFailure) auto-detect as STEP
|
|
140
|
+
*/
|
|
141
|
+
export function parsePortsFromFunctionText(functionText) {
|
|
142
|
+
const inputs = {};
|
|
143
|
+
const outputs = {};
|
|
144
|
+
const jsdocMatch = functionText.match(JSDOC_BLOCK_REGEX);
|
|
145
|
+
if (!jsdocMatch) {
|
|
146
|
+
return { inputs, outputs };
|
|
147
|
+
}
|
|
148
|
+
const jsdoc = jsdocMatch[0];
|
|
149
|
+
// Parse function signature to get types
|
|
150
|
+
const { params } = parseFunctionSignature(functionText);
|
|
151
|
+
const returnFields = parseReturnTypeFieldsWithTypes(functionText);
|
|
152
|
+
// Build lookup maps for signature types and optionality
|
|
153
|
+
const paramTypeMap = new Map();
|
|
154
|
+
const paramOptionalMap = new Map();
|
|
155
|
+
for (const param of params) {
|
|
156
|
+
if (param.tsType) {
|
|
157
|
+
paramTypeMap.set(param.name, param.tsType);
|
|
158
|
+
}
|
|
159
|
+
if (param.optional) {
|
|
160
|
+
paramOptionalMap.set(param.name, true);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const returnTypeMap = new Map();
|
|
164
|
+
for (const field of returnFields) {
|
|
165
|
+
returnTypeMap.set(field.name, field.tsType);
|
|
166
|
+
}
|
|
167
|
+
// Parse @scope declarations from JSDoc
|
|
168
|
+
const declaredScopes = new Set();
|
|
169
|
+
SCOPE_TAG_REGEX.lastIndex = 0;
|
|
170
|
+
let scopeMatch;
|
|
171
|
+
while ((scopeMatch = SCOPE_TAG_REGEX.exec(jsdoc)) != null) {
|
|
172
|
+
declaredScopes.add(scopeMatch[1]);
|
|
173
|
+
}
|
|
174
|
+
// Get valid scope names from @scope tags
|
|
175
|
+
// Also infer from callback parameters as fallback
|
|
176
|
+
const inferredScopes = new Set(params.filter((p) => p.tsType?.includes('=>')).map((p) => p.name));
|
|
177
|
+
// Combine declared @scope tags with inferred callback scopes
|
|
178
|
+
const allKnownScopes = new Set([...declaredScopes, ...inferredScopes]);
|
|
179
|
+
// If any scope is declared/known, accept any scope: attribute value
|
|
180
|
+
// This allows @scope processItem with scope:iteration - user knows what they're doing
|
|
181
|
+
const hasAnyScope = allKnownScopes.size > 0;
|
|
182
|
+
const validateScope = (scope) => {
|
|
183
|
+
if (!scope)
|
|
184
|
+
return undefined;
|
|
185
|
+
// If we have any declared/inferred scopes, accept any scope attribute
|
|
186
|
+
// (user may use different naming convention)
|
|
187
|
+
if (hasAnyScope)
|
|
188
|
+
return scope;
|
|
189
|
+
return undefined;
|
|
190
|
+
};
|
|
191
|
+
// Parse ports using Chevrotain
|
|
192
|
+
const portResults = parsePortsFromJSDoc(jsdoc);
|
|
193
|
+
for (const port of portResults) {
|
|
194
|
+
const { type, name, scope, order, placement, description, defaultValue, isOptional } = port;
|
|
195
|
+
if (type === 'step') {
|
|
196
|
+
// @step ports are always STEP type
|
|
197
|
+
const portDef = {
|
|
198
|
+
dataType: 'STEP',
|
|
199
|
+
...(description && { label: description }),
|
|
200
|
+
};
|
|
201
|
+
// Determine if input or output from signature
|
|
202
|
+
const isInput = paramTypeMap.has(name);
|
|
203
|
+
const isOutput = returnTypeMap.has(name);
|
|
204
|
+
if (isInput) {
|
|
205
|
+
inputs[name] = portDef;
|
|
206
|
+
}
|
|
207
|
+
else if (isOutput) {
|
|
208
|
+
outputs[name] = portDef;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
// Default to output for custom STEP ports
|
|
212
|
+
outputs[name] = portDef;
|
|
213
|
+
}
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (type === 'input') {
|
|
217
|
+
// First port wins - skip duplicates
|
|
218
|
+
if (inputs[name])
|
|
219
|
+
continue;
|
|
220
|
+
const validatedScope = validateScope(scope);
|
|
221
|
+
// Determine type from signature or default to ANY
|
|
222
|
+
let dataType;
|
|
223
|
+
let tsType;
|
|
224
|
+
// Reserved external STEP ports (execute) are always STEP
|
|
225
|
+
// Scoped mandatory ports (success, failure) are STEP only when scoped
|
|
226
|
+
const isExternalStepPort = isExecutePort(name);
|
|
227
|
+
const isScopedStepPort = validatedScope && isScopedMandatoryPort(name);
|
|
228
|
+
if (isExternalStepPort || isScopedStepPort) {
|
|
229
|
+
dataType = 'STEP';
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
tsType = paramTypeMap.get(name);
|
|
233
|
+
dataType = tsType ? inferDataTypeFromTS(tsType) : 'ANY';
|
|
234
|
+
}
|
|
235
|
+
// Optional if marked in JSDoc or in signature
|
|
236
|
+
const signatureOptional = paramOptionalMap.get(name) || false;
|
|
237
|
+
const portOptional = isOptional || signatureOptional;
|
|
238
|
+
const metadata = {};
|
|
239
|
+
if (order !== undefined)
|
|
240
|
+
metadata.order = order;
|
|
241
|
+
if (placement)
|
|
242
|
+
metadata.placement = placement;
|
|
243
|
+
inputs[name] = {
|
|
244
|
+
dataType,
|
|
245
|
+
...(tsType && { tsType }),
|
|
246
|
+
...(portOptional && { optional: true }),
|
|
247
|
+
...(defaultValue && { default: parseDefaultValue(defaultValue) }),
|
|
248
|
+
...(validatedScope && { scope: validatedScope }),
|
|
249
|
+
...(description && { label: description }),
|
|
250
|
+
...(Object.keys(metadata).length > 0 && { metadata }),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
if (type === 'output') {
|
|
254
|
+
// First port wins - skip duplicates
|
|
255
|
+
if (outputs[name])
|
|
256
|
+
continue;
|
|
257
|
+
const validatedScope = validateScope(scope);
|
|
258
|
+
// Determine type from signature or default to ANY
|
|
259
|
+
let dataType;
|
|
260
|
+
let tsType;
|
|
261
|
+
// Reserved external STEP ports (onSuccess, onFailure) are always STEP
|
|
262
|
+
// Scoped mandatory ports (start, success, failure) are STEP only when scoped
|
|
263
|
+
const isExternalStepPort = isSuccessPort(name) || isFailurePort(name);
|
|
264
|
+
const isScopedStepPort = validatedScope && isScopedMandatoryPort(name);
|
|
265
|
+
if (isExternalStepPort || isScopedStepPort) {
|
|
266
|
+
dataType = 'STEP';
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
tsType = returnTypeMap.get(name);
|
|
270
|
+
dataType = tsType ? inferDataTypeFromTS(tsType) : 'ANY';
|
|
271
|
+
}
|
|
272
|
+
const metadata = {};
|
|
273
|
+
if (order !== undefined)
|
|
274
|
+
metadata.order = order;
|
|
275
|
+
if (placement)
|
|
276
|
+
metadata.placement = placement;
|
|
277
|
+
outputs[name] = {
|
|
278
|
+
dataType,
|
|
279
|
+
...(tsType && { tsType }),
|
|
280
|
+
...(validatedScope && { scope: validatedScope }),
|
|
281
|
+
...(description && { label: description }),
|
|
282
|
+
...(Object.keys(metadata).length > 0 && { metadata }),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return { inputs, outputs };
|
|
287
|
+
}
|
|
288
|
+
// =============================================================================
|
|
289
|
+
// Port Update
|
|
290
|
+
// =============================================================================
|
|
291
|
+
/**
|
|
292
|
+
* Update @input/@output annotations in function text.
|
|
293
|
+
* Preserves other JSDoc content (description, @label, @scope, etc.).
|
|
294
|
+
*
|
|
295
|
+
* @param signatureInputOrder - Optional array of input names in signature order.
|
|
296
|
+
* When provided, new inputs are inserted at the correct position based on signature.
|
|
297
|
+
*/
|
|
298
|
+
export function updatePortsInFunctionText(functionText, inputs, outputs, signatureInputOrder) {
|
|
299
|
+
const jsdocMatch = functionText.match(JSDOC_BLOCK_REGEX);
|
|
300
|
+
// Get port names from incomplete JSDoc lines (user still typing)
|
|
301
|
+
const incompletePortNames = getIncompletePortNames(functionText);
|
|
302
|
+
// Generate new port tags (skip ports with incomplete lines)
|
|
303
|
+
const inputTags = Object.entries(inputs)
|
|
304
|
+
.filter(([name]) => !incompletePortNames.inputs.has(name))
|
|
305
|
+
.map(([name, port]) => ` * ${generateJSDocPortTag(name, port, 'input')}`);
|
|
306
|
+
const outputTags = Object.entries(outputs)
|
|
307
|
+
.filter(([name]) => !incompletePortNames.outputs.has(name))
|
|
308
|
+
.map(([name, port]) => ` * ${generateJSDocPortTag(name, port, 'output')}`);
|
|
309
|
+
if (!jsdocMatch) {
|
|
310
|
+
// No existing JSDoc - create new one
|
|
311
|
+
const newJsDoc = ['/**', ' * @flowWeaver nodeType', ...inputTags, ...outputTags, ' */'].join('\n');
|
|
312
|
+
return newJsDoc + '\n' + functionText;
|
|
313
|
+
}
|
|
314
|
+
// Parse existing JSDoc to preserve non-port content
|
|
315
|
+
const existingJsDoc = jsdocMatch[0];
|
|
316
|
+
const lines = existingJsDoc.split('\n');
|
|
317
|
+
const preservedLines = [];
|
|
318
|
+
let hasFlowWeaverTag = false;
|
|
319
|
+
// Track which ports we've seen in the existing JSDoc
|
|
320
|
+
const seenInputs = new Set();
|
|
321
|
+
const seenOutputs = new Set();
|
|
322
|
+
// Track orphan incomplete lines
|
|
323
|
+
const orphanInputLines = [];
|
|
324
|
+
const orphanOutputLines = [];
|
|
325
|
+
// Track last input/output line indices for proper insertion ordering
|
|
326
|
+
let lastInputLineIndex = -1;
|
|
327
|
+
let lastOutputLineIndex = -1;
|
|
328
|
+
for (const line of lines) {
|
|
329
|
+
// Always preserve opening and closing
|
|
330
|
+
if (line.trim() === '/**' || line.trim() === '*/') {
|
|
331
|
+
preservedLines.push(line);
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
// Check if this is a port line
|
|
335
|
+
if (PORT_TAG_REGEX.test(line)) {
|
|
336
|
+
// Check if this is an orphan line (just tag, no name)
|
|
337
|
+
const orphanMatch = line.match(ORPHAN_PORT_LINE_REGEX);
|
|
338
|
+
if (orphanMatch) {
|
|
339
|
+
const [, tagType] = orphanMatch;
|
|
340
|
+
const lineIndex = preservedLines.length;
|
|
341
|
+
preservedLines.push(line);
|
|
342
|
+
if (tagType === 'input') {
|
|
343
|
+
orphanInputLines.push({ index: lineIndex, type: 'ANY' });
|
|
344
|
+
lastInputLineIndex = lineIndex;
|
|
345
|
+
}
|
|
346
|
+
else if (tagType === 'output' || tagType === 'step') {
|
|
347
|
+
orphanOutputLines.push({ index: lineIndex, type: 'ANY' });
|
|
348
|
+
lastOutputLineIndex = lineIndex;
|
|
349
|
+
}
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
// Preserve incomplete port lines (user still typing)
|
|
353
|
+
if (isIncompletePortLine(line)) {
|
|
354
|
+
const lineIndex = preservedLines.length;
|
|
355
|
+
preservedLines.push(line);
|
|
356
|
+
const partialMatch = line.match(/\*\s*@(input|output|step)\s+\[?(\w+)/);
|
|
357
|
+
if (partialMatch) {
|
|
358
|
+
const [, tagType, portName] = partialMatch;
|
|
359
|
+
if (tagType === 'input') {
|
|
360
|
+
seenInputs.add(portName);
|
|
361
|
+
lastInputLineIndex = lineIndex;
|
|
362
|
+
}
|
|
363
|
+
else if (tagType === 'output') {
|
|
364
|
+
seenOutputs.add(portName);
|
|
365
|
+
lastOutputLineIndex = lineIndex;
|
|
366
|
+
}
|
|
367
|
+
else if (tagType === 'step') {
|
|
368
|
+
seenInputs.add(portName);
|
|
369
|
+
seenOutputs.add(portName);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
// Parse the port line using Chevrotain
|
|
375
|
+
const cleanLine = line.replace(/^\s*\*\s*/, '').trim();
|
|
376
|
+
const parsed = parsePortLine(cleanLine, []);
|
|
377
|
+
if (parsed) {
|
|
378
|
+
const lineIndex = preservedLines.length;
|
|
379
|
+
if (parsed.type === 'input') {
|
|
380
|
+
if (!inputs[parsed.name])
|
|
381
|
+
continue; // Port removed
|
|
382
|
+
preservedLines.push(line.trimEnd());
|
|
383
|
+
seenInputs.add(parsed.name);
|
|
384
|
+
lastInputLineIndex = lineIndex;
|
|
385
|
+
}
|
|
386
|
+
else if (parsed.type === 'output') {
|
|
387
|
+
if (!outputs[parsed.name])
|
|
388
|
+
continue; // Port removed
|
|
389
|
+
preservedLines.push(line.trimEnd());
|
|
390
|
+
seenOutputs.add(parsed.name);
|
|
391
|
+
lastOutputLineIndex = lineIndex;
|
|
392
|
+
}
|
|
393
|
+
else if (parsed.type === 'step') {
|
|
394
|
+
const isInput = inputs[parsed.name] !== undefined;
|
|
395
|
+
const isOutput = outputs[parsed.name] !== undefined;
|
|
396
|
+
if (!isInput && !isOutput)
|
|
397
|
+
continue; // Port removed
|
|
398
|
+
preservedLines.push(line.trimEnd());
|
|
399
|
+
if (isInput) {
|
|
400
|
+
seenInputs.add(parsed.name);
|
|
401
|
+
lastInputLineIndex = lineIndex;
|
|
402
|
+
}
|
|
403
|
+
if (isOutput) {
|
|
404
|
+
seenOutputs.add(parsed.name);
|
|
405
|
+
lastOutputLineIndex = lineIndex;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
// Port tag but doesn't parse - preserve it
|
|
411
|
+
preservedLines.push(line);
|
|
412
|
+
continue;
|
|
413
|
+
}
|
|
414
|
+
// Track if we have @flowWeaver tag
|
|
415
|
+
if (line.includes('@flowWeaver')) {
|
|
416
|
+
hasFlowWeaverTag = true;
|
|
417
|
+
}
|
|
418
|
+
// Preserve all other lines
|
|
419
|
+
preservedLines.push(line);
|
|
420
|
+
}
|
|
421
|
+
// Build new JSDoc
|
|
422
|
+
const newLines = [...preservedLines];
|
|
423
|
+
// If no @flowWeaver tag, add it
|
|
424
|
+
if (!hasFlowWeaverTag) {
|
|
425
|
+
newLines.splice(1, 0, ' * @flowWeaver nodeType');
|
|
426
|
+
}
|
|
427
|
+
// Find ports that need to be added (not already in JSDoc)
|
|
428
|
+
const inputsToAdd = Object.entries(inputs).filter(([name]) => !seenInputs.has(name) && !incompletePortNames.inputs.has(name));
|
|
429
|
+
const outputsToAdd = Object.entries(outputs).filter(([name]) => !seenOutputs.has(name) && !incompletePortNames.outputs.has(name));
|
|
430
|
+
// Fill in orphan lines first
|
|
431
|
+
const remainingInputsToAdd = [];
|
|
432
|
+
for (const [name, port] of inputsToAdd) {
|
|
433
|
+
const orphanIndex = orphanInputLines.findIndex((o) => o.type === port.dataType);
|
|
434
|
+
if (orphanIndex !== -1) {
|
|
435
|
+
const orphan = orphanInputLines[orphanIndex];
|
|
436
|
+
newLines[orphan.index] = ` * ${generateJSDocPortTag(name, port, 'input')}`;
|
|
437
|
+
orphanInputLines.splice(orphanIndex, 1);
|
|
438
|
+
}
|
|
439
|
+
else if (orphanInputLines.length > 0) {
|
|
440
|
+
const orphan = orphanInputLines.shift();
|
|
441
|
+
newLines[orphan.index] = ` * ${generateJSDocPortTag(name, port, 'input')}`;
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
remainingInputsToAdd.push([name, port]);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
const remainingOutputsToAdd = [];
|
|
448
|
+
for (const [name, port] of outputsToAdd) {
|
|
449
|
+
const orphanIndex = orphanOutputLines.findIndex((o) => o.type === port.dataType);
|
|
450
|
+
if (orphanIndex !== -1) {
|
|
451
|
+
const orphan = orphanOutputLines[orphanIndex];
|
|
452
|
+
newLines[orphan.index] = ` * ${generateJSDocPortTag(name, port, 'output')}`;
|
|
453
|
+
orphanOutputLines.splice(orphanIndex, 1);
|
|
454
|
+
}
|
|
455
|
+
else if (orphanOutputLines.length > 0) {
|
|
456
|
+
const orphan = orphanOutputLines.shift();
|
|
457
|
+
newLines[orphan.index] = ` * ${generateJSDocPortTag(name, port, 'output')}`;
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
remainingOutputsToAdd.push([name, port]);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
// Generate tags for remaining ports
|
|
464
|
+
const newOutputTags = remainingOutputsToAdd.map(([name, port]) => ` * ${generateJSDocPortTag(name, port, 'output')}`);
|
|
465
|
+
// Insert NEW port tags at proper positions
|
|
466
|
+
const closingIndex = newLines.findIndex((l) => l.trim() === '*/');
|
|
467
|
+
if (newOutputTags.length > 0) {
|
|
468
|
+
const outputInsertIndex = lastOutputLineIndex >= 0
|
|
469
|
+
? lastOutputLineIndex + 1
|
|
470
|
+
: lastInputLineIndex >= 0
|
|
471
|
+
? lastInputLineIndex + 1
|
|
472
|
+
: closingIndex;
|
|
473
|
+
newLines.splice(outputInsertIndex, 0, ...newOutputTags);
|
|
474
|
+
}
|
|
475
|
+
if (remainingInputsToAdd.length > 0) {
|
|
476
|
+
const flowWeaverIndex = newLines.findIndex((l) => l.includes('@flowWeaver'));
|
|
477
|
+
// Separate scoped inputs from non-scoped inputs
|
|
478
|
+
const scopedInputsToAdd = remainingInputsToAdd.filter(([_, port]) => port.scope);
|
|
479
|
+
const nonScopedInputsToAdd = remainingInputsToAdd.filter(([_, port]) => !port.scope);
|
|
480
|
+
if (signatureInputOrder && signatureInputOrder.length > 0 && nonScopedInputsToAdd.length > 0) {
|
|
481
|
+
// Build a map of existing input names to their line indices
|
|
482
|
+
const existingInputLineIndices = {};
|
|
483
|
+
for (let i = 0; i < newLines.length; i++) {
|
|
484
|
+
const line = newLines[i];
|
|
485
|
+
const cleanLine = line.replace(/^\s*\*\s*/, '').trim();
|
|
486
|
+
const parsed = parsePortLine(cleanLine, []);
|
|
487
|
+
if (parsed && parsed.type === 'input') {
|
|
488
|
+
existingInputLineIndices[parsed.name] = i;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
// Insert each new non-scoped input at the correct position
|
|
492
|
+
const sortedInputsToAdd = nonScopedInputsToAdd
|
|
493
|
+
.map(([name, port]) => ({
|
|
494
|
+
name,
|
|
495
|
+
port,
|
|
496
|
+
sigIndex: signatureInputOrder.indexOf(name),
|
|
497
|
+
}))
|
|
498
|
+
.filter((item) => item.sigIndex !== -1)
|
|
499
|
+
.sort((a, b) => b.sigIndex - a.sigIndex);
|
|
500
|
+
for (const { name, port, sigIndex } of sortedInputsToAdd) {
|
|
501
|
+
const newTag = ` * ${generateJSDocPortTag(name, port, 'input')}`;
|
|
502
|
+
let insertIndex = -1;
|
|
503
|
+
for (let i = sigIndex + 1; i < signatureInputOrder.length; i++) {
|
|
504
|
+
const nextName = signatureInputOrder[i];
|
|
505
|
+
if (existingInputLineIndices[nextName] !== undefined) {
|
|
506
|
+
insertIndex = existingInputLineIndices[nextName];
|
|
507
|
+
break;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
if (insertIndex !== -1) {
|
|
511
|
+
newLines.splice(insertIndex, 0, newTag);
|
|
512
|
+
for (const [portName, idx] of Object.entries(existingInputLineIndices)) {
|
|
513
|
+
if (idx >= insertIndex) {
|
|
514
|
+
existingInputLineIndices[portName] = idx + 1;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
existingInputLineIndices[name] = insertIndex;
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
for (let i = sigIndex - 1; i >= 0; i--) {
|
|
521
|
+
const prevName = signatureInputOrder[i];
|
|
522
|
+
if (existingInputLineIndices[prevName] !== undefined) {
|
|
523
|
+
insertIndex = existingInputLineIndices[prevName] + 1;
|
|
524
|
+
break;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
if (insertIndex === -1) {
|
|
528
|
+
insertIndex = flowWeaverIndex >= 0 ? flowWeaverIndex + 1 : 1;
|
|
529
|
+
}
|
|
530
|
+
newLines.splice(insertIndex, 0, newTag);
|
|
531
|
+
for (const [portName, idx] of Object.entries(existingInputLineIndices)) {
|
|
532
|
+
if (idx >= insertIndex) {
|
|
533
|
+
existingInputLineIndices[portName] = idx + 1;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
existingInputLineIndices[name] = insertIndex;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
else if (nonScopedInputsToAdd.length > 0) {
|
|
541
|
+
const nonScopedInputTags = nonScopedInputsToAdd.map(([name, port]) => ` * ${generateJSDocPortTag(name, port, 'input')}`);
|
|
542
|
+
const inputInsertIndex = lastInputLineIndex >= 0
|
|
543
|
+
? lastInputLineIndex + 1
|
|
544
|
+
: flowWeaverIndex >= 0
|
|
545
|
+
? flowWeaverIndex + 1
|
|
546
|
+
: 1;
|
|
547
|
+
newLines.splice(inputInsertIndex, 0, ...nonScopedInputTags);
|
|
548
|
+
}
|
|
549
|
+
// Insert scoped inputs after outputs (standard port order: inputs, scoped outputs, scoped inputs, outputs)
|
|
550
|
+
if (scopedInputsToAdd.length > 0) {
|
|
551
|
+
const scopedInputTags = scopedInputsToAdd.map(([name, port]) => ` * ${generateJSDocPortTag(name, port, 'input')}`);
|
|
552
|
+
// Insert after the last output line, or after inputs if no outputs
|
|
553
|
+
const closingIdx = newLines.findIndex((l) => l.trim() === '*/');
|
|
554
|
+
const insertIdx = lastOutputLineIndex >= 0
|
|
555
|
+
? lastOutputLineIndex + 1
|
|
556
|
+
: closingIdx >= 0
|
|
557
|
+
? closingIdx
|
|
558
|
+
: newLines.length - 1;
|
|
559
|
+
newLines.splice(insertIdx, 0, ...scopedInputTags);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
const newJsDoc = newLines.join('\n');
|
|
563
|
+
return functionText.replace(JSDOC_BLOCK_REGEX, newJsDoc);
|
|
564
|
+
}
|
|
565
|
+
// =============================================================================
|
|
566
|
+
// Helpers
|
|
567
|
+
// =============================================================================
|
|
568
|
+
/**
|
|
569
|
+
* Parse default value from string.
|
|
570
|
+
*/
|
|
571
|
+
function parseDefaultValue(value) {
|
|
572
|
+
try {
|
|
573
|
+
return JSON.parse(value);
|
|
574
|
+
}
|
|
575
|
+
catch {
|
|
576
|
+
return value;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=port-parser.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module jsdoc-port-sync/rename
|
|
3
|
+
*
|
|
4
|
+
* Port renaming and code rename synchronization.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Rename a port in both JSDoc and function signature.
|
|
8
|
+
* For input ports: renames @input tag and function parameter
|
|
9
|
+
* For output ports: renames @output tag and return type field
|
|
10
|
+
* For scoped ports: also updates callback parameter/return names
|
|
11
|
+
*/
|
|
12
|
+
export declare function renamePortInCode(code: string, oldPortName: string, newPortName: string, portType: "input" | "output"): string;
|
|
13
|
+
/**
|
|
14
|
+
* Sync renames between JSDoc ports and function signature using before/after diff.
|
|
15
|
+
*
|
|
16
|
+
* @param previousCode - The code before the edit
|
|
17
|
+
* @param currentCode - The code after the edit
|
|
18
|
+
* @returns The synchronized code
|
|
19
|
+
*/
|
|
20
|
+
export declare function syncCodeRenames(previousCode: string, currentCode: string): string;
|
|
21
|
+
//# sourceMappingURL=rename.d.ts.map
|