@office-ai/aioncli-core 0.30.0 → 0.30.1
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/dist/docs/assets/theme-ansi-dark.png +0 -0
- package/dist/docs/assets/theme-atom-one-dark.png +0 -0
- package/dist/docs/assets/theme-ayu-dark.png +0 -0
- package/dist/docs/assets/theme-default-dark.png +0 -0
- package/dist/docs/assets/theme-dracula-dark.png +0 -0
- package/dist/docs/assets/theme-github-dark.png +0 -0
- package/dist/docs/assets/theme-holiday-dark.png +0 -0
- package/dist/docs/assets/theme-shades-of-purple-dark.png +0 -0
- package/dist/docs/assets/theme-solarized-dark.png +0 -0
- package/dist/docs/assets/theme-solarized-light.png +0 -0
- package/dist/docs/cli/notifications.md +58 -0
- package/dist/docs/redirects.json +20 -0
- package/dist/docs/reference/commands.md +563 -0
- package/dist/docs/reference/configuration.md +1804 -0
- package/dist/docs/reference/keyboard-shortcuts.md +168 -0
- package/dist/docs/reference/memport.md +246 -0
- package/dist/docs/reference/policy-engine.md +386 -0
- package/dist/docs/reference/tools.md +106 -0
- package/dist/docs/resources/faq.md +175 -0
- package/dist/docs/resources/quota-and-pricing.md +199 -0
- package/dist/docs/resources/tos-privacy.md +102 -0
- package/dist/docs/resources/troubleshooting.md +176 -0
- package/dist/docs/resources/uninstall.md +56 -0
- package/dist/src/agents/a2a-errors.d.ts +65 -0
- package/dist/src/agents/a2a-errors.js +164 -0
- package/dist/src/agents/a2a-errors.js.map +1 -0
- package/dist/src/agents/a2a-errors.test.d.ts +6 -0
- package/dist/src/agents/a2a-errors.test.js +183 -0
- package/dist/src/agents/a2a-errors.test.js.map +1 -0
- package/dist/src/agents/auth-provider/api-key-provider.d.ts +30 -0
- package/dist/src/agents/auth-provider/api-key-provider.js +66 -0
- package/dist/src/agents/auth-provider/api-key-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.js +130 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -0
- package/dist/src/agents/auth-provider/http-provider.d.ts +28 -0
- package/dist/src/agents/auth-provider/http-provider.js +73 -0
- package/dist/src/agents/auth-provider/http-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/http-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/http-provider.test.js +112 -0
- package/dist/src/agents/auth-provider/http-provider.test.js.map +1 -0
- package/dist/src/agents/auth-provider/oauth2-provider.d.ts +65 -0
- package/dist/src/agents/auth-provider/oauth2-provider.js +233 -0
- package/dist/src/agents/auth-provider/oauth2-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.js +490 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.js.map +1 -0
- package/dist/src/agents/browser/analyzeScreenshot.d.ts +35 -0
- package/dist/src/agents/browser/analyzeScreenshot.js +183 -0
- package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.d.ts +6 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.js +161 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -0
- package/dist/src/agents/browser/automationOverlay.d.ts +26 -0
- package/dist/src/agents/browser/automationOverlay.js +100 -0
- package/dist/src/agents/browser/automationOverlay.js.map +1 -0
- package/dist/src/agents/browser/browserAgentDefinition.d.ts +50 -0
- package/dist/src/agents/browser/browserAgentDefinition.js +141 -0
- package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -0
- package/dist/src/agents/browser/browserAgentFactory.d.ts +42 -0
- package/dist/src/agents/browser/browserAgentFactory.js +116 -0
- package/dist/src/agents/browser/browserAgentFactory.js.map +1 -0
- package/dist/src/agents/browser/browserAgentFactory.test.d.ts +6 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js +240 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.d.ts +34 -0
- package/dist/src/agents/browser/browserAgentInvocation.js +386 -0
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.d.ts +6 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js +382 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -0
- package/dist/src/agents/browser/browserManager.d.ts +115 -0
- package/dist/src/agents/browser/browserManager.js +370 -0
- package/dist/src/agents/browser/browserManager.js.map +1 -0
- package/dist/src/agents/browser/browserManager.test.d.ts +6 -0
- package/dist/src/agents/browser/browserManager.test.js +382 -0
- package/dist/src/agents/browser/browserManager.test.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapper.d.ts +45 -0
- package/dist/src/agents/browser/mcpToolWrapper.js +358 -0
- package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.d.ts +6 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js +126 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.d.ts +6 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js +59 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js.map +1 -0
- package/dist/src/agents/browser/modelAvailability.d.ts +23 -0
- package/dist/src/agents/browser/modelAvailability.js +23 -0
- package/dist/src/agents/browser/modelAvailability.js.map +1 -0
- package/dist/src/agents/cli-help-agent.d.ts +2 -2
- package/dist/src/billing/billing.d.ts +80 -0
- package/dist/src/billing/billing.js +128 -0
- package/dist/src/billing/billing.js.map +1 -0
- package/dist/src/billing/billing.test.d.ts +6 -0
- package/dist/src/billing/billing.test.js +182 -0
- package/dist/src/billing/billing.test.js.map +1 -0
- package/dist/src/billing/index.d.ts +6 -0
- package/dist/src/billing/index.js +7 -0
- package/dist/src/billing/index.js.map +1 -0
- package/dist/src/code_assist/oauth2.d.ts +1 -1
- package/dist/src/code_assist/types.d.ts +26 -26
- package/dist/src/config/agent-loop-context.d.ts +22 -0
- package/dist/src/config/agent-loop-context.js +7 -0
- package/dist/src/config/agent-loop-context.js.map +1 -0
- package/dist/src/config/trackerFeatureFlag.test.d.ts +6 -0
- package/dist/src/config/trackerFeatureFlag.test.js +43 -0
- package/dist/src/config/trackerFeatureFlag.test.js.map +1 -0
- package/dist/src/config/userHintService.d.ts +46 -0
- package/dist/src/config/userHintService.js +81 -0
- package/dist/src/config/userHintService.js.map +1 -0
- package/dist/src/config/userHintService.test.d.ts +6 -0
- package/dist/src/config/userHintService.test.js +62 -0
- package/dist/src/config/userHintService.test.js.map +1 -0
- package/dist/src/core/localLiteRtLmClient.d.ts +24 -0
- package/dist/src/core/localLiteRtLmClient.js +77 -0
- package/dist/src/core/localLiteRtLmClient.js.map +1 -0
- package/dist/src/core/localLiteRtLmClient.test.d.ts +6 -0
- package/dist/src/core/localLiteRtLmClient.test.js +87 -0
- package/dist/src/core/localLiteRtLmClient.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator.d.ts +1 -0
- package/dist/src/core/openaiContentGenerator.js +13 -13
- package/dist/src/core/openaiContentGenerator.js.map +1 -1
- package/dist/src/hooks/runtimeHooks.test.d.ts +6 -0
- package/dist/src/hooks/runtimeHooks.test.js +100 -0
- package/dist/src/hooks/runtimeHooks.test.js.map +1 -0
- package/dist/src/ide/types.d.ts +6 -6
- package/dist/src/mcp/mcp-oauth-provider.d.ts +43 -0
- package/dist/src/mcp/mcp-oauth-provider.js +67 -0
- package/dist/src/mcp/mcp-oauth-provider.js.map +1 -0
- package/dist/src/mcp/mcp-oauth-provider.test.d.ts +6 -0
- package/dist/src/mcp/mcp-oauth-provider.test.js +63 -0
- package/dist/src/mcp/mcp-oauth-provider.test.js.map +1 -0
- package/dist/src/policy/integrity.d.ts +45 -0
- package/dist/src/policy/integrity.js +121 -0
- package/dist/src/policy/integrity.js.map +1 -0
- package/dist/src/policy/integrity.test.d.ts +6 -0
- package/dist/src/policy/integrity.test.js +132 -0
- package/dist/src/policy/integrity.test.js.map +1 -0
- package/dist/src/policy/policies/conseca.toml +6 -0
- package/dist/src/policy/workspace-policy.test.js +231 -0
- package/dist/src/policy/workspace-policy.test.js.map +1 -0
- package/dist/src/routing/strategies/approvalModeStrategy.d.ts +18 -0
- package/dist/src/routing/strategies/approvalModeStrategy.js +59 -0
- package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.d.ts +6 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js +140 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.d.ts +14 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js +182 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js.map +1 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.d.ts +6 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js +218 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js.map +1 -0
- package/dist/src/safety/conseca/conseca.d.ts +31 -0
- package/dist/src/safety/conseca/conseca.js +105 -0
- package/dist/src/safety/conseca/conseca.js.map +1 -0
- package/dist/src/safety/conseca/conseca.test.js +226 -0
- package/dist/src/safety/conseca/conseca.test.js.map +1 -0
- package/dist/src/safety/conseca/integration.test.js +19 -0
- package/dist/src/safety/conseca/integration.test.js.map +1 -0
- package/dist/src/safety/conseca/policy-enforcer.d.ts +13 -0
- package/dist/src/safety/conseca/policy-enforcer.js +135 -0
- package/dist/src/safety/conseca/policy-enforcer.js.map +1 -0
- package/dist/src/safety/conseca/policy-enforcer.test.js +141 -0
- package/dist/src/safety/conseca/policy-enforcer.test.js.map +1 -0
- package/dist/src/safety/conseca/policy-generator.d.ts +15 -0
- package/dist/src/safety/conseca/policy-generator.js +144 -0
- package/dist/src/safety/conseca/policy-generator.js.map +1 -0
- package/dist/src/safety/conseca/policy-generator.test.d.ts +6 -0
- package/dist/src/safety/conseca/policy-generator.test.js +84 -0
- package/dist/src/safety/conseca/policy-generator.test.js.map +1 -0
- package/dist/src/safety/conseca/types.d.ts +15 -0
- package/dist/src/safety/conseca/types.js +7 -0
- package/dist/src/safety/conseca/types.js.map +1 -0
- package/dist/src/scheduler/scheduler_parallel.test.d.ts +6 -0
- package/dist/src/scheduler/scheduler_parallel.test.js +401 -0
- package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -0
- package/dist/src/services/FolderTrustDiscoveryService.d.ts +32 -0
- package/dist/src/services/FolderTrustDiscoveryService.js +169 -0
- package/dist/src/services/FolderTrustDiscoveryService.js.map +1 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.d.ts +6 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.js +118 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.js.map +1 -0
- package/dist/src/services/fileKeychain.d.ts +24 -0
- package/dist/src/services/fileKeychain.js +123 -0
- package/dist/src/services/fileKeychain.js.map +1 -0
- package/dist/src/services/keychainService.d.ts +51 -0
- package/dist/src/services/keychainService.js +133 -0
- package/dist/src/services/keychainService.js.map +1 -0
- package/dist/src/services/keychainService.test.d.ts +6 -0
- package/dist/src/services/keychainService.test.js +150 -0
- package/dist/src/services/keychainService.test.js.map +1 -0
- package/dist/src/services/keychainTypes.d.ts +41 -0
- package/dist/src/services/keychainTypes.js +18 -0
- package/dist/src/services/keychainTypes.js.map +1 -0
- package/dist/src/services/trackerService.d.ts +49 -0
- package/dist/src/services/trackerService.js +193 -0
- package/dist/src/services/trackerService.js.map +1 -0
- package/dist/src/services/trackerService.test.d.ts +6 -0
- package/dist/src/services/trackerService.test.js +117 -0
- package/dist/src/services/trackerService.test.js.map +1 -0
- package/dist/src/services/trackerTypes.d.ts +51 -0
- package/dist/src/services/trackerTypes.js +33 -0
- package/dist/src/services/trackerTypes.js.map +1 -0
- package/dist/src/telemetry/billingEvents.d.ts +75 -0
- package/dist/src/telemetry/billingEvents.js +181 -0
- package/dist/src/telemetry/billingEvents.js.map +1 -0
- package/dist/src/telemetry/billingEvents.test.d.ts +6 -0
- package/dist/src/telemetry/billingEvents.test.js +139 -0
- package/dist/src/telemetry/billingEvents.test.js.map +1 -0
- package/dist/src/telemetry/conseca-logger.d.ts +9 -0
- package/dist/src/telemetry/conseca-logger.js +91 -0
- package/dist/src/telemetry/conseca-logger.js.map +1 -0
- package/dist/src/telemetry/conseca-logger.test.d.ts +6 -0
- package/dist/src/telemetry/conseca-logger.test.js +90 -0
- package/dist/src/telemetry/conseca-logger.test.js.map +1 -0
- package/dist/src/telemetry/trace.test.d.ts +6 -0
- package/dist/src/telemetry/trace.test.js +116 -0
- package/dist/src/telemetry/trace.test.js.map +1 -0
- package/dist/src/tools/definitions/trackerTools.d.ts +12 -0
- package/dist/src/tools/definitions/trackerTools.js +146 -0
- package/dist/src/tools/definitions/trackerTools.js.map +1 -0
- package/dist/src/tools/diff-utils.d.ts +9 -0
- package/dist/src/tools/diff-utils.js +66 -0
- package/dist/src/tools/diff-utils.js.map +1 -0
- package/dist/src/tools/diff-utils.test.d.ts +6 -0
- package/dist/src/tools/diff-utils.test.js +53 -0
- package/dist/src/tools/diff-utils.test.js.map +1 -0
- package/dist/src/tools/grep-utils.d.ts +49 -0
- package/dist/src/tools/grep-utils.js +147 -0
- package/dist/src/tools/grep-utils.js.map +1 -0
- package/dist/src/tools/omissionPlaceholderDetector.d.ts +15 -0
- package/dist/src/tools/omissionPlaceholderDetector.js +90 -0
- package/dist/src/tools/omissionPlaceholderDetector.js.map +1 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.d.ts +6 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.js +49 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.js.map +1 -0
- package/dist/src/tools/trackerTools.d.ts +122 -0
- package/dist/src/tools/trackerTools.js +365 -0
- package/dist/src/tools/trackerTools.js.map +1 -0
- package/dist/src/tools/trackerTools.test.d.ts +6 -0
- package/dist/src/tools/trackerTools.test.js +97 -0
- package/dist/src/tools/trackerTools.test.js.map +1 -0
- package/dist/src/utils/approvalModeUtils.d.ts +14 -0
- package/dist/src/utils/approvalModeUtils.js +35 -0
- package/dist/src/utils/approvalModeUtils.js.map +1 -0
- package/dist/src/utils/approvalModeUtils.test.d.ts +6 -0
- package/dist/src/utils/approvalModeUtils.test.js +36 -0
- package/dist/src/utils/approvalModeUtils.test.js.map +1 -0
- package/dist/src/utils/cache.d.ts +63 -0
- package/dist/src/utils/cache.js +103 -0
- package/dist/src/utils/cache.js.map +1 -0
- package/dist/src/utils/cache.test.d.ts +6 -0
- package/dist/src/utils/cache.test.js +158 -0
- package/dist/src/utils/cache.test.js.map +1 -0
- package/dist/src/utils/checkpointUtils.d.ts +2 -2
- package/dist/src/utils/compatibility.d.ts +41 -0
- package/dist/src/utils/compatibility.js +112 -0
- package/dist/src/utils/compatibility.js.map +1 -0
- package/dist/src/utils/compatibility.test.d.ts +6 -0
- package/dist/src/utils/compatibility.test.js +233 -0
- package/dist/src/utils/compatibility.test.js.map +1 -0
- package/dist/src/utils/envExpansion.d.ts +18 -0
- package/dist/src/utils/envExpansion.js +46 -0
- package/dist/src/utils/envExpansion.js.map +1 -0
- package/dist/src/utils/envExpansion.test.d.ts +6 -0
- package/dist/src/utils/envExpansion.test.js +110 -0
- package/dist/src/utils/envExpansion.test.js.map +1 -0
- package/dist/src/utils/errors_timeout.test.d.ts +6 -0
- package/dist/src/utils/errors_timeout.test.js +40 -0
- package/dist/src/utils/errors_timeout.test.js.map +1 -0
- package/dist/src/utils/fetch.test.d.ts +6 -0
- package/dist/src/utils/fetch.test.js +206 -0
- package/dist/src/utils/fetch.test.js.map +1 -0
- package/dist/src/utils/markdownUtils.d.ts +22 -0
- package/dist/src/utils/markdownUtils.js +126 -0
- package/dist/src/utils/markdownUtils.js.map +1 -0
- package/dist/src/utils/markdownUtils.test.d.ts +6 -0
- package/dist/src/utils/markdownUtils.test.js +107 -0
- package/dist/src/utils/markdownUtils.test.js.map +1 -0
- package/dist/src/utils/oauth-flow.d.ts +105 -0
- package/dist/src/utils/oauth-flow.js +370 -0
- package/dist/src/utils/oauth-flow.js.map +1 -0
- package/dist/src/utils/oauth-flow.test.d.ts +6 -0
- package/dist/src/utils/oauth-flow.test.js +360 -0
- package/dist/src/utils/oauth-flow.test.js.map +1 -0
- package/dist/src/utils/sessionUtils.d.ts +14 -0
- package/dist/src/utils/sessionUtils.js +122 -0
- package/dist/src/utils/sessionUtils.js.map +1 -0
- package/dist/src/utils/sessionUtils.test.d.ts +1 -0
- package/dist/src/utils/sessionUtils.test.js +171 -0
- package/dist/src/utils/sessionUtils.test.js.map +1 -0
- package/dist/src/voice/responseFormatter.d.ts +38 -0
- package/dist/src/voice/responseFormatter.js +130 -0
- package/dist/src/voice/responseFormatter.js.map +1 -0
- package/dist/src/voice/responseFormatter.test.d.ts +6 -0
- package/dist/src/voice/responseFormatter.test.js +214 -0
- package/dist/src/voice/responseFormatter.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/docs/CONTRIBUTING.md +0 -555
- package/dist/src/agents/executor.d.ts +0 -114
- package/dist/src/agents/executor.js +0 -779
- package/dist/src/agents/executor.js.map +0 -1
- package/dist/src/agents/executor.test.js +0 -1362
- package/dist/src/agents/executor.test.js.map +0 -1
- package/dist/src/agents/invocation.d.ts +0 -46
- package/dist/src/agents/invocation.js +0 -102
- package/dist/src/agents/invocation.js.map +0 -1
- package/dist/src/agents/invocation.test.js +0 -215
- package/dist/src/agents/invocation.test.js.map +0 -1
- package/dist/src/core/subagent.d.ts +0 -236
- package/dist/src/core/subagent.js +0 -482
- package/dist/src/core/subagent.js.map +0 -1
- package/dist/src/core/subagent.test.js +0 -530
- package/dist/src/core/subagent.test.js.map +0 -1
- package/dist/src/tools/smart-edit.d.ts +0 -78
- package/dist/src/tools/smart-edit.js +0 -717
- package/dist/src/tools/smart-edit.js.map +0 -1
- package/dist/src/tools/smart-edit.test.js +0 -592
- package/dist/src/tools/smart-edit.test.js.map +0 -1
- /package/dist/src/{agents/executor.test.d.ts → policy/workspace-policy.test.d.ts} +0 -0
- /package/dist/src/{agents/invocation.test.d.ts → safety/conseca/conseca.test.d.ts} +0 -0
- /package/dist/src/{core/subagent.test.d.ts → safety/conseca/integration.test.d.ts} +0 -0
- /package/dist/src/{tools/smart-edit.test.d.ts → safety/conseca/policy-enforcer.test.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors_timeout.test.js","sourceRoot":"","sources":["../../../src/utils/errors_timeout.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAkB,MAAM,iBAAiB,CAAC;AAEjD,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,uEAAuE;QACvE,0BAA0B;QAC1B,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,qBAAqB;YAC3B,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,uBAAuB;SACjC,CAAC;QAEF,gFAAgF;QAChF,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;QAC9C,oCAAoC;QACpC,wEAAwE;QACxE,+CAA+C;QAC/C,oDAAoD;QAEpD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAChD,KAAmB,CAAC,IAAI,GAAG,qBAAqB,CAAC;QACjD,KAAmB,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,2BAA2B;QAC7D,KAAuC,CAAC,IAAI,GAAG,yBAAyB,CAAC;QAE1E,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterAll } from 'vitest';
|
|
7
|
+
import { isPrivateIp, isPrivateIpAsync, isAddressPrivate, safeLookup, safeFetch, fetchWithTimeout, PrivateIpError, } from './fetch.js';
|
|
8
|
+
import * as dnsPromises from 'node:dns/promises';
|
|
9
|
+
import * as dns from 'node:dns';
|
|
10
|
+
vi.mock('node:dns/promises', () => ({
|
|
11
|
+
lookup: vi.fn(),
|
|
12
|
+
}));
|
|
13
|
+
// We need to mock node:dns for safeLookup since it uses the callback API
|
|
14
|
+
vi.mock('node:dns', () => ({
|
|
15
|
+
lookup: vi.fn(),
|
|
16
|
+
}));
|
|
17
|
+
// Mock global fetch
|
|
18
|
+
const originalFetch = global.fetch;
|
|
19
|
+
global.fetch = vi.fn();
|
|
20
|
+
describe('fetch utils', () => {
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
vi.clearAllMocks();
|
|
23
|
+
});
|
|
24
|
+
afterAll(() => {
|
|
25
|
+
global.fetch = originalFetch;
|
|
26
|
+
});
|
|
27
|
+
describe('isAddressPrivate', () => {
|
|
28
|
+
it('should identify private IPv4 addresses', () => {
|
|
29
|
+
expect(isAddressPrivate('10.0.0.1')).toBe(true);
|
|
30
|
+
expect(isAddressPrivate('127.0.0.1')).toBe(true);
|
|
31
|
+
expect(isAddressPrivate('172.16.0.1')).toBe(true);
|
|
32
|
+
expect(isAddressPrivate('192.168.1.1')).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
it('should identify non-routable and reserved IPv4 addresses (RFC 6890)', () => {
|
|
35
|
+
expect(isAddressPrivate('0.0.0.0')).toBe(true);
|
|
36
|
+
expect(isAddressPrivate('100.64.0.1')).toBe(true);
|
|
37
|
+
expect(isAddressPrivate('192.0.0.1')).toBe(true);
|
|
38
|
+
expect(isAddressPrivate('192.0.2.1')).toBe(true);
|
|
39
|
+
expect(isAddressPrivate('192.88.99.1')).toBe(true);
|
|
40
|
+
// Benchmark range (198.18.0.0/15)
|
|
41
|
+
expect(isAddressPrivate('198.18.0.0')).toBe(true);
|
|
42
|
+
expect(isAddressPrivate('198.18.0.1')).toBe(true);
|
|
43
|
+
expect(isAddressPrivate('198.19.255.255')).toBe(true);
|
|
44
|
+
expect(isAddressPrivate('198.51.100.1')).toBe(true);
|
|
45
|
+
expect(isAddressPrivate('203.0.113.1')).toBe(true);
|
|
46
|
+
expect(isAddressPrivate('224.0.0.1')).toBe(true);
|
|
47
|
+
expect(isAddressPrivate('240.0.0.1')).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
it('should identify private IPv6 addresses', () => {
|
|
50
|
+
expect(isAddressPrivate('::1')).toBe(true);
|
|
51
|
+
expect(isAddressPrivate('fc00::')).toBe(true);
|
|
52
|
+
expect(isAddressPrivate('fd00::')).toBe(true);
|
|
53
|
+
expect(isAddressPrivate('fe80::')).toBe(true);
|
|
54
|
+
expect(isAddressPrivate('febf::')).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
it('should identify special local addresses', () => {
|
|
57
|
+
expect(isAddressPrivate('0.0.0.0')).toBe(true);
|
|
58
|
+
expect(isAddressPrivate('::')).toBe(true);
|
|
59
|
+
expect(isAddressPrivate('localhost')).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
it('should identify link-local addresses', () => {
|
|
62
|
+
expect(isAddressPrivate('169.254.169.254')).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
it('should identify IPv4-mapped IPv6 private addresses', () => {
|
|
65
|
+
expect(isAddressPrivate('::ffff:127.0.0.1')).toBe(true);
|
|
66
|
+
expect(isAddressPrivate('::ffff:10.0.0.1')).toBe(true);
|
|
67
|
+
expect(isAddressPrivate('::ffff:169.254.169.254')).toBe(true);
|
|
68
|
+
expect(isAddressPrivate('::ffff:192.168.1.1')).toBe(true);
|
|
69
|
+
expect(isAddressPrivate('::ffff:172.16.0.1')).toBe(true);
|
|
70
|
+
expect(isAddressPrivate('::ffff:0.0.0.0')).toBe(true);
|
|
71
|
+
expect(isAddressPrivate('::ffff:100.64.0.1')).toBe(true);
|
|
72
|
+
expect(isAddressPrivate('::ffff:a9fe:101')).toBe(true); // 169.254.1.1
|
|
73
|
+
});
|
|
74
|
+
it('should identify public addresses as non-private', () => {
|
|
75
|
+
expect(isAddressPrivate('8.8.8.8')).toBe(false);
|
|
76
|
+
expect(isAddressPrivate('93.184.216.34')).toBe(false);
|
|
77
|
+
expect(isAddressPrivate('2001:4860:4860::8888')).toBe(false);
|
|
78
|
+
expect(isAddressPrivate('::ffff:8.8.8.8')).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('isPrivateIp', () => {
|
|
82
|
+
it('should identify private IPs in URLs', () => {
|
|
83
|
+
expect(isPrivateIp('http://10.0.0.1/')).toBe(true);
|
|
84
|
+
expect(isPrivateIp('https://127.0.0.1:8080/')).toBe(true);
|
|
85
|
+
expect(isPrivateIp('http://localhost/')).toBe(true);
|
|
86
|
+
expect(isPrivateIp('http://[::1]/')).toBe(true);
|
|
87
|
+
});
|
|
88
|
+
it('should identify public IPs in URLs as non-private', () => {
|
|
89
|
+
expect(isPrivateIp('http://8.8.8.8/')).toBe(false);
|
|
90
|
+
expect(isPrivateIp('https://google.com/')).toBe(false);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('isPrivateIpAsync', () => {
|
|
94
|
+
it('should identify private IPs directly', async () => {
|
|
95
|
+
expect(await isPrivateIpAsync('http://10.0.0.1/')).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
it('should identify domains resolving to private IPs', async () => {
|
|
98
|
+
vi.mocked(dnsPromises.lookup).mockImplementation(async () =>
|
|
99
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
100
|
+
[{ address: '10.0.0.1', family: 4 }]);
|
|
101
|
+
expect(await isPrivateIpAsync('http://malicious.com/')).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
it('should identify domains resolving to public IPs as non-private', async () => {
|
|
104
|
+
vi.mocked(dnsPromises.lookup).mockImplementation(async () =>
|
|
105
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
106
|
+
[{ address: '8.8.8.8', family: 4 }]);
|
|
107
|
+
expect(await isPrivateIpAsync('http://google.com/')).toBe(false);
|
|
108
|
+
});
|
|
109
|
+
it('should throw error if DNS resolution fails (fail closed)', async () => {
|
|
110
|
+
vi.mocked(dnsPromises.lookup).mockRejectedValue(new Error('DNS Error'));
|
|
111
|
+
await expect(isPrivateIpAsync('http://unreachable.com/')).rejects.toThrow('Failed to verify if URL resolves to private IP');
|
|
112
|
+
});
|
|
113
|
+
it('should return false for invalid URLs instead of throwing verification error', async () => {
|
|
114
|
+
expect(await isPrivateIpAsync('not-a-url')).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('safeLookup', () => {
|
|
118
|
+
it('should filter out private IPs', async () => {
|
|
119
|
+
const addresses = [
|
|
120
|
+
{ address: '8.8.8.8', family: 4 },
|
|
121
|
+
{ address: '10.0.0.1', family: 4 },
|
|
122
|
+
];
|
|
123
|
+
vi.mocked(dns.lookup).mockImplementation(((_h, _o, cb) => {
|
|
124
|
+
cb(null, addresses);
|
|
125
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
126
|
+
}));
|
|
127
|
+
const result = await new Promise((resolve, reject) => {
|
|
128
|
+
safeLookup('example.com', { all: true }, (err, filtered) => {
|
|
129
|
+
if (err)
|
|
130
|
+
reject(err);
|
|
131
|
+
else
|
|
132
|
+
resolve(filtered);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
expect(result).toHaveLength(1);
|
|
136
|
+
expect(result[0].address).toBe('8.8.8.8');
|
|
137
|
+
});
|
|
138
|
+
it('should allow explicit localhost', async () => {
|
|
139
|
+
const addresses = [{ address: '127.0.0.1', family: 4 }];
|
|
140
|
+
vi.mocked(dns.lookup).mockImplementation(((_h, _o, cb) => {
|
|
141
|
+
cb(null, addresses);
|
|
142
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
143
|
+
}));
|
|
144
|
+
const result = await new Promise((resolve, reject) => {
|
|
145
|
+
safeLookup('localhost', { all: true }, (err, filtered) => {
|
|
146
|
+
if (err)
|
|
147
|
+
reject(err);
|
|
148
|
+
else
|
|
149
|
+
resolve(filtered);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
expect(result).toHaveLength(1);
|
|
153
|
+
expect(result[0].address).toBe('127.0.0.1');
|
|
154
|
+
});
|
|
155
|
+
it('should error if all resolved IPs are private', async () => {
|
|
156
|
+
const addresses = [{ address: '10.0.0.1', family: 4 }];
|
|
157
|
+
vi.mocked(dns.lookup).mockImplementation(((_h, _o, cb) => {
|
|
158
|
+
cb(null, addresses);
|
|
159
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
160
|
+
}));
|
|
161
|
+
await expect(new Promise((resolve, reject) => {
|
|
162
|
+
safeLookup('malicious.com', { all: true }, (err, filtered) => {
|
|
163
|
+
if (err)
|
|
164
|
+
reject(err);
|
|
165
|
+
else
|
|
166
|
+
resolve(filtered);
|
|
167
|
+
});
|
|
168
|
+
})).rejects.toThrow(PrivateIpError);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe('safeFetch', () => {
|
|
172
|
+
it('should forward to fetch with dispatcher', async () => {
|
|
173
|
+
vi.mocked(global.fetch).mockResolvedValue(new Response('ok'));
|
|
174
|
+
const response = await safeFetch('https://example.com');
|
|
175
|
+
expect(response.status).toBe(200);
|
|
176
|
+
expect(global.fetch).toHaveBeenCalledWith('https://example.com', expect.objectContaining({
|
|
177
|
+
dispatcher: expect.any(Object),
|
|
178
|
+
}));
|
|
179
|
+
});
|
|
180
|
+
it('should handle Refusing to connect errors', async () => {
|
|
181
|
+
vi.mocked(global.fetch).mockRejectedValue(new PrivateIpError());
|
|
182
|
+
await expect(safeFetch('http://10.0.0.1')).rejects.toThrow('Access to private network is blocked');
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('fetchWithTimeout', () => {
|
|
186
|
+
it('should handle timeouts', async () => {
|
|
187
|
+
vi.mocked(global.fetch).mockImplementation((_input, init) => new Promise((_resolve, reject) => {
|
|
188
|
+
if (init?.signal) {
|
|
189
|
+
init.signal.addEventListener('abort', () => {
|
|
190
|
+
const error = new Error('The operation was aborted');
|
|
191
|
+
error.name = 'AbortError';
|
|
192
|
+
// @ts-expect-error - for mocking purposes
|
|
193
|
+
error.code = 'ABORT_ERR';
|
|
194
|
+
reject(error);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}));
|
|
198
|
+
await expect(fetchWithTimeout('http://example.com', 50)).rejects.toThrow('Request timed out after 50ms');
|
|
199
|
+
});
|
|
200
|
+
it('should handle private IP errors via handleFetchError', async () => {
|
|
201
|
+
vi.mocked(global.fetch).mockRejectedValue(new PrivateIpError());
|
|
202
|
+
await expect(fetchWithTimeout('http://10.0.0.1', 1000)).rejects.toThrow('Access to private network is blocked: http://10.0.0.1');
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
//# sourceMappingURL=fetch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.test.js","sourceRoot":"","sources":["../../../src/utils/fetch.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;CAChB,CAAC,CAAC,CAAC;AAEJ,yEAAyE;AACzE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;CAChB,CAAC,CAAC,CAAC;AAEJ,oBAAoB;AACpB,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;AACnC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAEvB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,kCAAkC;YAClC,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtD,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7D,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,CAAC,MAAM,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAC9C,KAAK,IAAI,EAAE;YACT,8DAA8D;YAC9D,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,CAAQ,CAC9C,CAAC;YACF,MAAM,CAAC,MAAM,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAC9C,KAAK,IAAI,EAAE;YACT,8DAA8D;YAC9D,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAQ,CAC7C,CAAC;YACF,MAAM,CAAC,MAAM,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;YACxE,MAAM,MAAM,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACvE,gDAAgD,CACjD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;YAC3F,MAAM,CAAC,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,SAAS,GAAG;gBAChB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE;gBACjC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE;aACnC,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,CACxC,EAAU,EACV,EAAqB,EACrB,EAGS,EACT,EAAE;gBACF,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACpB,8DAA8D;YAChE,CAAC,CAAQ,CAAC,CAAC;YAEX,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAE9B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACpB,UAAU,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;oBACzD,IAAI,GAAG;wBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;wBAChB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,SAAS,GAAG,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAExD,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,CACxC,EAAU,EACV,EAAqB,EACrB,EAGS,EACT,EAAE;gBACF,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACpB,8DAA8D;YAChE,CAAC,CAAQ,CAAC,CAAC;YAEX,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAE9B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACpB,UAAU,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;oBACvD,IAAI,GAAG;wBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;wBAChB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,SAAS,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAEvD,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,CACxC,EAAU,EACV,EAAqB,EACrB,EAGS,EACT,EAAE;gBACF,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACpB,8DAA8D;YAChE,CAAC,CAAQ,CAAC,CAAC;YAEX,MAAM,MAAM,CACV,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC9B,UAAU,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;oBAC3D,IAAI,GAAG;wBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;wBAChB,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAE9D,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC,CAAC;YACxD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CACvC,qBAAqB,EACrB,MAAM,CAAC,gBAAgB,CAAC;gBACtB,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;aAC/B,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;YAEhE,MAAM,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACxD,sCAAsC,CACvC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACtC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,kBAAkB,CACxC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACf,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;gBAC/B,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;oBACjB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;wBACzC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;wBACrD,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;wBAC1B,0CAA0C;wBAC1C,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC;wBACzB,MAAM,CAAC,KAAK,CAAC,CAAC;oBAChB,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CACL,CAAC;YAEF,MAAM,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACtE,8BAA8B,CAC/B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC;YAEhE,MAAM,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACrE,uDAAuD,CACxD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Converts a JSON-compatible value into a readable Markdown representation.
|
|
8
|
+
*
|
|
9
|
+
* @param data The data to convert.
|
|
10
|
+
* @param indent The current indentation level (for internal recursion).
|
|
11
|
+
* @returns A Markdown string representing the data.
|
|
12
|
+
*/
|
|
13
|
+
export declare function jsonToMarkdown(data: unknown, indent?: number): string;
|
|
14
|
+
/**
|
|
15
|
+
* Safely attempts to parse a string as JSON and convert it to Markdown.
|
|
16
|
+
* If parsing fails, returns the original string.
|
|
17
|
+
*
|
|
18
|
+
* @param text The text to potentially convert.
|
|
19
|
+
* @returns The Markdown representation or the original text.
|
|
20
|
+
*/
|
|
21
|
+
export declare function safeJsonToMarkdown(text: string): string;
|
|
22
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Converts a camelCase string to a Space Case string.
|
|
8
|
+
* e.g., "camelCaseString" -> "Camel Case String"
|
|
9
|
+
*/
|
|
10
|
+
function camelToSpace(text) {
|
|
11
|
+
const result = text.replace(/([A-Z])/g, ' $1');
|
|
12
|
+
return result.charAt(0).toUpperCase() + result.slice(1).trim();
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Converts a JSON-compatible value into a readable Markdown representation.
|
|
16
|
+
*
|
|
17
|
+
* @param data The data to convert.
|
|
18
|
+
* @param indent The current indentation level (for internal recursion).
|
|
19
|
+
* @returns A Markdown string representing the data.
|
|
20
|
+
*/
|
|
21
|
+
export function jsonToMarkdown(data, indent = 0) {
|
|
22
|
+
const spacing = ' '.repeat(indent);
|
|
23
|
+
if (data === null) {
|
|
24
|
+
return 'null';
|
|
25
|
+
}
|
|
26
|
+
if (data === undefined) {
|
|
27
|
+
return 'undefined';
|
|
28
|
+
}
|
|
29
|
+
if (Array.isArray(data)) {
|
|
30
|
+
if (data.length === 0) {
|
|
31
|
+
return '[]';
|
|
32
|
+
}
|
|
33
|
+
if (isArrayOfSimilarObjects(data)) {
|
|
34
|
+
return renderTable(data, indent);
|
|
35
|
+
}
|
|
36
|
+
return data
|
|
37
|
+
.map((item) => {
|
|
38
|
+
if (typeof item === 'object' &&
|
|
39
|
+
item !== null &&
|
|
40
|
+
Object.keys(item).length > 0) {
|
|
41
|
+
const rendered = jsonToMarkdown(item, indent + 1);
|
|
42
|
+
return `${spacing}-\n${rendered}`;
|
|
43
|
+
}
|
|
44
|
+
const rendered = jsonToMarkdown(item, indent + 1).trimStart();
|
|
45
|
+
return `${spacing}- ${rendered}`;
|
|
46
|
+
})
|
|
47
|
+
.join('\n');
|
|
48
|
+
}
|
|
49
|
+
if (typeof data === 'object') {
|
|
50
|
+
const entries = Object.entries(data);
|
|
51
|
+
if (entries.length === 0) {
|
|
52
|
+
return '{}';
|
|
53
|
+
}
|
|
54
|
+
return entries
|
|
55
|
+
.map(([key, value]) => {
|
|
56
|
+
const displayKey = camelToSpace(key);
|
|
57
|
+
if (typeof value === 'object' &&
|
|
58
|
+
value !== null &&
|
|
59
|
+
Object.keys(value).length > 0) {
|
|
60
|
+
const renderedValue = jsonToMarkdown(value, indent + 1);
|
|
61
|
+
return `${spacing}- **${displayKey}**:\n${renderedValue}`;
|
|
62
|
+
}
|
|
63
|
+
const renderedValue = jsonToMarkdown(value, indent + 1).trimStart();
|
|
64
|
+
return `${spacing}- **${displayKey}**: ${renderedValue}`;
|
|
65
|
+
})
|
|
66
|
+
.join('\n');
|
|
67
|
+
}
|
|
68
|
+
if (typeof data === 'string') {
|
|
69
|
+
return data
|
|
70
|
+
.split('\n')
|
|
71
|
+
.map((line, i) => (i === 0 ? line : spacing + line))
|
|
72
|
+
.join('\n');
|
|
73
|
+
}
|
|
74
|
+
return String(data);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Safely attempts to parse a string as JSON and convert it to Markdown.
|
|
78
|
+
* If parsing fails, returns the original string.
|
|
79
|
+
*
|
|
80
|
+
* @param text The text to potentially convert.
|
|
81
|
+
* @returns The Markdown representation or the original text.
|
|
82
|
+
*/
|
|
83
|
+
export function safeJsonToMarkdown(text) {
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(text);
|
|
86
|
+
return jsonToMarkdown(parsed);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return text;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function isRecord(value) {
|
|
93
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
94
|
+
}
|
|
95
|
+
function isArrayOfSimilarObjects(data) {
|
|
96
|
+
if (data.length === 0) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (!data.every(isRecord))
|
|
100
|
+
return false;
|
|
101
|
+
const firstKeys = Object.keys(data[0]).sort().join(',');
|
|
102
|
+
return data.every((item) => Object.keys(item).sort().join(',') === firstKeys);
|
|
103
|
+
}
|
|
104
|
+
function renderTable(data, indent = 0) {
|
|
105
|
+
const spacing = ' '.repeat(indent);
|
|
106
|
+
const keys = Object.keys(data[0]);
|
|
107
|
+
const displayKeys = keys.map(camelToSpace);
|
|
108
|
+
const header = `${spacing}| ${displayKeys.join(' | ')} |`;
|
|
109
|
+
const separator = `${spacing}| ${keys.map(() => '---').join(' | ')} |`;
|
|
110
|
+
const rows = data.map((item) => `${spacing}| ${keys
|
|
111
|
+
.map((key) => {
|
|
112
|
+
const val = item[key];
|
|
113
|
+
if (typeof val === 'object' && val !== null) {
|
|
114
|
+
return JSON.stringify(val)
|
|
115
|
+
.replace(/\\/g, '\\\\')
|
|
116
|
+
.replace(/\|/g, '\\|');
|
|
117
|
+
}
|
|
118
|
+
return String(val)
|
|
119
|
+
.replace(/\\/g, '\\\\')
|
|
120
|
+
.replace(/\|/g, '\\|')
|
|
121
|
+
.replace(/\n/g, ' ');
|
|
122
|
+
})
|
|
123
|
+
.join(' | ')} |`);
|
|
124
|
+
return [header, separator, ...rows].join('\n');
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=markdownUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownUtils.js","sourceRoot":"","sources":["../../../src/utils/markdownUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, expect, it } from 'vitest';
|
|
7
|
+
import { jsonToMarkdown, safeJsonToMarkdown } from './markdownUtils.js';
|
|
8
|
+
describe('markdownUtils', () => {
|
|
9
|
+
describe('jsonToMarkdown', () => {
|
|
10
|
+
it('should handle primitives', () => {
|
|
11
|
+
expect(jsonToMarkdown('hello')).toBe('hello');
|
|
12
|
+
expect(jsonToMarkdown(123)).toBe('123');
|
|
13
|
+
expect(jsonToMarkdown(true)).toBe('true');
|
|
14
|
+
expect(jsonToMarkdown(null)).toBe('null');
|
|
15
|
+
expect(jsonToMarkdown(undefined)).toBe('undefined');
|
|
16
|
+
});
|
|
17
|
+
it('should handle simple arrays', () => {
|
|
18
|
+
const data = ['a', 'b', 'c'];
|
|
19
|
+
expect(jsonToMarkdown(data)).toBe('- a\n- b\n- c');
|
|
20
|
+
});
|
|
21
|
+
it('should handle simple objects and convert camelCase to Space Case', () => {
|
|
22
|
+
const data = { userName: 'Alice', userAge: 30 };
|
|
23
|
+
expect(jsonToMarkdown(data)).toBe('- **User Name**: Alice\n- **User Age**: 30');
|
|
24
|
+
});
|
|
25
|
+
it('should handle empty structures', () => {
|
|
26
|
+
expect(jsonToMarkdown([])).toBe('[]');
|
|
27
|
+
expect(jsonToMarkdown({})).toBe('{}');
|
|
28
|
+
});
|
|
29
|
+
it('should handle nested structures with proper indentation', () => {
|
|
30
|
+
const data = {
|
|
31
|
+
userInfo: {
|
|
32
|
+
fullName: 'Bob Smith',
|
|
33
|
+
userRoles: ['admin', 'user'],
|
|
34
|
+
},
|
|
35
|
+
isActive: true,
|
|
36
|
+
};
|
|
37
|
+
const result = jsonToMarkdown(data);
|
|
38
|
+
expect(result).toBe('- **User Info**:\n' +
|
|
39
|
+
' - **Full Name**: Bob Smith\n' +
|
|
40
|
+
' - **User Roles**:\n' +
|
|
41
|
+
' - admin\n' +
|
|
42
|
+
' - user\n' +
|
|
43
|
+
'- **Is Active**: true');
|
|
44
|
+
});
|
|
45
|
+
it('should render tables for arrays of similar objects with Space Case keys', () => {
|
|
46
|
+
const data = [
|
|
47
|
+
{ userId: 1, userName: 'Item 1' },
|
|
48
|
+
{ userId: 2, userName: 'Item 2' },
|
|
49
|
+
];
|
|
50
|
+
const result = jsonToMarkdown(data);
|
|
51
|
+
expect(result).toBe('| User Id | User Name |\n| --- | --- |\n| 1 | Item 1 |\n| 2 | Item 2 |');
|
|
52
|
+
});
|
|
53
|
+
it('should handle pipe characters, backslashes, and newlines in table data', () => {
|
|
54
|
+
const data = [
|
|
55
|
+
{ colInfo: 'val|ue', otherInfo: 'line\nbreak', pathInfo: 'C:\\test' },
|
|
56
|
+
];
|
|
57
|
+
const result = jsonToMarkdown(data);
|
|
58
|
+
expect(result).toBe('| Col Info | Other Info | Path Info |\n| --- | --- | --- |\n| val\\|ue | line break | C:\\\\test |');
|
|
59
|
+
});
|
|
60
|
+
it('should fallback to lists for arrays with mixed objects', () => {
|
|
61
|
+
const data = [
|
|
62
|
+
{ userId: 1, userName: 'Item 1' },
|
|
63
|
+
{ userId: 2, somethingElse: 'Item 2' },
|
|
64
|
+
];
|
|
65
|
+
const result = jsonToMarkdown(data);
|
|
66
|
+
expect(result).toContain('- **User Id**: 1');
|
|
67
|
+
expect(result).toContain('- **Something Else**: Item 2');
|
|
68
|
+
});
|
|
69
|
+
it('should properly indent nested tables', () => {
|
|
70
|
+
const data = {
|
|
71
|
+
items: [
|
|
72
|
+
{ id: 1, name: 'A' },
|
|
73
|
+
{ id: 2, name: 'B' },
|
|
74
|
+
],
|
|
75
|
+
};
|
|
76
|
+
const result = jsonToMarkdown(data);
|
|
77
|
+
const lines = result.split('\n');
|
|
78
|
+
expect(lines[0]).toBe('- **Items**:');
|
|
79
|
+
expect(lines[1]).toBe(' | Id | Name |');
|
|
80
|
+
expect(lines[2]).toBe(' | --- | --- |');
|
|
81
|
+
expect(lines[3]).toBe(' | 1 | A |');
|
|
82
|
+
expect(lines[4]).toBe(' | 2 | B |');
|
|
83
|
+
});
|
|
84
|
+
it('should indent subsequent lines of multiline strings', () => {
|
|
85
|
+
const data = {
|
|
86
|
+
description: 'Line 1\nLine 2\nLine 3',
|
|
87
|
+
};
|
|
88
|
+
const result = jsonToMarkdown(data);
|
|
89
|
+
expect(result).toBe('- **Description**: Line 1\n Line 2\n Line 3');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe('safeJsonToMarkdown', () => {
|
|
93
|
+
it('should convert valid JSON', () => {
|
|
94
|
+
const json = JSON.stringify({ keyName: 'value' });
|
|
95
|
+
expect(safeJsonToMarkdown(json)).toBe('- **Key Name**: value');
|
|
96
|
+
});
|
|
97
|
+
it('should return original string for invalid JSON', () => {
|
|
98
|
+
const notJson = 'Not a JSON string';
|
|
99
|
+
expect(safeJsonToMarkdown(notJson)).toBe(notJson);
|
|
100
|
+
});
|
|
101
|
+
it('should handle plain strings that look like numbers or booleans but are valid JSON', () => {
|
|
102
|
+
expect(safeJsonToMarkdown('123')).toBe('123');
|
|
103
|
+
expect(safeJsonToMarkdown('true')).toBe('true');
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=markdownUtils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdownUtils.test.js","sourceRoot":"","sources":["../../../src/utils/markdownUtils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Configuration for an OAuth 2.0 Authorization Code flow.
|
|
8
|
+
* Contains only the fields needed by the shared flow utilities.
|
|
9
|
+
*/
|
|
10
|
+
export interface OAuthFlowConfig {
|
|
11
|
+
clientId: string;
|
|
12
|
+
clientSecret?: string;
|
|
13
|
+
authorizationUrl: string;
|
|
14
|
+
tokenUrl: string;
|
|
15
|
+
scopes?: string[];
|
|
16
|
+
audiences?: string[];
|
|
17
|
+
redirectUri?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Configuration subset needed for token refresh operations.
|
|
21
|
+
*/
|
|
22
|
+
export type OAuthRefreshConfig = Pick<OAuthFlowConfig, 'clientId' | 'clientSecret' | 'scopes' | 'audiences'>;
|
|
23
|
+
/**
|
|
24
|
+
* PKCE (Proof Key for Code Exchange) parameters.
|
|
25
|
+
*/
|
|
26
|
+
export interface PKCEParams {
|
|
27
|
+
codeVerifier: string;
|
|
28
|
+
codeChallenge: string;
|
|
29
|
+
state: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* OAuth authorization response from the callback server.
|
|
33
|
+
*/
|
|
34
|
+
export interface OAuthAuthorizationResponse {
|
|
35
|
+
code: string;
|
|
36
|
+
state: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* OAuth token response from the authorization server.
|
|
40
|
+
*/
|
|
41
|
+
export interface OAuthTokenResponse {
|
|
42
|
+
access_token: string;
|
|
43
|
+
token_type: string;
|
|
44
|
+
expires_in?: number;
|
|
45
|
+
refresh_token?: string;
|
|
46
|
+
scope?: string;
|
|
47
|
+
}
|
|
48
|
+
/** The path the local callback server listens on. */
|
|
49
|
+
export declare const REDIRECT_PATH = "/oauth/callback";
|
|
50
|
+
/**
|
|
51
|
+
* Generate PKCE parameters for OAuth flow.
|
|
52
|
+
*
|
|
53
|
+
* @returns PKCE parameters including code verifier, challenge, and state
|
|
54
|
+
*/
|
|
55
|
+
export declare function generatePKCEParams(): PKCEParams;
|
|
56
|
+
/**
|
|
57
|
+
* Start a local HTTP server to handle OAuth callback.
|
|
58
|
+
* The server will listen on the specified port (or port 0 for OS assignment).
|
|
59
|
+
*
|
|
60
|
+
* @param expectedState The state parameter to validate
|
|
61
|
+
* @param port Optional preferred port to listen on
|
|
62
|
+
* @returns Object containing the port (available immediately) and a promise for the auth response
|
|
63
|
+
*/
|
|
64
|
+
export declare function startCallbackServer(expectedState: string, port?: number): {
|
|
65
|
+
port: Promise<number>;
|
|
66
|
+
response: Promise<OAuthAuthorizationResponse>;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Extract the port number from a URL string if available and valid.
|
|
70
|
+
*
|
|
71
|
+
* @param urlString The URL string to parse
|
|
72
|
+
* @returns The port number or undefined if not found or invalid
|
|
73
|
+
*/
|
|
74
|
+
export declare function getPortFromUrl(urlString?: string): number | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* Build the authorization URL for the OAuth flow.
|
|
77
|
+
*
|
|
78
|
+
* @param config OAuth flow configuration
|
|
79
|
+
* @param pkceParams PKCE parameters
|
|
80
|
+
* @param redirectPort The port to use for the redirect URI
|
|
81
|
+
* @param resource Optional resource parameter value (RFC 8707)
|
|
82
|
+
* @returns The authorization URL
|
|
83
|
+
*/
|
|
84
|
+
export declare function buildAuthorizationUrl(config: OAuthFlowConfig, pkceParams: PKCEParams, redirectPort: number, resource?: string): string;
|
|
85
|
+
/**
|
|
86
|
+
* Exchange an authorization code for tokens.
|
|
87
|
+
*
|
|
88
|
+
* @param config OAuth flow configuration
|
|
89
|
+
* @param code Authorization code
|
|
90
|
+
* @param codeVerifier PKCE code verifier
|
|
91
|
+
* @param redirectPort The port to use for the redirect URI
|
|
92
|
+
* @param resource Optional resource parameter value (RFC 8707)
|
|
93
|
+
* @returns The token response
|
|
94
|
+
*/
|
|
95
|
+
export declare function exchangeCodeForToken(config: OAuthFlowConfig, code: string, codeVerifier: string, redirectPort: number, resource?: string): Promise<OAuthTokenResponse>;
|
|
96
|
+
/**
|
|
97
|
+
* Refresh an access token using a refresh token.
|
|
98
|
+
*
|
|
99
|
+
* @param config OAuth configuration subset needed for refresh
|
|
100
|
+
* @param refreshToken The refresh token
|
|
101
|
+
* @param tokenUrl The token endpoint URL
|
|
102
|
+
* @param resource Optional resource parameter value (RFC 8707)
|
|
103
|
+
* @returns The new token response
|
|
104
|
+
*/
|
|
105
|
+
export declare function refreshAccessToken(config: OAuthRefreshConfig, refreshToken: string, tokenUrl: string, resource?: string): Promise<OAuthTokenResponse>;
|