codegraph-java 0.1.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/README.md +131 -0
- package/dist/base-graph/index.d.ts +57 -0
- package/dist/base-graph/index.d.ts.map +1 -0
- package/dist/base-graph/index.js +175 -0
- package/dist/base-graph/index.js.map +1 -0
- package/dist/bin/codegraph.d.ts +28 -0
- package/dist/bin/codegraph.d.ts.map +1 -0
- package/dist/bin/codegraph.js +2615 -0
- package/dist/bin/codegraph.js.map +1 -0
- package/dist/bin/command-supervision.d.ts +49 -0
- package/dist/bin/command-supervision.d.ts.map +1 -0
- package/dist/bin/command-supervision.js +95 -0
- package/dist/bin/command-supervision.js.map +1 -0
- package/dist/bin/fatal-handler.d.ts +20 -0
- package/dist/bin/fatal-handler.d.ts.map +1 -0
- package/dist/bin/fatal-handler.js +118 -0
- package/dist/bin/fatal-handler.js.map +1 -0
- package/dist/bin/node-version-check.d.ts +45 -0
- package/dist/bin/node-version-check.d.ts.map +1 -0
- package/dist/bin/node-version-check.js +98 -0
- package/dist/bin/node-version-check.js.map +1 -0
- package/dist/bin/uninstall.d.ts +14 -0
- package/dist/bin/uninstall.d.ts.map +1 -0
- package/dist/bin/uninstall.js +36 -0
- package/dist/bin/uninstall.js.map +1 -0
- package/dist/context/formatter.d.ts +36 -0
- package/dist/context/formatter.d.ts.map +1 -0
- package/dist/context/formatter.js +269 -0
- package/dist/context/formatter.js.map +1 -0
- package/dist/context/index.d.ts +131 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +1378 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/markers.d.ts +19 -0
- package/dist/context/markers.d.ts.map +1 -0
- package/dist/context/markers.js +22 -0
- package/dist/context/markers.js.map +1 -0
- package/dist/db/index.d.ts +380 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +854 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations.d.ts +44 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +255 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/queries.d.ts +1060 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +3191 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.sql +209 -0
- package/dist/db/sqlite-adapter.d.ts +55 -0
- package/dist/db/sqlite-adapter.d.ts.map +1 -0
- package/dist/db/sqlite-adapter.js +135 -0
- package/dist/db/sqlite-adapter.js.map +1 -0
- package/dist/db/wal-valve.d.ts +119 -0
- package/dist/db/wal-valve.d.ts.map +1 -0
- package/dist/db/wal-valve.js +290 -0
- package/dist/db/wal-valve.js.map +1 -0
- package/dist/directory.d.ts +213 -0
- package/dist/directory.d.ts.map +1 -0
- package/dist/directory.js +781 -0
- package/dist/directory.js.map +1 -0
- package/dist/errors.d.ts +150 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +234 -0
- package/dist/errors.js.map +1 -0
- package/dist/extraction/extraction-version.d.ts +25 -0
- package/dist/extraction/extraction-version.d.ts.map +1 -0
- package/dist/extraction/extraction-version.js +28 -0
- package/dist/extraction/extraction-version.js.map +1 -0
- package/dist/extraction/function-ref.d.ts +118 -0
- package/dist/extraction/function-ref.d.ts.map +1 -0
- package/dist/extraction/function-ref.js +746 -0
- package/dist/extraction/function-ref.js.map +1 -0
- package/dist/extraction/generated-detection.d.ts +66 -0
- package/dist/extraction/generated-detection.d.ts.map +1 -0
- package/dist/extraction/generated-detection.js +248 -0
- package/dist/extraction/generated-detection.js.map +1 -0
- package/dist/extraction/grammars.d.ts +148 -0
- package/dist/extraction/grammars.d.ts.map +1 -0
- package/dist/extraction/grammars.js +558 -0
- package/dist/extraction/grammars.js.map +1 -0
- package/dist/extraction/index.d.ts +367 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +2833 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/kernel/decode.d.ts +9 -0
- package/dist/extraction/kernel/decode.d.ts.map +1 -0
- package/dist/extraction/kernel/decode.js +162 -0
- package/dist/extraction/kernel/decode.js.map +1 -0
- package/dist/extraction/kernel/index.d.ts +64 -0
- package/dist/extraction/kernel/index.d.ts.map +1 -0
- package/dist/extraction/kernel/index.js +204 -0
- package/dist/extraction/kernel/index.js.map +1 -0
- package/dist/extraction/kernel/layout.d.ts +101 -0
- package/dist/extraction/kernel/layout.d.ts.map +1 -0
- package/dist/extraction/kernel/layout.js +104 -0
- package/dist/extraction/kernel/layout.js.map +1 -0
- package/dist/extraction/kernel/loader.d.ts +103 -0
- package/dist/extraction/kernel/loader.d.ts.map +1 -0
- package/dist/extraction/kernel/loader.js +146 -0
- package/dist/extraction/kernel/loader.js.map +1 -0
- package/dist/extraction/languages/c-cpp.d.ts +124 -0
- package/dist/extraction/languages/c-cpp.d.ts.map +1 -0
- package/dist/extraction/languages/c-cpp.js +1689 -0
- package/dist/extraction/languages/c-cpp.js.map +1 -0
- package/dist/extraction/languages/index.d.ts +11 -0
- package/dist/extraction/languages/index.d.ts.map +1 -0
- package/dist/extraction/languages/index.js +15 -0
- package/dist/extraction/languages/index.js.map +1 -0
- package/dist/extraction/languages/java.d.ts +3 -0
- package/dist/extraction/languages/java.d.ts.map +1 -0
- package/dist/extraction/languages/java.js +315 -0
- package/dist/extraction/languages/java.js.map +1 -0
- package/dist/extraction/languages/rust.d.ts +23 -0
- package/dist/extraction/languages/rust.d.ts.map +1 -0
- package/dist/extraction/languages/rust.js +169 -0
- package/dist/extraction/languages/rust.js.map +1 -0
- package/dist/extraction/parse-pool.d.ts +167 -0
- package/dist/extraction/parse-pool.d.ts.map +1 -0
- package/dist/extraction/parse-pool.js +421 -0
- package/dist/extraction/parse-pool.js.map +1 -0
- package/dist/extraction/parse-worker.d.ts +8 -0
- package/dist/extraction/parse-worker.d.ts.map +1 -0
- package/dist/extraction/parse-worker.js +138 -0
- package/dist/extraction/parse-worker.js.map +1 -0
- package/dist/extraction/store-worker.d.ts +24 -0
- package/dist/extraction/store-worker.d.ts.map +1 -0
- package/dist/extraction/store-worker.js +139 -0
- package/dist/extraction/store-worker.js.map +1 -0
- package/dist/extraction/store-writer.d.ts +63 -0
- package/dist/extraction/store-writer.d.ts.map +1 -0
- package/dist/extraction/store-writer.js +174 -0
- package/dist/extraction/store-writer.js.map +1 -0
- package/dist/extraction/syntax-tokens.d.ts +103 -0
- package/dist/extraction/syntax-tokens.d.ts.map +1 -0
- package/dist/extraction/syntax-tokens.js +381 -0
- package/dist/extraction/syntax-tokens.js.map +1 -0
- package/dist/extraction/tree-sitter-helpers.d.ts +28 -0
- package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -0
- package/dist/extraction/tree-sitter-helpers.js +153 -0
- package/dist/extraction/tree-sitter-helpers.js.map +1 -0
- package/dist/extraction/tree-sitter-types.d.ts +260 -0
- package/dist/extraction/tree-sitter-types.d.ts.map +1 -0
- package/dist/extraction/tree-sitter-types.js +10 -0
- package/dist/extraction/tree-sitter-types.js.map +1 -0
- package/dist/extraction/tree-sitter.d.ts +745 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -0
- package/dist/extraction/tree-sitter.js +6725 -0
- package/dist/extraction/tree-sitter.js.map +1 -0
- package/dist/extraction/wasm/tree-sitter-java.wasm +0 -0
- package/dist/extraction/wasm-runtime-flags.d.ts +53 -0
- package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -0
- package/dist/extraction/wasm-runtime-flags.js +130 -0
- package/dist/extraction/wasm-runtime-flags.js.map +1 -0
- package/dist/graph/branch-guards.d.ts +248 -0
- package/dist/graph/branch-guards.d.ts.map +1 -0
- package/dist/graph/branch-guards.js +2231 -0
- package/dist/graph/branch-guards.js.map +1 -0
- package/dist/graph/dead-code.d.ts +251 -0
- package/dist/graph/dead-code.d.ts.map +1 -0
- package/dist/graph/dead-code.js +756 -0
- package/dist/graph/dead-code.js.map +1 -0
- package/dist/graph/dynamic-boundary-report.d.ts +121 -0
- package/dist/graph/dynamic-boundary-report.d.ts.map +1 -0
- package/dist/graph/dynamic-boundary-report.js +283 -0
- package/dist/graph/dynamic-boundary-report.js.map +1 -0
- package/dist/graph/index.d.ts +12 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +28 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/named-symbol-flow.d.ts +153 -0
- package/dist/graph/named-symbol-flow.d.ts.map +1 -0
- package/dist/graph/named-symbol-flow.js +609 -0
- package/dist/graph/named-symbol-flow.js.map +1 -0
- package/dist/graph/queries.d.ts +106 -0
- package/dist/graph/queries.d.ts.map +1 -0
- package/dist/graph/queries.js +341 -0
- package/dist/graph/queries.js.map +1 -0
- package/dist/graph/traversal.d.ts +127 -0
- package/dist/graph/traversal.d.ts.map +1 -0
- package/dist/graph/traversal.js +599 -0
- package/dist/graph/traversal.js.map +1 -0
- package/dist/graph/type-hierarchy.d.ts +155 -0
- package/dist/graph/type-hierarchy.d.ts.map +1 -0
- package/dist/graph/type-hierarchy.js +382 -0
- package/dist/graph/type-hierarchy.js.map +1 -0
- package/dist/index.d.ts +886 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2019 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/beta-signup.d.ts +54 -0
- package/dist/installer/beta-signup.d.ts.map +1 -0
- package/dist/installer/beta-signup.js +178 -0
- package/dist/installer/beta-signup.js.map +1 -0
- package/dist/installer/config-writer.d.ts +28 -0
- package/dist/installer/config-writer.d.ts.map +1 -0
- package/dist/installer/config-writer.js +91 -0
- package/dist/installer/config-writer.js.map +1 -0
- package/dist/installer/index.d.ts +143 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +632 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/instructions-template.d.ts +41 -0
- package/dist/installer/instructions-template.d.ts.map +1 -0
- package/dist/installer/instructions-template.js +53 -0
- package/dist/installer/instructions-template.js.map +1 -0
- package/dist/installer/targets/antigravity.d.ts +57 -0
- package/dist/installer/targets/antigravity.d.ts.map +1 -0
- package/dist/installer/targets/antigravity.js +308 -0
- package/dist/installer/targets/antigravity.js.map +1 -0
- package/dist/installer/targets/claude.d.ts +62 -0
- package/dist/installer/targets/claude.d.ts.map +1 -0
- package/dist/installer/targets/claude.js +486 -0
- package/dist/installer/targets/claude.js.map +1 -0
- package/dist/installer/targets/codex.d.ts +32 -0
- package/dist/installer/targets/codex.d.ts.map +1 -0
- package/dist/installer/targets/codex.js +202 -0
- package/dist/installer/targets/codex.js.map +1 -0
- package/dist/installer/targets/copilot-cli.d.ts +32 -0
- package/dist/installer/targets/copilot-cli.d.ts.map +1 -0
- package/dist/installer/targets/copilot-cli.js +209 -0
- package/dist/installer/targets/copilot-cli.js.map +1 -0
- package/dist/installer/targets/copilot-jetbrains.d.ts +42 -0
- package/dist/installer/targets/copilot-jetbrains.d.ts.map +1 -0
- package/dist/installer/targets/copilot-jetbrains.js +238 -0
- package/dist/installer/targets/copilot-jetbrains.js.map +1 -0
- package/dist/installer/targets/copilot-vscode.d.ts +47 -0
- package/dist/installer/targets/copilot-vscode.d.ts.map +1 -0
- package/dist/installer/targets/copilot-vscode.js +219 -0
- package/dist/installer/targets/copilot-vscode.js.map +1 -0
- package/dist/installer/targets/cursor.d.ts +35 -0
- package/dist/installer/targets/cursor.d.ts.map +1 -0
- package/dist/installer/targets/cursor.js +254 -0
- package/dist/installer/targets/cursor.js.map +1 -0
- package/dist/installer/targets/gemini.d.ts +26 -0
- package/dist/installer/targets/gemini.d.ts.map +1 -0
- package/dist/installer/targets/gemini.js +165 -0
- package/dist/installer/targets/gemini.js.map +1 -0
- package/dist/installer/targets/hermes.d.ts +18 -0
- package/dist/installer/targets/hermes.d.ts.map +1 -0
- package/dist/installer/targets/hermes.js +359 -0
- package/dist/installer/targets/hermes.js.map +1 -0
- package/dist/installer/targets/kiro.d.ts +27 -0
- package/dist/installer/targets/kiro.d.ts.map +1 -0
- package/dist/installer/targets/kiro.js +178 -0
- package/dist/installer/targets/kiro.js.map +1 -0
- package/dist/installer/targets/opencode.d.ts +38 -0
- package/dist/installer/targets/opencode.d.ts.map +1 -0
- package/dist/installer/targets/opencode.js +288 -0
- package/dist/installer/targets/opencode.js.map +1 -0
- package/dist/installer/targets/registry.d.ts +35 -0
- package/dist/installer/targets/registry.d.ts.map +1 -0
- package/dist/installer/targets/registry.js +101 -0
- package/dist/installer/targets/registry.js.map +1 -0
- package/dist/installer/targets/shared.d.ts +101 -0
- package/dist/installer/targets/shared.d.ts.map +1 -0
- package/dist/installer/targets/shared.js +264 -0
- package/dist/installer/targets/shared.js.map +1 -0
- package/dist/installer/targets/toml.d.ts +53 -0
- package/dist/installer/targets/toml.d.ts.map +1 -0
- package/dist/installer/targets/toml.js +226 -0
- package/dist/installer/targets/toml.js.map +1 -0
- package/dist/installer/targets/trae.d.ts +30 -0
- package/dist/installer/targets/trae.d.ts.map +1 -0
- package/dist/installer/targets/trae.js +164 -0
- package/dist/installer/targets/trae.js.map +1 -0
- package/dist/installer/targets/types.d.ts +108 -0
- package/dist/installer/targets/types.d.ts.map +1 -0
- package/dist/installer/targets/types.js +16 -0
- package/dist/installer/targets/types.js.map +1 -0
- package/dist/installer/targets/workbuddy.d.ts +29 -0
- package/dist/installer/targets/workbuddy.d.ts.map +1 -0
- package/dist/installer/targets/workbuddy.js +163 -0
- package/dist/installer/targets/workbuddy.js.map +1 -0
- package/dist/mcp/daemon-manager.d.ts +42 -0
- package/dist/mcp/daemon-manager.d.ts.map +1 -0
- package/dist/mcp/daemon-manager.js +129 -0
- package/dist/mcp/daemon-manager.js.map +1 -0
- package/dist/mcp/daemon-paths.d.ts +79 -0
- package/dist/mcp/daemon-paths.d.ts.map +1 -0
- package/dist/mcp/daemon-paths.js +219 -0
- package/dist/mcp/daemon-paths.js.map +1 -0
- package/dist/mcp/daemon-registry.d.ts +57 -0
- package/dist/mcp/daemon-registry.d.ts.map +1 -0
- package/dist/mcp/daemon-registry.js +281 -0
- package/dist/mcp/daemon-registry.js.map +1 -0
- package/dist/mcp/daemon.d.ts +293 -0
- package/dist/mcp/daemon.d.ts.map +1 -0
- package/dist/mcp/daemon.js +864 -0
- package/dist/mcp/daemon.js.map +1 -0
- package/dist/mcp/dynamic-boundaries.d.ts +41 -0
- package/dist/mcp/dynamic-boundaries.d.ts.map +1 -0
- package/dist/mcp/dynamic-boundaries.js +360 -0
- package/dist/mcp/dynamic-boundaries.js.map +1 -0
- package/dist/mcp/early-ppid.d.ts +26 -0
- package/dist/mcp/early-ppid.d.ts.map +1 -0
- package/dist/mcp/early-ppid.js +29 -0
- package/dist/mcp/early-ppid.js.map +1 -0
- package/dist/mcp/engine.d.ts +125 -0
- package/dist/mcp/engine.d.ts.map +1 -0
- package/dist/mcp/engine.js +392 -0
- package/dist/mcp/engine.js.map +1 -0
- package/dist/mcp/explore-dedup.d.ts +137 -0
- package/dist/mcp/explore-dedup.d.ts.map +1 -0
- package/dist/mcp/explore-dedup.js +236 -0
- package/dist/mcp/explore-dedup.js.map +1 -0
- package/dist/mcp/explore-diagnostics.d.ts +289 -0
- package/dist/mcp/explore-diagnostics.d.ts.map +1 -0
- package/dist/mcp/explore-diagnostics.js +558 -0
- package/dist/mcp/explore-diagnostics.js.map +1 -0
- package/dist/mcp/explore-session-state.d.ts +217 -0
- package/dist/mcp/explore-session-state.d.ts.map +1 -0
- package/dist/mcp/explore-session-state.js +322 -0
- package/dist/mcp/explore-session-state.js.map +1 -0
- package/dist/mcp/index.d.ts +137 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +567 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/liveness-watchdog.d.ts +35 -0
- package/dist/mcp/liveness-watchdog.d.ts.map +1 -0
- package/dist/mcp/liveness-watchdog.js +269 -0
- package/dist/mcp/liveness-watchdog.js.map +1 -0
- package/dist/mcp/ppid-watchdog.d.ts +62 -0
- package/dist/mcp/ppid-watchdog.d.ts.map +1 -0
- package/dist/mcp/ppid-watchdog.js +64 -0
- package/dist/mcp/ppid-watchdog.js.map +1 -0
- package/dist/mcp/proxy.d.ts +87 -0
- package/dist/mcp/proxy.d.ts.map +1 -0
- package/dist/mcp/proxy.js +672 -0
- package/dist/mcp/proxy.js.map +1 -0
- package/dist/mcp/query-pool.d.ts +108 -0
- package/dist/mcp/query-pool.d.ts.map +1 -0
- package/dist/mcp/query-pool.js +315 -0
- package/dist/mcp/query-pool.js.map +1 -0
- package/dist/mcp/query-worker.d.ts +24 -0
- package/dist/mcp/query-worker.d.ts.map +1 -0
- package/dist/mcp/query-worker.js +87 -0
- package/dist/mcp/query-worker.js.map +1 -0
- package/dist/mcp/server-instructions.d.ts +34 -0
- package/dist/mcp/server-instructions.d.ts.map +1 -0
- package/dist/mcp/server-instructions.js +111 -0
- package/dist/mcp/server-instructions.js.map +1 -0
- package/dist/mcp/session.d.ts +109 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +380 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/startup-handshake.d.ts +44 -0
- package/dist/mcp/startup-handshake.d.ts.map +1 -0
- package/dist/mcp/startup-handshake.js +73 -0
- package/dist/mcp/startup-handshake.js.map +1 -0
- package/dist/mcp/stdin-teardown.d.ts +27 -0
- package/dist/mcp/stdin-teardown.d.ts.map +1 -0
- package/dist/mcp/stdin-teardown.js +49 -0
- package/dist/mcp/stdin-teardown.js.map +1 -0
- package/dist/mcp/tools.d.ts +877 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +6371 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/transport.d.ts +188 -0
- package/dist/mcp/transport.d.ts.map +1 -0
- package/dist/mcp/transport.js +377 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/mcp/version.d.ts +19 -0
- package/dist/mcp/version.d.ts.map +1 -0
- package/dist/mcp/version.js +71 -0
- package/dist/mcp/version.js.map +1 -0
- package/dist/project-config.d.ts +158 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +489 -0
- package/dist/project-config.js.map +1 -0
- package/dist/resolution/c-fnptr-synthesizer.d.ts +6 -0
- package/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -0
- package/dist/resolution/c-fnptr-synthesizer.js +1506 -0
- package/dist/resolution/c-fnptr-synthesizer.js.map +1 -0
- package/dist/resolution/callback-synthesizer.d.ts +59 -0
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -0
- package/dist/resolution/callback-synthesizer.js +4066 -0
- package/dist/resolution/callback-synthesizer.js.map +1 -0
- package/dist/resolution/cooperative-yield.d.ts +40 -0
- package/dist/resolution/cooperative-yield.d.ts.map +1 -0
- package/dist/resolution/cooperative-yield.js +44 -0
- package/dist/resolution/cooperative-yield.js.map +1 -0
- package/dist/resolution/expo-router-synthesizer.d.ts +32 -0
- package/dist/resolution/expo-router-synthesizer.d.ts.map +1 -0
- package/dist/resolution/expo-router-synthesizer.js +189 -0
- package/dist/resolution/expo-router-synthesizer.js.map +1 -0
- package/dist/resolution/frameworks/astro.d.ts +9 -0
- package/dist/resolution/frameworks/astro.d.ts.map +1 -0
- package/dist/resolution/frameworks/astro.js +169 -0
- package/dist/resolution/frameworks/astro.js.map +1 -0
- package/dist/resolution/frameworks/cargo-workspace.d.ts +18 -0
- package/dist/resolution/frameworks/cargo-workspace.d.ts.map +1 -0
- package/dist/resolution/frameworks/cargo-workspace.js +225 -0
- package/dist/resolution/frameworks/cargo-workspace.js.map +1 -0
- package/dist/resolution/frameworks/cics.d.ts +20 -0
- package/dist/resolution/frameworks/cics.d.ts.map +1 -0
- package/dist/resolution/frameworks/cics.js +90 -0
- package/dist/resolution/frameworks/cics.js.map +1 -0
- package/dist/resolution/frameworks/csharp.d.ts +8 -0
- package/dist/resolution/frameworks/csharp.d.ts.map +1 -0
- package/dist/resolution/frameworks/csharp.js +335 -0
- package/dist/resolution/frameworks/csharp.js.map +1 -0
- package/dist/resolution/frameworks/drupal.d.ts +51 -0
- package/dist/resolution/frameworks/drupal.d.ts.map +1 -0
- package/dist/resolution/frameworks/drupal.js +367 -0
- package/dist/resolution/frameworks/drupal.js.map +1 -0
- package/dist/resolution/frameworks/expo-modules.d.ts +3 -0
- package/dist/resolution/frameworks/expo-modules.d.ts.map +1 -0
- package/dist/resolution/frameworks/expo-modules.js +148 -0
- package/dist/resolution/frameworks/expo-modules.js.map +1 -0
- package/dist/resolution/frameworks/expo-router.d.ts +189 -0
- package/dist/resolution/frameworks/expo-router.d.ts.map +1 -0
- package/dist/resolution/frameworks/expo-router.js +785 -0
- package/dist/resolution/frameworks/expo-router.js.map +1 -0
- package/dist/resolution/frameworks/express.d.ts +8 -0
- package/dist/resolution/frameworks/express.d.ts.map +1 -0
- package/dist/resolution/frameworks/express.js +540 -0
- package/dist/resolution/frameworks/express.js.map +1 -0
- package/dist/resolution/frameworks/fabric.d.ts +3 -0
- package/dist/resolution/frameworks/fabric.d.ts.map +1 -0
- package/dist/resolution/frameworks/fabric.js +354 -0
- package/dist/resolution/frameworks/fabric.js.map +1 -0
- package/dist/resolution/frameworks/go.d.ts +8 -0
- package/dist/resolution/frameworks/go.d.ts.map +1 -0
- package/dist/resolution/frameworks/go.js +184 -0
- package/dist/resolution/frameworks/go.js.map +1 -0
- package/dist/resolution/frameworks/goframe.d.ts +41 -0
- package/dist/resolution/frameworks/goframe.d.ts.map +1 -0
- package/dist/resolution/frameworks/goframe.js +112 -0
- package/dist/resolution/frameworks/goframe.js.map +1 -0
- package/dist/resolution/frameworks/index.d.ts +30 -0
- package/dist/resolution/frameworks/index.d.ts.map +1 -0
- package/dist/resolution/frameworks/index.js +72 -0
- package/dist/resolution/frameworks/index.js.map +1 -0
- package/dist/resolution/frameworks/java.d.ts +8 -0
- package/dist/resolution/frameworks/java.d.ts.map +1 -0
- package/dist/resolution/frameworks/java.js +517 -0
- package/dist/resolution/frameworks/java.js.map +1 -0
- package/dist/resolution/frameworks/laravel.d.ts +13 -0
- package/dist/resolution/frameworks/laravel.d.ts.map +1 -0
- package/dist/resolution/frameworks/laravel.js +257 -0
- package/dist/resolution/frameworks/laravel.js.map +1 -0
- package/dist/resolution/frameworks/nestjs.d.ts +26 -0
- package/dist/resolution/frameworks/nestjs.d.ts.map +1 -0
- package/dist/resolution/frameworks/nestjs.js +690 -0
- package/dist/resolution/frameworks/nestjs.js.map +1 -0
- package/dist/resolution/frameworks/nextjs.d.ts +76 -0
- package/dist/resolution/frameworks/nextjs.d.ts.map +1 -0
- package/dist/resolution/frameworks/nextjs.js +328 -0
- package/dist/resolution/frameworks/nextjs.js.map +1 -0
- package/dist/resolution/frameworks/object-literal.d.ts +32 -0
- package/dist/resolution/frameworks/object-literal.d.ts.map +1 -0
- package/dist/resolution/frameworks/object-literal.js +139 -0
- package/dist/resolution/frameworks/object-literal.js.map +1 -0
- package/dist/resolution/frameworks/package-deps.d.ts +14 -0
- package/dist/resolution/frameworks/package-deps.d.ts.map +1 -0
- package/dist/resolution/frameworks/package-deps.js +78 -0
- package/dist/resolution/frameworks/package-deps.js.map +1 -0
- package/dist/resolution/frameworks/play.d.ts +19 -0
- package/dist/resolution/frameworks/play.d.ts.map +1 -0
- package/dist/resolution/frameworks/play.js +111 -0
- package/dist/resolution/frameworks/play.js.map +1 -0
- package/dist/resolution/frameworks/python.d.ts +10 -0
- package/dist/resolution/frameworks/python.d.ts.map +1 -0
- package/dist/resolution/frameworks/python.js +566 -0
- package/dist/resolution/frameworks/python.js.map +1 -0
- package/dist/resolution/frameworks/react-native.d.ts +29 -0
- package/dist/resolution/frameworks/react-native.d.ts.map +1 -0
- package/dist/resolution/frameworks/react-native.js +549 -0
- package/dist/resolution/frameworks/react-native.js.map +1 -0
- package/dist/resolution/frameworks/react-router.d.ts +46 -0
- package/dist/resolution/frameworks/react-router.d.ts.map +1 -0
- package/dist/resolution/frameworks/react-router.js +187 -0
- package/dist/resolution/frameworks/react-router.js.map +1 -0
- package/dist/resolution/frameworks/react.d.ts +9 -0
- package/dist/resolution/frameworks/react.d.ts.map +1 -0
- package/dist/resolution/frameworks/react.js +257 -0
- package/dist/resolution/frameworks/react.js.map +1 -0
- package/dist/resolution/frameworks/ruby.d.ts +8 -0
- package/dist/resolution/frameworks/ruby.d.ts.map +1 -0
- package/dist/resolution/frameworks/ruby.js +302 -0
- package/dist/resolution/frameworks/ruby.js.map +1 -0
- package/dist/resolution/frameworks/rust.d.ts +8 -0
- package/dist/resolution/frameworks/rust.d.ts.map +1 -0
- package/dist/resolution/frameworks/rust.js +304 -0
- package/dist/resolution/frameworks/rust.js.map +1 -0
- package/dist/resolution/frameworks/svelte.d.ts +9 -0
- package/dist/resolution/frameworks/svelte.d.ts.map +1 -0
- package/dist/resolution/frameworks/svelte.js +258 -0
- package/dist/resolution/frameworks/svelte.js.map +1 -0
- package/dist/resolution/frameworks/sveltekit-router.d.ts +36 -0
- package/dist/resolution/frameworks/sveltekit-router.d.ts.map +1 -0
- package/dist/resolution/frameworks/sveltekit-router.js +156 -0
- package/dist/resolution/frameworks/sveltekit-router.js.map +1 -0
- package/dist/resolution/frameworks/swift-objc.d.ts +37 -0
- package/dist/resolution/frameworks/swift-objc.d.ts.map +1 -0
- package/dist/resolution/frameworks/swift-objc.js +252 -0
- package/dist/resolution/frameworks/swift-objc.js.map +1 -0
- package/dist/resolution/frameworks/swift.d.ts +10 -0
- package/dist/resolution/frameworks/swift.d.ts.map +1 -0
- package/dist/resolution/frameworks/swift.js +410 -0
- package/dist/resolution/frameworks/swift.js.map +1 -0
- package/dist/resolution/frameworks/tanstack-router.d.ts +84 -0
- package/dist/resolution/frameworks/tanstack-router.d.ts.map +1 -0
- package/dist/resolution/frameworks/tanstack-router.js +437 -0
- package/dist/resolution/frameworks/tanstack-router.js.map +1 -0
- package/dist/resolution/frameworks/terraform.d.ts +38 -0
- package/dist/resolution/frameworks/terraform.d.ts.map +1 -0
- package/dist/resolution/frameworks/terraform.js +277 -0
- package/dist/resolution/frameworks/terraform.js.map +1 -0
- package/dist/resolution/frameworks/vue-router.d.ts +82 -0
- package/dist/resolution/frameworks/vue-router.d.ts.map +1 -0
- package/dist/resolution/frameworks/vue-router.js +377 -0
- package/dist/resolution/frameworks/vue-router.js.map +1 -0
- package/dist/resolution/frameworks/vue.d.ts +9 -0
- package/dist/resolution/frameworks/vue.d.ts.map +1 -0
- package/dist/resolution/frameworks/vue.js +303 -0
- package/dist/resolution/frameworks/vue.js.map +1 -0
- package/dist/resolution/go-module.d.ts +26 -0
- package/dist/resolution/go-module.d.ts.map +1 -0
- package/dist/resolution/go-module.js +78 -0
- package/dist/resolution/go-module.js.map +1 -0
- package/dist/resolution/goframe-synthesizer.d.ts +29 -0
- package/dist/resolution/goframe-synthesizer.d.ts.map +1 -0
- package/dist/resolution/goframe-synthesizer.js +163 -0
- package/dist/resolution/goframe-synthesizer.js.map +1 -0
- package/dist/resolution/import-resolver.d.ts +84 -0
- package/dist/resolution/import-resolver.d.ts.map +1 -0
- package/dist/resolution/import-resolver.js +2240 -0
- package/dist/resolution/import-resolver.js.map +1 -0
- package/dist/resolution/index.d.ts +343 -0
- package/dist/resolution/index.d.ts.map +1 -0
- package/dist/resolution/index.js +2352 -0
- package/dist/resolution/index.js.map +1 -0
- package/dist/resolution/lru-cache.d.ts +24 -0
- package/dist/resolution/lru-cache.d.ts.map +1 -0
- package/dist/resolution/lru-cache.js +62 -0
- package/dist/resolution/lru-cache.js.map +1 -0
- package/dist/resolution/memory-budget.d.ts +48 -0
- package/dist/resolution/memory-budget.d.ts.map +1 -0
- package/dist/resolution/memory-budget.js +162 -0
- package/dist/resolution/memory-budget.js.map +1 -0
- package/dist/resolution/name-matcher.d.ts +153 -0
- package/dist/resolution/name-matcher.d.ts.map +1 -0
- package/dist/resolution/name-matcher.js +2412 -0
- package/dist/resolution/name-matcher.js.map +1 -0
- package/dist/resolution/next-router-synthesizer.d.ts +27 -0
- package/dist/resolution/next-router-synthesizer.d.ts.map +1 -0
- package/dist/resolution/next-router-synthesizer.js +113 -0
- package/dist/resolution/next-router-synthesizer.js.map +1 -0
- package/dist/resolution/path-aliases.d.ts +70 -0
- package/dist/resolution/path-aliases.d.ts.map +1 -0
- package/dist/resolution/path-aliases.js +346 -0
- package/dist/resolution/path-aliases.js.map +1 -0
- package/dist/resolution/react-router-synthesizer.d.ts +33 -0
- package/dist/resolution/react-router-synthesizer.d.ts.map +1 -0
- package/dist/resolution/react-router-synthesizer.js +126 -0
- package/dist/resolution/react-router-synthesizer.js.map +1 -0
- package/dist/resolution/resolver-pool.d.ts +106 -0
- package/dist/resolution/resolver-pool.d.ts.map +1 -0
- package/dist/resolution/resolver-pool.js +344 -0
- package/dist/resolution/resolver-pool.js.map +1 -0
- package/dist/resolution/resolver-worker.d.ts +17 -0
- package/dist/resolution/resolver-worker.d.ts.map +1 -0
- package/dist/resolution/resolver-worker.js +141 -0
- package/dist/resolution/resolver-worker.js.map +1 -0
- package/dist/resolution/strip-comments.d.ts +27 -0
- package/dist/resolution/strip-comments.d.ts.map +1 -0
- package/dist/resolution/strip-comments.js +492 -0
- package/dist/resolution/strip-comments.js.map +1 -0
- package/dist/resolution/sveltekit-synthesizer.d.ts +58 -0
- package/dist/resolution/sveltekit-synthesizer.d.ts.map +1 -0
- package/dist/resolution/sveltekit-synthesizer.js +173 -0
- package/dist/resolution/sveltekit-synthesizer.js.map +1 -0
- package/dist/resolution/swift-objc-bridge.d.ts +134 -0
- package/dist/resolution/swift-objc-bridge.d.ts.map +1 -0
- package/dist/resolution/swift-objc-bridge.js +256 -0
- package/dist/resolution/swift-objc-bridge.js.map +1 -0
- package/dist/resolution/synth-utils.d.ts +26 -0
- package/dist/resolution/synth-utils.d.ts.map +1 -0
- package/dist/resolution/synth-utils.js +75 -0
- package/dist/resolution/synth-utils.js.map +1 -0
- package/dist/resolution/tanstack-router-synthesizer.d.ts +31 -0
- package/dist/resolution/tanstack-router-synthesizer.d.ts.map +1 -0
- package/dist/resolution/tanstack-router-synthesizer.js +114 -0
- package/dist/resolution/tanstack-router-synthesizer.js.map +1 -0
- package/dist/resolution/tier-synthesizer.d.ts +48 -0
- package/dist/resolution/tier-synthesizer.d.ts.map +1 -0
- package/dist/resolution/tier-synthesizer.js +907 -0
- package/dist/resolution/tier-synthesizer.js.map +1 -0
- package/dist/resolution/types.d.ts +290 -0
- package/dist/resolution/types.d.ts.map +1 -0
- package/dist/resolution/types.js +8 -0
- package/dist/resolution/types.js.map +1 -0
- package/dist/resolution/vue-router-synthesizer.d.ts +30 -0
- package/dist/resolution/vue-router-synthesizer.d.ts.map +1 -0
- package/dist/resolution/vue-router-synthesizer.js +115 -0
- package/dist/resolution/vue-router-synthesizer.js.map +1 -0
- package/dist/resolution/workspace-packages.d.ts +58 -0
- package/dist/resolution/workspace-packages.d.ts.map +1 -0
- package/dist/resolution/workspace-packages.js +346 -0
- package/dist/resolution/workspace-packages.js.map +1 -0
- package/dist/search/identifier-segments.d.ts +70 -0
- package/dist/search/identifier-segments.d.ts.map +1 -0
- package/dist/search/identifier-segments.js +205 -0
- package/dist/search/identifier-segments.js.map +1 -0
- package/dist/search/query-parser.d.ts +57 -0
- package/dist/search/query-parser.d.ts.map +1 -0
- package/dist/search/query-parser.js +177 -0
- package/dist/search/query-parser.js.map +1 -0
- package/dist/search/query-paths.d.ts +57 -0
- package/dist/search/query-paths.d.ts.map +1 -0
- package/dist/search/query-paths.js +298 -0
- package/dist/search/query-paths.js.map +1 -0
- package/dist/search/query-utils.d.ts +102 -0
- package/dist/search/query-utils.d.ts.map +1 -0
- package/dist/search/query-utils.js +487 -0
- package/dist/search/query-utils.js.map +1 -0
- package/dist/sync/git-hooks.d.ts +45 -0
- package/dist/sync/git-hooks.d.ts.map +1 -0
- package/dist/sync/git-hooks.js +227 -0
- package/dist/sync/git-hooks.js.map +1 -0
- package/dist/sync/index.d.ts +19 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +35 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/watch-policy.d.ts +48 -0
- package/dist/sync/watch-policy.d.ts.map +1 -0
- package/dist/sync/watch-policy.js +124 -0
- package/dist/sync/watch-policy.js.map +1 -0
- package/dist/sync/watcher.d.ts +401 -0
- package/dist/sync/watcher.d.ts.map +1 -0
- package/dist/sync/watcher.js +967 -0
- package/dist/sync/watcher.js.map +1 -0
- package/dist/sync/worktree.d.ts +63 -0
- package/dist/sync/worktree.d.ts.map +1 -0
- package/dist/sync/worktree.js +182 -0
- package/dist/sync/worktree.js.map +1 -0
- package/dist/telemetry/index.d.ts +143 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +541 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/types.d.ts +486 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +118 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/color.d.ts +21 -0
- package/dist/ui/color.d.ts.map +1 -0
- package/dist/ui/color.js +42 -0
- package/dist/ui/color.js.map +1 -0
- package/dist/ui/glyphs.d.ts +67 -0
- package/dist/ui/glyphs.d.ts.map +1 -0
- package/dist/ui/glyphs.js +125 -0
- package/dist/ui/glyphs.js.map +1 -0
- package/dist/ui/shimmer-progress.d.ts +11 -0
- package/dist/ui/shimmer-progress.d.ts.map +1 -0
- package/dist/ui/shimmer-progress.js +164 -0
- package/dist/ui/shimmer-progress.js.map +1 -0
- package/dist/ui/shimmer-worker.d.ts +2 -0
- package/dist/ui/shimmer-worker.d.ts.map +1 -0
- package/dist/ui/shimmer-worker.js +126 -0
- package/dist/ui/shimmer-worker.js.map +1 -0
- package/dist/ui/types.d.ts +15 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +3 -0
- package/dist/ui/types.js.map +1 -0
- package/dist/ui-server/api/deadcode.d.ts +84 -0
- package/dist/ui-server/api/deadcode.d.ts.map +1 -0
- package/dist/ui-server/api/deadcode.js +136 -0
- package/dist/ui-server/api/deadcode.js.map +1 -0
- package/dist/ui-server/api/effects.d.ts +87 -0
- package/dist/ui-server/api/effects.d.ts.map +1 -0
- package/dist/ui-server/api/effects.js +499 -0
- package/dist/ui-server/api/effects.js.map +1 -0
- package/dist/ui-server/api/entrypoints.d.ts +86 -0
- package/dist/ui-server/api/entrypoints.d.ts.map +1 -0
- package/dist/ui-server/api/entrypoints.js +279 -0
- package/dist/ui-server/api/entrypoints.js.map +1 -0
- package/dist/ui-server/api/events.d.ts +183 -0
- package/dist/ui-server/api/events.d.ts.map +1 -0
- package/dist/ui-server/api/events.js +430 -0
- package/dist/ui-server/api/events.js.map +1 -0
- package/dist/ui-server/api/file.d.ts +66 -0
- package/dist/ui-server/api/file.d.ts.map +1 -0
- package/dist/ui-server/api/file.js +222 -0
- package/dist/ui-server/api/file.js.map +1 -0
- package/dist/ui-server/api/filecode.d.ts +126 -0
- package/dist/ui-server/api/filecode.d.ts.map +1 -0
- package/dist/ui-server/api/filecode.js +205 -0
- package/dist/ui-server/api/filecode.js.map +1 -0
- package/dist/ui-server/api/flow.d.ts +226 -0
- package/dist/ui-server/api/flow.d.ts.map +1 -0
- package/dist/ui-server/api/flow.js +611 -0
- package/dist/ui-server/api/flow.js.map +1 -0
- package/dist/ui-server/api/hierarchy.d.ts +81 -0
- package/dist/ui-server/api/hierarchy.d.ts.map +1 -0
- package/dist/ui-server/api/hierarchy.js +92 -0
- package/dist/ui-server/api/hierarchy.js.map +1 -0
- package/dist/ui-server/api/index.d.ts +90 -0
- package/dist/ui-server/api/index.d.ts.map +1 -0
- package/dist/ui-server/api/index.js +332 -0
- package/dist/ui-server/api/index.js.map +1 -0
- package/dist/ui-server/api/map.d.ts +187 -0
- package/dist/ui-server/api/map.d.ts.map +1 -0
- package/dist/ui-server/api/map.js +498 -0
- package/dist/ui-server/api/map.js.map +1 -0
- package/dist/ui-server/api/node.d.ts +81 -0
- package/dist/ui-server/api/node.d.ts.map +1 -0
- package/dist/ui-server/api/node.js +388 -0
- package/dist/ui-server/api/node.js.map +1 -0
- package/dist/ui-server/api/nodes.d.ts +25 -0
- package/dist/ui-server/api/nodes.d.ts.map +1 -0
- package/dist/ui-server/api/nodes.js +45 -0
- package/dist/ui-server/api/nodes.js.map +1 -0
- package/dist/ui-server/api/program.d.ts +139 -0
- package/dist/ui-server/api/program.d.ts.map +1 -0
- package/dist/ui-server/api/program.js +315 -0
- package/dist/ui-server/api/program.js.map +1 -0
- package/dist/ui-server/api/respond.d.ts +76 -0
- package/dist/ui-server/api/respond.d.ts.map +1 -0
- package/dist/ui-server/api/respond.js +186 -0
- package/dist/ui-server/api/respond.js.map +1 -0
- package/dist/ui-server/api/route-roots.d.ts +39 -0
- package/dist/ui-server/api/route-roots.d.ts.map +1 -0
- package/dist/ui-server/api/route-roots.js +96 -0
- package/dist/ui-server/api/route-roots.js.map +1 -0
- package/dist/ui-server/api/routes.d.ts +59 -0
- package/dist/ui-server/api/routes.d.ts.map +1 -0
- package/dist/ui-server/api/routes.js +112 -0
- package/dist/ui-server/api/routes.js.map +1 -0
- package/dist/ui-server/api/screens.d.ts +117 -0
- package/dist/ui-server/api/screens.d.ts.map +1 -0
- package/dist/ui-server/api/screens.js +611 -0
- package/dist/ui-server/api/screens.js.map +1 -0
- package/dist/ui-server/api/search.d.ts +29 -0
- package/dist/ui-server/api/search.d.ts.map +1 -0
- package/dist/ui-server/api/search.js +232 -0
- package/dist/ui-server/api/search.js.map +1 -0
- package/dist/ui-server/api/session.d.ts +52 -0
- package/dist/ui-server/api/session.d.ts.map +1 -0
- package/dist/ui-server/api/session.js +196 -0
- package/dist/ui-server/api/session.js.map +1 -0
- package/dist/ui-server/api/source.d.ts +200 -0
- package/dist/ui-server/api/source.d.ts.map +1 -0
- package/dist/ui-server/api/source.js +419 -0
- package/dist/ui-server/api/source.js.map +1 -0
- package/dist/ui-server/api/stats.d.ts +27 -0
- package/dist/ui-server/api/stats.d.ts.map +1 -0
- package/dist/ui-server/api/stats.js +164 -0
- package/dist/ui-server/api/stats.js.map +1 -0
- package/dist/ui-server/api/steps.d.ts +274 -0
- package/dist/ui-server/api/steps.d.ts.map +1 -0
- package/dist/ui-server/api/steps.js +1446 -0
- package/dist/ui-server/api/steps.js.map +1 -0
- package/dist/ui-server/api/trail-store.d.ts +142 -0
- package/dist/ui-server/api/trail-store.d.ts.map +1 -0
- package/dist/ui-server/api/trail-store.js +323 -0
- package/dist/ui-server/api/trail-store.js.map +1 -0
- package/dist/ui-server/api/trails.d.ts +163 -0
- package/dist/ui-server/api/trails.d.ts.map +1 -0
- package/dist/ui-server/api/trails.js +369 -0
- package/dist/ui-server/api/trails.js.map +1 -0
- package/dist/ui-server/api/when.d.ts +125 -0
- package/dist/ui-server/api/when.d.ts.map +1 -0
- package/dist/ui-server/api/when.js +251 -0
- package/dist/ui-server/api/when.js.map +1 -0
- package/dist/ui-server/api/wire.d.ts +179 -0
- package/dist/ui-server/api/wire.d.ts.map +1 -0
- package/dist/ui-server/api/wire.js +231 -0
- package/dist/ui-server/api/wire.js.map +1 -0
- package/dist/ui-server/assets.d.ts +40 -0
- package/dist/ui-server/assets.d.ts.map +1 -0
- package/dist/ui-server/assets.js +110 -0
- package/dist/ui-server/assets.js.map +1 -0
- package/dist/ui-server/constants.d.ts +32 -0
- package/dist/ui-server/constants.d.ts.map +1 -0
- package/dist/ui-server/constants.js +35 -0
- package/dist/ui-server/constants.js.map +1 -0
- package/dist/ui-server/highlight/index.d.ts +113 -0
- package/dist/ui-server/highlight/index.d.ts.map +1 -0
- package/dist/ui-server/highlight/index.js +307 -0
- package/dist/ui-server/highlight/index.js.map +1 -0
- package/dist/ui-server/highlight/languages.d.ts +36 -0
- package/dist/ui-server/highlight/languages.d.ts.map +1 -0
- package/dist/ui-server/highlight/languages.js +50 -0
- package/dist/ui-server/highlight/languages.js.map +1 -0
- package/dist/ui-server/index.d.ts +92 -0
- package/dist/ui-server/index.d.ts.map +1 -0
- package/dist/ui-server/index.js +399 -0
- package/dist/ui-server/index.js.map +1 -0
- package/dist/ui-server/open-browser.d.ts +31 -0
- package/dist/ui-server/open-browser.d.ts.map +1 -0
- package/dist/ui-server/open-browser.js +79 -0
- package/dist/ui-server/open-browser.js.map +1 -0
- package/dist/ui-server/security.d.ts +127 -0
- package/dist/ui-server/security.d.ts.map +1 -0
- package/dist/ui-server/security.js +332 -0
- package/dist/ui-server/security.js.map +1 -0
- package/dist/ui-server/static.d.ts +45 -0
- package/dist/ui-server/static.d.ts.map +1 -0
- package/dist/ui-server/static.js +165 -0
- package/dist/ui-server/static.js.map +1 -0
- package/dist/upgrade/index.d.ts +177 -0
- package/dist/upgrade/index.d.ts.map +1 -0
- package/dist/upgrade/index.js +665 -0
- package/dist/upgrade/index.js.map +1 -0
- package/dist/upgrade/remove-binary.d.ts +87 -0
- package/dist/upgrade/remove-binary.d.ts.map +1 -0
- package/dist/upgrade/remove-binary.js +289 -0
- package/dist/upgrade/remove-binary.js.map +1 -0
- package/dist/upgrade/update-check.d.ts +92 -0
- package/dist/upgrade/update-check.d.ts.map +1 -0
- package/dist/upgrade/update-check.js +258 -0
- package/dist/upgrade/update-check.js.map +1 -0
- package/dist/utils.d.ts +224 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +583 -0
- package/dist/utils.js.map +1 -0
- package/dist/viewer/assets/archivo-latin-ext-wght-normal-C4zznr8T.woff2 +0 -0
- package/dist/viewer/assets/archivo-latin-wght-normal-E0tuGl4L.woff2 +0 -0
- package/dist/viewer/assets/archivo-vietnamese-wght-normal-XAtsl5Q_.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-400-italic-2syK4fUT.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-400-italic-CBJ8pzag.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-600-normal-CTOM6hUh.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-600-normal-fLZuRloM.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-ext-400-italic-B4oTjJdl.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-ext-400-italic-CBjNughH.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-ext-600-normal-9HEixskS.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-cyrillic-ext-600-normal-V-xxqcpd.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-400-italic-66oory27.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-400-italic-BqAiT5Ww.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-ext-400-italic-B7_fu1kp.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-ext-400-italic-Bg0ZHwF4.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-ext-600-normal-D38SheWl.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-latin-ext-600-normal-DmB0ttJJ.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-vietnamese-400-italic-D6eaYXMU.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-vietnamese-400-italic-DRuN92E5.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- package/dist/viewer/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-vietnamese-600-normal-D2EvbN8M.woff2 +0 -0
- package/dist/viewer/assets/ibm-plex-mono-vietnamese-600-normal-iLQfcSjf.woff +0 -0
- package/dist/viewer/assets/index-2IPslW5t.js +13 -0
- package/dist/viewer/assets/index-DSwi2Seu.css +1 -0
- package/dist/viewer/index.html +16 -0
- package/package.json +67 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The `cg ui` server.
|
|
4
|
+
*
|
|
5
|
+
* A loopback-only `node:http` server that hands the browser the built viewer
|
|
6
|
+
* (`dist/viewer/`) and, through the JSON API mounted on the `api` seam below
|
|
7
|
+
* (`./api`), a view of one indexed project. No framework, no new dependency: it
|
|
8
|
+
* answers GET, serves files, and refuses everything else.
|
|
9
|
+
*
|
|
10
|
+
* It is a reader with one exception, added deliberately and scoped as narrowly
|
|
11
|
+
* as it could be: `POST`/`DELETE /api/trails` saves and removes the reader's own
|
|
12
|
+
* named trails, as JSON files under `.codegraph/ui/trails/`. Nothing else it
|
|
13
|
+
* serves has a side effect, no other path accepts a write, and `--read-only`
|
|
14
|
+
* turns even that one off. See `security.ts` for what a write has to carry.
|
|
15
|
+
*
|
|
16
|
+
* The interesting part is not the routing, it is the boundary in `security.ts`.
|
|
17
|
+
* Read that first.
|
|
18
|
+
*/
|
|
19
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
22
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
23
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(o, k2, desc);
|
|
26
|
+
}) : (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
o[k2] = m[k];
|
|
29
|
+
}));
|
|
30
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
31
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
32
|
+
}) : function(o, v) {
|
|
33
|
+
o["default"] = v;
|
|
34
|
+
});
|
|
35
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
36
|
+
var ownKeys = function(o) {
|
|
37
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
38
|
+
var ar = [];
|
|
39
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
40
|
+
return ar;
|
|
41
|
+
};
|
|
42
|
+
return ownKeys(o);
|
|
43
|
+
};
|
|
44
|
+
return function (mod) {
|
|
45
|
+
if (mod && mod.__esModule) return mod;
|
|
46
|
+
var result = {};
|
|
47
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
48
|
+
__setModuleDefault(result, mod);
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
})();
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.ApiError = exports.GraphSession = exports.createGraphApi = exports.cacheControlFor = exports.contentTypeFor = exports.openBrowser = exports.browserOpenCommand = exports.resolveStaticAsset = exports.resolveProjectFile = exports.isWriteRequest = exports.isWriteMethod = exports.isSafeRequestPath = exports.isAllowedOrigin = exports.isAllowedHost = exports.PathRefusalError = exports.WRITE_METHODS = exports.WRITE_HEADER = exports.READ_METHODS = exports.ALLOWED_METHODS = exports.VIEWER_PATH_ENV = exports.LOOPBACK_ADDRESS = exports.DEFAULT_UI_PORT = exports.DEFAULT_PORT_ATTEMPTS = exports.BROWSER_ENV = exports.ViewerMissingError = void 0;
|
|
54
|
+
exports.startUiServer = startUiServer;
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const http = __importStar(require("http"));
|
|
57
|
+
const path = __importStar(require("path"));
|
|
58
|
+
const assets_1 = require("./assets");
|
|
59
|
+
const security_1 = require("./security");
|
|
60
|
+
const static_1 = require("./static");
|
|
61
|
+
const constants_1 = require("./constants");
|
|
62
|
+
var assets_2 = require("./assets");
|
|
63
|
+
Object.defineProperty(exports, "ViewerMissingError", { enumerable: true, get: function () { return assets_2.ViewerMissingError; } });
|
|
64
|
+
var constants_2 = require("./constants");
|
|
65
|
+
Object.defineProperty(exports, "BROWSER_ENV", { enumerable: true, get: function () { return constants_2.BROWSER_ENV; } });
|
|
66
|
+
Object.defineProperty(exports, "DEFAULT_PORT_ATTEMPTS", { enumerable: true, get: function () { return constants_2.DEFAULT_PORT_ATTEMPTS; } });
|
|
67
|
+
Object.defineProperty(exports, "DEFAULT_UI_PORT", { enumerable: true, get: function () { return constants_2.DEFAULT_UI_PORT; } });
|
|
68
|
+
Object.defineProperty(exports, "LOOPBACK_ADDRESS", { enumerable: true, get: function () { return constants_2.LOOPBACK_ADDRESS; } });
|
|
69
|
+
Object.defineProperty(exports, "VIEWER_PATH_ENV", { enumerable: true, get: function () { return constants_2.VIEWER_PATH_ENV; } });
|
|
70
|
+
var security_2 = require("./security");
|
|
71
|
+
Object.defineProperty(exports, "ALLOWED_METHODS", { enumerable: true, get: function () { return security_2.ALLOWED_METHODS; } });
|
|
72
|
+
Object.defineProperty(exports, "READ_METHODS", { enumerable: true, get: function () { return security_2.READ_METHODS; } });
|
|
73
|
+
Object.defineProperty(exports, "WRITE_HEADER", { enumerable: true, get: function () { return security_2.WRITE_HEADER; } });
|
|
74
|
+
Object.defineProperty(exports, "WRITE_METHODS", { enumerable: true, get: function () { return security_2.WRITE_METHODS; } });
|
|
75
|
+
Object.defineProperty(exports, "PathRefusalError", { enumerable: true, get: function () { return security_2.PathRefusalError; } });
|
|
76
|
+
Object.defineProperty(exports, "isAllowedHost", { enumerable: true, get: function () { return security_2.isAllowedHost; } });
|
|
77
|
+
Object.defineProperty(exports, "isAllowedOrigin", { enumerable: true, get: function () { return security_2.isAllowedOrigin; } });
|
|
78
|
+
Object.defineProperty(exports, "isSafeRequestPath", { enumerable: true, get: function () { return security_2.isSafeRequestPath; } });
|
|
79
|
+
Object.defineProperty(exports, "isWriteMethod", { enumerable: true, get: function () { return security_2.isWriteMethod; } });
|
|
80
|
+
Object.defineProperty(exports, "isWriteRequest", { enumerable: true, get: function () { return security_2.isWriteRequest; } });
|
|
81
|
+
Object.defineProperty(exports, "resolveProjectFile", { enumerable: true, get: function () { return security_2.resolveProjectFile; } });
|
|
82
|
+
Object.defineProperty(exports, "resolveStaticAsset", { enumerable: true, get: function () { return security_2.resolveStaticAsset; } });
|
|
83
|
+
var open_browser_1 = require("./open-browser");
|
|
84
|
+
Object.defineProperty(exports, "browserOpenCommand", { enumerable: true, get: function () { return open_browser_1.browserOpenCommand; } });
|
|
85
|
+
Object.defineProperty(exports, "openBrowser", { enumerable: true, get: function () { return open_browser_1.openBrowser; } });
|
|
86
|
+
var static_2 = require("./static");
|
|
87
|
+
Object.defineProperty(exports, "contentTypeFor", { enumerable: true, get: function () { return static_2.contentTypeFor; } });
|
|
88
|
+
Object.defineProperty(exports, "cacheControlFor", { enumerable: true, get: function () { return static_2.cacheControlFor; } });
|
|
89
|
+
var api_1 = require("./api");
|
|
90
|
+
Object.defineProperty(exports, "createGraphApi", { enumerable: true, get: function () { return api_1.createGraphApi; } });
|
|
91
|
+
Object.defineProperty(exports, "GraphSession", { enumerable: true, get: function () { return api_1.GraphSession; } });
|
|
92
|
+
Object.defineProperty(exports, "ApiError", { enumerable: true, get: function () { return api_1.ApiError; } });
|
|
93
|
+
/**
|
|
94
|
+
* Response headers sent on EVERY response.
|
|
95
|
+
*
|
|
96
|
+
* `frame-ancestors`/`X-Frame-Options` stop another page from framing the viewer
|
|
97
|
+
* and reading it by overlay; `nosniff` stops an asset with a surprising
|
|
98
|
+
* extension from being executed as script; the CSP pins every resource to this
|
|
99
|
+
* origin, so a future viewer change cannot start phoning out with what it read.
|
|
100
|
+
* `style-src` keeps `'unsafe-inline'` because the syntax highlighter emits
|
|
101
|
+
* inline `style=` attributes on code spans.
|
|
102
|
+
*
|
|
103
|
+
* Note what is NOT here: any `Access-Control-*` header. Their absence is what
|
|
104
|
+
* makes a cross-origin read of a response body impossible even if a request
|
|
105
|
+
* somehow gets past the `Host` check.
|
|
106
|
+
*/
|
|
107
|
+
const SECURITY_HEADERS = {
|
|
108
|
+
'X-Content-Type-Options': 'nosniff',
|
|
109
|
+
'X-Frame-Options': 'DENY',
|
|
110
|
+
'Referrer-Policy': 'no-referrer',
|
|
111
|
+
'Content-Security-Policy': [
|
|
112
|
+
"default-src 'none'",
|
|
113
|
+
"script-src 'self'",
|
|
114
|
+
"style-src 'self' 'unsafe-inline'",
|
|
115
|
+
"img-src 'self' data:",
|
|
116
|
+
"font-src 'self'",
|
|
117
|
+
"connect-src 'self'",
|
|
118
|
+
"base-uri 'none'",
|
|
119
|
+
"form-action 'none'",
|
|
120
|
+
"frame-ancestors 'none'",
|
|
121
|
+
].join('; '),
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Start the viewer server.
|
|
125
|
+
*
|
|
126
|
+
* Resolves once the socket is bound, so the caller can print a URL that is
|
|
127
|
+
* already answering.
|
|
128
|
+
*/
|
|
129
|
+
async function startUiServer(options) {
|
|
130
|
+
// realpath, not just resolve: `resolveStaticAsset` hands back realpaths (the
|
|
131
|
+
// symlink check in `validatePathWithinRoot` resolves them), so a viewerDir
|
|
132
|
+
// that still holds a symlink — every macOS `/var/folders` temp dir, plenty of
|
|
133
|
+
// package managers — would make `path.relative` between the two nonsense, and
|
|
134
|
+
// the cache policy that keys off it silently wrong.
|
|
135
|
+
const viewerDir = options.viewerDir ? realpath(options.viewerDir) : (0, assets_1.resolveViewerDir)();
|
|
136
|
+
const projectRoot = path.resolve(options.projectRoot);
|
|
137
|
+
const indexHtml = path.join(viewerDir, 'index.html');
|
|
138
|
+
// The bound port is needed by the Host check, but is only known after listen.
|
|
139
|
+
// Captured by reference so the handler always sees the real value.
|
|
140
|
+
let boundPort = 0;
|
|
141
|
+
const server = http.createServer((req, res) => {
|
|
142
|
+
handleRequest(req, res, {
|
|
143
|
+
viewerDir,
|
|
144
|
+
indexHtml,
|
|
145
|
+
projectRoot,
|
|
146
|
+
api: options.api,
|
|
147
|
+
port: () => boundPort,
|
|
148
|
+
}).catch(() => {
|
|
149
|
+
// handleRequest already answers every error it can; reaching here means
|
|
150
|
+
// the socket itself is gone. Never let it become an unhandled rejection,
|
|
151
|
+
// which the CLI's fatal handlers would turn into a process exit.
|
|
152
|
+
if (!res.writableEnded)
|
|
153
|
+
res.destroy();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
// A browser holds keep-alive sockets open; without this, `close()` would wait
|
|
157
|
+
// for them and Ctrl-C would appear to hang.
|
|
158
|
+
server.keepAliveTimeout = 5_000;
|
|
159
|
+
boundPort = await listenWithFallback(server, {
|
|
160
|
+
port: options.port ?? constants_1.DEFAULT_UI_PORT,
|
|
161
|
+
fallback: options.portFallback ?? true,
|
|
162
|
+
attempts: options.maxPortAttempts ?? constants_1.DEFAULT_PORT_ATTEMPTS,
|
|
163
|
+
});
|
|
164
|
+
let closed = false;
|
|
165
|
+
return {
|
|
166
|
+
port: boundPort,
|
|
167
|
+
url: `http://${constants_1.LOOPBACK_ADDRESS}:${boundPort}`,
|
|
168
|
+
viewerDir,
|
|
169
|
+
server,
|
|
170
|
+
close() {
|
|
171
|
+
if (closed)
|
|
172
|
+
return Promise.resolve();
|
|
173
|
+
closed = true;
|
|
174
|
+
return new Promise((resolve) => {
|
|
175
|
+
server.closeAllConnections();
|
|
176
|
+
server.close(() => resolve());
|
|
177
|
+
});
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* One request, start to finish. Order matters: the cheap refusals (method,
|
|
183
|
+
* `Host`, `Origin`) run before anything touches the filesystem.
|
|
184
|
+
*/
|
|
185
|
+
async function handleRequest(req, res, deps) {
|
|
186
|
+
const method = req.method ?? 'GET';
|
|
187
|
+
for (const [name, value] of Object.entries(SECURITY_HEADERS)) {
|
|
188
|
+
res.setHeader(name, value);
|
|
189
|
+
}
|
|
190
|
+
if (!security_1.ALLOWED_METHODS.includes(method)) {
|
|
191
|
+
res.setHeader('Allow', security_1.ALLOWED_METHODS.join(', '));
|
|
192
|
+
(0, static_1.sendText)(res, 405, `cg ui does not answer ${method}.`, method);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const port = deps.port();
|
|
196
|
+
if (!(0, security_1.isAllowedHost)(req.headers.host, port)) {
|
|
197
|
+
// The DNS-rebinding refusal. Say why, since a human hitting this through a
|
|
198
|
+
// proxy or a container hostname needs to know what to change.
|
|
199
|
+
(0, static_1.sendText)(res, 403, 'Refused: cg ui only answers requests addressed to this machine ' +
|
|
200
|
+
`(localhost, 127.0.0.1 or [::1] on port ${port}).\n` +
|
|
201
|
+
`This request said Host: ${forEcho(req.headers.host)}`, method);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (!(0, security_1.isAllowedOrigin)(readHeader(req, 'origin'), port)) {
|
|
205
|
+
(0, static_1.sendText)(res, 403, 'Refused: cross-origin requests are not served.', method);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// Checked on the RAW url, before WHATWG parsing folds `..` segments away.
|
|
209
|
+
const rawPath = (req.url ?? '/').split(/[?#]/)[0] ?? '/';
|
|
210
|
+
// The `/api/` namespace answers JSON for EVERY outcome, refusals included:
|
|
211
|
+
// the viewer parses these responses, and a text/plain body here would surface
|
|
212
|
+
// as a parse error instead of the refusal it actually is.
|
|
213
|
+
const jsonNamespace = rawPath === '/api' || rawPath.startsWith('/api/');
|
|
214
|
+
// The one place this server stops being a pure reader. A write has to be
|
|
215
|
+
// under /api/ and carry the marker header — see `isWriteRequest` for what
|
|
216
|
+
// that closes that Host and Origin do not.
|
|
217
|
+
if ((0, security_1.isWriteMethod)(method)) {
|
|
218
|
+
const verdict = (0, security_1.isWriteRequest)(rawPath, {
|
|
219
|
+
marker: readHeader(req, security_1.WRITE_HEADER),
|
|
220
|
+
contentType: readHeader(req, 'content-type'),
|
|
221
|
+
});
|
|
222
|
+
if (!verdict.ok) {
|
|
223
|
+
if (!jsonNamespace)
|
|
224
|
+
res.setHeader('Allow', security_1.READ_METHODS.join(', '));
|
|
225
|
+
const body = `Refused: ${verdict.reason}`;
|
|
226
|
+
if (jsonNamespace)
|
|
227
|
+
(0, static_1.sendJson)(res, 403, { error: body, code: 'refused' }, method);
|
|
228
|
+
else
|
|
229
|
+
(0, static_1.sendText)(res, 405, body, method);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (!(0, security_1.isSafeRequestPath)(rawPath)) {
|
|
234
|
+
if (jsonNamespace) {
|
|
235
|
+
(0, static_1.sendJson)(res, 404, { error: 'Not found', code: 'not-found' }, method);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
(0, static_1.sendText)(res, 404, 'Not found', method);
|
|
239
|
+
}
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
let url;
|
|
243
|
+
try {
|
|
244
|
+
url = new URL(req.url ?? '/', `http://${constants_1.LOOPBACK_ADDRESS}:${port}`);
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
(0, static_1.sendText)(res, 400, 'Bad request URL.', method);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
// `/api/` is reserved — it must 404 as JSON rather than fall through to the
|
|
251
|
+
// SPA, or a typo'd endpoint returns 200 + HTML and the viewer parses the app
|
|
252
|
+
// shell as a payload.
|
|
253
|
+
if (url.pathname === '/api' || url.pathname.startsWith('/api/')) {
|
|
254
|
+
const ctx = {
|
|
255
|
+
pathname: safeDecode(url.pathname),
|
|
256
|
+
query: url.searchParams,
|
|
257
|
+
projectRoot: deps.projectRoot,
|
|
258
|
+
method,
|
|
259
|
+
};
|
|
260
|
+
if (deps.api) {
|
|
261
|
+
try {
|
|
262
|
+
if (await deps.api(req, res, ctx))
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
if (!res.headersSent) {
|
|
267
|
+
(0, static_1.sendJson)(res, 500, { error: err instanceof Error ? err.message : String(err) }, method);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
res.destroy();
|
|
271
|
+
}
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (!res.headersSent)
|
|
276
|
+
(0, static_1.sendJson)(res, 404, { error: `No such endpoint: ${url.pathname}` }, method);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const requested = url.pathname === '/' ? '/index.html' : url.pathname;
|
|
280
|
+
const file = (0, security_1.resolveStaticAsset)(deps.viewerDir, requested);
|
|
281
|
+
if (file) {
|
|
282
|
+
(0, static_1.sendFile)(res, file, { rootDir: deps.viewerDir, method });
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
if ((0, static_1.shouldFallBackToIndex)(url.pathname)) {
|
|
286
|
+
(0, static_1.sendFile)(res, deps.indexHtml, { rootDir: deps.viewerDir, method });
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
(0, static_1.sendText)(res, 404, 'Not found', method);
|
|
290
|
+
}
|
|
291
|
+
/** `path.resolve` + symlink resolution, falling back when the path is missing. */
|
|
292
|
+
function realpath(dir) {
|
|
293
|
+
const resolved = path.resolve(dir);
|
|
294
|
+
try {
|
|
295
|
+
return fs.realpathSync(resolved);
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
return resolved;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Bound and de-fang an attacker-supplied header before echoing it back.
|
|
303
|
+
*
|
|
304
|
+
* The refused `Host` is worth showing — a human hitting this through a proxy or
|
|
305
|
+
* a container hostname needs to know what was actually sent. But it is
|
|
306
|
+
* attacker-chosen text, so it goes out truncated and stripped of control bytes.
|
|
307
|
+
* (The response is `text/plain` + `nosniff`, so there is nothing to inject
|
|
308
|
+
* into; this is belt and braces.)
|
|
309
|
+
*/
|
|
310
|
+
function forEcho(value) {
|
|
311
|
+
if (!value)
|
|
312
|
+
return '(none)';
|
|
313
|
+
// eslint-disable-next-line no-control-regex -- stripping raw control bytes IS the point
|
|
314
|
+
const clean = value.replace(/[\x00-\x1f\x7f]/g, '?');
|
|
315
|
+
return clean.length > 100 ? `${clean.slice(0, 100)}…` : clean;
|
|
316
|
+
}
|
|
317
|
+
/** Read a header as a single string (node gives arrays for some headers). */
|
|
318
|
+
function readHeader(req, name) {
|
|
319
|
+
const value = req.headers[name];
|
|
320
|
+
if (value === undefined)
|
|
321
|
+
return undefined;
|
|
322
|
+
return Array.isArray(value) ? value[0] : value;
|
|
323
|
+
}
|
|
324
|
+
/** Percent-decode for display; the raw value is used for anything security-relevant. */
|
|
325
|
+
function safeDecode(value) {
|
|
326
|
+
try {
|
|
327
|
+
return decodeURIComponent(value);
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return value;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Bind the first free port at or after `port`, on loopback only.
|
|
335
|
+
*
|
|
336
|
+
* Only `EADDRINUSE` advances to the next port — a permission failure or a bad
|
|
337
|
+
* address will not get better one port over, and retrying twenty times would
|
|
338
|
+
* only bury the real error.
|
|
339
|
+
*/
|
|
340
|
+
async function listenWithFallback(server, opts) {
|
|
341
|
+
// Port 0 means "any free port", so there is nothing to fall back from.
|
|
342
|
+
const attempts = opts.port === 0 || !opts.fallback ? 1 : Math.max(1, opts.attempts);
|
|
343
|
+
for (let i = 0; i < attempts; i++) {
|
|
344
|
+
const candidate = opts.port === 0 ? 0 : opts.port + i;
|
|
345
|
+
try {
|
|
346
|
+
await listenOnce(server, candidate);
|
|
347
|
+
const address = server.address();
|
|
348
|
+
if (address === null || typeof address === 'string') {
|
|
349
|
+
throw new Error('The UI server bound to an unexpected address.');
|
|
350
|
+
}
|
|
351
|
+
return address.port;
|
|
352
|
+
}
|
|
353
|
+
catch (err) {
|
|
354
|
+
const code = err.code;
|
|
355
|
+
if (code !== 'EADDRINUSE' || i === attempts - 1) {
|
|
356
|
+
throw describeBindFailure(err, candidate, opts);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
/* istanbul ignore next — the loop either returns or throws */
|
|
361
|
+
throw new Error('The UI server could not bind a port.');
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* One `listen()` attempt, with both outcomes as a promise.
|
|
365
|
+
*
|
|
366
|
+
* The same `http.Server` is reused across attempts: a `listen()` that failed
|
|
367
|
+
* with EADDRINUSE never took a handle, so it can be listened on again directly
|
|
368
|
+
* (verified on Node 20 and 22 — `server.listening` is still `false` afterwards,
|
|
369
|
+
* and `close()` on a never-listening server would itself throw).
|
|
370
|
+
*/
|
|
371
|
+
function listenOnce(server, port) {
|
|
372
|
+
return new Promise((resolve, reject) => {
|
|
373
|
+
const onError = (err) => {
|
|
374
|
+
server.removeListener('listening', onListening);
|
|
375
|
+
reject(err);
|
|
376
|
+
};
|
|
377
|
+
const onListening = () => {
|
|
378
|
+
server.removeListener('error', onError);
|
|
379
|
+
resolve();
|
|
380
|
+
};
|
|
381
|
+
server.once('error', onError);
|
|
382
|
+
server.once('listening', onListening);
|
|
383
|
+
server.listen(port, constants_1.LOOPBACK_ADDRESS);
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
/** Turn a bind failure into something a user can act on. */
|
|
387
|
+
function describeBindFailure(err, port, opts) {
|
|
388
|
+
const code = err.code;
|
|
389
|
+
if (code === 'EADDRINUSE') {
|
|
390
|
+
return opts.fallback
|
|
391
|
+
? new Error(`Ports ${opts.port}–${port} are all in use. Free one, or pick another with --port.`)
|
|
392
|
+
: new Error(`Port ${port} is already in use. Pick another with --port, or omit --port to let CodeGraph find a free one.`);
|
|
393
|
+
}
|
|
394
|
+
if (code === 'EACCES') {
|
|
395
|
+
return new Error(`Not allowed to listen on port ${port}. Ports below 1024 usually need elevated privileges — pick a higher one with --port.`);
|
|
396
|
+
}
|
|
397
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui-server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opening the user's browser at the viewer URL.
|
|
3
|
+
*
|
|
4
|
+
* No dependency: the three platform openers are one-liners, and pulling in a
|
|
5
|
+
* package to shell out to `open` would be the only runtime dependency the
|
|
6
|
+
* viewer adds to a CLI that currently has ten.
|
|
7
|
+
*/
|
|
8
|
+
import { BROWSER_ENV } from './constants';
|
|
9
|
+
export { BROWSER_ENV };
|
|
10
|
+
export interface OpenCommand {
|
|
11
|
+
command: string;
|
|
12
|
+
args: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The command that would open `url`, or `null` when opening is suppressed.
|
|
16
|
+
*
|
|
17
|
+
* Split out from {@link openBrowser} so the platform mapping is testable
|
|
18
|
+
* without launching anything.
|
|
19
|
+
*/
|
|
20
|
+
export declare function browserOpenCommand(url: string, platform: NodeJS.Platform, override?: string): OpenCommand | null;
|
|
21
|
+
/**
|
|
22
|
+
* Open `url` in the user's default browser, best effort.
|
|
23
|
+
*
|
|
24
|
+
* Never throws and never keeps the CLI alive: the child is detached and
|
|
25
|
+
* unref'd, and a missing opener (a headless Linux box with no `xdg-open`) is
|
|
26
|
+
* swallowed — the URL is already printed, which is the part that matters.
|
|
27
|
+
*
|
|
28
|
+
* @returns `true` if a launch was attempted.
|
|
29
|
+
*/
|
|
30
|
+
export declare function openBrowser(url: string, platform?: NodeJS.Platform): boolean;
|
|
31
|
+
//# sourceMappingURL=open-browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-browser.d.ts","sourceRoot":"","sources":["../../src/ui-server/open-browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,CAAC;AAIvB,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,QAAQ,CAAC,EAAE,MAAM,GAChB,WAAW,GAAG,IAAI,CAsBpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,OAAO,CAkB9F"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Opening the user's browser at the viewer URL.
|
|
4
|
+
*
|
|
5
|
+
* No dependency: the three platform openers are one-liners, and pulling in a
|
|
6
|
+
* package to shell out to `open` would be the only runtime dependency the
|
|
7
|
+
* viewer adds to a CLI that currently has ten.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.BROWSER_ENV = void 0;
|
|
11
|
+
exports.browserOpenCommand = browserOpenCommand;
|
|
12
|
+
exports.openBrowser = openBrowser;
|
|
13
|
+
const child_process_1 = require("child_process");
|
|
14
|
+
const constants_1 = require("./constants");
|
|
15
|
+
Object.defineProperty(exports, "BROWSER_ENV", { enumerable: true, get: function () { return constants_1.BROWSER_ENV; } });
|
|
16
|
+
const SUPPRESS_VALUES = new Set(['', 'none', '0', 'false', 'off']);
|
|
17
|
+
/**
|
|
18
|
+
* The command that would open `url`, or `null` when opening is suppressed.
|
|
19
|
+
*
|
|
20
|
+
* Split out from {@link openBrowser} so the platform mapping is testable
|
|
21
|
+
* without launching anything.
|
|
22
|
+
*/
|
|
23
|
+
function browserOpenCommand(url, platform, override) {
|
|
24
|
+
if (override !== undefined) {
|
|
25
|
+
const trimmed = override.trim();
|
|
26
|
+
if (SUPPRESS_VALUES.has(trimmed.toLowerCase()))
|
|
27
|
+
return null;
|
|
28
|
+
// Windows: go through `cmd /c` rather than spawning the override directly.
|
|
29
|
+
// `spawn` there is CreateProcess, which only ever launches a real .exe — a
|
|
30
|
+
// `.cmd`/`.bat` browser shim (how most Windows wrappers are written) fails
|
|
31
|
+
// outright, and an extension-less name only resolves because CreateProcess
|
|
32
|
+
// appends `.exe`. Routing through cmd makes .exe, .cmd and .bat all work,
|
|
33
|
+
// and node quotes each argument, so a path with spaces survives. Caught on
|
|
34
|
+
// the Windows VM, where the direct spawn silently launched nothing.
|
|
35
|
+
if (platform === 'win32')
|
|
36
|
+
return { command: 'cmd', args: ['/c', trimmed, url] };
|
|
37
|
+
return { command: trimmed, args: [url] };
|
|
38
|
+
}
|
|
39
|
+
if (platform === 'darwin')
|
|
40
|
+
return { command: 'open', args: [url] };
|
|
41
|
+
if (platform === 'win32') {
|
|
42
|
+
// `start` is a cmd builtin, not an executable. The empty string is the
|
|
43
|
+
// window title — without it `start` treats a quoted URL as the title and
|
|
44
|
+
// opens a blank console instead.
|
|
45
|
+
return { command: 'cmd', args: ['/c', 'start', '', url] };
|
|
46
|
+
}
|
|
47
|
+
return { command: 'xdg-open', args: [url] };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Open `url` in the user's default browser, best effort.
|
|
51
|
+
*
|
|
52
|
+
* Never throws and never keeps the CLI alive: the child is detached and
|
|
53
|
+
* unref'd, and a missing opener (a headless Linux box with no `xdg-open`) is
|
|
54
|
+
* swallowed — the URL is already printed, which is the part that matters.
|
|
55
|
+
*
|
|
56
|
+
* @returns `true` if a launch was attempted.
|
|
57
|
+
*/
|
|
58
|
+
function openBrowser(url, platform = process.platform) {
|
|
59
|
+
const open = browserOpenCommand(url, platform, process.env[constants_1.BROWSER_ENV]);
|
|
60
|
+
if (!open)
|
|
61
|
+
return false;
|
|
62
|
+
try {
|
|
63
|
+
const child = (0, child_process_1.spawn)(open.command, open.args, {
|
|
64
|
+
detached: true,
|
|
65
|
+
stdio: 'ignore',
|
|
66
|
+
// `start` is a shell builtin reached through `cmd /c`, so no shell here.
|
|
67
|
+
shell: false,
|
|
68
|
+
});
|
|
69
|
+
child.on('error', () => {
|
|
70
|
+
/* no opener installed — the printed URL is the fallback */
|
|
71
|
+
});
|
|
72
|
+
child.unref();
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=open-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-browser.js","sourceRoot":"","sources":["../../src/ui-server/open-browser.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAoBH,gDA0BC;AAWD,kCAkBC;AAzED,iDAAsC;AACtC,2CAA0C;AAEjC,4FAFA,uBAAW,OAEA;AAEpB,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAOxF;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,GAAW,EACX,QAAyB,EACzB,QAAiB;IAEjB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5D,2EAA2E;QAC3E,2EAA2E;QAC3E,2EAA2E;QAC3E,2EAA2E;QAC3E,0EAA0E;QAC1E,2EAA2E;QAC3E,oEAAoE;QACpE,IAAI,QAAQ,KAAK,OAAO;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;QAChF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACnE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,uEAAuE;QACvE,yEAAyE;QACzE,iCAAiC;QACjC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,WAAW,CAAC,GAAW,EAAE,WAA4B,OAAO,CAAC,QAAQ;IACnF,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAW,CAAC,CAAC,CAAC;IACzE,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YAC3C,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,yEAAyE;YACzE,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,2DAA2D;QAC7D,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `cg ui` server's security boundary.
|
|
3
|
+
*
|
|
4
|
+
* Threat model, stated plainly: this process serves a browser-readable view of
|
|
5
|
+
* the user's SOURCE CODE from a port on their machine. It binds loopback, so
|
|
6
|
+
* nothing on the network can reach it. That leaves one realistic attack —
|
|
7
|
+
* **DNS rebinding**: any page the user visits can point `evil.example` at
|
|
8
|
+
* `127.0.0.1` and then have the browser issue same-origin requests to us. The
|
|
9
|
+
* browser will happily connect; the only thing that distinguishes the attacker's
|
|
10
|
+
* request from the viewer's own is the `Host` header, which the browser fills in
|
|
11
|
+
* from the URL and script cannot forge.
|
|
12
|
+
*
|
|
13
|
+
* So the rules are:
|
|
14
|
+
*
|
|
15
|
+
* - **`Host` must be a loopback name** (`localhost`, `127.0.0.1`, `[::1]`) and,
|
|
16
|
+
* if it carries a port, that port must be ours. Anything else is 403.
|
|
17
|
+
* - **`Origin`, when present, must be loopback too.** Belt and braces: absent on
|
|
18
|
+
* the viewer's own same-origin GETs, and present-and-foreign only on a
|
|
19
|
+
* cross-site request we want nothing to do with.
|
|
20
|
+
* - **No CORS headers, ever.** Not adding `Access-Control-Allow-Origin` is what
|
|
21
|
+
* keeps a cross-origin reader from seeing a response body even if it does
|
|
22
|
+
* reach us. There is deliberately no way to turn this on.
|
|
23
|
+
* - **GET/HEAD everywhere; POST/DELETE only under `/api/`, and only for a
|
|
24
|
+
* request that could not have been forged by a form.** See
|
|
25
|
+
* {@link isWriteRequest} below — the viewer went from a pure reader to one
|
|
26
|
+
* that saves trails into `.codegraph/ui/`, and that is the entire change to
|
|
27
|
+
* this boundary.
|
|
28
|
+
* - **Every path resolves through {@link validatePathWithinRoot}** — the same
|
|
29
|
+
* chokepoint the MCP read sinks use, which catches `../` traversal AND
|
|
30
|
+
* in-tree symlinks pointing out of the root (#527).
|
|
31
|
+
*/
|
|
32
|
+
import { PathRefusalError } from '../errors';
|
|
33
|
+
export { PathRefusalError };
|
|
34
|
+
/** Methods that answer anywhere: the viewer's assets and every read endpoint. */
|
|
35
|
+
export declare const READ_METHODS: readonly string[];
|
|
36
|
+
/**
|
|
37
|
+
* Methods that answer under `/api/` only, and only for a request carrying
|
|
38
|
+
* {@link WRITE_HEADER}. The viewer's one write is a saved trail.
|
|
39
|
+
*/
|
|
40
|
+
export declare const WRITE_METHODS: readonly string[];
|
|
41
|
+
/** HTTP methods the viewer server answers at all. Everything else is 405. */
|
|
42
|
+
export declare const ALLOWED_METHODS: readonly string[];
|
|
43
|
+
/**
|
|
44
|
+
* The header a write has to carry.
|
|
45
|
+
*
|
|
46
|
+
* Belt and braces behind the `Host` and `Origin` checks, and worth the two
|
|
47
|
+
* lines because it fails *differently*: a custom request header cannot be sent
|
|
48
|
+
* cross-origin without a CORS preflight, and this server answers no preflight
|
|
49
|
+
* and sends no `Access-Control-*` header, so the browser never issues the real
|
|
50
|
+
* request. That closes the one shape those checks lean on a header for — a
|
|
51
|
+
* `<form method="post">` submitted from another page, which sends no `Origin`
|
|
52
|
+
* in some older browsers and cannot set a custom header in any of them.
|
|
53
|
+
*/
|
|
54
|
+
export declare const WRITE_HEADER = "x-codegraph-ui";
|
|
55
|
+
export declare function isWriteMethod(method: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Whether a mutating request is one the viewer could have made.
|
|
58
|
+
*
|
|
59
|
+
* @param method the request method, already known to be a write method
|
|
60
|
+
* @param pathname the raw request path
|
|
61
|
+
* @param headers `x-codegraph-ui` and, for a body-carrying method, `content-type`
|
|
62
|
+
*/
|
|
63
|
+
export declare function isWriteRequest(pathname: string, headers: {
|
|
64
|
+
marker: string | undefined;
|
|
65
|
+
contentType: string | undefined;
|
|
66
|
+
}): {
|
|
67
|
+
ok: true;
|
|
68
|
+
} | {
|
|
69
|
+
ok: false;
|
|
70
|
+
reason: string;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Whether a request's `Host` header names this loopback server.
|
|
74
|
+
*
|
|
75
|
+
* A missing `Host` is rejected: HTTP/1.1 requires it, and the one client that
|
|
76
|
+
* may legally omit it (HTTP/1.0) is not a browser we need to serve.
|
|
77
|
+
*/
|
|
78
|
+
export declare function isAllowedHost(host: string | undefined, port: number): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Whether a request's `Origin` header is acceptable.
|
|
81
|
+
*
|
|
82
|
+
* An ABSENT `Origin` is allowed — browsers omit it on same-origin GETs, which
|
|
83
|
+
* is every request the viewer makes. A present one must be loopback-on-our-port;
|
|
84
|
+
* the literal `null` origin (sandboxed iframe, `file://` page) is refused.
|
|
85
|
+
*/
|
|
86
|
+
export declare function isAllowedOrigin(origin: string | undefined, port: number): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Whether a raw request path is worth resolving at all.
|
|
89
|
+
*
|
|
90
|
+
* Rejects any `..` segment outright rather than letting containment sort it
|
|
91
|
+
* out later. Containment WOULD catch it — but the SPA fallback sits behind
|
|
92
|
+
* containment, so `GET /../../etc/passwd` would otherwise be answered with the
|
|
93
|
+
* app shell (a 200) instead of the 404 a traversal attempt deserves. Nothing
|
|
94
|
+
* outside the root leaks either way; this just stops the server from
|
|
95
|
+
* pretending a hostile path was an ordinary route.
|
|
96
|
+
*
|
|
97
|
+
* Takes the RAW path from `req.url`, before WHATWG URL parsing folds `..`
|
|
98
|
+
* segments away — that folding is what would hide the attempt.
|
|
99
|
+
*/
|
|
100
|
+
export declare function isSafeRequestPath(rawPath: string): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Resolve a request path to a file inside the static asset root.
|
|
103
|
+
*
|
|
104
|
+
* Returns the absolute path, or `null` for anything that is not a readable file
|
|
105
|
+
* inside `rootDir` — a traversal attempt, a symlink escape, a directory, a
|
|
106
|
+
* missing file. Callers turn `null` into a 404 (never a 403): telling a prober
|
|
107
|
+
* which of those it hit is free information.
|
|
108
|
+
*
|
|
109
|
+
* Percent-decoding happens HERE, before containment is checked, so an encoded
|
|
110
|
+
* `..%2f` is caught by the same guard as a literal `../`.
|
|
111
|
+
*/
|
|
112
|
+
export declare function resolveStaticAsset(rootDir: string, urlPath: string): string | null;
|
|
113
|
+
/**
|
|
114
|
+
* Resolve a project-relative source path to an absolute path that is safe to
|
|
115
|
+
* read and hand to the browser.
|
|
116
|
+
*
|
|
117
|
+
* This is the single read chokepoint for anything served OUT OF THE USER'S
|
|
118
|
+
* REPOSITORY (as opposed to the viewer's own bundled assets). The JSON API
|
|
119
|
+
* built on top of this server must route every file read through it — that is
|
|
120
|
+
* what keeps `/api/source?path=../../.ssh/id_rsa` from being a credential leak
|
|
121
|
+
* over a port the user opened to read their own code.
|
|
122
|
+
*
|
|
123
|
+
* @throws {PathRefusalError} when the root is a sensitive system directory, or
|
|
124
|
+
* the path escapes the root by traversal or symlink.
|
|
125
|
+
*/
|
|
126
|
+
export declare function resolveProjectFile(projectRoot: string, relativePath: string): string;
|
|
127
|
+
//# sourceMappingURL=security.d.ts.map
|