api-tests-coverage 1.0.14 → 1.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dashboard/dist/assets/_basePickBy-C2jmWITn.js +1 -0
- package/dist/dashboard/dist/assets/_baseUniq-DE6cyzJb.js +1 -0
- package/dist/dashboard/dist/assets/arc-B-Q4nGPT.js +1 -0
- package/dist/dashboard/dist/assets/architectureDiagram-VXUJARFQ-C_5dqWCI.js +36 -0
- package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-DbGIO6Kt.js +122 -0
- package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-CAFpcejP.js +10 -0
- package/dist/dashboard/dist/assets/channel-Di9el3wE.js +1 -0
- package/dist/dashboard/dist/assets/chunk-4BX2VUAB-DY1boKsq.js +1 -0
- package/dist/dashboard/dist/assets/chunk-55IACEB6-BSL35gyW.js +1 -0
- package/dist/dashboard/dist/assets/chunk-B4BG7PRW-eTDXrKrv.js +165 -0
- package/dist/dashboard/dist/assets/chunk-DI55MBZ5-M-8I3jEy.js +220 -0
- package/dist/dashboard/dist/assets/chunk-FMBD7UC4-bSA0XiS0.js +15 -0
- package/dist/dashboard/dist/assets/chunk-QN33PNHL-BrOIYUBs.js +1 -0
- package/dist/dashboard/dist/assets/chunk-QZHKN3VN-CliaQGD4.js +1 -0
- package/dist/dashboard/dist/assets/chunk-TZMSLE5B-CyhcxGB1.js +1 -0
- package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-BkGN4Cpz.js +1 -0
- package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-BkGN4Cpz.js +1 -0
- package/dist/dashboard/dist/assets/clone-Cvq8JuOb.js +1 -0
- package/dist/dashboard/dist/assets/cose-bilkent-S5V4N54A-BUkL7Wtq.js +1 -0
- package/dist/dashboard/dist/assets/dagre-6UL2VRFP-B8oEROJc.js +4 -0
- package/dist/dashboard/dist/assets/diagram-PSM6KHXK-5uki9Dw8.js +24 -0
- package/dist/dashboard/dist/assets/diagram-QEK2KX5R-BRNhmby2.js +43 -0
- package/dist/dashboard/dist/assets/diagram-S2PKOQOG-D-ku_X8U.js +24 -0
- package/dist/dashboard/dist/assets/erDiagram-Q2GNP2WA-DGl6gPe2.js +60 -0
- package/dist/dashboard/dist/assets/flowDiagram-NV44I4VS-Co89qYBD.js +162 -0
- package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-2r3WpWQC.js +267 -0
- package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-CuJ5l3TK.js +65 -0
- package/dist/dashboard/dist/assets/graph-ZtgwAPQj.js +1 -0
- package/dist/dashboard/dist/assets/index-D3sRJga7.js +777 -0
- package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-ujnMqVz3.js +2 -0
- package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-DQzfeBIo.js +139 -0
- package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-ueIaoeks.js +89 -0
- package/dist/dashboard/dist/assets/layout-B1fTYUMj.js +1 -0
- package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-B7wYeLe1.js +68 -0
- package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-Bf8vKEOf.js +30 -0
- package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-CM8qiFLR.js +7 -0
- package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-DPTtP4Ve.js +64 -0
- package/dist/dashboard/dist/assets/sankeyDiagram-TZEHDZUN-DEVTdH0h.js +10 -0
- package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-Bjr5wgXg.js +145 -0
- package/dist/dashboard/dist/assets/stateDiagram-FKZM4ZOC-DDrhZYly.js +1 -0
- package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-Im6pH8C-.js +1 -0
- package/dist/dashboard/dist/assets/timeline-definition-IT6M3QCI-DAT3r9va.js +61 -0
- package/dist/dashboard/dist/assets/treemap-GDKQZRPO-BlA8rg0m.js +162 -0
- package/dist/dashboard/dist/assets/xychartDiagram-PRI3JC2R-7aSkQtVu.js +7 -0
- package/dist/dashboard/dist/index.html +1 -1
- package/dist/src/ast/astTypes.d.ts +86 -0
- package/dist/src/ast/astTypes.d.ts.map +1 -1
- package/dist/src/discovery/frameworkDetector.d.ts +28 -0
- package/dist/src/discovery/frameworkDetector.d.ts.map +1 -0
- package/dist/src/discovery/frameworkDetector.js +189 -0
- package/dist/src/discovery/projectDiscovery.d.ts +5 -1
- package/dist/src/discovery/projectDiscovery.d.ts.map +1 -1
- package/dist/src/discovery/projectDiscovery.js +4 -0
- package/dist/src/inference/routeInference.d.ts.map +1 -1
- package/dist/src/inference/routeInference.js +224 -1
- package/dist/src/languages/java/graphqlSchemaParser.d.ts +65 -0
- package/dist/src/languages/java/graphqlSchemaParser.d.ts.map +1 -0
- package/dist/src/languages/java/graphqlSchemaParser.js +164 -0
- package/dist/src/languages/java/mybatisXmlParser.d.ts +52 -0
- package/dist/src/languages/java/mybatisXmlParser.d.ts.map +1 -0
- package/dist/src/languages/java/mybatisXmlParser.js +107 -0
- package/dist/src/languages/javascript/angularDetector.d.ts +74 -0
- package/dist/src/languages/javascript/angularDetector.d.ts.map +1 -0
- package/dist/src/languages/javascript/angularDetector.js +194 -0
- package/dist/src/languages/javascript/hapiDetector.d.ts +40 -0
- package/dist/src/languages/javascript/hapiDetector.d.ts.map +1 -0
- package/dist/src/languages/javascript/hapiDetector.js +131 -0
- package/dist/src/languages/javascript/mongooseDetector.d.ts +65 -0
- package/dist/src/languages/javascript/mongooseDetector.d.ts.map +1 -0
- package/dist/src/languages/javascript/mongooseDetector.js +237 -0
- package/dist/src/languages/javascript/vueDetector.d.ts +40 -0
- package/dist/src/languages/javascript/vueDetector.d.ts.map +1 -0
- package/dist/src/languages/javascript/vueDetector.js +87 -0
- package/dist/src/languages/python/index.d.ts +5 -1
- package/dist/src/languages/python/index.d.ts.map +1 -1
- package/dist/src/languages/python/index.js +167 -2
- package/dist/src/languages/python/testPatternDetector.d.ts +70 -0
- package/dist/src/languages/python/testPatternDetector.d.ts.map +1 -0
- package/dist/src/languages/python/testPatternDetector.js +201 -0
- package/dist/src/pipeline/stages/ast/astStage.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/astStage.js +6 -0
- package/dist/src/pipeline/stages/ast/baseUrlComposer.d.ts +44 -0
- package/dist/src/pipeline/stages/ast/baseUrlComposer.d.ts.map +1 -0
- package/dist/src/pipeline/stages/ast/baseUrlComposer.js +83 -0
- package/dist/src/pipeline/stages/ast/crossFileResolutionPass.d.ts +54 -0
- package/dist/src/pipeline/stages/ast/crossFileResolutionPass.d.ts.map +1 -0
- package/dist/src/pipeline/stages/ast/crossFileResolutionPass.js +88 -0
- package/dist/src/pipeline/stages/ast/crossFileResolver.d.ts.map +1 -1
- package/dist/src/pipeline/stages/ast/crossFileResolver.js +10 -1
- package/dist/src/pipeline/stages/ast/optionalAuthUnifier.d.ts +39 -0
- package/dist/src/pipeline/stages/ast/optionalAuthUnifier.d.ts.map +1 -0
- package/dist/src/pipeline/stages/ast/optionalAuthUnifier.js +81 -0
- package/dist/src/pipeline/stages/ast/resolvers/angularInjectionResolver.d.ts +18 -0
- package/dist/src/pipeline/stages/ast/resolvers/angularInjectionResolver.d.ts.map +1 -0
- package/dist/src/pipeline/stages/ast/resolvers/angularInjectionResolver.js +77 -0
- package/dist/src/pipeline/stages/ast/resolvers/dddLayerResolver.d.ts +46 -0
- package/dist/src/pipeline/stages/ast/resolvers/dddLayerResolver.d.ts.map +1 -0
- package/dist/src/pipeline/stages/ast/resolvers/dddLayerResolver.js +238 -0
- package/dist/src/pipeline/stages/ast/resolvers/expressRouterResolver.d.ts +17 -0
- package/dist/src/pipeline/stages/ast/resolvers/expressRouterResolver.d.ts.map +1 -0
- package/dist/src/pipeline/stages/ast/resolvers/expressRouterResolver.js +65 -0
- package/dist/src/pipeline/stages/ast/resolvers/flaskBlueprintResolver.d.ts +17 -0
- package/dist/src/pipeline/stages/ast/resolvers/flaskBlueprintResolver.d.ts.map +1 -0
- package/dist/src/pipeline/stages/ast/resolvers/flaskBlueprintResolver.js +114 -0
- package/dist/src/pipeline/stages/ast/resolvers/mybatisResolver.d.ts +27 -0
- package/dist/src/pipeline/stages/ast/resolvers/mybatisResolver.d.ts.map +1 -0
- package/dist/src/pipeline/stages/ast/resolvers/mybatisResolver.js +74 -0
- package/dist/src/pipeline/stages/ast/resolvers/vuexActionResolver.d.ts +17 -0
- package/dist/src/pipeline/stages/ast/resolvers/vuexActionResolver.d.ts.map +1 -0
- package/dist/src/pipeline/stages/ast/resolvers/vuexActionResolver.js +55 -0
- package/dist/src/pipeline/stages/ast/rulesEnforcer.d.ts +24 -0
- package/dist/src/pipeline/stages/ast/rulesEnforcer.d.ts.map +1 -0
- package/dist/src/pipeline/stages/ast/rulesEnforcer.js +120 -0
- package/dist/src/pipeline/stages/ast/types.d.ts +114 -1
- package/dist/src/pipeline/stages/ast/types.d.ts.map +1 -1
- package/dist/src/pipeline/stages/tia/testLayerClassifier.d.ts.map +1 -1
- package/dist/src/pipeline/stages/tia/testLayerClassifier.js +5 -0
- package/package.json +1 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Angular pattern detector (Feature 27, Sub-PR 7)
|
|
3
|
+
*
|
|
4
|
+
* Detects:
|
|
5
|
+
* 1. @Injectable services with HttpClient injection
|
|
6
|
+
* 2. this.http.get/post/put/delete/patch() API calls
|
|
7
|
+
* 3. inject(HttpClient) functional style
|
|
8
|
+
* 4. environment.api_url usage
|
|
9
|
+
* 5. CanActivateFn / CanActivateChildFn / CanDeactivateFn / ResolveFn guards
|
|
10
|
+
* 6. implements HttpInterceptor / HttpInterceptorFn interceptors
|
|
11
|
+
* 7. TestBed.configureTestingModule with HttpClientTestingModule
|
|
12
|
+
* 8. httpMock.expectOne(url) assertion nodes
|
|
13
|
+
* 9. signal<T>(), toSignal() patterns
|
|
14
|
+
*/
|
|
15
|
+
export interface AngularHttpCall {
|
|
16
|
+
method: string;
|
|
17
|
+
urlPattern: string;
|
|
18
|
+
usesEnvironmentUrl: boolean;
|
|
19
|
+
sourceFile: string;
|
|
20
|
+
line?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface AngularInjection {
|
|
23
|
+
/** Class that receives the injection */
|
|
24
|
+
consumerClass: string;
|
|
25
|
+
/** Service class being injected */
|
|
26
|
+
serviceClass: string;
|
|
27
|
+
/** Injection style: constructor, inject function, decorator */
|
|
28
|
+
style: 'constructor' | 'inject-fn';
|
|
29
|
+
sourceFile: string;
|
|
30
|
+
line?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface AngularGuard {
|
|
33
|
+
name: string;
|
|
34
|
+
type: 'functional' | 'class-based';
|
|
35
|
+
guardType: 'CanActivate' | 'CanActivateChild' | 'CanDeactivate' | 'Resolve' | 'CanMatch';
|
|
36
|
+
sourceFile: string;
|
|
37
|
+
line?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface AngularInterceptor {
|
|
40
|
+
name: string;
|
|
41
|
+
type: 'class-based' | 'functional';
|
|
42
|
+
sourceFile: string;
|
|
43
|
+
line?: number;
|
|
44
|
+
}
|
|
45
|
+
export interface AngularTestSetup {
|
|
46
|
+
usesHttpClientTestingModule: boolean;
|
|
47
|
+
httpMockExpectations: string[];
|
|
48
|
+
sourceFile: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Detect Angular HttpClient API calls from source text.
|
|
52
|
+
*/
|
|
53
|
+
export declare function detectAngularHttpCalls(sourceText: string, filePath: string): AngularHttpCall[];
|
|
54
|
+
/**
|
|
55
|
+
* Detect Angular constructor injections and inject() calls.
|
|
56
|
+
*/
|
|
57
|
+
export declare function detectAngularInjections(sourceText: string, filePath: string): AngularInjection[];
|
|
58
|
+
/**
|
|
59
|
+
* Detect Angular guards (functional and class-based).
|
|
60
|
+
*/
|
|
61
|
+
export declare function detectAngularGuards(sourceText: string, filePath: string): AngularGuard[];
|
|
62
|
+
/**
|
|
63
|
+
* Detect Angular HTTP interceptors.
|
|
64
|
+
*/
|
|
65
|
+
export declare function detectAngularInterceptors(sourceText: string, filePath: string): AngularInterceptor[];
|
|
66
|
+
/**
|
|
67
|
+
* Detect Angular test setup patterns (HttpClientTestingModule, httpMock).
|
|
68
|
+
*/
|
|
69
|
+
export declare function detectAngularTestSetup(sourceText: string, filePath: string): AngularTestSetup;
|
|
70
|
+
/**
|
|
71
|
+
* Check if source text contains Angular HttpClient usage.
|
|
72
|
+
*/
|
|
73
|
+
export declare function hasAngularHttpClient(sourceText: string): boolean;
|
|
74
|
+
//# sourceMappingURL=angularDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angularDetector.d.ts","sourceRoot":"","sources":["../../../../src/languages/javascript/angularDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,KAAK,EAAE,aAAa,GAAG,WAAW,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,GAAG,aAAa,CAAC;IACnC,SAAS,EAAE,aAAa,GAAG,kBAAkB,GAAG,eAAe,GAAG,SAAS,GAAG,UAAU,CAAC;IACzF,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B,EAAE,OAAO,CAAC;IACrC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAyC9F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAuChG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAyCxF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAgCpG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAY7F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEhE"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Angular pattern detector (Feature 27, Sub-PR 7)
|
|
4
|
+
*
|
|
5
|
+
* Detects:
|
|
6
|
+
* 1. @Injectable services with HttpClient injection
|
|
7
|
+
* 2. this.http.get/post/put/delete/patch() API calls
|
|
8
|
+
* 3. inject(HttpClient) functional style
|
|
9
|
+
* 4. environment.api_url usage
|
|
10
|
+
* 5. CanActivateFn / CanActivateChildFn / CanDeactivateFn / ResolveFn guards
|
|
11
|
+
* 6. implements HttpInterceptor / HttpInterceptorFn interceptors
|
|
12
|
+
* 7. TestBed.configureTestingModule with HttpClientTestingModule
|
|
13
|
+
* 8. httpMock.expectOne(url) assertion nodes
|
|
14
|
+
* 9. signal<T>(), toSignal() patterns
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.detectAngularHttpCalls = detectAngularHttpCalls;
|
|
18
|
+
exports.detectAngularInjections = detectAngularInjections;
|
|
19
|
+
exports.detectAngularGuards = detectAngularGuards;
|
|
20
|
+
exports.detectAngularInterceptors = detectAngularInterceptors;
|
|
21
|
+
exports.detectAngularTestSetup = detectAngularTestSetup;
|
|
22
|
+
exports.hasAngularHttpClient = hasAngularHttpClient;
|
|
23
|
+
/**
|
|
24
|
+
* Detect Angular HttpClient API calls from source text.
|
|
25
|
+
*/
|
|
26
|
+
function detectAngularHttpCalls(sourceText, filePath) {
|
|
27
|
+
const calls = [];
|
|
28
|
+
const lines = sourceText.split('\n');
|
|
29
|
+
// this.http.METHOD<Type>('url') or this.httpClient.METHOD('url')
|
|
30
|
+
const httpCallPattern = /this\.(?:http|httpClient)\.(get|post|put|patch|delete|head|options)(?:<[^>]+>)?\s*\(\s*[`'"]([^`'"]+)[`'"]/;
|
|
31
|
+
for (let i = 0; i < lines.length; i++) {
|
|
32
|
+
const line = lines[i];
|
|
33
|
+
const match = line.match(httpCallPattern);
|
|
34
|
+
if (match) {
|
|
35
|
+
const usesEnvironmentUrl = match[2].includes('environment') || match[2].includes('${');
|
|
36
|
+
calls.push({
|
|
37
|
+
method: match[1].toUpperCase(),
|
|
38
|
+
urlPattern: match[2],
|
|
39
|
+
usesEnvironmentUrl,
|
|
40
|
+
sourceFile: filePath,
|
|
41
|
+
line: i + 1,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Also detect template literal calls: this.http.get(`${this.apiUrl}/articles`)
|
|
46
|
+
const templatePattern = /this\.(?:http|httpClient)\.(get|post|put|patch|delete)(?:<[^>]+>)?\s*\(\s*`([^`]+)`/g;
|
|
47
|
+
let tmatch;
|
|
48
|
+
while ((tmatch = templatePattern.exec(sourceText)) !== null) {
|
|
49
|
+
const url = tmatch[2];
|
|
50
|
+
// Avoid duplicates
|
|
51
|
+
if (!calls.some((c) => c.urlPattern === url)) {
|
|
52
|
+
const lineNum = sourceText.substring(0, tmatch.index).split('\n').length;
|
|
53
|
+
calls.push({
|
|
54
|
+
method: tmatch[1].toUpperCase(),
|
|
55
|
+
urlPattern: url,
|
|
56
|
+
usesEnvironmentUrl: url.includes('environment') || url.includes('${'),
|
|
57
|
+
sourceFile: filePath,
|
|
58
|
+
line: lineNum,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return calls;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Detect Angular constructor injections and inject() calls.
|
|
66
|
+
*/
|
|
67
|
+
function detectAngularInjections(sourceText, filePath) {
|
|
68
|
+
const injections = [];
|
|
69
|
+
const lines = sourceText.split('\n');
|
|
70
|
+
let currentClass = '';
|
|
71
|
+
for (let i = 0; i < lines.length; i++) {
|
|
72
|
+
const line = lines[i];
|
|
73
|
+
// Track current class
|
|
74
|
+
const classMatch = line.match(/class\s+(\w+)/);
|
|
75
|
+
if (classMatch)
|
|
76
|
+
currentClass = classMatch[1];
|
|
77
|
+
// Constructor injection: constructor(private http: HttpClient)
|
|
78
|
+
const ctorMatch = line.match(/(?:private|protected|public|readonly)\s+(\w+)\s*:\s*(\w+)/);
|
|
79
|
+
if (ctorMatch && currentClass) {
|
|
80
|
+
injections.push({
|
|
81
|
+
consumerClass: currentClass,
|
|
82
|
+
serviceClass: ctorMatch[2],
|
|
83
|
+
style: 'constructor',
|
|
84
|
+
sourceFile: filePath,
|
|
85
|
+
line: i + 1,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// Functional inject: inject(HttpClient)
|
|
89
|
+
const injectMatch = line.match(/(\w+)\s*=\s*inject\s*\(\s*(\w+)\s*\)/);
|
|
90
|
+
if (injectMatch && currentClass) {
|
|
91
|
+
injections.push({
|
|
92
|
+
consumerClass: currentClass,
|
|
93
|
+
serviceClass: injectMatch[2],
|
|
94
|
+
style: 'inject-fn',
|
|
95
|
+
sourceFile: filePath,
|
|
96
|
+
line: i + 1,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return injections;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Detect Angular guards (functional and class-based).
|
|
104
|
+
*/
|
|
105
|
+
function detectAngularGuards(sourceText, filePath) {
|
|
106
|
+
var _a;
|
|
107
|
+
const guards = [];
|
|
108
|
+
const lines = sourceText.split('\n');
|
|
109
|
+
for (let i = 0; i < lines.length; i++) {
|
|
110
|
+
const line = lines[i];
|
|
111
|
+
// Functional guard: export const authGuard: CanActivateFn = ...
|
|
112
|
+
const functionalMatch = line.match(/(?:export\s+)?(?:const|let)\s+(\w+)\s*:\s*(CanActivateFn|CanActivateChildFn|CanDeactivateFn|ResolveFn|CanMatchFn)/);
|
|
113
|
+
if (functionalMatch) {
|
|
114
|
+
const guardTypeMap = {
|
|
115
|
+
CanActivateFn: 'CanActivate',
|
|
116
|
+
CanActivateChildFn: 'CanActivateChild',
|
|
117
|
+
CanDeactivateFn: 'CanDeactivate',
|
|
118
|
+
ResolveFn: 'Resolve',
|
|
119
|
+
CanMatchFn: 'CanMatch',
|
|
120
|
+
};
|
|
121
|
+
guards.push({
|
|
122
|
+
name: functionalMatch[1],
|
|
123
|
+
type: 'functional',
|
|
124
|
+
guardType: (_a = guardTypeMap[functionalMatch[2]]) !== null && _a !== void 0 ? _a : 'CanActivate',
|
|
125
|
+
sourceFile: filePath,
|
|
126
|
+
line: i + 1,
|
|
127
|
+
});
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
// Class-based guard: implements CanActivate
|
|
131
|
+
const classMatch = line.match(/class\s+(\w+).*implements\s+(?:.*,\s*)?(CanActivate|CanActivateChild|CanDeactivate|Resolve|CanMatch)/);
|
|
132
|
+
if (classMatch) {
|
|
133
|
+
guards.push({
|
|
134
|
+
name: classMatch[1],
|
|
135
|
+
type: 'class-based',
|
|
136
|
+
guardType: classMatch[2],
|
|
137
|
+
sourceFile: filePath,
|
|
138
|
+
line: i + 1,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return guards;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Detect Angular HTTP interceptors.
|
|
146
|
+
*/
|
|
147
|
+
function detectAngularInterceptors(sourceText, filePath) {
|
|
148
|
+
const interceptors = [];
|
|
149
|
+
const lines = sourceText.split('\n');
|
|
150
|
+
for (let i = 0; i < lines.length; i++) {
|
|
151
|
+
const line = lines[i];
|
|
152
|
+
// Class-based: implements HttpInterceptor
|
|
153
|
+
const classMatch = line.match(/class\s+(\w+).*implements\s+(?:.*,\s*)?HttpInterceptor/);
|
|
154
|
+
if (classMatch) {
|
|
155
|
+
interceptors.push({
|
|
156
|
+
name: classMatch[1],
|
|
157
|
+
type: 'class-based',
|
|
158
|
+
sourceFile: filePath,
|
|
159
|
+
line: i + 1,
|
|
160
|
+
});
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
// Functional: HttpInterceptorFn
|
|
164
|
+
const fnMatch = line.match(/(?:export\s+)?(?:const|let)\s+(\w+)\s*:\s*HttpInterceptorFn/);
|
|
165
|
+
if (fnMatch) {
|
|
166
|
+
interceptors.push({
|
|
167
|
+
name: fnMatch[1],
|
|
168
|
+
type: 'functional',
|
|
169
|
+
sourceFile: filePath,
|
|
170
|
+
line: i + 1,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return interceptors;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Detect Angular test setup patterns (HttpClientTestingModule, httpMock).
|
|
178
|
+
*/
|
|
179
|
+
function detectAngularTestSetup(sourceText, filePath) {
|
|
180
|
+
const usesHttpClientTestingModule = /HttpClientTestingModule|provideHttpClientTesting/.test(sourceText);
|
|
181
|
+
const httpMockExpectations = [];
|
|
182
|
+
const expectOnePattern = /httpMock\.expectOne\s*\(\s*['"`]([^'"`]+)['"`]\s*\)/g;
|
|
183
|
+
let match;
|
|
184
|
+
while ((match = expectOnePattern.exec(sourceText)) !== null) {
|
|
185
|
+
httpMockExpectations.push(match[1]);
|
|
186
|
+
}
|
|
187
|
+
return { usesHttpClientTestingModule, httpMockExpectations, sourceFile: filePath };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Check if source text contains Angular HttpClient usage.
|
|
191
|
+
*/
|
|
192
|
+
function hasAngularHttpClient(sourceText) {
|
|
193
|
+
return /HttpClient|this\.http\.(get|post|put|patch|delete)/.test(sourceText);
|
|
194
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HapiJS pattern detector (Feature 27, Sub-PR 8)
|
|
3
|
+
*
|
|
4
|
+
* Detects:
|
|
5
|
+
* 1. server.route({ method, path, options: { auth, validate, handler } })
|
|
6
|
+
* 2. Joi validator chains: Joi.string().required(), Joi.number().min().max().default()
|
|
7
|
+
* 3. auth: 'jwt' = required, auth: { mode: 'try' } = optional
|
|
8
|
+
* 4. Boom error responses: Boom.notFound(), Boom.unauthorized()
|
|
9
|
+
*/
|
|
10
|
+
export interface HapiRoute {
|
|
11
|
+
method: string;
|
|
12
|
+
path: string;
|
|
13
|
+
auth?: HapiAuth;
|
|
14
|
+
validation?: HapiValidation;
|
|
15
|
+
sourceFile: string;
|
|
16
|
+
line?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface HapiAuth {
|
|
19
|
+
strategy?: string;
|
|
20
|
+
mode: 'required' | 'optional' | 'try';
|
|
21
|
+
}
|
|
22
|
+
export interface HapiValidation {
|
|
23
|
+
queryParams: string[];
|
|
24
|
+
payloadParams: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface HapiBoomError {
|
|
27
|
+
errorType: string;
|
|
28
|
+
statusCode?: number;
|
|
29
|
+
sourceFile: string;
|
|
30
|
+
line?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Detect HapiJS route definitions from source text.
|
|
34
|
+
*/
|
|
35
|
+
export declare function detectHapiRoutes(sourceText: string, filePath: string): HapiRoute[];
|
|
36
|
+
/**
|
|
37
|
+
* Detect Boom error responses.
|
|
38
|
+
*/
|
|
39
|
+
export declare function detectBoomErrors(sourceText: string, filePath: string): HapiBoomError[];
|
|
40
|
+
//# sourceMappingURL=hapiDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hapiDetector.d.ts","sourceRoot":"","sources":["../../../../src/languages/javascript/hapiDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAkBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAuFlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAmBtF"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HapiJS pattern detector (Feature 27, Sub-PR 8)
|
|
4
|
+
*
|
|
5
|
+
* Detects:
|
|
6
|
+
* 1. server.route({ method, path, options: { auth, validate, handler } })
|
|
7
|
+
* 2. Joi validator chains: Joi.string().required(), Joi.number().min().max().default()
|
|
8
|
+
* 3. auth: 'jwt' = required, auth: { mode: 'try' } = optional
|
|
9
|
+
* 4. Boom error responses: Boom.notFound(), Boom.unauthorized()
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.detectHapiRoutes = detectHapiRoutes;
|
|
13
|
+
exports.detectBoomErrors = detectBoomErrors;
|
|
14
|
+
/** Map Boom methods to HTTP status codes */
|
|
15
|
+
const BOOM_STATUS_MAP = {
|
|
16
|
+
badRequest: 400,
|
|
17
|
+
unauthorized: 401,
|
|
18
|
+
forbidden: 403,
|
|
19
|
+
notFound: 404,
|
|
20
|
+
conflict: 409,
|
|
21
|
+
badData: 422,
|
|
22
|
+
internal: 500,
|
|
23
|
+
badImplementation: 500,
|
|
24
|
+
notImplemented: 501,
|
|
25
|
+
badGateway: 502,
|
|
26
|
+
serverUnavailable: 503,
|
|
27
|
+
gatewayTimeout: 504,
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Detect HapiJS route definitions from source text.
|
|
31
|
+
*/
|
|
32
|
+
function detectHapiRoutes(sourceText, filePath) {
|
|
33
|
+
var _a, _b;
|
|
34
|
+
const routes = [];
|
|
35
|
+
const lines = sourceText.split('\n');
|
|
36
|
+
for (let i = 0; i < lines.length; i++) {
|
|
37
|
+
const line = lines[i];
|
|
38
|
+
// Look for method: 'GET' and path: '/articles' patterns close together
|
|
39
|
+
const methodMatch = line.match(/method\s*:\s*['"](\w+)['"]/);
|
|
40
|
+
if (!methodMatch)
|
|
41
|
+
continue;
|
|
42
|
+
const method = methodMatch[1].toUpperCase();
|
|
43
|
+
// Find path in nearby lines (within 5 lines)
|
|
44
|
+
let path = '';
|
|
45
|
+
let auth;
|
|
46
|
+
let validation;
|
|
47
|
+
for (let j = Math.max(0, i - 3); j < Math.min(i + 10, lines.length); j++) {
|
|
48
|
+
const nearLine = lines[j];
|
|
49
|
+
// path: '/articles/{slug}'
|
|
50
|
+
const pathMatch = nearLine.match(/path\s*:\s*['"]([^'"]+)['"]/);
|
|
51
|
+
if (pathMatch)
|
|
52
|
+
path = pathMatch[1];
|
|
53
|
+
// auth: 'jwt' or auth: 'simple'
|
|
54
|
+
const authSimple = nearLine.match(/auth\s*:\s*['"](\w+)['"]/);
|
|
55
|
+
if (authSimple) {
|
|
56
|
+
auth = { strategy: authSimple[1], mode: 'required' };
|
|
57
|
+
}
|
|
58
|
+
// auth: { mode: 'try' } or auth: { mode: 'optional' }
|
|
59
|
+
const authMode = nearLine.match(/(?:auth|mode)\s*:\s*[{]?\s*mode\s*:\s*['"](\w+)['"]/);
|
|
60
|
+
if (authMode) {
|
|
61
|
+
auth = {
|
|
62
|
+
strategy: auth === null || auth === void 0 ? void 0 : auth.strategy,
|
|
63
|
+
mode: authMode[1] === 'try' || authMode[1] === 'optional' ? 'optional' : 'required',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// auth: false
|
|
67
|
+
if (/auth\s*:\s*false/.test(nearLine)) {
|
|
68
|
+
auth = undefined; // Public route
|
|
69
|
+
}
|
|
70
|
+
// validate.query or validate.payload with Joi
|
|
71
|
+
if (/validate\s*:/.test(nearLine)) {
|
|
72
|
+
const queryParams = [];
|
|
73
|
+
const payloadParams = [];
|
|
74
|
+
// Scan validation block
|
|
75
|
+
for (let k = j; k < Math.min(j + 15, lines.length); k++) {
|
|
76
|
+
const valLine = lines[k];
|
|
77
|
+
// query: { ... }
|
|
78
|
+
if (/query\s*:/.test(valLine)) {
|
|
79
|
+
const paramMatch = valLine.match(/(\w+)\s*:\s*Joi\./g);
|
|
80
|
+
if (paramMatch) {
|
|
81
|
+
for (const pm of paramMatch) {
|
|
82
|
+
const name = (_a = pm.match(/(\w+)\s*:/)) === null || _a === void 0 ? void 0 : _a[1];
|
|
83
|
+
if (name)
|
|
84
|
+
queryParams.push(name);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// payload: { ... }
|
|
89
|
+
if (/payload\s*:/.test(valLine)) {
|
|
90
|
+
const paramMatch = valLine.match(/(\w+)\s*:\s*Joi\./g);
|
|
91
|
+
if (paramMatch) {
|
|
92
|
+
for (const pm of paramMatch) {
|
|
93
|
+
const name = (_b = pm.match(/(\w+)\s*:/)) === null || _b === void 0 ? void 0 : _b[1];
|
|
94
|
+
if (name)
|
|
95
|
+
payloadParams.push(name);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (queryParams.length > 0 || payloadParams.length > 0) {
|
|
101
|
+
validation = { queryParams, payloadParams };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (path) {
|
|
106
|
+
routes.push({ method, path, auth, validation, sourceFile: filePath, line: i + 1 });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return routes;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Detect Boom error responses.
|
|
113
|
+
*/
|
|
114
|
+
function detectBoomErrors(sourceText, filePath) {
|
|
115
|
+
const errors = [];
|
|
116
|
+
const lines = sourceText.split('\n');
|
|
117
|
+
for (let i = 0; i < lines.length; i++) {
|
|
118
|
+
const line = lines[i];
|
|
119
|
+
const match = line.match(/Boom\.(\w+)\s*\(/);
|
|
120
|
+
if (match) {
|
|
121
|
+
const errorType = match[1];
|
|
122
|
+
errors.push({
|
|
123
|
+
errorType,
|
|
124
|
+
statusCode: BOOM_STATUS_MAP[errorType],
|
|
125
|
+
sourceFile: filePath,
|
|
126
|
+
line: i + 1,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return errors;
|
|
131
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mongoose schema/model detector (Feature 27, Sub-PR 6)
|
|
3
|
+
*
|
|
4
|
+
* Detects:
|
|
5
|
+
* 1. mongoose.Schema({...}) — field definitions, validation rules
|
|
6
|
+
* 2. mongoose.model('Name', schema) — model creation
|
|
7
|
+
* 3. .methods.* — instance method definitions
|
|
8
|
+
* 4. .pre()/.post() hooks — lifecycle hooks
|
|
9
|
+
* 5. .plugin(validator) — plugin registrations
|
|
10
|
+
*/
|
|
11
|
+
export interface MongooseField {
|
|
12
|
+
name: string;
|
|
13
|
+
type: string;
|
|
14
|
+
required?: boolean;
|
|
15
|
+
unique?: boolean;
|
|
16
|
+
enumValues?: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface MongooseModel {
|
|
19
|
+
modelName: string;
|
|
20
|
+
schemaVariable?: string;
|
|
21
|
+
fields: MongooseField[];
|
|
22
|
+
methods: string[];
|
|
23
|
+
hooks: Array<{
|
|
24
|
+
stage: 'pre' | 'post';
|
|
25
|
+
event: string;
|
|
26
|
+
}>;
|
|
27
|
+
plugins: string[];
|
|
28
|
+
sourceFile: string;
|
|
29
|
+
line?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Detect Mongoose model/schema definitions from JS/TS source text.
|
|
33
|
+
*/
|
|
34
|
+
export declare function detectMongooseModels(sourceText: string, filePath: string): MongooseModel[];
|
|
35
|
+
/**
|
|
36
|
+
* Detect Express error handlers (4-argument middleware).
|
|
37
|
+
*/
|
|
38
|
+
export interface ExpressErrorHandler {
|
|
39
|
+
functionName?: string;
|
|
40
|
+
errorTypes: string[];
|
|
41
|
+
statusCodes: number[];
|
|
42
|
+
sourceFile: string;
|
|
43
|
+
line?: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Detect Express 4-argument error handler middleware.
|
|
47
|
+
* Pattern: function(err, req, res, next) or (err, req, res, next) =>
|
|
48
|
+
*/
|
|
49
|
+
export declare function detectExpressErrorHandlers(sourceText: string, filePath: string): ExpressErrorHandler[];
|
|
50
|
+
/**
|
|
51
|
+
* Detect Express middleware auth patterns.
|
|
52
|
+
* Pattern: router.use(auth.required) or router.use('/path', auth.optional, subRouter)
|
|
53
|
+
*/
|
|
54
|
+
export interface ExpressAuthMiddleware {
|
|
55
|
+
/** 'required' or 'optional' */
|
|
56
|
+
authType: 'required' | 'optional';
|
|
57
|
+
/** The path prefix this middleware applies to */
|
|
58
|
+
pathPrefix?: string;
|
|
59
|
+
/** Source pattern text */
|
|
60
|
+
sourcePattern: string;
|
|
61
|
+
sourceFile: string;
|
|
62
|
+
line?: number;
|
|
63
|
+
}
|
|
64
|
+
export declare function detectExpressAuthMiddleware(sourceText: string, filePath: string): ExpressAuthMiddleware[];
|
|
65
|
+
//# sourceMappingURL=mongooseDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongooseDetector.d.ts","sourceRoot":"","sources":["../../../../src/languages/javascript/mongooseDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CA2E1F;AAwED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAuCtG;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAClC,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,qBAAqB,EAAE,CA6CzG"}
|