driftdetect-core 0.4.4 → 0.4.6
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/LICENSE +21 -0
- package/dist/boundaries/boundary-scanner.d.ts.map +1 -1
- package/dist/boundaries/boundary-scanner.js +184 -18
- package/dist/boundaries/boundary-scanner.js.map +1 -1
- package/dist/boundaries/types.d.ts +34 -2
- package/dist/boundaries/types.d.ts.map +1 -1
- package/dist/call-graph/analysis/graph-builder.d.ts +3 -0
- package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -1
- package/dist/call-graph/analysis/graph-builder.js +81 -18
- package/dist/call-graph/analysis/graph-builder.js.map +1 -1
- package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -1
- package/dist/call-graph/extractors/csharp-data-access-extractor.js +10 -5
- package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -1
- package/dist/call-graph/extractors/data-access-extractor.d.ts +16 -2
- package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -1
- package/dist/call-graph/extractors/data-access-extractor.js +114 -5
- package/dist/call-graph/extractors/data-access-extractor.js.map +1 -1
- package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -1
- package/dist/call-graph/extractors/java-data-access-extractor.js +12 -6
- package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -1
- package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -1
- package/dist/call-graph/extractors/php-data-access-extractor.js +12 -6
- package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -1
- package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -1
- package/dist/call-graph/extractors/python-data-access-extractor.js +12 -6
- package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -1
- package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +4 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -1
- package/dist/call-graph/extractors/semantic-data-access-scanner.js +46 -2
- package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -1
- package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -1
- package/dist/call-graph/extractors/typescript-data-access-extractor.js +23 -10
- package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -1
- package/dist/call-graph/index.d.ts +2 -4
- package/dist/call-graph/index.d.ts.map +1 -1
- package/dist/call-graph/index.js +5 -6
- package/dist/call-graph/index.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -5
- package/dist/index.js.map +1 -1
- package/dist/language-intelligence/base-normalizer.d.ts +68 -0
- package/dist/language-intelligence/base-normalizer.d.ts.map +1 -0
- package/dist/language-intelligence/base-normalizer.js +210 -0
- package/dist/language-intelligence/base-normalizer.js.map +1 -0
- package/dist/language-intelligence/framework-registry.d.ts +89 -0
- package/dist/language-intelligence/framework-registry.d.ts.map +1 -0
- package/dist/language-intelligence/framework-registry.js +165 -0
- package/dist/language-intelligence/framework-registry.js.map +1 -0
- package/dist/language-intelligence/frameworks/aspnet.d.ts +11 -0
- package/dist/language-intelligence/frameworks/aspnet.d.ts.map +1 -0
- package/dist/language-intelligence/frameworks/aspnet.js +325 -0
- package/dist/language-intelligence/frameworks/aspnet.js.map +1 -0
- package/dist/language-intelligence/frameworks/fastapi.d.ts +11 -0
- package/dist/language-intelligence/frameworks/fastapi.d.ts.map +1 -0
- package/dist/language-intelligence/frameworks/fastapi.js +188 -0
- package/dist/language-intelligence/frameworks/fastapi.js.map +1 -0
- package/dist/language-intelligence/frameworks/index.d.ts +32 -0
- package/dist/language-intelligence/frameworks/index.d.ts.map +1 -0
- package/dist/language-intelligence/frameworks/index.js +51 -0
- package/dist/language-intelligence/frameworks/index.js.map +1 -0
- package/dist/language-intelligence/frameworks/laravel.d.ts +12 -0
- package/dist/language-intelligence/frameworks/laravel.d.ts.map +1 -0
- package/dist/language-intelligence/frameworks/laravel.js +194 -0
- package/dist/language-intelligence/frameworks/laravel.js.map +1 -0
- package/dist/language-intelligence/frameworks/nestjs.d.ts +11 -0
- package/dist/language-intelligence/frameworks/nestjs.d.ts.map +1 -0
- package/dist/language-intelligence/frameworks/nestjs.js +307 -0
- package/dist/language-intelligence/frameworks/nestjs.js.map +1 -0
- package/dist/language-intelligence/frameworks/spring.d.ts +11 -0
- package/dist/language-intelligence/frameworks/spring.d.ts.map +1 -0
- package/dist/language-intelligence/frameworks/spring.js +369 -0
- package/dist/language-intelligence/frameworks/spring.js.map +1 -0
- package/dist/language-intelligence/index.d.ts +33 -0
- package/dist/language-intelligence/index.d.ts.map +1 -0
- package/dist/language-intelligence/index.js +37 -0
- package/dist/language-intelligence/index.js.map +1 -0
- package/dist/language-intelligence/language-intelligence.d.ts +99 -0
- package/dist/language-intelligence/language-intelligence.d.ts.map +1 -0
- package/dist/language-intelligence/language-intelligence.js +239 -0
- package/dist/language-intelligence/language-intelligence.js.map +1 -0
- package/dist/language-intelligence/normalizers/csharp-normalizer.d.ts +39 -0
- package/dist/language-intelligence/normalizers/csharp-normalizer.d.ts.map +1 -0
- package/dist/language-intelligence/normalizers/csharp-normalizer.js +86 -0
- package/dist/language-intelligence/normalizers/csharp-normalizer.js.map +1 -0
- package/dist/language-intelligence/normalizers/index.d.ts +25 -0
- package/dist/language-intelligence/normalizers/index.d.ts.map +1 -0
- package/dist/language-intelligence/normalizers/index.js +60 -0
- package/dist/language-intelligence/normalizers/index.js.map +1 -0
- package/dist/language-intelligence/normalizers/java-normalizer.d.ts +39 -0
- package/dist/language-intelligence/normalizers/java-normalizer.d.ts.map +1 -0
- package/dist/language-intelligence/normalizers/java-normalizer.js +96 -0
- package/dist/language-intelligence/normalizers/java-normalizer.js.map +1 -0
- package/dist/language-intelligence/normalizers/php-normalizer.d.ts +39 -0
- package/dist/language-intelligence/normalizers/php-normalizer.d.ts.map +1 -0
- package/dist/language-intelligence/normalizers/php-normalizer.js +86 -0
- package/dist/language-intelligence/normalizers/php-normalizer.js.map +1 -0
- package/dist/language-intelligence/normalizers/python-normalizer.d.ts +39 -0
- package/dist/language-intelligence/normalizers/python-normalizer.d.ts.map +1 -0
- package/dist/language-intelligence/normalizers/python-normalizer.js +95 -0
- package/dist/language-intelligence/normalizers/python-normalizer.js.map +1 -0
- package/dist/language-intelligence/normalizers/typescript-normalizer.d.ts +39 -0
- package/dist/language-intelligence/normalizers/typescript-normalizer.d.ts.map +1 -0
- package/dist/language-intelligence/normalizers/typescript-normalizer.js +84 -0
- package/dist/language-intelligence/normalizers/typescript-normalizer.js.map +1 -0
- package/dist/language-intelligence/types.d.ts +270 -0
- package/dist/language-intelligence/types.d.ts.map +1 -0
- package/dist/language-intelligence/types.js +9 -0
- package/dist/language-intelligence/types.js.map +1 -0
- package/dist/scanner/file-processor-worker.d.ts +66 -0
- package/dist/scanner/file-processor-worker.d.ts.map +1 -0
- package/dist/scanner/file-processor-worker.js +189 -0
- package/dist/scanner/file-processor-worker.js.map +1 -0
- package/dist/scanner/index.d.ts +2 -0
- package/dist/scanner/index.d.ts.map +1 -1
- package/dist/scanner/index.js +2 -0
- package/dist/scanner/index.js.map +1 -1
- package/dist/scanner/threaded-worker-pool.d.ts +182 -0
- package/dist/scanner/threaded-worker-pool.d.ts.map +1 -0
- package/dist/scanner/threaded-worker-pool.js +243 -0
- package/dist/scanner/threaded-worker-pool.js.map +1 -0
- package/dist/store/types.d.ts +6 -3
- package/dist/store/types.d.ts.map +1 -1
- package/dist/store/types.js.map +1 -1
- package/dist/unified-provider/compat/index.d.ts +11 -0
- package/dist/unified-provider/compat/index.d.ts.map +1 -0
- package/dist/unified-provider/compat/index.js +13 -0
- package/dist/unified-provider/compat/index.js.map +1 -0
- package/dist/unified-provider/compat/legacy-extractors.d.ts +63 -0
- package/dist/unified-provider/compat/legacy-extractors.d.ts.map +1 -0
- package/dist/unified-provider/compat/legacy-extractors.js +80 -0
- package/dist/unified-provider/compat/legacy-extractors.js.map +1 -0
- package/dist/unified-provider/compat/legacy-scanner.d.ts +28 -0
- package/dist/unified-provider/compat/legacy-scanner.d.ts.map +1 -0
- package/dist/unified-provider/compat/legacy-scanner.js +31 -0
- package/dist/unified-provider/compat/legacy-scanner.js.map +1 -0
- package/dist/unified-provider/index.d.ts +28 -0
- package/dist/unified-provider/index.d.ts.map +1 -0
- package/dist/unified-provider/index.js +47 -0
- package/dist/unified-provider/index.js.map +1 -0
- package/dist/unified-provider/integration/index.d.ts +9 -0
- package/dist/unified-provider/integration/index.d.ts.map +1 -0
- package/dist/unified-provider/integration/index.js +11 -0
- package/dist/unified-provider/integration/index.js.map +1 -0
- package/dist/unified-provider/integration/unified-data-access-adapter.d.ts +75 -0
- package/dist/unified-provider/integration/unified-data-access-adapter.d.ts.map +1 -0
- package/dist/unified-provider/integration/unified-data-access-adapter.js +210 -0
- package/dist/unified-provider/integration/unified-data-access-adapter.js.map +1 -0
- package/dist/unified-provider/integration/unified-scanner.d.ts +90 -0
- package/dist/unified-provider/integration/unified-scanner.d.ts.map +1 -0
- package/dist/unified-provider/integration/unified-scanner.js +369 -0
- package/dist/unified-provider/integration/unified-scanner.js.map +1 -0
- package/dist/unified-provider/matching/base-matcher.d.ts +80 -0
- package/dist/unified-provider/matching/base-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/base-matcher.js +196 -0
- package/dist/unified-provider/matching/base-matcher.js.map +1 -0
- package/dist/unified-provider/matching/django-matcher.d.ts +32 -0
- package/dist/unified-provider/matching/django-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/django-matcher.js +107 -0
- package/dist/unified-provider/matching/django-matcher.js.map +1 -0
- package/dist/unified-provider/matching/drizzle-matcher.d.ts +25 -0
- package/dist/unified-provider/matching/drizzle-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/drizzle-matcher.js +123 -0
- package/dist/unified-provider/matching/drizzle-matcher.js.map +1 -0
- package/dist/unified-provider/matching/efcore-matcher.d.ts +27 -0
- package/dist/unified-provider/matching/efcore-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/efcore-matcher.js +88 -0
- package/dist/unified-provider/matching/efcore-matcher.js.map +1 -0
- package/dist/unified-provider/matching/eloquent-matcher.d.ts +32 -0
- package/dist/unified-provider/matching/eloquent-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/eloquent-matcher.js +162 -0
- package/dist/unified-provider/matching/eloquent-matcher.js.map +1 -0
- package/dist/unified-provider/matching/index.d.ts +19 -0
- package/dist/unified-provider/matching/index.d.ts.map +1 -0
- package/dist/unified-provider/matching/index.js +24 -0
- package/dist/unified-provider/matching/index.js.map +1 -0
- package/dist/unified-provider/matching/knex-matcher.d.ts +26 -0
- package/dist/unified-provider/matching/knex-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/knex-matcher.js +109 -0
- package/dist/unified-provider/matching/knex-matcher.js.map +1 -0
- package/dist/unified-provider/matching/matcher-registry.d.ts +55 -0
- package/dist/unified-provider/matching/matcher-registry.d.ts.map +1 -0
- package/dist/unified-provider/matching/matcher-registry.js +130 -0
- package/dist/unified-provider/matching/matcher-registry.js.map +1 -0
- package/dist/unified-provider/matching/mongoose-matcher.d.ts +30 -0
- package/dist/unified-provider/matching/mongoose-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/mongoose-matcher.js +132 -0
- package/dist/unified-provider/matching/mongoose-matcher.js.map +1 -0
- package/dist/unified-provider/matching/prisma-matcher.d.ts +31 -0
- package/dist/unified-provider/matching/prisma-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/prisma-matcher.js +123 -0
- package/dist/unified-provider/matching/prisma-matcher.js.map +1 -0
- package/dist/unified-provider/matching/raw-sql-matcher.d.ts +31 -0
- package/dist/unified-provider/matching/raw-sql-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/raw-sql-matcher.js +173 -0
- package/dist/unified-provider/matching/raw-sql-matcher.js.map +1 -0
- package/dist/unified-provider/matching/sequelize-matcher.d.ts +28 -0
- package/dist/unified-provider/matching/sequelize-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/sequelize-matcher.js +132 -0
- package/dist/unified-provider/matching/sequelize-matcher.js.map +1 -0
- package/dist/unified-provider/matching/spring-data-matcher.d.ts +32 -0
- package/dist/unified-provider/matching/spring-data-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/spring-data-matcher.js +112 -0
- package/dist/unified-provider/matching/spring-data-matcher.js.map +1 -0
- package/dist/unified-provider/matching/sqlalchemy-matcher.d.ts +32 -0
- package/dist/unified-provider/matching/sqlalchemy-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/sqlalchemy-matcher.js +201 -0
- package/dist/unified-provider/matching/sqlalchemy-matcher.js.map +1 -0
- package/dist/unified-provider/matching/supabase-matcher.d.ts +27 -0
- package/dist/unified-provider/matching/supabase-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/supabase-matcher.js +122 -0
- package/dist/unified-provider/matching/supabase-matcher.js.map +1 -0
- package/dist/unified-provider/matching/typeorm-matcher.d.ts +32 -0
- package/dist/unified-provider/matching/typeorm-matcher.d.ts.map +1 -0
- package/dist/unified-provider/matching/typeorm-matcher.js +169 -0
- package/dist/unified-provider/matching/typeorm-matcher.js.map +1 -0
- package/dist/unified-provider/migration/deprecated-extractors.d.ts +104 -0
- package/dist/unified-provider/migration/deprecated-extractors.d.ts.map +1 -0
- package/dist/unified-provider/migration/deprecated-extractors.js +129 -0
- package/dist/unified-provider/migration/deprecated-extractors.js.map +1 -0
- package/dist/unified-provider/migration/deprecated-scanner.d.ts +40 -0
- package/dist/unified-provider/migration/deprecated-scanner.d.ts.map +1 -0
- package/dist/unified-provider/migration/deprecated-scanner.js +49 -0
- package/dist/unified-provider/migration/deprecated-scanner.js.map +1 -0
- package/dist/unified-provider/migration/index.d.ts +41 -0
- package/dist/unified-provider/migration/index.d.ts.map +1 -0
- package/dist/unified-provider/migration/index.js +43 -0
- package/dist/unified-provider/migration/index.js.map +1 -0
- package/dist/unified-provider/normalization/base-normalizer.d.ts +188 -0
- package/dist/unified-provider/normalization/base-normalizer.d.ts.map +1 -0
- package/dist/unified-provider/normalization/base-normalizer.js +339 -0
- package/dist/unified-provider/normalization/base-normalizer.js.map +1 -0
- package/dist/unified-provider/normalization/csharp-normalizer.d.ts +58 -0
- package/dist/unified-provider/normalization/csharp-normalizer.d.ts.map +1 -0
- package/dist/unified-provider/normalization/csharp-normalizer.js +467 -0
- package/dist/unified-provider/normalization/csharp-normalizer.js.map +1 -0
- package/dist/unified-provider/normalization/index.d.ts +23 -0
- package/dist/unified-provider/normalization/index.d.ts.map +1 -0
- package/dist/unified-provider/normalization/index.js +62 -0
- package/dist/unified-provider/normalization/index.js.map +1 -0
- package/dist/unified-provider/normalization/java-normalizer.d.ts +54 -0
- package/dist/unified-provider/normalization/java-normalizer.d.ts.map +1 -0
- package/dist/unified-provider/normalization/java-normalizer.js +453 -0
- package/dist/unified-provider/normalization/java-normalizer.js.map +1 -0
- package/dist/unified-provider/normalization/php-normalizer.d.ts +54 -0
- package/dist/unified-provider/normalization/php-normalizer.d.ts.map +1 -0
- package/dist/unified-provider/normalization/php-normalizer.js +489 -0
- package/dist/unified-provider/normalization/php-normalizer.js.map +1 -0
- package/dist/unified-provider/normalization/python-normalizer.d.ts +61 -0
- package/dist/unified-provider/normalization/python-normalizer.d.ts.map +1 -0
- package/dist/unified-provider/normalization/python-normalizer.js +548 -0
- package/dist/unified-provider/normalization/python-normalizer.js.map +1 -0
- package/dist/unified-provider/normalization/typescript-normalizer.d.ts +60 -0
- package/dist/unified-provider/normalization/typescript-normalizer.d.ts.map +1 -0
- package/dist/unified-provider/normalization/typescript-normalizer.js +608 -0
- package/dist/unified-provider/normalization/typescript-normalizer.js.map +1 -0
- package/dist/unified-provider/parsing/index.d.ts +5 -0
- package/dist/unified-provider/parsing/index.d.ts.map +1 -0
- package/dist/unified-provider/parsing/index.js +5 -0
- package/dist/unified-provider/parsing/index.js.map +1 -0
- package/dist/unified-provider/parsing/parser-registry.d.ts +70 -0
- package/dist/unified-provider/parsing/parser-registry.d.ts.map +1 -0
- package/dist/unified-provider/parsing/parser-registry.js +260 -0
- package/dist/unified-provider/parsing/parser-registry.js.map +1 -0
- package/dist/unified-provider/provider/index.d.ts +5 -0
- package/dist/unified-provider/provider/index.d.ts.map +1 -0
- package/dist/unified-provider/provider/index.js +5 -0
- package/dist/unified-provider/provider/index.js.map +1 -0
- package/dist/unified-provider/provider/unified-language-provider.d.ts +56 -0
- package/dist/unified-provider/provider/unified-language-provider.d.ts.map +1 -0
- package/dist/unified-provider/provider/unified-language-provider.js +212 -0
- package/dist/unified-provider/provider/unified-language-provider.js.map +1 -0
- package/dist/unified-provider/types.d.ts +389 -0
- package/dist/unified-provider/types.d.ts.map +1 -0
- package/dist/unified-provider/types.js +9 -0
- package/dist/unified-provider/types.js.map +1 -0
- package/package.json +21 -17
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language Intelligence
|
|
3
|
+
*
|
|
4
|
+
* Main entry point for the Language Intelligence Layer.
|
|
5
|
+
* Provides cross-language semantic queries and normalization.
|
|
6
|
+
*/
|
|
7
|
+
import { registerAllFrameworks } from './frameworks/index.js';
|
|
8
|
+
import { createAllNormalizers, getNormalizerForFile } from './normalizers/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Language Intelligence
|
|
11
|
+
*
|
|
12
|
+
* Unified interface for cross-language semantic analysis.
|
|
13
|
+
*/
|
|
14
|
+
export class LanguageIntelligence {
|
|
15
|
+
config;
|
|
16
|
+
normalizers;
|
|
17
|
+
initialized = false;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
this.normalizers = new Map();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the configuration
|
|
24
|
+
*/
|
|
25
|
+
getConfig() {
|
|
26
|
+
return this.config;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Initialize the Language Intelligence system
|
|
30
|
+
* Registers all framework patterns and creates normalizers
|
|
31
|
+
*/
|
|
32
|
+
initialize() {
|
|
33
|
+
if (this.initialized)
|
|
34
|
+
return;
|
|
35
|
+
// Register all built-in framework patterns
|
|
36
|
+
registerAllFrameworks();
|
|
37
|
+
// Create normalizers for all supported languages
|
|
38
|
+
for (const normalizer of createAllNormalizers()) {
|
|
39
|
+
this.normalizers.set(normalizer.language, normalizer);
|
|
40
|
+
}
|
|
41
|
+
this.initialized = true;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Normalize a single file
|
|
45
|
+
*/
|
|
46
|
+
normalizeFile(source, filePath) {
|
|
47
|
+
this.ensureInitialized();
|
|
48
|
+
const normalizer = getNormalizerForFile(filePath);
|
|
49
|
+
if (!normalizer) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return normalizer.normalize(source, filePath);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Find all entry points across files
|
|
56
|
+
*
|
|
57
|
+
* Entry points are functions marked as HTTP endpoints, event handlers,
|
|
58
|
+
* scheduled tasks, CLI commands, etc.
|
|
59
|
+
*/
|
|
60
|
+
findEntryPoints(files) {
|
|
61
|
+
return files.flatMap(f => f.functions.filter(fn => fn.semantics.isEntryPoint));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Find all data accessors across files
|
|
65
|
+
*
|
|
66
|
+
* Data accessors are functions that read from or write to databases.
|
|
67
|
+
* Optionally filter by table name.
|
|
68
|
+
*/
|
|
69
|
+
findDataAccessors(files, table) {
|
|
70
|
+
return files.flatMap(f => f.functions.filter(fn => {
|
|
71
|
+
if (!fn.semantics.isDataAccessor)
|
|
72
|
+
return false;
|
|
73
|
+
if (table) {
|
|
74
|
+
return fn.semantics.dataAccess.some(da => da.table === table);
|
|
75
|
+
}
|
|
76
|
+
return true;
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Find all injectable services across files
|
|
81
|
+
*/
|
|
82
|
+
findInjectables(files) {
|
|
83
|
+
return files.flatMap(f => f.functions.filter(fn => fn.semantics.isInjectable));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Find all auth handlers across files
|
|
87
|
+
*/
|
|
88
|
+
findAuthHandlers(files) {
|
|
89
|
+
return files.flatMap(f => f.functions.filter(fn => fn.semantics.isAuthHandler));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Find all test cases across files
|
|
93
|
+
*/
|
|
94
|
+
findTestCases(files) {
|
|
95
|
+
return files.flatMap(f => f.functions.filter(fn => fn.semantics.isTestCase));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Find functions by decorator category
|
|
99
|
+
*/
|
|
100
|
+
findByCategory(files, category) {
|
|
101
|
+
return files.flatMap(f => f.functions.filter(fn => fn.normalizedDecorators.some(d => d.semantic.category === category)));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Find functions by framework
|
|
105
|
+
*/
|
|
106
|
+
findByFramework(files, framework) {
|
|
107
|
+
return files.flatMap(f => f.functions.filter(fn => fn.normalizedDecorators.some(d => d.framework === framework)));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* General query across files
|
|
111
|
+
*/
|
|
112
|
+
query(files, options) {
|
|
113
|
+
let functions = files.flatMap(f => f.functions);
|
|
114
|
+
// Apply filters
|
|
115
|
+
if (options.category) {
|
|
116
|
+
functions = functions.filter(fn => fn.normalizedDecorators.some(d => d.semantic.category === options.category));
|
|
117
|
+
}
|
|
118
|
+
if (options.framework) {
|
|
119
|
+
functions = functions.filter(fn => fn.normalizedDecorators.some(d => d.framework === options.framework));
|
|
120
|
+
}
|
|
121
|
+
if (options.language) {
|
|
122
|
+
functions = functions.filter(fn => fn.normalizedDecorators.some(d => d.language === options.language));
|
|
123
|
+
}
|
|
124
|
+
if (options.entryPointsOnly) {
|
|
125
|
+
functions = functions.filter(fn => fn.semantics.isEntryPoint);
|
|
126
|
+
}
|
|
127
|
+
if (options.dataAccessorsOnly) {
|
|
128
|
+
functions = functions.filter(fn => fn.semantics.isDataAccessor);
|
|
129
|
+
}
|
|
130
|
+
if (options.authRequiredOnly) {
|
|
131
|
+
functions = functions.filter(fn => fn.normalizedDecorators.some(d => d.semantic.requiresAuth));
|
|
132
|
+
}
|
|
133
|
+
if (options.table) {
|
|
134
|
+
functions = functions.filter(fn => fn.semantics.dataAccess.some(da => da.table === options.table));
|
|
135
|
+
}
|
|
136
|
+
// Collect metadata
|
|
137
|
+
const filesSet = new Set();
|
|
138
|
+
const frameworksSet = new Set();
|
|
139
|
+
const languagesSet = new Set();
|
|
140
|
+
for (const fn of functions) {
|
|
141
|
+
for (const d of fn.normalizedDecorators) {
|
|
142
|
+
if (d.framework)
|
|
143
|
+
frameworksSet.add(d.framework);
|
|
144
|
+
languagesSet.add(d.language);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Get file paths from the original files
|
|
148
|
+
for (const file of files) {
|
|
149
|
+
if (file.functions.some(fn => functions.includes(fn))) {
|
|
150
|
+
filesSet.add(file.file);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
functions,
|
|
155
|
+
files: Array.from(filesSet),
|
|
156
|
+
frameworks: Array.from(frameworksSet),
|
|
157
|
+
languages: Array.from(languagesSet),
|
|
158
|
+
count: functions.length,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Explain what a decorator means
|
|
163
|
+
*
|
|
164
|
+
* Returns semantic information about a decorator string.
|
|
165
|
+
*/
|
|
166
|
+
explainDecorator(decorator, language) {
|
|
167
|
+
this.ensureInitialized();
|
|
168
|
+
const normalizer = this.normalizers.get(language);
|
|
169
|
+
if (!normalizer)
|
|
170
|
+
return null;
|
|
171
|
+
const frameworks = normalizer.detectFrameworks(''); // Empty source, just use all registered
|
|
172
|
+
const normalized = normalizer.normalizeDecorator(decorator, frameworks);
|
|
173
|
+
return normalized.semantic.category !== 'unknown' ? normalized.semantic : null;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get summary statistics for normalized files
|
|
177
|
+
*/
|
|
178
|
+
getSummary(files) {
|
|
179
|
+
const byFramework = {};
|
|
180
|
+
const byLanguage = {};
|
|
181
|
+
const byCategory = {};
|
|
182
|
+
let totalFunctions = 0;
|
|
183
|
+
let entryPoints = 0;
|
|
184
|
+
let dataAccessors = 0;
|
|
185
|
+
let injectables = 0;
|
|
186
|
+
let authHandlers = 0;
|
|
187
|
+
let testCases = 0;
|
|
188
|
+
for (const file of files) {
|
|
189
|
+
for (const fn of file.functions) {
|
|
190
|
+
totalFunctions++;
|
|
191
|
+
if (fn.semantics.isEntryPoint)
|
|
192
|
+
entryPoints++;
|
|
193
|
+
if (fn.semantics.isDataAccessor)
|
|
194
|
+
dataAccessors++;
|
|
195
|
+
if (fn.semantics.isInjectable)
|
|
196
|
+
injectables++;
|
|
197
|
+
if (fn.semantics.isAuthHandler)
|
|
198
|
+
authHandlers++;
|
|
199
|
+
if (fn.semantics.isTestCase)
|
|
200
|
+
testCases++;
|
|
201
|
+
for (const d of fn.normalizedDecorators) {
|
|
202
|
+
if (d.framework) {
|
|
203
|
+
byFramework[d.framework] = (byFramework[d.framework] ?? 0) + 1;
|
|
204
|
+
}
|
|
205
|
+
byLanguage[d.language] = (byLanguage[d.language] ?? 0) + 1;
|
|
206
|
+
byCategory[d.semantic.category] = (byCategory[d.semantic.category] ?? 0) + 1;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
totalFunctions,
|
|
212
|
+
entryPoints,
|
|
213
|
+
dataAccessors,
|
|
214
|
+
injectables,
|
|
215
|
+
authHandlers,
|
|
216
|
+
testCases,
|
|
217
|
+
byFramework,
|
|
218
|
+
byLanguage,
|
|
219
|
+
byCategory,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Ensure the system is initialized
|
|
224
|
+
*/
|
|
225
|
+
ensureInitialized() {
|
|
226
|
+
if (!this.initialized) {
|
|
227
|
+
this.initialize();
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Create a new LanguageIntelligence instance
|
|
233
|
+
*/
|
|
234
|
+
export function createLanguageIntelligence(config) {
|
|
235
|
+
const intelligence = new LanguageIntelligence(config);
|
|
236
|
+
intelligence.initialize();
|
|
237
|
+
return intelligence;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=language-intelligence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-intelligence.js","sourceRoot":"","sources":["../../src/language-intelligence/language-intelligence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C# Language Normalizer
|
|
3
|
+
*
|
|
4
|
+
* Wraps the existing CSharpCallGraphExtractor and adds semantic normalization.
|
|
5
|
+
* Supports ASP.NET Core framework patterns.
|
|
6
|
+
*/
|
|
7
|
+
import type { CallGraphLanguage, FileExtractionResult, FunctionExtraction } from '../../call-graph/types.js';
|
|
8
|
+
import { BaseLanguageNormalizer } from '../base-normalizer.js';
|
|
9
|
+
import type { NormalizedDecorator, DecoratorArguments } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* C# language normalizer
|
|
12
|
+
*/
|
|
13
|
+
export declare class CSharpNormalizer extends BaseLanguageNormalizer {
|
|
14
|
+
readonly language: CallGraphLanguage;
|
|
15
|
+
readonly extensions: string[];
|
|
16
|
+
private extractor;
|
|
17
|
+
/**
|
|
18
|
+
* Extract raw data using the existing C# extractor
|
|
19
|
+
*/
|
|
20
|
+
protected extractRaw(source: string, filePath: string): FileExtractionResult;
|
|
21
|
+
/**
|
|
22
|
+
* Extract decorator name from C# attribute
|
|
23
|
+
* C# attributes: [Attribute] or [Attribute(...)]
|
|
24
|
+
*/
|
|
25
|
+
protected extractDecoratorName(raw: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Extract generic arguments from C# attribute
|
|
28
|
+
*/
|
|
29
|
+
protected extractGenericArguments(raw: string): DecoratorArguments;
|
|
30
|
+
/**
|
|
31
|
+
* Extract dependencies from constructor parameters (ASP.NET Core DI pattern)
|
|
32
|
+
*/
|
|
33
|
+
protected extractDependencies(fn: FunctionExtraction, _decorators: NormalizedDecorator[]): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Check if a type is primitive or common C# type
|
|
36
|
+
*/
|
|
37
|
+
private isPrimitiveOrCommon;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=csharp-normalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csharp-normalizer.d.ts","sourceRoot":"","sources":["../../../src/language-intelligence/normalizers/csharp-normalizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE7G,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE3E;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,sBAAsB;IAC1D,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAY;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAW;IAExC,OAAO,CAAC,SAAS,CAAkC;IAEnD;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,oBAAoB;IAI5E;;;OAGG;cACgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAS5D;;OAEG;cACgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAkB3E;;OAEG;cACgB,mBAAmB,CACpC,EAAE,EAAE,kBAAkB,EACtB,WAAW,EAAE,mBAAmB,EAAE,GACjC,MAAM,EAAE;IAoBX;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAW5B"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* C# Language Normalizer
|
|
3
|
+
*
|
|
4
|
+
* Wraps the existing CSharpCallGraphExtractor and adds semantic normalization.
|
|
5
|
+
* Supports ASP.NET Core framework patterns.
|
|
6
|
+
*/
|
|
7
|
+
import { CSharpCallGraphExtractor } from '../../call-graph/extractors/csharp-extractor.js';
|
|
8
|
+
import { BaseLanguageNormalizer } from '../base-normalizer.js';
|
|
9
|
+
/**
|
|
10
|
+
* C# language normalizer
|
|
11
|
+
*/
|
|
12
|
+
export class CSharpNormalizer extends BaseLanguageNormalizer {
|
|
13
|
+
language = 'csharp';
|
|
14
|
+
extensions = ['.cs'];
|
|
15
|
+
extractor = new CSharpCallGraphExtractor();
|
|
16
|
+
/**
|
|
17
|
+
* Extract raw data using the existing C# extractor
|
|
18
|
+
*/
|
|
19
|
+
extractRaw(source, filePath) {
|
|
20
|
+
return this.extractor.extract(source, filePath);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Extract decorator name from C# attribute
|
|
24
|
+
* C# attributes: [Attribute] or [Attribute(...)]
|
|
25
|
+
*/
|
|
26
|
+
extractDecoratorName(raw) {
|
|
27
|
+
// Remove brackets and any arguments
|
|
28
|
+
return raw
|
|
29
|
+
.replace(/^\[/, '')
|
|
30
|
+
.replace(/\]$/, '')
|
|
31
|
+
.replace(/\(.*$/, '')
|
|
32
|
+
.trim();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Extract generic arguments from C# attribute
|
|
36
|
+
*/
|
|
37
|
+
extractGenericArguments(raw) {
|
|
38
|
+
const args = {};
|
|
39
|
+
// Extract string value: [Attribute("value")] or [Route("path")]
|
|
40
|
+
const valueMatch = raw.match(/\(\s*["']([^"']+)["']/);
|
|
41
|
+
if (valueMatch && valueMatch[1] !== undefined) {
|
|
42
|
+
args.path = valueMatch[1];
|
|
43
|
+
}
|
|
44
|
+
// Extract named parameters: [Authorize(Roles = "Admin")]
|
|
45
|
+
const rolesMatch = raw.match(/Roles\s*=\s*["']([^"']+)["']/);
|
|
46
|
+
if (rolesMatch && rolesMatch[1]) {
|
|
47
|
+
args.roles = rolesMatch[1].split(',').map(r => r.trim());
|
|
48
|
+
}
|
|
49
|
+
return args;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Extract dependencies from constructor parameters (ASP.NET Core DI pattern)
|
|
53
|
+
*/
|
|
54
|
+
extractDependencies(fn, _decorators) {
|
|
55
|
+
const deps = [];
|
|
56
|
+
// In ASP.NET Core, constructor injection is the primary DI pattern
|
|
57
|
+
if (fn.isConstructor && fn.parameters.length > 0) {
|
|
58
|
+
for (const param of fn.parameters) {
|
|
59
|
+
if (param.type && !this.isPrimitiveOrCommon(param.type)) {
|
|
60
|
+
// Extract interface name (IUserService -> UserService)
|
|
61
|
+
const typeName = param.type
|
|
62
|
+
.replace(/<.*>/, '') // Remove generics
|
|
63
|
+
.replace(/^I(?=[A-Z])/, '') // Remove I prefix from interfaces
|
|
64
|
+
.trim();
|
|
65
|
+
deps.push(typeName);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return [...new Set(deps)]; // Deduplicate
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if a type is primitive or common C# type
|
|
73
|
+
*/
|
|
74
|
+
isPrimitiveOrCommon(type) {
|
|
75
|
+
const primitives = [
|
|
76
|
+
'int', 'long', 'short', 'byte', 'float', 'double', 'decimal', 'bool', 'char',
|
|
77
|
+
'Int32', 'Int64', 'Int16', 'Byte', 'Single', 'Double', 'Decimal', 'Boolean', 'Char',
|
|
78
|
+
'string', 'String', 'object', 'Object', 'void', 'Void',
|
|
79
|
+
'List', 'Dictionary', 'HashSet', 'IEnumerable', 'IList', 'IDictionary',
|
|
80
|
+
'Task', 'ValueTask', 'CancellationToken',
|
|
81
|
+
'ILogger', 'IConfiguration', 'IOptions',
|
|
82
|
+
];
|
|
83
|
+
return primitives.some(p => type.includes(p));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=csharp-normalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csharp-normalizer.js","sourceRoot":"","sources":["../../../src/language-intelligence/normalizers/csharp-normalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language Normalizers Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all language-specific normalizers.
|
|
5
|
+
*/
|
|
6
|
+
export { JavaNormalizer } from './java-normalizer.js';
|
|
7
|
+
export { PythonNormalizer } from './python-normalizer.js';
|
|
8
|
+
export { TypeScriptNormalizer } from './typescript-normalizer.js';
|
|
9
|
+
export { CSharpNormalizer } from './csharp-normalizer.js';
|
|
10
|
+
export { PhpNormalizer } from './php-normalizer.js';
|
|
11
|
+
import type { CallGraphLanguage } from '../../call-graph/types.js';
|
|
12
|
+
import type { LanguageNormalizer } from '../types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Create a normalizer for a specific language
|
|
15
|
+
*/
|
|
16
|
+
export declare function createNormalizer(language: CallGraphLanguage): LanguageNormalizer | null;
|
|
17
|
+
/**
|
|
18
|
+
* Create all available normalizers
|
|
19
|
+
*/
|
|
20
|
+
export declare function createAllNormalizers(): LanguageNormalizer[];
|
|
21
|
+
/**
|
|
22
|
+
* Get normalizer for a file based on extension
|
|
23
|
+
*/
|
|
24
|
+
export declare function getNormalizerForFile(filePath: string): LanguageNormalizer | null;
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/language-intelligence/normalizers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAOtD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,IAAI,CAgBvF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,kBAAkB,EAAE,CAQ3D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAQhF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language Normalizers Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all language-specific normalizers.
|
|
5
|
+
*/
|
|
6
|
+
export { JavaNormalizer } from './java-normalizer.js';
|
|
7
|
+
export { PythonNormalizer } from './python-normalizer.js';
|
|
8
|
+
export { TypeScriptNormalizer } from './typescript-normalizer.js';
|
|
9
|
+
export { CSharpNormalizer } from './csharp-normalizer.js';
|
|
10
|
+
export { PhpNormalizer } from './php-normalizer.js';
|
|
11
|
+
import { JavaNormalizer } from './java-normalizer.js';
|
|
12
|
+
import { PythonNormalizer } from './python-normalizer.js';
|
|
13
|
+
import { TypeScriptNormalizer } from './typescript-normalizer.js';
|
|
14
|
+
import { CSharpNormalizer } from './csharp-normalizer.js';
|
|
15
|
+
import { PhpNormalizer } from './php-normalizer.js';
|
|
16
|
+
/**
|
|
17
|
+
* Create a normalizer for a specific language
|
|
18
|
+
*/
|
|
19
|
+
export function createNormalizer(language) {
|
|
20
|
+
switch (language) {
|
|
21
|
+
case 'java':
|
|
22
|
+
return new JavaNormalizer();
|
|
23
|
+
case 'python':
|
|
24
|
+
return new PythonNormalizer();
|
|
25
|
+
case 'typescript':
|
|
26
|
+
case 'javascript':
|
|
27
|
+
return new TypeScriptNormalizer();
|
|
28
|
+
case 'csharp':
|
|
29
|
+
return new CSharpNormalizer();
|
|
30
|
+
case 'php':
|
|
31
|
+
return new PhpNormalizer();
|
|
32
|
+
default:
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create all available normalizers
|
|
38
|
+
*/
|
|
39
|
+
export function createAllNormalizers() {
|
|
40
|
+
return [
|
|
41
|
+
new JavaNormalizer(),
|
|
42
|
+
new PythonNormalizer(),
|
|
43
|
+
new TypeScriptNormalizer(),
|
|
44
|
+
new CSharpNormalizer(),
|
|
45
|
+
new PhpNormalizer(),
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get normalizer for a file based on extension
|
|
50
|
+
*/
|
|
51
|
+
export function getNormalizerForFile(filePath) {
|
|
52
|
+
const normalizers = createAllNormalizers();
|
|
53
|
+
for (const normalizer of normalizers) {
|
|
54
|
+
if (normalizer.canHandle(filePath)) {
|
|
55
|
+
return normalizer;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/language-intelligence/normalizers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAA2B;IAC1D,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,IAAI,cAAc,EAAE,CAAC;QAC9B,KAAK,QAAQ;YACX,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAChC,KAAK,YAAY,CAAC;QAClB,KAAK,YAAY;YACf,OAAO,IAAI,oBAAoB,EAAE,CAAC;QACpC,KAAK,QAAQ;YACX,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAChC,KAAK,KAAK;YACR,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,IAAI,cAAc,EAAE;QACpB,IAAI,gBAAgB,EAAE;QACtB,IAAI,oBAAoB,EAAE;QAC1B,IAAI,gBAAgB,EAAE;QACtB,IAAI,aAAa,EAAE;KACpB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,MAAM,WAAW,GAAG,oBAAoB,EAAE,CAAC;IAC3C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Java Language Normalizer
|
|
3
|
+
*
|
|
4
|
+
* Wraps the existing JavaCallGraphExtractor and adds semantic normalization.
|
|
5
|
+
* Supports Spring Boot framework patterns.
|
|
6
|
+
*/
|
|
7
|
+
import type { CallGraphLanguage, FileExtractionResult, FunctionExtraction } from '../../call-graph/types.js';
|
|
8
|
+
import { BaseLanguageNormalizer } from '../base-normalizer.js';
|
|
9
|
+
import type { NormalizedDecorator, DecoratorArguments } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Java language normalizer
|
|
12
|
+
*/
|
|
13
|
+
export declare class JavaNormalizer extends BaseLanguageNormalizer {
|
|
14
|
+
readonly language: CallGraphLanguage;
|
|
15
|
+
readonly extensions: string[];
|
|
16
|
+
private extractor;
|
|
17
|
+
/**
|
|
18
|
+
* Extract raw data using the existing Java extractor
|
|
19
|
+
*/
|
|
20
|
+
protected extractRaw(source: string, filePath: string): FileExtractionResult;
|
|
21
|
+
/**
|
|
22
|
+
* Extract decorator name from Java annotation
|
|
23
|
+
* Java annotations: @Annotation or @Annotation(...)
|
|
24
|
+
*/
|
|
25
|
+
protected extractDecoratorName(raw: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Extract generic arguments from Java annotation
|
|
28
|
+
*/
|
|
29
|
+
protected extractGenericArguments(raw: string): DecoratorArguments;
|
|
30
|
+
/**
|
|
31
|
+
* Extract dependencies from constructor parameters (Spring DI pattern)
|
|
32
|
+
*/
|
|
33
|
+
protected extractDependencies(fn: FunctionExtraction, decorators: NormalizedDecorator[]): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Check if a type is primitive or common Java type
|
|
36
|
+
*/
|
|
37
|
+
private isPrimitiveOrCommon;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=java-normalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"java-normalizer.d.ts","sourceRoot":"","sources":["../../../src/language-intelligence/normalizers/java-normalizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE7G,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE3E;;GAEG;AACH,qBAAa,cAAe,SAAQ,sBAAsB;IACxD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAU;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAa;IAE1C,OAAO,CAAC,SAAS,CAAgC;IAEjD;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,oBAAoB;IAI5E;;;OAGG;cACgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQ5D;;OAEG;cACgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAqB3E;;OAEG;cACgB,mBAAmB,CACpC,EAAE,EAAE,kBAAkB,EACtB,UAAU,EAAE,mBAAmB,EAAE,GAChC,MAAM,EAAE;IA+BX;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAS5B"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Java Language Normalizer
|
|
3
|
+
*
|
|
4
|
+
* Wraps the existing JavaCallGraphExtractor and adds semantic normalization.
|
|
5
|
+
* Supports Spring Boot framework patterns.
|
|
6
|
+
*/
|
|
7
|
+
import { JavaCallGraphExtractor } from '../../call-graph/extractors/java-extractor.js';
|
|
8
|
+
import { BaseLanguageNormalizer } from '../base-normalizer.js';
|
|
9
|
+
/**
|
|
10
|
+
* Java language normalizer
|
|
11
|
+
*/
|
|
12
|
+
export class JavaNormalizer extends BaseLanguageNormalizer {
|
|
13
|
+
language = 'java';
|
|
14
|
+
extensions = ['.java'];
|
|
15
|
+
extractor = new JavaCallGraphExtractor();
|
|
16
|
+
/**
|
|
17
|
+
* Extract raw data using the existing Java extractor
|
|
18
|
+
*/
|
|
19
|
+
extractRaw(source, filePath) {
|
|
20
|
+
return this.extractor.extract(source, filePath);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Extract decorator name from Java annotation
|
|
24
|
+
* Java annotations: @Annotation or @Annotation(...)
|
|
25
|
+
*/
|
|
26
|
+
extractDecoratorName(raw) {
|
|
27
|
+
// Remove @ prefix and any arguments
|
|
28
|
+
return raw
|
|
29
|
+
.replace(/^@/, '')
|
|
30
|
+
.replace(/\(.*$/, '')
|
|
31
|
+
.trim();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Extract generic arguments from Java annotation
|
|
35
|
+
*/
|
|
36
|
+
extractGenericArguments(raw) {
|
|
37
|
+
const args = {};
|
|
38
|
+
// Extract string value: @Annotation("value") or @Annotation(value = "...")
|
|
39
|
+
const valuePatterns = [
|
|
40
|
+
/\(\s*["']([^"']+)["']\s*\)/, // Simple: @Ann("value")
|
|
41
|
+
/value\s*=\s*["']([^"']+)["']/, // Named: @Ann(value = "value")
|
|
42
|
+
/path\s*=\s*["']([^"']+)["']/, // Path: @Ann(path = "/api")
|
|
43
|
+
];
|
|
44
|
+
for (const pattern of valuePatterns) {
|
|
45
|
+
const match = raw.match(pattern);
|
|
46
|
+
if (match && match[1] !== undefined) {
|
|
47
|
+
args.path = match[1];
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return args;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Extract dependencies from constructor parameters (Spring DI pattern)
|
|
55
|
+
*/
|
|
56
|
+
extractDependencies(fn, decorators) {
|
|
57
|
+
const deps = [];
|
|
58
|
+
// In Spring, constructor injection is the primary DI pattern
|
|
59
|
+
// Dependencies are the constructor parameter types
|
|
60
|
+
if (fn.isConstructor && fn.parameters.length > 0) {
|
|
61
|
+
for (const param of fn.parameters) {
|
|
62
|
+
if (param.type) {
|
|
63
|
+
// Extract the type name (handle generics like List<User>)
|
|
64
|
+
const typeName = param.type.replace(/<.*>/, '').trim();
|
|
65
|
+
// Skip primitive types and common Java types
|
|
66
|
+
if (!this.isPrimitiveOrCommon(typeName)) {
|
|
67
|
+
deps.push(typeName);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Also check for @Autowired on fields (though constructor injection is preferred)
|
|
73
|
+
const hasAutowired = decorators.some(d => d.name === 'Autowired');
|
|
74
|
+
if (hasAutowired && fn.parameters.length > 0) {
|
|
75
|
+
for (const param of fn.parameters) {
|
|
76
|
+
if (param.type && !this.isPrimitiveOrCommon(param.type)) {
|
|
77
|
+
deps.push(param.type.replace(/<.*>/, '').trim());
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return [...new Set(deps)]; // Deduplicate
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check if a type is primitive or common Java type
|
|
85
|
+
*/
|
|
86
|
+
isPrimitiveOrCommon(type) {
|
|
87
|
+
const primitives = [
|
|
88
|
+
'int', 'long', 'short', 'byte', 'float', 'double', 'boolean', 'char',
|
|
89
|
+
'Integer', 'Long', 'Short', 'Byte', 'Float', 'Double', 'Boolean', 'Character',
|
|
90
|
+
'String', 'Object', 'void', 'Void',
|
|
91
|
+
'List', 'Set', 'Map', 'Collection', 'Optional',
|
|
92
|
+
];
|
|
93
|
+
return primitives.includes(type);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=java-normalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"java-normalizer.js","sourceRoot":"","sources":["../../../src/language-intelligence/normalizers/java-normalizer.ts"],"names":[],"mappings":"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"}
|