cc-recommender 0.4.0 → 0.5.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/CHANGELOG.md +14 -0
- package/dist/services/analyzer/parsers/build-gradle.parser.d.ts +12 -0
- package/dist/services/analyzer/parsers/build-gradle.parser.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/build-gradle.parser.js +77 -0
- package/dist/services/analyzer/parsers/build-gradle.parser.js.map +1 -0
- package/dist/services/analyzer/parsers/cargo-toml.parser.d.ts +11 -0
- package/dist/services/analyzer/parsers/cargo-toml.parser.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/cargo-toml.parser.js +56 -0
- package/dist/services/analyzer/parsers/cargo-toml.parser.js.map +1 -0
- package/dist/services/analyzer/parsers/composer-json.parser.d.ts +11 -0
- package/dist/services/analyzer/parsers/composer-json.parser.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/composer-json.parser.js +52 -0
- package/dist/services/analyzer/parsers/composer-json.parser.js.map +1 -0
- package/dist/services/analyzer/parsers/docker-compose.parser.d.ts +11 -0
- package/dist/services/analyzer/parsers/docker-compose.parser.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/docker-compose.parser.js +81 -0
- package/dist/services/analyzer/parsers/docker-compose.parser.js.map +1 -0
- package/dist/services/analyzer/parsers/dotenv.parser.d.ts +13 -0
- package/dist/services/analyzer/parsers/dotenv.parser.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/dotenv.parser.js +77 -0
- package/dist/services/analyzer/parsers/dotenv.parser.js.map +1 -0
- package/dist/services/analyzer/parsers/gemfile.parser.d.ts +11 -0
- package/dist/services/analyzer/parsers/gemfile.parser.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/gemfile.parser.js +62 -0
- package/dist/services/analyzer/parsers/gemfile.parser.js.map +1 -0
- package/dist/services/analyzer/parsers/pom-xml.parser.d.ts +11 -0
- package/dist/services/analyzer/parsers/pom-xml.parser.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/pom-xml.parser.js +66 -0
- package/dist/services/analyzer/parsers/pom-xml.parser.js.map +1 -0
- package/dist/services/analyzer/parsers/pyproject-toml.parser.d.ts +12 -0
- package/dist/services/analyzer/parsers/pyproject-toml.parser.d.ts.map +1 -0
- package/dist/services/analyzer/parsers/pyproject-toml.parser.js +108 -0
- package/dist/services/analyzer/parsers/pyproject-toml.parser.js.map +1 -0
- package/dist/services/analyzer/project-analyzer.service.d.ts.map +1 -1
- package/dist/services/analyzer/project-analyzer.service.js +16 -0
- package/dist/services/analyzer/project-analyzer.service.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,20 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.5.0](https://github.com/yuji0809/cc-recommender/compare/v0.4.1...v0.5.0) (2026-01-31)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* add support for multiple new project file parsers ([93cb69f](https://github.com/yuji0809/cc-recommender/commit/93cb69f34c5c64763afcbf873c37645f34c2e8fc))
|
|
14
|
+
|
|
15
|
+
## [0.4.1](https://github.com/yuji0809/cc-recommender/compare/v0.4.0...v0.4.1) (2026-01-30)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
* reorganize services and update fetcher structure ([1a00357](https://github.com/yuji0809/cc-recommender/commit/1a0035791606aead2482d9acba68a8bc7f4a2243))
|
|
21
|
+
|
|
8
22
|
## [0.4.0](https://github.com/yuji0809/cc-recommender/compare/v0.3.0...v0.4.0) (2026-01-30)
|
|
9
23
|
|
|
10
24
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* build.gradle Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Gradle build.gradle files for dependencies and frameworks
|
|
5
|
+
* Supports both Groovy and Kotlin DSL
|
|
6
|
+
*/
|
|
7
|
+
import type { ProjectInfo } from "../../../types/service-types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Parse build.gradle and extract dependencies and frameworks
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseBuildGradle(projectPath: string, info: ProjectInfo): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=build-gradle.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-gradle.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/build-gradle.parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAkCnE;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC5F"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* build.gradle Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Gradle build.gradle files for dependencies and frameworks
|
|
5
|
+
* Supports both Groovy and Kotlin DSL
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from "node:fs/promises";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
/** Framework detection mappings for Java/Kotlin/Gradle dependencies */
|
|
10
|
+
const FRAMEWORK_MAPPINGS = {
|
|
11
|
+
"spring-boot": "spring-boot",
|
|
12
|
+
"org.springframework.boot": "spring-boot",
|
|
13
|
+
"spring-framework": "spring",
|
|
14
|
+
"org.springframework": "spring",
|
|
15
|
+
ktor: "ktor",
|
|
16
|
+
"io.ktor": "ktor",
|
|
17
|
+
hibernate: "hibernate",
|
|
18
|
+
junit: "junit",
|
|
19
|
+
"org.junit": "junit",
|
|
20
|
+
mockito: "mockito",
|
|
21
|
+
mockk: "mockk",
|
|
22
|
+
lombok: "lombok",
|
|
23
|
+
guava: "guava",
|
|
24
|
+
"com.google.guava": "guava",
|
|
25
|
+
jackson: "jackson",
|
|
26
|
+
"com.fasterxml.jackson": "jackson",
|
|
27
|
+
postgresql: "postgresql",
|
|
28
|
+
mysql: "mysql",
|
|
29
|
+
h2: "h2",
|
|
30
|
+
kafka: "kafka",
|
|
31
|
+
"org.apache.kafka": "kafka",
|
|
32
|
+
redis: "redis",
|
|
33
|
+
jedis: "redis",
|
|
34
|
+
lettuce: "redis",
|
|
35
|
+
mongodb: "mongodb",
|
|
36
|
+
"org.mongodb": "mongodb",
|
|
37
|
+
exposed: "exposed",
|
|
38
|
+
"org.jetbrains.exposed": "exposed",
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Parse build.gradle and extract dependencies and frameworks
|
|
42
|
+
*/
|
|
43
|
+
export async function parseBuildGradle(projectPath, info) {
|
|
44
|
+
const gradleFiles = ["build.gradle", "build.gradle.kts"];
|
|
45
|
+
for (const gradleFile of gradleFiles) {
|
|
46
|
+
try {
|
|
47
|
+
const gradlePath = join(projectPath, gradleFile);
|
|
48
|
+
const content = await readFile(gradlePath, "utf-8");
|
|
49
|
+
// Extract dependencies from various declaration styles
|
|
50
|
+
// Supports: implementation("..."), implementation '...', compile("..."), etc.
|
|
51
|
+
const dependencyPatterns = [
|
|
52
|
+
/(?:implementation|api|compile|testImplementation|runtimeOnly)\s*\(?['"]([^'"]+)['"]\)?/g,
|
|
53
|
+
/(?:implementation|api|compile|testImplementation|runtimeOnly)\s*\([^)]*group\s*[:=]\s*['"]([^'"]+)['"][^)]*\)/g,
|
|
54
|
+
];
|
|
55
|
+
for (const pattern of dependencyPatterns) {
|
|
56
|
+
const matches = content.matchAll(pattern);
|
|
57
|
+
for (const match of matches) {
|
|
58
|
+
const dependency = match[1].toLowerCase();
|
|
59
|
+
info.dependencies.push(dependency);
|
|
60
|
+
// Check if this dependency matches known frameworks
|
|
61
|
+
for (const [frameworkPattern, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
|
|
62
|
+
if (dependency.includes(frameworkPattern)) {
|
|
63
|
+
info.frameworks.push(framework);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Only parse the first found file
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// File doesn't exist, continue to next
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=build-gradle.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-gradle.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/build-gradle.parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,uEAAuE;AACvE,MAAM,kBAAkB,GAA2B;IACjD,aAAa,EAAE,aAAa;IAC5B,0BAA0B,EAAE,aAAa;IACzC,kBAAkB,EAAE,QAAQ;IAC5B,qBAAqB,EAAE,QAAQ;IAC/B,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,OAAO;IACpB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,kBAAkB,EAAE,OAAO;IAC3B,OAAO,EAAE,SAAS;IAClB,uBAAuB,EAAE,SAAS;IAClC,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;IACd,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,OAAO;IACd,kBAAkB,EAAE,OAAO;IAC3B,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,SAAS;IACxB,OAAO,EAAE,SAAS;IAClB,uBAAuB,EAAE,SAAS;CACnC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB,EAAE,IAAiB;IAC3E,MAAM,WAAW,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAEzD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAEpD,uDAAuD;YACvD,8EAA8E;YAC9E,MAAM,kBAAkB,GAAG;gBACzB,yFAAyF;gBACzF,gHAAgH;aACjH,CAAC;YAEF,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAEnC,oDAAoD;oBACpD,KAAK,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;wBAC/E,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;4BAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BAChC,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,MAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cargo.toml Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Rust Cargo.toml files for dependencies and frameworks
|
|
5
|
+
*/
|
|
6
|
+
import type { ProjectInfo } from "../../../types/service-types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Parse Cargo.toml and extract dependencies and frameworks
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseCargoToml(projectPath: string, info: ProjectInfo): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=cargo-toml.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cargo-toml.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/cargo-toml.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAmBnE;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B1F"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cargo.toml Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Rust Cargo.toml files for dependencies and frameworks
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
/** Framework detection mappings for Rust dependencies */
|
|
9
|
+
const FRAMEWORK_MAPPINGS = {
|
|
10
|
+
axum: "axum",
|
|
11
|
+
"actix-web": "actix-web",
|
|
12
|
+
rocket: "rocket",
|
|
13
|
+
tokio: "tokio",
|
|
14
|
+
"async-std": "async-std",
|
|
15
|
+
serde: "serde",
|
|
16
|
+
sqlx: "sqlx",
|
|
17
|
+
diesel: "diesel",
|
|
18
|
+
"sea-orm": "sea-orm",
|
|
19
|
+
tauri: "tauri",
|
|
20
|
+
leptos: "leptos",
|
|
21
|
+
yew: "yew",
|
|
22
|
+
bevy: "bevy",
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Parse Cargo.toml and extract dependencies and frameworks
|
|
26
|
+
*/
|
|
27
|
+
export async function parseCargoToml(projectPath, info) {
|
|
28
|
+
try {
|
|
29
|
+
const cargoPath = join(projectPath, "Cargo.toml");
|
|
30
|
+
const content = await readFile(cargoPath, "utf-8");
|
|
31
|
+
// Extract dependencies section
|
|
32
|
+
const depsMatch = content.match(/\[dependencies\]([\s\S]*?)(?=\n\[|$)/);
|
|
33
|
+
if (depsMatch) {
|
|
34
|
+
const deps = depsMatch[1]
|
|
35
|
+
.split("\n")
|
|
36
|
+
.map((line) => line.trim())
|
|
37
|
+
.filter((line) => line && !line.startsWith("#"))
|
|
38
|
+
.map((line) => {
|
|
39
|
+
const match = line.match(/^([a-zA-Z0-9_-]+)/);
|
|
40
|
+
return match ? match[1].toLowerCase() : null;
|
|
41
|
+
})
|
|
42
|
+
.filter((dep) => dep !== null);
|
|
43
|
+
info.dependencies.push(...deps);
|
|
44
|
+
// Detect Rust frameworks
|
|
45
|
+
for (const [dep, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
|
|
46
|
+
if (deps.includes(dep)) {
|
|
47
|
+
info.frameworks.push(framework);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// No Cargo.toml
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=cargo-toml.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cargo-toml.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/cargo-toml.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,yDAAyD;AACzD,MAAM,kBAAkB,GAA2B;IACjD,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,WAAW;IACxB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,WAAW;IACxB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,IAAiB;IACzE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEnD,+BAA+B;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACxE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;iBACtB,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;iBAC/C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/C,CAAC,CAAC;iBACD,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;YAEhD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAEhC,yBAAyB;YACzB,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAClE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composer.json Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses PHP composer.json files for dependencies and frameworks
|
|
5
|
+
*/
|
|
6
|
+
import type { ProjectInfo } from "../../../types/service-types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Parse composer.json and extract dependencies and frameworks
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseComposerJson(projectPath: string, info: ProjectInfo): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=composer-json.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-json.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/composer-json.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAkBnE;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B7F"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composer.json Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses PHP composer.json files for dependencies and frameworks
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
/** Framework detection mappings for PHP dependencies */
|
|
9
|
+
const FRAMEWORK_MAPPINGS = {
|
|
10
|
+
"laravel/framework": "laravel",
|
|
11
|
+
"symfony/symfony": "symfony",
|
|
12
|
+
"symfony/framework-bundle": "symfony",
|
|
13
|
+
"codeigniter4/framework": "codeigniter",
|
|
14
|
+
"cakephp/cakephp": "cakephp",
|
|
15
|
+
"yiisoft/yii2": "yii",
|
|
16
|
+
"slim/slim": "slim",
|
|
17
|
+
wordpress: "wordpress",
|
|
18
|
+
drupal: "drupal",
|
|
19
|
+
"guzzlehttp/guzzle": "guzzle",
|
|
20
|
+
"phpunit/phpunit": "phpunit",
|
|
21
|
+
"doctrine/orm": "doctrine",
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Parse composer.json and extract dependencies and frameworks
|
|
25
|
+
*/
|
|
26
|
+
export async function parseComposerJson(projectPath, info) {
|
|
27
|
+
try {
|
|
28
|
+
const composerPath = join(projectPath, "composer.json");
|
|
29
|
+
const content = await readFile(composerPath, "utf-8");
|
|
30
|
+
const composer = JSON.parse(content);
|
|
31
|
+
// Add description if available
|
|
32
|
+
if (composer.description) {
|
|
33
|
+
info.description = composer.description;
|
|
34
|
+
}
|
|
35
|
+
// Collect dependencies
|
|
36
|
+
const allDeps = [
|
|
37
|
+
...Object.keys(composer.require || {}),
|
|
38
|
+
...Object.keys(composer["require-dev"] || {}),
|
|
39
|
+
];
|
|
40
|
+
info.dependencies.push(...allDeps);
|
|
41
|
+
// Detect frameworks from dependencies
|
|
42
|
+
for (const [dep, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
|
|
43
|
+
if (allDeps.includes(dep)) {
|
|
44
|
+
info.frameworks.push(framework);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// No composer.json or parse error
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=composer-json.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-json.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/composer-json.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,wDAAwD;AACxD,MAAM,kBAAkB,GAA2B;IACjD,mBAAmB,EAAE,SAAS;IAC9B,iBAAiB,EAAE,SAAS;IAC5B,0BAA0B,EAAE,SAAS;IACrC,wBAAwB,EAAE,aAAa;IACvC,iBAAiB,EAAE,SAAS;IAC5B,cAAc,EAAE,KAAK;IACrB,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,mBAAmB,EAAE,QAAQ;IAC7B,iBAAiB,EAAE,SAAS;IAC5B,cAAc,EAAE,UAAU;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB,EAAE,IAAiB;IAC5E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAErC,+BAA+B;QAC/B,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QAC1C,CAAC;QAED,uBAAuB;QACvB,MAAM,OAAO,GAAG;YACd,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;YACtC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;SAC9C,CAAC;QAEF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAEnC,sCAAsC;QACtC,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAClE,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Compose Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses docker-compose.yml files to detect infrastructure services
|
|
5
|
+
*/
|
|
6
|
+
import type { ProjectInfo } from "../../../types/service-types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Parse docker-compose.yml and detect infrastructure services
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseDockerCompose(projectPath: string, info: ProjectInfo): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=docker-compose.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-compose.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/docker-compose.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AA+BnE;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD9F"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Compose Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses docker-compose.yml files to detect infrastructure services
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
/** Service detection mappings for Docker Compose services */
|
|
9
|
+
const SERVICE_MAPPINGS = {
|
|
10
|
+
postgres: "postgresql",
|
|
11
|
+
postgresql: "postgresql",
|
|
12
|
+
mysql: "mysql",
|
|
13
|
+
mariadb: "mysql",
|
|
14
|
+
redis: "redis",
|
|
15
|
+
mongodb: "mongodb",
|
|
16
|
+
mongo: "mongodb",
|
|
17
|
+
elasticsearch: "elasticsearch",
|
|
18
|
+
nginx: "nginx",
|
|
19
|
+
apache: "apache",
|
|
20
|
+
rabbitmq: "rabbitmq",
|
|
21
|
+
kafka: "kafka",
|
|
22
|
+
memcached: "memcached",
|
|
23
|
+
minio: "minio",
|
|
24
|
+
grafana: "grafana",
|
|
25
|
+
prometheus: "prometheus",
|
|
26
|
+
jaeger: "jaeger",
|
|
27
|
+
zipkin: "zipkin",
|
|
28
|
+
consul: "consul",
|
|
29
|
+
vault: "vault",
|
|
30
|
+
traefik: "traefik",
|
|
31
|
+
caddy: "caddy",
|
|
32
|
+
mailhog: "mailhog",
|
|
33
|
+
localstack: "aws",
|
|
34
|
+
azurite: "azure",
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Parse docker-compose.yml and detect infrastructure services
|
|
38
|
+
*/
|
|
39
|
+
export async function parseDockerCompose(projectPath, info) {
|
|
40
|
+
const composeFiles = ["docker-compose.yml", "docker-compose.yaml", "compose.yml", "compose.yaml"];
|
|
41
|
+
for (const composeFile of composeFiles) {
|
|
42
|
+
try {
|
|
43
|
+
const composePath = join(projectPath, composeFile);
|
|
44
|
+
const content = await readFile(composePath, "utf-8");
|
|
45
|
+
// Extract service names from docker-compose
|
|
46
|
+
// Look for "image:" lines to detect services
|
|
47
|
+
const imageMatches = content.matchAll(/^\s*image:\s*([^\s:]+)/gm);
|
|
48
|
+
for (const match of imageMatches) {
|
|
49
|
+
const imageName = match[1].toLowerCase();
|
|
50
|
+
// Check if image name matches known services
|
|
51
|
+
for (const [pattern, service] of Object.entries(SERVICE_MAPPINGS)) {
|
|
52
|
+
if (imageName.includes(pattern)) {
|
|
53
|
+
info.frameworks.push(service);
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Also check service names directly
|
|
59
|
+
const serviceMatches = content.matchAll(/^\s{2,4}([a-z0-9_-]+):/gm);
|
|
60
|
+
for (const match of serviceMatches) {
|
|
61
|
+
const serviceName = match[1].toLowerCase();
|
|
62
|
+
// Skip common docker-compose keys
|
|
63
|
+
if (["services", "networks", "volumes", "version"].includes(serviceName)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
// Check if service name matches known services
|
|
67
|
+
if (SERVICE_MAPPINGS[serviceName]) {
|
|
68
|
+
info.frameworks.push(SERVICE_MAPPINGS[serviceName]);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// If we found a docker-compose file, add docker framework
|
|
72
|
+
info.frameworks.push("docker");
|
|
73
|
+
// Only parse the first found file
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// File doesn't exist, continue to next
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=docker-compose.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-compose.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/docker-compose.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,6DAA6D;AAC7D,MAAM,gBAAgB,GAA2B;IAC/C,QAAQ,EAAE,YAAY;IACtB,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,aAAa,EAAE,eAAe;IAC9B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,OAAO;CACjB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAmB,EAAE,IAAiB;IAC7E,MAAM,YAAY,GAAG,CAAC,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IAElG,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAErD,4CAA4C;YAC5C,6CAA6C;YAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;YAElE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBAEzC,6CAA6C;gBAC7C,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAClE,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAC9B,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAED,oCAAoC;YACpC,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;YAEpE,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;gBACnC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBAE3C,kCAAkC;gBAClC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBACzE,SAAS;gBACX,CAAC;gBAED,+CAA+C;gBAC/C,IAAI,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;YAED,0DAA0D;YAC1D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE/B,kCAAkC;YAClC,MAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .env.example Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses .env.example and similar template files to detect external services and APIs
|
|
5
|
+
* Note: Only reads template files (.env.example, .env.template, .env.sample) for security
|
|
6
|
+
*/
|
|
7
|
+
import type { ProjectInfo } from "../../../types/service-types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Parse .env template files and detect external services
|
|
10
|
+
* Only reads template files for security (no actual .env files with secrets)
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseDotenv(projectPath: string, info: ProjectInfo): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=dotenv.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dotenv.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/dotenv.parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAqCnE;;;GAGG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCvF"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* .env.example Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses .env.example and similar template files to detect external services and APIs
|
|
5
|
+
* Note: Only reads template files (.env.example, .env.template, .env.sample) for security
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from "node:fs/promises";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
/** Service detection mappings based on environment variable prefixes/patterns */
|
|
10
|
+
const SERVICE_PATTERNS = [
|
|
11
|
+
{ pattern: /^SUPABASE_/i, service: "supabase" },
|
|
12
|
+
{ pattern: /^OPENAI_/i, service: "openai" },
|
|
13
|
+
{ pattern: /^ANTHROPIC_/i, service: "anthropic" },
|
|
14
|
+
{ pattern: /^AWS_/i, service: "aws" },
|
|
15
|
+
{ pattern: /^AZURE_/i, service: "azure" },
|
|
16
|
+
{ pattern: /^GCP_/i, service: "gcp" },
|
|
17
|
+
{ pattern: /^GOOGLE_/i, service: "google-cloud" },
|
|
18
|
+
{ pattern: /^STRIPE_/i, service: "stripe" },
|
|
19
|
+
{ pattern: /^TWILIO_/i, service: "twilio" },
|
|
20
|
+
{ pattern: /^SENDGRID_/i, service: "sendgrid" },
|
|
21
|
+
{ pattern: /^FIREBASE_/i, service: "firebase" },
|
|
22
|
+
{ pattern: /^VERCEL_/i, service: "vercel" },
|
|
23
|
+
{ pattern: /^NETLIFY_/i, service: "netlify" },
|
|
24
|
+
{ pattern: /^CLOUDFLARE_/i, service: "cloudflare" },
|
|
25
|
+
{ pattern: /^GITHUB_/i, service: "github" },
|
|
26
|
+
{ pattern: /^GITLAB_/i, service: "gitlab" },
|
|
27
|
+
{ pattern: /^SLACK_/i, service: "slack" },
|
|
28
|
+
{ pattern: /^DISCORD_/i, service: "discord" },
|
|
29
|
+
{ pattern: /^DATABASE_URL/i, service: "database" },
|
|
30
|
+
{ pattern: /^POSTGRES/i, service: "postgresql" },
|
|
31
|
+
{ pattern: /^MYSQL/i, service: "mysql" },
|
|
32
|
+
{ pattern: /^MONGODB/i, service: "mongodb" },
|
|
33
|
+
{ pattern: /^REDIS_/i, service: "redis" },
|
|
34
|
+
{ pattern: /^ELASTICSEARCH_/i, service: "elasticsearch" },
|
|
35
|
+
{ pattern: /^ALGOLIA_/i, service: "algolia" },
|
|
36
|
+
{ pattern: /^SENTRY_/i, service: "sentry" },
|
|
37
|
+
{ pattern: /^DATADOG_/i, service: "datadog" },
|
|
38
|
+
{ pattern: /^NEW_RELIC_/i, service: "newrelic" },
|
|
39
|
+
{ pattern: /^MAILGUN_/i, service: "mailgun" },
|
|
40
|
+
{ pattern: /^POSTMARK_/i, service: "postmark" },
|
|
41
|
+
{ pattern: /^RESEND_/i, service: "resend" },
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Parse .env template files and detect external services
|
|
45
|
+
* Only reads template files for security (no actual .env files with secrets)
|
|
46
|
+
*/
|
|
47
|
+
export async function parseDotenv(projectPath, info) {
|
|
48
|
+
// Only check template files that don't contain secrets
|
|
49
|
+
const envFiles = [".env.example", ".env.template", ".env.sample", ".env.dist"];
|
|
50
|
+
for (const envFile of envFiles) {
|
|
51
|
+
try {
|
|
52
|
+
const envPath = join(projectPath, envFile);
|
|
53
|
+
const content = await readFile(envPath, "utf-8");
|
|
54
|
+
const lines = content
|
|
55
|
+
.split("\n")
|
|
56
|
+
.map((line) => line.trim())
|
|
57
|
+
.filter((line) => line && !line.startsWith("#"));
|
|
58
|
+
for (const line of lines) {
|
|
59
|
+
const match = line.match(/^([A-Z_][A-Z0-9_]*)/);
|
|
60
|
+
if (match) {
|
|
61
|
+
const envVar = match[1];
|
|
62
|
+
// Check against service patterns
|
|
63
|
+
for (const { pattern, service } of SERVICE_PATTERNS) {
|
|
64
|
+
if (pattern.test(envVar)) {
|
|
65
|
+
info.frameworks.push(service);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// File doesn't exist, continue to next
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=dotenv.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dotenv.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/dotenv.parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemfile Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Ruby Gemfile for dependencies and frameworks
|
|
5
|
+
*/
|
|
6
|
+
import type { ProjectInfo } from "../../../types/service-types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Parse Gemfile and extract dependencies and frameworks
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseGemfile(projectPath: string, info: ProjectInfo): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=gemfile.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemfile.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/gemfile.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AA0BnE;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BxF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemfile Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Ruby Gemfile for dependencies and frameworks
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
/** Framework detection mappings for Ruby gems */
|
|
9
|
+
const FRAMEWORK_MAPPINGS = {
|
|
10
|
+
rails: "rails",
|
|
11
|
+
sinatra: "sinatra",
|
|
12
|
+
hanami: "hanami",
|
|
13
|
+
padrino: "padrino",
|
|
14
|
+
grape: "grape",
|
|
15
|
+
roda: "roda",
|
|
16
|
+
rspec: "rspec",
|
|
17
|
+
minitest: "minitest",
|
|
18
|
+
capybara: "capybara",
|
|
19
|
+
devise: "devise",
|
|
20
|
+
activerecord: "activerecord",
|
|
21
|
+
sequel: "sequel",
|
|
22
|
+
sidekiq: "sidekiq",
|
|
23
|
+
puma: "puma",
|
|
24
|
+
unicorn: "unicorn",
|
|
25
|
+
pg: "postgresql",
|
|
26
|
+
mysql2: "mysql",
|
|
27
|
+
redis: "redis",
|
|
28
|
+
mongoid: "mongodb",
|
|
29
|
+
elasticsearch: "elasticsearch",
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Parse Gemfile and extract dependencies and frameworks
|
|
33
|
+
*/
|
|
34
|
+
export async function parseGemfile(projectPath, info) {
|
|
35
|
+
try {
|
|
36
|
+
const gemfilePath = join(projectPath, "Gemfile");
|
|
37
|
+
const content = await readFile(gemfilePath, "utf-8");
|
|
38
|
+
const deps = content
|
|
39
|
+
.split("\n")
|
|
40
|
+
.map((line) => line.trim())
|
|
41
|
+
.filter((line) => line.startsWith("gem ") && !line.startsWith("#"))
|
|
42
|
+
.map((line) => {
|
|
43
|
+
// Extract gem name from: gem 'name' or gem "name"
|
|
44
|
+
const match = line.match(/gem\s+['"]([^'"]+)['"]/);
|
|
45
|
+
return match ? match[1].toLowerCase() : null;
|
|
46
|
+
})
|
|
47
|
+
.filter((dep) => dep !== null);
|
|
48
|
+
info.dependencies.push(...deps);
|
|
49
|
+
// Detect Ruby frameworks
|
|
50
|
+
for (const [dep, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
|
|
51
|
+
// Check exact match or if any dependency starts with the gem name
|
|
52
|
+
// (e.g., "rspec-rails" should match "rspec")
|
|
53
|
+
if (deps.includes(dep) || deps.some((d) => d.startsWith(`${dep}-`))) {
|
|
54
|
+
info.frameworks.push(framework);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// No Gemfile
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=gemfile.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemfile.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/gemfile.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,iDAAiD;AACjD,MAAM,kBAAkB,GAA2B;IACjD,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,cAAc;IAC5B,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,EAAE,EAAE,YAAY;IAChB,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,eAAe;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,IAAiB;IACvE,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAErD,MAAM,IAAI,GAAG,OAAO;aACjB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aAClE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,kDAAkD;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACnD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;QAEhD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAEhC,yBAAyB;QACzB,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAClE,kEAAkE;YAClE,6CAA6C;YAC7C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;gBACpE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,aAAa;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pom.xml Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Maven pom.xml files for dependencies and frameworks
|
|
5
|
+
*/
|
|
6
|
+
import type { ProjectInfo } from "../../../types/service-types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Parse pom.xml and extract dependencies and frameworks
|
|
9
|
+
*/
|
|
10
|
+
export declare function parsePomXml(projectPath: string, info: ProjectInfo): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=pom-xml.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pom-xml.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/pom-xml.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AA+BnE;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pom.xml Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Maven pom.xml files for dependencies and frameworks
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
/** Framework detection mappings for Java/Maven dependencies */
|
|
9
|
+
const FRAMEWORK_MAPPINGS = {
|
|
10
|
+
"spring-boot": "spring-boot",
|
|
11
|
+
"spring-framework": "spring",
|
|
12
|
+
"spring-web": "spring",
|
|
13
|
+
"spring-webmvc": "spring",
|
|
14
|
+
hibernate: "hibernate",
|
|
15
|
+
"hibernate-core": "hibernate",
|
|
16
|
+
junit: "junit",
|
|
17
|
+
"junit-jupiter": "junit",
|
|
18
|
+
mockito: "mockito",
|
|
19
|
+
"mockito-core": "mockito",
|
|
20
|
+
lombok: "lombok",
|
|
21
|
+
guava: "guava",
|
|
22
|
+
jackson: "jackson",
|
|
23
|
+
"jackson-databind": "jackson",
|
|
24
|
+
"postgresql-driver": "postgresql",
|
|
25
|
+
"mysql-connector": "mysql",
|
|
26
|
+
h2: "h2",
|
|
27
|
+
kafka: "kafka",
|
|
28
|
+
"kafka-clients": "kafka",
|
|
29
|
+
"spring-kafka": "kafka",
|
|
30
|
+
redis: "redis",
|
|
31
|
+
jedis: "redis",
|
|
32
|
+
lettuce: "redis",
|
|
33
|
+
mongodb: "mongodb",
|
|
34
|
+
"mongodb-driver": "mongodb",
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Parse pom.xml and extract dependencies and frameworks
|
|
38
|
+
*/
|
|
39
|
+
export async function parsePomXml(projectPath, info) {
|
|
40
|
+
try {
|
|
41
|
+
const pomPath = join(projectPath, "pom.xml");
|
|
42
|
+
const content = await readFile(pomPath, "utf-8");
|
|
43
|
+
// Extract dependencies from <dependency> tags
|
|
44
|
+
const dependencyPattern = /<dependency>[\s\S]*?<\/dependency>/g;
|
|
45
|
+
const dependencies = content.match(dependencyPattern) || [];
|
|
46
|
+
for (const dep of dependencies) {
|
|
47
|
+
// Extract artifactId
|
|
48
|
+
const artifactMatch = dep.match(/<artifactId>([^<]+)<\/artifactId>/);
|
|
49
|
+
if (artifactMatch) {
|
|
50
|
+
const artifactId = artifactMatch[1].toLowerCase();
|
|
51
|
+
info.dependencies.push(artifactId);
|
|
52
|
+
// Check if this dependency matches known frameworks
|
|
53
|
+
for (const [pattern, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
|
|
54
|
+
if (artifactId.includes(pattern)) {
|
|
55
|
+
info.frameworks.push(framework);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// No pom.xml
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=pom-xml.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pom-xml.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/pom-xml.parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,+DAA+D;AAC/D,MAAM,kBAAkB,GAA2B;IACjD,aAAa,EAAE,aAAa;IAC5B,kBAAkB,EAAE,QAAQ;IAC5B,YAAY,EAAE,QAAQ;IACtB,eAAe,EAAE,QAAQ;IACzB,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,WAAW;IAC7B,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,OAAO;IACxB,OAAO,EAAE,SAAS;IAClB,cAAc,EAAE,SAAS;IACzB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,kBAAkB,EAAE,SAAS;IAC7B,mBAAmB,EAAE,YAAY;IACjC,iBAAiB,EAAE,OAAO;IAC1B,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,OAAO;IACxB,cAAc,EAAE,OAAO;IACvB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,SAAS;IAClB,gBAAgB,EAAE,SAAS;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,IAAiB;IACtE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEjD,8CAA8C;QAC9C,MAAM,iBAAiB,GAAG,qCAAqC,CAAC;QAChE,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;QAE5D,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,qBAAqB;YACrB,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACrE,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBAClD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAEnC,oDAAoD;gBACpD,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBACtE,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAChC,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,aAAa;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pyproject.toml Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Python pyproject.toml files for dependencies and frameworks
|
|
5
|
+
* (Modern Python packaging with Poetry, PDM, Hatch, etc.)
|
|
6
|
+
*/
|
|
7
|
+
import type { ProjectInfo } from "../../../types/service-types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Parse pyproject.toml and extract dependencies and frameworks
|
|
10
|
+
*/
|
|
11
|
+
export declare function parsePyprojectToml(projectPath: string, info: ProjectInfo): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=pyproject-toml.parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pyproject-toml.parser.d.ts","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/pyproject-toml.parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAuBnE;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+E9F"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pyproject.toml Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Python pyproject.toml files for dependencies and frameworks
|
|
5
|
+
* (Modern Python packaging with Poetry, PDM, Hatch, etc.)
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from "node:fs/promises";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
/** Framework detection mappings for Python dependencies */
|
|
10
|
+
const FRAMEWORK_MAPPINGS = {
|
|
11
|
+
django: "django",
|
|
12
|
+
flask: "flask",
|
|
13
|
+
fastapi: "fastapi",
|
|
14
|
+
starlette: "starlette",
|
|
15
|
+
pytorch: "pytorch",
|
|
16
|
+
torch: "pytorch",
|
|
17
|
+
tensorflow: "tensorflow",
|
|
18
|
+
pandas: "pandas",
|
|
19
|
+
numpy: "numpy",
|
|
20
|
+
"scikit-learn": "sklearn",
|
|
21
|
+
sklearn: "sklearn",
|
|
22
|
+
pydantic: "pydantic",
|
|
23
|
+
sqlalchemy: "sqlalchemy",
|
|
24
|
+
celery: "celery",
|
|
25
|
+
pytest: "pytest",
|
|
26
|
+
streamlit: "streamlit",
|
|
27
|
+
gradio: "gradio",
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Parse pyproject.toml and extract dependencies and frameworks
|
|
31
|
+
*/
|
|
32
|
+
export async function parsePyprojectToml(projectPath, info) {
|
|
33
|
+
try {
|
|
34
|
+
const pyprojectPath = join(projectPath, "pyproject.toml");
|
|
35
|
+
const content = await readFile(pyprojectPath, "utf-8");
|
|
36
|
+
// Extract dependencies from [tool.poetry.dependencies], [project.dependencies], etc.
|
|
37
|
+
const deps = [];
|
|
38
|
+
// Poetry format: [tool.poetry.dependencies]
|
|
39
|
+
const poetryMatch = content.match(/\[tool\.poetry\.dependencies\]([\s\S]*?)(?=\n\[|$)/);
|
|
40
|
+
if (poetryMatch) {
|
|
41
|
+
const poetryDeps = poetryMatch[1]
|
|
42
|
+
.split("\n")
|
|
43
|
+
.map((line) => line.trim())
|
|
44
|
+
.filter((line) => line && !line.startsWith("#") && line !== "python")
|
|
45
|
+
.map((line) => {
|
|
46
|
+
const match = line.match(/^([a-zA-Z0-9_-]+)/);
|
|
47
|
+
return match ? match[1].toLowerCase() : null;
|
|
48
|
+
})
|
|
49
|
+
.filter((dep) => dep !== null);
|
|
50
|
+
deps.push(...poetryDeps);
|
|
51
|
+
}
|
|
52
|
+
// Poetry dev dependencies: [tool.poetry.dev-dependencies]
|
|
53
|
+
const poetryDevMatch = content.match(/\[tool\.poetry\.dev-dependencies\]([\s\S]*?)(?=\n\[|$)/);
|
|
54
|
+
if (poetryDevMatch) {
|
|
55
|
+
const poetryDevDeps = poetryDevMatch[1]
|
|
56
|
+
.split("\n")
|
|
57
|
+
.map((line) => line.trim())
|
|
58
|
+
.filter((line) => line && !line.startsWith("#"))
|
|
59
|
+
.map((line) => {
|
|
60
|
+
const match = line.match(/^([a-zA-Z0-9_-]+)/);
|
|
61
|
+
return match ? match[1].toLowerCase() : null;
|
|
62
|
+
})
|
|
63
|
+
.filter((dep) => dep !== null);
|
|
64
|
+
deps.push(...poetryDevDeps);
|
|
65
|
+
}
|
|
66
|
+
// PEP 621 format: [project.dependencies]
|
|
67
|
+
const projectMatch = content.match(/\[project\.dependencies\]([\s\S]*?)(?=\n\[|$)/);
|
|
68
|
+
if (!projectMatch) {
|
|
69
|
+
// Try inline array format: dependencies = ["package1", "package2"]
|
|
70
|
+
const inlineMatch = content.match(/dependencies\s*=\s*\[([\s\S]*?)\]/);
|
|
71
|
+
if (inlineMatch) {
|
|
72
|
+
const inlineDeps = inlineMatch[1]
|
|
73
|
+
.split(",")
|
|
74
|
+
.map((line) => line.trim())
|
|
75
|
+
.filter((line) => line && !line.startsWith("#"))
|
|
76
|
+
.map((line) => {
|
|
77
|
+
const match = line.match(/['"]([a-zA-Z0-9_-]+)/);
|
|
78
|
+
return match ? match[1].toLowerCase() : null;
|
|
79
|
+
})
|
|
80
|
+
.filter((dep) => dep !== null);
|
|
81
|
+
deps.push(...inlineDeps);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const projectDeps = projectMatch[1]
|
|
86
|
+
.split("\n")
|
|
87
|
+
.map((line) => line.trim())
|
|
88
|
+
.filter((line) => line && !line.startsWith("#"))
|
|
89
|
+
.map((line) => {
|
|
90
|
+
const match = line.match(/^['"]?([a-zA-Z0-9_-]+)/);
|
|
91
|
+
return match ? match[1].toLowerCase() : null;
|
|
92
|
+
})
|
|
93
|
+
.filter((dep) => dep !== null);
|
|
94
|
+
deps.push(...projectDeps);
|
|
95
|
+
}
|
|
96
|
+
info.dependencies.push(...deps);
|
|
97
|
+
// Detect Python frameworks
|
|
98
|
+
for (const [dep, framework] of Object.entries(FRAMEWORK_MAPPINGS)) {
|
|
99
|
+
if (deps.includes(dep)) {
|
|
100
|
+
info.frameworks.push(framework);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// No pyproject.toml
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=pyproject-toml.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pyproject-toml.parser.js","sourceRoot":"","sources":["../../../../src/services/analyzer/parsers/pyproject-toml.parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-analyzer.service.d.ts","sourceRoot":"","sources":["../../../src/services/analyzer/project-analyzer.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"project-analyzer.service.d.ts","sourceRoot":"","sources":["../../../src/services/analyzer/project-analyzer.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAahE;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmC9E"}
|
|
@@ -7,8 +7,16 @@ import { readdir } from "node:fs/promises";
|
|
|
7
7
|
import { extname, join } from "node:path";
|
|
8
8
|
import { FILE_SCAN_CONFIG, SKIP_DIRECTORIES } from "../../config/constants.js";
|
|
9
9
|
import { CONFIG_FILE_MAPPINGS, EXTENSION_TO_LANGUAGE } from "../../config/file-mappings.js";
|
|
10
|
+
import { parseBuildGradle } from "./parsers/build-gradle.parser.js";
|
|
11
|
+
import { parseCargoToml } from "./parsers/cargo-toml.parser.js";
|
|
12
|
+
import { parseComposerJson } from "./parsers/composer-json.parser.js";
|
|
13
|
+
import { parseDockerCompose } from "./parsers/docker-compose.parser.js";
|
|
14
|
+
import { parseDotenv } from "./parsers/dotenv.parser.js";
|
|
15
|
+
import { parseGemfile } from "./parsers/gemfile.parser.js";
|
|
10
16
|
import { parseGoMod } from "./parsers/go-mod.parser.js";
|
|
11
17
|
import { parsePackageJson } from "./parsers/package-json.parser.js";
|
|
18
|
+
import { parsePomXml } from "./parsers/pom-xml.parser.js";
|
|
19
|
+
import { parsePyprojectToml } from "./parsers/pyproject-toml.parser.js";
|
|
12
20
|
import { parseRequirementsTxt } from "./parsers/requirements-txt.parser.js";
|
|
13
21
|
/**
|
|
14
22
|
* Analyze a project directory and extract information
|
|
@@ -27,7 +35,15 @@ export async function analyzeProject(projectPath) {
|
|
|
27
35
|
// Parse dependency files
|
|
28
36
|
await parsePackageJson(projectPath, info);
|
|
29
37
|
await parseRequirementsTxt(projectPath, info);
|
|
38
|
+
await parsePyprojectToml(projectPath, info);
|
|
30
39
|
await parseGoMod(projectPath, info);
|
|
40
|
+
await parseCargoToml(projectPath, info);
|
|
41
|
+
await parseComposerJson(projectPath, info);
|
|
42
|
+
await parseGemfile(projectPath, info);
|
|
43
|
+
await parsePomXml(projectPath, info);
|
|
44
|
+
await parseBuildGradle(projectPath, info);
|
|
45
|
+
await parseDotenv(projectPath, info);
|
|
46
|
+
await parseDockerCompose(projectPath, info);
|
|
31
47
|
// Deduplicate
|
|
32
48
|
info.languages = [...new Set(info.languages)];
|
|
33
49
|
info.dependencies = [...new Set(info.dependencies)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-analyzer.service.js","sourceRoot":"","sources":["../../../src/services/analyzer/project-analyzer.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE5F,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,MAAM,IAAI,GAAgB;QACxB,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,EAAE;QACb,YAAY,EAAE,EAAE;QAChB,KAAK,EAAE,EAAE;QACT,UAAU,EAAE,EAAE;KACf,CAAC;IAEF,IAAI,CAAC;QACH,aAAa;QACb,MAAM,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1C,yBAAyB;QACzB,MAAM,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"project-analyzer.service.js","sourceRoot":"","sources":["../../../src/services/analyzer/project-analyzer.service.ts"],"names":[],"mappings":"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"}
|