aboutsummaryrefslogtreecommitdiffstats
path: root/node_modules/which
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--node_modules/which/LICENSE15
-rw-r--r--node_modules/which/README.md51
-rwxr-xr-xnode_modules/which/bin/which.js52
-rw-r--r--node_modules/which/lib/index.js111
-rw-r--r--node_modules/which/package.json52
5 files changed, 281 insertions, 0 deletions
diff --git a/node_modules/which/LICENSE b/node_modules/which/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/which/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/which/README.md b/node_modules/which/README.md
new file mode 100644
index 0000000..323aaf2
--- /dev/null
+++ b/node_modules/which/README.md
@@ -0,0 +1,51 @@
+# which
+
+Like the unix `which` utility.
+
+Finds the first instance of a specified executable in the PATH
+environment variable. Does not cache the results, so `hash -r` is not
+needed when the PATH changes.
+
+## USAGE
+
+```javascript
+const which = require('which')
+
+// async usage
+// rejects if not found
+const resolved = await which('node')
+
+// if nothrow option is used, returns null if not found
+const resolvedOrNull = await which('node', { nothrow: true })
+
+// sync usage
+// throws if not found
+const resolved = which.sync('node')
+
+// if nothrow option is used, returns null if not found
+const resolvedOrNull = which.sync('node', { nothrow: true })
+
+// Pass options to override the PATH and PATHEXT environment vars.
+await which('node', { path: someOtherPath, pathExt: somePathExt })
+```
+
+## CLI USAGE
+
+Just like the BSD `which(1)` binary but using `node-which`.
+
+```
+usage: node-which [-as] program ...
+```
+
+You can learn more about why the binary is `node-which` and not `which`
+[here](https://github.com/npm/node-which/pull/67)
+
+## OPTIONS
+
+You may pass an options object as the second argument.
+
+- `path`: Use instead of the `PATH` environment variable.
+- `pathExt`: Use instead of the `PATHEXT` environment variable.
+- `all`: Return all matches, instead of just the first one. Note that
+ this means the function returns an array of strings instead of a
+ single string.
diff --git a/node_modules/which/bin/which.js b/node_modules/which/bin/which.js
new file mode 100755
index 0000000..6df16f2
--- /dev/null
+++ b/node_modules/which/bin/which.js
@@ -0,0 +1,52 @@
+#!/usr/bin/env node
+
+const which = require('../lib')
+const argv = process.argv.slice(2)
+
+const usage = (err) => {
+ if (err) {
+ console.error(`which: ${err}`)
+ }
+ console.error('usage: which [-as] program ...')
+ process.exit(1)
+}
+
+if (!argv.length) {
+ return usage()
+}
+
+let dashdash = false
+const [commands, flags] = argv.reduce((acc, arg) => {
+ if (dashdash || arg === '--') {
+ dashdash = true
+ return acc
+ }
+
+ if (!/^-/.test(arg)) {
+ acc[0].push(arg)
+ return acc
+ }
+
+ for (const flag of arg.slice(1).split('')) {
+ if (flag === 's') {
+ acc[1].silent = true
+ } else if (flag === 'a') {
+ acc[1].all = true
+ } else {
+ usage(`illegal option -- ${flag}`)
+ }
+ }
+
+ return acc
+}, [[], {}])
+
+for (const command of commands) {
+ try {
+ const res = which.sync(command, { all: flags.all })
+ if (!flags.silent) {
+ console.log([].concat(res).join('\n'))
+ }
+ } catch (err) {
+ process.exitCode = 1
+ }
+}
diff --git a/node_modules/which/lib/index.js b/node_modules/which/lib/index.js
new file mode 100644
index 0000000..2fd358b
--- /dev/null
+++ b/node_modules/which/lib/index.js
@@ -0,0 +1,111 @@
+const { isexe, sync: isexeSync } = require('isexe')
+const { join, delimiter, sep, posix } = require('path')
+
+const isWindows = process.platform === 'win32'
+
+// used to check for slashed in commands passed in. always checks for the posix
+// seperator on all platforms, and checks for the current separator when not on
+// a posix platform. don't use the isWindows check for this since that is mocked
+// in tests but we still need the code to actually work when called. that is also
+// why it is ignored from coverage.
+/* istanbul ignore next */
+const rSlash = new RegExp(`[${posix.sep}${sep === posix.sep ? '' : sep}]`.replace(/(\\)/g, '\\$1'))
+const rRel = new RegExp(`^\\.${rSlash.source}`)
+
+const getNotFoundError = (cmd) =>
+ Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' })
+
+const getPathInfo = (cmd, {
+ path: optPath = process.env.PATH,
+ pathExt: optPathExt = process.env.PATHEXT,
+ delimiter: optDelimiter = delimiter,
+}) => {
+ // If it has a slash, then we don't bother searching the pathenv.
+ // just check the file itself, and that's it.
+ const pathEnv = cmd.match(rSlash) ? [''] : [
+ // windows always checks the cwd first
+ ...(isWindows ? [process.cwd()] : []),
+ ...(optPath || /* istanbul ignore next: very unusual */ '').split(optDelimiter),
+ ]
+
+ if (isWindows) {
+ const pathExtExe = optPathExt ||
+ ['.EXE', '.CMD', '.BAT', '.COM'].join(optDelimiter)
+ const pathExt = pathExtExe.split(optDelimiter).flatMap((item) => [item, item.toLowerCase()])
+ if (cmd.includes('.') && pathExt[0] !== '') {
+ pathExt.unshift('')
+ }
+ return { pathEnv, pathExt, pathExtExe }
+ }
+
+ return { pathEnv, pathExt: [''] }
+}
+
+const getPathPart = (raw, cmd) => {
+ const pathPart = /^".*"$/.test(raw) ? raw.slice(1, -1) : raw
+ const prefix = !pathPart && rRel.test(cmd) ? cmd.slice(0, 2) : ''
+ return prefix + join(pathPart, cmd)
+}
+
+const which = async (cmd, opt = {}) => {
+ const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)
+ const found = []
+
+ for (const envPart of pathEnv) {
+ const p = getPathPart(envPart, cmd)
+
+ for (const ext of pathExt) {
+ const withExt = p + ext
+ const is = await isexe(withExt, { pathExt: pathExtExe, ignoreErrors: true })
+ if (is) {
+ if (!opt.all) {
+ return withExt
+ }
+ found.push(withExt)
+ }
+ }
+ }
+
+ if (opt.all && found.length) {
+ return found
+ }
+
+ if (opt.nothrow) {
+ return null
+ }
+
+ throw getNotFoundError(cmd)
+}
+
+const whichSync = (cmd, opt = {}) => {
+ const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)
+ const found = []
+
+ for (const pathEnvPart of pathEnv) {
+ const p = getPathPart(pathEnvPart, cmd)
+
+ for (const ext of pathExt) {
+ const withExt = p + ext
+ const is = isexeSync(withExt, { pathExt: pathExtExe, ignoreErrors: true })
+ if (is) {
+ if (!opt.all) {
+ return withExt
+ }
+ found.push(withExt)
+ }
+ }
+ }
+
+ if (opt.all && found.length) {
+ return found
+ }
+
+ if (opt.nothrow) {
+ return null
+ }
+
+ throw getNotFoundError(cmd)
+}
+
+module.exports = which
+which.sync = whichSync
diff --git a/node_modules/which/package.json b/node_modules/which/package.json
new file mode 100644
index 0000000..c6a4bf2
--- /dev/null
+++ b/node_modules/which/package.json
@@ -0,0 +1,52 @@
+{
+ "author": "GitHub Inc.",
+ "name": "which",
+ "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.",
+ "version": "6.0.1",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/npm/node-which.git"
+ },
+ "main": "lib/index.js",
+ "bin": {
+ "node-which": "./bin/which.js"
+ },
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^4.0.0"
+ },
+ "devDependencies": {
+ "@npmcli/eslint-config": "^6.0.0",
+ "@npmcli/template-oss": "4.28.1",
+ "tap": "^16.3.0"
+ },
+ "scripts": {
+ "test": "tap",
+ "lint": "npm run eslint",
+ "postlint": "template-oss-check",
+ "template-oss-apply": "template-oss-apply --force",
+ "lintfix": "npm run eslint -- --fix",
+ "snap": "tap",
+ "posttest": "npm run lint",
+ "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
+ },
+ "files": [
+ "bin/",
+ "lib/"
+ ],
+ "tap": {
+ "check-coverage": true,
+ "nyc-arg": [
+ "--exclude",
+ "tap-snapshots/**"
+ ]
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ },
+ "templateOSS": {
+ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
+ "version": "4.28.1",
+ "publish": "true"
+ }
+}