@santi020k/dep-beacon-core 1.0.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 (60) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +9 -0
  4. package/dist/analyzer.d.ts +12 -0
  5. package/dist/analyzer.d.ts.map +1 -0
  6. package/dist/analyzer.js +154 -0
  7. package/dist/analyzer.js.map +1 -0
  8. package/dist/catalogs.d.ts +5 -0
  9. package/dist/catalogs.d.ts.map +1 -0
  10. package/dist/catalogs.js +33 -0
  11. package/dist/catalogs.js.map +1 -0
  12. package/dist/fetch.d.ts +3 -0
  13. package/dist/fetch.d.ts.map +1 -0
  14. package/dist/fetch.js +25 -0
  15. package/dist/fetch.js.map +1 -0
  16. package/dist/index.d.ts +11 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +10 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/manifest.d.ts +5 -0
  21. package/dist/manifest.d.ts.map +1 -0
  22. package/dist/manifest.js +28 -0
  23. package/dist/manifest.js.map +1 -0
  24. package/dist/osv.d.ts +12 -0
  25. package/dist/osv.d.ts.map +1 -0
  26. package/dist/osv.js +165 -0
  27. package/dist/osv.js.map +1 -0
  28. package/dist/package-json.d.ts +3 -0
  29. package/dist/package-json.d.ts.map +1 -0
  30. package/dist/package-json.js +166 -0
  31. package/dist/package-json.js.map +1 -0
  32. package/dist/package-name.d.ts +8 -0
  33. package/dist/package-name.d.ts.map +1 -0
  34. package/dist/package-name.js +35 -0
  35. package/dist/package-name.js.map +1 -0
  36. package/dist/pnpm-workspace.d.ts +3 -0
  37. package/dist/pnpm-workspace.d.ts.map +1 -0
  38. package/dist/pnpm-workspace.js +169 -0
  39. package/dist/pnpm-workspace.js.map +1 -0
  40. package/dist/registry.d.ts +16 -0
  41. package/dist/registry.d.ts.map +1 -0
  42. package/dist/registry.js +122 -0
  43. package/dist/registry.js.map +1 -0
  44. package/dist/sort.d.ts +3 -0
  45. package/dist/sort.d.ts.map +1 -0
  46. package/dist/sort.js +44 -0
  47. package/dist/sort.js.map +1 -0
  48. package/dist/text.d.ts +6 -0
  49. package/dist/text.d.ts.map +1 -0
  50. package/dist/text.js +40 -0
  51. package/dist/text.js.map +1 -0
  52. package/dist/types.d.ts +97 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +2 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/versions.d.ts +26 -0
  57. package/dist/versions.d.ts.map +1 -0
  58. package/dist/versions.js +117 -0
  59. package/dist/versions.js.map +1 -0
  60. package/package.json +69 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @santi020k/dep-beacon-core
2
+
3
+ ## 1.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - [`3de4494`](https://github.com/santi020k/dep-beacon/commit/3de4494e78654920f0dfe7d95b4f25c0eb53821b) Thanks [@santi020k](https://github.com/santi020k)! - Initial Dep Beacon release with npm manifest CodeLens, pnpm workspace catalog support, OSV security checks, docs, and VS Code packaging.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Santiago Molina
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # @santi020k/dep-beacon-core
2
+
3
+ Core analysis engine for Dep Beacon.
4
+
5
+ ```ts
6
+ import { analyzeDependency, parseManifest } from '@santi020k/dep-beacon-core'
7
+ ```
8
+
9
+ The package parses npm ecosystem manifests, resolves pnpm workspace catalog entries, calculates next minor, next major, and latest update targets, and can enrich results with OSV.dev vulnerability data.
@@ -0,0 +1,12 @@
1
+ import { OsvClient } from './osv.js';
2
+ import { NpmRegistryClient } from './registry.js';
3
+ import type { AnalyzeDependencyOptions, AnalyzeManyOptions, DependencyAnalysis, DependencyEntry, VulnerabilitySummary } from './types.js';
4
+ export declare const analyzeDependency: (dependency: DependencyEntry, options?: AnalyzeDependencyOptions & {
5
+ registryClient?: NpmRegistryClient;
6
+ vulnerability?: VulnerabilitySummary;
7
+ }) => Promise<DependencyAnalysis>;
8
+ export declare const analyzeDependencies: (dependencies: readonly DependencyEntry[], options?: AnalyzeManyOptions & {
9
+ osvClient?: OsvClient;
10
+ registryClient?: NpmRegistryClient;
11
+ }) => Promise<DependencyAnalysis[]>;
12
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,EAAuB,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,KAAK,EACV,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EAMf,oBAAoB,EACrB,MAAM,YAAY,CAAA;AAwJnB,eAAO,MAAM,iBAAiB,GAC5B,YAAY,eAAe,EAC3B,UAAS,wBAAwB,GAAG;IAClC,cAAc,CAAC,EAAE,iBAAiB,CAAA;IAClC,aAAa,CAAC,EAAE,oBAAoB,CAAA;CAChC,KACL,OAAO,CAAC,kBAAkB,CAyC5B,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,cAAc,SAAS,eAAe,EAAE,EACxC,UAAS,kBAAkB,GAAG;IAC5B,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,cAAc,CAAC,EAAE,iBAAiB,CAAA;CAC9B,KACL,OAAO,CAAC,kBAAkB,EAAE,CAqC9B,CAAA"}
@@ -0,0 +1,154 @@
1
+ import { getOsvQueryKey, OsvClient } from './osv.js';
2
+ import { createNpmPackageUrl, NpmRegistryClient } from './registry.js';
3
+ import { computeUpdateTargets, getDependencyStatus, getInvalidSpecMessage, normalizeDependencySpec, specLooksPublished, specSatisfiesLatest, } from './versions.js';
4
+ const createProtocolAnalysis = (dependency, displaySpec, message) => ({
5
+ dependency,
6
+ displaySpec,
7
+ exists: true,
8
+ isLatestSatisfied: false,
9
+ message,
10
+ packageUrl: createNpmPackageUrl(dependency.packageName),
11
+ status: 'protocol',
12
+ targets: {},
13
+ });
14
+ const unsupportedProtocolMessage = (dependency) => dependency.spec.startsWith('catalog:')
15
+ ? 'This dependency uses a catalog reference that could not be resolved from pnpm-workspace.yaml.'
16
+ : 'This dependency uses a local, workspace, git, or URL protocol, so Dep Beacon does not query npm for it.';
17
+ const createEmptyRangeAnalysis = (dependency, displaySpec, packageName) => ({
18
+ dependency,
19
+ displaySpec,
20
+ exists: false,
21
+ isLatestSatisfied: false,
22
+ message: 'This dependency has an empty version range.',
23
+ packageUrl: createNpmPackageUrl(packageName),
24
+ status: 'invalid',
25
+ targets: {},
26
+ });
27
+ const lookupFailureStatus = (error) => error.code === 'not-found' ? 'missing' : 'invalid';
28
+ const createLookupFailureAnalysis = (dependency, displaySpec, packageName, error) => ({
29
+ dependency,
30
+ displaySpec,
31
+ exists: false,
32
+ isLatestSatisfied: false,
33
+ message: error.message,
34
+ packageUrl: createNpmPackageUrl(packageName),
35
+ status: lookupFailureStatus(error),
36
+ targets: {},
37
+ });
38
+ const createInvalidTargetAnalysis = (dependency, displaySpec, packageName, range, metadata, targets) => ({
39
+ dependency,
40
+ displaySpec,
41
+ exists: false,
42
+ isLatestSatisfied: false,
43
+ message: getInvalidSpecMessage(range),
44
+ packageUrl: createNpmPackageUrl(packageName),
45
+ registry: metadata,
46
+ status: 'invalid',
47
+ targets,
48
+ });
49
+ const withVulnerability = (analysis, vulnerability) => {
50
+ if (!vulnerability)
51
+ return analysis;
52
+ const status = getDependencyStatus({
53
+ exists: analysis.exists,
54
+ isLatestSatisfied: analysis.isLatestSatisfied,
55
+ statusBeforeVulnerability: analysis.status,
56
+ vulnerability,
57
+ });
58
+ const label = vulnerability.severity === 'unknown' ? 'known' : vulnerability.severity;
59
+ return {
60
+ ...analysis,
61
+ message: `${analysis.message} OSV reports ${label} vulnerability data for this version.`,
62
+ status,
63
+ vulnerability,
64
+ };
65
+ };
66
+ const createVersionMessage = (exists, isLatestSatisfied, latestMessage) => {
67
+ if (!exists)
68
+ return `The declared version floor is not published. ${latestMessage}`;
69
+ if (isLatestSatisfied)
70
+ return `Current range accepts the latest published version. ${latestMessage}`;
71
+ return `A newer version is available. ${latestMessage}`;
72
+ };
73
+ const createVersionAnalysis = (args) => {
74
+ const exists = specLooksPublished(args.range, args.metadata);
75
+ const isLatestSatisfied = specSatisfiesLatest(args.range, args.targets.latest, args.includePrerelease);
76
+ const status = getDependencyStatus({
77
+ exists,
78
+ isLatestSatisfied,
79
+ statusBeforeVulnerability: exists ? 'outdated' : 'missing',
80
+ vulnerability: args.vulnerability,
81
+ });
82
+ const latestMessage = args.targets.latest ? `Latest is ${args.targets.latest}.` : 'No latest npm version was found.';
83
+ const message = createVersionMessage(exists, isLatestSatisfied, latestMessage);
84
+ return withVulnerability({
85
+ dependency: args.dependency,
86
+ displaySpec: args.displaySpec,
87
+ exists,
88
+ isLatestSatisfied,
89
+ message,
90
+ packageUrl: createNpmPackageUrl(args.packageName),
91
+ registry: args.metadata,
92
+ status,
93
+ targets: args.targets,
94
+ }, args.vulnerability);
95
+ };
96
+ export const analyzeDependency = async (dependency, options = {}) => {
97
+ const normalized = normalizeDependencySpec(dependency, options.catalogSnapshot);
98
+ const includePrerelease = options.includePrerelease ?? false;
99
+ if (normalized.protocol === 'unsupported') {
100
+ return createProtocolAnalysis(dependency, normalized.displaySpec, unsupportedProtocolMessage(dependency));
101
+ }
102
+ const range = normalized.spec.trim();
103
+ if (range.length === 0) {
104
+ return createEmptyRangeAnalysis(dependency, normalized.displaySpec, normalized.packageName);
105
+ }
106
+ const registryClient = options.registryClient ?? new NpmRegistryClient({ registryUrl: options.registryUrl });
107
+ const lookup = await registryClient.getPackage(normalized.packageName);
108
+ if (!lookup.ok) {
109
+ return createLookupFailureAnalysis(dependency, normalized.displaySpec, normalized.packageName, lookup.error);
110
+ }
111
+ const targets = computeUpdateTargets(range, lookup.metadata, includePrerelease);
112
+ if (!targets.current) {
113
+ return createInvalidTargetAnalysis(dependency, normalized.displaySpec, normalized.packageName, range, lookup.metadata, targets);
114
+ }
115
+ return createVersionAnalysis({
116
+ dependency,
117
+ displaySpec: normalized.displaySpec,
118
+ includePrerelease,
119
+ metadata: lookup.metadata,
120
+ packageName: normalized.packageName,
121
+ range,
122
+ targets,
123
+ vulnerability: options.vulnerability,
124
+ });
125
+ };
126
+ export const analyzeDependencies = async (dependencies, options = {}) => {
127
+ const registryClient = options.registryClient ?? new NpmRegistryClient({ registryUrl: options.registryUrl });
128
+ const baseAnalyses = await Promise.all(dependencies.map((dependency) => analyzeDependency(dependency, {
129
+ ...options,
130
+ registryClient,
131
+ vulnerability: undefined,
132
+ })));
133
+ if (!options.vulnerabilities)
134
+ return baseAnalyses;
135
+ const osvClient = options.osvClient ?? new OsvClient();
136
+ const queries = baseAnalyses.flatMap((analysis) => {
137
+ const version = analysis.targets.current;
138
+ if (!version || analysis.status === 'protocol' || analysis.status === 'invalid')
139
+ return [];
140
+ return [{
141
+ name: analysis.registry?.name ?? analysis.dependency.packageName,
142
+ version,
143
+ }];
144
+ });
145
+ const vulnerabilities = await osvClient.queryMany(queries);
146
+ return baseAnalyses.map((analysis) => {
147
+ const version = analysis.targets.current;
148
+ if (!version)
149
+ return analysis;
150
+ const packageName = analysis.registry?.name ?? analysis.dependency.packageName;
151
+ return withVulnerability(analysis, vulnerabilities.get(getOsvQueryKey({ name: packageName, version })));
152
+ });
153
+ };
154
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { CatalogSnapshot } from './types.js';
2
+ export declare const createEmptyCatalogSnapshot: () => CatalogSnapshot;
3
+ export declare const mergeCatalogSnapshots: (...snapshots: readonly CatalogSnapshot[]) => CatalogSnapshot;
4
+ export declare const resolveCatalogSpec: (snapshot: CatalogSnapshot | undefined, packageName: string, spec: string) => string | undefined;
5
+ //# sourceMappingURL=catalogs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogs.d.ts","sourceRoot":"","sources":["../src/catalogs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,eAAO,MAAM,0BAA0B,QAAO,eAG5C,CAAA;AAEF,eAAO,MAAM,qBAAqB,GAAI,GAAG,WAAW,SAAS,eAAe,EAAE,KAAG,eAoBhF,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,UAAU,eAAe,GAAG,SAAS,EACrC,aAAa,MAAM,EACnB,MAAM,MAAM,KACX,MAAM,GAAG,SAaX,CAAA"}
@@ -0,0 +1,33 @@
1
+ export const createEmptyCatalogSnapshot = () => ({
2
+ default: new Map(),
3
+ named: new Map(),
4
+ });
5
+ export const mergeCatalogSnapshots = (...snapshots) => {
6
+ const merged = createEmptyCatalogSnapshot();
7
+ for (const snapshot of snapshots) {
8
+ for (const [packageName, spec] of snapshot.default) {
9
+ merged.default.set(packageName, spec);
10
+ }
11
+ for (const [catalogName, entries] of snapshot.named) {
12
+ const target = merged.named.get(catalogName) ?? new Map();
13
+ for (const [packageName, spec] of entries) {
14
+ target.set(packageName, spec);
15
+ }
16
+ merged.named.set(catalogName, target);
17
+ }
18
+ }
19
+ return merged;
20
+ };
21
+ export const resolveCatalogSpec = (snapshot, packageName, spec) => {
22
+ if (!snapshot)
23
+ return undefined;
24
+ if (spec === 'catalog:') {
25
+ return snapshot.default.get(packageName);
26
+ }
27
+ const catalogMatch = /^catalog:(?<catalogName>[a-z0-9_-]+)$/iu.exec(spec);
28
+ const catalogName = catalogMatch?.groups?.catalogName;
29
+ if (!catalogName)
30
+ return undefined;
31
+ return snapshot.named.get(catalogName)?.get(packageName);
32
+ };
33
+ //# sourceMappingURL=catalogs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalogs.js","sourceRoot":"","sources":["../src/catalogs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAoB,EAAE,CAAC,CAAC;IAChE,OAAO,EAAE,IAAI,GAAG,EAAE;IAClB,KAAK,EAAE,IAAI,GAAG,EAAE;CACjB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAG,SAAqC,EAAmB,EAAE;IACjG,MAAM,MAAM,GAAG,0BAA0B,EAAE,CAAA;IAE3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;QACvC,CAAC;QAED,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAA;YAEzE,KAAK,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;gBAC1C,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;YAC/B,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,QAAqC,EACrC,WAAmB,EACnB,IAAY,EACQ,EAAE;IACtB,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAA;IAE/B,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAC1C,CAAC;IAED,MAAM,YAAY,GAAG,yCAAyC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzE,MAAM,WAAW,GAAG,YAAY,EAAE,MAAM,EAAE,WAAW,CAAA;IAErD,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAA;IAElC,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;AAC1D,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { FetchLike } from './types.js';
2
+ export declare const fetchWithTimeout: (fetcher: FetchLike, input: string, init?: RequestInit, timeoutMs?: number) => Promise<Response>;
3
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAI3C,eAAO,MAAM,gBAAgB,GAC3B,SAAS,SAAS,EAClB,OAAO,MAAM,EACb,OAAM,WAAgB,EACtB,kBAAsC,KACrC,OAAO,CAAC,QAAQ,CAuBlB,CAAA"}
package/dist/fetch.js ADDED
@@ -0,0 +1,25 @@
1
+ const DEFAULT_REQUEST_TIMEOUT_MS = 10_000;
2
+ export const fetchWithTimeout = async (fetcher, input, init = {}, timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) => {
3
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0)
4
+ return fetcher(input, init);
5
+ const controller = new AbortController();
6
+ const timer = setTimeout(() => {
7
+ controller.abort();
8
+ }, timeoutMs);
9
+ try {
10
+ return await fetcher(input, {
11
+ ...init,
12
+ signal: controller.signal,
13
+ });
14
+ }
15
+ catch (error) {
16
+ if (controller.signal.aborted) {
17
+ throw new Error(`Request timed out after ${timeoutMs}ms.`, { cause: error });
18
+ }
19
+ throw error;
20
+ }
21
+ finally {
22
+ clearTimeout(timer);
23
+ }
24
+ };
25
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAEA,MAAM,0BAA0B,GAAG,MAAM,CAAA;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,OAAkB,EAClB,KAAa,EACb,OAAoB,EAAE,EACtB,SAAS,GAAG,0BAA0B,EACnB,EAAE;IACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAE9E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IAExC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,UAAU,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC,EAAE,SAAS,CAAC,CAAA;IAEb,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,KAAK,EAAE;YAC1B,GAAG,IAAI;YACP,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9E,CAAC;QAED,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ export { analyzeDependencies, analyzeDependency } from './analyzer.js';
2
+ export { createEmptyCatalogSnapshot, mergeCatalogSnapshots, resolveCatalogSpec } from './catalogs.js';
3
+ export { collectCatalogSnapshot, isSupportedManifestPath, parseManifest } from './manifest.js';
4
+ export { OsvClient } from './osv.js';
5
+ export { parsePackageJsonManifest } from './package-json.js';
6
+ export { parsePnpmWorkspaceManifest } from './pnpm-workspace.js';
7
+ export { createNpmPackageUrl, NpmRegistryClient } from './registry.js';
8
+ export { replaceDependencySpec, sortPackageJsonDependencies } from './sort.js';
9
+ export type { AnalyzeDependencyOptions, AnalyzeManyOptions, CatalogSnapshot, DependencyAnalysis, DependencyEntry, DependencyManager, DependencySection, DependencySourceKind, DependencyStatus, DependencyUpdateTargets, FetchLike, ManifestParseError, ManifestParseResult, NpmPackageMetadata, OsvQuery, RegistryLookupError, RegistryLookupResult, Severity, TextPosition, TextRange, VulnerabilitySummary, } from './types.js';
10
+ export { createTargetSpec, getLatestVersion, getVersionPrefix, isHighRiskSeverity, normalizeDependencySpec, specLooksPublished, specSatisfiesLatest, versionCandidates, } from './versions.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACrG,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAA;AAC9E,YAAY,EACV,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,uBAAuB,EACvB,SAAS,EACT,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,QAAQ,EACR,mBAAmB,EACnB,oBAAoB,EACpB,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,oBAAoB,GACrB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,eAAe,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { analyzeDependencies, analyzeDependency } from './analyzer.js';
2
+ export { createEmptyCatalogSnapshot, mergeCatalogSnapshots, resolveCatalogSpec } from './catalogs.js';
3
+ export { collectCatalogSnapshot, isSupportedManifestPath, parseManifest } from './manifest.js';
4
+ export { OsvClient } from './osv.js';
5
+ export { parsePackageJsonManifest } from './package-json.js';
6
+ export { parsePnpmWorkspaceManifest } from './pnpm-workspace.js';
7
+ export { createNpmPackageUrl, NpmRegistryClient } from './registry.js';
8
+ export { replaceDependencySpec, sortPackageJsonDependencies } from './sort.js';
9
+ export { createTargetSpec, getLatestVersion, getVersionPrefix, isHighRiskSeverity, normalizeDependencySpec, specLooksPublished, specSatisfiesLatest, versionCandidates, } from './versions.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACrG,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAA;AAwB9E,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,eAAe,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { CatalogSnapshot, ManifestParseResult } from './types.js';
2
+ export declare const isSupportedManifestPath: (filePath: string) => boolean;
3
+ export declare const parseManifest: (filePath: string, text: string) => ManifestParseResult;
4
+ export declare const collectCatalogSnapshot: (manifests: readonly ManifestParseResult[]) => CatalogSnapshot;
5
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEtE,eAAO,MAAM,uBAAuB,GAAI,UAAU,MAAM,KAAG,OAI1D,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,EAAE,MAAM,MAAM,KAAG,mBAkB9D,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,WAAW,SAAS,mBAAmB,EAAE,KAAG,eACT,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { basename } from 'node:path';
2
+ import { mergeCatalogSnapshots } from './catalogs.js';
3
+ import { parsePackageJsonManifest } from './package-json.js';
4
+ import { parsePnpmWorkspaceManifest } from './pnpm-workspace.js';
5
+ export const isSupportedManifestPath = (filePath) => {
6
+ const name = basename(filePath);
7
+ return name === 'package.json' || name === 'pnpm-workspace.yaml' || name === 'pnpm-workspace.yml';
8
+ };
9
+ export const parseManifest = (filePath, text) => {
10
+ const name = basename(filePath);
11
+ if (name === 'package.json')
12
+ return parsePackageJsonManifest(text);
13
+ if (name === 'pnpm-workspace.yaml' || name === 'pnpm-workspace.yml')
14
+ return parsePnpmWorkspaceManifest(text);
15
+ return {
16
+ catalogs: {
17
+ default: new Map(),
18
+ named: new Map(),
19
+ },
20
+ dependencies: [],
21
+ errors: [{
22
+ message: `${name} is not a supported Dep Beacon manifest.`,
23
+ }],
24
+ source: 'package-json',
25
+ };
26
+ };
27
+ export const collectCatalogSnapshot = (manifests) => mergeCatalogSnapshots(...manifests.map((manifest) => manifest.catalogs));
28
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAGhE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,QAAgB,EAAW,EAAE;IACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAE/B,OAAO,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,qBAAqB,IAAI,IAAI,KAAK,oBAAoB,CAAA;AACnG,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAE,IAAY,EAAuB,EAAE;IACnF,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAE/B,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAA;IAElE,IAAI,IAAI,KAAK,qBAAqB,IAAI,IAAI,KAAK,oBAAoB;QAAE,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAA;IAE5G,OAAO;QACL,QAAQ,EAAE;YACR,OAAO,EAAE,IAAI,GAAG,EAAE;YAClB,KAAK,EAAE,IAAI,GAAG,EAAE;SACjB;QACD,YAAY,EAAE,EAAE;QAChB,MAAM,EAAE,CAAC;gBACP,OAAO,EAAE,GAAG,IAAI,0CAA0C;aAC3D,CAAC;QACF,MAAM,EAAE,cAAc;KACvB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAyC,EAAmB,EAAE,CACnG,qBAAqB,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA"}
package/dist/osv.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import type { FetchLike, OsvQuery, VulnerabilitySummary } from './types.js';
2
+ export declare class OsvClient {
3
+ #private;
4
+ constructor(options?: {
5
+ baseUrl?: string;
6
+ fetch?: FetchLike;
7
+ requestTimeoutMs?: number;
8
+ });
9
+ queryMany(queries: readonly OsvQuery[]): Promise<Map<string, VulnerabilitySummary>>;
10
+ }
11
+ export declare const getOsvQueryKey: (query: OsvQuery) => string;
12
+ //# sourceMappingURL=osv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osv.d.ts","sourceRoot":"","sources":["../src/osv.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAY,oBAAoB,EAAE,MAAM,YAAY,CAAA;AA0IrF,qBAAa,SAAS;;gBAMR,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAO;IAQtF,SAAS,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CA6E1F;AAED,eAAO,MAAM,cAAc,UAnHF,QAAQ,KAAG,MAmHE,CAAA"}
package/dist/osv.js ADDED
@@ -0,0 +1,165 @@
1
+ import { fetchWithTimeout } from './fetch.js';
2
+ const SEVERITY_RANK = {
3
+ critical: 4,
4
+ high: 3,
5
+ medium: 2,
6
+ low: 1,
7
+ none: 0,
8
+ unknown: 0,
9
+ };
10
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
11
+ const severityFromString = (value) => {
12
+ if (typeof value !== 'string')
13
+ return 'unknown';
14
+ const normalized = value.toLowerCase();
15
+ if (normalized === 'critical')
16
+ return 'critical';
17
+ if (normalized === 'high')
18
+ return 'high';
19
+ if (normalized === 'moderate' || normalized === 'medium')
20
+ return 'medium';
21
+ if (normalized === 'low')
22
+ return 'low';
23
+ return 'unknown';
24
+ };
25
+ const severityFromCvss = (score) => {
26
+ const vectorScore = /\/[ACIP]:([0-9.]+)/u.exec(score)?.[1];
27
+ const parsed = Number.parseFloat(vectorScore ?? score);
28
+ if (!Number.isFinite(parsed))
29
+ return 'unknown';
30
+ if (parsed >= 9)
31
+ return 'critical';
32
+ if (parsed >= 7)
33
+ return 'high';
34
+ if (parsed >= 4)
35
+ return 'medium';
36
+ if (parsed > 0)
37
+ return 'low';
38
+ return 'none';
39
+ };
40
+ const maxSeverity = (severities) => severities.reduce((highest, severity) => (SEVERITY_RANK[severity] > SEVERITY_RANK[highest] ? severity : highest), 'unknown');
41
+ const vulnerabilitySeverity = (vulnerability) => {
42
+ const severities = [];
43
+ for (const severity of vulnerability.severity ?? []) {
44
+ if (typeof severity.score === 'string') {
45
+ severities.push(severityFromCvss(severity.score));
46
+ }
47
+ }
48
+ severities.push(severityFromString(vulnerability.database_specific?.severity));
49
+ for (const affected of vulnerability.affected ?? []) {
50
+ severities.push(severityFromString(affected.database_specific?.severity));
51
+ severities.push(severityFromString(affected.ecosystem_specific?.severity));
52
+ }
53
+ return maxSeverity(severities);
54
+ };
55
+ const toVulnerability = (value) => {
56
+ if (!isRecord(value))
57
+ return undefined;
58
+ return value;
59
+ };
60
+ const toBatchResponse = (value) => {
61
+ if (!isRecord(value) || !Array.isArray(value.results))
62
+ return { results: [] };
63
+ return {
64
+ results: value.results.map((result) => {
65
+ if (!isRecord(result) || !Array.isArray(result.vulns))
66
+ return { vulns: [] };
67
+ return {
68
+ vulns: result.vulns.flatMap((vulnerability) => {
69
+ if (!isRecord(vulnerability) || typeof vulnerability.id !== 'string')
70
+ return [];
71
+ return [{ id: vulnerability.id }];
72
+ }),
73
+ };
74
+ }),
75
+ };
76
+ };
77
+ const queryKey = (query) => `${query.name}@${query.version}`;
78
+ const vulnerabilityIds = (result) => (result?.vulns ?? []).flatMap((vulnerability) => (typeof vulnerability.id === 'string' ? [vulnerability.id] : []));
79
+ const vulnerabilityAliases = (details) => {
80
+ const aliases = new Set();
81
+ for (const detail of details) {
82
+ if (!detail)
83
+ continue;
84
+ for (const alias of detail.aliases ?? []) {
85
+ if (typeof alias === 'string')
86
+ aliases.add(alias);
87
+ }
88
+ }
89
+ return [...aliases];
90
+ };
91
+ const vulnerabilitySeverities = (details) => details.flatMap((detail) => (detail ? [vulnerabilitySeverity(detail)] : []));
92
+ export class OsvClient {
93
+ #baseUrl;
94
+ #detailCache = new Map();
95
+ #fetch;
96
+ #requestTimeoutMs;
97
+ constructor(options = {}) {
98
+ this.#baseUrl = (options.baseUrl ?? 'https://api.osv.dev').replace(/\/+$/u, '');
99
+ this.#fetch = options.fetch ?? fetch;
100
+ this.#requestTimeoutMs = options.requestTimeoutMs ?? 10_000;
101
+ }
102
+ async queryMany(queries) {
103
+ if (queries.length === 0)
104
+ return new Map();
105
+ let batch;
106
+ try {
107
+ const response = await fetchWithTimeout(this.#fetch, `${this.#baseUrl}/v1/querybatch`, {
108
+ body: JSON.stringify({
109
+ queries: queries.map((query) => ({
110
+ package: {
111
+ ecosystem: 'npm',
112
+ name: query.name,
113
+ },
114
+ version: query.version,
115
+ })),
116
+ }),
117
+ headers: {
118
+ 'content-type': 'application/json',
119
+ },
120
+ method: 'POST',
121
+ }, this.#requestTimeoutMs);
122
+ if (!response.ok)
123
+ return new Map();
124
+ batch = toBatchResponse(await response.json());
125
+ }
126
+ catch {
127
+ return new Map();
128
+ }
129
+ const summaries = await Promise.all(queries.map((query, index) => this.#summarizeQuery(query, batch.results?.[index])));
130
+ return new Map(summaries.flatMap((summary) => (summary ? [summary] : [])));
131
+ }
132
+ async #summarizeQuery(query, result) {
133
+ const ids = vulnerabilityIds(result);
134
+ if (ids.length === 0)
135
+ return undefined;
136
+ const details = await Promise.all(ids.map((id) => this.#getVulnerability(id)));
137
+ return [queryKey(query), {
138
+ aliases: vulnerabilityAliases(details),
139
+ ids,
140
+ severity: maxSeverity(vulnerabilitySeverities(details)),
141
+ source: 'osv',
142
+ }];
143
+ }
144
+ async #getVulnerability(id) {
145
+ const cached = this.#detailCache.get(id);
146
+ if (cached)
147
+ return cached;
148
+ const request = this.#requestVulnerability(id);
149
+ this.#detailCache.set(id, request);
150
+ return request;
151
+ }
152
+ async #requestVulnerability(id) {
153
+ try {
154
+ const response = await fetchWithTimeout(this.#fetch, `${this.#baseUrl}/v1/vulns/${encodeURIComponent(id)}`, {}, this.#requestTimeoutMs);
155
+ if (!response.ok)
156
+ return undefined;
157
+ return toVulnerability(await response.json());
158
+ }
159
+ catch {
160
+ return undefined;
161
+ }
162
+ }
163
+ }
164
+ export const getOsvQueryKey = queryKey;
165
+ //# sourceMappingURL=osv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osv.js","sourceRoot":"","sources":["../src/osv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ManifestParseResult } from './types.js';
2
+ export declare const parsePackageJsonManifest: (text: string) => ManifestParseResult;
3
+ //# sourceMappingURL=package-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../src/package-json.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAA6E,mBAAmB,EAAa,MAAM,YAAY,CAAA;AAmO3I,eAAO,MAAM,wBAAwB,GAAI,MAAM,MAAM,KAAG,mBA4CvD,CAAA"}