@socketsecurity/cli-with-sentry 0.14.113 → 0.14.115
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/dist/instrument-with-sentry.js +2 -2
- package/dist/instrument-with-sentry.js.map +1 -1
- package/dist/module-sync/cli.js +26 -30
- package/dist/module-sync/cli.js.map +1 -1
- package/dist/module-sync/fs.d.ts +63 -0
- package/dist/module-sync/shadow-npm-inject.js +244 -7
- package/dist/module-sync/shadow-npm-inject.js.map +1 -1
- package/dist/module-sync/shadow-npm-paths.d.ts +0 -23
- package/dist/module-sync/shadow-npm-paths.js +4 -227
- package/dist/module-sync/shadow-npm-paths.js.map +1 -1
- package/dist/module-sync/vendor.js +20283 -20282
- package/dist/module-sync/vendor.js.map +1 -1
- package/dist/require/cli.js +26 -30
- package/dist/require/cli.js.map +1 -1
- package/dist/require/shadow-npm-inject.js +244 -7
- package/dist/require/shadow-npm-inject.js.map +1 -1
- package/dist/require/shadow-npm-paths.d.ts +0 -23
- package/dist/require/shadow-npm-paths.js +4 -227
- package/dist/require/shadow-npm-paths.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,23 +1,4 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { EnvDetails } from './package-environment.js'
|
|
3
|
-
import { SocketYml } from '@socketsecurity/config'
|
|
4
|
-
import { SocketSdkReturnType } from '@socketsecurity/sdk'
|
|
5
|
-
import { GlobOptions } from 'tinyglobby'
|
|
6
|
-
declare function filterGlobResultToSupportedFiles(
|
|
7
|
-
entries: string[] | readonly string[],
|
|
8
|
-
supportedFiles: SocketSdkReturnType<'getReportSupportedFiles'>['data']
|
|
9
|
-
): Promise<string[]>
|
|
10
|
-
type GlobWithGitIgnoreOptions = GlobOptions & {
|
|
11
|
-
socketConfig?: SocketYml | undefined
|
|
12
|
-
}
|
|
13
|
-
declare function globWithGitIgnore(
|
|
14
|
-
patterns: string[] | readonly string[],
|
|
15
|
-
options: GlobWithGitIgnoreOptions
|
|
16
|
-
): Promise<string[]>
|
|
17
|
-
declare function globWorkspace(pkgEnvDetails: EnvDetails): Promise<string[]>
|
|
18
|
-
declare function pathsToGlobPatterns(
|
|
19
|
-
paths: string[] | readonly string[]
|
|
20
|
-
): string[]
|
|
21
2
|
declare function getNpmBinPath(): string
|
|
22
3
|
declare function isNpmBinPathShadowed(): boolean
|
|
23
4
|
declare function getNpxBinPath(): string
|
|
@@ -31,10 +12,6 @@ declare function getArboristEdgeClassPath(): string
|
|
|
31
12
|
declare function getArboristNodeClassPath(): string
|
|
32
13
|
declare function getArboristOverrideSetClassPath(): string
|
|
33
14
|
export {
|
|
34
|
-
filterGlobResultToSupportedFiles,
|
|
35
|
-
globWithGitIgnore,
|
|
36
|
-
globWorkspace,
|
|
37
|
-
pathsToGlobPatterns,
|
|
38
15
|
getNpmBinPath,
|
|
39
16
|
isNpmBinPathShadowed,
|
|
40
17
|
getNpxBinPath,
|
|
@@ -11,230 +11,8 @@ const vendor = require('./vendor.js')
|
|
|
11
11
|
const debug = require('@socketsecurity/registry/lib/debug')
|
|
12
12
|
const npm = require('@socketsecurity/registry/lib/npm')
|
|
13
13
|
const words = require('@socketsecurity/registry/lib/words')
|
|
14
|
-
const strings = require('@socketsecurity/registry/lib/strings')
|
|
15
14
|
const shadowNpmInject = require('./shadow-npm-inject.js')
|
|
16
15
|
|
|
17
|
-
const { NPM: NPM$2, PNPM } = constants
|
|
18
|
-
const PNPM_WORKSPACE = `${PNPM}-workspace`
|
|
19
|
-
const ignoredDirs = [
|
|
20
|
-
// Taken from ignore-by-default:
|
|
21
|
-
// https://github.com/novemberborn/ignore-by-default/blob/v2.1.0/index.js
|
|
22
|
-
'.git',
|
|
23
|
-
// Git repository files, see <https://git-scm.com/>
|
|
24
|
-
'.log',
|
|
25
|
-
// Log files emitted by tools such as `tsserver`, see <https://github.com/Microsoft/TypeScript/wiki/Standalone-Server-%28tsserver%29>
|
|
26
|
-
'.nyc_output',
|
|
27
|
-
// Temporary directory where nyc stores coverage data, see <https://github.com/bcoe/nyc>
|
|
28
|
-
'.sass-cache',
|
|
29
|
-
// Cache folder for node-sass, see <https://github.com/sass/node-sass>
|
|
30
|
-
'.yarn',
|
|
31
|
-
// Where node modules are installed when using Yarn, see <https://yarnpkg.com/>
|
|
32
|
-
'bower_components',
|
|
33
|
-
// Where Bower packages are installed, see <http://bower.io/>
|
|
34
|
-
'coverage',
|
|
35
|
-
// Standard output directory for code coverage reports, see <https://github.com/gotwarlost/istanbul>
|
|
36
|
-
'node_modules',
|
|
37
|
-
// Where Node modules are installed, see <https://nodejs.org/>
|
|
38
|
-
// Taken from globby:
|
|
39
|
-
// https://github.com/sindresorhus/globby/blob/v14.0.2/ignore.js#L11-L16
|
|
40
|
-
'flow-typed'
|
|
41
|
-
]
|
|
42
|
-
const ignoredDirPatterns = ignoredDirs.map(i => `**/${i}`)
|
|
43
|
-
async function getWorkspaceGlobs(pkgEnvDetails) {
|
|
44
|
-
let workspacePatterns
|
|
45
|
-
if (pkgEnvDetails.agent === PNPM) {
|
|
46
|
-
for (const workspacePath of [
|
|
47
|
-
path.join(pkgEnvDetails.pkgPath, `${PNPM_WORKSPACE}.yaml`),
|
|
48
|
-
path.join(pkgEnvDetails.pkgPath, `${PNPM_WORKSPACE}.yml`)
|
|
49
|
-
]) {
|
|
50
|
-
// eslint-disable-next-line no-await-in-loop
|
|
51
|
-
const yml = await shadowNpmInject.safeReadFile(workspacePath)
|
|
52
|
-
if (yml) {
|
|
53
|
-
try {
|
|
54
|
-
workspacePatterns = vendor.distExports$1.parse(yml)?.packages
|
|
55
|
-
} catch {}
|
|
56
|
-
if (workspacePatterns) {
|
|
57
|
-
break
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
} else {
|
|
62
|
-
workspacePatterns = pkgEnvDetails.editablePkgJson.content['workspaces']
|
|
63
|
-
}
|
|
64
|
-
return Array.isArray(workspacePatterns)
|
|
65
|
-
? workspacePatterns
|
|
66
|
-
.filter(strings.isNonEmptyString)
|
|
67
|
-
.map(workspacePatternToGlobPattern)
|
|
68
|
-
: []
|
|
69
|
-
}
|
|
70
|
-
function ignoreFileLinesToGlobPatterns(lines, filepath, cwd) {
|
|
71
|
-
const base = path.relative(cwd, path.dirname(filepath)).replace(/\\/g, '/')
|
|
72
|
-
const patterns = []
|
|
73
|
-
for (let i = 0, { length } = lines; i < length; i += 1) {
|
|
74
|
-
const pattern = lines[i].trim()
|
|
75
|
-
if (pattern.length > 0 && pattern.charCodeAt(0) !== 35 /*'#'*/) {
|
|
76
|
-
patterns.push(
|
|
77
|
-
ignorePatternToMinimatch(
|
|
78
|
-
pattern.length && pattern.charCodeAt(0) === 33 /*'!'*/
|
|
79
|
-
? `!${path.posix.join(base, pattern.slice(1))}`
|
|
80
|
-
: path.posix.join(base, pattern)
|
|
81
|
-
)
|
|
82
|
-
)
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return patterns
|
|
86
|
-
}
|
|
87
|
-
function ignoreFileToGlobPatterns(content, filepath, cwd) {
|
|
88
|
-
return ignoreFileLinesToGlobPatterns(content.split(/\r?\n/), filepath, cwd)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Based on `@eslint/compat` convertIgnorePatternToMinimatch.
|
|
92
|
-
// Apache v2.0 licensed
|
|
93
|
-
// Copyright Nicholas C. Zakas
|
|
94
|
-
// https://github.com/eslint/rewrite/blob/compat-v1.2.1/packages/compat/src/ignore-file.js#L28
|
|
95
|
-
function ignorePatternToMinimatch(pattern) {
|
|
96
|
-
const isNegated = pattern.startsWith('!')
|
|
97
|
-
const negatedPrefix = isNegated ? '!' : ''
|
|
98
|
-
const patternToTest = (isNegated ? pattern.slice(1) : pattern).trimEnd()
|
|
99
|
-
// Special cases.
|
|
100
|
-
if (
|
|
101
|
-
patternToTest === '' ||
|
|
102
|
-
patternToTest === '**' ||
|
|
103
|
-
patternToTest === '/**' ||
|
|
104
|
-
patternToTest === '**'
|
|
105
|
-
) {
|
|
106
|
-
return `${negatedPrefix}${patternToTest}`
|
|
107
|
-
}
|
|
108
|
-
const firstIndexOfSlash = patternToTest.indexOf('/')
|
|
109
|
-
const matchEverywherePrefix =
|
|
110
|
-
firstIndexOfSlash === -1 || firstIndexOfSlash === patternToTest.length - 1
|
|
111
|
-
? '**/'
|
|
112
|
-
: ''
|
|
113
|
-
const patternWithoutLeadingSlash =
|
|
114
|
-
firstIndexOfSlash === 0 ? patternToTest.slice(1) : patternToTest
|
|
115
|
-
// Escape `{` and `(` because in gitignore patterns they are just
|
|
116
|
-
// literal characters without any specific syntactic meaning,
|
|
117
|
-
// while in minimatch patterns they can form brace expansion or extglob syntax.
|
|
118
|
-
//
|
|
119
|
-
// For example, gitignore pattern `src/{a,b}.js` ignores file `src/{a,b}.js`.
|
|
120
|
-
// But, the same minimatch pattern `src/{a,b}.js` ignores files `src/a.js` and `src/b.js`.
|
|
121
|
-
// Minimatch pattern `src/\{a,b}.js` is equivalent to gitignore pattern `src/{a,b}.js`.
|
|
122
|
-
const escapedPatternWithoutLeadingSlash =
|
|
123
|
-
patternWithoutLeadingSlash.replaceAll(
|
|
124
|
-
/(?=((?:\\.|[^{(])*))\1([{(])/guy,
|
|
125
|
-
'$1\\$2'
|
|
126
|
-
)
|
|
127
|
-
const matchInsideSuffix = patternToTest.endsWith('/**') ? '/*' : ''
|
|
128
|
-
return `${negatedPrefix}${matchEverywherePrefix}${escapedPatternWithoutLeadingSlash}${matchInsideSuffix}`
|
|
129
|
-
}
|
|
130
|
-
function workspacePatternToGlobPattern(workspace) {
|
|
131
|
-
const { length } = workspace
|
|
132
|
-
if (!length) {
|
|
133
|
-
return ''
|
|
134
|
-
}
|
|
135
|
-
// If the workspace ends with "/"
|
|
136
|
-
if (workspace.charCodeAt(length - 1) === 47 /*'/'*/) {
|
|
137
|
-
return `${workspace}/*/package.json`
|
|
138
|
-
}
|
|
139
|
-
// If the workspace ends with "/**"
|
|
140
|
-
if (
|
|
141
|
-
workspace.charCodeAt(length - 1) === 42 /*'*'*/ &&
|
|
142
|
-
workspace.charCodeAt(length - 2) === 42 /*'*'*/ &&
|
|
143
|
-
workspace.charCodeAt(length - 3) === 47 /*'/'*/
|
|
144
|
-
) {
|
|
145
|
-
return `${workspace}/*/**/package.json`
|
|
146
|
-
}
|
|
147
|
-
// Things like "packages/a" or "packages/*"
|
|
148
|
-
return `${workspace}/package.json`
|
|
149
|
-
}
|
|
150
|
-
async function filterGlobResultToSupportedFiles(entries, supportedFiles) {
|
|
151
|
-
const patterns = ['golang', NPM$2, 'maven', 'pypi', 'gem', 'nuget'].reduce(
|
|
152
|
-
(r, n) => {
|
|
153
|
-
const supported = supportedFiles[n]
|
|
154
|
-
r.push(
|
|
155
|
-
...(supported
|
|
156
|
-
? Object.values(supported).map(p => `**/${p.pattern}`)
|
|
157
|
-
: [])
|
|
158
|
-
)
|
|
159
|
-
return r
|
|
160
|
-
},
|
|
161
|
-
[]
|
|
162
|
-
)
|
|
163
|
-
return entries.filter(p => vendor.micromatchExports.some(p, patterns))
|
|
164
|
-
}
|
|
165
|
-
async function globWithGitIgnore(patterns, options) {
|
|
166
|
-
const {
|
|
167
|
-
cwd = process.cwd(),
|
|
168
|
-
socketConfig,
|
|
169
|
-
...additionalOptions
|
|
170
|
-
} = {
|
|
171
|
-
__proto__: null,
|
|
172
|
-
...options
|
|
173
|
-
}
|
|
174
|
-
const projectIgnorePaths = socketConfig?.projectIgnorePaths
|
|
175
|
-
const ignoreFiles = await vendor.distExports.glob(['**/.gitignore'], {
|
|
176
|
-
absolute: true,
|
|
177
|
-
cwd,
|
|
178
|
-
expandDirectories: true
|
|
179
|
-
})
|
|
180
|
-
const ignores = [
|
|
181
|
-
...ignoredDirPatterns,
|
|
182
|
-
...(Array.isArray(projectIgnorePaths)
|
|
183
|
-
? ignoreFileLinesToGlobPatterns(
|
|
184
|
-
projectIgnorePaths,
|
|
185
|
-
path.join(cwd, '.gitignore'),
|
|
186
|
-
cwd
|
|
187
|
-
)
|
|
188
|
-
: []),
|
|
189
|
-
...(
|
|
190
|
-
await Promise.all(
|
|
191
|
-
ignoreFiles.map(async filepath =>
|
|
192
|
-
ignoreFileToGlobPatterns(
|
|
193
|
-
await fs.promises.readFile(filepath, 'utf8'),
|
|
194
|
-
filepath,
|
|
195
|
-
cwd
|
|
196
|
-
)
|
|
197
|
-
)
|
|
198
|
-
)
|
|
199
|
-
).flat()
|
|
200
|
-
]
|
|
201
|
-
const hasNegatedPattern = ignores.some(p => p.charCodeAt(0) === 33 /*'!'*/)
|
|
202
|
-
const globOptions = {
|
|
203
|
-
absolute: true,
|
|
204
|
-
cwd,
|
|
205
|
-
expandDirectories: false,
|
|
206
|
-
ignore: hasNegatedPattern ? [] : ignores,
|
|
207
|
-
...additionalOptions
|
|
208
|
-
}
|
|
209
|
-
const result = await vendor.distExports.glob(patterns, globOptions)
|
|
210
|
-
if (!hasNegatedPattern) {
|
|
211
|
-
return result
|
|
212
|
-
}
|
|
213
|
-
const { absolute } = globOptions
|
|
214
|
-
|
|
215
|
-
// Note: the input files must be INSIDE the cwd. If you get strange looking
|
|
216
|
-
// relative path errors here, most likely your path is outside the given cwd.
|
|
217
|
-
const filtered = vendor
|
|
218
|
-
.ignoreExports()
|
|
219
|
-
.add(ignores)
|
|
220
|
-
.filter(absolute ? result.map(p => path.relative(cwd, p)) : result)
|
|
221
|
-
return absolute ? filtered.map(p => path.resolve(cwd, p)) : filtered
|
|
222
|
-
}
|
|
223
|
-
async function globWorkspace(pkgEnvDetails) {
|
|
224
|
-
const workspaceGlobs = await getWorkspaceGlobs(pkgEnvDetails)
|
|
225
|
-
return workspaceGlobs.length
|
|
226
|
-
? await vendor.distExports.glob(workspaceGlobs, {
|
|
227
|
-
absolute: true,
|
|
228
|
-
cwd: pkgEnvDetails.pkgPath,
|
|
229
|
-
ignore: ['**/node_modules/**', '**/bower_components/**']
|
|
230
|
-
})
|
|
231
|
-
: []
|
|
232
|
-
}
|
|
233
|
-
function pathsToGlobPatterns(paths) {
|
|
234
|
-
// TODO: Does not support `~/` paths.
|
|
235
|
-
return paths.map(p => (p === '.' || p === './' ? '**/*' : p))
|
|
236
|
-
}
|
|
237
|
-
|
|
238
16
|
const { NODE_MODULES: NODE_MODULES$1, NPM: NPM$1, shadowBinPath } = constants
|
|
239
17
|
function findBinPathDetailsSync(binName) {
|
|
240
18
|
const binPaths =
|
|
@@ -323,9 +101,9 @@ async function getPackageFilesForScan(cwd, inputPaths, supportedFiles, config) {
|
|
|
323
101
|
|
|
324
102
|
// Lazily access constants.spinner.
|
|
325
103
|
const { spinner } = constants
|
|
326
|
-
const patterns = pathsToGlobPatterns(inputPaths)
|
|
104
|
+
const patterns = shadowNpmInject.pathsToGlobPatterns(inputPaths)
|
|
327
105
|
spinner.start('Searching for local files to include in scan...')
|
|
328
|
-
const entries = await globWithGitIgnore(patterns, {
|
|
106
|
+
const entries = await shadowNpmInject.globWithGitIgnore(patterns, {
|
|
329
107
|
cwd,
|
|
330
108
|
socketConfig: config
|
|
331
109
|
})
|
|
@@ -341,7 +119,7 @@ async function getPackageFilesForScan(cwd, inputPaths, supportedFiles, config) {
|
|
|
341
119
|
`Resolved ${inputPaths.length} paths to ${entries.length} local paths, searching for files now...`
|
|
342
120
|
)
|
|
343
121
|
}
|
|
344
|
-
const packageFiles = await filterGlobResultToSupportedFiles(
|
|
122
|
+
const packageFiles = await shadowNpmInject.filterGlobResultToSupportedFiles(
|
|
345
123
|
entries,
|
|
346
124
|
supportedFiles
|
|
347
125
|
)
|
|
@@ -508,8 +286,7 @@ exports.getNpmBinPath = getNpmBinPath
|
|
|
508
286
|
exports.getNpmRequire = getNpmRequire
|
|
509
287
|
exports.getNpxBinPath = getNpxBinPath
|
|
510
288
|
exports.getPackageFilesForScan = getPackageFilesForScan
|
|
511
|
-
exports.globWorkspace = globWorkspace
|
|
512
289
|
exports.isNpmBinPathShadowed = isNpmBinPathShadowed
|
|
513
290
|
exports.isNpxBinPathShadowed = isNpxBinPathShadowed
|
|
514
|
-
//# debugId=
|
|
291
|
+
//# debugId=75cc424a-e3b3-459b-ab4f-2559d82d5382
|
|
515
292
|
//# sourceMappingURL=shadow-npm-paths.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow-npm-paths.js","sources":["../../src/utils/glob.ts","../../src/utils/path-resolve.ts","../../src/shadow/npm/paths.ts"],"sourcesContent":["import { promises as fs } from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\n\nimport ignore from 'ignore'\nimport micromatch from 'micromatch'\nimport { glob as tinyGlob } from 'tinyglobby'\nimport { parse as yamlParse } from 'yaml'\n\nimport { isNonEmptyString } from '@socketsecurity/registry/lib/strings'\n\nimport constants from '../constants'\nimport { safeReadFile } from './fs'\n\nimport type { EnvDetails } from './package-environment'\nimport type { SocketYml } from '@socketsecurity/config'\nimport type { SocketSdkReturnType } from '@socketsecurity/sdk'\nimport type { GlobOptions } from 'tinyglobby'\n\nconst { NPM, PNPM } = constants\n\nconst PNPM_WORKSPACE = `${PNPM}-workspace`\n\nconst ignoredDirs = [\n // Taken from ignore-by-default:\n // https://github.com/novemberborn/ignore-by-default/blob/v2.1.0/index.js\n '.git', // Git repository files, see <https://git-scm.com/>\n '.log', // Log files emitted by tools such as `tsserver`, see <https://github.com/Microsoft/TypeScript/wiki/Standalone-Server-%28tsserver%29>\n '.nyc_output', // Temporary directory where nyc stores coverage data, see <https://github.com/bcoe/nyc>\n '.sass-cache', // Cache folder for node-sass, see <https://github.com/sass/node-sass>\n '.yarn', // Where node modules are installed when using Yarn, see <https://yarnpkg.com/>\n 'bower_components', // Where Bower packages are installed, see <http://bower.io/>\n 'coverage', // Standard output directory for code coverage reports, see <https://github.com/gotwarlost/istanbul>\n 'node_modules', // Where Node modules are installed, see <https://nodejs.org/>\n // Taken from globby:\n // https://github.com/sindresorhus/globby/blob/v14.0.2/ignore.js#L11-L16\n 'flow-typed'\n] as const\n\nconst ignoredDirPatterns = ignoredDirs.map(i => `**/${i}`)\n\nasync function getWorkspaceGlobs(pkgEnvDetails: EnvDetails): Promise<string[]> {\n let workspacePatterns\n if (pkgEnvDetails.agent === PNPM) {\n for (const workspacePath of [\n path.join(pkgEnvDetails.pkgPath, `${PNPM_WORKSPACE}.yaml`),\n path.join(pkgEnvDetails.pkgPath, `${PNPM_WORKSPACE}.yml`)\n ]) {\n // eslint-disable-next-line no-await-in-loop\n const yml = await safeReadFile(workspacePath)\n if (yml) {\n try {\n workspacePatterns = yamlParse(yml)?.packages\n } catch {}\n if (workspacePatterns) {\n break\n }\n }\n }\n } else {\n workspacePatterns = pkgEnvDetails.editablePkgJson.content['workspaces']\n }\n return Array.isArray(workspacePatterns)\n ? workspacePatterns\n .filter(isNonEmptyString)\n .map(workspacePatternToGlobPattern)\n : []\n}\n\nfunction ignoreFileLinesToGlobPatterns(\n lines: string[] | readonly string[],\n filepath: string,\n cwd: string\n): string[] {\n const base = path.relative(cwd, path.dirname(filepath)).replace(/\\\\/g, '/')\n const patterns = []\n for (let i = 0, { length } = lines; i < length; i += 1) {\n const pattern = lines[i]!.trim()\n if (pattern.length > 0 && pattern.charCodeAt(0) !== 35 /*'#'*/) {\n patterns.push(\n ignorePatternToMinimatch(\n pattern.length && pattern.charCodeAt(0) === 33 /*'!'*/\n ? `!${path.posix.join(base, pattern.slice(1))}`\n : path.posix.join(base, pattern)\n )\n )\n }\n }\n return patterns\n}\n\nfunction ignoreFileToGlobPatterns(\n content: string,\n filepath: string,\n cwd: string\n): string[] {\n return ignoreFileLinesToGlobPatterns(content.split(/\\r?\\n/), filepath, cwd)\n}\n\n// Based on `@eslint/compat` convertIgnorePatternToMinimatch.\n// Apache v2.0 licensed\n// Copyright Nicholas C. Zakas\n// https://github.com/eslint/rewrite/blob/compat-v1.2.1/packages/compat/src/ignore-file.js#L28\nfunction ignorePatternToMinimatch(pattern: string): string {\n const isNegated = pattern.startsWith('!')\n const negatedPrefix = isNegated ? '!' : ''\n const patternToTest = (isNegated ? pattern.slice(1) : pattern).trimEnd()\n // Special cases.\n if (\n patternToTest === '' ||\n patternToTest === '**' ||\n patternToTest === '/**' ||\n patternToTest === '**'\n ) {\n return `${negatedPrefix}${patternToTest}`\n }\n const firstIndexOfSlash = patternToTest.indexOf('/')\n const matchEverywherePrefix =\n firstIndexOfSlash === -1 || firstIndexOfSlash === patternToTest.length - 1\n ? '**/'\n : ''\n const patternWithoutLeadingSlash =\n firstIndexOfSlash === 0 ? patternToTest.slice(1) : patternToTest\n // Escape `{` and `(` because in gitignore patterns they are just\n // literal characters without any specific syntactic meaning,\n // while in minimatch patterns they can form brace expansion or extglob syntax.\n //\n // For example, gitignore pattern `src/{a,b}.js` ignores file `src/{a,b}.js`.\n // But, the same minimatch pattern `src/{a,b}.js` ignores files `src/a.js` and `src/b.js`.\n // Minimatch pattern `src/\\{a,b}.js` is equivalent to gitignore pattern `src/{a,b}.js`.\n const escapedPatternWithoutLeadingSlash =\n patternWithoutLeadingSlash.replaceAll(\n /(?=((?:\\\\.|[^{(])*))\\1([{(])/guy,\n '$1\\\\$2'\n )\n const matchInsideSuffix = patternToTest.endsWith('/**') ? '/*' : ''\n return `${negatedPrefix}${matchEverywherePrefix}${escapedPatternWithoutLeadingSlash}${matchInsideSuffix}`\n}\n\nfunction workspacePatternToGlobPattern(workspace: string): string {\n const { length } = workspace\n if (!length) {\n return ''\n }\n // If the workspace ends with \"/\"\n if (workspace.charCodeAt(length - 1) === 47 /*'/'*/) {\n return `${workspace}/*/package.json`\n }\n // If the workspace ends with \"/**\"\n if (\n workspace.charCodeAt(length - 1) === 42 /*'*'*/ &&\n workspace.charCodeAt(length - 2) === 42 /*'*'*/ &&\n workspace.charCodeAt(length - 3) === 47 /*'/'*/\n ) {\n return `${workspace}/*/**/package.json`\n }\n // Things like \"packages/a\" or \"packages/*\"\n return `${workspace}/package.json`\n}\n\nexport async function filterGlobResultToSupportedFiles(\n entries: string[] | readonly string[],\n supportedFiles: SocketSdkReturnType<'getReportSupportedFiles'>['data']\n): Promise<string[]> {\n const patterns = ['golang', NPM, 'maven', 'pypi', 'gem', 'nuget'].reduce(\n (r: string[], n: string) => {\n const supported = supportedFiles[n]\n r.push(\n ...(supported\n ? Object.values(supported).map(p => `**/${p.pattern}`)\n : [])\n )\n return r\n },\n []\n )\n return entries.filter(p => micromatch.some(p, patterns))\n}\n\ntype GlobWithGitIgnoreOptions = GlobOptions & {\n socketConfig?: SocketYml | undefined\n}\n\nexport async function globWithGitIgnore(\n patterns: string[] | readonly string[],\n options: GlobWithGitIgnoreOptions\n) {\n const {\n cwd = process.cwd(),\n socketConfig,\n ...additionalOptions\n } = { __proto__: null, ...options } as GlobWithGitIgnoreOptions\n const projectIgnorePaths = socketConfig?.projectIgnorePaths\n const ignoreFiles = await tinyGlob(['**/.gitignore'], {\n absolute: true,\n cwd,\n expandDirectories: true\n })\n const ignores = [\n ...ignoredDirPatterns,\n ...(Array.isArray(projectIgnorePaths)\n ? ignoreFileLinesToGlobPatterns(\n projectIgnorePaths,\n path.join(cwd, '.gitignore'),\n cwd\n )\n : []),\n ...(\n await Promise.all(\n ignoreFiles.map(async filepath =>\n ignoreFileToGlobPatterns(\n await fs.readFile(filepath, 'utf8'),\n filepath,\n cwd\n )\n )\n )\n ).flat()\n ]\n const hasNegatedPattern = ignores.some(p => p.charCodeAt(0) === 33 /*'!'*/)\n const globOptions = {\n absolute: true,\n cwd,\n expandDirectories: false,\n ignore: hasNegatedPattern ? [] : ignores,\n ...additionalOptions\n }\n const result = await tinyGlob(patterns as string[], globOptions)\n if (!hasNegatedPattern) {\n return result\n }\n const { absolute } = globOptions\n\n // Note: the input files must be INSIDE the cwd. If you get strange looking\n // relative path errors here, most likely your path is outside the given cwd.\n const filtered = ignore()\n .add(ignores)\n .filter(absolute ? result.map(p => path.relative(cwd, p)) : result)\n return absolute ? filtered.map(p => path.resolve(cwd, p)) : filtered\n}\n\nexport async function globWorkspace(\n pkgEnvDetails: EnvDetails\n): Promise<string[]> {\n const workspaceGlobs = await getWorkspaceGlobs(pkgEnvDetails)\n return workspaceGlobs.length\n ? await tinyGlob(workspaceGlobs, {\n absolute: true,\n cwd: pkgEnvDetails.pkgPath,\n ignore: ['**/node_modules/**', '**/bower_components/**']\n })\n : []\n}\n\nexport function pathsToGlobPatterns(\n paths: string[] | readonly string[]\n): string[] {\n // TODO: Does not support `~/` paths.\n return paths.map(p => (p === '.' || p === './' ? '**/*' : p))\n}\n","import { existsSync, statSync } from 'node:fs'\nimport path from 'node:path'\n\nimport which from 'which'\n\nimport { debugLog, isDebug } from '@socketsecurity/registry/lib/debug'\nimport { resolveBinPath } from '@socketsecurity/registry/lib/npm'\nimport { pluralize } from '@socketsecurity/registry/lib/words'\n\nimport constants from '../constants'\nimport {\n filterGlobResultToSupportedFiles,\n globWithGitIgnore,\n pathsToGlobPatterns\n} from './glob'\n\nimport type { SocketYml } from '@socketsecurity/config'\nimport type { SocketSdkReturnType } from '@socketsecurity/sdk'\n\nconst { NODE_MODULES, NPM, shadowBinPath } = constants\n\nexport function findBinPathDetailsSync(binName: string): {\n name: string\n path: string | undefined\n shadowed: boolean\n} {\n const binPaths =\n which.sync(binName, {\n all: true,\n nothrow: true\n }) ?? []\n let shadowIndex = -1\n let theBinPath: string | undefined\n for (let i = 0, { length } = binPaths; i < length; i += 1) {\n const binPath = binPaths[i]!\n // Skip our bin directory if it's in the front.\n if (path.dirname(binPath) === shadowBinPath) {\n shadowIndex = i\n } else {\n theBinPath = resolveBinPath(binPath)\n break\n }\n }\n return { name: binName, path: theBinPath, shadowed: shadowIndex !== -1 }\n}\n\nexport function findNpmPathSync(npmBinPath: string): string | undefined {\n // Lazily access constants.WIN32.\n const { WIN32 } = constants\n let thePath = npmBinPath\n while (true) {\n const libNmNpmPath = path.join(thePath, 'lib', NODE_MODULES, NPM)\n // mise puts its npm bin in a path like:\n // /Users/SomeUsername/.local/share/mise/installs/node/vX.X.X/bin/npm.\n // HOWEVER, the location of the npm install is:\n // /Users/SomeUsername/.local/share/mise/installs/node/vX.X.X/lib/node_modules/npm.\n if (\n // Use existsSync here because statsSync, even with { throwIfNoEntry: false },\n // will throw an ENOTDIR error for paths like ./a-file-that-exists/a-directory-that-does-not.\n // See https://github.com/nodejs/node/issues/56993.\n existsSync(libNmNpmPath) &&\n statSync(libNmNpmPath, { throwIfNoEntry: false })?.isDirectory()\n ) {\n thePath = path.join(libNmNpmPath, NPM)\n }\n const nmPath = path.join(thePath, NODE_MODULES)\n if (\n // npm bin paths may look like:\n // /usr/local/share/npm/bin/npm\n // /Users/SomeUsername/.nvm/versions/node/vX.X.X/bin/npm\n // C:\\Users\\SomeUsername\\AppData\\Roaming\\npm\\bin\\npm.cmd\n // OR\n // C:\\Program Files\\nodejs\\npm.cmd\n //\n // In practically all cases the npm path contains a node_modules folder:\n // /usr/local/share/npm/bin/npm/node_modules\n // C:\\Program Files\\nodejs\\node_modules\n existsSync(nmPath) &&\n statSync(nmPath, { throwIfNoEntry: false })?.isDirectory() &&\n // Optimistically look for the default location.\n (path.basename(thePath) === NPM ||\n // Chocolatey installs npm bins in the same directory as node bins.\n (WIN32 && existsSync(path.join(thePath, `${NPM}.cmd`))))\n ) {\n return thePath\n }\n const parent = path.dirname(thePath)\n if (parent === thePath) {\n return undefined\n }\n thePath = parent\n }\n}\n\nexport async function getPackageFilesForScan(\n cwd: string,\n inputPaths: string[],\n supportedFiles: SocketSdkReturnType<'getReportSupportedFiles'>['data'],\n config?: SocketYml | undefined\n): Promise<string[]> {\n debugLog(\n `getPackageFilesForScan: resolving ${inputPaths.length} paths:\\n`,\n inputPaths\n )\n\n // Lazily access constants.spinner.\n const { spinner } = constants\n\n const patterns = pathsToGlobPatterns(inputPaths)\n\n spinner.start('Searching for local files to include in scan...')\n\n const entries = await globWithGitIgnore(patterns, {\n cwd,\n socketConfig: config\n })\n\n if (isDebug()) {\n spinner.stop()\n debugLog(\n `Resolved ${inputPaths.length} paths to ${entries.length} local paths:\\n`,\n entries\n )\n spinner.start('Searching for files now...')\n } else {\n spinner.start(\n `Resolved ${inputPaths.length} paths to ${entries.length} local paths, searching for files now...`\n )\n }\n\n const packageFiles = await filterGlobResultToSupportedFiles(\n entries,\n supportedFiles\n )\n\n spinner.successAndStop(\n `Found ${packageFiles.length} local ${pluralize('file', packageFiles.length)}`\n )\n debugLog('Absolute paths:\\n', packageFiles)\n\n return packageFiles\n}\n","import { existsSync } from 'node:fs'\nimport Module from 'node:module'\nimport path from 'node:path'\nimport process from 'node:process'\n\nimport { logger } from '@socketsecurity/registry/lib/logger'\nimport { normalizePath } from '@socketsecurity/registry/lib/path'\n\nimport constants from '../../constants'\nimport {\n findBinPathDetailsSync,\n findNpmPathSync\n} from '../../utils/path-resolve'\n\nconst { NODE_MODULES, NPM, NPX, SOCKET_CLI_ISSUES_URL } = constants\n\nfunction exitWithBinPathError(binName: string): never {\n logger.fail(\n `Socket unable to locate ${binName}; ensure it is available in the PATH environment variable`\n )\n // The exit code 127 indicates that the command or binary being executed\n // could not be found.\n // eslint-disable-next-line n/no-process-exit\n process.exit(127)\n}\n\nlet _npmBinPathDetails: ReturnType<typeof findBinPathDetailsSync> | undefined\nfunction getNpmBinPathDetails(): ReturnType<typeof findBinPathDetailsSync> {\n if (_npmBinPathDetails === undefined) {\n _npmBinPathDetails = findBinPathDetailsSync(NPM)\n }\n return _npmBinPathDetails\n}\n\nlet _npxBinPathDetails: ReturnType<typeof findBinPathDetailsSync> | undefined\nfunction getNpxBinPathDetails(): ReturnType<typeof findBinPathDetailsSync> {\n if (_npxBinPathDetails === undefined) {\n _npxBinPathDetails = findBinPathDetailsSync(NPX)\n }\n return _npxBinPathDetails\n}\n\nlet _npmBinPath: string | undefined\nexport function getNpmBinPath(): string {\n if (_npmBinPath === undefined) {\n _npmBinPath = getNpmBinPathDetails().path\n if (!_npmBinPath) {\n exitWithBinPathError(NPM)\n }\n }\n return _npmBinPath\n}\n\nexport function isNpmBinPathShadowed() {\n return getNpmBinPathDetails().shadowed\n}\n\nlet _npxBinPath: string | undefined\nexport function getNpxBinPath(): string {\n if (_npxBinPath === undefined) {\n _npxBinPath = getNpxBinPathDetails().path\n if (!_npxBinPath) {\n exitWithBinPathError(NPX)\n }\n }\n return _npxBinPath\n}\n\nexport function isNpxBinPathShadowed() {\n return getNpxBinPathDetails().shadowed\n}\n\nlet _npmPath: string | undefined\nexport function getNpmPath() {\n if (_npmPath === undefined) {\n const npmBinPath = getNpmBinPath()\n _npmPath = npmBinPath ? findNpmPathSync(npmBinPath) : undefined\n if (!_npmPath) {\n let message = 'Unable to find npm CLI install directory.'\n if (npmBinPath) {\n message += `\\nSearched parent directories of ${path.dirname(npmBinPath)}.`\n }\n message += `\\n\\nThis is may be a bug with socket-npm related to changes to the npm CLI.\\nPlease report to ${SOCKET_CLI_ISSUES_URL}.`\n logger.fail(message)\n // The exit code 127 indicates that the command or binary being executed\n // could not be found.\n // eslint-disable-next-line n/no-process-exit\n process.exit(127)\n }\n }\n return _npmPath\n}\n\nlet _npmRequire: NodeJS.Require | undefined\nexport function getNpmRequire(): NodeJS.Require {\n if (_npmRequire === undefined) {\n const npmPath = getNpmPath()\n const npmNmPath = path.join(npmPath, NODE_MODULES, NPM)\n _npmRequire = Module.createRequire(\n path.join(existsSync(npmNmPath) ? npmNmPath : npmPath, '<dummy-basename>')\n )\n }\n return _npmRequire\n}\n\nlet _arboristPkgPath: string | undefined\nexport function getArboristPackagePath() {\n if (_arboristPkgPath === undefined) {\n const pkgName = '@npmcli/arborist'\n const mainPathWithForwardSlashes = normalizePath(\n getNpmRequire().resolve(pkgName)\n )\n const arboristPkgPathWithForwardSlashes = mainPathWithForwardSlashes.slice(\n 0,\n mainPathWithForwardSlashes.lastIndexOf(pkgName) + pkgName.length\n )\n // Lazily access constants.WIN32.\n _arboristPkgPath = constants.WIN32\n ? path.normalize(arboristPkgPathWithForwardSlashes)\n : arboristPkgPathWithForwardSlashes\n }\n return _arboristPkgPath\n}\n\nlet _arboristClassPath: string | undefined\nexport function getArboristClassPath() {\n if (_arboristClassPath === undefined) {\n _arboristClassPath = path.join(\n getArboristPackagePath(),\n 'lib/arborist/index.js'\n )\n }\n return _arboristClassPath\n}\n\nlet _arboristDepValidPath: string | undefined\nexport function getArboristDepValidPath() {\n if (_arboristDepValidPath === undefined) {\n _arboristDepValidPath = path.join(\n getArboristPackagePath(),\n 'lib/dep-valid.js'\n )\n }\n return _arboristDepValidPath\n}\n\nlet _arboristEdgeClassPath: string | undefined\nexport function getArboristEdgeClassPath() {\n if (_arboristEdgeClassPath === undefined) {\n _arboristEdgeClassPath = path.join(getArboristPackagePath(), 'lib/edge.js')\n }\n return _arboristEdgeClassPath\n}\n\nlet _arboristNodeClassPath: string | undefined\nexport function getArboristNodeClassPath() {\n if (_arboristNodeClassPath === undefined) {\n _arboristNodeClassPath = path.join(getArboristPackagePath(), 'lib/node.js')\n }\n return _arboristNodeClassPath\n}\n\nlet _arboristOverrideSetClassPath: string | undefined\nexport function getArboristOverrideSetClassPath() {\n if (_arboristOverrideSetClassPath === undefined) {\n _arboristOverrideSetClassPath = path.join(\n getArboristPackagePath(),\n 'lib/override-set.js'\n )\n }\n return _arboristOverrideSetClassPath\n}\n"],"names":["PNPM","workspacePatterns","length","cwd","__proto__","absolute","expandDirectories","ignore","shadowBinPath","all","nothrow","shadowIndex","theBinPath","name","path","WIN32","existsSync","throwIfNoEntry","thePath","spinner","socketConfig","debugLog","SOCKET_CLI_ISSUES_URL","logger","process","_npmBinPathDetails","_npxBinPathDetails","_npmBinPath","_npxBinPath","_arboristPkgPath"],"mappings":";;;;;;;;;;;;;;;;AAmBA;;AAAaA;AAAK;AAElB;AAEA;AACE;AACA;AACA;AAAQ;AACR;AAAQ;AACR;AAAe;AACf;AAAe;AACf;AAAS;AACT;AAAoB;AACpB;AAAY;AACZ;AAAgB;AAChB;AACA;AACA;AAGF;AAEA;AACE;AACA;AACE;AAIE;AACA;AACA;;AAEIC;;AAEF;AACE;AACF;AACF;AACF;AACF;;AAEA;AACA;AAKF;AAEA;;;AAOE;AAAkBC;;;AAEhB;;AAQA;AACF;AACA;AACF;AAEA;AAKE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACE;AACA;AACA;AACA;AACA;AAME;AACF;AACA;AACA;AAIA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAQF;AAEA;;AACUA;AAAO;;AAEb;AACF;AACA;;;AAGA;AACA;AACA;;AAMA;AACA;;AAEF;AAEO;;AAMD;;AAMA;;AAIJ;AACF;AAMO;;AAKHC;;;AAGF;AAAMC;;;AACN;;AAEEC;;AAEAC;AACF;AACA;AAqBA;AACA;AACED;;AAEAC;AACAC;;;;;AAKA;AACF;;AACQF;AAAS;;AAEjB;AACA;AACA;AAGA;AACF;AAEO;AAGL;;AAGMA;;AAEAE;;AAGR;AAEO;AAGL;AACA;AACF;;AChPA;;;AAA2BC;AAAc;AAElC;AAKL;AAEIC;AACAC;;;AAGJ;AACA;AAAkBR;;AAChB;AACA;;AAEES;AACF;AACEC;AACA;AACF;AACF;;AACSC;AAAeC;;;AAC1B;AAEO;AACL;;AACQC;AAAM;;AAEd;AACE;AACA;AACA;AACA;AACA;AACA;AACE;AACA;AACA;AACAC;AACyBC;AAAsB;;AAGjD;;AAEA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAD;AACmBC;AAAsB;AACzC;AACCH;AACC;AACCC;AAEH;AACF;AACA;;AAEE;AACF;AACAG;AACF;AACF;AAEO;;;AAWL;;AACQC;AAAQ;AAEhB;AAEAA;AAEA;;AAEEC;AACF;;;AAIEC;AAIAF;AACF;AACEA;AAGF;;AAOAA;AAGAE;AAEA;AACF;;AC/HA;;;;AAAgCC;AAAsB;AAEtD;AACEC;AAGA;AACA;AACA;AACAC;AACF;AAEA;AACA;;AAEIC;AACF;AACA;AACF;AAEA;AACA;;AAEIC;AACF;AACA;AACF;AAEA;AACO;;AAEHC;;;AAGA;AACF;AACA;AACF;AAEO;AACL;AACF;AAEA;AACO;;AAEHC;;;AAGA;AACF;AACA;AACF;AAEO;AACL;AACF;AAEA;AACO;;AAEH;;;;AAIE;;AAEA;;AAEAL;AACA;AACA;AACA;AACAC;AACF;AACF;AACA;AACF;AAEA;AACO;;AAEH;;;AAKF;AACA;AACF;AAEA;AACO;;;AAGH;AAGA;AAIA;AACAK;AAGF;AACA;AACF;AAEA;AACO;;;AAML;AACA;AACF;AAEA;AACO;;;AAML;AACA;AACF;AAEA;AACO;;;AAGL;AACA;AACF;AAEA;AACO;;;AAGL;AACA;AACF;AAEA;AACO;;;AAML;AACA;AACF;;;;;;;;;;;;;","debugId":"e333b4b6-8d6d-4e14-b5aa-429279ab5db0"}
|
|
1
|
+
{"version":3,"file":"shadow-npm-paths.js","sources":["../../src/utils/path-resolve.ts","../../src/shadow/npm/paths.ts"],"sourcesContent":["import { existsSync, statSync } from 'node:fs'\nimport path from 'node:path'\n\nimport which from 'which'\n\nimport { debugLog, isDebug } from '@socketsecurity/registry/lib/debug'\nimport { resolveBinPath } from '@socketsecurity/registry/lib/npm'\nimport { pluralize } from '@socketsecurity/registry/lib/words'\n\nimport constants from '../constants'\nimport {\n filterGlobResultToSupportedFiles,\n globWithGitIgnore,\n pathsToGlobPatterns\n} from './glob'\n\nimport type { SocketYml } from '@socketsecurity/config'\nimport type { SocketSdkReturnType } from '@socketsecurity/sdk'\n\nconst { NODE_MODULES, NPM, shadowBinPath } = constants\n\nexport function findBinPathDetailsSync(binName: string): {\n name: string\n path: string | undefined\n shadowed: boolean\n} {\n const binPaths =\n which.sync(binName, {\n all: true,\n nothrow: true\n }) ?? []\n let shadowIndex = -1\n let theBinPath: string | undefined\n for (let i = 0, { length } = binPaths; i < length; i += 1) {\n const binPath = binPaths[i]!\n // Skip our bin directory if it's in the front.\n if (path.dirname(binPath) === shadowBinPath) {\n shadowIndex = i\n } else {\n theBinPath = resolveBinPath(binPath)\n break\n }\n }\n return { name: binName, path: theBinPath, shadowed: shadowIndex !== -1 }\n}\n\nexport function findNpmPathSync(npmBinPath: string): string | undefined {\n // Lazily access constants.WIN32.\n const { WIN32 } = constants\n let thePath = npmBinPath\n while (true) {\n const libNmNpmPath = path.join(thePath, 'lib', NODE_MODULES, NPM)\n // mise puts its npm bin in a path like:\n // /Users/SomeUsername/.local/share/mise/installs/node/vX.X.X/bin/npm.\n // HOWEVER, the location of the npm install is:\n // /Users/SomeUsername/.local/share/mise/installs/node/vX.X.X/lib/node_modules/npm.\n if (\n // Use existsSync here because statsSync, even with { throwIfNoEntry: false },\n // will throw an ENOTDIR error for paths like ./a-file-that-exists/a-directory-that-does-not.\n // See https://github.com/nodejs/node/issues/56993.\n existsSync(libNmNpmPath) &&\n statSync(libNmNpmPath, { throwIfNoEntry: false })?.isDirectory()\n ) {\n thePath = path.join(libNmNpmPath, NPM)\n }\n const nmPath = path.join(thePath, NODE_MODULES)\n if (\n // npm bin paths may look like:\n // /usr/local/share/npm/bin/npm\n // /Users/SomeUsername/.nvm/versions/node/vX.X.X/bin/npm\n // C:\\Users\\SomeUsername\\AppData\\Roaming\\npm\\bin\\npm.cmd\n // OR\n // C:\\Program Files\\nodejs\\npm.cmd\n //\n // In practically all cases the npm path contains a node_modules folder:\n // /usr/local/share/npm/bin/npm/node_modules\n // C:\\Program Files\\nodejs\\node_modules\n existsSync(nmPath) &&\n statSync(nmPath, { throwIfNoEntry: false })?.isDirectory() &&\n // Optimistically look for the default location.\n (path.basename(thePath) === NPM ||\n // Chocolatey installs npm bins in the same directory as node bins.\n (WIN32 && existsSync(path.join(thePath, `${NPM}.cmd`))))\n ) {\n return thePath\n }\n const parent = path.dirname(thePath)\n if (parent === thePath) {\n return undefined\n }\n thePath = parent\n }\n}\n\nexport async function getPackageFilesForScan(\n cwd: string,\n inputPaths: string[],\n supportedFiles: SocketSdkReturnType<'getReportSupportedFiles'>['data'],\n config?: SocketYml | undefined\n): Promise<string[]> {\n debugLog(\n `getPackageFilesForScan: resolving ${inputPaths.length} paths:\\n`,\n inputPaths\n )\n\n // Lazily access constants.spinner.\n const { spinner } = constants\n\n const patterns = pathsToGlobPatterns(inputPaths)\n\n spinner.start('Searching for local files to include in scan...')\n\n const entries = await globWithGitIgnore(patterns, {\n cwd,\n socketConfig: config\n })\n\n if (isDebug()) {\n spinner.stop()\n debugLog(\n `Resolved ${inputPaths.length} paths to ${entries.length} local paths:\\n`,\n entries\n )\n spinner.start('Searching for files now...')\n } else {\n spinner.start(\n `Resolved ${inputPaths.length} paths to ${entries.length} local paths, searching for files now...`\n )\n }\n\n const packageFiles = await filterGlobResultToSupportedFiles(\n entries,\n supportedFiles\n )\n\n spinner.successAndStop(\n `Found ${packageFiles.length} local ${pluralize('file', packageFiles.length)}`\n )\n debugLog('Absolute paths:\\n', packageFiles)\n\n return packageFiles\n}\n","import { existsSync } from 'node:fs'\nimport Module from 'node:module'\nimport path from 'node:path'\nimport process from 'node:process'\n\nimport { logger } from '@socketsecurity/registry/lib/logger'\nimport { normalizePath } from '@socketsecurity/registry/lib/path'\n\nimport constants from '../../constants'\nimport {\n findBinPathDetailsSync,\n findNpmPathSync\n} from '../../utils/path-resolve'\n\nconst { NODE_MODULES, NPM, NPX, SOCKET_CLI_ISSUES_URL } = constants\n\nfunction exitWithBinPathError(binName: string): never {\n logger.fail(\n `Socket unable to locate ${binName}; ensure it is available in the PATH environment variable`\n )\n // The exit code 127 indicates that the command or binary being executed\n // could not be found.\n // eslint-disable-next-line n/no-process-exit\n process.exit(127)\n}\n\nlet _npmBinPathDetails: ReturnType<typeof findBinPathDetailsSync> | undefined\nfunction getNpmBinPathDetails(): ReturnType<typeof findBinPathDetailsSync> {\n if (_npmBinPathDetails === undefined) {\n _npmBinPathDetails = findBinPathDetailsSync(NPM)\n }\n return _npmBinPathDetails\n}\n\nlet _npxBinPathDetails: ReturnType<typeof findBinPathDetailsSync> | undefined\nfunction getNpxBinPathDetails(): ReturnType<typeof findBinPathDetailsSync> {\n if (_npxBinPathDetails === undefined) {\n _npxBinPathDetails = findBinPathDetailsSync(NPX)\n }\n return _npxBinPathDetails\n}\n\nlet _npmBinPath: string | undefined\nexport function getNpmBinPath(): string {\n if (_npmBinPath === undefined) {\n _npmBinPath = getNpmBinPathDetails().path\n if (!_npmBinPath) {\n exitWithBinPathError(NPM)\n }\n }\n return _npmBinPath\n}\n\nexport function isNpmBinPathShadowed() {\n return getNpmBinPathDetails().shadowed\n}\n\nlet _npxBinPath: string | undefined\nexport function getNpxBinPath(): string {\n if (_npxBinPath === undefined) {\n _npxBinPath = getNpxBinPathDetails().path\n if (!_npxBinPath) {\n exitWithBinPathError(NPX)\n }\n }\n return _npxBinPath\n}\n\nexport function isNpxBinPathShadowed() {\n return getNpxBinPathDetails().shadowed\n}\n\nlet _npmPath: string | undefined\nexport function getNpmPath() {\n if (_npmPath === undefined) {\n const npmBinPath = getNpmBinPath()\n _npmPath = npmBinPath ? findNpmPathSync(npmBinPath) : undefined\n if (!_npmPath) {\n let message = 'Unable to find npm CLI install directory.'\n if (npmBinPath) {\n message += `\\nSearched parent directories of ${path.dirname(npmBinPath)}.`\n }\n message += `\\n\\nThis is may be a bug with socket-npm related to changes to the npm CLI.\\nPlease report to ${SOCKET_CLI_ISSUES_URL}.`\n logger.fail(message)\n // The exit code 127 indicates that the command or binary being executed\n // could not be found.\n // eslint-disable-next-line n/no-process-exit\n process.exit(127)\n }\n }\n return _npmPath\n}\n\nlet _npmRequire: NodeJS.Require | undefined\nexport function getNpmRequire(): NodeJS.Require {\n if (_npmRequire === undefined) {\n const npmPath = getNpmPath()\n const npmNmPath = path.join(npmPath, NODE_MODULES, NPM)\n _npmRequire = Module.createRequire(\n path.join(existsSync(npmNmPath) ? npmNmPath : npmPath, '<dummy-basename>')\n )\n }\n return _npmRequire\n}\n\nlet _arboristPkgPath: string | undefined\nexport function getArboristPackagePath() {\n if (_arboristPkgPath === undefined) {\n const pkgName = '@npmcli/arborist'\n const mainPathWithForwardSlashes = normalizePath(\n getNpmRequire().resolve(pkgName)\n )\n const arboristPkgPathWithForwardSlashes = mainPathWithForwardSlashes.slice(\n 0,\n mainPathWithForwardSlashes.lastIndexOf(pkgName) + pkgName.length\n )\n // Lazily access constants.WIN32.\n _arboristPkgPath = constants.WIN32\n ? path.normalize(arboristPkgPathWithForwardSlashes)\n : arboristPkgPathWithForwardSlashes\n }\n return _arboristPkgPath\n}\n\nlet _arboristClassPath: string | undefined\nexport function getArboristClassPath() {\n if (_arboristClassPath === undefined) {\n _arboristClassPath = path.join(\n getArboristPackagePath(),\n 'lib/arborist/index.js'\n )\n }\n return _arboristClassPath\n}\n\nlet _arboristDepValidPath: string | undefined\nexport function getArboristDepValidPath() {\n if (_arboristDepValidPath === undefined) {\n _arboristDepValidPath = path.join(\n getArboristPackagePath(),\n 'lib/dep-valid.js'\n )\n }\n return _arboristDepValidPath\n}\n\nlet _arboristEdgeClassPath: string | undefined\nexport function getArboristEdgeClassPath() {\n if (_arboristEdgeClassPath === undefined) {\n _arboristEdgeClassPath = path.join(getArboristPackagePath(), 'lib/edge.js')\n }\n return _arboristEdgeClassPath\n}\n\nlet _arboristNodeClassPath: string | undefined\nexport function getArboristNodeClassPath() {\n if (_arboristNodeClassPath === undefined) {\n _arboristNodeClassPath = path.join(getArboristPackagePath(), 'lib/node.js')\n }\n return _arboristNodeClassPath\n}\n\nlet _arboristOverrideSetClassPath: string | undefined\nexport function getArboristOverrideSetClassPath() {\n if (_arboristOverrideSetClassPath === undefined) {\n _arboristOverrideSetClassPath = path.join(\n getArboristPackagePath(),\n 'lib/override-set.js'\n )\n }\n return _arboristOverrideSetClassPath\n}\n"],"names":["shadowBinPath","all","nothrow","length","shadowIndex","theBinPath","name","path","WIN32","existsSync","throwIfNoEntry","thePath","spinner","socketConfig","debugLog","SOCKET_CLI_ISSUES_URL","logger","process","_npmBinPathDetails","_npxBinPathDetails","_npmBinPath","_npxBinPath","_arboristPkgPath"],"mappings":";;;;;;;;;;;;;;;AAmBA;;;AAA2BA;AAAc;AAElC;AAKL;AAEIC;AACAC;;;AAGJ;AACA;AAAkBC;;AAChB;AACA;;AAEEC;AACF;AACEC;AACA;AACF;AACF;;AACSC;AAAeC;;;AAC1B;AAEO;AACL;;AACQC;AAAM;;AAEd;AACE;AACA;AACA;AACA;AACA;AACA;AACE;AACA;AACA;AACAC;AACyBC;AAAsB;;AAGjD;;AAEA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAD;AACmBC;AAAsB;AACzC;AACCH;AACC;AACCC;AAEH;AACF;AACA;;AAEE;AACF;AACAG;AACF;AACF;AAEO;;;AAWL;;AACQC;AAAQ;AAEhB;AAEAA;AAEA;;AAEEC;AACF;;;AAIEC;AAIAF;AACF;AACEA;AAGF;;AAOAA;AAGAE;AAEA;AACF;;AC/HA;;;;AAAgCC;AAAsB;AAEtD;AACEC;AAGA;AACA;AACA;AACAC;AACF;AAEA;AACA;;AAEIC;AACF;AACA;AACF;AAEA;AACA;;AAEIC;AACF;AACA;AACF;AAEA;AACO;;AAEHC;;;AAGA;AACF;AACA;AACF;AAEO;AACL;AACF;AAEA;AACO;;AAEHC;;;AAGA;AACF;AACA;AACF;AAEO;AACL;AACF;AAEA;AACO;;AAEH;;;;AAIE;;AAEA;;AAEAL;AACA;AACA;AACA;AACAC;AACF;AACF;AACA;AACF;AAEA;AACO;;AAEH;;;AAKF;AACA;AACF;AAEA;AACO;;;AAGH;AAGA;AAIA;AACAK;AAGF;AACA;AACF;AAEA;AACO;;;AAML;AACA;AACF;AAEA;AACO;;;AAML;AACA;AACF;AAEA;AACO;;;AAGL;AACA;AACF;AAEA;AACO;;;AAGL;AACA;AACF;AAEA;AACO;;;AAML;AACA;AACF;;;;;;;;;;;;","debugId":"75cc424a-e3b3-459b-ab4f-2559d82d5382"}
|