trail-code 0.0.0-stage → 0.28.0-semantic.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +567 -2
- package/dist/ai/crux.d.ts +88 -0
- package/dist/ai/crux.d.ts.map +1 -0
- package/dist/ai/crux.js +219 -0
- package/dist/ai/crux.js.map +1 -0
- package/dist/ai/failure.d.ts +60 -0
- package/dist/ai/failure.d.ts.map +1 -0
- package/dist/ai/failure.js +86 -0
- package/dist/ai/failure.js.map +1 -0
- package/dist/ai/llm/anthropic.d.ts +37 -0
- package/dist/ai/llm/anthropic.d.ts.map +1 -0
- package/dist/ai/llm/anthropic.js +144 -0
- package/dist/ai/llm/anthropic.js.map +1 -0
- package/dist/ai/llm/factory.d.ts +28 -0
- package/dist/ai/llm/factory.d.ts.map +1 -0
- package/dist/ai/llm/factory.js +36 -0
- package/dist/ai/llm/factory.js.map +1 -0
- package/dist/ai/llm/litellm.d.ts +34 -0
- package/dist/ai/llm/litellm.d.ts.map +1 -0
- package/dist/ai/llm/litellm.js +45 -0
- package/dist/ai/llm/litellm.js.map +1 -0
- package/dist/ai/llm/openai.d.ts +145 -0
- package/dist/ai/llm/openai.d.ts.map +1 -0
- package/dist/ai/llm/openai.js +629 -0
- package/dist/ai/llm/openai.js.map +1 -0
- package/dist/ai/llm/orcarouter.d.ts +34 -0
- package/dist/ai/llm/orcarouter.d.ts.map +1 -0
- package/dist/ai/llm/orcarouter.js +45 -0
- package/dist/ai/llm/orcarouter.js.map +1 -0
- package/dist/ai/llm/recover-tool.d.ts +21 -0
- package/dist/ai/llm/recover-tool.d.ts.map +1 -0
- package/dist/ai/llm/recover-tool.js +109 -0
- package/dist/ai/llm/recover-tool.js.map +1 -0
- package/dist/ai/llm/types.d.ts +122 -0
- package/dist/ai/llm/types.d.ts.map +1 -0
- package/dist/ai/llm/types.js +33 -0
- package/dist/ai/llm/types.js.map +1 -0
- package/dist/ai/providers.d.ts +59 -0
- package/dist/ai/providers.d.ts.map +1 -0
- package/dist/ai/providers.js +54 -0
- package/dist/ai/providers.js.map +1 -0
- package/dist/ai/summarize.d.ts +25 -0
- package/dist/ai/summarize.d.ts.map +1 -0
- package/dist/ai/summarize.js +34 -0
- package/dist/ai/summarize.js.map +1 -0
- package/dist/ai/synthesize.d.ts +40 -0
- package/dist/ai/synthesize.d.ts.map +1 -0
- package/dist/ai/synthesize.js +230 -0
- package/dist/ai/synthesize.js.map +1 -0
- package/dist/ask/ask.d.ts +199 -0
- package/dist/ask/ask.d.ts.map +1 -0
- package/dist/ask/ask.js +1291 -0
- package/dist/ask/ask.js.map +1 -0
- package/dist/ask/file-rank.d.ts +72 -0
- package/dist/ask/file-rank.d.ts.map +1 -0
- package/dist/ask/file-rank.js +160 -0
- package/dist/ask/file-rank.js.map +1 -0
- package/dist/ask/file-selection.d.ts +22 -0
- package/dist/ask/file-selection.d.ts.map +1 -0
- package/dist/ask/file-selection.js +66 -0
- package/dist/ask/file-selection.js.map +1 -0
- package/dist/ask/fuse.d.ts +195 -0
- package/dist/ask/fuse.d.ts.map +1 -0
- package/dist/ask/fuse.js +344 -0
- package/dist/ask/fuse.js.map +1 -0
- package/dist/ask/graphrank.d.ts +61 -0
- package/dist/ask/graphrank.d.ts.map +1 -0
- package/dist/ask/graphrank.js +130 -0
- package/dist/ask/graphrank.js.map +1 -0
- package/dist/ask/index-file.d.ts +44 -0
- package/dist/ask/index-file.d.ts.map +1 -0
- package/dist/ask/index-file.js +128 -0
- package/dist/ask/index-file.js.map +1 -0
- package/dist/ask/semantic.d.ts +42 -0
- package/dist/ask/semantic.d.ts.map +1 -0
- package/dist/ask/semantic.js +293 -0
- package/dist/ask/semantic.js.map +1 -0
- package/dist/bin/graft.d.ts +3 -0
- package/dist/bin/graft.d.ts.map +1 -0
- package/dist/bin/graft.js +14 -0
- package/dist/bin/graft.js.map +1 -0
- package/dist/bin/trail.d.ts +3 -0
- package/dist/bin/trail.d.ts.map +1 -0
- package/dist/bin/trail.js +13 -0
- package/dist/bin/trail.js.map +1 -0
- package/dist/blast/blast-cli.d.ts +35 -0
- package/dist/blast/blast-cli.d.ts.map +1 -0
- package/dist/blast/blast-cli.js +155 -0
- package/dist/blast/blast-cli.js.map +1 -0
- package/dist/blast/blast.d.ts +128 -0
- package/dist/blast/blast.d.ts.map +1 -0
- package/dist/blast/blast.js +383 -0
- package/dist/blast/blast.js.map +1 -0
- package/dist/blast/diff.d.ts +53 -0
- package/dist/blast/diff.d.ts.map +1 -0
- package/dist/blast/diff.js +193 -0
- package/dist/blast/diff.js.map +1 -0
- package/dist/blast/evidence.d.ts +51 -0
- package/dist/blast/evidence.d.ts.map +1 -0
- package/dist/blast/evidence.js +162 -0
- package/dist/blast/evidence.js.map +1 -0
- package/dist/blast/modules.d.ts +33 -0
- package/dist/blast/modules.d.ts.map +1 -0
- package/dist/blast/modules.js +83 -0
- package/dist/blast/modules.js.map +1 -0
- package/dist/blast/name.d.ts +74 -0
- package/dist/blast/name.d.ts.map +1 -0
- package/dist/blast/name.js +269 -0
- package/dist/blast/name.js.map +1 -0
- package/dist/blast/owners.d.ts +85 -0
- package/dist/blast/owners.d.ts.map +1 -0
- package/dist/blast/owners.js +272 -0
- package/dist/blast/owners.js.map +1 -0
- package/dist/blast/render.d.ts +46 -0
- package/dist/blast/render.d.ts.map +1 -0
- package/dist/blast/render.js +422 -0
- package/dist/blast/render.js.map +1 -0
- package/dist/blast/viz.d.ts +37 -0
- package/dist/blast/viz.d.ts.map +1 -0
- package/dist/blast/viz.js +180 -0
- package/dist/blast/viz.js.map +1 -0
- package/dist/brand.d.ts +111 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +282 -0
- package/dist/brand.js.map +1 -0
- package/dist/claude/build-progress.d.ts +30 -0
- package/dist/claude/build-progress.d.ts.map +1 -0
- package/dist/claude/build-progress.js +81 -0
- package/dist/claude/build-progress.js.map +1 -0
- package/dist/claude/hermes-skill-template.d.ts +16 -0
- package/dist/claude/hermes-skill-template.d.ts.map +1 -0
- package/dist/claude/hermes-skill-template.js +154 -0
- package/dist/claude/hermes-skill-template.js.map +1 -0
- package/dist/claude/init.d.ts +65 -0
- package/dist/claude/init.d.ts.map +1 -0
- package/dist/claude/init.js +258 -0
- package/dist/claude/init.js.map +1 -0
- package/dist/claude/paths.d.ts +9 -0
- package/dist/claude/paths.d.ts.map +1 -0
- package/dist/claude/paths.js +22 -0
- package/dist/claude/paths.js.map +1 -0
- package/dist/claude/session-metrics.d.ts +73 -0
- package/dist/claude/session-metrics.d.ts.map +1 -0
- package/dist/claude/session-metrics.js +209 -0
- package/dist/claude/session-metrics.js.map +1 -0
- package/dist/claude/settings-merge.d.ts +76 -0
- package/dist/claude/settings-merge.d.ts.map +1 -0
- package/dist/claude/settings-merge.js +283 -0
- package/dist/claude/settings-merge.js.map +1 -0
- package/dist/claude/skill-template.d.ts +13 -0
- package/dist/claude/skill-template.d.ts.map +1 -0
- package/dist/claude/skill-template.js +290 -0
- package/dist/claude/skill-template.js.map +1 -0
- package/dist/claude/state.d.ts +85 -0
- package/dist/claude/state.d.ts.map +1 -0
- package/dist/claude/state.js +88 -0
- package/dist/claude/state.js.map +1 -0
- package/dist/claude/stats.d.ts +5 -0
- package/dist/claude/stats.d.ts.map +1 -0
- package/dist/claude/stats.js +24 -0
- package/dist/claude/stats.js.map +1 -0
- package/dist/cli-epilogue.d.ts +12 -0
- package/dist/cli-epilogue.d.ts.map +1 -0
- package/dist/cli-epilogue.js +72 -0
- package/dist/cli-epilogue.js.map +1 -0
- package/dist/cli-meta.d.ts +82 -0
- package/dist/cli-meta.d.ts.map +1 -0
- package/dist/cli-meta.js +238 -0
- package/dist/cli-meta.js.map +1 -0
- package/dist/cli-picker.d.ts +139 -0
- package/dist/cli-picker.d.ts.map +1 -0
- package/dist/cli-picker.js +439 -0
- package/dist/cli-picker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1638 -0
- package/dist/cli.js.map +1 -0
- package/dist/context/batches.d.ts +29 -0
- package/dist/context/batches.d.ts.map +1 -0
- package/dist/context/batches.js +130 -0
- package/dist/context/batches.js.map +1 -0
- package/dist/context/build.d.ts +57 -0
- package/dist/context/build.d.ts.map +1 -0
- package/dist/context/build.js +396 -0
- package/dist/context/build.js.map +1 -0
- package/dist/context/check.d.ts +42 -0
- package/dist/context/check.d.ts.map +1 -0
- package/dist/context/check.js +162 -0
- package/dist/context/check.js.map +1 -0
- package/dist/context/map-dir.d.ts +13 -0
- package/dist/context/map-dir.d.ts.map +1 -0
- package/dist/context/map-dir.js +81 -0
- package/dist/context/map-dir.js.map +1 -0
- package/dist/context/node-file.d.ts +109 -0
- package/dist/context/node-file.d.ts.map +1 -0
- package/dist/context/node-file.js +390 -0
- package/dist/context/node-file.js.map +1 -0
- package/dist/context/price.d.ts +49 -0
- package/dist/context/price.d.ts.map +1 -0
- package/dist/context/price.js +83 -0
- package/dist/context/price.js.map +1 -0
- package/dist/context/savings.d.ts +67 -0
- package/dist/context/savings.d.ts.map +1 -0
- package/dist/context/savings.js +125 -0
- package/dist/context/savings.js.map +1 -0
- package/dist/engine.d.ts +85 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +122 -0
- package/dist/engine.js.map +1 -0
- package/dist/graph/bindings.d.ts +64 -0
- package/dist/graph/bindings.d.ts.map +1 -0
- package/dist/graph/bindings.js +713 -0
- package/dist/graph/bindings.js.map +1 -0
- package/dist/graph/build-run.d.ts +25 -0
- package/dist/graph/build-run.d.ts.map +1 -0
- package/dist/graph/build-run.js +121 -0
- package/dist/graph/build-run.js.map +1 -0
- package/dist/graph/build.d.ts +88 -0
- package/dist/graph/build.d.ts.map +1 -0
- package/dist/graph/build.js +386 -0
- package/dist/graph/build.js.map +1 -0
- package/dist/graph/cards.d.ts +46 -0
- package/dist/graph/cards.d.ts.map +1 -0
- package/dist/graph/cards.js +280 -0
- package/dist/graph/cards.js.map +1 -0
- package/dist/graph/check.d.ts +25 -0
- package/dist/graph/check.d.ts.map +1 -0
- package/dist/graph/check.js +192 -0
- package/dist/graph/check.js.map +1 -0
- package/dist/graph/container.d.ts +63 -0
- package/dist/graph/container.d.ts.map +1 -0
- package/dist/graph/container.js +191 -0
- package/dist/graph/container.js.map +1 -0
- package/dist/graph/depth-parser.d.ts +61 -0
- package/dist/graph/depth-parser.d.ts.map +1 -0
- package/dist/graph/depth-parser.js +153 -0
- package/dist/graph/depth-parser.js.map +1 -0
- package/dist/graph/enrich.d.ts +62 -0
- package/dist/graph/enrich.d.ts.map +1 -0
- package/dist/graph/enrich.js +258 -0
- package/dist/graph/enrich.js.map +1 -0
- package/dist/graph/extract-cache.d.ts +101 -0
- package/dist/graph/extract-cache.d.ts.map +1 -0
- package/dist/graph/extract-cache.js +199 -0
- package/dist/graph/extract-cache.js.map +1 -0
- package/dist/graph/extract.d.ts +85 -0
- package/dist/graph/extract.d.ts.map +1 -0
- package/dist/graph/extract.js +2377 -0
- package/dist/graph/extract.js.map +1 -0
- package/dist/graph/fingerprint.d.ts +76 -0
- package/dist/graph/fingerprint.d.ts.map +1 -0
- package/dist/graph/fingerprint.js +160 -0
- package/dist/graph/fingerprint.js.map +1 -0
- package/dist/graph/generic.d.ts +74 -0
- package/dist/graph/generic.d.ts.map +1 -0
- package/dist/graph/generic.js +773 -0
- package/dist/graph/generic.js.map +1 -0
- package/dist/graph/invariants.d.ts +33 -0
- package/dist/graph/invariants.d.ts.map +1 -0
- package/dist/graph/invariants.js +52 -0
- package/dist/graph/invariants.js.map +1 -0
- package/dist/graph/load.d.ts +29 -0
- package/dist/graph/load.d.ts.map +1 -0
- package/dist/graph/load.js +97 -0
- package/dist/graph/load.js.map +1 -0
- package/dist/graph/lsp/client.d.ts +61 -0
- package/dist/graph/lsp/client.d.ts.map +1 -0
- package/dist/graph/lsp/client.js +217 -0
- package/dist/graph/lsp/client.js.map +1 -0
- package/dist/graph/lsp/enrich.d.ts +11 -0
- package/dist/graph/lsp/enrich.d.ts.map +1 -0
- package/dist/graph/lsp/enrich.js +163 -0
- package/dist/graph/lsp/enrich.js.map +1 -0
- package/dist/graph/lsp/registry.d.ts +22 -0
- package/dist/graph/lsp/registry.d.ts.map +1 -0
- package/dist/graph/lsp/registry.js +71 -0
- package/dist/graph/lsp/registry.js.map +1 -0
- package/dist/graph/map.d.ts +107 -0
- package/dist/graph/map.d.ts.map +1 -0
- package/dist/graph/map.js +239 -0
- package/dist/graph/map.js.map +1 -0
- package/dist/graph/markdown.d.ts +22 -0
- package/dist/graph/markdown.d.ts.map +1 -0
- package/dist/graph/markdown.js +143 -0
- package/dist/graph/markdown.js.map +1 -0
- package/dist/graph/native.d.ts +46 -0
- package/dist/graph/native.d.ts.map +1 -0
- package/dist/graph/native.js +169 -0
- package/dist/graph/native.js.map +1 -0
- package/dist/graph/queries/c.scm +13 -0
- package/dist/graph/queries/c_sharp.scm +19 -0
- package/dist/graph/queries/clojure.scm +58 -0
- package/dist/graph/queries/cpp.scm +23 -0
- package/dist/graph/queries/dart.scm +42 -0
- package/dist/graph/queries/elixir.scm +54 -0
- package/dist/graph/queries/gleam.scm +51 -0
- package/dist/graph/queries/java.scm +20 -0
- package/dist/graph/queries/kotlin.scm +43 -0
- package/dist/graph/queries/lua.scm +36 -0
- package/dist/graph/queries/nix.scm +32 -0
- package/dist/graph/queries/php.scm +40 -0
- package/dist/graph/queries/ruby.scm +65 -0
- package/dist/graph/queries/rust.scm +41 -0
- package/dist/graph/queries/scala.scm +66 -0
- package/dist/graph/queries/solidity.scm +43 -0
- package/dist/graph/queries/swift.scm +51 -0
- package/dist/graph/refresh.d.ts +106 -0
- package/dist/graph/refresh.d.ts.map +1 -0
- package/dist/graph/refresh.js +430 -0
- package/dist/graph/refresh.js.map +1 -0
- package/dist/graph/relations.d.ts +14 -0
- package/dist/graph/relations.d.ts.map +1 -0
- package/dist/graph/relations.js +8 -0
- package/dist/graph/relations.js.map +1 -0
- package/dist/graph/resolve.d.ts +17 -0
- package/dist/graph/resolve.d.ts.map +1 -0
- package/dist/graph/resolve.js +716 -0
- package/dist/graph/resolve.js.map +1 -0
- package/dist/graph/root.d.ts +11 -0
- package/dist/graph/root.d.ts.map +1 -0
- package/dist/graph/root.js +40 -0
- package/dist/graph/root.js.map +1 -0
- package/dist/graph/scopes.d.ts +40 -0
- package/dist/graph/scopes.d.ts.map +1 -0
- package/dist/graph/scopes.js +383 -0
- package/dist/graph/scopes.js.map +1 -0
- package/dist/graph/seed.d.ts +38 -0
- package/dist/graph/seed.d.ts.map +1 -0
- package/dist/graph/seed.js +229 -0
- package/dist/graph/seed.js.map +1 -0
- package/dist/graph/source-files.d.ts +46 -0
- package/dist/graph/source-files.d.ts.map +1 -0
- package/dist/graph/source-files.js +118 -0
- package/dist/graph/source-files.js.map +1 -0
- package/dist/graph/traverse-cli.d.ts +55 -0
- package/dist/graph/traverse-cli.d.ts.map +1 -0
- package/dist/graph/traverse-cli.js +189 -0
- package/dist/graph/traverse-cli.js.map +1 -0
- package/dist/graph/traverse.d.ts +112 -0
- package/dist/graph/traverse.d.ts.map +1 -0
- package/dist/graph/traverse.js +192 -0
- package/dist/graph/traverse.js.map +1 -0
- package/dist/graph/types.d.ts +78 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +14 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/graph/wasm-runtime.d.ts +19 -0
- package/dist/graph/wasm-runtime.d.ts.map +1 -0
- package/dist/graph/wasm-runtime.js +38 -0
- package/dist/graph/wasm-runtime.js.map +1 -0
- package/dist/graph/workspace-cli.d.ts +56 -0
- package/dist/graph/workspace-cli.d.ts.map +1 -0
- package/dist/graph/workspace-cli.js +111 -0
- package/dist/graph/workspace-cli.js.map +1 -0
- package/dist/graph/workspace.d.ts +172 -0
- package/dist/graph/workspace.d.ts.map +1 -0
- package/dist/graph/workspace.js +714 -0
- package/dist/graph/workspace.js.map +1 -0
- package/dist/graph/write.d.ts +13 -0
- package/dist/graph/write.d.ts.map +1 -0
- package/dist/graph/write.js +86 -0
- package/dist/graph/write.js.map +1 -0
- package/dist/hosts/antigravity.d.ts +14 -0
- package/dist/hosts/antigravity.d.ts.map +1 -0
- package/dist/hosts/antigravity.js +59 -0
- package/dist/hosts/antigravity.js.map +1 -0
- package/dist/hosts/auto.d.ts +37 -0
- package/dist/hosts/auto.d.ts.map +1 -0
- package/dist/hosts/auto.js +141 -0
- package/dist/hosts/auto.js.map +1 -0
- package/dist/hosts/claude-global.d.ts +72 -0
- package/dist/hosts/claude-global.d.ts.map +1 -0
- package/dist/hosts/claude-global.js +230 -0
- package/dist/hosts/claude-global.js.map +1 -0
- package/dist/hosts/config-write.d.ts +36 -0
- package/dist/hosts/config-write.d.ts.map +1 -0
- package/dist/hosts/config-write.js +64 -0
- package/dist/hosts/config-write.js.map +1 -0
- package/dist/hosts/init.d.ts +28 -0
- package/dist/hosts/init.d.ts.map +1 -0
- package/dist/hosts/init.js +89 -0
- package/dist/hosts/init.js.map +1 -0
- package/dist/hosts/instructions.d.ts +14 -0
- package/dist/hosts/instructions.d.ts.map +1 -0
- package/dist/hosts/instructions.js +95 -0
- package/dist/hosts/instructions.js.map +1 -0
- package/dist/hosts/mcp-config.d.ts +78 -0
- package/dist/hosts/mcp-config.d.ts.map +1 -0
- package/dist/hosts/mcp-config.js +251 -0
- package/dist/hosts/mcp-config.js.map +1 -0
- package/dist/hosts/plan.d.ts +32 -0
- package/dist/hosts/plan.d.ts.map +1 -0
- package/dist/hosts/plan.js +73 -0
- package/dist/hosts/plan.js.map +1 -0
- package/dist/hosts/registry.d.ts +41 -0
- package/dist/hosts/registry.d.ts.map +1 -0
- package/dist/hosts/registry.js +164 -0
- package/dist/hosts/registry.js.map +1 -0
- package/dist/hosts/retract.d.ts +47 -0
- package/dist/hosts/retract.d.ts.map +1 -0
- package/dist/hosts/retract.js +520 -0
- package/dist/hosts/retract.js.map +1 -0
- package/dist/hosts/sections.d.ts +47 -0
- package/dist/hosts/sections.d.ts.map +1 -0
- package/dist/hosts/sections.js +127 -0
- package/dist/hosts/sections.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/fs.d.ts +79 -0
- package/dist/ingest/fs.d.ts.map +1 -0
- package/dist/ingest/fs.js +306 -0
- package/dist/ingest/fs.js.map +1 -0
- package/dist/init-guard.d.ts +16 -0
- package/dist/init-guard.d.ts.map +1 -0
- package/dist/init-guard.js +27 -0
- package/dist/init-guard.js.map +1 -0
- package/dist/mcp/instructions.d.ts +5 -0
- package/dist/mcp/instructions.d.ts.map +1 -0
- package/dist/mcp/instructions.js +64 -0
- package/dist/mcp/instructions.js.map +1 -0
- package/dist/mcp/kept-listing.d.ts +27 -0
- package/dist/mcp/kept-listing.d.ts.map +1 -0
- package/dist/mcp/kept-listing.js +63 -0
- package/dist/mcp/kept-listing.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +147 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tool-names.d.ts +27 -0
- package/dist/mcp/tool-names.d.ts.map +1 -0
- package/dist/mcp/tool-names.js +47 -0
- package/dist/mcp/tool-names.js.map +1 -0
- package/dist/mcp/tools.d.ts +22 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +440 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/node-version.d.ts +15 -0
- package/dist/node-version.d.ts.map +1 -0
- package/dist/node-version.js +23 -0
- package/dist/node-version.js.map +1 -0
- package/dist/search/grep-cli.d.ts +35 -0
- package/dist/search/grep-cli.d.ts.map +1 -0
- package/dist/search/grep-cli.js +115 -0
- package/dist/search/grep-cli.js.map +1 -0
- package/dist/search/grep.d.ts +60 -0
- package/dist/search/grep.d.ts.map +1 -0
- package/dist/search/grep.js +143 -0
- package/dist/search/grep.js.map +1 -0
- package/dist/search/ignored-code.d.ts +9 -0
- package/dist/search/ignored-code.d.ts.map +1 -0
- package/dist/search/ignored-code.js +73 -0
- package/dist/search/ignored-code.js.map +1 -0
- package/dist/search/user-regexp.d.ts +26 -0
- package/dist/search/user-regexp.d.ts.map +1 -0
- package/dist/search/user-regexp.js +150 -0
- package/dist/search/user-regexp.js.map +1 -0
- package/dist/telemetry/contract.d.ts +117 -0
- package/dist/telemetry/contract.d.ts.map +1 -0
- package/dist/telemetry/contract.js +341 -0
- package/dist/telemetry/contract.js.map +1 -0
- package/dist/telemetry/flush.d.ts +21 -0
- package/dist/telemetry/flush.d.ts.map +1 -0
- package/dist/telemetry/flush.js +85 -0
- package/dist/telemetry/flush.js.map +1 -0
- package/dist/telemetry/gate.d.ts +30 -0
- package/dist/telemetry/gate.d.ts.map +1 -0
- package/dist/telemetry/gate.js +81 -0
- package/dist/telemetry/gate.js.map +1 -0
- package/dist/telemetry/identity.d.ts +40 -0
- package/dist/telemetry/identity.d.ts.map +1 -0
- package/dist/telemetry/identity.js +80 -0
- package/dist/telemetry/identity.js.map +1 -0
- package/dist/telemetry/index.d.ts +18 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +16 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/key.d.ts +21 -0
- package/dist/telemetry/key.d.ts.map +1 -0
- package/dist/telemetry/key.js +49 -0
- package/dist/telemetry/key.js.map +1 -0
- package/dist/telemetry/notice.d.ts +19 -0
- package/dist/telemetry/notice.d.ts.map +1 -0
- package/dist/telemetry/notice.js +93 -0
- package/dist/telemetry/notice.js.map +1 -0
- package/dist/telemetry/queue.d.ts +35 -0
- package/dist/telemetry/queue.d.ts.map +1 -0
- package/dist/telemetry/queue.js +162 -0
- package/dist/telemetry/queue.js.map +1 -0
- package/dist/telemetry/send.d.ts +19 -0
- package/dist/telemetry/send.d.ts.map +1 -0
- package/dist/telemetry/send.js +84 -0
- package/dist/telemetry/send.js.map +1 -0
- package/dist/telemetry/sessions.d.ts +25 -0
- package/dist/telemetry/sessions.d.ts.map +1 -0
- package/dist/telemetry/sessions.js +104 -0
- package/dist/telemetry/sessions.js.map +1 -0
- package/dist/telemetry/track.d.ts +62 -0
- package/dist/telemetry/track.d.ts.map +1 -0
- package/dist/telemetry/track.js +143 -0
- package/dist/telemetry/track.js.map +1 -0
- package/dist/upkeep-run.d.ts +22 -0
- package/dist/upkeep-run.d.ts.map +1 -0
- package/dist/upkeep-run.js +85 -0
- package/dist/upkeep-run.js.map +1 -0
- package/dist/upkeep.d.ts +127 -0
- package/dist/upkeep.d.ts.map +1 -0
- package/dist/upkeep.js +252 -0
- package/dist/upkeep.js.map +1 -0
- package/dist/util/actions-folder.d.ts +2 -0
- package/dist/util/actions-folder.d.ts.map +1 -0
- package/dist/util/actions-folder.js +9 -0
- package/dist/util/actions-folder.js.map +1 -0
- package/dist/util/browser.d.ts +3 -0
- package/dist/util/browser.d.ts.map +1 -0
- package/dist/util/browser.js +14 -0
- package/dist/util/browser.js.map +1 -0
- package/dist/util/child-process.d.ts +15 -0
- package/dist/util/child-process.d.ts.map +1 -0
- package/dist/util/child-process.js +15 -0
- package/dist/util/child-process.js.map +1 -0
- package/dist/util/front-matter.d.ts +46 -0
- package/dist/util/front-matter.d.ts.map +1 -0
- package/dist/util/front-matter.js +113 -0
- package/dist/util/front-matter.js.map +1 -0
- package/dist/util/id.d.ts +7 -0
- package/dist/util/id.d.ts.map +1 -0
- package/dist/util/id.js +14 -0
- package/dist/util/id.js.map +1 -0
- package/dist/util/paths.d.ts +29 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +71 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/private-file.d.ts +14 -0
- package/dist/util/private-file.d.ts.map +1 -0
- package/dist/util/private-file.js +82 -0
- package/dist/util/private-file.js.map +1 -0
- package/dist/util/source.d.ts +4 -0
- package/dist/util/source.d.ts.map +1 -0
- package/dist/util/source.js +12 -0
- package/dist/util/source.js.map +1 -0
- package/dist/util/spinner.d.ts +15 -0
- package/dist/util/spinner.d.ts.map +1 -0
- package/dist/util/spinner.js +52 -0
- package/dist/util/spinner.js.map +1 -0
- package/dist/util/state.d.ts +120 -0
- package/dist/util/state.d.ts.map +1 -0
- package/dist/util/state.js +264 -0
- package/dist/util/state.js.map +1 -0
- package/dist/vendor/grammars/tree-sitter-go.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-go.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-java.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-java.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-kotlin.LICENSE +9 -0
- package/dist/vendor/grammars/tree-sitter-kotlin.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-php.LICENSE +22 -0
- package/dist/vendor/grammars/tree-sitter-php.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-python.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-python.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-r.LICENSE +9 -0
- package/dist/vendor/grammars/tree-sitter-r.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-swift.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-swift.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-typescript.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/viewer/app.js +2 -0
- package/dist/viewer/index.html +49 -0
- package/dist/viewer/style.css +154 -0
- package/dist/viz/assemble.d.ts +83 -0
- package/dist/viz/assemble.d.ts.map +1 -0
- package/dist/viz/assemble.js +101 -0
- package/dist/viz/assemble.js.map +1 -0
- package/dist/viz/export.d.ts +39 -0
- package/dist/viz/export.d.ts.map +1 -0
- package/dist/viz/export.js +98 -0
- package/dist/viz/export.js.map +1 -0
- package/dist/viz/serve.d.ts +13 -0
- package/dist/viz/serve.d.ts.map +1 -0
- package/dist/viz/serve.js +130 -0
- package/dist/viz/serve.js.map +1 -0
- package/package.json +115 -4
- package/scripts/build-grammar-wasm.mjs +112 -0
- package/scripts/build-viewer.mjs +44 -0
- package/scripts/graph-quality.mjs +117 -0
- package/scripts/pack-trail.mjs +53 -0
- package/scripts/postinstall.mjs +65 -0
- package/scripts/run-tests.mjs +72 -0
- package/scripts/stamp-telemetry-key.mjs +56 -0
- package/scripts/tally-audit.mjs +140 -0
- package/scripts/vendor-grammars.mjs +53 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Front matter, YAML only.
|
|
3
|
+
*
|
|
4
|
+
* gray-matter picks its parser from the opening fence: `---js` or
|
|
5
|
+
* `---javascript` front matter is run through `eval`. Every file read here
|
|
6
|
+
* comes from a repo — a learning committed by a teammate or sitting on their
|
|
7
|
+
* pushed branch, a skill, a graft/ card — so a file that opened with `---js`
|
|
8
|
+
* would run its code on whoever reads it. Here those fences parse as empty
|
|
9
|
+
* front matter instead: nothing runs, and the file reads as having none (a
|
|
10
|
+
* learning without a title, a card without a slug), which every caller
|
|
11
|
+
* already skips.
|
|
12
|
+
*
|
|
13
|
+
* YAML anchors and aliases are refused the same way. An alias is a reference,
|
|
14
|
+
* so a few hundred bytes of nested ones (`b: &b [*a,*a,*a,...]`, nine deep)
|
|
15
|
+
* parse at once and then become hundreds of millions of strings the moment
|
|
16
|
+
* anything reads the value as text: seconds and gigabytes per read, then a
|
|
17
|
+
* crash. Nothing trail writes has one (`stringify` writes with `noRefs`), so a
|
|
18
|
+
* file that does reads as having no front matter, with `refused` saying why.
|
|
19
|
+
* So does a list or a map under a key the caller names in `scalars`, where
|
|
20
|
+
* one value belongs.
|
|
21
|
+
*/
|
|
22
|
+
import grayMatter from "gray-matter";
|
|
23
|
+
export type FrontMatterFile = grayMatter.GrayMatterFile<string> & {
|
|
24
|
+
/** Why the front matter wasn't read, when it wasn't. `data` is then `{}`. */
|
|
25
|
+
refused?: string;
|
|
26
|
+
};
|
|
27
|
+
export interface FrontMatterOptions {
|
|
28
|
+
/** Keys that hold one value each (text, a number, true/false, a date), when present. */
|
|
29
|
+
scalars?: readonly string[];
|
|
30
|
+
}
|
|
31
|
+
/** gray-matter's parse with YAML only, no anchors or aliases, and its `stringify`, which writes YAML. */
|
|
32
|
+
export declare const matter: ((text: string, opts?: FrontMatterOptions) => FrontMatterFile) & {
|
|
33
|
+
stringify: (content: string, data: object) => string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* The strings in `value` that fit on one line in at most `maxChars`, the
|
|
37
|
+
* first `max` of them. Anything else in the list is dropped; a value that
|
|
38
|
+
* isn't a list gives none.
|
|
39
|
+
*/
|
|
40
|
+
export declare function textList(value: unknown, max: number, maxChars: number): string[];
|
|
41
|
+
/**
|
|
42
|
+
* Say once per process, on stderr, that `what` was skipped and why: one bad
|
|
43
|
+
* file costs only itself, and whoever runs the command can find it.
|
|
44
|
+
*/
|
|
45
|
+
export declare function warnSkipped(what: string, place: string, why: string): void;
|
|
46
|
+
//# sourceMappingURL=front-matter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"front-matter.d.ts","sourceRoot":"","sources":["../../src/util/front-matter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG;IAChE,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAgDD,yGAAyG;AACzG,eAAO,MAAM,MAAM,UACV,MAAM,SAAQ,kBAAkB,KAAQ,eAAe;yBAYvC,MAAM,QAAQ,MAAM,KAAG,MAAM;CAErD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAQhF;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAS1E"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Front matter, YAML only.
|
|
3
|
+
*
|
|
4
|
+
* gray-matter picks its parser from the opening fence: `---js` or
|
|
5
|
+
* `---javascript` front matter is run through `eval`. Every file read here
|
|
6
|
+
* comes from a repo — a learning committed by a teammate or sitting on their
|
|
7
|
+
* pushed branch, a skill, a graft/ card — so a file that opened with `---js`
|
|
8
|
+
* would run its code on whoever reads it. Here those fences parse as empty
|
|
9
|
+
* front matter instead: nothing runs, and the file reads as having none (a
|
|
10
|
+
* learning without a title, a card without a slug), which every caller
|
|
11
|
+
* already skips.
|
|
12
|
+
*
|
|
13
|
+
* YAML anchors and aliases are refused the same way. An alias is a reference,
|
|
14
|
+
* so a few hundred bytes of nested ones (`b: &b [*a,*a,*a,...]`, nine deep)
|
|
15
|
+
* parse at once and then become hundreds of millions of strings the moment
|
|
16
|
+
* anything reads the value as text: seconds and gigabytes per read, then a
|
|
17
|
+
* crash. Nothing trail writes has one (`stringify` writes with `noRefs`), so a
|
|
18
|
+
* file that does reads as having no front matter, with `refused` saying why.
|
|
19
|
+
* So does a list or a map under a key the caller names in `scalars`, where
|
|
20
|
+
* one value belongs.
|
|
21
|
+
*/
|
|
22
|
+
import grayMatter from "gray-matter";
|
|
23
|
+
const nothing = () => ({});
|
|
24
|
+
// gray-matter looks an engine up by the fence's own spelling, then by its alias.
|
|
25
|
+
const CODE_ENGINES = { js: nothing, javascript: nothing, coffee: nothing, coffeescript: nothing, cson: nothing };
|
|
26
|
+
const NO_REFS = "YAML anchors and aliases aren't read";
|
|
27
|
+
/** Thrown from inside the YAML reader to stop it at the first anchor or alias. */
|
|
28
|
+
class Refused extends Error {
|
|
29
|
+
}
|
|
30
|
+
/** A stand-in for js-yaml's table of anchors: naming an anchor, or looking one up for an alias, stops the read. */
|
|
31
|
+
const NO_ANCHORS = {
|
|
32
|
+
set: () => { throw new Refused(NO_REFS); },
|
|
33
|
+
defineProperty: () => { throw new Refused(NO_REFS); },
|
|
34
|
+
getOwnPropertyDescriptor: () => { throw new Refused(NO_REFS); },
|
|
35
|
+
has: () => { throw new Refused(NO_REFS); },
|
|
36
|
+
};
|
|
37
|
+
const guarded = new WeakSet();
|
|
38
|
+
/**
|
|
39
|
+
* js-yaml calls this as it opens and closes each node; gray-matter hands its
|
|
40
|
+
* options on to it. Each document gets a fresh anchor table, swapped for one
|
|
41
|
+
* that refuses on the document's first node, before any anchor can be read.
|
|
42
|
+
*/
|
|
43
|
+
function listener(event, state) {
|
|
44
|
+
if (event === "open" && state.anchorMap && !guarded.has(state.anchorMap)) {
|
|
45
|
+
state.anchorMap = new Proxy({}, NO_ANCHORS);
|
|
46
|
+
guarded.add(state.anchorMap);
|
|
47
|
+
}
|
|
48
|
+
// Should js-yaml ever keep anchors somewhere else: a node closing with one still stops the read.
|
|
49
|
+
if (event === "close" && state.anchor)
|
|
50
|
+
throw new Refused(NO_REFS);
|
|
51
|
+
}
|
|
52
|
+
const READ = { engines: CODE_ENGINES, listener };
|
|
53
|
+
const UNREAD = { engines: { ...CODE_ENGINES, yaml: nothing, json: nothing } };
|
|
54
|
+
// `noRefs` reaches js-yaml's dump through gray-matter: an object used twice is written out twice, never as an alias.
|
|
55
|
+
const WRITE = { language: "yaml", noRefs: true };
|
|
56
|
+
function isScalar(v) {
|
|
57
|
+
return v === undefined || v === null || ["string", "number", "boolean"].includes(typeof v) || v instanceof Date;
|
|
58
|
+
}
|
|
59
|
+
/** The file with its front matter left unread: the body as usual, `data` empty, and why. */
|
|
60
|
+
function refuse(text, why) {
|
|
61
|
+
return Object.assign(grayMatter(text, UNREAD), { data: {}, refused: why });
|
|
62
|
+
}
|
|
63
|
+
/** gray-matter's parse with YAML only, no anchors or aliases, and its `stringify`, which writes YAML. */
|
|
64
|
+
export const matter = Object.assign((text, opts = {}) => {
|
|
65
|
+
let file;
|
|
66
|
+
try {
|
|
67
|
+
file = grayMatter(text, READ);
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
if (e instanceof Refused)
|
|
71
|
+
return refuse(text, e.message);
|
|
72
|
+
throw e;
|
|
73
|
+
}
|
|
74
|
+
const listed = opts.scalars?.find((k) => !isScalar(file.data[k]));
|
|
75
|
+
return listed ? refuse(text, `${listed} holds a list or a map where one value belongs`) : file;
|
|
76
|
+
}, {
|
|
77
|
+
stringify: (content, data) => grayMatter.stringify(content, data, WRITE),
|
|
78
|
+
});
|
|
79
|
+
/**
|
|
80
|
+
* The strings in `value` that fit on one line in at most `maxChars`, the
|
|
81
|
+
* first `max` of them. Anything else in the list is dropped; a value that
|
|
82
|
+
* isn't a list gives none.
|
|
83
|
+
*/
|
|
84
|
+
export function textList(value, max, maxChars) {
|
|
85
|
+
if (!Array.isArray(value))
|
|
86
|
+
return [];
|
|
87
|
+
const out = [];
|
|
88
|
+
for (const v of value) {
|
|
89
|
+
if (out.length >= max)
|
|
90
|
+
break;
|
|
91
|
+
if (typeof v === "string" && v && v.length <= maxChars && !/[\u0000-\u001f\u007f-\u009f\u2028\u2029]/.test(v))
|
|
92
|
+
out.push(v);
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
const warned = new Set();
|
|
97
|
+
/**
|
|
98
|
+
* Say once per process, on stderr, that `what` was skipped and why: one bad
|
|
99
|
+
* file costs only itself, and whoever runs the command can find it.
|
|
100
|
+
*/
|
|
101
|
+
export function warnSkipped(what, place, why) {
|
|
102
|
+
const key = `${what}\u0000${place}`;
|
|
103
|
+
if (warned.has(key))
|
|
104
|
+
return;
|
|
105
|
+
warned.add(key);
|
|
106
|
+
try {
|
|
107
|
+
process.stderr.write(`⚠ skipped ${what} in ${JSON.stringify(place)}: ${why.replace(/\s+/g, " ").slice(0, 200)}\n`);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
/* nowhere to say it */
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=front-matter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"front-matter.js","sourceRoot":"","sources":["../../src/util/front-matter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Generate a random unique id with a short type prefix, e.g. "node_ab12…". */
|
|
2
|
+
export declare function newId(prefix: string): string;
|
|
3
|
+
/** Stable content hash (sha256, hex) used for document dedup. */
|
|
4
|
+
export declare function contentHash(input: string): string;
|
|
5
|
+
/** Normalize a name/alias for case- and whitespace-insensitive matching. */
|
|
6
|
+
export declare function normalizeName(name: string): string;
|
|
7
|
+
//# sourceMappingURL=id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/util/id.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
package/dist/util/id.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { randomUUID, createHash } from "node:crypto";
|
|
2
|
+
/** Generate a random unique id with a short type prefix, e.g. "node_ab12…". */
|
|
3
|
+
export function newId(prefix) {
|
|
4
|
+
return `${prefix}_${randomUUID().replace(/-/g, "").slice(0, 20)}`;
|
|
5
|
+
}
|
|
6
|
+
/** Stable content hash (sha256, hex) used for document dedup. */
|
|
7
|
+
export function contentHash(input) {
|
|
8
|
+
return createHash("sha256").update(input).digest("hex");
|
|
9
|
+
}
|
|
10
|
+
/** Normalize a name/alias for case- and whitespace-insensitive matching. */
|
|
11
|
+
export function normalizeName(name) {
|
|
12
|
+
return name.trim().toLowerCase().replace(/\s+/g, " ");
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/util/id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,+EAA+E;AAC/E,MAAM,UAAU,KAAK,CAAC,MAAc;IAClC,OAAO,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Platform separators → `/`. Identity on posix. */
|
|
2
|
+
export declare function toPosixPath(p: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* `relative(from, to)`, normalized to posix — the canonical form of every path
|
|
5
|
+
* graft stores. Use this rather than bare `relative` for anything that lands in
|
|
6
|
+
* the graph, a cache key, or a manifest. Bare `relative` is still right for
|
|
7
|
+
* text shown in the terminal, where a native separator is what the platform's
|
|
8
|
+
* users expect.
|
|
9
|
+
*/
|
|
10
|
+
export declare function relPosix(from: string, to: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Trailing `/` off a repo-relative path, in linear time.
|
|
13
|
+
*
|
|
14
|
+
* The obvious `replace(/\/+$/, "")` is a polynomial-ReDoS shape — `\/+$` can begin
|
|
15
|
+
* matching at any point inside a run of slashes, so a path ending in many slashes
|
|
16
|
+
* and then anything else costs O(n²). CodeQL flags it (`js/polynomial-redos`), and
|
|
17
|
+
* rightly: these inputs are a `--dir` or `--in` value rather than anything
|
|
18
|
+
* attacker-controlled, but the ambiguity buys nothing and a loop is both faster
|
|
19
|
+
* and plainer.
|
|
20
|
+
*/
|
|
21
|
+
export declare function stripTrailingSlashes(path: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Normalize a user-supplied path prefix (`--in`) so it can be compared against
|
|
24
|
+
* a stored `node.path`: posix separators, no leading `./`, no trailing
|
|
25
|
+
* separator. Windows users type — and their shell's tab-completion produces —
|
|
26
|
+
* `--in server\src\gpu`, so both separators have to reduce to the same prefix.
|
|
27
|
+
*/
|
|
28
|
+
export declare function normalizePathPrefix(p: string): string;
|
|
29
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AA2BA,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAMrD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo-relative paths, always posix.
|
|
3
|
+
*
|
|
4
|
+
* Every path graft stores — node ids, `node.path`, extract-cache keys, the
|
|
5
|
+
* freshness fingerprint, the card manifest — is repo-relative and separated by
|
|
6
|
+
* `/` on every platform. That is not cosmetic: the query layer parses these
|
|
7
|
+
* strings with `/` as the separator, and does it by hand rather than through
|
|
8
|
+
* `node:path`. `pathUnderPrefix` (`--in` scoping) tests
|
|
9
|
+
* `startsWith(`${prefix}/`)`, `map`'s `dirKey` splits on `/` to cluster by
|
|
10
|
+
* directory, `resolveSymbol` matches a filename query with
|
|
11
|
+
* `endsWith("/" + query)`. Hand any of them a `src\gate.ts` and none of them
|
|
12
|
+
* error — they match nothing, silently. On Windows that made every `--in`
|
|
13
|
+
* report "nothing indexed under …" and made `map` emit one single-file
|
|
14
|
+
* "directory" per file.
|
|
15
|
+
*
|
|
16
|
+
* So normalize once, here, where a path is *created*, instead of defensively at
|
|
17
|
+
* each consumer — a consumer that forgets is a silent wrong answer, and there
|
|
18
|
+
* are more consumers than producers.
|
|
19
|
+
*
|
|
20
|
+
* {@link toPosixPath} splits on the platform `sep`, never a literal `\`: a
|
|
21
|
+
* posix filename may legitimately contain a backslash, and splitting on `"\\"`
|
|
22
|
+
* would corrupt it. That also makes this module provably the identity function
|
|
23
|
+
* on posix, which is what guarantees an existing Mac/Linux graph is byte-identical
|
|
24
|
+
* across this change.
|
|
25
|
+
*/
|
|
26
|
+
import { relative, sep } from "node:path";
|
|
27
|
+
/** Platform separators → `/`. Identity on posix. */
|
|
28
|
+
export function toPosixPath(p) {
|
|
29
|
+
return sep === "/" ? p : p.split(sep).join("/");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* `relative(from, to)`, normalized to posix — the canonical form of every path
|
|
33
|
+
* graft stores. Use this rather than bare `relative` for anything that lands in
|
|
34
|
+
* the graph, a cache key, or a manifest. Bare `relative` is still right for
|
|
35
|
+
* text shown in the terminal, where a native separator is what the platform's
|
|
36
|
+
* users expect.
|
|
37
|
+
*/
|
|
38
|
+
export function relPosix(from, to) {
|
|
39
|
+
return toPosixPath(relative(from, to));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Trailing `/` off a repo-relative path, in linear time.
|
|
43
|
+
*
|
|
44
|
+
* The obvious `replace(/\/+$/, "")` is a polynomial-ReDoS shape — `\/+$` can begin
|
|
45
|
+
* matching at any point inside a run of slashes, so a path ending in many slashes
|
|
46
|
+
* and then anything else costs O(n²). CodeQL flags it (`js/polynomial-redos`), and
|
|
47
|
+
* rightly: these inputs are a `--dir` or `--in` value rather than anything
|
|
48
|
+
* attacker-controlled, but the ambiguity buys nothing and a loop is both faster
|
|
49
|
+
* and plainer.
|
|
50
|
+
*/
|
|
51
|
+
export function stripTrailingSlashes(path) {
|
|
52
|
+
let end = path.length;
|
|
53
|
+
while (end > 0 && path[end - 1] === "/")
|
|
54
|
+
end--;
|
|
55
|
+
return path.slice(0, end);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Normalize a user-supplied path prefix (`--in`) so it can be compared against
|
|
59
|
+
* a stored `node.path`: posix separators, no leading `./`, no trailing
|
|
60
|
+
* separator. Windows users type — and their shell's tab-completion produces —
|
|
61
|
+
* `--in server\src\gpu`, so both separators have to reduce to the same prefix.
|
|
62
|
+
*/
|
|
63
|
+
export function normalizePathPrefix(p) {
|
|
64
|
+
let out = toPosixPath(p);
|
|
65
|
+
while (out.startsWith("./"))
|
|
66
|
+
out = out.slice(2);
|
|
67
|
+
// Trailing separators only; a bare "/" normalizes to "" (match everything),
|
|
68
|
+
// which is exactly how `pathUnderPrefix` reads an empty prefix.
|
|
69
|
+
return stripTrailingSlashes(out);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE1C,oDAAoD;AACpD,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,EAAU;IAC/C,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG;QAAE,GAAG,EAAE,CAAC;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAS;IAC3C,IAAI,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChD,4EAA4E;IAC5E,gEAAgE;IAChE,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const PRIVATE_FILE_MODE = 384;
|
|
2
|
+
export declare const PRIVATE_DIR_MODE = 448;
|
|
3
|
+
/**
|
|
4
|
+
* Make `dir` if it's missing and leave it owner-only. Throws like `mkdirSync`; a folder that isn't ours is left
|
|
5
|
+
* as it is. A link is left alone too: a chmod would follow it and tighten what it points to, which may be a folder
|
|
6
|
+
* that isn't Trail's. The mode is set through a descriptor that refuses a link, so one swapped in after the check
|
|
7
|
+
* isn't followed either (as trace/state.ts ensurePrivateDir).
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensurePrivateDir(dir: string): void;
|
|
10
|
+
/** Append `text` to `path`, owner-only, folder included. Throws like `appendFileSync`. */
|
|
11
|
+
export declare function appendPrivateFile(path: string, text: string): void;
|
|
12
|
+
/** Replace `path` with `text`, owner-only, folder included. Throws like `writeFileSync`. */
|
|
13
|
+
export declare function writePrivateFile(path: string, text: string): void;
|
|
14
|
+
//# sourceMappingURL=private-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-file.d.ts","sourceRoot":"","sources":["../../src/util/private-file.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,iBAAiB,MAAQ,CAAC;AACvC,eAAO,MAAM,gBAAgB,MAAQ,CAAC;AAOtC;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAwBlD;AAiBD,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAElE;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEjE"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Files only their owner can read: what Trail keeps for upload (the workspace
|
|
3
|
+
* outbox, the usage-stats queue) and the workspace connection.
|
|
4
|
+
*
|
|
5
|
+
* A mode given when a file is created does nothing to a file an older version
|
|
6
|
+
* already made, and a folder made by `mkdirSync` without one is world-readable,
|
|
7
|
+
* so both are set again on every write. One `chmod` each is all that costs.
|
|
8
|
+
* Windows has no owner-only mode bits (the profile folder's ACL guards it), so
|
|
9
|
+
* nothing is changed there.
|
|
10
|
+
*/
|
|
11
|
+
import { chmodSync, closeSync, constants, fchmodSync, lstatSync, mkdirSync, openSync, writeSync } from "node:fs";
|
|
12
|
+
import { dirname } from "node:path";
|
|
13
|
+
export const PRIVATE_FILE_MODE = 0o600;
|
|
14
|
+
export const PRIVATE_DIR_MODE = 0o700;
|
|
15
|
+
const POSIX = process.platform !== "win32";
|
|
16
|
+
/** Opens a folder, and refuses a link (ELOOP) where the platform has O_NOFOLLOW. */
|
|
17
|
+
const DIR_NOFOLLOW = constants.O_RDONLY | (constants.O_DIRECTORY ?? 0) | (constants.O_NOFOLLOW ?? 0);
|
|
18
|
+
/**
|
|
19
|
+
* Make `dir` if it's missing and leave it owner-only. Throws like `mkdirSync`; a folder that isn't ours is left
|
|
20
|
+
* as it is. A link is left alone too: a chmod would follow it and tighten what it points to, which may be a folder
|
|
21
|
+
* that isn't Trail's. The mode is set through a descriptor that refuses a link, so one swapped in after the check
|
|
22
|
+
* isn't followed either (as trace/state.ts ensurePrivateDir).
|
|
23
|
+
*/
|
|
24
|
+
export function ensurePrivateDir(dir) {
|
|
25
|
+
try {
|
|
26
|
+
if (lstatSync(dir).isSymbolicLink())
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
/* missing: made below */
|
|
31
|
+
}
|
|
32
|
+
mkdirSync(dir, { recursive: true, mode: PRIVATE_DIR_MODE });
|
|
33
|
+
if (!POSIX || constants.O_NOFOLLOW === undefined)
|
|
34
|
+
return;
|
|
35
|
+
try {
|
|
36
|
+
const fd = openSync(dir, DIR_NOFOLLOW);
|
|
37
|
+
try {
|
|
38
|
+
fchmodSync(fd, PRIVATE_DIR_MODE);
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
closeSync(fd);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
// A folder its owner can't read can't be opened, but can still be tightened.
|
|
46
|
+
if (e.code !== "EACCES")
|
|
47
|
+
return;
|
|
48
|
+
try {
|
|
49
|
+
if (!lstatSync(dir).isSymbolicLink())
|
|
50
|
+
chmodSync(dir, PRIVATE_DIR_MODE);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
/* not ours to change: the file itself is still owner-only */
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Write `text` to `path` through one descriptor that is owner-only before anything is written. */
|
|
58
|
+
function writePrivate(path, text, flags) {
|
|
59
|
+
ensurePrivateDir(dirname(path));
|
|
60
|
+
const fd = openSync(path, flags, PRIVATE_FILE_MODE);
|
|
61
|
+
try {
|
|
62
|
+
if (POSIX)
|
|
63
|
+
fchmodSync(fd, PRIVATE_FILE_MODE);
|
|
64
|
+
// One write on an O_APPEND descriptor, as appendFileSync makes, so lines from two
|
|
65
|
+
// processes don't interleave; the loop only matters if the disk takes part of it.
|
|
66
|
+
const buf = Buffer.from(text, "utf8");
|
|
67
|
+
for (let off = 0; off < buf.length;)
|
|
68
|
+
off += writeSync(fd, buf, off, buf.length - off);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
closeSync(fd);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Append `text` to `path`, owner-only, folder included. Throws like `appendFileSync`. */
|
|
75
|
+
export function appendPrivateFile(path, text) {
|
|
76
|
+
writePrivate(path, text, "a");
|
|
77
|
+
}
|
|
78
|
+
/** Replace `path` with `text`, owner-only, folder included. Throws like `writeFileSync`. */
|
|
79
|
+
export function writePrivateFile(path, text) {
|
|
80
|
+
writePrivate(path, text, "w");
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=private-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-file.js","sourceRoot":"","sources":["../../src/util/private-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Read source text, decoding Windows tooling's common UTF-16LE output. UTF-16BE
|
|
2
|
+
* is rare and unsupported by Node's built-in decoders, so callers silently skip it. */
|
|
3
|
+
export declare function readSourceFile(path: string): string | null;
|
|
4
|
+
//# sourceMappingURL=source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/util/source.ts"],"names":[],"mappings":"AAEA;uFACuF;AACvF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK1D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
/** Read source text, decoding Windows tooling's common UTF-16LE output. UTF-16BE
|
|
3
|
+
* is rare and unsupported by Node's built-in decoders, so callers silently skip it. */
|
|
4
|
+
export function readSourceFile(path) {
|
|
5
|
+
const bytes = readFileSync(path);
|
|
6
|
+
if (bytes[0] === 0xfe && bytes[1] === 0xff)
|
|
7
|
+
return null;
|
|
8
|
+
if (bytes[0] === 0xff && bytes[1] === 0xfe)
|
|
9
|
+
return bytes.subarray(2).toString("utf16le");
|
|
10
|
+
return bytes.toString("utf8");
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/util/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;uFACuF;AACvF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACzF,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface Spinner {
|
|
2
|
+
/** Change the text after the frame. */
|
|
3
|
+
update(text: string): void;
|
|
4
|
+
/** Print a finished line above the spinner, which keeps spinning below it. */
|
|
5
|
+
print(line: string): void;
|
|
6
|
+
/** Erase the line and stop. Safe to call more than once. */
|
|
7
|
+
stop(): void;
|
|
8
|
+
readonly active: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function startSpinner(text: string, opts?: {
|
|
11
|
+
stream?: NodeJS.WriteStream;
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
intervalMs?: number;
|
|
14
|
+
}): Spinner;
|
|
15
|
+
//# sourceMappingURL=spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/util/spinner.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,OAAO;IACtB,uCAAuC;IACvC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,8EAA8E;IAC9E,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,4DAA4D;IAC5D,IAAI,IAAI,IAAI,CAAC;IACb,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACjF,OAAO,CAwCT"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One line that redraws in place while something runs, and is erased when it
|
|
3
|
+
* stops — so nothing interactive is left in the scrollback.
|
|
4
|
+
*
|
|
5
|
+
* Only on a TTY. Anywhere else every method is a no-op, and the caller prints
|
|
6
|
+
* whatever finished lines it wants a log to keep.
|
|
7
|
+
*/
|
|
8
|
+
const FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
9
|
+
export function startSpinner(text, opts = {}) {
|
|
10
|
+
const out = opts.stream ?? process.stderr;
|
|
11
|
+
const enabled = opts.enabled ?? Boolean(out.isTTY);
|
|
12
|
+
if (!enabled) {
|
|
13
|
+
return { update() { }, print: (line) => out.write(`${line}\n`), stop() { }, active: false };
|
|
14
|
+
}
|
|
15
|
+
let current = text;
|
|
16
|
+
let frame = 0;
|
|
17
|
+
let stopped = false;
|
|
18
|
+
const width = () => Math.max(20, (out.columns || 100) - 1);
|
|
19
|
+
const draw = () => {
|
|
20
|
+
if (stopped)
|
|
21
|
+
return;
|
|
22
|
+
const line = `${FRAMES[frame % FRAMES.length]} ${current}`;
|
|
23
|
+
out.write(`\r\x1b[2K${line.length > width() ? line.slice(0, width()) : line}`);
|
|
24
|
+
frame++;
|
|
25
|
+
};
|
|
26
|
+
const clear = () => out.write("\r\x1b[2K");
|
|
27
|
+
draw();
|
|
28
|
+
const timer = setInterval(draw, opts.intervalMs ?? 80);
|
|
29
|
+
timer.unref?.();
|
|
30
|
+
return {
|
|
31
|
+
get active() {
|
|
32
|
+
return !stopped;
|
|
33
|
+
},
|
|
34
|
+
update(next) {
|
|
35
|
+
current = next;
|
|
36
|
+
draw();
|
|
37
|
+
},
|
|
38
|
+
print(line) {
|
|
39
|
+
clear();
|
|
40
|
+
out.write(`${line}\n`);
|
|
41
|
+
draw();
|
|
42
|
+
},
|
|
43
|
+
stop() {
|
|
44
|
+
if (stopped)
|
|
45
|
+
return;
|
|
46
|
+
stopped = true;
|
|
47
|
+
clearInterval(timer);
|
|
48
|
+
clear();
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/util/spinner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAYlE,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,OAAgF,EAAE;IAElF,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,KAAI,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,IAAI,KAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC5F,CAAC;IACD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QAC3D,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/E,KAAK,EAAE,CAAC;IACV,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,EAAE,CAAC;IACP,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACvD,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAChB,OAAO;QACL,IAAI,MAAM;YACR,OAAO,CAAC,OAAO,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,IAAY;YACjB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,EAAE,CAAC;QACT,CAAC;QACD,KAAK,CAAC,IAAY;YAChB,KAAK,EAAE,CAAC;YACR,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;YACvB,IAAI,EAAE,CAAC;QACT,CAAC;QACD,IAAI;YACF,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,KAAK,EAAE,CAAC;QACV,CAAC;KACF,CAAC;AACJ,CAAC"}
|