@socketsecurity/lib 6.0.5 → 6.0.7
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 +43 -0
- package/dist/ai/discover.d.mts +2 -2
- package/dist/ai/discover.js +6 -4
- package/dist/ai/spawn.js +10 -6
- package/dist/ai/types.d.mts +18 -6
- package/dist/ai/worktree.d.mts +6 -6
- package/dist/ai/worktree.js +12 -7
- package/dist/ansi/strip.d.ts +1 -1
- package/dist/ansi/strip.js +0 -2
- package/dist/archives/_internal.js +7 -9
- package/dist/archives/extract.js +1 -1
- package/dist/archives/tar.js +6 -6
- package/dist/archives/zip.js +4 -6
- package/dist/argv/flag-predicates.d.ts +12 -12
- package/dist/argv/flag-predicates.js +17 -17
- package/dist/argv/flag-types.d.ts +18 -18
- package/dist/argv/flag-types.js +4 -4
- package/dist/argv/parse.d.ts +1 -1
- package/dist/arrays/_internal.js +11 -12
- package/dist/arrays/chunk.js +0 -1
- package/dist/arrays/join.d.ts +37 -3
- package/dist/arrays/join.js +43 -7
- package/dist/arrays/unique.js +0 -1
- package/dist/bin/_internal.d.ts +1 -1
- package/dist/bin/_internal.js +1 -1
- package/dist/bin/acorn-bindgen.cjs +769 -0
- package/dist/bin/acorn.wasm +0 -0
- package/dist/bin/exec.js +2 -3
- package/dist/bin/find.js +13 -13
- package/dist/bin/prim.cjs +39244 -0
- package/dist/bin/resolve.js +12 -13
- package/dist/bin/which.js +8 -8
- package/dist/cache/ttl/store.js +5 -5
- package/dist/checks/primordials-defaults.d.ts +3 -3
- package/dist/checks/primordials-defaults.js +3 -3
- package/dist/checks/primordials.js +4 -3
- package/dist/{bin → cli}/check-primordials.d.ts +11 -11
- package/dist/{bin → cli}/check-primordials.js +56 -52
- package/dist/{bin → cli}/check.js +6 -5
- package/dist/{bin → cli}/socket-lib.d.ts +1 -1
- package/dist/{bin → cli}/socket-lib.js +4 -4
- package/dist/colors/socket-palette.js +7 -9
- package/dist/compression/_internal.d.ts +12 -12
- package/dist/compression/_internal.js +20 -19
- package/dist/compression/brotli.d.ts +25 -25
- package/dist/compression/brotli.js +37 -44
- package/dist/compression/gzip.d.ts +23 -23
- package/dist/compression/gzip.js +44 -52
- package/dist/constants/agents.d.ts +3 -1
- package/dist/constants/agents.js +15 -11
- package/dist/constants/licenses.js +3 -3
- package/dist/constants/node.d.ts +23 -0
- package/dist/constants/node.js +47 -15
- package/dist/constants/packages.js +22 -28
- package/dist/constants/platform.d.ts +30 -3
- package/dist/constants/platform.js +72 -12
- package/dist/constants/runtime.d.ts +22 -0
- package/dist/constants/runtime.js +32 -0
- package/dist/constants/socket.js +1 -1
- package/dist/cover/code.js +8 -8
- package/dist/cover/formatters.js +5 -5
- package/dist/crypto/hash.d.ts +26 -1
- package/dist/crypto/hash.js +43 -12
- package/dist/debug/_internal.js +4 -6
- package/dist/debug/caller-info.js +2 -3
- package/dist/debug/namespace.d.ts +7 -0
- package/dist/debug/namespace.js +21 -12
- package/dist/debug/output.js +21 -24
- package/dist/debug/types.d.ts +4 -4
- package/dist/dlx/arborist.js +6 -6
- package/dist/dlx/binary-cache.js +14 -14
- package/dist/dlx/binary-download.d.ts +1 -1
- package/dist/dlx/binary-download.js +14 -13
- package/dist/dlx/binary-resolution.js +16 -14
- package/dist/dlx/binary-types.d.ts +5 -5
- package/dist/dlx/binary.js +5 -5
- package/dist/dlx/cache.js +1 -1
- package/dist/dlx/detect.d.ts +34 -25
- package/dist/dlx/detect.js +86 -77
- package/dist/dlx/dir.js +2 -2
- package/dist/dlx/firewall.d.ts +1 -1
- package/dist/dlx/lockfile.d.ts +19 -18
- package/dist/dlx/lockfile.js +16 -16
- package/dist/dlx/manifest.d.ts +6 -6
- package/dist/dlx/manifest.js +5 -5
- package/dist/dlx/package.d.ts +10 -10
- package/dist/dlx/package.js +16 -16
- package/dist/dlx/packages.js +4 -4
- package/dist/dlx/paths.js +7 -7
- package/dist/dlx/spec.js +1 -1
- package/dist/dlx/types.d.ts +28 -27
- package/dist/eco/cargo/parse-lockfile.d.ts +1 -1
- package/dist/eco/cargo/parse-lockfile.js +2 -2
- package/dist/eco/manifest/analyze-lockfile.js +2 -2
- package/dist/eco/manifest/detect-format.js +4 -4
- package/dist/eco/manifest/find-packages.js +2 -2
- package/dist/eco/manifest/get-package-versions.js +2 -2
- package/dist/eco/manifest/get-package.js +2 -2
- package/dist/eco/manifest/parse-lockfile.js +2 -2
- package/dist/eco/manifest/parse-manifest.js +2 -2
- package/dist/eco/manifest/parse.js +2 -2
- package/dist/eco/npm/npm/exec.js +2 -2
- package/dist/eco/npm/npm/flags.js +7 -12
- package/dist/eco/npm/npm/parse-lockfile.d.ts +14 -14
- package/dist/eco/npm/npm/parse-lockfile.js +3 -3
- package/dist/eco/npm/parse-package-json.js +3 -3
- package/dist/eco/npm/pnpm/exec.d.ts +1 -1
- package/dist/eco/npm/pnpm/exec.js +5 -5
- package/dist/eco/npm/pnpm/flags.js +0 -3
- package/dist/eco/npm/pnpm/parse-lockfile.d.ts +1 -1
- package/dist/eco/npm/pnpm/parse-lockfile.js +4 -4
- package/dist/eco/npm/script.js +9 -6
- package/dist/eco/npm/yarnpkg/yarn/exec.js +3 -3
- package/dist/eco/npm/yarnpkg/yarn/parse-lockfile.d.ts +2 -2
- package/dist/eco/npm/yarnpkg/yarn/parse-lockfile.js +8 -8
- package/dist/effects/pulse-frames.d.ts +3 -1
- package/dist/effects/shimmer-keyframes.d.ts +1 -1
- package/dist/effects/shimmer-terminal.d.ts +1 -1
- package/dist/env/boolean.js +0 -1
- package/dist/env/ci.js +0 -1
- package/dist/env/debug.js +0 -1
- package/dist/env/github-status.d.ts +51 -0
- package/dist/env/github-status.js +90 -0
- package/dist/env/github.js +0 -8
- package/dist/env/home.js +0 -1
- package/dist/env/locale.js +0 -3
- package/dist/env/node-auth-token.js +0 -1
- package/dist/env/node-env.js +0 -1
- package/dist/env/node-version-managers.d.ts +53 -0
- package/dist/env/node-version-managers.js +90 -0
- package/dist/env/npm.js +0 -5
- package/dist/env/number.js +0 -1
- package/dist/env/package-manager.js +3 -6
- package/dist/env/path.js +0 -1
- package/dist/env/pre-commit.js +1 -2
- package/dist/env/rewire.d.ts +7 -6
- package/dist/env/rewire.js +15 -16
- package/dist/env/shell.js +0 -1
- package/dist/env/socket-cli.js +5 -18
- package/dist/env/socket-mcp.d.ts +114 -0
- package/dist/env/socket-mcp.js +146 -0
- package/dist/env/socket.d.ts +1 -109
- package/dist/env/socket.js +12 -166
- package/dist/env/string.js +0 -1
- package/dist/env/temp-dir.js +0 -3
- package/dist/env/term.js +0 -1
- package/dist/env/test.js +3 -6
- package/dist/env/windows.js +0 -4
- package/dist/env/xdg.js +0 -3
- package/dist/events/exit/_internal.d.ts +11 -9
- package/dist/events/exit/_internal.js +31 -35
- package/dist/events/exit/handler.js +3 -4
- package/dist/events/exit/intercept.js +4 -6
- package/dist/events/exit/lifecycle.js +16 -18
- package/dist/events/exit/signals.js +1 -2
- package/dist/events/exit/types.d.ts +6 -5
- package/dist/external/@npmcli/package-json.js +2 -2
- package/dist/external/@sinclair/typebox/value.js +5 -1
- package/dist/external/@sinclair/typebox.js +5 -1
- package/dist/external/@socketregistry/packageurl-js.js +27 -0
- package/dist/external/npm-pack.js +2 -2
- package/dist/external-tools/bazel/read-bazel-version-file.js +1 -1
- package/dist/external-tools/bazel/resolve.js +2 -1
- package/dist/external-tools/bazel/types.d.ts +1 -1
- package/dist/external-tools/cdxgen/from-vfs.js +1 -1
- package/dist/external-tools/cdxgen/resolve.js +2 -1
- package/dist/external-tools/cdxgen/types.d.ts +1 -1
- package/dist/external-tools/from-download.d.ts +1 -1
- package/dist/external-tools/from-download.js +1 -1
- package/dist/external-tools/from-pip-venv.d.ts +73 -0
- package/dist/external-tools/from-pip-venv.js +98 -0
- package/dist/external-tools/janus/asset-names.js +1 -1
- package/dist/external-tools/janus/from-download.js +3 -5
- package/dist/external-tools/janus/from-vfs.js +1 -1
- package/dist/external-tools/janus/resolve.js +2 -1
- package/dist/external-tools/janus/types.d.ts +1 -1
- package/dist/external-tools/jre/detect-platform-arch.d.ts +10 -6
- package/dist/external-tools/jre/detect-platform-arch.js +29 -14
- package/dist/external-tools/jre/from-download.js +2 -1
- package/dist/external-tools/jre/from-vfs.js +1 -1
- package/dist/external-tools/jre/resolve.js +2 -1
- package/dist/external-tools/jre/types.d.ts +1 -1
- package/dist/external-tools/manifest.d.ts +7 -7
- package/dist/external-tools/manifest.js +18 -16
- package/dist/external-tools/opengrep/from-vfs.js +1 -1
- package/dist/external-tools/opengrep/resolve.js +2 -1
- package/dist/external-tools/opengrep/types.d.ts +1 -1
- package/dist/external-tools/python/asset-names.d.ts +76 -0
- package/dist/external-tools/python/asset-names.js +104 -0
- package/dist/external-tools/python/dlx.d.ts +80 -0
- package/dist/external-tools/python/dlx.js +87 -0
- package/dist/external-tools/python/from-download.d.ts +53 -0
- package/dist/external-tools/python/from-download.js +68 -0
- package/dist/external-tools/python/from-path.d.ts +7 -0
- package/dist/external-tools/python/from-path.js +23 -0
- package/dist/external-tools/python/pin.d.ts +121 -0
- package/dist/external-tools/python/pin.js +173 -0
- package/dist/external-tools/python/pip-install.d.ts +75 -0
- package/dist/external-tools/python/pip-install.js +139 -0
- package/dist/external-tools/python/resolve.d.ts +42 -0
- package/dist/external-tools/python/resolve.js +58 -0
- package/dist/external-tools/python/types.d.ts +49 -0
- package/dist/external-tools/sbt/from-vfs.js +1 -1
- package/dist/external-tools/sbt/resolve.js +2 -1
- package/dist/external-tools/sbt/types.d.ts +1 -1
- package/dist/external-tools/skillspector/from-dlx.d.ts +24 -0
- package/dist/external-tools/skillspector/from-dlx.js +41 -0
- package/dist/external-tools/skillspector/from-path.d.ts +8 -0
- package/dist/external-tools/skillspector/from-path.js +30 -0
- package/dist/external-tools/skillspector/from-vfs.d.ts +8 -0
- package/dist/external-tools/skillspector/from-vfs.js +27 -0
- package/dist/external-tools/skillspector/resolve.d.ts +34 -0
- package/dist/external-tools/skillspector/resolve.js +53 -0
- package/dist/external-tools/skillspector/types.d.ts +24 -0
- package/dist/external-tools/skillspector/types.js +2 -0
- package/dist/external-tools/synp/from-download.js +2 -2
- package/dist/external-tools/synp/from-vfs.js +1 -1
- package/dist/external-tools/synp/resolve.js +2 -1
- package/dist/external-tools/trivy/from-vfs.js +1 -1
- package/dist/external-tools/trivy/resolve.js +2 -1
- package/dist/external-tools/trivy/types.d.ts +1 -1
- package/dist/external-tools/trufflehog/from-vfs.js +1 -1
- package/dist/external-tools/trufflehog/resolve.js +2 -1
- package/dist/external-tools/trufflehog/types.d.ts +1 -1
- package/dist/fs/_internal.d.ts +1 -1
- package/dist/fs/_internal.js +7 -7
- package/dist/fs/access.js +5 -9
- package/dist/fs/{path-cache.js → allowed-dirs-cache.js} +1 -1
- package/dist/fs/encoding.js +5 -7
- package/dist/fs/{find-up.js → find.js} +11 -13
- package/dist/fs/inspect.js +7 -13
- package/dist/fs/read-dir.js +7 -10
- package/dist/fs/read-file.js +8 -14
- package/dist/fs/read-json-cache.d.ts +6 -4
- package/dist/fs/read-json-cache.js +9 -6
- package/dist/fs/read-json.js +4 -6
- package/dist/fs/resolve-module.js +1 -1
- package/dist/fs/safe.d.ts +1 -1
- package/dist/fs/safe.js +12 -13
- package/dist/fs/unique.js +4 -5
- package/dist/fs/validate.js +1 -2
- package/dist/fs/write-json.js +4 -5
- package/dist/git/_internal.js +12 -11
- package/dist/git/changed.js +4 -4
- package/dist/git/repo.js +3 -3
- package/dist/git/staged.js +4 -4
- package/dist/git/unstaged.js +4 -4
- package/dist/github/ghsa.js +2 -2
- package/dist/github/refs-cache.d.ts +1 -1
- package/dist/github/refs-cache.js +5 -5
- package/dist/github/refs-rest.js +5 -5
- package/dist/github/{fetch.js → request.js} +13 -2
- package/dist/github/token.js +1 -1
- package/dist/github/types.d.ts +1 -1
- package/dist/globs/_internal.js +7 -9
- package/dist/globs/match.js +6 -7
- package/dist/globs/matcher.d.ts +3 -3
- package/dist/globs/matcher.js +12 -14
- package/dist/globs/stream.js +1 -2
- package/dist/globs/types.d.ts +24 -24
- package/dist/http-request/_internal.d.ts +1 -1
- package/dist/http-request/browser.js +21 -13
- package/dist/http-request/checksum-file.d.ts +55 -0
- package/dist/http-request/checksum-file.js +95 -0
- package/dist/http-request/download-types.d.ts +15 -23
- package/dist/http-request/download.js +4 -4
- package/dist/http-request/headers.d.ts +32 -3
- package/dist/http-request/headers.js +41 -13
- package/dist/http-request/request-attempt.js +38 -33
- package/dist/http-request/request-types.d.ts +7 -2
- package/dist/http-request/request.js +33 -16
- package/dist/http-request/response-reader.d.ts +12 -1
- package/dist/http-request/response-reader.js +22 -2
- package/dist/http-request/user-agent.js +3 -4
- package/dist/integrity.d.ts +86 -18
- package/dist/integrity.js +119 -30
- package/dist/ipc/directory.js +2 -2
- package/dist/ipc/paths.js +1 -1
- package/dist/ipc/write.js +1 -1
- package/dist/ipc-cli/get.js +12 -12
- package/dist/json/edit.js +13 -14
- package/dist/json/format.js +2 -2
- package/dist/json/parse.d.ts +1 -1
- package/dist/json/parse.js +3 -7
- package/dist/logger/_internal.d.ts +4 -4
- package/dist/logger/_internal.js +3 -3
- package/dist/logger/colors.js +4 -3
- package/dist/logger/console-methods.d.ts +132 -0
- package/dist/logger/console-methods.js +169 -0
- package/dist/logger/console.d.ts +12 -0
- package/dist/logger/console.js +42 -11
- package/dist/logger/indentation-methods.d.ts +81 -0
- package/dist/logger/indentation-methods.js +121 -0
- package/dist/logger/node.d.ts +16 -338
- package/dist/logger/node.js +75 -608
- package/dist/logger/options.d.ts +39 -0
- package/dist/logger/options.js +47 -0
- package/dist/logger/semantic-methods.d.ts +63 -0
- package/dist/logger/semantic-methods.js +108 -0
- package/dist/logger/stream-methods.d.ts +63 -0
- package/dist/logger/stream-methods.js +101 -0
- package/dist/logger/stream.d.ts +37 -0
- package/dist/logger/stream.js +42 -0
- package/dist/logger/symbols-builder.js +9 -9
- package/dist/logger/symbols.d.ts +2 -25
- package/dist/logger/symbols.js +53 -74
- package/dist/logger/types.d.ts +1 -1
- package/dist/memo/types.d.ts +6 -6
- package/dist/native-messaging/host.d.ts +20 -0
- package/dist/native-messaging/host.js +120 -0
- package/dist/native-messaging/index.d.ts +5 -0
- package/dist/native-messaging/index.js +22 -0
- package/dist/native-messaging/install.d.ts +60 -0
- package/dist/native-messaging/install.js +141 -0
- package/dist/native-messaging/rate-limit.d.ts +62 -0
- package/dist/native-messaging/rate-limit.js +115 -0
- package/dist/native-messaging/run.d.ts +10 -0
- package/dist/native-messaging/run.js +17 -0
- package/dist/node/async-hooks.js +4 -3
- package/dist/node/child-process.js +4 -3
- package/dist/node/crypto.js +4 -3
- package/dist/node/events.js +4 -3
- package/dist/node/fs-promises.js +4 -3
- package/dist/node/fs.js +4 -3
- package/dist/node/http.js +4 -3
- package/dist/node/https.js +4 -3
- package/dist/node/module.js +10 -6
- package/dist/node/os.js +4 -3
- package/dist/node/path.js +4 -3
- package/dist/node/timers-promises.js +4 -3
- package/dist/node/url.js +4 -3
- package/dist/node/util.js +4 -3
- package/dist/objects/getters.js +5 -7
- package/dist/objects/inspect.js +1 -4
- package/dist/objects/mutate.js +2 -3
- package/dist/objects/predicates.js +0 -4
- package/dist/objects/sort.js +3 -7
- package/dist/packages/edit-class.js +15 -16
- package/dist/packages/edit.js +12 -14
- package/dist/packages/exports.js +11 -17
- package/dist/packages/fetch.d.ts +16 -0
- package/dist/packages/fetch.js +81 -0
- package/dist/packages/find.d.ts +55 -0
- package/dist/packages/find.js +65 -0
- package/dist/packages/isolation.js +14 -14
- package/dist/packages/licenses.js +16 -16
- package/dist/packages/manifest.js +12 -15
- package/dist/packages/metadata-extensions.d.ts +14 -0
- package/dist/packages/metadata-extensions.js +43 -0
- package/dist/packages/normalize.js +5 -9
- package/dist/packages/provenance.d.ts +6 -0
- package/dist/packages/provenance.js +25 -18
- package/dist/packages/read.d.ts +29 -0
- package/dist/packages/read.js +66 -0
- package/dist/packages/specs.d.ts +48 -1
- package/dist/packages/specs.js +74 -11
- package/dist/packages/tarball.d.ts +24 -0
- package/dist/packages/tarball.js +79 -0
- package/dist/packages/types.d.ts +21 -20
- package/dist/packages/validation.js +0 -3
- package/dist/paths/_internal.d.ts +2 -1
- package/dist/paths/_internal.js +7 -19
- package/dist/paths/conversion.js +5 -9
- package/dist/paths/filenames.d.ts +0 -1
- package/dist/paths/filenames.js +0 -2
- package/dist/paths/normalize.js +6 -5
- package/dist/paths/packages.js +4 -7
- package/dist/paths/predicates.js +9 -16
- package/dist/paths/resolve.js +11 -14
- package/dist/paths/rewire.js +3 -3
- package/dist/paths/socket.js +16 -16
- package/dist/paths/walk.d.ts +1 -1
- package/dist/paths/walk.js +4 -4
- package/dist/perf/report.js +2 -2
- package/dist/perf/types.d.ts +1 -1
- package/dist/pkg-ext/data.js +1 -1
- package/dist/primordials/array.js +9 -9
- package/dist/primordials/date.js +2 -2
- package/dist/primordials/error.js +3 -3
- package/dist/primordials/headers.d.ts +10 -0
- package/dist/primordials/headers.js +23 -0
- package/dist/primordials/intl.d.ts +13 -0
- package/dist/primordials/intl.js +26 -0
- package/dist/primordials/math.js +33 -33
- package/dist/primordials/number.js +9 -9
- package/dist/primordials/object.js +5 -5
- package/dist/primordials/string.d.ts +2 -2
- package/dist/primordials/string.js +6 -6
- package/dist/primordials/symbol.js +3 -3
- package/dist/primordials/uncurry.js +9 -9
- package/dist/process/abort.js +3 -3
- package/dist/process/lock-manager.js +8 -8
- package/dist/process/spawn/_internal.js +6 -8
- package/dist/process/spawn/child.js +14 -14
- package/dist/process/spawn/errors.js +2 -4
- package/dist/process/spawn/kill-tree.d.ts +53 -0
- package/dist/process/spawn/kill-tree.js +85 -0
- package/dist/process/spawn/stdio.js +0 -1
- package/dist/process/spawn/types.d.ts +5 -5
- package/dist/process/transient.js +2 -2
- package/dist/promises/_internal.d.ts +2 -1
- package/dist/promises/_internal.js +2 -6
- package/dist/promises/iterate.js +12 -16
- package/dist/promises/options.js +3 -6
- package/dist/promises/retry.js +4 -5
- package/dist/promises/timers.d.ts +30 -0
- package/dist/promises/timers.js +48 -0
- package/dist/releases/github-archives.d.ts +6 -6
- package/dist/releases/github-archives.js +2 -2
- package/dist/releases/github-asset-url.d.ts +1 -1
- package/dist/releases/github-asset-url.js +5 -5
- package/dist/releases/github-downloads.d.ts +1 -1
- package/dist/releases/github-downloads.js +3 -3
- package/dist/releases/github-listing.d.ts +11 -2
- package/dist/releases/github-listing.js +20 -7
- package/dist/releases/github-retry-config.js +1 -1
- package/dist/releases/github-types.d.ts +6 -6
- package/dist/releases/socket-btm-binary-naming.d.ts +107 -0
- package/dist/releases/socket-btm-binary-naming.js +155 -0
- package/dist/releases/socket-btm.d.ts +8 -115
- package/dist/releases/socket-btm.js +16 -159
- package/dist/schema/types.d.ts +1 -1
- package/dist/sea/detect.js +6 -6
- package/dist/secrets/_internal.d.ts +2 -2
- package/dist/secrets/_internal.js +5 -4
- package/dist/secrets/compare.d.ts +45 -0
- package/dist/secrets/compare.js +61 -0
- package/dist/secrets/keychain.js +9 -6
- package/dist/secrets/linux.js +25 -23
- package/dist/secrets/macos.d.ts +1 -1
- package/dist/secrets/macos.js +18 -16
- package/dist/secrets/rc.d.ts +2 -2
- package/dist/secrets/rc.js +15 -10
- package/dist/secrets/socket-api-token.d.ts +4 -4
- package/dist/secrets/socket-api-token.js +18 -9
- package/dist/secrets/windows.js +21 -17
- package/dist/shadow/skip.js +2 -2
- package/dist/shell/parse.d.ts +108 -1
- package/dist/shell/parse.js +168 -2
- package/dist/smol/detect.js +9 -10
- package/dist/smol/http.js +6 -7
- package/dist/smol/https.js +6 -7
- package/dist/smol/manifest.d.ts +1 -1
- package/dist/smol/manifest.js +6 -7
- package/dist/smol/path.d.ts +1 -1
- package/dist/smol/path.js +7 -8
- package/dist/smol/primordial.d.ts +4 -0
- package/dist/smol/primordial.js +6 -7
- package/dist/smol/purl.d.ts +1 -1
- package/dist/smol/purl.js +7 -8
- package/dist/smol/versions.js +6 -7
- package/dist/smol/vfs.js +6 -7
- package/dist/sorts/_internal.js +6 -8
- package/dist/sorts/natural.js +10 -12
- package/dist/sorts/semver.js +1 -2
- package/dist/sorts/strings.js +0 -1
- package/dist/sorts/types.d.ts +1 -1
- package/dist/spinner/create-spinner-class.d.ts +38 -0
- package/dist/spinner/create-spinner-class.js +302 -0
- package/dist/spinner/default.js +8 -9
- package/dist/spinner/spinner-internals.d.ts +36 -0
- package/dist/spinner/spinner-internals.js +101 -0
- package/dist/spinner/spinner-shimmer-methods.d.ts +54 -0
- package/dist/spinner/spinner-shimmer-methods.js +143 -0
- package/dist/spinner/spinner-status-methods.d.ts +40 -0
- package/dist/spinner/spinner-status-methods.js +133 -0
- package/dist/spinner/spinner.d.ts +4 -5
- package/dist/spinner/spinner.js +18 -705
- package/dist/spinner/types.d.ts +3 -1
- package/dist/spinner/with.d.ts +10 -0
- package/dist/spinner/with.js +16 -2
- package/dist/stdio/divider.js +1 -1
- package/dist/stdio/footer.js +3 -3
- package/dist/stdio/header.js +4 -4
- package/dist/stdio/progress.js +5 -5
- package/dist/stdio/prompts.d.ts +5 -3
- package/dist/stdio/prompts.js +6 -7
- package/dist/stdio/stdout.js +3 -3
- package/dist/streams/parallel.js +3 -5
- package/dist/streams/transform.js +2 -3
- package/dist/strings/format.js +2 -6
- package/dist/strings/predicates.js +0 -2
- package/dist/strings/search.js +1 -2
- package/dist/strings/transform.js +0 -3
- package/dist/strings/width.js +9 -10
- package/dist/tables/bordered.js +4 -3
- package/dist/tables/padding.js +1 -1
- package/dist/tables/simple.js +8 -5
- package/dist/temporal/instant.js +4 -2
- package/dist/temporal/slots.js +7 -6
- package/dist/temporal/system.js +9 -9
- package/dist/themes/context.d.ts +3 -2
- package/dist/themes/context.js +4 -5
- package/dist/themes/themes.js +15 -15
- package/dist/themes/types.d.ts +3 -3
- package/dist/url/parse.js +0 -2
- package/dist/url/predicates.js +1 -2
- package/dist/url/search-params.js +3 -9
- package/dist/url/types.d.ts +5 -5
- package/dist/versions/_internal.js +3 -3
- package/dist/words/article.js +0 -1
- package/dist/words/capitalize.js +0 -1
- package/dist/words/pluralize.d.ts +24 -2
- package/dist/words/pluralize.js +47 -2
- package/dist/words/types.d.ts +25 -2
- package/package.json +289 -108
- package/dist/external-tools/uv/asset-names.d.ts +0 -36
- package/dist/external-tools/uv/asset-names.js +0 -70
- package/dist/external-tools/uv/from-download.d.ts +0 -17
- package/dist/external-tools/uv/from-download.js +0 -47
- package/dist/external-tools/uv/from-path.d.ts +0 -5
- package/dist/external-tools/uv/from-path.js +0 -22
- package/dist/external-tools/uv/from-vfs.d.ts +0 -7
- package/dist/external-tools/uv/from-vfs.js +0 -26
- package/dist/external-tools/uv/resolve.d.ts +0 -25
- package/dist/external-tools/uv/resolve.js +0 -52
- package/dist/external-tools/uv/types.d.ts +0 -24
- package/dist/http-request/checksums.d.ts +0 -69
- package/dist/http-request/checksums.js +0 -108
- package/dist/http-request/http-request.d.ts +0 -12
- package/dist/http-request/http-request.js +0 -11
- package/dist/packages/operations.d.ts +0 -113
- package/dist/packages/operations.js +0 -304
- package/dist/ssri/convert.d.ts +0 -48
- package/dist/ssri/convert.js +0 -69
- package/dist/ssri/parse.d.ts +0 -27
- package/dist/ssri/parse.js +0 -41
- package/dist/ssri/validate.d.ts +0 -41
- package/dist/ssri/validate.js +0 -56
- /package/dist/{bin → cli}/check.d.ts +0 -0
- /package/dist/external-tools/{uv → python}/types.js +0 -0
- /package/dist/fs/{path-cache.d.ts → allowed-dirs-cache.d.ts} +0 -0
- /package/dist/fs/{find-up.d.ts → find.d.ts} +0 -0
- /package/dist/github/{fetch.d.ts → request.d.ts} +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Socket Lib - Built with rolldown */
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_runtime = require('../../_virtual/_rolldown/runtime.js');
|
|
5
|
+
const require_integrity = require('../../integrity.js');
|
|
6
|
+
const require_constants_platform = require('../../constants/platform.js');
|
|
7
|
+
const require_process_spawn_child = require('../../process/spawn/child.js');
|
|
8
|
+
const require_fs_safe = require('../../fs/safe.js');
|
|
9
|
+
let node_fs = require("node:fs");
|
|
10
|
+
let node_path = require("node:path");
|
|
11
|
+
node_path = require_runtime.__toESM(node_path);
|
|
12
|
+
let node_os = require("node:os");
|
|
13
|
+
node_os = require_runtime.__toESM(node_os);
|
|
14
|
+
let node_process = require("node:process");
|
|
15
|
+
node_process = require_runtime.__toESM(node_process);
|
|
16
|
+
|
|
17
|
+
//#region src/external-tools/python/pin.ts
|
|
18
|
+
/**
|
|
19
|
+
* @file `resolvePipPackagePin()` — the Python mirror of
|
|
20
|
+
* `resolveNpmPackagePin()` (dlx/lockfile). Resolves a pip spec and its full
|
|
21
|
+
* dependency closure WITHOUT installing into the interpreter, then returns
|
|
22
|
+
* everything needed to pin a reproducible, hash-verified install:
|
|
23
|
+
*
|
|
24
|
+
* - the resolved top-level name + version,
|
|
25
|
+
* - the top-level artifact's hashes (sha512 SRI + sha256 hex), and
|
|
26
|
+
* - a fully-hashed `requirements.txt` body (`name==version --hash=sha256:<hex>`
|
|
27
|
+
* for every artifact in the closure) ready to feed back to
|
|
28
|
+
* `downloadPipPackage` / `pip install --require-hashes`. Engine: `pip
|
|
29
|
+
* download --dest <scratch> <spec>` downloads the spec + its resolved
|
|
30
|
+
* closure as wheels/sdists into a scratch dir (no install, no venv), each
|
|
31
|
+
* file is hashed, then the scratch dir is torn down. This is pip's own
|
|
32
|
+
* recipe for producing hashed requirements — `pip-tools` is NOT required.
|
|
33
|
+
* Contrast `resolveNpmPackagePin` (dlx/lockfile): same contract, npm engine
|
|
34
|
+
* (Arborist lockfile-only + pacote), emits a `package-lock.json`. The pip
|
|
35
|
+
* side emits a hashed `requirements.txt` because that — not a lockfile — is
|
|
36
|
+
* what `pip install --require-hashes` consumes. NOTE on the soak window:
|
|
37
|
+
* `resolveNpmPackagePin` applies a min-release-age cutoff via Arborist's
|
|
38
|
+
* `before` date. pip has no native release-age gate, so this generator does
|
|
39
|
+
* NOT enforce one — callers that need a soak must vet the resolved versions
|
|
40
|
+
* out of band. The spec itself remains the primary pin: `==<version>` (PyPI
|
|
41
|
+
* is immutable per version) or `@<full-sha>` (git is content-addressed).
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* Thrown when `pip download` produces no artifacts or a filename can't be
|
|
45
|
+
* parsed into a name + version.
|
|
46
|
+
*/
|
|
47
|
+
var PipPackagePinError = class extends Error {
|
|
48
|
+
constructor(message, options) {
|
|
49
|
+
super(message, options);
|
|
50
|
+
this.name = "PipPackagePinError";
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Normalize a PEP 503 distribution name: lowercase, runs of `_ . -` collapse to
|
|
55
|
+
* a single `-`. Wheel filenames use `_`; requirements/PyPI use `-`.
|
|
56
|
+
*/
|
|
57
|
+
function normalizeDistName(name) {
|
|
58
|
+
return name.toLowerCase().replace(/[-_.]+/g, "-");
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Parse `<name>-<version>` out of a wheel (`name-ver-...whl`) or sdist
|
|
62
|
+
* (`name-ver.tar.gz` / `name-ver.zip`) filename. Returns undefined when the
|
|
63
|
+
* shape isn't recognized.
|
|
64
|
+
*/
|
|
65
|
+
function parseArtifactFilename(file) {
|
|
66
|
+
if (file.endsWith(".whl")) {
|
|
67
|
+
const parts = file.slice(0, -4).split("-");
|
|
68
|
+
if (parts.length < 2) return;
|
|
69
|
+
return {
|
|
70
|
+
name: normalizeDistName(parts[0]),
|
|
71
|
+
version: parts[1]
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const ext = [
|
|
75
|
+
".tar.gz",
|
|
76
|
+
".tar.bz2",
|
|
77
|
+
".zip",
|
|
78
|
+
".tgz"
|
|
79
|
+
].find((e) => file.endsWith(e));
|
|
80
|
+
if (!ext) return;
|
|
81
|
+
const stem = file.slice(0, -ext.length);
|
|
82
|
+
const dashIdx = stem.lastIndexOf("-");
|
|
83
|
+
if (dashIdx <= 0) return;
|
|
84
|
+
return {
|
|
85
|
+
name: normalizeDistName(stem.slice(0, dashIdx)),
|
|
86
|
+
version: stem.slice(dashIdx + 1)
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Generate a vendorable, hash-pinned closure for a pip spec without installing
|
|
91
|
+
* it. Mirrors `resolveNpmPackagePin`. Throws `PipPackagePinError` on an empty
|
|
92
|
+
* download or an unparseable artifact filename.
|
|
93
|
+
*/
|
|
94
|
+
async function resolvePipPackagePin(options) {
|
|
95
|
+
const { pythonBin, spec } = options;
|
|
96
|
+
if (typeof spec !== "string" || spec.length === 0) throw new PipPackagePinError("resolvePipPackagePin requires a package spec");
|
|
97
|
+
const scratch = options.scratchDir ?? node_path.default.join(node_os.default.tmpdir(), `socket-lib-pip-pin-${node_process.default.pid}-${Date.now()}`);
|
|
98
|
+
await require_fs_safe.safeMkdir(scratch, { recursive: true });
|
|
99
|
+
try {
|
|
100
|
+
await require_process_spawn_child.spawn(pythonBin, [
|
|
101
|
+
"-m",
|
|
102
|
+
"pip",
|
|
103
|
+
"download",
|
|
104
|
+
"--no-input",
|
|
105
|
+
"--quiet",
|
|
106
|
+
"--dest",
|
|
107
|
+
scratch,
|
|
108
|
+
spec
|
|
109
|
+
], {
|
|
110
|
+
shell: require_constants_platform.WIN32,
|
|
111
|
+
stdio: "inherit"
|
|
112
|
+
});
|
|
113
|
+
const files = (await node_fs.promises.readdir(scratch)).filter((f) => f.endsWith(".whl") || f.endsWith(".tar.gz") || f.endsWith(".tar.bz2") || f.endsWith(".zip") || f.endsWith(".tgz"));
|
|
114
|
+
if (!files.length) throw new PipPackagePinError(`resolvePipPackagePin: pip download ${spec} produced no artifacts in ${scratch}`);
|
|
115
|
+
const artifacts = [];
|
|
116
|
+
const targetName = normalizeDistName(specDistName(spec));
|
|
117
|
+
let top;
|
|
118
|
+
for (const file of files.toSorted()) {
|
|
119
|
+
const hash = require_integrity.computeHashes(await node_fs.promises.readFile(node_path.default.join(scratch, file)));
|
|
120
|
+
const parsed = parseArtifactFilename(file);
|
|
121
|
+
if (!parsed) throw new PipPackagePinError(`resolvePipPackagePin: could not parse name/version from artifact ${file}`);
|
|
122
|
+
artifacts.push({
|
|
123
|
+
checksum: hash.checksum,
|
|
124
|
+
file,
|
|
125
|
+
name: parsed.name,
|
|
126
|
+
version: parsed.version
|
|
127
|
+
});
|
|
128
|
+
if (!top && parsed.name === targetName) top = {
|
|
129
|
+
hash,
|
|
130
|
+
name: parsed.name,
|
|
131
|
+
version: parsed.version
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (!top) {
|
|
135
|
+
const first = artifacts[0];
|
|
136
|
+
top = {
|
|
137
|
+
hash: require_integrity.computeHashes(await node_fs.promises.readFile(node_path.default.join(scratch, first.file))),
|
|
138
|
+
name: first.name,
|
|
139
|
+
version: first.version
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const requirements = artifacts.map((a) => `${a.name}==${a.version} --hash=sha256:${a.checksum}`).join("\n") + "\n";
|
|
143
|
+
return {
|
|
144
|
+
artifacts,
|
|
145
|
+
hash: top.hash,
|
|
146
|
+
name: top.name,
|
|
147
|
+
requirements,
|
|
148
|
+
version: top.version
|
|
149
|
+
};
|
|
150
|
+
} finally {
|
|
151
|
+
try {
|
|
152
|
+
await require_fs_safe.safeDelete(scratch, { force: true });
|
|
153
|
+
} catch {}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Best-effort distribution name from a pip spec for matching the top-level
|
|
158
|
+
* artifact: strips a `==`/`>=`/etc. version and a `git+...#egg=<name>`
|
|
159
|
+
* fragment. Falls back to the raw spec when neither is present.
|
|
160
|
+
*/
|
|
161
|
+
function specDistName(spec) {
|
|
162
|
+
const eggIdx = spec.indexOf("#egg=");
|
|
163
|
+
if (eggIdx !== -1) return spec.slice(eggIdx + 5);
|
|
164
|
+
const match = /^([A-Za-z0-9._-]+)\s*(?:@|[=<>!~]=?)/.exec(spec);
|
|
165
|
+
return match ? match[1] : spec;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
//#endregion
|
|
169
|
+
exports.PipPackagePinError = PipPackagePinError;
|
|
170
|
+
exports.normalizeDistName = normalizeDistName;
|
|
171
|
+
exports.parseArtifactFilename = parseArtifactFilename;
|
|
172
|
+
exports.resolvePipPackagePin = resolvePipPackagePin;
|
|
173
|
+
exports.specDistName = specDistName;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file `downloadPipPackage()` — the Python mirror of `dlx/package.ts`'s
|
|
3
|
+
* `downloadNpmPackage()`. Installs a pip spec into a content-addressed dlx
|
|
4
|
+
* directory (`pip install --target <dir>`), leaving the interpreter pristine:
|
|
5
|
+
* the package + its deps land in
|
|
6
|
+
* `~/.socket/_dlx/<cacheKey(spec)>/site-packages`, the exact analog of how
|
|
7
|
+
* `downloadNpmPackage` installs npm deps into
|
|
8
|
+
* `<dlxDir>/<hash>/node_modules/`. This is the bundle-safe / SEA-VFS-safe
|
|
9
|
+
* model:
|
|
10
|
+
*
|
|
11
|
+
* - No venv → no symlinks, no `pyvenv.cfg` with an absolute `home=`.
|
|
12
|
+
* - The target dir is plain files → embeddable in a SEA's VFS, relocatable at
|
|
13
|
+
* runtime.
|
|
14
|
+
* - One shared Python serves N isolated package dirs (true per-tool isolation
|
|
15
|
+
* without a venv) — exactly the `node_modules`-per-cacheKey shape. Run the
|
|
16
|
+
* installed tool with the package dir on `PYTHONPATH`: spawn(pythonBin,
|
|
17
|
+
* ['-m', '<module>', ...args], { env: { ...process.env, PYTHONPATH:
|
|
18
|
+
* packageDir } }) `spec` is a PyPI pin (`<pkg>==<version>`) or a git-SHA
|
|
19
|
+
* pin (`git+https://…@<sha>`). A TOCTOU lock guards concurrent installs; an
|
|
20
|
+
* existing non-empty package dir makes the call idempotent. Contrast
|
|
21
|
+
* `createPipVenv` (external-tools/from-pip-venv): venv with a
|
|
22
|
+
* `bin/<entryPoint>` — convenient but symlink + absolute-`home`-dependent,
|
|
23
|
+
* so DLX-only and NOT bundleable.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Install `spec` into a content-addressed dlx dir via `pip install --target`.
|
|
27
|
+
* Lock-guarded + idempotent. Throws on a failed pip install or if the lock
|
|
28
|
+
* can't be acquired after MAX_RETRIES. Mirrors `downloadNpmPackage`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function downloadPipPackage(options: DownloadPipPackageOptions, retryCount?: number): Promise<DownloadPipPackageResult>;
|
|
31
|
+
export declare function isAlreadyInstalled(packageDir: string): Promise<boolean>;
|
|
32
|
+
export declare function isStaleLock(pid: number): boolean;
|
|
33
|
+
export interface DownloadPipPackageOptions {
|
|
34
|
+
/**
|
|
35
|
+
* Optional sha256 hash (`sha256:<hex>` or bare `<hex>`) of the top-level
|
|
36
|
+
* artifact, the Python analog of `downloadNpmPackage`'s `hash`. When set, pip
|
|
37
|
+
* runs with `--require-hashes` and `--hash=sha256:<hex>`, which fails closed
|
|
38
|
+
* unless EVERY resolved artifact (the spec and its full dependency closure)
|
|
39
|
+
* carries a matching hash — so it only fits specs pip can hash-verify (a
|
|
40
|
+
* pinned `==<version>` or a direct wheel/sdist URL) with a hash-pinned
|
|
41
|
+
* closure. Omit it and rely on the immutable spec as the pin: `==<version>`
|
|
42
|
+
* (PyPI is immutable per version) or `@<full-sha>` (git is
|
|
43
|
+
* content-addressed).
|
|
44
|
+
*/
|
|
45
|
+
readonly hash?: string | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Absolute path to the Python interpreter used to run pip (and later the
|
|
48
|
+
* tool). The interpreter is NOT modified — packages go to the dlx package
|
|
49
|
+
* dir. Typically from `resolvePython()`.
|
|
50
|
+
*/
|
|
51
|
+
readonly pythonBin: string;
|
|
52
|
+
/**
|
|
53
|
+
* Pip install spec: `<pkg>==<version>` (PyPI exact pin) or
|
|
54
|
+
* `git+https://<url>@<sha>` (git-SHA pin).
|
|
55
|
+
*/
|
|
56
|
+
readonly spec: string;
|
|
57
|
+
}
|
|
58
|
+
export interface DownloadPipPackageResult {
|
|
59
|
+
/**
|
|
60
|
+
* `true` when this call ran pip; `false` when an existing install was reused.
|
|
61
|
+
*/
|
|
62
|
+
readonly installed: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Directory the package was installed into. Put this on `PYTHONPATH` to run
|
|
65
|
+
* the tool: `python -m <module>`. The Python analog of
|
|
66
|
+
* `DownloadNpmPackageResult.packageDir`.
|
|
67
|
+
*/
|
|
68
|
+
readonly packageDir: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Content-addressed install dir for a spec:
|
|
72
|
+
* `~/.socket/_dlx/<cacheKey>/site-packages`. The Python analog of
|
|
73
|
+
* `downloadNpmPackage`'s `<hash>/node_modules`.
|
|
74
|
+
*/
|
|
75
|
+
export declare function pipPackageDir(spec: string): string;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Socket Lib - Built with rolldown */
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_runtime = require('../../_virtual/_rolldown/runtime.js');
|
|
5
|
+
const require_constants_platform = require('../../constants/platform.js');
|
|
6
|
+
const require_process_spawn_child = require('../../process/spawn/child.js');
|
|
7
|
+
const require_paths_socket = require('../../paths/socket.js');
|
|
8
|
+
const require_fs_safe = require('../../fs/safe.js');
|
|
9
|
+
const require_dlx_cache = require('../../dlx/cache.js');
|
|
10
|
+
let node_fs = require("node:fs");
|
|
11
|
+
let node_path = require("node:path");
|
|
12
|
+
node_path = require_runtime.__toESM(node_path);
|
|
13
|
+
let node_process = require("node:process");
|
|
14
|
+
node_process = require_runtime.__toESM(node_process);
|
|
15
|
+
|
|
16
|
+
//#region src/external-tools/python/pip-install.ts
|
|
17
|
+
/**
|
|
18
|
+
* @file `downloadPipPackage()` — the Python mirror of `dlx/package.ts`'s
|
|
19
|
+
* `downloadNpmPackage()`. Installs a pip spec into a content-addressed dlx
|
|
20
|
+
* directory (`pip install --target <dir>`), leaving the interpreter pristine:
|
|
21
|
+
* the package + its deps land in
|
|
22
|
+
* `~/.socket/_dlx/<cacheKey(spec)>/site-packages`, the exact analog of how
|
|
23
|
+
* `downloadNpmPackage` installs npm deps into
|
|
24
|
+
* `<dlxDir>/<hash>/node_modules/`. This is the bundle-safe / SEA-VFS-safe
|
|
25
|
+
* model:
|
|
26
|
+
*
|
|
27
|
+
* - No venv → no symlinks, no `pyvenv.cfg` with an absolute `home=`.
|
|
28
|
+
* - The target dir is plain files → embeddable in a SEA's VFS, relocatable at
|
|
29
|
+
* runtime.
|
|
30
|
+
* - One shared Python serves N isolated package dirs (true per-tool isolation
|
|
31
|
+
* without a venv) — exactly the `node_modules`-per-cacheKey shape. Run the
|
|
32
|
+
* installed tool with the package dir on `PYTHONPATH`: spawn(pythonBin,
|
|
33
|
+
* ['-m', '<module>', ...args], { env: { ...process.env, PYTHONPATH:
|
|
34
|
+
* packageDir } }) `spec` is a PyPI pin (`<pkg>==<version>`) or a git-SHA
|
|
35
|
+
* pin (`git+https://…@<sha>`). A TOCTOU lock guards concurrent installs; an
|
|
36
|
+
* existing non-empty package dir makes the call idempotent. Contrast
|
|
37
|
+
* `createPipVenv` (external-tools/from-pip-venv): venv with a
|
|
38
|
+
* `bin/<entryPoint>` — convenient but symlink + absolute-`home`-dependent,
|
|
39
|
+
* so DLX-only and NOT bundleable.
|
|
40
|
+
*/
|
|
41
|
+
const MAX_RETRIES = 3;
|
|
42
|
+
const WAIT_TICKS = 30;
|
|
43
|
+
/**
|
|
44
|
+
* Install `spec` into a content-addressed dlx dir via `pip install --target`.
|
|
45
|
+
* Lock-guarded + idempotent. Throws on a failed pip install or if the lock
|
|
46
|
+
* can't be acquired after MAX_RETRIES. Mirrors `downloadNpmPackage`.
|
|
47
|
+
*/
|
|
48
|
+
async function downloadPipPackage(options, retryCount = 0) {
|
|
49
|
+
const { hash, pythonBin, spec } = options;
|
|
50
|
+
const packageDir = pipPackageDir(spec);
|
|
51
|
+
if (retryCount >= MAX_RETRIES) throw new Error(`downloadPipPackage: could not acquire install lock after ${MAX_RETRIES} retries for ${packageDir}; a peer may be stuck or the lock is stale — remove it and retry`);
|
|
52
|
+
if (await isAlreadyInstalled(packageDir)) return {
|
|
53
|
+
installed: false,
|
|
54
|
+
packageDir
|
|
55
|
+
};
|
|
56
|
+
const lockDir = node_path.default.dirname(packageDir);
|
|
57
|
+
await require_fs_safe.safeMkdir(lockDir, { recursive: true });
|
|
58
|
+
const lockFile = node_path.default.join(lockDir, ".installing");
|
|
59
|
+
try {
|
|
60
|
+
await node_fs.promises.writeFile(lockFile, node_process.default.pid.toString(), { flag: "wx" });
|
|
61
|
+
} catch (e) {
|
|
62
|
+
if (e.code !== "EEXIST") throw e;
|
|
63
|
+
let stale = false;
|
|
64
|
+
try {
|
|
65
|
+
stale = isStaleLock(Number.parseInt((await node_fs.promises.readFile(lockFile, "utf8")).trim(), 10));
|
|
66
|
+
} catch {
|
|
67
|
+
stale = true;
|
|
68
|
+
}
|
|
69
|
+
if (stale) {
|
|
70
|
+
await require_fs_safe.safeDelete(lockFile, { force: true });
|
|
71
|
+
return downloadPipPackage(options, retryCount + 1);
|
|
72
|
+
}
|
|
73
|
+
for (let i = 0; i < WAIT_TICKS; i += 1) {
|
|
74
|
+
await new Promise((resolve) => {
|
|
75
|
+
setTimeout(resolve, 1e3);
|
|
76
|
+
});
|
|
77
|
+
if (await isAlreadyInstalled(packageDir)) return {
|
|
78
|
+
installed: false,
|
|
79
|
+
packageDir
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return downloadPipPackage(options, retryCount + 1);
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
await require_fs_safe.safeMkdir(packageDir, { recursive: true });
|
|
86
|
+
const normalizedHash = hash ? hash.startsWith("sha256:") ? hash : `sha256:${hash}` : void 0;
|
|
87
|
+
await require_process_spawn_child.spawn(pythonBin, [
|
|
88
|
+
"-m",
|
|
89
|
+
"pip",
|
|
90
|
+
"install",
|
|
91
|
+
"--no-input",
|
|
92
|
+
"--quiet",
|
|
93
|
+
"--target",
|
|
94
|
+
packageDir,
|
|
95
|
+
...normalizedHash ? ["--require-hashes", `--hash=${normalizedHash}`] : [],
|
|
96
|
+
spec
|
|
97
|
+
], {
|
|
98
|
+
shell: require_constants_platform.WIN32,
|
|
99
|
+
stdio: "inherit"
|
|
100
|
+
});
|
|
101
|
+
if (!await isAlreadyInstalled(packageDir)) throw new Error(`downloadPipPackage: pip install --target ${packageDir} ${spec} reported success but the target is still empty`);
|
|
102
|
+
return {
|
|
103
|
+
installed: true,
|
|
104
|
+
packageDir
|
|
105
|
+
};
|
|
106
|
+
} finally {
|
|
107
|
+
await require_fs_safe.safeDelete(lockFile, { force: true });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function isAlreadyInstalled(packageDir) {
|
|
111
|
+
try {
|
|
112
|
+
return (await node_fs.promises.readdir(packageDir)).length > 0;
|
|
113
|
+
} catch {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function isStaleLock(pid) {
|
|
118
|
+
if (Number.isNaN(pid) || pid <= 0) return true;
|
|
119
|
+
try {
|
|
120
|
+
node_process.default.kill(pid, 0);
|
|
121
|
+
return false;
|
|
122
|
+
} catch (e) {
|
|
123
|
+
return e.code !== "EPERM";
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Content-addressed install dir for a spec:
|
|
128
|
+
* `~/.socket/_dlx/<cacheKey>/site-packages`. The Python analog of
|
|
129
|
+
* `downloadNpmPackage`'s `<hash>/node_modules`.
|
|
130
|
+
*/
|
|
131
|
+
function pipPackageDir(spec) {
|
|
132
|
+
return node_path.default.join(require_paths_socket.getSocketDlxDir(), require_dlx_cache.generateCacheKey(spec), "site-packages");
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
//#endregion
|
|
136
|
+
exports.downloadPipPackage = downloadPipPackage;
|
|
137
|
+
exports.isAlreadyInstalled = isAlreadyInstalled;
|
|
138
|
+
exports.isStaleLock = isStaleLock;
|
|
139
|
+
exports.pipPackageDir = pipPackageDir;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file `resolvePython()` — CPython resolution entry point. Tries each source
|
|
3
|
+
* in order:
|
|
4
|
+
*
|
|
5
|
+
* 1. PATH — `python3` / `python` on the system PATH.
|
|
6
|
+
* 2. download — python-build-standalone CPython into the DLX cache (only when
|
|
7
|
+
* `downloadIfMissing` is passed). Returns `undefined` if all enabled
|
|
8
|
+
* sources miss. Memoized per option-shape so repeated calls in one process
|
|
9
|
+
* don't re-probe / re-download. NOTE: unlike the JRE / removed-uv
|
|
10
|
+
* resolvers there is no VFS tier here — a CPython runtime is not embedded
|
|
11
|
+
* in the smol Node binary. Add a `from-vfs` tier here if that changes.
|
|
12
|
+
*/
|
|
13
|
+
import type { BinaryDownloader } from '../from-download';
|
|
14
|
+
import type { HashSpec } from '../../integrity';
|
|
15
|
+
import type { ResolvedPython } from './types';
|
|
16
|
+
export interface ResolvePythonOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Prefer a downloaded python-build-standalone over a PATH interpreter. Use
|
|
19
|
+
* when you need an exact, reproducible CPython (the host `python3` may be the
|
|
20
|
+
* wrong version). Default false: PATH wins when present.
|
|
21
|
+
*/
|
|
22
|
+
preferDownload?: boolean | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* When set, fall back to downloading python-build-standalone if no PATH
|
|
25
|
+
* interpreter is found (or always, with `preferDownload`).
|
|
26
|
+
*/
|
|
27
|
+
downloadIfMissing?: {
|
|
28
|
+
version: string;
|
|
29
|
+
tag: string;
|
|
30
|
+
/**
|
|
31
|
+
* Omit to auto-detect the current host via {@link getPythonArch}.
|
|
32
|
+
*/
|
|
33
|
+
arch?: string | undefined;
|
|
34
|
+
integrity?: HashSpec | undefined;
|
|
35
|
+
cacheDir?: string | undefined;
|
|
36
|
+
downloader?: BinaryDownloader | undefined;
|
|
37
|
+
} | undefined;
|
|
38
|
+
}
|
|
39
|
+
export declare function cacheKey(opts: ResolvePythonOptions | undefined): string;
|
|
40
|
+
export declare function doResolvePython(opts?: ResolvePythonOptions | undefined): Promise<ResolvedPython | undefined>;
|
|
41
|
+
export declare function resetPythonResolution(): void;
|
|
42
|
+
export declare function resolvePython(opts?: ResolvePythonOptions | undefined): Promise<ResolvedPython | undefined>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Socket Lib - Built with rolldown */
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_primordials_map_set = require('../../primordials/map-set.js');
|
|
5
|
+
const require_external_tools_python_asset_names = require('./asset-names.js');
|
|
6
|
+
const require_external_tools_python_from_download = require('./from-download.js');
|
|
7
|
+
const require_external_tools_python_from_path = require('./from-path.js');
|
|
8
|
+
|
|
9
|
+
//#region src/external-tools/python/resolve.ts
|
|
10
|
+
/**
|
|
11
|
+
* @file `resolvePython()` — CPython resolution entry point. Tries each source
|
|
12
|
+
* in order:
|
|
13
|
+
*
|
|
14
|
+
* 1. PATH — `python3` / `python` on the system PATH.
|
|
15
|
+
* 2. download — python-build-standalone CPython into the DLX cache (only when
|
|
16
|
+
* `downloadIfMissing` is passed). Returns `undefined` if all enabled
|
|
17
|
+
* sources miss. Memoized per option-shape so repeated calls in one process
|
|
18
|
+
* don't re-probe / re-download. NOTE: unlike the JRE / removed-uv
|
|
19
|
+
* resolvers there is no VFS tier here — a CPython runtime is not embedded
|
|
20
|
+
* in the smol Node binary. Add a `from-vfs` tier here if that changes.
|
|
21
|
+
*/
|
|
22
|
+
const resolutionCache = new require_primordials_map_set.MapCtor();
|
|
23
|
+
function cacheKey(opts) {
|
|
24
|
+
const prefer = opts?.preferDownload ? "prefer:" : "";
|
|
25
|
+
if (!opts?.downloadIfMissing) return `${prefer}local-only`;
|
|
26
|
+
const { cacheDir, integrity, tag, version } = opts.downloadIfMissing;
|
|
27
|
+
return `${prefer}dl:${version}:${tag}:${opts.downloadIfMissing.arch ?? require_external_tools_python_asset_names.getPythonArch() ?? "unknown"}:${typeof integrity === "string" ? integrity : integrity ? `${integrity.type}:${integrity.value}` : ""}:${cacheDir ?? ""}`;
|
|
28
|
+
}
|
|
29
|
+
async function doResolvePython(opts) {
|
|
30
|
+
const dl = opts?.downloadIfMissing;
|
|
31
|
+
if (opts?.preferDownload && dl) {
|
|
32
|
+
const fromDownload = await require_external_tools_python_from_download.pythonFromDownload(dl);
|
|
33
|
+
if (fromDownload) return fromDownload;
|
|
34
|
+
}
|
|
35
|
+
const fromPath = await require_external_tools_python_from_path.pythonFromPath();
|
|
36
|
+
if (fromPath) return fromPath;
|
|
37
|
+
if (dl) return require_external_tools_python_from_download.pythonFromDownload(dl);
|
|
38
|
+
}
|
|
39
|
+
/* c8 ignore start - test-only escape hatch. */
|
|
40
|
+
function resetPythonResolution() {
|
|
41
|
+
resolutionCache.clear();
|
|
42
|
+
}
|
|
43
|
+
/* c8 ignore stop */
|
|
44
|
+
function resolvePython(opts) {
|
|
45
|
+
const key = cacheKey(opts);
|
|
46
|
+
let cached = resolutionCache.get(key);
|
|
47
|
+
if (!cached) {
|
|
48
|
+
cached = doResolvePython(opts);
|
|
49
|
+
resolutionCache.set(key, cached);
|
|
50
|
+
}
|
|
51
|
+
return cached;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
//#endregion
|
|
55
|
+
exports.cacheKey = cacheKey;
|
|
56
|
+
exports.doResolvePython = doResolvePython;
|
|
57
|
+
exports.resetPythonResolution = resetPythonResolution;
|
|
58
|
+
exports.resolvePython = resolvePython;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Types for the python-build-standalone DLX resolver. A "resolved python"
|
|
3
|
+
* is an absolute path to a CPython interpreter plus the tier that found it.
|
|
4
|
+
*/
|
|
5
|
+
import type { ResolvedToolIntegrity } from '../from-download';
|
|
6
|
+
/**
|
|
7
|
+
* Which resolver tier produced the interpreter.
|
|
8
|
+
*
|
|
9
|
+
* - `path` — an interpreter already on PATH (system / pyenv / etc.).
|
|
10
|
+
* - `download` — a python-build-standalone CPython fetched into the DLX cache.
|
|
11
|
+
*/
|
|
12
|
+
export type PythonSource = 'download' | 'path';
|
|
13
|
+
export interface ResolvedPython {
|
|
14
|
+
/**
|
|
15
|
+
* Absolute path to the `python3` (or `python.exe`) executable.
|
|
16
|
+
*/
|
|
17
|
+
readonly path: string;
|
|
18
|
+
/**
|
|
19
|
+
* Which resolver tier found this interpreter.
|
|
20
|
+
*/
|
|
21
|
+
readonly source: PythonSource;
|
|
22
|
+
/**
|
|
23
|
+
* SRI integrity of the downloaded archive. Set only when `source ===
|
|
24
|
+
* 'download'`; the PATH tier references an interpreter already on disk and
|
|
25
|
+
* computes no hash. See {@link ResolvedToolIntegrity}.
|
|
26
|
+
*/
|
|
27
|
+
readonly integrity?: ResolvedToolIntegrity | undefined;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Pin describing which python-build-standalone build to fetch. The caller
|
|
31
|
+
* supplies these from its own `external-tools.json` (or `bundle-tools.json`) —
|
|
32
|
+
* the library does not embed a default version, so each consumer controls its
|
|
33
|
+
* own pin + soak.
|
|
34
|
+
*/
|
|
35
|
+
export interface PythonBuildPin {
|
|
36
|
+
/**
|
|
37
|
+
* CPython version, e.g. `3.11.14`.
|
|
38
|
+
*/
|
|
39
|
+
readonly version: string;
|
|
40
|
+
/**
|
|
41
|
+
* Python-build-standalone release tag, e.g. `20260203`.
|
|
42
|
+
*/
|
|
43
|
+
readonly tag: string;
|
|
44
|
+
/**
|
|
45
|
+
* Optional per-platform integrity (hex SHA-256 or SRI). Keyed by the asset
|
|
46
|
+
* filename so the resolver can verify the exact tarball it downloads.
|
|
47
|
+
*/
|
|
48
|
+
readonly integrity?: string | undefined;
|
|
49
|
+
}
|
|
@@ -17,7 +17,7 @@ const require_smol_vfs = require('../../smol/vfs.js');
|
|
|
17
17
|
*/
|
|
18
18
|
const SBT_VFS_KEY = "sbt-launch.jar";
|
|
19
19
|
async function sbtFromVfs() {
|
|
20
|
-
const vfs =
|
|
20
|
+
const vfs = require_smol_vfs.getSmolVfs();
|
|
21
21
|
if (!vfs) return;
|
|
22
22
|
/* c8 ignore start - smol Node binary only. */
|
|
23
23
|
if (!vfs.has("sbt-launch.jar")) return;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/* Socket Lib - Built with rolldown */
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_primordials_map_set = require('../../primordials/map-set.js');
|
|
4
5
|
const require_external_tools_sbt_from_download = require('./from-download.js');
|
|
5
6
|
const require_external_tools_sbt_from_path = require('./from-path.js');
|
|
6
7
|
const require_external_tools_sbt_from_vfs = require('./from-vfs.js');
|
|
@@ -18,7 +19,7 @@ const require_external_tools_sbt_from_vfs = require('./from-vfs.js');
|
|
|
18
19
|
* download-sourced SBT is the `sbt` script, which finds its own JRE.
|
|
19
20
|
* Memoized per option-shape.
|
|
20
21
|
*/
|
|
21
|
-
const resolutionCache =
|
|
22
|
+
const resolutionCache = new require_primordials_map_set.MapCtor();
|
|
22
23
|
function cacheKey(opts) {
|
|
23
24
|
if (!opts?.downloadIfMissing) return "local-only";
|
|
24
25
|
const { cacheDir, integrity, version } = opts.downloadIfMissing;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file `skillspectorFromDlx()` — DLX-venv tier of SkillSpector resolution.
|
|
3
|
+
* Creates a single-purpose venv under `~/.socket/_dlx/skillspector/<sha>/`
|
|
4
|
+
* and pip-installs the pinned git SHA. Returns `undefined` when:
|
|
5
|
+
*
|
|
6
|
+
* - No Python interpreter is on PATH (host lacks Python 3.12+).
|
|
7
|
+
* - The venv-create or pip-install command fails. Idempotent: hits the cached
|
|
8
|
+
* venv when its `skillspector` entry-point already exists.
|
|
9
|
+
*/
|
|
10
|
+
import type { ResolvedSkillSpector } from './types';
|
|
11
|
+
export interface SkillSpectorFromDlxOptions {
|
|
12
|
+
/**
|
|
13
|
+
* Pinned upstream SHA. Combined with the canonical NVIDIA/skillspector repo
|
|
14
|
+
* URL to form the pip-install spec
|
|
15
|
+
* `git+https://github.com/NVIDIA/skillspector.git@<sha>`.
|
|
16
|
+
*/
|
|
17
|
+
readonly sha: string;
|
|
18
|
+
/**
|
|
19
|
+
* Cache directory override. Defaults to `getSocketDlxDir() +
|
|
20
|
+
* 'skillspector/<sha>'`. Tests pass a tmpdir.
|
|
21
|
+
*/
|
|
22
|
+
readonly cacheDir?: string | undefined;
|
|
23
|
+
}
|
|
24
|
+
export declare function skillspectorFromDlx(opts: SkillSpectorFromDlxOptions): Promise<ResolvedSkillSpector | undefined>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Socket Lib - Built with rolldown */
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_runtime = require('../../_virtual/_rolldown/runtime.js');
|
|
5
|
+
const require_paths_socket = require('../../paths/socket.js');
|
|
6
|
+
const require_external_tools_from_pip_venv = require('../from-pip-venv.js');
|
|
7
|
+
let node_path = require("node:path");
|
|
8
|
+
node_path = require_runtime.__toESM(node_path);
|
|
9
|
+
|
|
10
|
+
//#region src/external-tools/skillspector/from-dlx.ts
|
|
11
|
+
/**
|
|
12
|
+
* @file `skillspectorFromDlx()` — DLX-venv tier of SkillSpector resolution.
|
|
13
|
+
* Creates a single-purpose venv under `~/.socket/_dlx/skillspector/<sha>/`
|
|
14
|
+
* and pip-installs the pinned git SHA. Returns `undefined` when:
|
|
15
|
+
*
|
|
16
|
+
* - No Python interpreter is on PATH (host lacks Python 3.12+).
|
|
17
|
+
* - The venv-create or pip-install command fails. Idempotent: hits the cached
|
|
18
|
+
* venv when its `skillspector` entry-point already exists.
|
|
19
|
+
*/
|
|
20
|
+
const UPSTREAM_REPO = "https://github.com/NVIDIA/skillspector.git";
|
|
21
|
+
async function skillspectorFromDlx(opts) {
|
|
22
|
+
const { sha } = opts;
|
|
23
|
+
if (!sha) return;
|
|
24
|
+
const cacheDir = opts.cacheDir ?? node_path.default.join(require_paths_socket.getSocketDlxDir(), "skillspector", sha);
|
|
25
|
+
const installSpec = `git+${UPSTREAM_REPO}@${sha}`;
|
|
26
|
+
try {
|
|
27
|
+
return {
|
|
28
|
+
path: (await require_external_tools_from_pip_venv.createPipVenv({
|
|
29
|
+
cacheDir,
|
|
30
|
+
entryPoint: "skillspector",
|
|
31
|
+
installSpec
|
|
32
|
+
})).entryPointPath,
|
|
33
|
+
source: "dlx"
|
|
34
|
+
};
|
|
35
|
+
} catch {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
//#endregion
|
|
41
|
+
exports.skillspectorFromDlx = skillspectorFromDlx;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file `skillspectorFromPath()` — `which skillspector` lookup. Reports
|
|
3
|
+
* `source: 'pipx'` when the resolved path lives under a `pipx/venvs/`
|
|
4
|
+
* directory (the dev's `pipx install skillspector` path); reports `source:
|
|
5
|
+
* 'path'` otherwise (a one-off binary on PATH).
|
|
6
|
+
*/
|
|
7
|
+
import type { ResolvedSkillSpector } from './types';
|
|
8
|
+
export declare function skillspectorFromPath(): Promise<ResolvedSkillSpector | undefined>;
|