upstream-radar 0.4.0

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.
Files changed (92) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +222 -0
  3. package/README.zh-CN.md +170 -0
  4. package/cordis.patch.yml +11 -0
  5. package/dist/src/cli.d.ts +3 -0
  6. package/dist/src/cli.d.ts.map +1 -0
  7. package/dist/src/cli.js +286 -0
  8. package/dist/src/cli.js.map +1 -0
  9. package/dist/src/compatibility.d.ts +12 -0
  10. package/dist/src/compatibility.d.ts.map +1 -0
  11. package/dist/src/compatibility.js +195 -0
  12. package/dist/src/compatibility.js.map +1 -0
  13. package/dist/src/dsh-analysis.d.ts +7 -0
  14. package/dist/src/dsh-analysis.d.ts.map +1 -0
  15. package/dist/src/dsh-analysis.js +53 -0
  16. package/dist/src/dsh-analysis.js.map +1 -0
  17. package/dist/src/dsh-plugin.d.ts +45 -0
  18. package/dist/src/dsh-plugin.d.ts.map +1 -0
  19. package/dist/src/dsh-plugin.js +121 -0
  20. package/dist/src/dsh-plugin.js.map +1 -0
  21. package/dist/src/graph.d.ts +14 -0
  22. package/dist/src/graph.d.ts.map +1 -0
  23. package/dist/src/graph.js +198 -0
  24. package/dist/src/graph.js.map +1 -0
  25. package/dist/src/index.d.ts +19 -0
  26. package/dist/src/index.d.ts.map +1 -0
  27. package/dist/src/index.js +19 -0
  28. package/dist/src/index.js.map +1 -0
  29. package/dist/src/inventory.d.ts +4 -0
  30. package/dist/src/inventory.d.ts.map +1 -0
  31. package/dist/src/inventory.js +182 -0
  32. package/dist/src/inventory.js.map +1 -0
  33. package/dist/src/npm-release.d.ts +24 -0
  34. package/dist/src/npm-release.d.ts.map +1 -0
  35. package/dist/src/npm-release.js +131 -0
  36. package/dist/src/npm-release.js.map +1 -0
  37. package/dist/src/npm.d.ts +36 -0
  38. package/dist/src/npm.d.ts.map +1 -0
  39. package/dist/src/npm.js +803 -0
  40. package/dist/src/npm.js.map +1 -0
  41. package/dist/src/osv.d.ts +18 -0
  42. package/dist/src/osv.d.ts.map +1 -0
  43. package/dist/src/osv.js +238 -0
  44. package/dist/src/osv.js.map +1 -0
  45. package/dist/src/policy.d.ts +5 -0
  46. package/dist/src/policy.d.ts.map +1 -0
  47. package/dist/src/policy.js +32 -0
  48. package/dist/src/policy.js.map +1 -0
  49. package/dist/src/radar-render.d.ts +4 -0
  50. package/dist/src/radar-render.d.ts.map +1 -0
  51. package/dist/src/radar-render.js +50 -0
  52. package/dist/src/radar-render.js.map +1 -0
  53. package/dist/src/radar-state.d.ts +5 -0
  54. package/dist/src/radar-state.d.ts.map +1 -0
  55. package/dist/src/radar-state.js +87 -0
  56. package/dist/src/radar-state.js.map +1 -0
  57. package/dist/src/radar-types.d.ts +163 -0
  58. package/dist/src/radar-types.d.ts.map +1 -0
  59. package/dist/src/radar-types.js +7 -0
  60. package/dist/src/radar-types.js.map +1 -0
  61. package/dist/src/radar.d.ts +24 -0
  62. package/dist/src/radar.d.ts.map +1 -0
  63. package/dist/src/radar.js +234 -0
  64. package/dist/src/radar.js.map +1 -0
  65. package/dist/src/render.d.ts +3 -0
  66. package/dist/src/render.d.ts.map +1 -0
  67. package/dist/src/render.js +58 -0
  68. package/dist/src/render.js.map +1 -0
  69. package/dist/src/scan.d.ts +8 -0
  70. package/dist/src/scan.d.ts.map +1 -0
  71. package/dist/src/scan.js +293 -0
  72. package/dist/src/scan.js.map +1 -0
  73. package/dist/src/semver.d.ts +13 -0
  74. package/dist/src/semver.d.ts.map +1 -0
  75. package/dist/src/semver.js +136 -0
  76. package/dist/src/semver.js.map +1 -0
  77. package/dist/src/tar.d.ts +25 -0
  78. package/dist/src/tar.d.ts.map +1 -0
  79. package/dist/src/tar.js +327 -0
  80. package/dist/src/tar.js.map +1 -0
  81. package/dist/src/types.d.ts +111 -0
  82. package/dist/src/types.d.ts.map +1 -0
  83. package/dist/src/types.js +2 -0
  84. package/dist/src/types.js.map +1 -0
  85. package/dist/src/version.d.ts +2 -0
  86. package/dist/src/version.d.ts.map +1 -0
  87. package/dist/src/version.js +2 -0
  88. package/dist/src/version.js.map +1 -0
  89. package/docs/assets/upstream-radar-hero-mobile.jpg +0 -0
  90. package/docs/assets/upstream-radar-hero.jpg +0 -0
  91. package/package.json +84 -0
  92. package/schemas/analysis-result.schema.json +39 -0
@@ -0,0 +1,293 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { lstat, readFile, readdir, readlink, } from 'node:fs/promises';
3
+ import { dirname, isAbsolute, relative, resolve, sep } from 'node:path';
4
+ import { decideVerdict, stricterVerdict } from './policy.js';
5
+ import { REPORT_SCHEMA, } from './types.js';
6
+ import { TOOL_VERSION } from './version.js';
7
+ const MAX_FILES = 10_000;
8
+ const MAX_TOTAL_BYTES = 64 * 1024 * 1024;
9
+ const MAX_MANIFEST_BYTES = 1024 * 1024;
10
+ const EXCLUDED_DIRECTORIES = new Set(['.git', 'node_modules']);
11
+ const LOCKFILES = ['pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lock', 'bun.lockb'];
12
+ const LIFECYCLE_SCRIPTS = ['preinstall', 'install', 'postinstall', 'prepare'];
13
+ const NATIVE_SUFFIXES = ['.node', '.dll', '.dylib', '.so', '.exe'];
14
+ function addFinding(findings, code, severity, summary, detail, evidence, remediation) {
15
+ const finding = { code, severity, summary, detail };
16
+ if (evidence !== undefined)
17
+ finding.evidence = evidence;
18
+ if (remediation !== undefined)
19
+ finding.remediation = remediation;
20
+ findings.push(finding);
21
+ }
22
+ function asRecord(value) {
23
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
24
+ return undefined;
25
+ return value;
26
+ }
27
+ function asString(value) {
28
+ return typeof value === 'string' ? value : undefined;
29
+ }
30
+ function insideRoot(root, candidate) {
31
+ const pathFromRoot = relative(root, candidate);
32
+ return pathFromRoot === '' || (!pathFromRoot.startsWith(`..${sep}`) && pathFromRoot !== '..' && !isAbsolute(pathFromRoot));
33
+ }
34
+ async function hashFile(path) {
35
+ const contents = await readFile(path);
36
+ return createHash('sha256').update(contents).digest('hex');
37
+ }
38
+ async function walkPackage(root, options, findings) {
39
+ const maxFiles = options.maxFiles ?? MAX_FILES;
40
+ const maxTotalBytes = options.maxTotalBytes ?? MAX_TOTAL_BYTES;
41
+ const files = [];
42
+ let bytesHashed = 0;
43
+ let entriesVisited = 0;
44
+ let incomplete = false;
45
+ async function visit(directory) {
46
+ if (incomplete)
47
+ return;
48
+ const entries = await readdir(directory, { withFileTypes: true });
49
+ entries.sort((left, right) => left.name.localeCompare(right.name));
50
+ for (const entry of entries) {
51
+ if (incomplete)
52
+ return;
53
+ if (entry.isDirectory() && EXCLUDED_DIRECTORIES.has(entry.name))
54
+ continue;
55
+ entriesVisited += 1;
56
+ if (entriesVisited > maxFiles) {
57
+ incomplete = true;
58
+ addFinding(findings, 'scan-budget-exceeded', 'high', 'Static scan coverage is incomplete', 'The package exceeded the configured filesystem-entry budget, so not every entry was inspected.', { entriesVisited, filesScanned: files.length, bytesHashed, maxFiles, maxTotalBytes }, 'Increase the scan budget in an isolated worker or reduce the artifact size.');
59
+ return;
60
+ }
61
+ const absolutePath = resolve(directory, entry.name);
62
+ const relativePath = relative(root, absolutePath).split(sep).join('/');
63
+ const stats = await lstat(absolutePath);
64
+ if (stats.isSymbolicLink()) {
65
+ const target = await readlink(absolutePath);
66
+ const resolvedTarget = resolve(dirname(absolutePath), target);
67
+ const escapesRoot = !insideRoot(root, resolvedTarget);
68
+ const digest = createHash('sha256').update(`symlink:${target}`).digest('hex');
69
+ files.push({ path: relativePath, size: stats.size, digest, mode: stats.mode, symlinkTarget: target });
70
+ addFinding(findings, escapesRoot ? 'symlink-escapes-package' : 'symlink-present', escapesRoot ? 'critical' : 'medium', escapesRoot ? 'Symlink escapes the package root' : 'Package contains a symlink', escapesRoot
71
+ ? 'Following this link would access content outside the reviewed artifact.'
72
+ : 'Symlinks need manual review because their target semantics vary across packaging and installation.', { path: relativePath, target }, 'Remove the symlink or replace it with an in-package regular file.');
73
+ continue;
74
+ }
75
+ if (stats.isDirectory()) {
76
+ await visit(absolutePath);
77
+ continue;
78
+ }
79
+ if (!stats.isFile())
80
+ continue;
81
+ if (bytesHashed + stats.size > maxTotalBytes) {
82
+ incomplete = true;
83
+ addFinding(findings, 'scan-budget-exceeded', 'high', 'Static scan coverage is incomplete', 'The package exceeded the configured file or byte budget, so not every file was hashed.', { filesScanned: files.length, bytesHashed, maxFiles, maxTotalBytes }, 'Increase the scan budget in an isolated worker or reduce the artifact size.');
84
+ return;
85
+ }
86
+ const digest = await hashFile(absolutePath);
87
+ files.push({ path: relativePath, size: stats.size, digest, mode: stats.mode });
88
+ bytesHashed += stats.size;
89
+ }
90
+ }
91
+ await visit(root);
92
+ return { files, bytesHashed, incomplete };
93
+ }
94
+ function artifactDigest(files) {
95
+ const aggregate = createHash('sha256');
96
+ for (const file of [...files].sort((left, right) => left.path < right.path ? -1 : left.path > right.path ? 1 : 0)) {
97
+ aggregate.update(file.path);
98
+ aggregate.update('\0');
99
+ aggregate.update(file.digest);
100
+ aggregate.update('\0');
101
+ aggregate.update(String(file.mode & 0o777));
102
+ aggregate.update('\n');
103
+ }
104
+ return `sha256:${aggregate.digest('hex')}`;
105
+ }
106
+ function collectDependencies(manifest) {
107
+ const groups = [
108
+ ['dependencies', 'dependency'],
109
+ ['devDependencies', 'devDependency'],
110
+ ['optionalDependencies', 'optionalDependency'],
111
+ ['peerDependencies', 'peerDependency'],
112
+ ];
113
+ const dependencies = [];
114
+ for (const [key, scope] of groups) {
115
+ const values = asRecord(manifest[key]);
116
+ if (values === undefined)
117
+ continue;
118
+ for (const [name, rawSpec] of Object.entries(values)) {
119
+ const spec = asString(rawSpec);
120
+ if (spec !== undefined)
121
+ dependencies.push({ name, scope, spec });
122
+ }
123
+ }
124
+ return dependencies.sort((left, right) => `${left.scope}:${left.name}`.localeCompare(`${right.scope}:${right.name}`));
125
+ }
126
+ function collectLifecycleScripts(manifest) {
127
+ const scripts = asRecord(manifest.scripts);
128
+ if (scripts === undefined)
129
+ return [];
130
+ const result = [];
131
+ for (const name of LIFECYCLE_SCRIPTS) {
132
+ const command = asString(scripts[name]);
133
+ if (command !== undefined)
134
+ result.push({ name, command });
135
+ }
136
+ return result;
137
+ }
138
+ function inspectLifecycleScripts(scripts, findings) {
139
+ for (const script of scripts) {
140
+ const pipesRemoteContentToShell = /(?:curl|wget)\b[^\n|;&]*(?:\||&&|;)\s*(?:ba)?sh\b/i.test(script.command);
141
+ const invokesRemoteDownload = /\b(?:curl|wget|Invoke-WebRequest|Start-BitsTransfer)\b|https?:\/\//i.test(script.command);
142
+ if (pipesRemoteContentToShell) {
143
+ addFinding(findings, 'install-script-remote-shell', 'critical', `Lifecycle script ${script.name} pipes remote content to a shell`, 'Remote content can change independently of the reviewed package and executes during installation.', { script: script.name }, 'Publish a prebuilt artifact and remove the remote shell pipeline.');
144
+ }
145
+ else if (invokesRemoteDownload) {
146
+ addFinding(findings, 'install-script-network-access', 'high', `Lifecycle script ${script.name} appears to access the network`, 'Install-time downloads are not covered by the package digest and require isolated review.', { script: script.name }, 'Vendor the artifact with a verified digest or build it in a provenance-producing CI workflow.');
147
+ }
148
+ else {
149
+ addFinding(findings, 'lifecycle-script-present', 'high', `Lifecycle script ${script.name} executes during installation`, 'Lifecycle scripts run before a plugin is admitted into DSH and therefore require review.', { script: script.name, command: script.command }, 'Prefer a prebuilt package with no install-time lifecycle scripts.');
150
+ }
151
+ }
152
+ }
153
+ function inspectDependencySpecs(dependencies, hasLockfile, dependencyGraphResolved, findings) {
154
+ const runtimeDependencies = dependencies.filter(dependency => dependency.scope !== 'devDependency');
155
+ if (!hasLockfile && !dependencyGraphResolved && runtimeDependencies.length > 0) {
156
+ addFinding(findings, 'dependency-graph-unlocked', 'medium', 'Runtime dependency graph is not locked in the reviewed source tree', 'A future resolution of the same manifest may select different transitive artifacts.', { runtimeDependencyCount: runtimeDependencies.length }, 'Commit a supported lockfile and verify every resolved artifact integrity.');
157
+ }
158
+ for (const dependency of dependencies) {
159
+ const isGit = /^(?:git\+|git:|github:|gitlab:|bitbucket:)|\.git(?:#|$)/i.test(dependency.spec);
160
+ const pinnedGitCommit = /#[0-9a-f]{40}(?:$|&)/i.test(dependency.spec) || /#[0-9a-f]{64}(?:$|&)/i.test(dependency.spec);
161
+ if (isGit && !pinnedGitCommit) {
162
+ addFinding(findings, 'mutable-git-dependency', 'high', `Git dependency ${dependency.name} is not pinned to a full commit`, 'Branches, tags and abbreviated revisions can resolve to different source over time.', { dependency: dependency.name, scope: dependency.scope, spec: dependency.spec }, 'Pin the dependency to a full commit and record the produced artifact digest.');
163
+ }
164
+ else if (/^https?:\/\//i.test(dependency.spec)) {
165
+ addFinding(findings, 'remote-tarball-dependency', 'high', `Dependency ${dependency.name} is fetched from a URL`, 'A URL dependency bypasses normal registry provenance and publisher controls.', { dependency: dependency.name, scope: dependency.scope, spec: dependency.spec }, 'Use a signed registry release or independently pin and verify the artifact digest.');
166
+ }
167
+ else if (['*', 'latest', 'next'].includes(dependency.spec.trim())) {
168
+ addFinding(findings, 'floating-dependency-spec', 'medium', `Dependency ${dependency.name} uses a floating version`, 'The same manifest can resolve to a different artifact without a source change.', { dependency: dependency.name, scope: dependency.scope, spec: dependency.spec }, 'Use a bounded version and a verified lockfile.');
169
+ }
170
+ }
171
+ }
172
+ function inspectFiles(root, files, findings) {
173
+ for (const file of files) {
174
+ const lowercase = file.path.toLowerCase();
175
+ if (NATIVE_SUFFIXES.some(suffix => lowercase.endsWith(suffix))) {
176
+ addFinding(findings, 'native-binary-present', 'high', `Native executable artifact found: ${file.path}`, 'Native artifacts cannot be fully explained by JavaScript source review and require provenance or sandbox analysis.', { path: file.path, sha256: file.digest, size: file.size }, 'Provide build provenance and a reproducible build for this artifact.');
177
+ }
178
+ if (lowercase === '.pnpmfile.cjs' || lowercase.endsWith('/.pnpmfile.cjs')) {
179
+ addFinding(findings, 'package-manager-hook-present', 'high', 'Package contains a pnpm resolution hook', 'A pnpm hook can rewrite dependency manifests during resolution.', { path: file.path }, 'Remove the hook or require dedicated human review.');
180
+ }
181
+ }
182
+ void root;
183
+ }
184
+ function inspectBundledDependencies(manifest, findings) {
185
+ const bundled = manifest.bundledDependencies ?? manifest.bundleDependencies;
186
+ if (Array.isArray(bundled) && bundled.length > 0) {
187
+ const names = bundled.filter((entry) => typeof entry === 'string');
188
+ addFinding(findings, 'bundled-dependencies-present', 'medium', 'Package embeds bundled dependencies', 'Bundled dependencies must be inspected from the artifact rather than trusted from registry metadata.', { dependencies: names }, 'Prefer normal locked dependencies or include the bundled components in an SBOM.');
189
+ }
190
+ }
191
+ function inspectNpmrc(root, files, findings) {
192
+ const npmrc = files.find(file => file.path === '.npmrc');
193
+ if (npmrc === undefined || npmrc.size > MAX_MANIFEST_BYTES)
194
+ return Promise.resolve();
195
+ return readFile(resolve(root, npmrc.path), 'utf8').then((contents) => {
196
+ if (/(?:_authToken|_password|username)\s*=/i.test(contents)) {
197
+ addFinding(findings, 'credential-in-npmrc', 'critical', 'Package contains registry credentials in .npmrc', 'Credential material must never be distributed inside a plugin artifact.', { path: '.npmrc' }, 'Revoke the credential, remove it from history and publish a clean artifact.');
198
+ }
199
+ if (/^registry\s*=\s*https?:\/\//im.test(contents)) {
200
+ addFinding(findings, 'custom-registry-config', 'medium', 'Package configures a custom npm registry', 'Dependency provenance depends on a registry selected by package-local configuration.', { path: '.npmrc' }, 'Review the registry endpoint and enforce it through consumer policy instead.');
201
+ }
202
+ });
203
+ }
204
+ function extractDshEvidence(manifest, root, files, scanIncomplete, findings) {
205
+ const dsh = asRecord(manifest.dsh);
206
+ const bundle = asRecord(dsh?.bundle);
207
+ const patch = asString(bundle?.patch);
208
+ if (patch === undefined)
209
+ return { isBundle: false };
210
+ const patchPath = resolve(root, patch);
211
+ if (!insideRoot(root, patchPath)) {
212
+ addFinding(findings, 'dsh-patch-escapes-package', 'critical', 'DSH bundle patch path escapes the package root', 'The manifest points DSH at configuration outside the reviewed artifact.', { patch }, 'Keep the bundle patch inside the published package.');
213
+ }
214
+ else if (!scanIncomplete) {
215
+ const patchRelative = relative(root, patchPath).split(sep).join('/');
216
+ const patchEntry = files.find(file => file.path === patchRelative);
217
+ if (patchEntry === undefined || patchEntry.symlinkTarget !== undefined) {
218
+ addFinding(findings, 'dsh-patch-not-regular-file', 'high', 'DSH bundle patch is missing or not a regular file', 'The published package does not contain the declared patch as a reviewed regular file.', { patch }, 'Publish the declared patch inside the package as a regular file.');
219
+ }
220
+ }
221
+ return { isBundle: true, patch };
222
+ }
223
+ async function readManifest(root) {
224
+ const manifestPath = resolve(root, 'package.json');
225
+ const stats = await lstat(manifestPath);
226
+ if (!stats.isFile())
227
+ throw new Error('package.json is not a regular file');
228
+ if (stats.size > MAX_MANIFEST_BYTES)
229
+ throw new Error('package.json exceeds the 1 MiB safety limit');
230
+ const parsed = JSON.parse(await readFile(manifestPath, 'utf8'));
231
+ const record = asRecord(parsed);
232
+ if (record === undefined)
233
+ throw new Error('package.json must contain a JSON object');
234
+ return record;
235
+ }
236
+ export async function scanDirectory(input, options = {}) {
237
+ const root = resolve(input);
238
+ const rootStats = await lstat(root);
239
+ if (!rootStats.isDirectory())
240
+ throw new Error(`scan target is not a directory: ${input}`);
241
+ const manifest = await readManifest(root);
242
+ const findings = [];
243
+ const walk = await walkPackage(root, options, findings);
244
+ const fileNames = new Set(walk.files.map(file => file.path));
245
+ const lockfiles = LOCKFILES.filter(lockfile => fileNames.has(lockfile));
246
+ const lifecycleScripts = collectLifecycleScripts(manifest);
247
+ const dependencies = collectDependencies(manifest);
248
+ inspectLifecycleScripts(lifecycleScripts, findings);
249
+ inspectDependencySpecs(dependencies, lockfiles.length > 0, options.dependencyGraphResolved ?? false, findings);
250
+ inspectBundledDependencies(manifest, findings);
251
+ inspectFiles(root, walk.files, findings);
252
+ await inspectNpmrc(root, walk.files, findings);
253
+ const dsh = extractDshEvidence(manifest, root, walk.files, walk.incomplete, findings);
254
+ findings.sort((left, right) => {
255
+ const order = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };
256
+ return order[left.severity] - order[right.severity] || (left.code < right.code ? -1 : left.code > right.code ? 1 : 0);
257
+ });
258
+ const riskVerdict = decideVerdict(findings);
259
+ const coverageVerdict = 'incomplete';
260
+ return {
261
+ schema: REPORT_SCHEMA,
262
+ tool: { name: 'upstream-radar', version: TOOL_VERSION },
263
+ target: {
264
+ kind: 'directory',
265
+ name: asString(manifest.name) ?? '(unnamed)',
266
+ version: asString(manifest.version) ?? null,
267
+ artifactDigest: artifactDigest(walk.files),
268
+ },
269
+ dsh,
270
+ evidence: {
271
+ filesScanned: walk.files.length,
272
+ bytesHashed: walk.bytesHashed,
273
+ lockfiles,
274
+ packageManager: asString(manifest.packageManager) ?? null,
275
+ lifecycleScripts,
276
+ dependencies,
277
+ },
278
+ coverage: {
279
+ staticSource: walk.incomplete ? 'incomplete' : 'complete',
280
+ artifactIntegrity: 'locally-hashed',
281
+ registrySignature: 'not-checked',
282
+ dependencyResolution: options.dependencyGraphResolved === true ? 'resolved' : 'manifest-only',
283
+ provenance: 'not-checked',
284
+ sourceArtifactMatch: 'not-checked',
285
+ sandboxDetonation: 'not-run',
286
+ },
287
+ findings,
288
+ riskVerdict,
289
+ coverageVerdict,
290
+ verdict: stricterVerdict(riskVerdict, 'review'),
291
+ };
292
+ }
293
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ interface Semver {
2
+ major: number;
3
+ minor: number;
4
+ patch: number;
5
+ prerelease: Array<string | number>;
6
+ }
7
+ export declare function parseSemver(value: string, allowPartial?: boolean): Semver | undefined;
8
+ export declare function compareSemver(left: Semver, right: Semver): number;
9
+ /** Evaluate common npm ranges. Undefined means the range syntax was intentionally not guessed. */
10
+ export declare function satisfiesSemverRange(versionValue: string, rangeValue: string): boolean | undefined;
11
+ export declare function crossesBreakingVersionBoundary(previousValue: string, candidateValue: string): boolean;
12
+ export {};
13
+ //# sourceMappingURL=semver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/semver.ts"],"names":[],"mappings":"AAAA,UAAU,MAAM;IACd,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;CACnC;AAMD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,MAAM,GAAG,SAAS,CAUnF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBjE;AA4DD,kGAAkG;AAClG,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAYlG;AAED,wBAAgB,8BAA8B,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAMrG"}
@@ -0,0 +1,136 @@
1
+ function parsePart(value) {
2
+ return /^\d+$/.test(value) ? Number(value) : value;
3
+ }
4
+ export function parseSemver(value, allowPartial = false) {
5
+ const match = /^(?:v)?(0|[1-9]\d*)(?:\.(0|[1-9]\d*))?(?:\.(0|[1-9]\d*))?(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/.exec(value.trim());
6
+ if (match === null)
7
+ return undefined;
8
+ if (!allowPartial && (match[2] === undefined || match[3] === undefined))
9
+ return undefined;
10
+ return {
11
+ major: Number(match[1]),
12
+ minor: Number(match[2] ?? 0),
13
+ patch: Number(match[3] ?? 0),
14
+ prerelease: match[4] === undefined ? [] : match[4].split('.').map(parsePart),
15
+ };
16
+ }
17
+ export function compareSemver(left, right) {
18
+ const numeric = left.major - right.major || left.minor - right.minor || left.patch - right.patch;
19
+ if (numeric !== 0)
20
+ return Math.sign(numeric);
21
+ if (left.prerelease.length === 0 || right.prerelease.length === 0) {
22
+ return left.prerelease.length === right.prerelease.length ? 0 : left.prerelease.length === 0 ? 1 : -1;
23
+ }
24
+ const length = Math.max(left.prerelease.length, right.prerelease.length);
25
+ for (let index = 0; index < length; index += 1) {
26
+ const leftPart = left.prerelease[index];
27
+ const rightPart = right.prerelease[index];
28
+ if (leftPart === undefined || rightPart === undefined)
29
+ return leftPart === rightPart ? 0 : leftPart === undefined ? -1 : 1;
30
+ if (leftPart === rightPart)
31
+ continue;
32
+ if (typeof leftPart === 'number' && typeof rightPart === 'number')
33
+ return leftPart < rightPart ? -1 : 1;
34
+ if (typeof leftPart === 'number')
35
+ return -1;
36
+ if (typeof rightPart === 'number')
37
+ return 1;
38
+ return leftPart < rightPart ? -1 : 1;
39
+ }
40
+ return 0;
41
+ }
42
+ function comparatorMatches(version, token) {
43
+ const match = /^(>=|<=|>|<|=)?\s*(.+)$/.exec(token);
44
+ if (match === null)
45
+ return undefined;
46
+ const operator = match[1] ?? '=';
47
+ const target = parseSemver(match[2] ?? '', true);
48
+ if (target === undefined)
49
+ return undefined;
50
+ const comparison = compareSemver(version, target);
51
+ switch (operator) {
52
+ case '>=': return comparison >= 0;
53
+ case '<=': return comparison <= 0;
54
+ case '>': return comparison > 0;
55
+ case '<': return comparison < 0;
56
+ case '=': return comparison === 0;
57
+ default: return undefined;
58
+ }
59
+ }
60
+ function caretMatches(version, value) {
61
+ const lower = parseSemver(value, true);
62
+ if (lower === undefined)
63
+ return undefined;
64
+ const upper = lower.major > 0
65
+ ? { major: lower.major + 1, minor: 0, patch: 0, prerelease: [] }
66
+ : lower.minor > 0
67
+ ? { major: 0, minor: lower.minor + 1, patch: 0, prerelease: [] }
68
+ : { major: 0, minor: 0, patch: lower.patch + 1, prerelease: [] };
69
+ return compareSemver(version, lower) >= 0 && compareSemver(version, upper) < 0;
70
+ }
71
+ function tildeMatches(version, value) {
72
+ const lower = parseSemver(value, true);
73
+ if (lower === undefined)
74
+ return undefined;
75
+ const upper = { major: lower.major, minor: lower.minor + 1, patch: 0, prerelease: [] };
76
+ return compareSemver(version, lower) >= 0 && compareSemver(version, upper) < 0;
77
+ }
78
+ function branchMatches(version, rawBranch) {
79
+ const branch = rawBranch.trim();
80
+ if (branch === '' || branch === '*' || /^latest$/i.test(branch))
81
+ return true;
82
+ if (/\s-\s/.test(branch))
83
+ return undefined;
84
+ const wildcard = /^(?:v)?(\d+|[xX*])(?:\.(\d+|[xX*]))?(?:\.(\d+|[xX*]))?$/.exec(branch);
85
+ if (wildcard !== null && [wildcard[1], wildcard[2], wildcard[3]].some(value => value === undefined || /^[xX*]$/.test(value))) {
86
+ if (wildcard[1] !== undefined && !/^[xX*]$/.test(wildcard[1]) && version.major !== Number(wildcard[1]))
87
+ return false;
88
+ if (wildcard[2] !== undefined && !/^[xX*]$/.test(wildcard[2]) && version.minor !== Number(wildcard[2]))
89
+ return false;
90
+ if (wildcard[3] !== undefined && !/^[xX*]$/.test(wildcard[3]) && version.patch !== Number(wildcard[3]))
91
+ return false;
92
+ return true;
93
+ }
94
+ if (branch.startsWith('^'))
95
+ return caretMatches(version, branch.slice(1));
96
+ if (branch.startsWith('~'))
97
+ return tildeMatches(version, branch.slice(1));
98
+ const tokens = branch.split(/\s+/);
99
+ let unknown = false;
100
+ for (const token of tokens) {
101
+ const result = comparatorMatches(version, token);
102
+ if (result === false)
103
+ return false;
104
+ if (result === undefined)
105
+ unknown = true;
106
+ }
107
+ return unknown ? undefined : true;
108
+ }
109
+ /** Evaluate common npm ranges. Undefined means the range syntax was intentionally not guessed. */
110
+ export function satisfiesSemverRange(versionValue, rangeValue) {
111
+ const version = parseSemver(versionValue);
112
+ if (version === undefined)
113
+ return undefined;
114
+ const normalized = rangeValue.trim().replace(/^workspace:/, '');
115
+ if (normalized === '^' || normalized === '~' || normalized === '*')
116
+ return undefined;
117
+ let sawUnknown = false;
118
+ for (const branch of normalized.split('||')) {
119
+ const result = branchMatches(version, branch);
120
+ if (result === true)
121
+ return true;
122
+ if (result === undefined)
123
+ sawUnknown = true;
124
+ }
125
+ return sawUnknown ? undefined : false;
126
+ }
127
+ export function crossesBreakingVersionBoundary(previousValue, candidateValue) {
128
+ const previous = parseSemver(previousValue);
129
+ const candidate = parseSemver(candidateValue);
130
+ if (previous === undefined || candidate === undefined || compareSemver(candidate, previous) <= 0)
131
+ return false;
132
+ if (previous.major !== candidate.major)
133
+ return true;
134
+ return previous.major === 0 && previous.minor !== candidate.minor;
135
+ }
136
+ //# sourceMappingURL=semver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.js","sourceRoot":"","sources":["../../src/semver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Finding } from './types.js';
2
+ export interface TarOptions {
3
+ maxEntries?: number;
4
+ maxUnpackedBytes?: number;
5
+ maxFileBytes?: number;
6
+ maxCompressionRatio?: number;
7
+ }
8
+ export interface TarEntry {
9
+ path: string;
10
+ type: 'file' | 'directory' | 'symlink' | 'hardlink';
11
+ mode: number;
12
+ size: number;
13
+ digest: string;
14
+ contents?: Buffer;
15
+ linkTarget?: string;
16
+ }
17
+ export interface ParsedNpmTarball {
18
+ entries: TarEntry[];
19
+ findings: Finding[];
20
+ compressedBytes: number;
21
+ unpackedBytes: number;
22
+ treeDigest: string;
23
+ }
24
+ export declare function parseNpmTarball(compressed: Buffer, options?: TarOptions): ParsedNpmTarball;
25
+ //# sourceMappingURL=tar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tar.d.ts","sourceRoot":"","sources":["../../src/tar.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAazC,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAA;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,QAAQ,EAAE,CAAA;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;CACnB;AAiJD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,gBAAgB,CA2M9F"}