@smthrs/std 0.0.0-stage → 1.0.0-rc.12
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/CHANGELOG.md +148 -0
- package/LICENSE +21 -0
- package/README.md +156 -2
- package/dist/cjs/ApplyPatch.d.ts +174 -0
- package/dist/cjs/ApplyPatch.d.ts.map +1 -0
- package/dist/cjs/ApplyPatch.js +309 -0
- package/dist/cjs/ApplyPatch.js.map +7 -0
- package/dist/cjs/Bash.d.ts +390 -0
- package/dist/cjs/Bash.d.ts.map +1 -0
- package/dist/cjs/Bash.js +333 -0
- package/dist/cjs/Bash.js.map +7 -0
- package/dist/cjs/Checkpoints.d.ts +322 -0
- package/dist/cjs/Checkpoints.d.ts.map +1 -0
- package/dist/cjs/Checkpoints.js +233 -0
- package/dist/cjs/Checkpoints.js.map +7 -0
- package/dist/cjs/Container.d.ts +132 -0
- package/dist/cjs/Container.d.ts.map +1 -0
- package/dist/cjs/Container.js +113 -0
- package/dist/cjs/Container.js.map +7 -0
- package/dist/cjs/Edit.d.ts +203 -0
- package/dist/cjs/Edit.d.ts.map +1 -0
- package/dist/cjs/Edit.js +258 -0
- package/dist/cjs/Edit.js.map +7 -0
- package/dist/cjs/ExaWebSearch.d.ts +22 -0
- package/dist/cjs/ExaWebSearch.d.ts.map +1 -0
- package/dist/cjs/ExaWebSearch.js +138 -0
- package/dist/cjs/ExaWebSearch.js.map +7 -0
- package/dist/cjs/Explore.d.ts +328 -0
- package/dist/cjs/Explore.d.ts.map +1 -0
- package/dist/cjs/Explore.js +90 -0
- package/dist/cjs/Explore.js.map +7 -0
- package/dist/cjs/Fetch.d.ts +130 -0
- package/dist/cjs/Fetch.d.ts.map +1 -0
- package/dist/cjs/Fetch.js +64 -0
- package/dist/cjs/Fetch.js.map +7 -0
- package/dist/cjs/Glob.d.ts +204 -0
- package/dist/cjs/Glob.d.ts.map +1 -0
- package/dist/cjs/Glob.js +94 -0
- package/dist/cjs/Glob.js.map +7 -0
- package/dist/cjs/Grep.d.ts +347 -0
- package/dist/cjs/Grep.d.ts.map +1 -0
- package/dist/cjs/Grep.js +181 -0
- package/dist/cjs/Grep.js.map +7 -0
- package/dist/cjs/HttpPost.d.ts +130 -0
- package/dist/cjs/HttpPost.d.ts.map +1 -0
- package/dist/cjs/HttpPost.js +72 -0
- package/dist/cjs/HttpPost.js.map +7 -0
- package/dist/cjs/LanguageServer.d.ts +90 -0
- package/dist/cjs/LanguageServer.d.ts.map +1 -0
- package/dist/cjs/LanguageServer.js +60 -0
- package/dist/cjs/LanguageServer.js.map +7 -0
- package/dist/cjs/Ls.d.ts +164 -0
- package/dist/cjs/Ls.d.ts.map +1 -0
- package/dist/cjs/Ls.js +136 -0
- package/dist/cjs/Ls.js.map +7 -0
- package/dist/cjs/Lsp.d.ts +125 -0
- package/dist/cjs/Lsp.d.ts.map +1 -0
- package/dist/cjs/Lsp.js +137 -0
- package/dist/cjs/Lsp.js.map +7 -0
- package/dist/cjs/Manifest.d.ts +918 -0
- package/dist/cjs/Manifest.d.ts.map +1 -0
- package/dist/cjs/Manifest.js +144 -0
- package/dist/cjs/Manifest.js.map +7 -0
- package/dist/cjs/NativeSearch.d.ts +38 -0
- package/dist/cjs/NativeSearch.d.ts.map +1 -0
- package/dist/cjs/NativeSearch.js +326 -0
- package/dist/cjs/NativeSearch.js.map +7 -0
- package/dist/cjs/NodeLanguageServer.d.ts +128 -0
- package/dist/cjs/NodeLanguageServer.d.ts.map +1 -0
- package/dist/cjs/NodeLanguageServer.js +796 -0
- package/dist/cjs/NodeLanguageServer.js.map +7 -0
- package/dist/cjs/PortableSearch.d.ts +36 -0
- package/dist/cjs/PortableSearch.d.ts.map +1 -0
- package/dist/cjs/PortableSearch.js +240 -0
- package/dist/cjs/PortableSearch.js.map +7 -0
- package/dist/cjs/Probe.d.ts +193 -0
- package/dist/cjs/Probe.d.ts.map +1 -0
- package/dist/cjs/Probe.js +134 -0
- package/dist/cjs/Probe.js.map +7 -0
- package/dist/cjs/Read.d.ts +189 -0
- package/dist/cjs/Read.d.ts.map +1 -0
- package/dist/cjs/Read.js +223 -0
- package/dist/cjs/Read.js.map +7 -0
- package/dist/cjs/Relocate.d.ts +73 -0
- package/dist/cjs/Relocate.d.ts.map +1 -0
- package/dist/cjs/Relocate.js +72 -0
- package/dist/cjs/Relocate.js.map +7 -0
- package/dist/cjs/RemoteSearch.d.ts +54 -0
- package/dist/cjs/RemoteSearch.d.ts.map +1 -0
- package/dist/cjs/RemoteSearch.js +134 -0
- package/dist/cjs/RemoteSearch.js.map +7 -0
- package/dist/cjs/Search.d.ts +163 -0
- package/dist/cjs/Search.d.ts.map +1 -0
- package/dist/cjs/Search.js +51 -0
- package/dist/cjs/Search.js.map +7 -0
- package/dist/cjs/SearchConformance.d.ts +115 -0
- package/dist/cjs/SearchConformance.d.ts.map +1 -0
- package/dist/cjs/SearchConformance.js +172 -0
- package/dist/cjs/SearchConformance.js.map +7 -0
- package/dist/cjs/SearchContract.d.ts +114 -0
- package/dist/cjs/SearchContract.d.ts.map +1 -0
- package/dist/cjs/SearchContract.js +339 -0
- package/dist/cjs/SearchContract.js.map +7 -0
- package/dist/cjs/ShellCommand.d.ts +164 -0
- package/dist/cjs/ShellCommand.d.ts.map +1 -0
- package/dist/cjs/ShellCommand.js +102 -0
- package/dist/cjs/ShellCommand.js.map +7 -0
- package/dist/cjs/StdError.d.ts +55 -0
- package/dist/cjs/StdError.d.ts.map +1 -0
- package/dist/cjs/StdError.js +74 -0
- package/dist/cjs/StdError.js.map +7 -0
- package/dist/cjs/TestRun.d.ts +311 -0
- package/dist/cjs/TestRun.d.ts.map +1 -0
- package/dist/cjs/TestRun.js +228 -0
- package/dist/cjs/TestRun.js.map +7 -0
- package/dist/cjs/TestRunner.d.ts +102 -0
- package/dist/cjs/TestRunner.d.ts.map +1 -0
- package/dist/cjs/TestRunner.js +54 -0
- package/dist/cjs/TestRunner.js.map +7 -0
- package/dist/cjs/TreeFingerprint.d.ts +140 -0
- package/dist/cjs/TreeFingerprint.d.ts.map +1 -0
- package/dist/cjs/TreeFingerprint.js +87 -0
- package/dist/cjs/TreeFingerprint.js.map +7 -0
- package/dist/cjs/UpdatePlan.d.ts +152 -0
- package/dist/cjs/UpdatePlan.d.ts.map +1 -0
- package/dist/cjs/UpdatePlan.js +87 -0
- package/dist/cjs/UpdatePlan.js.map +7 -0
- package/dist/cjs/WebFetch.d.ts +134 -0
- package/dist/cjs/WebFetch.d.ts.map +1 -0
- package/dist/cjs/WebFetch.js +140 -0
- package/dist/cjs/WebFetch.js.map +7 -0
- package/dist/cjs/WebSearch.d.ts +181 -0
- package/dist/cjs/WebSearch.d.ts.map +1 -0
- package/dist/cjs/WebSearch.js +86 -0
- package/dist/cjs/WebSearch.js.map +7 -0
- package/dist/cjs/Write.d.ts +147 -0
- package/dist/cjs/Write.d.ts.map +1 -0
- package/dist/cjs/Write.js +122 -0
- package/dist/cjs/Write.js.map +7 -0
- package/dist/cjs/index.d.ts +129 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +101 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/internal/ApplyPatch.d.ts +145 -0
- package/dist/cjs/internal/ApplyPatch.d.ts.map +1 -0
- package/dist/cjs/internal/ApplyPatch.js +462 -0
- package/dist/cjs/internal/ApplyPatch.js.map +7 -0
- package/dist/cjs/internal/CodexText.d.ts +73 -0
- package/dist/cjs/internal/CodexText.d.ts.map +1 -0
- package/dist/cjs/internal/CodexText.js +108 -0
- package/dist/cjs/internal/CodexText.js.map +7 -0
- package/dist/cjs/internal/Declaration.d.ts +49 -0
- package/dist/cjs/internal/Declaration.d.ts.map +1 -0
- package/dist/cjs/internal/Declaration.js +46 -0
- package/dist/cjs/internal/Declaration.js.map +7 -0
- package/dist/cjs/internal/Diagnostics.d.ts +77 -0
- package/dist/cjs/internal/Diagnostics.d.ts.map +1 -0
- package/dist/cjs/internal/Diagnostics.js +89 -0
- package/dist/cjs/internal/Diagnostics.js.map +7 -0
- package/dist/cjs/internal/EnvelopePrecheck.d.ts +69 -0
- package/dist/cjs/internal/EnvelopePrecheck.d.ts.map +1 -0
- package/dist/cjs/internal/EnvelopePrecheck.js +323 -0
- package/dist/cjs/internal/EnvelopePrecheck.js.map +7 -0
- package/dist/cjs/internal/Exec.d.ts +151 -0
- package/dist/cjs/internal/Exec.d.ts.map +1 -0
- package/dist/cjs/internal/Exec.js +207 -0
- package/dist/cjs/internal/Exec.js.map +7 -0
- package/dist/cjs/internal/FileMutation.d.ts +109 -0
- package/dist/cjs/internal/FileMutation.d.ts.map +1 -0
- package/dist/cjs/internal/FileMutation.js +116 -0
- package/dist/cjs/internal/FileMutation.js.map +7 -0
- package/dist/cjs/internal/FsFailure.d.ts +38 -0
- package/dist/cjs/internal/FsFailure.d.ts.map +1 -0
- package/dist/cjs/internal/FsFailure.js +40 -0
- package/dist/cjs/internal/FsFailure.js.map +7 -0
- package/dist/cjs/internal/GitWorktree.d.ts +108 -0
- package/dist/cjs/internal/GitWorktree.d.ts.map +1 -0
- package/dist/cjs/internal/GitWorktree.js +276 -0
- package/dist/cjs/internal/GitWorktree.js.map +7 -0
- package/dist/cjs/internal/Grouping.d.ts +51 -0
- package/dist/cjs/internal/Grouping.d.ts.map +1 -0
- package/dist/cjs/internal/Grouping.js +83 -0
- package/dist/cjs/internal/Grouping.js.map +7 -0
- package/dist/cjs/internal/Html.d.ts +20 -0
- package/dist/cjs/internal/Html.d.ts.map +1 -0
- package/dist/cjs/internal/Html.js +81 -0
- package/dist/cjs/internal/Html.js.map +7 -0
- package/dist/cjs/internal/Http.d.ts +95 -0
- package/dist/cjs/internal/Http.d.ts.map +1 -0
- package/dist/cjs/internal/Http.js +153 -0
- package/dist/cjs/internal/Http.js.map +7 -0
- package/dist/cjs/internal/HttpNetwork.d.ts +27 -0
- package/dist/cjs/internal/HttpNetwork.d.ts.map +1 -0
- package/dist/cjs/internal/HttpNetwork.js +146 -0
- package/dist/cjs/internal/HttpNetwork.js.map +7 -0
- package/dist/cjs/internal/Ignore.d.ts +37 -0
- package/dist/cjs/internal/Ignore.d.ts.map +1 -0
- package/dist/cjs/internal/Ignore.js +100 -0
- package/dist/cjs/internal/Ignore.js.map +7 -0
- package/dist/cjs/internal/LinearRegex.d.ts +19 -0
- package/dist/cjs/internal/LinearRegex.d.ts.map +1 -0
- package/dist/cjs/internal/LinearRegex.js +166 -0
- package/dist/cjs/internal/LinearRegex.js.map +7 -0
- package/dist/cjs/internal/Match.d.ts +85 -0
- package/dist/cjs/internal/Match.d.ts.map +1 -0
- package/dist/cjs/internal/Match.js +99 -0
- package/dist/cjs/internal/Match.js.map +7 -0
- package/dist/cjs/internal/Paths.d.ts +23 -0
- package/dist/cjs/internal/Paths.d.ts.map +1 -0
- package/dist/cjs/internal/Paths.js +52 -0
- package/dist/cjs/internal/Paths.js.map +7 -0
- package/dist/cjs/internal/Preserve.d.ts +25 -0
- package/dist/cjs/internal/Preserve.d.ts.map +1 -0
- package/dist/cjs/internal/Preserve.js +88 -0
- package/dist/cjs/internal/Preserve.js.map +7 -0
- package/dist/cjs/internal/Prune.d.ts +35 -0
- package/dist/cjs/internal/Prune.d.ts.map +1 -0
- package/dist/cjs/internal/Prune.js +54 -0
- package/dist/cjs/internal/Prune.js.map +7 -0
- package/dist/cjs/internal/RemoteTree.d.ts +60 -0
- package/dist/cjs/internal/RemoteTree.d.ts.map +1 -0
- package/dist/cjs/internal/RemoteTree.js +123 -0
- package/dist/cjs/internal/RemoteTree.js.map +7 -0
- package/dist/cjs/internal/SearchContract.d.ts +63 -0
- package/dist/cjs/internal/SearchContract.d.ts.map +1 -0
- package/dist/cjs/internal/SearchContract.js +46 -0
- package/dist/cjs/internal/SearchContract.js.map +7 -0
- package/dist/cjs/internal/Symbols.d.ts +39 -0
- package/dist/cjs/internal/Symbols.d.ts.map +1 -0
- package/dist/cjs/internal/Symbols.js +59 -0
- package/dist/cjs/internal/Symbols.js.map +7 -0
- package/dist/cjs/internal/Tar.d.ts +23 -0
- package/dist/cjs/internal/Tar.d.ts.map +1 -0
- package/dist/cjs/internal/Tar.js +86 -0
- package/dist/cjs/internal/Tar.js.map +7 -0
- package/dist/cjs/internal/TestReport.d.ts +52 -0
- package/dist/cjs/internal/TestReport.d.ts.map +1 -0
- package/dist/cjs/internal/TestReport.js +131 -0
- package/dist/cjs/internal/TestReport.js.map +7 -0
- package/dist/cjs/internal/Text.d.ts +125 -0
- package/dist/cjs/internal/Text.d.ts.map +1 -0
- package/dist/cjs/internal/Text.js +85 -0
- package/dist/cjs/internal/Text.js.map +7 -0
- package/dist/cjs/internal/Url.d.ts +13 -0
- package/dist/cjs/internal/Url.d.ts.map +1 -0
- package/dist/cjs/internal/Url.js +35 -0
- package/dist/cjs/internal/Url.js.map +7 -0
- package/dist/cjs/internal/Walk.d.ts +72 -0
- package/dist/cjs/internal/Walk.d.ts.map +1 -0
- package/dist/cjs/internal/Walk.js +108 -0
- package/dist/cjs/internal/Walk.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/ApplyPatch.d.ts +174 -0
- package/dist/esm/ApplyPatch.d.ts.map +1 -0
- package/dist/esm/ApplyPatch.js +346 -0
- package/dist/esm/ApplyPatch.js.map +1 -0
- package/dist/esm/Bash.d.ts +390 -0
- package/dist/esm/Bash.d.ts.map +1 -0
- package/dist/esm/Bash.js +514 -0
- package/dist/esm/Bash.js.map +1 -0
- package/dist/esm/Checkpoints.d.ts +322 -0
- package/dist/esm/Checkpoints.d.ts.map +1 -0
- package/dist/esm/Checkpoints.js +396 -0
- package/dist/esm/Checkpoints.js.map +1 -0
- package/dist/esm/Container.d.ts +132 -0
- package/dist/esm/Container.d.ts.map +1 -0
- package/dist/esm/Container.js +151 -0
- package/dist/esm/Container.js.map +1 -0
- package/dist/esm/Edit.d.ts +203 -0
- package/dist/esm/Edit.d.ts.map +1 -0
- package/dist/esm/Edit.js +296 -0
- package/dist/esm/Edit.js.map +1 -0
- package/dist/esm/ExaWebSearch.d.ts +22 -0
- package/dist/esm/ExaWebSearch.d.ts.map +1 -0
- package/dist/esm/ExaWebSearch.js +107 -0
- package/dist/esm/ExaWebSearch.js.map +1 -0
- package/dist/esm/Explore.d.ts +328 -0
- package/dist/esm/Explore.d.ts.map +1 -0
- package/dist/esm/Explore.js +106 -0
- package/dist/esm/Explore.js.map +1 -0
- package/dist/esm/Fetch.d.ts +130 -0
- package/dist/esm/Fetch.d.ts.map +1 -0
- package/dist/esm/Fetch.js +91 -0
- package/dist/esm/Fetch.js.map +1 -0
- package/dist/esm/Glob.d.ts +204 -0
- package/dist/esm/Glob.d.ts.map +1 -0
- package/dist/esm/Glob.js +177 -0
- package/dist/esm/Glob.js.map +1 -0
- package/dist/esm/Grep.d.ts +347 -0
- package/dist/esm/Grep.d.ts.map +1 -0
- package/dist/esm/Grep.js +289 -0
- package/dist/esm/Grep.js.map +1 -0
- package/dist/esm/HttpPost.d.ts +130 -0
- package/dist/esm/HttpPost.d.ts.map +1 -0
- package/dist/esm/HttpPost.js +89 -0
- package/dist/esm/HttpPost.js.map +1 -0
- package/dist/esm/LanguageServer.d.ts +90 -0
- package/dist/esm/LanguageServer.d.ts.map +1 -0
- package/dist/esm/LanguageServer.js +57 -0
- package/dist/esm/LanguageServer.js.map +1 -0
- package/dist/esm/Ls.d.ts +164 -0
- package/dist/esm/Ls.d.ts.map +1 -0
- package/dist/esm/Ls.js +178 -0
- package/dist/esm/Ls.js.map +1 -0
- package/dist/esm/Lsp.d.ts +125 -0
- package/dist/esm/Lsp.d.ts.map +1 -0
- package/dist/esm/Lsp.js +165 -0
- package/dist/esm/Lsp.js.map +1 -0
- package/dist/esm/Manifest.d.ts +918 -0
- package/dist/esm/Manifest.d.ts.map +1 -0
- package/dist/esm/Manifest.js +153 -0
- package/dist/esm/Manifest.js.map +1 -0
- package/dist/esm/NativeSearch.d.ts +38 -0
- package/dist/esm/NativeSearch.d.ts.map +1 -0
- package/dist/esm/NativeSearch.js +378 -0
- package/dist/esm/NativeSearch.js.map +1 -0
- package/dist/esm/NodeLanguageServer.d.ts +128 -0
- package/dist/esm/NodeLanguageServer.d.ts.map +1 -0
- package/dist/esm/NodeLanguageServer.js +843 -0
- package/dist/esm/NodeLanguageServer.js.map +1 -0
- package/dist/esm/PortableSearch.d.ts +36 -0
- package/dist/esm/PortableSearch.d.ts.map +1 -0
- package/dist/esm/PortableSearch.js +256 -0
- package/dist/esm/PortableSearch.js.map +1 -0
- package/dist/esm/Probe.d.ts +193 -0
- package/dist/esm/Probe.d.ts.map +1 -0
- package/dist/esm/Probe.js +225 -0
- package/dist/esm/Probe.js.map +1 -0
- package/dist/esm/Read.d.ts +189 -0
- package/dist/esm/Read.d.ts.map +1 -0
- package/dist/esm/Read.js +300 -0
- package/dist/esm/Read.js.map +1 -0
- package/dist/esm/Relocate.d.ts +73 -0
- package/dist/esm/Relocate.d.ts.map +1 -0
- package/dist/esm/Relocate.js +153 -0
- package/dist/esm/Relocate.js.map +1 -0
- package/dist/esm/RemoteSearch.d.ts +54 -0
- package/dist/esm/RemoteSearch.d.ts.map +1 -0
- package/dist/esm/RemoteSearch.js +162 -0
- package/dist/esm/RemoteSearch.js.map +1 -0
- package/dist/esm/Search.d.ts +163 -0
- package/dist/esm/Search.d.ts.map +1 -0
- package/dist/esm/Search.js +47 -0
- package/dist/esm/Search.js.map +1 -0
- package/dist/esm/SearchConformance.d.ts +115 -0
- package/dist/esm/SearchConformance.d.ts.map +1 -0
- package/dist/esm/SearchConformance.js +193 -0
- package/dist/esm/SearchConformance.js.map +1 -0
- package/dist/esm/SearchContract.d.ts +114 -0
- package/dist/esm/SearchContract.d.ts.map +1 -0
- package/dist/esm/SearchContract.js +461 -0
- package/dist/esm/SearchContract.js.map +1 -0
- package/dist/esm/ShellCommand.d.ts +164 -0
- package/dist/esm/ShellCommand.d.ts.map +1 -0
- package/dist/esm/ShellCommand.js +159 -0
- package/dist/esm/ShellCommand.js.map +1 -0
- package/dist/esm/StdError.d.ts +55 -0
- package/dist/esm/StdError.d.ts.map +1 -0
- package/dist/esm/StdError.js +71 -0
- package/dist/esm/StdError.js.map +1 -0
- package/dist/esm/TestRun.d.ts +311 -0
- package/dist/esm/TestRun.d.ts.map +1 -0
- package/dist/esm/TestRun.js +316 -0
- package/dist/esm/TestRun.js.map +1 -0
- package/dist/esm/TestRunner.d.ts +102 -0
- package/dist/esm/TestRunner.d.ts.map +1 -0
- package/dist/esm/TestRunner.js +68 -0
- package/dist/esm/TestRunner.js.map +1 -0
- package/dist/esm/TreeFingerprint.d.ts +140 -0
- package/dist/esm/TreeFingerprint.d.ts.map +1 -0
- package/dist/esm/TreeFingerprint.js +170 -0
- package/dist/esm/TreeFingerprint.js.map +1 -0
- package/dist/esm/UpdatePlan.d.ts +152 -0
- package/dist/esm/UpdatePlan.d.ts.map +1 -0
- package/dist/esm/UpdatePlan.js +129 -0
- package/dist/esm/UpdatePlan.js.map +1 -0
- package/dist/esm/WebFetch.d.ts +134 -0
- package/dist/esm/WebFetch.d.ts.map +1 -0
- package/dist/esm/WebFetch.js +151 -0
- package/dist/esm/WebFetch.js.map +1 -0
- package/dist/esm/WebSearch.d.ts +181 -0
- package/dist/esm/WebSearch.d.ts.map +1 -0
- package/dist/esm/WebSearch.js +134 -0
- package/dist/esm/WebSearch.js.map +1 -0
- package/dist/esm/Write.d.ts +147 -0
- package/dist/esm/Write.d.ts.map +1 -0
- package/dist/esm/Write.js +144 -0
- package/dist/esm/Write.js.map +1 -0
- package/dist/esm/index.d.ts +129 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +129 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/ApplyPatch.d.ts +145 -0
- package/dist/esm/internal/ApplyPatch.d.ts.map +1 -0
- package/dist/esm/internal/ApplyPatch.js +489 -0
- package/dist/esm/internal/ApplyPatch.js.map +1 -0
- package/dist/esm/internal/CodexText.d.ts +73 -0
- package/dist/esm/internal/CodexText.d.ts.map +1 -0
- package/dist/esm/internal/CodexText.js +156 -0
- package/dist/esm/internal/CodexText.js.map +1 -0
- package/dist/esm/internal/Declaration.d.ts +49 -0
- package/dist/esm/internal/Declaration.d.ts.map +1 -0
- package/dist/esm/internal/Declaration.js +42 -0
- package/dist/esm/internal/Declaration.js.map +1 -0
- package/dist/esm/internal/Diagnostics.d.ts +77 -0
- package/dist/esm/internal/Diagnostics.d.ts.map +1 -0
- package/dist/esm/internal/Diagnostics.js +99 -0
- package/dist/esm/internal/Diagnostics.js.map +1 -0
- package/dist/esm/internal/EnvelopePrecheck.d.ts +69 -0
- package/dist/esm/internal/EnvelopePrecheck.d.ts.map +1 -0
- package/dist/esm/internal/EnvelopePrecheck.js +426 -0
- package/dist/esm/internal/EnvelopePrecheck.js.map +1 -0
- package/dist/esm/internal/Exec.d.ts +151 -0
- package/dist/esm/internal/Exec.d.ts.map +1 -0
- package/dist/esm/internal/Exec.js +285 -0
- package/dist/esm/internal/Exec.js.map +1 -0
- package/dist/esm/internal/FileMutation.d.ts +109 -0
- package/dist/esm/internal/FileMutation.d.ts.map +1 -0
- package/dist/esm/internal/FileMutation.js +123 -0
- package/dist/esm/internal/FileMutation.js.map +1 -0
- package/dist/esm/internal/FsFailure.d.ts +38 -0
- package/dist/esm/internal/FsFailure.d.ts.map +1 -0
- package/dist/esm/internal/FsFailure.js +39 -0
- package/dist/esm/internal/FsFailure.js.map +1 -0
- package/dist/esm/internal/GitWorktree.d.ts +108 -0
- package/dist/esm/internal/GitWorktree.d.ts.map +1 -0
- package/dist/esm/internal/GitWorktree.js +352 -0
- package/dist/esm/internal/GitWorktree.js.map +1 -0
- package/dist/esm/internal/Grouping.d.ts +51 -0
- package/dist/esm/internal/Grouping.d.ts.map +1 -0
- package/dist/esm/internal/Grouping.js +99 -0
- package/dist/esm/internal/Grouping.js.map +1 -0
- package/dist/esm/internal/Html.d.ts +20 -0
- package/dist/esm/internal/Html.d.ts.map +1 -0
- package/dist/esm/internal/Html.js +70 -0
- package/dist/esm/internal/Html.js.map +1 -0
- package/dist/esm/internal/Http.d.ts +95 -0
- package/dist/esm/internal/Http.d.ts.map +1 -0
- package/dist/esm/internal/Http.js +154 -0
- package/dist/esm/internal/Http.js.map +1 -0
- package/dist/esm/internal/HttpNetwork.d.ts +27 -0
- package/dist/esm/internal/HttpNetwork.d.ts.map +1 -0
- package/dist/esm/internal/HttpNetwork.js +114 -0
- package/dist/esm/internal/HttpNetwork.js.map +1 -0
- package/dist/esm/internal/Ignore.d.ts +37 -0
- package/dist/esm/internal/Ignore.d.ts.map +1 -0
- package/dist/esm/internal/Ignore.js +128 -0
- package/dist/esm/internal/Ignore.js.map +1 -0
- package/dist/esm/internal/LinearRegex.d.ts +19 -0
- package/dist/esm/internal/LinearRegex.d.ts.map +1 -0
- package/dist/esm/internal/LinearRegex.js +176 -0
- package/dist/esm/internal/LinearRegex.js.map +1 -0
- package/dist/esm/internal/Match.d.ts +85 -0
- package/dist/esm/internal/Match.d.ts.map +1 -0
- package/dist/esm/internal/Match.js +142 -0
- package/dist/esm/internal/Match.js.map +1 -0
- package/dist/esm/internal/Paths.d.ts +23 -0
- package/dist/esm/internal/Paths.d.ts.map +1 -0
- package/dist/esm/internal/Paths.js +40 -0
- package/dist/esm/internal/Paths.js.map +1 -0
- package/dist/esm/internal/Preserve.d.ts +25 -0
- package/dist/esm/internal/Preserve.d.ts.map +1 -0
- package/dist/esm/internal/Preserve.js +70 -0
- package/dist/esm/internal/Preserve.js.map +1 -0
- package/dist/esm/internal/Prune.d.ts +35 -0
- package/dist/esm/internal/Prune.d.ts.map +1 -0
- package/dist/esm/internal/Prune.js +60 -0
- package/dist/esm/internal/Prune.js.map +1 -0
- package/dist/esm/internal/RemoteTree.d.ts +60 -0
- package/dist/esm/internal/RemoteTree.d.ts.map +1 -0
- package/dist/esm/internal/RemoteTree.js +132 -0
- package/dist/esm/internal/RemoteTree.js.map +1 -0
- package/dist/esm/internal/SearchContract.d.ts +63 -0
- package/dist/esm/internal/SearchContract.d.ts.map +1 -0
- package/dist/esm/internal/SearchContract.js +66 -0
- package/dist/esm/internal/SearchContract.js.map +1 -0
- package/dist/esm/internal/Symbols.d.ts +39 -0
- package/dist/esm/internal/Symbols.d.ts.map +1 -0
- package/dist/esm/internal/Symbols.js +79 -0
- package/dist/esm/internal/Symbols.js.map +1 -0
- package/dist/esm/internal/Tar.d.ts +23 -0
- package/dist/esm/internal/Tar.d.ts.map +1 -0
- package/dist/esm/internal/Tar.js +97 -0
- package/dist/esm/internal/Tar.js.map +1 -0
- package/dist/esm/internal/TestReport.d.ts +52 -0
- package/dist/esm/internal/TestReport.d.ts.map +1 -0
- package/dist/esm/internal/TestReport.js +172 -0
- package/dist/esm/internal/TestReport.js.map +1 -0
- package/dist/esm/internal/Text.d.ts +125 -0
- package/dist/esm/internal/Text.d.ts.map +1 -0
- package/dist/esm/internal/Text.js +141 -0
- package/dist/esm/internal/Text.js.map +1 -0
- package/dist/esm/internal/Url.d.ts +13 -0
- package/dist/esm/internal/Url.d.ts.map +1 -0
- package/dist/esm/internal/Url.js +27 -0
- package/dist/esm/internal/Url.js.map +1 -0
- package/dist/esm/internal/Walk.d.ts +72 -0
- package/dist/esm/internal/Walk.d.ts.map +1 -0
- package/dist/esm/internal/Walk.js +126 -0
- package/dist/esm/internal/Walk.js.map +1 -0
- package/docs/README.md +119 -0
- package/docs/api.md +499 -0
- package/docs/concepts/effects-and-capabilities.md +138 -0
- package/docs/concepts/flows-and-handlers.md +115 -0
- package/docs/concepts/limits-and-disclosure.md +105 -0
- package/docs/concepts/search-contract.md +182 -0
- package/docs/guides/bind-the-standard-flows.md +116 -0
- package/docs/guides/implement-a-search-peer.md +133 -0
- package/docs/guides/pin-a-checkpoint.md +161 -0
- package/docs/guides/query-a-language-server.md +257 -0
- package/docs/guides/reach-the-network.md +141 -0
- package/docs/guides/read-and-edit-a-file.md +240 -0
- package/docs/guides/run-a-shell-command.md +236 -0
- package/docs/guides/run-the-test-suite.md +154 -0
- package/docs/guides/search-a-workspace.md +148 -0
- package/docs/installation.md +115 -0
- package/docs/quickstart.md +125 -0
- package/docs/reference/flows.md +556 -0
- package/docs/troubleshooting.md +347 -0
- package/package.json +449 -3
- package/src/ApplyPatch.ts +458 -0
- package/src/Bash.ts +619 -0
- package/src/Checkpoints.ts +589 -0
- package/src/Container.ts +212 -0
- package/src/Edit.ts +366 -0
- package/src/ExaWebSearch.ts +145 -0
- package/src/Explore.ts +139 -0
- package/src/Fetch.ts +117 -0
- package/src/Glob.ts +200 -0
- package/src/Grep.ts +320 -0
- package/src/HttpPost.ts +120 -0
- package/src/LanguageServer.ts +110 -0
- package/src/Ls.ts +228 -0
- package/src/Lsp.ts +184 -0
- package/src/Manifest.ts +162 -0
- package/src/NativeSearch.ts +457 -0
- package/src/NodeLanguageServer.ts +1148 -0
- package/src/PortableSearch.ts +284 -0
- package/src/Probe.ts +284 -0
- package/src/Read.ts +359 -0
- package/src/Relocate.ts +166 -0
- package/src/RemoteSearch.ts +199 -0
- package/src/Search.ts +185 -0
- package/src/SearchConformance.ts +288 -0
- package/src/SearchContract.ts +489 -0
- package/src/ShellCommand.ts +201 -0
- package/src/StdError.ts +80 -0
- package/src/TestRun.ts +401 -0
- package/src/TestRunner.ts +119 -0
- package/src/TreeFingerprint.ts +200 -0
- package/src/UpdatePlan.ts +171 -0
- package/src/WebFetch.ts +194 -0
- package/src/WebSearch.ts +165 -0
- package/src/Write.ts +195 -0
- package/src/index.ts +157 -0
- package/src/internal/ApplyPatch.ts +601 -0
- package/src/internal/CodexText.ts +182 -0
- package/src/internal/Declaration.ts +60 -0
- package/src/internal/Diagnostics.ts +134 -0
- package/src/internal/EnvelopePrecheck.ts +489 -0
- package/src/internal/Exec.ts +427 -0
- package/src/internal/FileMutation.ts +231 -0
- package/src/internal/FsFailure.ts +51 -0
- package/src/internal/GitWorktree.ts +491 -0
- package/src/internal/Grouping.ts +106 -0
- package/src/internal/Html.ts +87 -0
- package/src/internal/Http.ts +209 -0
- package/src/internal/HttpNetwork.ts +153 -0
- package/src/internal/Ignore.ts +135 -0
- package/src/internal/LinearRegex.ts +173 -0
- package/src/internal/Match.ts +172 -0
- package/src/internal/Paths.ts +42 -0
- package/src/internal/Preserve.ts +108 -0
- package/src/internal/Prune.ts +62 -0
- package/src/internal/RemoteTree.ts +159 -0
- package/src/internal/SearchContract.ts +77 -0
- package/src/internal/Symbols.ts +88 -0
- package/src/internal/Tar.ts +95 -0
- package/src/internal/TestReport.ts +194 -0
- package/src/internal/Text.ts +185 -0
- package/src/internal/Url.ts +23 -0
- package/src/internal/Walk.ts +176 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a test runner said, read out of what it printed.
|
|
3
|
+
*
|
|
4
|
+
* A suite's answer is two facts — how many passed, and which ones failed — and
|
|
5
|
+
* a runner spends twenty to thirty kilobytes of stdout saying them. Paying a
|
|
6
|
+
* model to read that is the expensive way to learn a number, and the measured
|
|
7
|
+
* program shows what it costs: sixteen frames on sphinx-8721 existed because a
|
|
8
|
+
* pre-existing failure was never isolated, and the failure *names* were in the
|
|
9
|
+
* output all along.
|
|
10
|
+
*
|
|
11
|
+
* The parsers below recognise the report shapes the standard runners print.
|
|
12
|
+
* Precision is the design constraint, exactly as in `Probe`: a reader claims a
|
|
13
|
+
* complete report only when the runner printed an authoritative completion
|
|
14
|
+
* statement and the observed outcomes agree with it. Pytest requires a tally,
|
|
15
|
+
* TAP requires a plan with every planned outcome, and unittest requires its
|
|
16
|
+
* `Ran` line plus an `OK` or `FAILED` summary. Incomplete captures still return
|
|
17
|
+
* the outcomes they contain with `parsed: false`. A wrong failure set is worse
|
|
18
|
+
* than no failure set, because attribution is built on it.
|
|
19
|
+
*
|
|
20
|
+
* @since 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
const unique = (ids) => [...new Set(ids)];
|
|
23
|
+
const collect = (text, pattern) => {
|
|
24
|
+
const found = [];
|
|
25
|
+
for (const match of text.matchAll(pattern)) {
|
|
26
|
+
found.push(match[1]);
|
|
27
|
+
}
|
|
28
|
+
return found;
|
|
29
|
+
};
|
|
30
|
+
const count = (text, pattern) => {
|
|
31
|
+
const match = pattern.exec(text);
|
|
32
|
+
return match === null ? undefined : Number(match[1]);
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* pytest, in every verbosity it is normally run at.
|
|
36
|
+
*
|
|
37
|
+
* The short summary (`-rA`, and the default on failure) prints one
|
|
38
|
+
* `FAILED path::id - reason` line per failure, and the tally line prints the
|
|
39
|
+
* authoritative counts. Verbose outcome lines preserve observations from an
|
|
40
|
+
* incomplete capture but cannot establish that the run completed.
|
|
41
|
+
*/
|
|
42
|
+
const pytest = (text) => {
|
|
43
|
+
const summaryFailed = collect(text, /^(?:FAILED|ERROR)[ \t]+(.+?)(?:[ \t]+-[ \t]+.*)?$/gm);
|
|
44
|
+
const outcomes = [...text.matchAll(/^(.+?)[ \t]+(PASSED|FAILED|ERROR)(?:[ \t]+.*)?$/gm)];
|
|
45
|
+
const verboseFailed = outcomes.flatMap((match) => match[2] === "FAILED" || match[2] === "ERROR" ? [match[1]] : []);
|
|
46
|
+
const verbosePassed = unique(outcomes.flatMap((match) => match[2] === "PASSED" ? [match[1]] : [])).length;
|
|
47
|
+
const failed = unique([...summaryFailed, ...verboseFailed]);
|
|
48
|
+
// Only a terminal pytest summary can certify completion. Earlier diagnostic
|
|
49
|
+
// lines (including test stdout) are not runner tallies.
|
|
50
|
+
const lastLine = text.trimEnd().split("\n").at(-1);
|
|
51
|
+
const summary = /^(?:=+[ \t]*)?(\d+ [a-z]+(?:,[ \t]*\d+ [a-z]+)*) in \d+(?:\.\d+)?s(?: \([^)]*\))?[ \t]*(?:=+)?$/
|
|
52
|
+
.exec(lastLine)?.[1];
|
|
53
|
+
const tally = summary === undefined ? undefined : count(summary, /\b(\d+) passed\b/);
|
|
54
|
+
const failures = summary === undefined ? undefined : count(summary, /\b(\d+) failed\b/);
|
|
55
|
+
const errors = summary === undefined ? undefined : count(summary, /\b(\d+) errors?\b/);
|
|
56
|
+
const hasTally = tally !== undefined || failures !== undefined || errors !== undefined;
|
|
57
|
+
const reportedFailed = hasTally ? (failures ?? 0) + (errors ?? 0) : undefined;
|
|
58
|
+
if (!hasTally && outcomes.length === 0 && summaryFailed.length === 0)
|
|
59
|
+
return undefined;
|
|
60
|
+
return {
|
|
61
|
+
passed: tally ?? verbosePassed,
|
|
62
|
+
failed,
|
|
63
|
+
reportedFailed,
|
|
64
|
+
parsed: hasTally && failed.length === reportedFailed
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* unittest, whose failures name a method and a class in the opposite order to
|
|
69
|
+
* the dotted id everything else uses.
|
|
70
|
+
*/
|
|
71
|
+
const unittest = (text) => {
|
|
72
|
+
const ran = count(text, /^Ran (\d+) tests?\b/m);
|
|
73
|
+
const outcomes = [...text.matchAll(/^(?:FAIL|ERROR|UNEXPECTED SUCCESS):[ \t]+(\S+)[ \t]+\(([^)\s]+)\)/gm)];
|
|
74
|
+
if (ran === undefined && outcomes.length === 0)
|
|
75
|
+
return undefined;
|
|
76
|
+
const failed = unique(outcomes.map((match) => match[2].endsWith(`.${match[1]}`) ? match[2] : `${match[2]}.${match[1]}`));
|
|
77
|
+
const summary = /^(OK|FAILED)(?: \(([^)]*)\))?[ \t]*$/m.exec(text);
|
|
78
|
+
const counts = new Map();
|
|
79
|
+
let known = summary !== null;
|
|
80
|
+
for (const entry of summary?.[2]?.split(", ") ?? []) {
|
|
81
|
+
const match = /^(failures|errors|skipped|expected failures|unexpected successes)=(\d+)$/.exec(entry);
|
|
82
|
+
if (match === null || counts.has(match[1]))
|
|
83
|
+
known = false;
|
|
84
|
+
else
|
|
85
|
+
counts.set(match[1], Number(match[2]));
|
|
86
|
+
}
|
|
87
|
+
const reportedFailed = known
|
|
88
|
+
? (counts.get("failures") ?? 0) + (counts.get("errors") ?? 0) + (counts.get("unexpected successes") ?? 0)
|
|
89
|
+
: undefined;
|
|
90
|
+
const skipped = counts.get("skipped") ?? 0;
|
|
91
|
+
const expectedFailures = counts.get("expected failures") ?? 0;
|
|
92
|
+
const passed = ran === undefined || reportedFailed === undefined
|
|
93
|
+
? 0
|
|
94
|
+
: Math.max(0, ran - reportedFailed - skipped - expectedFailures);
|
|
95
|
+
return {
|
|
96
|
+
passed,
|
|
97
|
+
failed,
|
|
98
|
+
reportedFailed,
|
|
99
|
+
parsed: ran !== undefined && reportedFailed !== undefined && failed.length === reportedFailed &&
|
|
100
|
+
(summary?.[1] === "OK" ? reportedFailed === 0 : reportedFailed > 0) &&
|
|
101
|
+
passed + failed.length + skipped + expectedFailures === ran
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* TAP, which several ecosystems emit and which names each test on its own line.
|
|
106
|
+
*/
|
|
107
|
+
const tap = (text) => {
|
|
108
|
+
const outcomes = [...text.matchAll(/^(not ok|ok)\b[ \t]*\d*[ \t]*-?[ \t]*(.*)$/gm)].map((match) => {
|
|
109
|
+
const directive = /[ \t]*#[ \t]*(SKIP|TODO)\b.*$/i.exec(match[2]);
|
|
110
|
+
return {
|
|
111
|
+
ok: match[1] === "ok",
|
|
112
|
+
id: match[2].slice(0, directive?.index).trim(),
|
|
113
|
+
directive: directive === null ? undefined : directive[1].toUpperCase()
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
const failures = outcomes.filter((outcome) => !outcome.ok && outcome.directive === undefined);
|
|
117
|
+
const failed = unique(failures.flatMap((outcome) => outcome.id === "" ? [] : [outcome.id]));
|
|
118
|
+
const passed = outcomes.filter((outcome) => outcome.ok && outcome.directive !== "SKIP").length;
|
|
119
|
+
const planned = count(text, /^1\.\.(\d+)\b/m);
|
|
120
|
+
if (outcomes.length === 0 && planned === undefined)
|
|
121
|
+
return undefined;
|
|
122
|
+
const reportedFailed = failures.length;
|
|
123
|
+
return {
|
|
124
|
+
passed,
|
|
125
|
+
failed,
|
|
126
|
+
reportedFailed,
|
|
127
|
+
parsed: planned !== undefined && outcomes.length === planned && failed.length === reportedFailed
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Reads one run's report, or says plainly that it could not.
|
|
132
|
+
*
|
|
133
|
+
* @category parsing
|
|
134
|
+
* @since 1.0.0
|
|
135
|
+
*/
|
|
136
|
+
export const parse = (text) => {
|
|
137
|
+
const hasTap = /^(?:TAP version \d+|1\.\.\d+|not ok\b|ok\b)/m.test(text);
|
|
138
|
+
const hasUnittest = /^Ran \d+ tests?\b/m.test(text);
|
|
139
|
+
const lastLine = text.trimEnd().split("\n").at(-1);
|
|
140
|
+
const hasPytest = /^(?:=+[ \t]*)?\d+ [a-z]+(?:,[ \t]*\d+ [a-z]+)* in \d+(?:\.\d+)?s(?: \([^)]*\))?[ \t]*(?:=+)?$/
|
|
141
|
+
.test(lastLine);
|
|
142
|
+
// Two runner completion signatures in one capture cannot establish which
|
|
143
|
+
// protocol owns the outcomes. Never attribute such a report.
|
|
144
|
+
if ([hasTap, hasUnittest, hasPytest].filter(Boolean).length > 1) {
|
|
145
|
+
return { passed: 0, failed: [], reportedFailed: undefined, parsed: false };
|
|
146
|
+
}
|
|
147
|
+
const readers = hasTap ? [tap] : hasUnittest ? [unittest] : hasPytest ? [pytest] : [unittest, pytest, tap];
|
|
148
|
+
for (const reader of readers) {
|
|
149
|
+
const report = reader(text);
|
|
150
|
+
if (report !== undefined)
|
|
151
|
+
return report;
|
|
152
|
+
}
|
|
153
|
+
return { passed: 0, failed: [], reportedFailed: undefined, parsed: false };
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* How two runs of the same command differ, which is the whole of attribution.
|
|
157
|
+
*
|
|
158
|
+
* @category parsing
|
|
159
|
+
* @since 1.0.0
|
|
160
|
+
*/
|
|
161
|
+
export const attribute = (current, base) => {
|
|
162
|
+
if (!current.parsed || !base.parsed)
|
|
163
|
+
return undefined;
|
|
164
|
+
const before = new Set(base.failed);
|
|
165
|
+
const now = new Set(current.failed);
|
|
166
|
+
return {
|
|
167
|
+
introduced: current.failed.filter((id) => !before.has(id)),
|
|
168
|
+
preexisting: current.failed.filter((id) => before.has(id)),
|
|
169
|
+
fixed: base.failed.filter((id) => !now.has(id))
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
//# sourceMappingURL=TestReport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestReport.js","sourceRoot":"","sources":["../../../src/internal/TestReport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAeH,MAAM,MAAM,GAAG,CAAC,GAA0B,EAAyB,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;AAEvF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,OAAe,EAAyB,EAAE;IACvE,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAA;IACvB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,OAAe,EAAsB,EAAE;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACtD,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,GAAG,CAAC,IAAY,EAAsB,EAAE;IAClD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,EAAE,qDAAqD,CAAC,CAAA;IAC1F,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,mDAAmD,CAAC,CAAC,CAAA;IACxF,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACnH,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;IAC1G,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,CAAC,CAAA;IAC3D,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAA;IACnD,MAAM,OAAO,GAAG,iGAAiG;SAC9G,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACtB,MAAM,KAAK,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAA;IACpF,MAAM,QAAQ,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAA;IACvF,MAAM,MAAM,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAA;IACtF,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,CAAA;IACtF,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7E,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACtF,OAAO;QACL,MAAM,EAAE,KAAK,IAAI,aAAa;QAC9B,MAAM;QACN,cAAc;QACd,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc;KACrD,CAAA;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAsB,EAAE;IACpD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,qEAAqE,CAAC,CAAC,CAAA;IAC1G,IAAI,GAAG,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAChE,MAAM,MAAM,GAAG,MAAM,CACnB,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CACpG,CAAA;IACD,MAAM,OAAO,GAAG,uCAAuC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,IAAI,KAAK,GAAG,OAAO,KAAK,IAAI,CAAA;IAC5B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,0EAA0E,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpG,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;YAAE,KAAK,GAAG,KAAK,CAAA;;YACrD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9C,CAAC;IACD,MAAM,cAAc,GAAG,KAAK;QAC1B,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACzG,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;IAC7D,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS;QAC9D,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,cAAc,GAAG,OAAO,GAAG,gBAAgB,CAAC,CAAA;IAClE,OAAO;QACL,MAAM;QACN,MAAM;QACN,cAAc;QACd,MAAM,EAAE,GAAG,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc;YAC3F,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;YACnE,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,gBAAgB,KAAK,GAAG;KAC9D,CAAA;AACH,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,GAAG,GAAG,CAAC,IAAY,EAAsB,EAAE;IAC/C,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,8CAA8C,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAChG,MAAM,SAAS,GAAG,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAA;QAClE,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;YACrB,EAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE;YAC/C,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE;SACxE,CAAA;IACH,CAAC,CAAC,CAAA;IACF,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAA;IAC7F,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC3F,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,MAAM,CAAA;IAC9F,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACpE,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAA;IACtC,OAAO;QACL,MAAM;QACN,MAAM;QACN,cAAc;QACd,MAAM,EAAE,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc;KACjG,CAAA;AACH,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE;IAC5C,MAAM,MAAM,GAAG,8CAA8C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxE,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAA;IACnD,MAAM,SAAS,GAAG,+FAA+F;SAC9G,IAAI,CAAC,QAAQ,CAAC,CAAA;IACjB,yEAAyE;IACzE,6DAA6D;IAC7D,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAC5E,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;IAC1G,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAA;IACzC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC5E,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,OAAe,EACf,IAAY,EAKA,EAAE;IACd,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACnC,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1D,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1D,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;KAChD,CAAA;AACH,CAAC,CAAA","sourcesContent":["/**\n * What a test runner said, read out of what it printed.\n *\n * A suite's answer is two facts — how many passed, and which ones failed — and\n * a runner spends twenty to thirty kilobytes of stdout saying them. Paying a\n * model to read that is the expensive way to learn a number, and the measured\n * program shows what it costs: sixteen frames on sphinx-8721 existed because a\n * pre-existing failure was never isolated, and the failure *names* were in the\n * output all along.\n *\n * The parsers below recognise the report shapes the standard runners print.\n * Precision is the design constraint, exactly as in `Probe`: a reader claims a\n * complete report only when the runner printed an authoritative completion\n * statement and the observed outcomes agree with it. Pytest requires a tally,\n * TAP requires a plan with every planned outcome, and unittest requires its\n * `Ran` line plus an `OK` or `FAILED` summary. Incomplete captures still return\n * the outcomes they contain with `parsed: false`. A wrong failure set is worse\n * than no failure set, because attribution is built on it.\n *\n * @since 1.0.0\n */\n\n/**\n * One run's outcome as this module could read it.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface Report {\n readonly passed: number\n readonly failed: ReadonlyArray<string>\n readonly reportedFailed: number | undefined\n readonly parsed: boolean\n}\n\nconst unique = (ids: ReadonlyArray<string>): ReadonlyArray<string> => [...new Set(ids)]\n\nconst collect = (text: string, pattern: RegExp): ReadonlyArray<string> => {\n const found: Array<string> = []\n for (const match of text.matchAll(pattern)) {\n found.push(match[1]!)\n }\n return found\n}\n\nconst count = (text: string, pattern: RegExp): number | undefined => {\n const match = pattern.exec(text)\n return match === null ? undefined : Number(match[1])\n}\n\n/**\n * pytest, in every verbosity it is normally run at.\n *\n * The short summary (`-rA`, and the default on failure) prints one\n * `FAILED path::id - reason` line per failure, and the tally line prints the\n * authoritative counts. Verbose outcome lines preserve observations from an\n * incomplete capture but cannot establish that the run completed.\n */\nconst pytest = (text: string): Report | undefined => {\n const summaryFailed = collect(text, /^(?:FAILED|ERROR)[ \\t]+(.+?)(?:[ \\t]+-[ \\t]+.*)?$/gm)\n const outcomes = [...text.matchAll(/^(.+?)[ \\t]+(PASSED|FAILED|ERROR)(?:[ \\t]+.*)?$/gm)]\n const verboseFailed = outcomes.flatMap((match) => match[2] === \"FAILED\" || match[2] === \"ERROR\" ? [match[1]!] : [])\n const verbosePassed = unique(outcomes.flatMap((match) => match[2] === \"PASSED\" ? [match[1]!] : [])).length\n const failed = unique([...summaryFailed, ...verboseFailed])\n // Only a terminal pytest summary can certify completion. Earlier diagnostic\n // lines (including test stdout) are not runner tallies.\n const lastLine = text.trimEnd().split(\"\\n\").at(-1)!\n const summary = /^(?:=+[ \\t]*)?(\\d+ [a-z]+(?:,[ \\t]*\\d+ [a-z]+)*) in \\d+(?:\\.\\d+)?s(?: \\([^)]*\\))?[ \\t]*(?:=+)?$/\n .exec(lastLine)?.[1]\n const tally = summary === undefined ? undefined : count(summary, /\\b(\\d+) passed\\b/)\n const failures = summary === undefined ? undefined : count(summary, /\\b(\\d+) failed\\b/)\n const errors = summary === undefined ? undefined : count(summary, /\\b(\\d+) errors?\\b/)\n const hasTally = tally !== undefined || failures !== undefined || errors !== undefined\n const reportedFailed = hasTally ? (failures ?? 0) + (errors ?? 0) : undefined\n if (!hasTally && outcomes.length === 0 && summaryFailed.length === 0) return undefined\n return {\n passed: tally ?? verbosePassed,\n failed,\n reportedFailed,\n parsed: hasTally && failed.length === reportedFailed\n }\n}\n\n/**\n * unittest, whose failures name a method and a class in the opposite order to\n * the dotted id everything else uses.\n */\nconst unittest = (text: string): Report | undefined => {\n const ran = count(text, /^Ran (\\d+) tests?\\b/m)\n const outcomes = [...text.matchAll(/^(?:FAIL|ERROR|UNEXPECTED SUCCESS):[ \\t]+(\\S+)[ \\t]+\\(([^)\\s]+)\\)/gm)]\n if (ran === undefined && outcomes.length === 0) return undefined\n const failed = unique(\n outcomes.map((match) => match[2]!.endsWith(`.${match[1]}`) ? match[2]! : `${match[2]}.${match[1]}`)\n )\n const summary = /^(OK|FAILED)(?: \\(([^)]*)\\))?[ \\t]*$/m.exec(text)\n const counts = new Map<string, number>()\n let known = summary !== null\n for (const entry of summary?.[2]?.split(\", \") ?? []) {\n const match = /^(failures|errors|skipped|expected failures|unexpected successes)=(\\d+)$/.exec(entry)\n if (match === null || counts.has(match[1]!)) known = false\n else counts.set(match[1]!, Number(match[2]))\n }\n const reportedFailed = known\n ? (counts.get(\"failures\") ?? 0) + (counts.get(\"errors\") ?? 0) + (counts.get(\"unexpected successes\") ?? 0)\n : undefined\n const skipped = counts.get(\"skipped\") ?? 0\n const expectedFailures = counts.get(\"expected failures\") ?? 0\n const passed = ran === undefined || reportedFailed === undefined\n ? 0\n : Math.max(0, ran - reportedFailed - skipped - expectedFailures)\n return {\n passed,\n failed,\n reportedFailed,\n parsed: ran !== undefined && reportedFailed !== undefined && failed.length === reportedFailed &&\n (summary?.[1] === \"OK\" ? reportedFailed === 0 : reportedFailed > 0) &&\n passed + failed.length + skipped + expectedFailures === ran\n }\n}\n\n/**\n * TAP, which several ecosystems emit and which names each test on its own line.\n */\nconst tap = (text: string): Report | undefined => {\n const outcomes = [...text.matchAll(/^(not ok|ok)\\b[ \\t]*\\d*[ \\t]*-?[ \\t]*(.*)$/gm)].map((match) => {\n const directive = /[ \\t]*#[ \\t]*(SKIP|TODO)\\b.*$/i.exec(match[2]!)\n return {\n ok: match[1] === \"ok\",\n id: match[2]!.slice(0, directive?.index).trim(),\n directive: directive === null ? undefined : directive[1]!.toUpperCase()\n }\n })\n const failures = outcomes.filter((outcome) => !outcome.ok && outcome.directive === undefined)\n const failed = unique(failures.flatMap((outcome) => outcome.id === \"\" ? [] : [outcome.id]))\n const passed = outcomes.filter((outcome) => outcome.ok && outcome.directive !== \"SKIP\").length\n const planned = count(text, /^1\\.\\.(\\d+)\\b/m)\n if (outcomes.length === 0 && planned === undefined) return undefined\n const reportedFailed = failures.length\n return {\n passed,\n failed,\n reportedFailed,\n parsed: planned !== undefined && outcomes.length === planned && failed.length === reportedFailed\n }\n}\n\n/**\n * Reads one run's report, or says plainly that it could not.\n *\n * @category parsing\n * @since 1.0.0\n */\nexport const parse = (text: string): Report => {\n const hasTap = /^(?:TAP version \\d+|1\\.\\.\\d+|not ok\\b|ok\\b)/m.test(text)\n const hasUnittest = /^Ran \\d+ tests?\\b/m.test(text)\n const lastLine = text.trimEnd().split(\"\\n\").at(-1)!\n const hasPytest = /^(?:=+[ \\t]*)?\\d+ [a-z]+(?:,[ \\t]*\\d+ [a-z]+)* in \\d+(?:\\.\\d+)?s(?: \\([^)]*\\))?[ \\t]*(?:=+)?$/\n .test(lastLine)\n // Two runner completion signatures in one capture cannot establish which\n // protocol owns the outcomes. Never attribute such a report.\n if ([hasTap, hasUnittest, hasPytest].filter(Boolean).length > 1) {\n return { passed: 0, failed: [], reportedFailed: undefined, parsed: false }\n }\n const readers = hasTap ? [tap] : hasUnittest ? [unittest] : hasPytest ? [pytest] : [unittest, pytest, tap]\n for (const reader of readers) {\n const report = reader(text)\n if (report !== undefined) return report\n }\n return { passed: 0, failed: [], reportedFailed: undefined, parsed: false }\n}\n\n/**\n * How two runs of the same command differ, which is the whole of attribution.\n *\n * @category parsing\n * @since 1.0.0\n */\nexport const attribute = (\n current: Report,\n base: Report\n): {\n readonly introduced: ReadonlyArray<string>\n readonly preexisting: ReadonlyArray<string>\n readonly fixed: ReadonlyArray<string>\n} | undefined => {\n if (!current.parsed || !base.parsed) return undefined\n const before = new Set(base.failed)\n const now = new Set(current.failed)\n return {\n introduced: current.failed.filter((id) => !before.has(id)),\n preexisting: current.failed.filter((id) => before.has(id)),\n fixed: base.failed.filter((id) => !now.has(id))\n }\n}\n"]}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared text paging, numbering, and byte-budget helpers.
|
|
3
|
+
*
|
|
4
|
+
* Every limit here is a display budget, not a policy limit: exceeding one is
|
|
5
|
+
* always disclosed to the model rather than silently applied.
|
|
6
|
+
*
|
|
7
|
+
* @since 1.0.0
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default number of lines or entries returned by a paged flow.
|
|
11
|
+
*
|
|
12
|
+
* @category constants
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_READ_LIMIT = 2000;
|
|
16
|
+
/**
|
|
17
|
+
* Maximum number of directory entries or glob paths returned in one call.
|
|
18
|
+
*
|
|
19
|
+
* @category constants
|
|
20
|
+
* @since 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
export declare const MAX_ENTRIES = 1000;
|
|
23
|
+
/**
|
|
24
|
+
* Maximum number of grep matches returned in one call.
|
|
25
|
+
*
|
|
26
|
+
* @category constants
|
|
27
|
+
* @since 1.0.0
|
|
28
|
+
*/
|
|
29
|
+
export declare const MAX_GREP_MATCHES = 200;
|
|
30
|
+
/**
|
|
31
|
+
* Maximum number of Unicode scalar values displayed for a single line.
|
|
32
|
+
*
|
|
33
|
+
* @category constants
|
|
34
|
+
* @since 1.0.0
|
|
35
|
+
*/
|
|
36
|
+
export declare const MAX_LINE_CHARS = 2000;
|
|
37
|
+
/**
|
|
38
|
+
* Maximum UTF-8 byte budget for one rendered text payload.
|
|
39
|
+
*
|
|
40
|
+
* @category constants
|
|
41
|
+
* @since 1.0.0
|
|
42
|
+
*/
|
|
43
|
+
export declare const MAX_OUTPUT_BYTES = 60000;
|
|
44
|
+
/**
|
|
45
|
+
* Maximum UTF-8 byte budget captured per shell output stream.
|
|
46
|
+
*
|
|
47
|
+
* @category constants
|
|
48
|
+
* @since 1.0.0
|
|
49
|
+
*/
|
|
50
|
+
export declare const MAX_SHELL_OUTPUT_BYTES = 30000;
|
|
51
|
+
/**
|
|
52
|
+
* A byte-budgeted rendering of a text value.
|
|
53
|
+
*
|
|
54
|
+
* @category models
|
|
55
|
+
* @since 1.0.0
|
|
56
|
+
*/
|
|
57
|
+
export interface Truncation {
|
|
58
|
+
readonly text: string;
|
|
59
|
+
readonly truncated: boolean;
|
|
60
|
+
readonly keptBytes: number;
|
|
61
|
+
readonly droppedBytes: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* One page of source lines.
|
|
65
|
+
*
|
|
66
|
+
* @category models
|
|
67
|
+
* @since 1.0.0
|
|
68
|
+
*/
|
|
69
|
+
export interface Page {
|
|
70
|
+
readonly lines: ReadonlyArray<string>;
|
|
71
|
+
readonly startLine: number;
|
|
72
|
+
readonly endLine: number;
|
|
73
|
+
readonly totalLines: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Trims a string to a UTF-8 byte budget without splitting a code point.
|
|
77
|
+
*
|
|
78
|
+
* `keep: "head"` retains the beginning of the value; `keep: "tail"` retains
|
|
79
|
+
* the end, which is what shell output needs because the interesting part of an
|
|
80
|
+
* overflowing stream is almost always its last lines.
|
|
81
|
+
*
|
|
82
|
+
* @category rendering
|
|
83
|
+
* @since 1.0.0
|
|
84
|
+
*/
|
|
85
|
+
export declare const truncateBytes: (text: string, maxBytes: number, options: {
|
|
86
|
+
readonly keep: "head" | "tail";
|
|
87
|
+
}) => Truncation;
|
|
88
|
+
/**
|
|
89
|
+
* Joins the start and the end of a stream cut in the middle around one line
|
|
90
|
+
* naming the bytes cut between them.
|
|
91
|
+
*
|
|
92
|
+
* The line stands alone, so a start that stops mid-line is ended before it.
|
|
93
|
+
* Only the line's own newlines are added; `droppedBytes` counts printed bytes.
|
|
94
|
+
*
|
|
95
|
+
* @category rendering
|
|
96
|
+
* @since 1.0.0-rc.5
|
|
97
|
+
*/
|
|
98
|
+
export declare const elideMiddle: (start: string, droppedBytes: number, end: string) => string;
|
|
99
|
+
/**
|
|
100
|
+
* Splits on LF without counting a terminal LF as a line.
|
|
101
|
+
* Carriage returns remain part of each line, including the CR in CRLF, so
|
|
102
|
+
* joining a page with LF preserves its bytes except for the final LF.
|
|
103
|
+
*
|
|
104
|
+
* @category parsing
|
|
105
|
+
* @since 1.0.0
|
|
106
|
+
*/
|
|
107
|
+
export declare const sourceLines: (text: string) => ReadonlyArray<string>;
|
|
108
|
+
/**
|
|
109
|
+
* Selects a 1-based page of lines from a text value.
|
|
110
|
+
*
|
|
111
|
+
* @category paging
|
|
112
|
+
* @since 1.0.0
|
|
113
|
+
*/
|
|
114
|
+
export declare const slice: (text: string, options: {
|
|
115
|
+
readonly offset: number;
|
|
116
|
+
readonly limit: number;
|
|
117
|
+
}) => Page;
|
|
118
|
+
/**
|
|
119
|
+
* Renders the disclosure appended whenever output was capped.
|
|
120
|
+
*
|
|
121
|
+
* @category rendering
|
|
122
|
+
* @since 1.0.0
|
|
123
|
+
*/
|
|
124
|
+
export declare const notice: (unit: string, shown: number, total: number) => string;
|
|
125
|
+
//# sourceMappingURL=Text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Text.d.ts","sourceRoot":"","sources":["../../../src/internal/Text.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,OAAQ,CAAA;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,WAAW,OAAQ,CAAA;AAEhC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,MAAM,CAAA;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,OAAQ,CAAA;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QAAS,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,QAAS,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B;AAED;;;;;GAKG;AACH,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAKD;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,GACxB,MAAM,MAAM,EACZ,UAAU,MAAM,EAChB,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,KAC1C,UAwBF,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,cAAc,MAAM,EAAE,KAAK,MAAM,KAAG,MAG1D,CAAA;AAErB;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,MAAM,CAI9D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAChB,MAAM,MAAM,EACZ,SAAS;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAC3D,IAWF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,MACL,CAAA"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared text paging, numbering, and byte-budget helpers.
|
|
3
|
+
*
|
|
4
|
+
* Every limit here is a display budget, not a policy limit: exceeding one is
|
|
5
|
+
* always disclosed to the model rather than silently applied.
|
|
6
|
+
*
|
|
7
|
+
* @since 1.0.0
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default number of lines or entries returned by a paged flow.
|
|
11
|
+
*
|
|
12
|
+
* @category constants
|
|
13
|
+
* @since 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_READ_LIMIT = 2_000;
|
|
16
|
+
/**
|
|
17
|
+
* Maximum number of directory entries or glob paths returned in one call.
|
|
18
|
+
*
|
|
19
|
+
* @category constants
|
|
20
|
+
* @since 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
export const MAX_ENTRIES = 1_000;
|
|
23
|
+
/**
|
|
24
|
+
* Maximum number of grep matches returned in one call.
|
|
25
|
+
*
|
|
26
|
+
* @category constants
|
|
27
|
+
* @since 1.0.0
|
|
28
|
+
*/
|
|
29
|
+
export const MAX_GREP_MATCHES = 200;
|
|
30
|
+
/**
|
|
31
|
+
* Maximum number of Unicode scalar values displayed for a single line.
|
|
32
|
+
*
|
|
33
|
+
* @category constants
|
|
34
|
+
* @since 1.0.0
|
|
35
|
+
*/
|
|
36
|
+
export const MAX_LINE_CHARS = 2_000;
|
|
37
|
+
/**
|
|
38
|
+
* Maximum UTF-8 byte budget for one rendered text payload.
|
|
39
|
+
*
|
|
40
|
+
* @category constants
|
|
41
|
+
* @since 1.0.0
|
|
42
|
+
*/
|
|
43
|
+
export const MAX_OUTPUT_BYTES = 60_000;
|
|
44
|
+
/**
|
|
45
|
+
* Maximum UTF-8 byte budget captured per shell output stream.
|
|
46
|
+
*
|
|
47
|
+
* @category constants
|
|
48
|
+
* @since 1.0.0
|
|
49
|
+
*/
|
|
50
|
+
export const MAX_SHELL_OUTPUT_BYTES = 30_000;
|
|
51
|
+
const encoder = new TextEncoder();
|
|
52
|
+
const fatalDecoder = new TextDecoder("utf-8", { fatal: true });
|
|
53
|
+
/**
|
|
54
|
+
* Trims a string to a UTF-8 byte budget without splitting a code point.
|
|
55
|
+
*
|
|
56
|
+
* `keep: "head"` retains the beginning of the value; `keep: "tail"` retains
|
|
57
|
+
* the end, which is what shell output needs because the interesting part of an
|
|
58
|
+
* overflowing stream is almost always its last lines.
|
|
59
|
+
*
|
|
60
|
+
* @category rendering
|
|
61
|
+
* @since 1.0.0
|
|
62
|
+
*/
|
|
63
|
+
export const truncateBytes = (text, maxBytes, options) => {
|
|
64
|
+
const bytes = encoder.encode(text);
|
|
65
|
+
if (bytes.byteLength <= maxBytes) {
|
|
66
|
+
return { text, truncated: false, keptBytes: bytes.byteLength, droppedBytes: 0 };
|
|
67
|
+
}
|
|
68
|
+
let start = options.keep === "head" ? 0 : bytes.byteLength - maxBytes;
|
|
69
|
+
let end = options.keep === "head" ? maxBytes : bytes.byteLength;
|
|
70
|
+
// TextEncoder produces valid UTF-8. Moving a cut inward reaches a scalar
|
|
71
|
+
// boundary after at most three continuation bytes, so decoding must succeed.
|
|
72
|
+
while (true) {
|
|
73
|
+
try {
|
|
74
|
+
const decoded = fatalDecoder.decode(bytes.subarray(start, end));
|
|
75
|
+
const keptBytes = end - start;
|
|
76
|
+
return {
|
|
77
|
+
text: decoded,
|
|
78
|
+
truncated: true,
|
|
79
|
+
keptBytes,
|
|
80
|
+
droppedBytes: bytes.byteLength - keptBytes
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
if (options.keep === "head")
|
|
85
|
+
end--;
|
|
86
|
+
else
|
|
87
|
+
start++;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Joins the start and the end of a stream cut in the middle around one line
|
|
93
|
+
* naming the bytes cut between them.
|
|
94
|
+
*
|
|
95
|
+
* The line stands alone, so a start that stops mid-line is ended before it.
|
|
96
|
+
* Only the line's own newlines are added; `droppedBytes` counts printed bytes.
|
|
97
|
+
*
|
|
98
|
+
* @category rendering
|
|
99
|
+
* @since 1.0.0-rc.5
|
|
100
|
+
*/
|
|
101
|
+
export const elideMiddle = (start, droppedBytes, end) => `${start}${start === "" || start.endsWith("\n") ? "" : "\n"}[${droppedBytes} ${droppedBytes === 1 ? "byte" : "bytes"} omitted]\n${end}`;
|
|
102
|
+
/**
|
|
103
|
+
* Splits on LF without counting a terminal LF as a line.
|
|
104
|
+
* Carriage returns remain part of each line, including the CR in CRLF, so
|
|
105
|
+
* joining a page with LF preserves its bytes except for the final LF.
|
|
106
|
+
*
|
|
107
|
+
* @category parsing
|
|
108
|
+
* @since 1.0.0
|
|
109
|
+
*/
|
|
110
|
+
export const sourceLines = (text) => {
|
|
111
|
+
const lines = text.length === 0 ? [] : text.split("\n");
|
|
112
|
+
if (text.endsWith("\n"))
|
|
113
|
+
lines.pop();
|
|
114
|
+
return lines;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Selects a 1-based page of lines from a text value.
|
|
118
|
+
*
|
|
119
|
+
* @category paging
|
|
120
|
+
* @since 1.0.0
|
|
121
|
+
*/
|
|
122
|
+
export const slice = (text, options) => {
|
|
123
|
+
const lines = sourceLines(text);
|
|
124
|
+
const totalLines = lines.length;
|
|
125
|
+
const startLine = Math.max(1, options.offset);
|
|
126
|
+
const endLine = Math.min(totalLines, startLine + Math.max(0, options.limit) - 1);
|
|
127
|
+
return {
|
|
128
|
+
lines: lines.slice(startLine - 1, endLine),
|
|
129
|
+
startLine,
|
|
130
|
+
endLine,
|
|
131
|
+
totalLines
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Renders the disclosure appended whenever output was capped.
|
|
136
|
+
*
|
|
137
|
+
* @category rendering
|
|
138
|
+
* @since 1.0.0
|
|
139
|
+
*/
|
|
140
|
+
export const notice = (unit, shown, total) => `Showing ${shown} of ${total} ${unit}; output was truncated.`;
|
|
141
|
+
//# sourceMappingURL=Text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Text.js","sourceRoot":"","sources":["../../../src/internal/Text.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared text paging, numbering, and byte-budget helpers.\n *\n * Every limit here is a display budget, not a policy limit: exceeding one is\n * always disclosed to the model rather than silently applied.\n *\n * @since 1.0.0\n */\n\n/**\n * Default number of lines or entries returned by a paged flow.\n *\n * @category constants\n * @since 1.0.0\n */\nexport const DEFAULT_READ_LIMIT = 2_000\n\n/**\n * Maximum number of directory entries or glob paths returned in one call.\n *\n * @category constants\n * @since 1.0.0\n */\nexport const MAX_ENTRIES = 1_000\n\n/**\n * Maximum number of grep matches returned in one call.\n *\n * @category constants\n * @since 1.0.0\n */\nexport const MAX_GREP_MATCHES = 200\n\n/**\n * Maximum number of Unicode scalar values displayed for a single line.\n *\n * @category constants\n * @since 1.0.0\n */\nexport const MAX_LINE_CHARS = 2_000\n\n/**\n * Maximum UTF-8 byte budget for one rendered text payload.\n *\n * @category constants\n * @since 1.0.0\n */\nexport const MAX_OUTPUT_BYTES = 60_000\n\n/**\n * Maximum UTF-8 byte budget captured per shell output stream.\n *\n * @category constants\n * @since 1.0.0\n */\nexport const MAX_SHELL_OUTPUT_BYTES = 30_000\n\n/**\n * A byte-budgeted rendering of a text value.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface Truncation {\n readonly text: string\n readonly truncated: boolean\n readonly keptBytes: number\n readonly droppedBytes: number\n}\n\n/**\n * One page of source lines.\n *\n * @category models\n * @since 1.0.0\n */\nexport interface Page {\n readonly lines: ReadonlyArray<string>\n readonly startLine: number\n readonly endLine: number\n readonly totalLines: number\n}\n\nconst encoder = new TextEncoder()\nconst fatalDecoder = new TextDecoder(\"utf-8\", { fatal: true })\n\n/**\n * Trims a string to a UTF-8 byte budget without splitting a code point.\n *\n * `keep: \"head\"` retains the beginning of the value; `keep: \"tail\"` retains\n * the end, which is what shell output needs because the interesting part of an\n * overflowing stream is almost always its last lines.\n *\n * @category rendering\n * @since 1.0.0\n */\nexport const truncateBytes = (\n text: string,\n maxBytes: number,\n options: { readonly keep: \"head\" | \"tail\" }\n): Truncation => {\n const bytes = encoder.encode(text)\n if (bytes.byteLength <= maxBytes) {\n return { text, truncated: false, keptBytes: bytes.byteLength, droppedBytes: 0 }\n }\n let start = options.keep === \"head\" ? 0 : bytes.byteLength - maxBytes\n let end = options.keep === \"head\" ? maxBytes : bytes.byteLength\n // TextEncoder produces valid UTF-8. Moving a cut inward reaches a scalar\n // boundary after at most three continuation bytes, so decoding must succeed.\n while (true) {\n try {\n const decoded = fatalDecoder.decode(bytes.subarray(start, end))\n const keptBytes = end - start\n return {\n text: decoded,\n truncated: true,\n keptBytes,\n droppedBytes: bytes.byteLength - keptBytes\n }\n } catch {\n if (options.keep === \"head\") end--\n else start++\n }\n }\n}\n\n/**\n * Joins the start and the end of a stream cut in the middle around one line\n * naming the bytes cut between them.\n *\n * The line stands alone, so a start that stops mid-line is ended before it.\n * Only the line's own newlines are added; `droppedBytes` counts printed bytes.\n *\n * @category rendering\n * @since 1.0.0-rc.5\n */\nexport const elideMiddle = (start: string, droppedBytes: number, end: string): string =>\n `${start}${start === \"\" || start.endsWith(\"\\n\") ? \"\" : \"\\n\"}[${droppedBytes} ${\n droppedBytes === 1 ? \"byte\" : \"bytes\"\n } omitted]\\n${end}`\n\n/**\n * Splits on LF without counting a terminal LF as a line.\n * Carriage returns remain part of each line, including the CR in CRLF, so\n * joining a page with LF preserves its bytes except for the final LF.\n *\n * @category parsing\n * @since 1.0.0\n */\nexport const sourceLines = (text: string): ReadonlyArray<string> => {\n const lines = text.length === 0 ? [] : text.split(\"\\n\")\n if (text.endsWith(\"\\n\")) lines.pop()\n return lines\n}\n\n/**\n * Selects a 1-based page of lines from a text value.\n *\n * @category paging\n * @since 1.0.0\n */\nexport const slice = (\n text: string,\n options: { readonly offset: number; readonly limit: number }\n): Page => {\n const lines = sourceLines(text)\n const totalLines = lines.length\n const startLine = Math.max(1, options.offset)\n const endLine = Math.min(totalLines, startLine + Math.max(0, options.limit) - 1)\n return {\n lines: lines.slice(startLine - 1, endLine),\n startLine,\n endLine,\n totalLines\n }\n}\n\n/**\n * Renders the disclosure appended whenever output was capped.\n *\n * @category rendering\n * @since 1.0.0\n */\nexport const notice = (unit: string, shown: number, total: number): string =>\n `Showing ${shown} of ${total} ${unit}; output was truncated.`\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared validation for outbound HTTP URLs.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Parses an HTTP or HTTPS URL without admitting credentials or hostless URLs.
|
|
8
|
+
*
|
|
9
|
+
* @category parsing
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
export declare const parseHttpUrl: (value: string, base?: URL) => URL | undefined;
|
|
13
|
+
//# sourceMappingURL=Url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Url.d.ts","sourceRoot":"","sources":["../../../src/internal/Url.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,EAAE,OAAO,GAAG,KAAG,GAAG,GAAG,SAU9D,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared validation for outbound HTTP URLs.
|
|
3
|
+
*
|
|
4
|
+
* @since 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Parses an HTTP or HTTPS URL without admitting credentials or hostless URLs.
|
|
8
|
+
*
|
|
9
|
+
* @category parsing
|
|
10
|
+
* @since 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
export const parseHttpUrl = (value, base) => {
|
|
13
|
+
if (value.trim() === "")
|
|
14
|
+
return undefined;
|
|
15
|
+
try {
|
|
16
|
+
const url = base === undefined ? new URL(value) : new URL(value, base);
|
|
17
|
+
if (url.protocol !== "http:" && url.protocol !== "https:")
|
|
18
|
+
return undefined;
|
|
19
|
+
if (url.hostname === "" || url.username !== "" || url.password !== "")
|
|
20
|
+
return undefined;
|
|
21
|
+
return url;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=Url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Url.js","sourceRoot":"","sources":["../../../src/internal/Url.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,IAAU,EAAmB,EAAE;IACzE,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACtE,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAA;QAC3E,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE;YAAE,OAAO,SAAS,CAAA;QACvF,OAAO,GAAG,CAAA;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC,CAAA","sourcesContent":["/**\n * Shared validation for outbound HTTP URLs.\n *\n * @since 1.0.0\n */\n\n/**\n * Parses an HTTP or HTTPS URL without admitting credentials or hostless URLs.\n *\n * @category parsing\n * @since 1.0.0\n */\nexport const parseHttpUrl = (value: string, base?: URL): URL | undefined => {\n if (value.trim() === \"\") return undefined\n try {\n const url = base === undefined ? new URL(value) : new URL(value, base)\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return undefined\n if (url.hostname === \"\" || url.username !== \"\" || url.password !== \"\") return undefined\n return url\n } catch {\n return undefined\n }\n}\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The directory names a repository walk never descends into.
|
|
3
|
+
*
|
|
4
|
+
* `grep` and `glob` walk with the kernel filesystem, and every entry costs a
|
|
5
|
+
* guarded stat. A walk rooted at "." that descends into `.git` visits tens of
|
|
6
|
+
* thousands of object files no search wants: one such `grep` held a benchmark
|
|
7
|
+
* frame for its entire fifteen-minute ceiling. The skip set is the same
|
|
8
|
+
* convention ripgrep ships — version control, dependency trees, and caches —
|
|
9
|
+
* and an explicit root inside a skipped directory still walks, because
|
|
10
|
+
* skipping applies to descent, never to what the caller named.
|
|
11
|
+
*
|
|
12
|
+
* @since 1.0.0
|
|
13
|
+
*/
|
|
14
|
+
import type * as Path from "@smthrs/kernel/Path";
|
|
15
|
+
import { Effect } from "effect";
|
|
16
|
+
import type * as FileSystem from "effect/FileSystem";
|
|
17
|
+
import type * as StdError from "../StdError.ts";
|
|
18
|
+
/**
|
|
19
|
+
* Directory basenames excluded from recursive descent.
|
|
20
|
+
*
|
|
21
|
+
* @category constants
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
export declare const skippedDirectories: ReadonlySet<string>;
|
|
25
|
+
/**
|
|
26
|
+
* Separates pattern path segments with slashes while preserving POSIX filenames.
|
|
27
|
+
*
|
|
28
|
+
* @private
|
|
29
|
+
* @since 1.0.0
|
|
30
|
+
*/
|
|
31
|
+
export declare const relativeForPattern: (path: Path.Path, from: string, to: string) => string;
|
|
32
|
+
/**
|
|
33
|
+
* Answers whether each path is a symbolic link, which neither peer follows.
|
|
34
|
+
*
|
|
35
|
+
* `FileSystem.stat` resolves links, so the only probe available is `readLink`,
|
|
36
|
+
* and every probe is one more call in a loop that already makes one per entry.
|
|
37
|
+
* The walk therefore probes directories, where following a link would duplicate
|
|
38
|
+
* a subtree or loop forever, and the callers probe the far smaller set of files
|
|
39
|
+
* they are about to report — batched, never one at a time.
|
|
40
|
+
*
|
|
41
|
+
* @private
|
|
42
|
+
* @since 1.0.0
|
|
43
|
+
*/
|
|
44
|
+
export declare const symbolicLinks: (fileSystem: FileSystem.FileSystem, candidates: ReadonlyArray<string>) => Effect.Effect<ReadonlyArray<boolean>>;
|
|
45
|
+
/**
|
|
46
|
+
* One walk: admitted files, explicit-root status, and ignore exclusions.
|
|
47
|
+
*
|
|
48
|
+
* @private
|
|
49
|
+
* @since 1.0.0
|
|
50
|
+
*/
|
|
51
|
+
export interface Walked {
|
|
52
|
+
readonly ignored: boolean;
|
|
53
|
+
readonly explicitFile: boolean;
|
|
54
|
+
readonly files: ReadonlyArray<string>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Lists the files a search under `root` reaches.
|
|
58
|
+
*
|
|
59
|
+
* Only the root the caller named is allowed to fail the walk. Every entry
|
|
60
|
+
* below it that the process cannot inspect — a dangling symlink, a symlink
|
|
61
|
+
* loop, a directory it may not list — is skipped and the walk continues, which
|
|
62
|
+
* is what `rg --no-messages` does with the same tree. Turning one of those into
|
|
63
|
+
* a typed failure would make a whole repository unsearchable because of one
|
|
64
|
+
* link, and would answer differently from the native peer. Only .gitignore
|
|
65
|
+
* files within this root are read; ignored directories are never descended.
|
|
66
|
+
* `included` narrows the empty-result diagnostic without changing descent.
|
|
67
|
+
*
|
|
68
|
+
* @private
|
|
69
|
+
* @since 1.0.0
|
|
70
|
+
*/
|
|
71
|
+
export declare const files: (fileSystem: FileSystem.FileSystem, path: Path.Path, root: string, hidden: boolean, noIgnore?: boolean, included?: (relative: string, basename: string) => boolean) => Effect.Effect<Walked, StdError.StdError>;
|
|
72
|
+
//# sourceMappingURL=Walk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Walk.d.ts","sourceRoot":"","sources":["../../../src/internal/Walk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,KAAK,IAAI,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,KAAK,UAAU,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAK/C;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAwC,CAAA;AAa3F;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,IAAI,CAAC,IAAI,EAAE,MAAM,MAAM,EAAE,IAAI,MAAM,KAAG,MAG9E,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GACxB,YAAY,UAAU,CAAC,UAAU,EACjC,YAAY,aAAa,CAAC,MAAM,CAAC,KAChC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAKpC,CAAA;AAEH;;;;;GAKG;AACH,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACtC;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,KAAK,GAChB,YAAY,UAAU,CAAC,UAAU,EACjC,MAAM,IAAI,CAAC,IAAI,EACf,MAAM,MAAM,EACZ,QAAQ,OAAO,EACf,kBAAgB,EAChB,WAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAoB,KACrE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAmEtC,CAAA"}
|