scanoss 0.37.0 → 0.38.1

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 (32) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/build/main/cli/commands/dep.js +2 -2
  3. package/build/main/cli/commands/scan.js +2 -2
  4. package/build/main/sdk/Decompress/Decompressor/DecompressZips.js +17 -2
  5. package/build/main/sdk/Dependencies/DependencyScanner.d.ts +6 -1
  6. package/build/main/sdk/Dependencies/DependencyScanner.js +9 -4
  7. package/build/main/sdk/Dependencies/LocalDependency/DependencyTypes.d.ts +7 -1
  8. package/build/main/sdk/Dependencies/LocalDependency/LocalDependency.d.ts +4 -1
  9. package/build/main/sdk/Dependencies/LocalDependency/LocalDependency.js +9 -3
  10. package/build/main/sdk/Dependencies/LocalDependency/LocalDependency.spec.js +138 -1
  11. package/build/main/sdk/Dependencies/LocalDependency/parsers/buildGradleParser.d.ts +1 -1
  12. package/build/main/sdk/Dependencies/LocalDependency/parsers/buildGradleParser.js +59 -18
  13. package/build/main/sdk/Dependencies/LocalDependency/parsers/gradle/libsVersionsTomlParser.d.ts +27 -0
  14. package/build/main/sdk/Dependencies/LocalDependency/parsers/gradle/libsVersionsTomlParser.js +207 -0
  15. package/build/main/sdk/Dependencies/LocalDependency/parsers/parser.spec.js +158 -1
  16. package/build/main/tsconfig.tsbuildinfo +1 -1
  17. package/build/module/cli/commands/dep.js +2 -2
  18. package/build/module/cli/commands/scan.js +2 -2
  19. package/build/module/sdk/Decompress/Decompressor/DecompressZips.js +17 -2
  20. package/build/module/sdk/Dependencies/DependencyScanner.d.ts +6 -1
  21. package/build/module/sdk/Dependencies/DependencyScanner.js +9 -4
  22. package/build/module/sdk/Dependencies/LocalDependency/DependencyTypes.d.ts +7 -1
  23. package/build/module/sdk/Dependencies/LocalDependency/LocalDependency.d.ts +4 -1
  24. package/build/module/sdk/Dependencies/LocalDependency/LocalDependency.js +9 -3
  25. package/build/module/sdk/Dependencies/LocalDependency/LocalDependency.spec.js +102 -1
  26. package/build/module/sdk/Dependencies/LocalDependency/parsers/buildGradleParser.d.ts +1 -1
  27. package/build/module/sdk/Dependencies/LocalDependency/parsers/buildGradleParser.js +58 -17
  28. package/build/module/sdk/Dependencies/LocalDependency/parsers/gradle/libsVersionsTomlParser.d.ts +27 -0
  29. package/build/module/sdk/Dependencies/LocalDependency/parsers/gradle/libsVersionsTomlParser.js +199 -0
  30. package/build/module/sdk/Dependencies/LocalDependency/parsers/parser.spec.js +158 -1
  31. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  32. package/package.json +3 -2
@@ -5,22 +5,52 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.buildGradleParser = buildGradleParser;
7
7
  const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
8
9
  const packageurl_js_1 = require("packageurl-js");
9
- const MANIFEST_FILE = 'build.gradle';
10
+ const libsVersionsTomlParser_1 = require("./gradle/libsVersionsTomlParser");
11
+ const MANIFEST_FILES = ['build.gradle', 'build.gradle.kts'];
12
+ // Per-project cache of parsed version catalog (libs.versions.toml) entries.
13
+ // Outer key: project root directory path where gradle/libs.versions.toml was found
14
+ // Inner map: normalized alias (e.g. "androidx.activity.compose") → resolved Maven coordinates
15
+ // Example: { "/home/user/my-project" → { "hilt.android" → { purl: "pkg:maven/com.google.dagger/hilt-android", version: "2.59" } } }
16
+ const catalogCache = new Map();
10
17
  const depBlockRex = /dependencies\s*{\s*(?<dependencies>(.|\n)*?)}/gm;
11
- var GRADLE_STATES;
12
- (function (GRADLE_STATES) {
13
- GRADLE_STATES[GRADLE_STATES["WALKING"] = 0] = "WALKING";
14
- GRADLE_STATES[GRADLE_STATES["SINGLELINE_DEPENDENCY"] = 1] = "SINGLELINE_DEPENDENCY";
15
- GRADLE_STATES[GRADLE_STATES["MULTILINE_DEPENDENCY"] = 2] = "MULTILINE_DEPENDENCY";
16
- })(GRADLE_STATES || (GRADLE_STATES = {}));
17
- async function buildGradleParser(fileContent, filePath) {
18
+ function resolveCatalogAlias(line, catalogMap) {
19
+ const match = line.match(/\blibs\.([a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*)\b/);
20
+ if (match)
21
+ return catalogMap.get(match[1]);
22
+ }
23
+ function findCatalogMap(gradleFilePath, basePath) {
24
+ let dir = path_1.default.dirname(path_1.default.resolve(gradleFilePath));
25
+ const root = path_1.default.parse(dir).root;
26
+ // Stop at basePath (scan root) to avoid searching outside the project scope.
27
+ // Falls back to filesystem root when basePath is not provided.
28
+ const boundary = basePath ? path_1.default.resolve(basePath) : root;
29
+ while (true) {
30
+ if (catalogCache.has(dir))
31
+ return catalogCache.get(dir);
32
+ const tomlPath = path_1.default.join(dir, 'gradle', 'libs.versions.toml');
33
+ if (fs_1.default.existsSync(tomlPath)) {
34
+ const content = fs_1.default.readFileSync(tomlPath, 'utf8');
35
+ const map = (0, libsVersionsTomlParser_1.buildCatalogAliasMap)(content);
36
+ catalogCache.set(dir, map);
37
+ return map;
38
+ }
39
+ if (dir === boundary || dir === root)
40
+ break;
41
+ dir = path_1.default.dirname(dir);
42
+ }
43
+ return new Map();
44
+ }
45
+ async function buildGradleParser(fileContent, filePath, basePath) {
18
46
  var _a;
19
47
  // If the file is not a manifest file, return an empty results
20
48
  const results = { file: filePath, purls: [] };
21
- if (path_1.default.basename(filePath) != MANIFEST_FILE)
49
+ if (!MANIFEST_FILES.includes(path_1.default.basename(filePath)))
22
50
  return results;
51
+ const catalogMap = findCatalogMap(filePath, basePath);
23
52
  //For each dependency block, generate purls
53
+ depBlockRex.lastIndex = 0;
24
54
  let gradle;
25
55
  while ((gradle = depBlockRex.exec(fileContent)) !== null) {
26
56
  let depBlock = (_a = gradle === null || gradle === void 0 ? void 0 : gradle.groups) === null || _a === void 0 ? void 0 : _a.dependencies;
@@ -34,8 +64,8 @@ async function buildGradleParser(fileContent, filePath) {
34
64
  if (line == '')
35
65
  continue;
36
66
  current_config_name = getConfigNameFromLine(line);
37
- //Multiline dependency
38
- if (current_config_name && line.includes("(")) {
67
+ //Multiline dependency (only if line has '(' but not ')' on the same line)
68
+ if (current_config_name && line.includes("(") && !line.includes(")")) {
39
69
  while (i < lines.length && !lines[i].includes(")")) {
40
70
  const componentData = createPurlNameFromLine(lines[i]);
41
71
  if (componentData != null) {
@@ -45,6 +75,12 @@ async function buildGradleParser(fileContent, filePath) {
45
75
  scope: current_config_name
46
76
  });
47
77
  }
78
+ else {
79
+ const entry = resolveCatalogAlias(lines[i], catalogMap);
80
+ if (entry) {
81
+ results.purls.push({ purl: entry.purl, requirement: entry.version, scope: current_config_name });
82
+ }
83
+ }
48
84
  i++;
49
85
  }
50
86
  current_config_name = '';
@@ -52,6 +88,11 @@ async function buildGradleParser(fileContent, filePath) {
52
88
  else { //Single line dependency
53
89
  const componentData = createPurlNameFromLine(line);
54
90
  if (componentData == null) {
91
+ // Try resolving via catalog alias
92
+ const entry = resolveCatalogAlias(line, catalogMap);
93
+ if (entry) {
94
+ results.purls.push({ purl: entry.purl, requirement: entry.version, scope: current_config_name });
95
+ }
55
96
  current_config_name = '';
56
97
  continue;
57
98
  }
@@ -63,13 +104,13 @@ async function buildGradleParser(fileContent, filePath) {
63
104
  }
64
105
  function getConfigNameFromLine(line) {
65
106
  let configName = "";
66
- const dep = line.split(/\s/);
107
+ const dep = line.split(/[\s(]/);
67
108
  if (dep.length)
68
- configName = dep[0].replace("(", "").trim();
109
+ configName = dep[0].trim();
69
110
  return configName;
70
111
  }
71
112
  function createPurlNameFromLine(line) {
72
- var _a, _b;
113
+ var _a, _b, _c, _d, _e, _f;
73
114
  let namespace = undefined;
74
115
  let name = undefined;
75
116
  let version = undefined;
@@ -81,9 +122,9 @@ function createPurlNameFromLine(line) {
81
122
  version = dep.groups.version;
82
123
  }
83
124
  else if (line.includes("group") && line.includes("name") && line.includes("version")) {
84
- version = line.match(/version:\s+['"](?<version>[\w\.\-\d]+)['"]/).groups.version;
85
- name = (_a = line.match(/name:\s+['"](?<name>[\w\.\-\d]+)['"]/).groups) === null || _a === void 0 ? void 0 : _a.name;
86
- namespace = (_b = line.match(/group:\s+['"](?<group>[\w\.\-\d]+)['"]/).groups) === null || _b === void 0 ? void 0 : _b.group;
125
+ version = (_b = (_a = line.match(/version\s*[:=]\s*['"](?<version>[\w\.\-\d]+)['"]/)) === null || _a === void 0 ? void 0 : _a.groups) === null || _b === void 0 ? void 0 : _b.version;
126
+ name = (_d = (_c = line.match(/name\s*[:=]\s*['"](?<name>[\w\.\-\d]+)['"]/)) === null || _c === void 0 ? void 0 : _c.groups) === null || _d === void 0 ? void 0 : _d.name;
127
+ namespace = (_f = (_e = line.match(/group\s*[:=]\s*['"](?<group>[\w\.\-\d]+)['"]/)) === null || _e === void 0 ? void 0 : _e.groups) === null || _f === void 0 ? void 0 : _f.group;
87
128
  }
88
129
  let purlName = "";
89
130
  if (name && namespace) {
@@ -92,4 +133,4 @@ function createPurlNameFromLine(line) {
92
133
  }
93
134
  return null;
94
135
  }
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRHcmFkbGVQYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvc2RrL0RlcGVuZGVuY2llcy9Mb2NhbERlcGVuZGVuY3kvcGFyc2Vycy9idWlsZEdyYWRsZVBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWFBLDhDQTBEQztBQXRFRCxnREFBd0I7QUFDeEIsaURBQTJDO0FBRzNDLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQztBQUNyQyxNQUFNLFdBQVcsR0FBRyxpREFBaUQsQ0FBQztBQUV0RSxJQUFLLGFBSUo7QUFKRCxXQUFLLGFBQWE7SUFDaEIsdURBQU8sQ0FBQTtJQUNQLG1GQUFxQixDQUFBO0lBQ3JCLGlGQUFvQixDQUFBO0FBQ3RCLENBQUMsRUFKSSxhQUFhLEtBQWIsYUFBYSxRQUlqQjtBQUNNLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxXQUFtQixFQUFFLFFBQWdCOztJQUczRSw4REFBOEQ7SUFDOUQsTUFBTSxPQUFPLEdBQXFCLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDOUQsSUFBRyxjQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLGFBQWE7UUFDekMsT0FBTyxPQUFPLENBQUM7SUFFakIsMkNBQTJDO0lBQzNDLElBQUksTUFBTSxDQUFDO0lBQ1gsT0FBTyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDekQsSUFBSSxRQUFRLEdBQUcsTUFBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTSwwQ0FBRSxZQUFZLENBQUM7UUFHNUMsSUFBSSxtQkFBbUIsR0FBRyxFQUFFLENBQUMsQ0FBRyxvQ0FBb0M7UUFDcEUsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQVcsQ0FB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
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRHcmFkbGVQYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvc2RrL0RlcGVuZGVuY2llcy9Mb2NhbERlcGVuZGVuY3kvcGFyc2Vycy9idWlsZEdyYWRsZVBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTZDQSw4Q0F1RUM7QUFuSEQsZ0RBQXdCO0FBQ3hCLDRDQUFvQjtBQUNwQixpREFBMkM7QUFDM0MsNEVBQXNGO0FBR3RGLE1BQU0sY0FBYyxHQUFHLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDNUQsNEVBQTRFO0FBQzVFLG1GQUFtRjtBQUNuRiw4RkFBOEY7QUFDOUYsb0lBQW9JO0FBQ3BJLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFzQyxDQUFDO0FBQ25FLE1BQU0sV0FBVyxHQUFHLGlEQUFpRCxDQUFDO0FBR3RFLFNBQVMsbUJBQW1CLENBQUMsSUFBWSxFQUFFLFVBQXNDO0lBQy9FLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUN4RSxJQUFJLEtBQUs7UUFBRSxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLGNBQXNCLEVBQUUsUUFBaUI7SUFDL0QsSUFBSSxHQUFHLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxjQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxJQUFJLEdBQUcsY0FBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbEMsNkVBQTZFO0lBQzdFLCtEQUErRDtJQUMvRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMs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
@@ -0,0 +1,27 @@
1
+ import { ILocalDependency } from '../../DependencyTypes';
2
+ export interface ICatalogEntry {
3
+ purl: string;
4
+ version?: string;
5
+ }
6
+ /**
7
+ * Normalizes a TOML alias key to match Gradle accessor notation.
8
+ * Replaces dashes and underscores with dots: "hilt-android" → "hilt.android"
9
+ */
10
+ export declare function normalizeCatalogAlias(alias: string): string;
11
+ /**
12
+ * Builds a map from normalized catalog alias to resolved Maven coordinates.
13
+ * Keys use dot-separated notation matching Kotlin DSL accessors (e.g., "hilt.android").
14
+ */
15
+ export declare function buildCatalogAliasMap(fileContent: string): Map<string, ICatalogEntry>;
16
+ /**
17
+ * Parses a Gradle Version Catalog TOML file (libs.versions.toml) and extracts
18
+ * Maven dependency coordinates as PURLs.
19
+ *
20
+ * Supports:
21
+ * - module + version.ref: `lib = { module = "group:artifact", version.ref = "key" }`
22
+ * - module + inline version: `lib = { module = "group:artifact", version = "1.0" }`
23
+ * - group/name form: `lib = { group = "g", name = "n", version.ref = "key" }`
24
+ * - simple string: `lib = "group:artifact:version"`
25
+ * - no version (BOM-managed): `lib = { module = "group:artifact" }`
26
+ */
27
+ export declare function libsVersionsTomlParser(fileContent: string, filePath: string): Promise<ILocalDependency>;
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.normalizeCatalogAlias = normalizeCatalogAlias;
7
+ exports.buildCatalogAliasMap = buildCatalogAliasMap;
8
+ exports.libsVersionsTomlParser = libsVersionsTomlParser;
9
+ const path_1 = __importDefault(require("path"));
10
+ const packageurl_js_1 = require("packageurl-js");
11
+ /**
12
+ * Known limitations:
13
+ * - Rich versions in [versions] (e.g. { strictly = "[4.0, 5.0[", prefer = "4.12.0" }) are not parsed.
14
+ * Only simple key = "value" entries are supported.
15
+ * - The version catalog is expected at gradle/libs.versions.toml (Gradle default convention).
16
+ * Custom catalog paths configured via settings.gradle.kts versionCatalogs block are not detected.
17
+ * - settings.gradle.kts is not parsed. Plugin declarations and catalog configuration in settings are ignored.
18
+ * - Multi-line library entries are not supported. Each library must be declared on a single line.
19
+ * e.g. `hilt-android = { module = "...", version.ref = "hilt" }` works, but splitting it
20
+ * across multiple lines does not.
21
+ */
22
+ const MANIFEST_FILE = 'libs.versions.toml';
23
+ // --- Exported functions ---
24
+ /**
25
+ * Normalizes a TOML alias key to match Gradle accessor notation.
26
+ * Replaces dashes and underscores with dots: "hilt-android" → "hilt.android"
27
+ */
28
+ function normalizeCatalogAlias(alias) {
29
+ return alias.replace(/[-_]/g, '.');
30
+ }
31
+ /**
32
+ * Builds a map from normalized catalog alias to resolved Maven coordinates.
33
+ * Keys use dot-separated notation matching Kotlin DSL accessors (e.g., "hilt.android").
34
+ */
35
+ function buildCatalogAliasMap(fileContent) {
36
+ const map = new Map();
37
+ const versions = parseVersionsSection(fileContent);
38
+ const libraries = parseLibrariesSection(fileContent, versions);
39
+ for (const lib of libraries) {
40
+ if (lib.namespace && lib.name) {
41
+ const aliasKey = normalizeCatalogAlias(lib.alias);
42
+ const purlObj = new packageurl_js_1.PackageURL('maven', lib.namespace, lib.name, undefined, undefined, undefined);
43
+ map.set(aliasKey, { purl: purlObj.toString(), version: lib.version });
44
+ }
45
+ }
46
+ return map;
47
+ }
48
+ /**
49
+ * Parses a Gradle Version Catalog TOML file (libs.versions.toml) and extracts
50
+ * Maven dependency coordinates as PURLs.
51
+ *
52
+ * Supports:
53
+ * - module + version.ref: `lib = { module = "group:artifact", version.ref = "key" }`
54
+ * - module + inline version: `lib = { module = "group:artifact", version = "1.0" }`
55
+ * - group/name form: `lib = { group = "g", name = "n", version.ref = "key" }`
56
+ * - simple string: `lib = "group:artifact:version"`
57
+ * - no version (BOM-managed): `lib = { module = "group:artifact" }`
58
+ */
59
+ async function libsVersionsTomlParser(fileContent, filePath) {
60
+ const results = { file: filePath, purls: [] };
61
+ if (path_1.default.basename(filePath) !== MANIFEST_FILE)
62
+ return results;
63
+ const versions = parseVersionsSection(fileContent);
64
+ const libraries = parseLibrariesSection(fileContent, versions);
65
+ for (const lib of libraries) {
66
+ if (lib.namespace && lib.name) {
67
+ const purlObj = new packageurl_js_1.PackageURL('maven', lib.namespace, lib.name, undefined, undefined, undefined);
68
+ results.purls.push({ purl: purlObj.toString(), ...(lib.version && { requirement: lib.version }) });
69
+ }
70
+ }
71
+ return results;
72
+ }
73
+ // --- Private helpers ---
74
+ /**
75
+ * Extracts the content of a TOML section by header name.
76
+ * Returns the text between `[sectionName]` and the next `[` header (or end of file).
77
+ */
78
+ function extractSection(fileContent, sectionName) {
79
+ const regex = new RegExp(`^\\[${sectionName}\\]\\s*$`, 'm');
80
+ const match = regex.exec(fileContent);
81
+ if (!match)
82
+ return null;
83
+ const start = match.index + match[0].length;
84
+ const nextSection = fileContent.indexOf('\n[', start);
85
+ return nextSection === -1
86
+ ? fileContent.substring(start)
87
+ : fileContent.substring(start, nextSection);
88
+ }
89
+ /**
90
+ * Parses the [versions] section into a map of key -> version string.
91
+ *
92
+ * Example input:
93
+ * [versions]
94
+ * hilt = "2.51.1"
95
+ * kotlin = "2.0.0"
96
+ *
97
+ * Returns: Map { "hilt" → "2.51.1", "kotlin" → "2.0.0" }
98
+ */
99
+ function parseVersionsSection(fileContent) {
100
+ const versions = new Map();
101
+ const section = extractSection(fileContent, 'versions');
102
+ if (!section)
103
+ return versions;
104
+ for (const line of section.split(/\r?\n/)) {
105
+ const trimmed = line.trim();
106
+ if (!trimmed || trimmed.startsWith('#'))
107
+ continue;
108
+ // Match: key = "value" or key = 'value'
109
+ const match = trimmed.match(/^([\w-]+)\s*=\s*["']([^"']+)["']/);
110
+ if (match) {
111
+ versions.set(match[1], match[2]);
112
+ }
113
+ }
114
+ return versions;
115
+ }
116
+ /**
117
+ * Parses the [libraries] section and resolves version references.
118
+ *
119
+ * Example input:
120
+ * [libraries]
121
+ * hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" }
122
+ * simple = "com.example:simple:1.0.0"
123
+ *
124
+ * Returns: [
125
+ * { alias: "hilt-android", namespace: "com.google.dagger", name: "hilt-android", version: "2.51.1" },
126
+ * { alias: "simple", namespace: "com.example", name: "simple", version: "1.0.0" }
127
+ * ]
128
+ */
129
+ function parseLibrariesSection(fileContent, versions) {
130
+ const libraries = [];
131
+ const section = extractSection(fileContent, 'libraries');
132
+ if (!section)
133
+ return libraries;
134
+ for (const line of section.split(/\r?\n/)) {
135
+ const trimmed = line.trim();
136
+ if (!trimmed || trimmed.startsWith('#'))
137
+ continue;
138
+ // Match the key = value pattern
139
+ const kvMatch = trimmed.match(/^([\w-]+)\s*=\s*(.*)/);
140
+ if (!kvMatch)
141
+ continue;
142
+ const value = kvMatch[2].trim();
143
+ const entry = parseLibraryValue(value, versions);
144
+ if (entry)
145
+ libraries.push({ alias: kvMatch[1], ...entry });
146
+ }
147
+ return libraries;
148
+ }
149
+ /**
150
+ * Parses a single library value from the TOML file.
151
+ */
152
+ function parseLibraryValue(value, versions) {
153
+ // Simple string notation: "group:artifact:version"
154
+ const stringMatch = value.match(/^["']([^"']+)["']/);
155
+ if (stringMatch) {
156
+ const strContent = stringMatch[1];
157
+ const parts = strContent.split(':');
158
+ if (parts.length >= 2) {
159
+ return {
160
+ namespace: parts[0],
161
+ name: parts[1],
162
+ ...(parts[2] && { version: parts[2] }),
163
+ };
164
+ }
165
+ return null;
166
+ }
167
+ // Inline table notation: { ... }
168
+ if (value.startsWith('{')) {
169
+ let namespace;
170
+ let name;
171
+ let version;
172
+ // Check for module = "group:artifact"
173
+ const moduleMatch = value.match(/module\s*=\s*["']([^"']+)["']/);
174
+ if (moduleMatch) {
175
+ const parts = moduleMatch[1].split(':');
176
+ if (parts.length >= 2) {
177
+ namespace = parts[0];
178
+ name = parts[1];
179
+ }
180
+ }
181
+ else {
182
+ // Check for group = "...", name = "..."
183
+ const groupMatch = value.match(/group\s*=\s*["']([^"']+)["']/);
184
+ const nameMatch = value.match(/name\s*=\s*["']([^"']+)["']/);
185
+ if (groupMatch)
186
+ namespace = groupMatch[1];
187
+ if (nameMatch)
188
+ name = nameMatch[1];
189
+ }
190
+ // Resolve version: version.ref = "key" or version = "value"
191
+ const versionRefMatch = value.match(/version\.ref\s*=\s*["']([^"']+)["']/);
192
+ if (versionRefMatch) {
193
+ version = versions.get(versionRefMatch[1]);
194
+ }
195
+ else {
196
+ const versionMatch = value.match(/(?<![.\w])version\s*=\s*["']([^"']+)["']/);
197
+ if (versionMatch) {
198
+ version = versionMatch[1];
199
+ }
200
+ }
201
+ if (namespace && name) {
202
+ return { namespace, name, ...(version && { version }) };
203
+ }
204
+ }
205
+ return null;
206
+ }
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlic1ZlcnNpb25zVG9tbFBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvRGVwZW5kZW5jaWVzL0xvY2FsRGVwZW5kZW5jeS9wYXJzZXJzL2dyYWRsZS9saWJzVmVyc2lvbnNUb21sUGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBdUNBLHNEQUVDO0FBTUQsb0RBY0M7QUFhRCx3REFnQkM7QUF6RkQsZ0RBQXdCO0FBQ3hCLGlEQUEyQztBQUUzQzs7Ozs7Ozs7OztHQVVHO0FBRUgsTUFBTSxhQUFhLEdBQUcsb0JBQW9CLENBQUM7QUFpQjNDLDZCQUE2QjtBQUU3Qjs7O0dBR0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxLQUFhO0lBQ2pELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLFdBQW1CO0lBQ3RELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBQzdDLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUUvRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQzVCLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksMEJBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFD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