circle-ir 3.201.0 → 3.203.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.
- package/dist/analysis/sbom.d.ts +123 -0
- package/dist/analysis/sbom.d.ts.map +1 -0
- package/dist/analysis/sbom.js +482 -0
- package/dist/analysis/sbom.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,123 @@
|
|
|
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 `pyproject.toml`. Covers the two dominant layouts:
|
|
73
|
+
*
|
|
74
|
+
* - **PEP 621** — `[project]` `dependencies = ["flask>=2.0", …]` (required)
|
|
75
|
+
* and `[project.optional-dependencies]` group arrays (optional).
|
|
76
|
+
* - **Poetry** — `[tool.poetry.dependencies]` (required, skipping the
|
|
77
|
+
* `python` version pin) and any `dev`/`group.*` dependency table (dev).
|
|
78
|
+
*
|
|
79
|
+
* TOML is scanned with regex, not a full parser (minimal-deps guardrail).
|
|
80
|
+
*/
|
|
81
|
+
export declare function parsePyprojectDependencies(pyprojectToml: string): Dependency[];
|
|
82
|
+
/**
|
|
83
|
+
* Parse a Gradle build script (`build.gradle` Groovy or `build.gradle.kts`
|
|
84
|
+
* Kotlin DSL) dependency block. Recognises the common configurations
|
|
85
|
+
* (`implementation` / `api` / `compileOnly` / `runtimeOnly` /
|
|
86
|
+
* `annotationProcessor` / `kapt` / `classpath` and their `test*` variants) in
|
|
87
|
+
* both `impl 'g:a:v'` and `impl("g:a:v")` forms. Coordinates are Maven, so the
|
|
88
|
+
* ecosystem is `maven` and the name is `groupId:artifactId`. `test*`
|
|
89
|
+
* configurations map to the `dev` scope. `platform(...)` BOM imports are
|
|
90
|
+
* skipped (they declare no concrete artifact).
|
|
91
|
+
*/
|
|
92
|
+
export declare function parseGradleDependencies(buildGradle: string): Dependency[];
|
|
93
|
+
/**
|
|
94
|
+
* Parse a Maven `pom.xml` `<dependency>` blocks. Name is `groupId:artifactId`.
|
|
95
|
+
* `<scope>test|provided</scope>` → dev, `<optional>true</optional>` → optional.
|
|
96
|
+
* A `${...}` version is recorded as `unknown` (unresolved property reference).
|
|
97
|
+
*/
|
|
98
|
+
export declare function parseMavenDependencies(pomXml: string): Dependency[];
|
|
99
|
+
/**
|
|
100
|
+
* Parse a Cargo `Cargo.toml`. `[dependencies]` → required,
|
|
101
|
+
* `[dev-dependencies]` → dev, `[build-dependencies]` → optional. Handles both
|
|
102
|
+
* `name = "1.2"` and `name = { version = "1.2", ... }` forms.
|
|
103
|
+
*/
|
|
104
|
+
export declare function parseCargoDependencies(cargoToml: string): Dependency[];
|
|
105
|
+
/**
|
|
106
|
+
* Parse a Go `go.mod`. Collects `require` directives in both the grouped
|
|
107
|
+
* `require ( ... )` block and single-line `require path v1.2.3` forms.
|
|
108
|
+
* A `// indirect` marker maps to the `optional` scope. The module path is
|
|
109
|
+
* the purl name (`pkg:golang/github.com/foo/bar@v1.2.3`).
|
|
110
|
+
*/
|
|
111
|
+
export declare function parseGoDependencies(goMod: string): Dependency[];
|
|
112
|
+
/**
|
|
113
|
+
* Parse every manifest present in a {@link DependencyContext} into one
|
|
114
|
+
* de-duplicated dependency list. De-dup key is `ecosystem|name|version|scope`,
|
|
115
|
+
* so the same package declared once stays once but a genuine dev/required
|
|
116
|
+
* split is preserved.
|
|
117
|
+
*/
|
|
118
|
+
export declare function collectDependencies(ctx: DependencyContext | undefined): Dependency[];
|
|
119
|
+
/** Emit a CycloneDX 1.5 BOM document object (serialize with `JSON.stringify`). */
|
|
120
|
+
export declare function toCycloneDx(deps: Dependency[], meta?: SbomMetadata): Record<string, unknown>;
|
|
121
|
+
/** Emit an SPDX 2.3 document object (serialize with `JSON.stringify`). */
|
|
122
|
+
export declare function toSpdx(deps: Dependency[], meta?: SbomMetadata): Record<string, unknown>;
|
|
123
|
+
//# 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;AAoBD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,EAAE,CAa3E;AAED;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE,CAqE9E;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,EAAE,CAgBzE;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,CAmBpF;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,482 @@
|
|
|
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 single PEP 508 requirement string (`name[extras] (>=|==|~=…)ver ; marker`)
|
|
101
|
+
* into `{ name, version }`, or `null` when no name can be read. Shared by the
|
|
102
|
+
* `requirements.txt` and `pyproject.toml` parsers.
|
|
103
|
+
*/
|
|
104
|
+
function parsePep508(spec) {
|
|
105
|
+
let s = spec.trim();
|
|
106
|
+
s = s.split(';')[0].trim(); // strip environment marker
|
|
107
|
+
if (!s)
|
|
108
|
+
return null;
|
|
109
|
+
const m = s.match(/^([A-Za-z0-9._-]+)\s*(?:\[[^\]]*\])?\s*(.*)$/);
|
|
110
|
+
if (!m)
|
|
111
|
+
return null;
|
|
112
|
+
const rest = m[2].trim();
|
|
113
|
+
// First comparator clause's version (drop `,` compound ranges and `(` groups).
|
|
114
|
+
const verMatch = rest.replace(/^\(/, '').match(/^(?:==|>=|<=|~=|!=|>|<|===)?\s*([^,\s)]+)/);
|
|
115
|
+
const version = verMatch && verMatch[1] ? verMatch[1] : 'unknown';
|
|
116
|
+
return { name: m[1], version };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Parse a pip `requirements.txt`. Handles `name==1.2`, `name>=1.2`, `name~=1`,
|
|
120
|
+
* bare `name`, extras (`name[x]`), and environment markers (`; marker`).
|
|
121
|
+
* Skips comments, blank lines, and option lines (`-r`, `-e`, `--hash`, URLs).
|
|
122
|
+
*/
|
|
123
|
+
export function parsePypiDependencies(requirementsTxt) {
|
|
124
|
+
if (!requirementsTxt)
|
|
125
|
+
return [];
|
|
126
|
+
const out = [];
|
|
127
|
+
for (const raw of requirementsTxt.split(/\r?\n/)) {
|
|
128
|
+
let line = raw.trim();
|
|
129
|
+
if (!line || line.startsWith('#'))
|
|
130
|
+
continue;
|
|
131
|
+
if (line.startsWith('-') || /^[a-z]+:\/\//i.test(line))
|
|
132
|
+
continue; // options / URLs
|
|
133
|
+
line = line.split('#')[0].trim(); // strip trailing comment
|
|
134
|
+
if (!line)
|
|
135
|
+
continue;
|
|
136
|
+
const parsed = parsePep508(line);
|
|
137
|
+
if (parsed)
|
|
138
|
+
out.push(dep('pypi', parsed.name, parsed.version, 'required'));
|
|
139
|
+
}
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Parse a `pyproject.toml`. Covers the two dominant layouts:
|
|
144
|
+
*
|
|
145
|
+
* - **PEP 621** — `[project]` `dependencies = ["flask>=2.0", …]` (required)
|
|
146
|
+
* and `[project.optional-dependencies]` group arrays (optional).
|
|
147
|
+
* - **Poetry** — `[tool.poetry.dependencies]` (required, skipping the
|
|
148
|
+
* `python` version pin) and any `dev`/`group.*` dependency table (dev).
|
|
149
|
+
*
|
|
150
|
+
* TOML is scanned with regex, not a full parser (minimal-deps guardrail).
|
|
151
|
+
*/
|
|
152
|
+
export function parsePyprojectDependencies(pyprojectToml) {
|
|
153
|
+
if (!pyprojectToml)
|
|
154
|
+
return [];
|
|
155
|
+
const out = [];
|
|
156
|
+
// Line-scan tracking the current TOML table so `dependencies = [...]` under
|
|
157
|
+
// `[project]` (required) and arrays under `[project.optional-dependencies]`
|
|
158
|
+
// (optional) are distinguished, and Poetry tables are read as key/value.
|
|
159
|
+
const lines = pyprojectToml.split(/\r?\n/);
|
|
160
|
+
let table = '';
|
|
161
|
+
let poetryScope = null;
|
|
162
|
+
let inArray = false;
|
|
163
|
+
let arrayScope = 'required';
|
|
164
|
+
const pushReq = (raw, scope) => {
|
|
165
|
+
const cleaned = raw.trim().replace(/^["']|["'],?$/g, '').replace(/,$/, '').trim();
|
|
166
|
+
if (!cleaned)
|
|
167
|
+
return;
|
|
168
|
+
const parsed = parsePep508(cleaned);
|
|
169
|
+
if (parsed && parsed.name.toLowerCase() !== 'python')
|
|
170
|
+
out.push(dep('pypi', parsed.name, parsed.version, scope));
|
|
171
|
+
};
|
|
172
|
+
for (const raw of lines) {
|
|
173
|
+
const line = raw.trim();
|
|
174
|
+
if (!line || line.startsWith('#'))
|
|
175
|
+
continue;
|
|
176
|
+
if (inArray) {
|
|
177
|
+
if (line.startsWith(']')) {
|
|
178
|
+
inArray = false;
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
pushReq(line, arrayScope);
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const header = line.match(/^\[([^\]]+)\]$/);
|
|
185
|
+
if (header) {
|
|
186
|
+
table = header[1];
|
|
187
|
+
if (table === 'tool.poetry.dependencies')
|
|
188
|
+
poetryScope = 'required';
|
|
189
|
+
else if (/^tool\.poetry\.(dev-dependencies|group\..+\.dependencies)$/.test(table))
|
|
190
|
+
poetryScope = 'dev';
|
|
191
|
+
else
|
|
192
|
+
poetryScope = null;
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
// PEP 621 array openers.
|
|
196
|
+
const arrayOpen = line.match(/^(dependencies|[A-Za-z0-9._-]+)\s*=\s*\[(.*)$/);
|
|
197
|
+
if (arrayOpen && (arrayOpen[1] === 'dependencies' || table === 'project.optional-dependencies')) {
|
|
198
|
+
arrayScope = arrayOpen[1] === 'dependencies' ? 'required' : 'optional';
|
|
199
|
+
const inline = arrayOpen[2];
|
|
200
|
+
if (inline.includes(']')) {
|
|
201
|
+
// single-line array
|
|
202
|
+
for (const item of inline.slice(0, inline.indexOf(']')).split(','))
|
|
203
|
+
pushReq(item, arrayScope);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
inArray = true;
|
|
207
|
+
if (inline.trim())
|
|
208
|
+
pushReq(inline, arrayScope);
|
|
209
|
+
}
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
// Poetry table entries: `name = "^1.0"` or `name = { version = "1.0" }`.
|
|
213
|
+
if (poetryScope) {
|
|
214
|
+
const kv = line.match(/^([A-Za-z0-9._-]+)\s*=\s*(.+)$/);
|
|
215
|
+
if (!kv || kv[1].toLowerCase() === 'python')
|
|
216
|
+
continue;
|
|
217
|
+
let version = 'unknown';
|
|
218
|
+
const strv = kv[2].match(/^["']([^"']+)["']/);
|
|
219
|
+
if (strv)
|
|
220
|
+
version = strv[1];
|
|
221
|
+
else {
|
|
222
|
+
const inlinev = kv[2].match(/version\s*=\s*["']([^"']+)["']/);
|
|
223
|
+
if (inlinev)
|
|
224
|
+
version = inlinev[1];
|
|
225
|
+
}
|
|
226
|
+
out.push(dep('pypi', kv[1], version, poetryScope));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return out;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Parse a Gradle build script (`build.gradle` Groovy or `build.gradle.kts`
|
|
233
|
+
* Kotlin DSL) dependency block. Recognises the common configurations
|
|
234
|
+
* (`implementation` / `api` / `compileOnly` / `runtimeOnly` /
|
|
235
|
+
* `annotationProcessor` / `kapt` / `classpath` and their `test*` variants) in
|
|
236
|
+
* both `impl 'g:a:v'` and `impl("g:a:v")` forms. Coordinates are Maven, so the
|
|
237
|
+
* ecosystem is `maven` and the name is `groupId:artifactId`. `test*`
|
|
238
|
+
* configurations map to the `dev` scope. `platform(...)` BOM imports are
|
|
239
|
+
* skipped (they declare no concrete artifact).
|
|
240
|
+
*/
|
|
241
|
+
export function parseGradleDependencies(buildGradle) {
|
|
242
|
+
if (!buildGradle)
|
|
243
|
+
return [];
|
|
244
|
+
const out = [];
|
|
245
|
+
const re = /\b(implementation|api|compileOnly|compileOnlyApi|runtimeOnly|testImplementation|testCompileOnly|testRuntimeOnly|annotationProcessor|kapt|classpath)\s*[(\s]\s*['"]([\w.-]+:[\w.-]+(?::[\w.\-+]+)?)['"]/g;
|
|
246
|
+
let m;
|
|
247
|
+
while ((m = re.exec(buildGradle)) !== null) {
|
|
248
|
+
const config = m[1];
|
|
249
|
+
const coord = m[2].split(':');
|
|
250
|
+
if (coord.length < 2)
|
|
251
|
+
continue;
|
|
252
|
+
const name = `${coord[0]}:${coord[1]}`;
|
|
253
|
+
const version = coord[2] ?? 'unknown';
|
|
254
|
+
const scope = config.startsWith('test') ? 'dev' : 'required';
|
|
255
|
+
out.push(dep('maven', name, version, scope));
|
|
256
|
+
}
|
|
257
|
+
return out;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Parse a Maven `pom.xml` `<dependency>` blocks. Name is `groupId:artifactId`.
|
|
261
|
+
* `<scope>test|provided</scope>` → dev, `<optional>true</optional>` → optional.
|
|
262
|
+
* A `${...}` version is recorded as `unknown` (unresolved property reference).
|
|
263
|
+
*/
|
|
264
|
+
export function parseMavenDependencies(pomXml) {
|
|
265
|
+
if (!pomXml)
|
|
266
|
+
return [];
|
|
267
|
+
const out = [];
|
|
268
|
+
const depRe = /<dependency>([\s\S]*?)<\/dependency>/g;
|
|
269
|
+
let m;
|
|
270
|
+
while ((m = depRe.exec(pomXml)) !== null) {
|
|
271
|
+
const block = m[1];
|
|
272
|
+
const gid = block.match(/<groupId>\s*([^<\s]+)\s*<\/groupId>/)?.[1];
|
|
273
|
+
const aid = block.match(/<artifactId>\s*([^<\s]+)\s*<\/artifactId>/)?.[1];
|
|
274
|
+
if (!gid || !aid)
|
|
275
|
+
continue;
|
|
276
|
+
let version = block.match(/<version>\s*([^<\s]+)\s*<\/version>/)?.[1] ?? 'unknown';
|
|
277
|
+
if (version.startsWith('${'))
|
|
278
|
+
version = 'unknown';
|
|
279
|
+
const mvnScope = block.match(/<scope>\s*([^<\s]+)\s*<\/scope>/)?.[1];
|
|
280
|
+
const optional = /<optional>\s*true\s*<\/optional>/.test(block);
|
|
281
|
+
const scope = mvnScope === 'test' || mvnScope === 'provided' ? 'dev' : optional ? 'optional' : 'required';
|
|
282
|
+
out.push(dep('maven', `${gid}:${aid}`, version, scope));
|
|
283
|
+
}
|
|
284
|
+
return out;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Parse a Cargo `Cargo.toml`. `[dependencies]` → required,
|
|
288
|
+
* `[dev-dependencies]` → dev, `[build-dependencies]` → optional. Handles both
|
|
289
|
+
* `name = "1.2"` and `name = { version = "1.2", ... }` forms.
|
|
290
|
+
*/
|
|
291
|
+
export function parseCargoDependencies(cargoToml) {
|
|
292
|
+
if (!cargoToml)
|
|
293
|
+
return [];
|
|
294
|
+
const out = [];
|
|
295
|
+
let scope = null;
|
|
296
|
+
for (const raw of cargoToml.split(/\r?\n/)) {
|
|
297
|
+
const line = raw.trim();
|
|
298
|
+
if (!line || line.startsWith('#'))
|
|
299
|
+
continue;
|
|
300
|
+
const section = line.match(/^\[([^\]]+)\]$/);
|
|
301
|
+
if (section) {
|
|
302
|
+
const s = section[1];
|
|
303
|
+
if (s === 'dependencies')
|
|
304
|
+
scope = 'required';
|
|
305
|
+
else if (s === 'dev-dependencies')
|
|
306
|
+
scope = 'dev';
|
|
307
|
+
else if (s === 'build-dependencies')
|
|
308
|
+
scope = 'optional';
|
|
309
|
+
else
|
|
310
|
+
scope = null; // some other table — stop collecting until next dep table
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (!scope)
|
|
314
|
+
continue;
|
|
315
|
+
const kv = line.match(/^([A-Za-z0-9._-]+)\s*=\s*(.+)$/);
|
|
316
|
+
if (!kv)
|
|
317
|
+
continue;
|
|
318
|
+
const name = kv[1];
|
|
319
|
+
const value = kv[2].trim();
|
|
320
|
+
let version = 'unknown';
|
|
321
|
+
if (value.startsWith('"') || value.startsWith("'")) {
|
|
322
|
+
version = value.replace(/^["']|["'].*$/g, '');
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
const inline = value.match(/version\s*=\s*["']([^"']+)["']/);
|
|
326
|
+
if (inline)
|
|
327
|
+
version = inline[1];
|
|
328
|
+
}
|
|
329
|
+
out.push(dep('cargo', name, version, scope));
|
|
330
|
+
}
|
|
331
|
+
return out;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Parse a Go `go.mod`. Collects `require` directives in both the grouped
|
|
335
|
+
* `require ( ... )` block and single-line `require path v1.2.3` forms.
|
|
336
|
+
* A `// indirect` marker maps to the `optional` scope. The module path is
|
|
337
|
+
* the purl name (`pkg:golang/github.com/foo/bar@v1.2.3`).
|
|
338
|
+
*/
|
|
339
|
+
export function parseGoDependencies(goMod) {
|
|
340
|
+
if (!goMod)
|
|
341
|
+
return [];
|
|
342
|
+
const out = [];
|
|
343
|
+
let inBlock = false;
|
|
344
|
+
for (const raw of goMod.split(/\r?\n/)) {
|
|
345
|
+
const line = raw.trim();
|
|
346
|
+
if (!line || line.startsWith('//'))
|
|
347
|
+
continue;
|
|
348
|
+
if (!inBlock && /^require\s*\($/.test(line)) {
|
|
349
|
+
inBlock = true;
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
if (inBlock && line === ')') {
|
|
353
|
+
inBlock = false;
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
let spec;
|
|
357
|
+
if (inBlock)
|
|
358
|
+
spec = line;
|
|
359
|
+
else if (/^require\s+/.test(line))
|
|
360
|
+
spec = line.replace(/^require\s+/, '');
|
|
361
|
+
else
|
|
362
|
+
continue;
|
|
363
|
+
const indirect = /\/\/\s*indirect/.test(spec);
|
|
364
|
+
spec = spec.replace(/\/\/.*$/, '').trim();
|
|
365
|
+
const m = spec.match(/^(\S+)\s+(\S+)$/);
|
|
366
|
+
if (!m)
|
|
367
|
+
continue;
|
|
368
|
+
out.push(dep('golang', m[1], m[2], indirect ? 'optional' : 'required'));
|
|
369
|
+
}
|
|
370
|
+
return out;
|
|
371
|
+
}
|
|
372
|
+
// ---------------------------------------------------------------------------
|
|
373
|
+
// aggregation
|
|
374
|
+
// ---------------------------------------------------------------------------
|
|
375
|
+
/**
|
|
376
|
+
* Parse every manifest present in a {@link DependencyContext} into one
|
|
377
|
+
* de-duplicated dependency list. De-dup key is `ecosystem|name|version|scope`,
|
|
378
|
+
* so the same package declared once stays once but a genuine dev/required
|
|
379
|
+
* split is preserved.
|
|
380
|
+
*/
|
|
381
|
+
export function collectDependencies(ctx) {
|
|
382
|
+
if (!ctx)
|
|
383
|
+
return [];
|
|
384
|
+
const all = [];
|
|
385
|
+
if (ctx.js?.packageJson)
|
|
386
|
+
all.push(...parseNpmDependencies(ctx.js.packageJson));
|
|
387
|
+
if (ctx.python?.requirementsTxt)
|
|
388
|
+
all.push(...parsePypiDependencies(ctx.python.requirementsTxt));
|
|
389
|
+
if (ctx.python?.pyprojectToml)
|
|
390
|
+
all.push(...parsePyprojectDependencies(ctx.python.pyprojectToml));
|
|
391
|
+
if (ctx.java?.pomXml)
|
|
392
|
+
all.push(...parseMavenDependencies(ctx.java.pomXml));
|
|
393
|
+
if (ctx.java?.buildGradle)
|
|
394
|
+
all.push(...parseGradleDependencies(ctx.java.buildGradle));
|
|
395
|
+
if (ctx.rust?.cargoToml)
|
|
396
|
+
all.push(...parseCargoDependencies(ctx.rust.cargoToml));
|
|
397
|
+
const seen = new Set();
|
|
398
|
+
const deduped = [];
|
|
399
|
+
for (const d of all) {
|
|
400
|
+
const key = `${d.ecosystem}|${d.name}|${d.version}|${d.scope}`;
|
|
401
|
+
if (seen.has(key))
|
|
402
|
+
continue;
|
|
403
|
+
seen.add(key);
|
|
404
|
+
deduped.push(d);
|
|
405
|
+
}
|
|
406
|
+
return deduped;
|
|
407
|
+
}
|
|
408
|
+
// ---------------------------------------------------------------------------
|
|
409
|
+
// emitters
|
|
410
|
+
// ---------------------------------------------------------------------------
|
|
411
|
+
/** Emit a CycloneDX 1.5 BOM document object (serialize with `JSON.stringify`). */
|
|
412
|
+
export function toCycloneDx(deps, meta = {}) {
|
|
413
|
+
const bom = {
|
|
414
|
+
bomFormat: 'CycloneDX',
|
|
415
|
+
specVersion: '1.5',
|
|
416
|
+
version: 1,
|
|
417
|
+
};
|
|
418
|
+
if (meta.serialNumber)
|
|
419
|
+
bom.serialNumber = meta.serialNumber;
|
|
420
|
+
const metadata = {};
|
|
421
|
+
if (meta.timestamp)
|
|
422
|
+
metadata.timestamp = meta.timestamp;
|
|
423
|
+
metadata.tools = [{ vendor: 'Cognium', name: meta.tool ?? 'circle-ir' }];
|
|
424
|
+
if (meta.name) {
|
|
425
|
+
metadata.component = {
|
|
426
|
+
type: 'application',
|
|
427
|
+
name: meta.name,
|
|
428
|
+
...(meta.version ? { version: meta.version } : {}),
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
bom.metadata = metadata;
|
|
432
|
+
bom.components = deps.map((d) => ({
|
|
433
|
+
type: 'library',
|
|
434
|
+
name: d.name,
|
|
435
|
+
version: d.version,
|
|
436
|
+
purl: d.purl,
|
|
437
|
+
scope: d.scope === 'dev' ? 'excluded' : d.scope === 'optional' ? 'optional' : 'required',
|
|
438
|
+
'bom-ref': d.purl,
|
|
439
|
+
}));
|
|
440
|
+
return bom;
|
|
441
|
+
}
|
|
442
|
+
/** SPDX identifiers allow only `[a-zA-Z0-9.-]`; sanitize everything else. */
|
|
443
|
+
function spdxId(raw) {
|
|
444
|
+
return raw.replace(/[^a-zA-Z0-9.-]/g, '-');
|
|
445
|
+
}
|
|
446
|
+
/** Emit an SPDX 2.3 document object (serialize with `JSON.stringify`). */
|
|
447
|
+
export function toSpdx(deps, meta = {}) {
|
|
448
|
+
const docName = meta.name ?? 'document';
|
|
449
|
+
const packages = deps.map((d, i) => ({
|
|
450
|
+
SPDXID: `SPDXRef-Package-${spdxId(d.ecosystem)}-${spdxId(d.name)}-${i}`,
|
|
451
|
+
name: d.name,
|
|
452
|
+
versionInfo: d.version,
|
|
453
|
+
downloadLocation: 'NOASSERTION',
|
|
454
|
+
filesAnalyzed: false,
|
|
455
|
+
externalRefs: [
|
|
456
|
+
{
|
|
457
|
+
referenceCategory: 'PACKAGE-MANAGER',
|
|
458
|
+
referenceType: 'purl',
|
|
459
|
+
referenceLocator: d.purl,
|
|
460
|
+
},
|
|
461
|
+
],
|
|
462
|
+
}));
|
|
463
|
+
const relationships = packages.map((p) => ({
|
|
464
|
+
spdxElementId: 'SPDXRef-DOCUMENT',
|
|
465
|
+
relatedSpdxElement: p.SPDXID,
|
|
466
|
+
relationshipType: 'DESCRIBES',
|
|
467
|
+
}));
|
|
468
|
+
return {
|
|
469
|
+
spdxVersion: 'SPDX-2.3',
|
|
470
|
+
dataLicense: 'CC0-1.0',
|
|
471
|
+
SPDXID: 'SPDXRef-DOCUMENT',
|
|
472
|
+
name: docName,
|
|
473
|
+
documentNamespace: meta.namespace ?? `https://cognium.dev/spdxdocs/${spdxId(docName)}`,
|
|
474
|
+
creationInfo: {
|
|
475
|
+
created: meta.timestamp ?? '1970-01-01T00:00:00Z',
|
|
476
|
+
creators: [`Tool: ${meta.tool ?? 'circle-ir'}`],
|
|
477
|
+
},
|
|
478
|
+
packages,
|
|
479
|
+
relationships,
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
//# 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, parsePyprojectDependencies, parseMavenDependencies, parseGradleDependencies, 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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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, parsePyprojectDependencies, parseMavenDependencies, parseGradleDependencies, 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;
|
|
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,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,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.
|
|
3
|
+
"version": "3.203.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",
|