circle-ir 3.201.0 → 3.202.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.
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Software Bill of Materials (SBOM) generation.
3
+ *
4
+ * cognium-dev — deterministic SBOM emission (Pillar I). The engine never
5
+ * reads the filesystem (browser-safety); the caller passes raw manifest text
6
+ * via the same {@link DependencyContext} surface the deserialization gate
7
+ * uses (#258/#261). This module turns those manifests into a normalized
8
+ * dependency list and emits two industry formats:
9
+ *
10
+ * - **CycloneDX 1.5** (`toCycloneDx`) — the OWASP BOM format.
11
+ * - **SPDX 2.3** (`toSpdx`) — the Linux Foundation format.
12
+ *
13
+ * Both outputs are deterministic: no timestamps, UUIDs, or randomness are
14
+ * introduced here. Volatile document metadata (generation time, serial
15
+ * number, namespace) is *injected* by the caller via {@link SbomMetadata},
16
+ * so a given input always produces byte-identical output unless the caller
17
+ * chooses otherwise — which keeps SBOMs diffable in CI and tests stable.
18
+ *
19
+ * Parsing is regex/`JSON.parse`-scoped, never a full TOML/XML tree: the only
20
+ * runtime dependencies circle-ir permits are `web-tree-sitter` and `yaml`,
21
+ * and a manifest dependency list needs nothing heavier.
22
+ */
23
+ import type { DependencyContext } from '../analyzer.js';
24
+ /** Package ecosystem, aligned with Package-URL (purl) `pkg:<type>` names. */
25
+ export type Ecosystem = 'npm' | 'pypi' | 'maven' | 'cargo' | 'golang';
26
+ /** How a dependency is used, mapped from the manifest's declaration site. */
27
+ export type DependencyScope = 'required' | 'optional' | 'dev';
28
+ /** One normalized dependency, ecosystem-agnostic. */
29
+ export interface Dependency {
30
+ /** Package name. For Maven this is `groupId:artifactId`. */
31
+ name: string;
32
+ /** Declared version spec verbatim (e.g. `^3.1.0`, `>=1.2`), or `'unknown'`. */
33
+ version: string;
34
+ ecosystem: Ecosystem;
35
+ scope: DependencyScope;
36
+ /** Package URL (https://github.com/package-url/purl-spec). */
37
+ purl: string;
38
+ }
39
+ /**
40
+ * Caller-injected document metadata. Everything here is optional; supplying
41
+ * it makes the output richer but non-deterministic (e.g. a real timestamp).
42
+ * Leaving it out yields a minimal, fully-deterministic document.
43
+ */
44
+ export interface SbomMetadata {
45
+ /** Name of the project the SBOM describes. */
46
+ name?: string;
47
+ /** Version of the project the SBOM describes. */
48
+ version?: string;
49
+ /** ISO-8601 generation time. Injected — never read from a clock here. */
50
+ timestamp?: string;
51
+ /** CycloneDX `serialNumber` (expected form `urn:uuid:...`). */
52
+ serialNumber?: string;
53
+ /** SPDX `documentNamespace`. Defaults to a cognium.dev URI. */
54
+ namespace?: string;
55
+ /** Generating tool name recorded in the document. Defaults to `circle-ir`. */
56
+ tool?: string;
57
+ }
58
+ /**
59
+ * Parse an npm `package.json`. `dependencies` → required,
60
+ * `optionalDependencies` / `peerDependencies` → optional,
61
+ * `devDependencies` → dev. Malformed JSON yields an empty list rather than
62
+ * throwing — a bad manifest should not abort a scan.
63
+ */
64
+ export declare function parseNpmDependencies(packageJson: string): Dependency[];
65
+ /**
66
+ * Parse a pip `requirements.txt`. Handles `name==1.2`, `name>=1.2`, `name~=1`,
67
+ * bare `name`, extras (`name[x]`), and environment markers (`; marker`).
68
+ * Skips comments, blank lines, and option lines (`-r`, `-e`, `--hash`, URLs).
69
+ */
70
+ export declare function parsePypiDependencies(requirementsTxt: string): Dependency[];
71
+ /**
72
+ * Parse a Maven `pom.xml` `<dependency>` blocks. Name is `groupId:artifactId`.
73
+ * `<scope>test|provided</scope>` → dev, `<optional>true</optional>` → optional.
74
+ * A `${...}` version is recorded as `unknown` (unresolved property reference).
75
+ */
76
+ export declare function parseMavenDependencies(pomXml: string): Dependency[];
77
+ /**
78
+ * Parse a Cargo `Cargo.toml`. `[dependencies]` → required,
79
+ * `[dev-dependencies]` → dev, `[build-dependencies]` → optional. Handles both
80
+ * `name = "1.2"` and `name = { version = "1.2", ... }` forms.
81
+ */
82
+ export declare function parseCargoDependencies(cargoToml: string): Dependency[];
83
+ /**
84
+ * Parse a Go `go.mod`. Collects `require` directives in both the grouped
85
+ * `require ( ... )` block and single-line `require path v1.2.3` forms.
86
+ * A `// indirect` marker maps to the `optional` scope. The module path is
87
+ * the purl name (`pkg:golang/github.com/foo/bar@v1.2.3`).
88
+ */
89
+ export declare function parseGoDependencies(goMod: string): Dependency[];
90
+ /**
91
+ * Parse every manifest present in a {@link DependencyContext} into one
92
+ * de-duplicated dependency list. De-dup key is `ecosystem|name|version|scope`,
93
+ * so the same package declared once stays once but a genuine dev/required
94
+ * split is preserved.
95
+ */
96
+ export declare function collectDependencies(ctx: DependencyContext | undefined): Dependency[];
97
+ /** Emit a CycloneDX 1.5 BOM document object (serialize with `JSON.stringify`). */
98
+ export declare function toCycloneDx(deps: Dependency[], meta?: SbomMetadata): Record<string, unknown>;
99
+ /** Emit an SPDX 2.3 document object (serialize with `JSON.stringify`). */
100
+ export declare function toSpdx(deps: Dependency[], meta?: SbomMetadata): Record<string, unknown>;
101
+ //# sourceMappingURL=sbom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sbom.d.ts","sourceRoot":"","sources":["../../src/analysis/sbom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,6EAA6E;AAC7E,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtE,6EAA6E;AAC7E,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;AAE9D,qDAAqD;AACrD,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,eAAe,CAAC;IACvB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA+CD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,EAAE,CAyBtE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,EAAE,CAoB3E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAmBnE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CA+BtE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CA0B/D;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,GAAG,SAAS,GAAG,UAAU,EAAE,CAiBpF;AAMD,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BhG;AAOD,0EAA0E;AAC1E,wBAAgB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoC3F"}
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Software Bill of Materials (SBOM) generation.
3
+ *
4
+ * cognium-dev — deterministic SBOM emission (Pillar I). The engine never
5
+ * reads the filesystem (browser-safety); the caller passes raw manifest text
6
+ * via the same {@link DependencyContext} surface the deserialization gate
7
+ * uses (#258/#261). This module turns those manifests into a normalized
8
+ * dependency list and emits two industry formats:
9
+ *
10
+ * - **CycloneDX 1.5** (`toCycloneDx`) — the OWASP BOM format.
11
+ * - **SPDX 2.3** (`toSpdx`) — the Linux Foundation format.
12
+ *
13
+ * Both outputs are deterministic: no timestamps, UUIDs, or randomness are
14
+ * introduced here. Volatile document metadata (generation time, serial
15
+ * number, namespace) is *injected* by the caller via {@link SbomMetadata},
16
+ * so a given input always produces byte-identical output unless the caller
17
+ * chooses otherwise — which keeps SBOMs diffable in CI and tests stable.
18
+ *
19
+ * Parsing is regex/`JSON.parse`-scoped, never a full TOML/XML tree: the only
20
+ * runtime dependencies circle-ir permits are `web-tree-sitter` and `yaml`,
21
+ * and a manifest dependency list needs nothing heavier.
22
+ */
23
+ // ---------------------------------------------------------------------------
24
+ // purl helpers
25
+ // ---------------------------------------------------------------------------
26
+ /**
27
+ * Reduce a declared version spec to a clean, exact-ish version for the purl,
28
+ * or `undefined` when the spec is a range/reference we should not pin. A purl
29
+ * without a version is valid, so omitting is preferable to guessing.
30
+ */
31
+ function purlVersion(spec) {
32
+ // Strip range operators/whitespace but NOT a leading `v` — Go module
33
+ // versions (`v1.2.3`) keep it as part of the canonical version.
34
+ const stripped = spec.trim().replace(/^[\s^~=<>]+/, '');
35
+ // Accept a single concrete version token (optional Go `v` prefix); reject
36
+ // residual ranges (`1.0 <2.0`), commas, or unresolved `${...}` / `*`.
37
+ if (/^v?[0-9][\w.\-+]*$/.test(stripped))
38
+ return stripped;
39
+ return undefined;
40
+ }
41
+ /** Percent-encode a purl name segment, preserving the `@scope/name` shape. */
42
+ function encodePurlName(name) {
43
+ return name
44
+ .split('/')
45
+ .map((seg) => encodeURIComponent(seg))
46
+ .join('/');
47
+ }
48
+ function makePurl(ecosystem, name, version) {
49
+ const v = purlVersion(version);
50
+ // Maven names are `groupId:artifactId`; the purl expresses that as the
51
+ // `namespace/name` path (`pkg:maven/groupId/artifactId`).
52
+ const path = ecosystem === 'maven' ? name.replace(':', '/') : name;
53
+ const base = `pkg:${ecosystem}/${encodePurlName(path)}`;
54
+ return v ? `${base}@${encodeURIComponent(v)}` : base;
55
+ }
56
+ function dep(ecosystem, name, version, scope) {
57
+ const v = version.trim() || 'unknown';
58
+ return { name, version: v, ecosystem, scope, purl: makePurl(ecosystem, name, v) };
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // per-ecosystem manifest parsers
62
+ // ---------------------------------------------------------------------------
63
+ /**
64
+ * Parse an npm `package.json`. `dependencies` → required,
65
+ * `optionalDependencies` / `peerDependencies` → optional,
66
+ * `devDependencies` → dev. Malformed JSON yields an empty list rather than
67
+ * throwing — a bad manifest should not abort a scan.
68
+ */
69
+ export function parseNpmDependencies(packageJson) {
70
+ if (!packageJson)
71
+ return [];
72
+ let parsed;
73
+ try {
74
+ parsed = JSON.parse(packageJson);
75
+ }
76
+ catch {
77
+ return [];
78
+ }
79
+ if (!parsed || typeof parsed !== 'object')
80
+ return [];
81
+ const obj = parsed;
82
+ const out = [];
83
+ const sections = [
84
+ ['dependencies', 'required'],
85
+ ['optionalDependencies', 'optional'],
86
+ ['peerDependencies', 'optional'],
87
+ ['devDependencies', 'dev'],
88
+ ];
89
+ for (const [key, scope] of sections) {
90
+ const block = obj[key];
91
+ if (!block || typeof block !== 'object')
92
+ continue;
93
+ for (const [name, spec] of Object.entries(block)) {
94
+ out.push(dep('npm', name, typeof spec === 'string' ? spec : 'unknown', scope));
95
+ }
96
+ }
97
+ return out;
98
+ }
99
+ /**
100
+ * Parse a pip `requirements.txt`. Handles `name==1.2`, `name>=1.2`, `name~=1`,
101
+ * bare `name`, extras (`name[x]`), and environment markers (`; marker`).
102
+ * Skips comments, blank lines, and option lines (`-r`, `-e`, `--hash`, URLs).
103
+ */
104
+ export function parsePypiDependencies(requirementsTxt) {
105
+ if (!requirementsTxt)
106
+ return [];
107
+ const out = [];
108
+ for (const raw of requirementsTxt.split(/\r?\n/)) {
109
+ let line = raw.trim();
110
+ if (!line || line.startsWith('#'))
111
+ continue;
112
+ if (line.startsWith('-') || /^[a-z]+:\/\//i.test(line))
113
+ continue; // options / URLs
114
+ line = line.split('#')[0].trim(); // strip trailing comment
115
+ line = line.split(';')[0].trim(); // strip environment marker
116
+ if (!line)
117
+ continue;
118
+ const m = line.match(/^([A-Za-z0-9._-]+)\s*(?:\[[^\]]*\])?\s*(.*)$/);
119
+ if (!m)
120
+ continue;
121
+ const name = m[1];
122
+ const rest = m[2].trim();
123
+ // Take the first comparator clause's version (drop `,` compound ranges).
124
+ const verMatch = rest.match(/^(?:==|>=|<=|~=|!=|>|<|===)?\s*([^,\s]+)/);
125
+ const version = verMatch && verMatch[1] ? verMatch[1] : 'unknown';
126
+ out.push(dep('pypi', name, version, 'required'));
127
+ }
128
+ return out;
129
+ }
130
+ /**
131
+ * Parse a Maven `pom.xml` `<dependency>` blocks. Name is `groupId:artifactId`.
132
+ * `<scope>test|provided</scope>` → dev, `<optional>true</optional>` → optional.
133
+ * A `${...}` version is recorded as `unknown` (unresolved property reference).
134
+ */
135
+ export function parseMavenDependencies(pomXml) {
136
+ if (!pomXml)
137
+ return [];
138
+ const out = [];
139
+ const depRe = /<dependency>([\s\S]*?)<\/dependency>/g;
140
+ let m;
141
+ while ((m = depRe.exec(pomXml)) !== null) {
142
+ const block = m[1];
143
+ const gid = block.match(/<groupId>\s*([^<\s]+)\s*<\/groupId>/)?.[1];
144
+ const aid = block.match(/<artifactId>\s*([^<\s]+)\s*<\/artifactId>/)?.[1];
145
+ if (!gid || !aid)
146
+ continue;
147
+ let version = block.match(/<version>\s*([^<\s]+)\s*<\/version>/)?.[1] ?? 'unknown';
148
+ if (version.startsWith('${'))
149
+ version = 'unknown';
150
+ const mvnScope = block.match(/<scope>\s*([^<\s]+)\s*<\/scope>/)?.[1];
151
+ const optional = /<optional>\s*true\s*<\/optional>/.test(block);
152
+ const scope = mvnScope === 'test' || mvnScope === 'provided' ? 'dev' : optional ? 'optional' : 'required';
153
+ out.push(dep('maven', `${gid}:${aid}`, version, scope));
154
+ }
155
+ return out;
156
+ }
157
+ /**
158
+ * Parse a Cargo `Cargo.toml`. `[dependencies]` → required,
159
+ * `[dev-dependencies]` → dev, `[build-dependencies]` → optional. Handles both
160
+ * `name = "1.2"` and `name = { version = "1.2", ... }` forms.
161
+ */
162
+ export function parseCargoDependencies(cargoToml) {
163
+ if (!cargoToml)
164
+ return [];
165
+ const out = [];
166
+ let scope = null;
167
+ for (const raw of cargoToml.split(/\r?\n/)) {
168
+ const line = raw.trim();
169
+ if (!line || line.startsWith('#'))
170
+ continue;
171
+ const section = line.match(/^\[([^\]]+)\]$/);
172
+ if (section) {
173
+ const s = section[1];
174
+ if (s === 'dependencies')
175
+ scope = 'required';
176
+ else if (s === 'dev-dependencies')
177
+ scope = 'dev';
178
+ else if (s === 'build-dependencies')
179
+ scope = 'optional';
180
+ else
181
+ scope = null; // some other table — stop collecting until next dep table
182
+ continue;
183
+ }
184
+ if (!scope)
185
+ continue;
186
+ const kv = line.match(/^([A-Za-z0-9._-]+)\s*=\s*(.+)$/);
187
+ if (!kv)
188
+ continue;
189
+ const name = kv[1];
190
+ const value = kv[2].trim();
191
+ let version = 'unknown';
192
+ if (value.startsWith('"') || value.startsWith("'")) {
193
+ version = value.replace(/^["']|["'].*$/g, '');
194
+ }
195
+ else {
196
+ const inline = value.match(/version\s*=\s*["']([^"']+)["']/);
197
+ if (inline)
198
+ version = inline[1];
199
+ }
200
+ out.push(dep('cargo', name, version, scope));
201
+ }
202
+ return out;
203
+ }
204
+ /**
205
+ * Parse a Go `go.mod`. Collects `require` directives in both the grouped
206
+ * `require ( ... )` block and single-line `require path v1.2.3` forms.
207
+ * A `// indirect` marker maps to the `optional` scope. The module path is
208
+ * the purl name (`pkg:golang/github.com/foo/bar@v1.2.3`).
209
+ */
210
+ export function parseGoDependencies(goMod) {
211
+ if (!goMod)
212
+ return [];
213
+ const out = [];
214
+ let inBlock = false;
215
+ for (const raw of goMod.split(/\r?\n/)) {
216
+ const line = raw.trim();
217
+ if (!line || line.startsWith('//'))
218
+ continue;
219
+ if (!inBlock && /^require\s*\($/.test(line)) {
220
+ inBlock = true;
221
+ continue;
222
+ }
223
+ if (inBlock && line === ')') {
224
+ inBlock = false;
225
+ continue;
226
+ }
227
+ let spec;
228
+ if (inBlock)
229
+ spec = line;
230
+ else if (/^require\s+/.test(line))
231
+ spec = line.replace(/^require\s+/, '');
232
+ else
233
+ continue;
234
+ const indirect = /\/\/\s*indirect/.test(spec);
235
+ spec = spec.replace(/\/\/.*$/, '').trim();
236
+ const m = spec.match(/^(\S+)\s+(\S+)$/);
237
+ if (!m)
238
+ continue;
239
+ out.push(dep('golang', m[1], m[2], indirect ? 'optional' : 'required'));
240
+ }
241
+ return out;
242
+ }
243
+ // ---------------------------------------------------------------------------
244
+ // aggregation
245
+ // ---------------------------------------------------------------------------
246
+ /**
247
+ * Parse every manifest present in a {@link DependencyContext} into one
248
+ * de-duplicated dependency list. De-dup key is `ecosystem|name|version|scope`,
249
+ * so the same package declared once stays once but a genuine dev/required
250
+ * split is preserved.
251
+ */
252
+ export function collectDependencies(ctx) {
253
+ if (!ctx)
254
+ return [];
255
+ const all = [];
256
+ if (ctx.js?.packageJson)
257
+ all.push(...parseNpmDependencies(ctx.js.packageJson));
258
+ if (ctx.python?.requirementsTxt)
259
+ all.push(...parsePypiDependencies(ctx.python.requirementsTxt));
260
+ if (ctx.java?.pomXml)
261
+ all.push(...parseMavenDependencies(ctx.java.pomXml));
262
+ if (ctx.rust?.cargoToml)
263
+ all.push(...parseCargoDependencies(ctx.rust.cargoToml));
264
+ const seen = new Set();
265
+ const deduped = [];
266
+ for (const d of all) {
267
+ const key = `${d.ecosystem}|${d.name}|${d.version}|${d.scope}`;
268
+ if (seen.has(key))
269
+ continue;
270
+ seen.add(key);
271
+ deduped.push(d);
272
+ }
273
+ return deduped;
274
+ }
275
+ // ---------------------------------------------------------------------------
276
+ // emitters
277
+ // ---------------------------------------------------------------------------
278
+ /** Emit a CycloneDX 1.5 BOM document object (serialize with `JSON.stringify`). */
279
+ export function toCycloneDx(deps, meta = {}) {
280
+ const bom = {
281
+ bomFormat: 'CycloneDX',
282
+ specVersion: '1.5',
283
+ version: 1,
284
+ };
285
+ if (meta.serialNumber)
286
+ bom.serialNumber = meta.serialNumber;
287
+ const metadata = {};
288
+ if (meta.timestamp)
289
+ metadata.timestamp = meta.timestamp;
290
+ metadata.tools = [{ vendor: 'Cognium', name: meta.tool ?? 'circle-ir' }];
291
+ if (meta.name) {
292
+ metadata.component = {
293
+ type: 'application',
294
+ name: meta.name,
295
+ ...(meta.version ? { version: meta.version } : {}),
296
+ };
297
+ }
298
+ bom.metadata = metadata;
299
+ bom.components = deps.map((d) => ({
300
+ type: 'library',
301
+ name: d.name,
302
+ version: d.version,
303
+ purl: d.purl,
304
+ scope: d.scope === 'dev' ? 'excluded' : d.scope === 'optional' ? 'optional' : 'required',
305
+ 'bom-ref': d.purl,
306
+ }));
307
+ return bom;
308
+ }
309
+ /** SPDX identifiers allow only `[a-zA-Z0-9.-]`; sanitize everything else. */
310
+ function spdxId(raw) {
311
+ return raw.replace(/[^a-zA-Z0-9.-]/g, '-');
312
+ }
313
+ /** Emit an SPDX 2.3 document object (serialize with `JSON.stringify`). */
314
+ export function toSpdx(deps, meta = {}) {
315
+ const docName = meta.name ?? 'document';
316
+ const packages = deps.map((d, i) => ({
317
+ SPDXID: `SPDXRef-Package-${spdxId(d.ecosystem)}-${spdxId(d.name)}-${i}`,
318
+ name: d.name,
319
+ versionInfo: d.version,
320
+ downloadLocation: 'NOASSERTION',
321
+ filesAnalyzed: false,
322
+ externalRefs: [
323
+ {
324
+ referenceCategory: 'PACKAGE-MANAGER',
325
+ referenceType: 'purl',
326
+ referenceLocator: d.purl,
327
+ },
328
+ ],
329
+ }));
330
+ const relationships = packages.map((p) => ({
331
+ spdxElementId: 'SPDXRef-DOCUMENT',
332
+ relatedSpdxElement: p.SPDXID,
333
+ relationshipType: 'DESCRIBES',
334
+ }));
335
+ return {
336
+ spdxVersion: 'SPDX-2.3',
337
+ dataLicense: 'CC0-1.0',
338
+ SPDXID: 'SPDXRef-DOCUMENT',
339
+ name: docName,
340
+ documentNamespace: meta.namespace ?? `https://cognium.dev/spdxdocs/${spdxId(docName)}`,
341
+ creationInfo: {
342
+ created: meta.timestamp ?? '1970-01-01T00:00:00Z',
343
+ creators: [`Tool: ${meta.tool ?? 'circle-ir'}`],
344
+ },
345
+ packages,
346
+ relationships,
347
+ };
348
+ }
349
+ //# sourceMappingURL=sbom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sbom.js","sourceRoot":"","sources":["../../src/analysis/sbom.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,8 @@
4
4
  * A universal library for static analysis and taint tracking.
5
5
  */
6
6
  export { initAnalyzer, analyze, analyzeForAPI, analyzeProject, isAnalyzerInitialized, resetAnalyzer, type AnalyzerOptions, } from './analyzer.js';
7
+ export { parseNpmDependencies, parsePypiDependencies, parseMavenDependencies, parseCargoDependencies, parseGoDependencies, collectDependencies, toCycloneDx, toSpdx, } from './analysis/sbom.js';
8
+ export type { Dependency, Ecosystem, DependencyScope, SbomMetadata, } from './analysis/sbom.js';
7
9
  export type { NamingConventionOptions } from './analysis/passes/naming-convention-pass.js';
8
10
  export type { DependencyFanOutOptions } from './analysis/passes/dependency-fan-out-pass.js';
9
11
  export type { UnboundedCollectionOptions } from './analysis/passes/unbounded-collection-pass.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,6 +5,8 @@
5
5
  */
6
6
  // Main analyzer
7
7
  export { initAnalyzer, analyze, analyzeForAPI, analyzeProject, isAnalyzerInitialized, resetAnalyzer, } from './analyzer.js';
8
+ // SBOM generation (deterministic — CycloneDX 1.5 / SPDX 2.3 from manifests)
9
+ export { parseNpmDependencies, parsePypiDependencies, parseMavenDependencies, parseCargoDependencies, parseGoDependencies, collectDependencies, toCycloneDx, toSpdx, } from './analysis/sbom.js';
8
10
  // Runtime values, not just types. `SourceType` / `SinkType` above are
9
11
  // `export type`, so re-exporting the unions alone gives consumers nothing to
10
12
  // import at runtime — which is exactly what happened in 3.197.0, where the
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,OAAO,EACL,YAAY,EACZ,OAAO,EACP,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,aAAa,GAEd,MAAM,eAAe,CAAC;AAyEvB,sEAAsE;AACtE,6EAA6E;AAC7E,2EAA2E;AAC3E,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAC9E,4EAA4E;AAC5E,qEAAqE;AACrE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAY5D,sCAAsC;AACtC,OAAO,EACL,UAAU,EACV,KAAK,EACL,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,eAAe,GAMhB,MAAM,iBAAiB,CAAC;AAEzB,kBAAkB;AAClB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,QAAQ,EACR,QAAQ,GACT,MAAM,iBAAiB,CAAC;AAEzB,qBAAqB;AACrB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,EAC1B,gCAAgC,EAChC,0BAA0B,EAC1B,kBAAkB,EAClB,OAAO,EACP,aAAa,EACb,WAAW,EACX,eAAe,EACf,aAAa,EACb,kBAAkB,GAMnB,MAAM,qBAAqB,CAAC;AAE7B,mBAAmB;AACnB,OAAO,EACL,WAAW,EACX,gBAAgB,GAEjB,MAAM,qBAAqB,CAAC;AAE7B,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAqB,MAAM,iCAAiC,CAAC;AAExF,uBAAuB;AACvB,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,mBAAmB;AACnB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAY9B,gCAAgC;AAChC,OAAO,EACL,MAAM,EACN,SAAS,EACT,eAAe,EACf,WAAW,EACX,WAAW,GAIZ,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,OAAO,EACL,YAAY,EACZ,OAAO,EACP,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,aAAa,GAEd,MAAM,eAAe,CAAC;AAEvB,4EAA4E;AAC5E,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,MAAM,GACP,MAAM,oBAAoB,CAAC;AA+E5B,sEAAsE;AACtE,6EAA6E;AAC7E,2EAA2E;AAC3E,6EAA6E;AAC7E,8EAA8E;AAC9E,8EAA8E;AAC9E,4EAA4E;AAC5E,qEAAqE;AACrE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAY5D,sCAAsC;AACtC,OAAO,EACL,UAAU,EACV,KAAK,EACL,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,eAAe,GAMhB,MAAM,iBAAiB,CAAC;AAEzB,kBAAkB;AAClB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,QAAQ,EACR,QAAQ,GACT,MAAM,iBAAiB,CAAC;AAEzB,qBAAqB;AACrB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,EAC1B,gCAAgC,EAChC,0BAA0B,EAC1B,kBAAkB,EAClB,OAAO,EACP,aAAa,EACb,WAAW,EACX,eAAe,EACf,aAAa,EACb,kBAAkB,GAMnB,MAAM,qBAAqB,CAAC;AAE7B,mBAAmB;AACnB,OAAO,EACL,WAAW,EACX,gBAAgB,GAEjB,MAAM,qBAAqB,CAAC;AAE7B,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAqB,MAAM,iCAAiC,CAAC;AAExF,uBAAuB;AACvB,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,mBAAmB;AACnB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAY9B,gCAAgC;AAChC,OAAO,EACL,MAAM,EACN,SAAS,EACT,eAAe,EACf,WAAW,EACX,WAAW,GAIZ,MAAM,mBAAmB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "circle-ir",
3
- "version": "3.201.0",
3
+ "version": "3.202.0",
4
4
  "description": "High-performance Static Application Security Testing (SAST) library for detecting security vulnerabilities through taint analysis",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",