skhaall-codeguard 0.1.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.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/cli.d.ts +16 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +295 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/core/indexer.d.ts +21 -0
  8. package/dist/core/indexer.d.ts.map +1 -0
  9. package/dist/core/indexer.js +96 -0
  10. package/dist/core/indexer.js.map +1 -0
  11. package/dist/graph/dependency-graph.d.ts +37 -0
  12. package/dist/graph/dependency-graph.d.ts.map +1 -0
  13. package/dist/graph/dependency-graph.js +94 -0
  14. package/dist/graph/dependency-graph.js.map +1 -0
  15. package/dist/graph/impact-resolver.d.ts +40 -0
  16. package/dist/graph/impact-resolver.d.ts.map +1 -0
  17. package/dist/graph/impact-resolver.js +108 -0
  18. package/dist/graph/impact-resolver.js.map +1 -0
  19. package/dist/index.d.ts +8 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +299 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/parsers/base-parser.d.ts +111 -0
  24. package/dist/parsers/base-parser.d.ts.map +1 -0
  25. package/dist/parsers/base-parser.js +7 -0
  26. package/dist/parsers/base-parser.js.map +1 -0
  27. package/dist/parsers/detector.d.ts +10 -0
  28. package/dist/parsers/detector.d.ts.map +1 -0
  29. package/dist/parsers/detector.js +61 -0
  30. package/dist/parsers/detector.js.map +1 -0
  31. package/dist/parsers/extractors/api-calls.d.ts +10 -0
  32. package/dist/parsers/extractors/api-calls.d.ts.map +1 -0
  33. package/dist/parsers/extractors/api-calls.js +99 -0
  34. package/dist/parsers/extractors/api-calls.js.map +1 -0
  35. package/dist/parsers/extractors/auth-guards.d.ts +8 -0
  36. package/dist/parsers/extractors/auth-guards.d.ts.map +1 -0
  37. package/dist/parsers/extractors/auth-guards.js +23 -0
  38. package/dist/parsers/extractors/auth-guards.js.map +1 -0
  39. package/dist/parsers/prisma-parser.d.ts +45 -0
  40. package/dist/parsers/prisma-parser.d.ts.map +1 -0
  41. package/dist/parsers/prisma-parser.js +197 -0
  42. package/dist/parsers/prisma-parser.js.map +1 -0
  43. package/dist/parsers/typescript-parser.d.ts +28 -0
  44. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  45. package/dist/parsers/typescript-parser.js +374 -0
  46. package/dist/parsers/typescript-parser.js.map +1 -0
  47. package/dist/setup.d.ts +10 -0
  48. package/dist/setup.d.ts.map +1 -0
  49. package/dist/setup.js +135 -0
  50. package/dist/setup.js.map +1 -0
  51. package/dist/storage/index-store.d.ts +36 -0
  52. package/dist/storage/index-store.d.ts.map +1 -0
  53. package/dist/storage/index-store.js +108 -0
  54. package/dist/storage/index-store.js.map +1 -0
  55. package/dist/tools/changelog.d.ts +36 -0
  56. package/dist/tools/changelog.d.ts.map +1 -0
  57. package/dist/tools/changelog.js +212 -0
  58. package/dist/tools/changelog.js.map +1 -0
  59. package/dist/tools/check.d.ts +31 -0
  60. package/dist/tools/check.d.ts.map +1 -0
  61. package/dist/tools/check.js +180 -0
  62. package/dist/tools/check.js.map +1 -0
  63. package/dist/tools/graph.d.ts +20 -0
  64. package/dist/tools/graph.d.ts.map +1 -0
  65. package/dist/tools/graph.js +192 -0
  66. package/dist/tools/graph.js.map +1 -0
  67. package/dist/tools/guard.d.ts +30 -0
  68. package/dist/tools/guard.d.ts.map +1 -0
  69. package/dist/tools/guard.js +132 -0
  70. package/dist/tools/guard.js.map +1 -0
  71. package/dist/tools/health.d.ts +33 -0
  72. package/dist/tools/health.d.ts.map +1 -0
  73. package/dist/tools/health.js +241 -0
  74. package/dist/tools/health.js.map +1 -0
  75. package/dist/tools/impact.d.ts +10 -0
  76. package/dist/tools/impact.d.ts.map +1 -0
  77. package/dist/tools/impact.js +45 -0
  78. package/dist/tools/impact.js.map +1 -0
  79. package/dist/tools/regression.d.ts +29 -0
  80. package/dist/tools/regression.d.ts.map +1 -0
  81. package/dist/tools/regression.js +151 -0
  82. package/dist/tools/regression.js.map +1 -0
  83. package/dist/tools/routes.d.ts +40 -0
  84. package/dist/tools/routes.d.ts.map +1 -0
  85. package/dist/tools/routes.js +203 -0
  86. package/dist/tools/routes.js.map +1 -0
  87. package/dist/tools/schema.d.ts +37 -0
  88. package/dist/tools/schema.d.ts.map +1 -0
  89. package/dist/tools/schema.js +214 -0
  90. package/dist/tools/schema.js.map +1 -0
  91. package/dist/tools/search.d.ts +18 -0
  92. package/dist/tools/search.d.ts.map +1 -0
  93. package/dist/tools/search.js +99 -0
  94. package/dist/tools/search.js.map +1 -0
  95. package/dist/tools/tool-definitions.d.ts +15 -0
  96. package/dist/tools/tool-definitions.d.ts.map +1 -0
  97. package/dist/tools/tool-definitions.js +157 -0
  98. package/dist/tools/tool-definitions.js.map +1 -0
  99. package/dist/utils/import-resolver.d.ts +33 -0
  100. package/dist/utils/import-resolver.d.ts.map +1 -0
  101. package/dist/utils/import-resolver.js +150 -0
  102. package/dist/utils/import-resolver.js.map +1 -0
  103. package/dist/utils/logger.d.ts +15 -0
  104. package/dist/utils/logger.d.ts.map +1 -0
  105. package/dist/utils/logger.js +49 -0
  106. package/dist/utils/logger.js.map +1 -0
  107. package/dist/utils/path.d.ts +6 -0
  108. package/dist/utils/path.d.ts.map +1 -0
  109. package/dist/utils/path.js +12 -0
  110. package/dist/utils/path.js.map +1 -0
  111. package/dist/utils/scanner.d.ts +13 -0
  112. package/dist/utils/scanner.d.ts.map +1 -0
  113. package/dist/utils/scanner.js +55 -0
  114. package/dist/utils/scanner.js.map +1 -0
  115. package/dist/utils/validators.d.ts +45 -0
  116. package/dist/utils/validators.d.ts.map +1 -0
  117. package/dist/utils/validators.js +54 -0
  118. package/dist/utils/validators.js.map +1 -0
  119. package/package.json +57 -0
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Contrat commun pour tous les parsers.
3
+ * Chaque parser (TypeScript, Python, Go...) produit le meme format de carte.
4
+ * Le reste du systeme travaille uniquement sur FileNode — il ne connait pas le langage.
5
+ */
6
+ export interface FileNode {
7
+ /** Chemin absolu du fichier */
8
+ filePath: string;
9
+ /** Langage detecte */
10
+ language: Language;
11
+ /** Imports de ce fichier */
12
+ imports: ImportInfo[];
13
+ /** Exports de ce fichier */
14
+ exports: ExportInfo[];
15
+ /** Fonctions declarees */
16
+ functions: FunctionInfo[];
17
+ /** Classes declarees */
18
+ classes: ClassInfo[];
19
+ /** Types et interfaces declares */
20
+ types: TypeInfo[];
21
+ /** Routes API detectees (Next.js, NestJS, FastAPI...) */
22
+ routes: RouteInfo[];
23
+ /** Appels API detectes dans le code (fetch, axios, etc.) */
24
+ apiCalls?: ApiCallInfo[];
25
+ /** Timestamp du dernier parsing */
26
+ parsedAt: number;
27
+ }
28
+ export interface ImportInfo {
29
+ /** Ce qui est importe (nom ou default) */
30
+ name: string;
31
+ /** Chemin source (ex: './utils/auth' ou 'react') */
32
+ source: string;
33
+ /** Import de type uniquement (import type { X }) */
34
+ isTypeOnly: boolean;
35
+ }
36
+ export interface ExportInfo {
37
+ /** Nom de l'export */
38
+ name: string;
39
+ /** Type d'export */
40
+ kind: 'function' | 'class' | 'type' | 'interface' | 'variable' | 'enum' | 'default' | 're-export';
41
+ /** Export de type uniquement */
42
+ isTypeOnly: boolean;
43
+ }
44
+ export interface FunctionInfo {
45
+ name: string;
46
+ isExported: boolean;
47
+ isAsync: boolean;
48
+ parameters: ParameterInfo[];
49
+ returnType: string | null;
50
+ /** Ligne de debut dans le fichier */
51
+ line: number;
52
+ }
53
+ export interface ParameterInfo {
54
+ name: string;
55
+ type: string | null;
56
+ isOptional: boolean;
57
+ }
58
+ export interface ClassInfo {
59
+ name: string;
60
+ isExported: boolean;
61
+ /** Decorateurs (ex: @Controller, @Injectable) */
62
+ decorators: string[];
63
+ methods: FunctionInfo[];
64
+ line: number;
65
+ }
66
+ export interface TypeInfo {
67
+ name: string;
68
+ kind: 'type' | 'interface' | 'enum';
69
+ isExported: boolean;
70
+ /** Proprietes (pour interfaces et types objets) */
71
+ properties: PropertyInfo[];
72
+ line: number;
73
+ }
74
+ export interface PropertyInfo {
75
+ name: string;
76
+ type: string;
77
+ isOptional: boolean;
78
+ }
79
+ export interface RouteInfo {
80
+ /** Methode HTTP */
81
+ method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'ALL';
82
+ /** Chemin de la route (ex: /api/users/:id) */
83
+ path: string;
84
+ /** Nom du handler */
85
+ handler: string;
86
+ /** Fichier ou la route est definie */
87
+ filePath: string;
88
+ line: number;
89
+ /** Decorateurs d'auth detectes (ex: @UseGuards, middleware auth) */
90
+ authGuards?: string[];
91
+ }
92
+ export interface ApiCallInfo {
93
+ /** Methode HTTP (GET, POST, etc.) */
94
+ method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'UNKNOWN';
95
+ /** URL ou pattern d'URL appelee (ex: /api/users, /api/orders/:id) */
96
+ url: string;
97
+ /** Ligne dans le fichier source */
98
+ line: number;
99
+ }
100
+ export type Language = 'typescript' | 'javascript' | 'python' | 'go' | 'rust' | 'java' | 'prisma' | 'sql' | 'unknown';
101
+ export interface BaseParser {
102
+ /** Langages supportes par ce parser */
103
+ readonly supportedLanguages: Language[];
104
+ /** Parse un fichier et retourne son FileNode */
105
+ parseFile(filePath: string): Promise<FileNode>;
106
+ /** Parse plusieurs fichiers en parallele */
107
+ parseFiles(filePaths: string[]): Promise<FileNode[]>;
108
+ /** Verifie si ce parser peut traiter un fichier donne */
109
+ canParse(filePath: string): boolean;
110
+ }
111
+ //# sourceMappingURL=base-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/base-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Contrat commun pour tous les parsers.
3
+ * Chaque parser (TypeScript, Python, Go...) produit le meme format de carte.
4
+ * Le reste du systeme travaille uniquement sur FileNode — il ne connait pas le langage.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=base-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-parser.js","sourceRoot":"","sources":["../../src/parsers/base-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Detection automatique du langage par extension de fichier.
3
+ * Pas de config manuelle — CodeGuard detecte tout seul.
4
+ */
5
+ import type { Language } from './base-parser.js';
6
+ export declare function detectLanguage(filePath: string): Language;
7
+ export declare function shouldIgnorePath(pathSegment: string): boolean;
8
+ export declare function shouldIgnoreFile(fileName: string): boolean;
9
+ export declare function isSupportedFile(filePath: string): boolean;
10
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/parsers/detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAyCjD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAGzD;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGzD"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Detection automatique du langage par extension de fichier.
3
+ * Pas de config manuelle — CodeGuard detecte tout seul.
4
+ */
5
+ const EXTENSION_MAP = {
6
+ '.ts': 'typescript',
7
+ '.tsx': 'typescript',
8
+ '.js': 'javascript',
9
+ '.jsx': 'javascript',
10
+ '.mjs': 'javascript',
11
+ '.cjs': 'javascript',
12
+ '.py': 'python',
13
+ '.go': 'go',
14
+ '.rs': 'rust',
15
+ '.java': 'java',
16
+ '.prisma': 'prisma',
17
+ '.sql': 'sql',
18
+ };
19
+ /** Fichiers a ignorer lors du scan */
20
+ const IGNORED_DIRS = new Set([
21
+ 'node_modules',
22
+ '.next',
23
+ '.nuxt',
24
+ 'dist',
25
+ 'build',
26
+ '.git',
27
+ '.codeguard',
28
+ 'coverage',
29
+ '__pycache__',
30
+ '.venv',
31
+ 'venv',
32
+ 'target',
33
+ 'vendor',
34
+ ]);
35
+ const IGNORED_FILES = new Set([
36
+ 'package-lock.json',
37
+ 'yarn.lock',
38
+ 'pnpm-lock.yaml',
39
+ 'poetry.lock',
40
+ ]);
41
+ export function detectLanguage(filePath) {
42
+ const ext = getExtension(filePath);
43
+ return EXTENSION_MAP[ext] ?? 'unknown';
44
+ }
45
+ export function shouldIgnorePath(pathSegment) {
46
+ return IGNORED_DIRS.has(pathSegment);
47
+ }
48
+ export function shouldIgnoreFile(fileName) {
49
+ return IGNORED_FILES.has(fileName);
50
+ }
51
+ export function isSupportedFile(filePath) {
52
+ const lang = detectLanguage(filePath);
53
+ return lang !== 'unknown';
54
+ }
55
+ function getExtension(filePath) {
56
+ const lastDot = filePath.lastIndexOf('.');
57
+ if (lastDot === -1)
58
+ return '';
59
+ return filePath.slice(lastDot).toLowerCase();
60
+ }
61
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/parsers/detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,aAAa,GAA6B;IAC9C,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,sCAAsC;AACtC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,cAAc;IACd,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,YAAY;IACZ,UAAU;IACV,aAAa;IACb,OAAO;IACP,MAAM;IACN,QAAQ;IACR,QAAQ;CACT,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,mBAAmB;IACnB,WAAW;IACX,gBAAgB;IAChB,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,IAAI,KAAK,SAAS,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Extraction des appels API depuis le code source (fetch, axios, custom clients).
3
+ * Patterns supportes : fetch('/api/...'), axios.get('/api/...'), api.post('/api/...'),
4
+ * template literals avec expressions (`/api/users/${id}`).
5
+ */
6
+ import type { SourceFile } from 'ts-morph';
7
+ import type { ApiCallInfo } from '../base-parser.js';
8
+ /** Extrait tous les appels API d'un fichier source */
9
+ export declare function extractApiCalls(sourceFile: SourceFile): ApiCallInfo[];
10
+ //# sourceMappingURL=api-calls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-calls.d.ts","sourceRoot":"","sources":["../../../src/parsers/extractors/api-calls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,UAAU,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW,EAAE,CAoCrE"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Extraction des appels API depuis le code source (fetch, axios, custom clients).
3
+ * Patterns supportes : fetch('/api/...'), axios.get('/api/...'), api.post('/api/...'),
4
+ * template literals avec expressions (`/api/users/${id}`).
5
+ */
6
+ import { Node } from 'ts-morph';
7
+ const HTTP_METHOD_NAMES = new Set(['get', 'post', 'put', 'patch', 'delete']);
8
+ /** Extrait tous les appels API d'un fichier source */
9
+ export function extractApiCalls(sourceFile) {
10
+ const calls = [];
11
+ sourceFile.forEachDescendant((node) => {
12
+ if (!Node.isCallExpression(node))
13
+ return;
14
+ const expr = node.getExpression();
15
+ // Pattern 1 : fetch('/api/...') ou fetch(`/api/...`)
16
+ if (Node.isIdentifier(expr) && expr.getText() === 'fetch') {
17
+ const url = extractUrlArg(node);
18
+ if (url) {
19
+ const method = inferFetchMethod(node);
20
+ calls.push({ method, url, line: node.getStartLineNumber() });
21
+ }
22
+ return;
23
+ }
24
+ // Pattern 2 : axios.get('/api/...'), api.post('/api/...'), apiClient.delete('/api/...')
25
+ if (Node.isPropertyAccessExpression(expr)) {
26
+ const methodName = expr.getName().toLowerCase();
27
+ if (HTTP_METHOD_NAMES.has(methodName)) {
28
+ const url = extractUrlArg(node);
29
+ if (url) {
30
+ calls.push({
31
+ method: methodName.toUpperCase(),
32
+ url,
33
+ line: node.getStartLineNumber(),
34
+ });
35
+ }
36
+ }
37
+ return;
38
+ }
39
+ });
40
+ return calls;
41
+ }
42
+ /** Extrait l'URL du premier argument d'un call (string literal ou template literal) */
43
+ function extractUrlArg(callExpr) {
44
+ const args = callExpr.getArguments();
45
+ if (args.length === 0)
46
+ return null;
47
+ const firstArg = args[0];
48
+ // String literal : fetch('/api/users')
49
+ if (Node.isStringLiteral(firstArg)) {
50
+ const value = firstArg.getLiteralValue();
51
+ return isApiUrl(value) ? value : null;
52
+ }
53
+ // Template literal avec expressions : fetch(`/api/users/${id}`) → /api/users/:param
54
+ if (Node.isTemplateExpression(firstArg)) {
55
+ const head = firstArg.getHead().getLiteralText();
56
+ if (!isApiUrl(head))
57
+ return null;
58
+ let url = head;
59
+ for (const span of firstArg.getTemplateSpans()) {
60
+ url += ':param' + span.getLiteral().getLiteralText();
61
+ }
62
+ return url;
63
+ }
64
+ // Template literal sans expression (NoSubstitutionTemplateLiteral)
65
+ if (Node.isNoSubstitutionTemplateLiteral(firstArg)) {
66
+ const value = firstArg.getLiteralValue();
67
+ return isApiUrl(value) ? value : null;
68
+ }
69
+ return null;
70
+ }
71
+ /**
72
+ * Verifie si l'URL ressemble a un appel API.
73
+ * Patterns reconnus : /api/..., /auth/..., /v1/..., http://..., https://...
74
+ */
75
+ function isApiUrl(url) {
76
+ return /^(\/api|\/auth|\/v\d|https?:\/\/)/.test(url);
77
+ }
78
+ /** Infere la methode HTTP depuis les options de fetch (default: GET) */
79
+ function inferFetchMethod(callExpr) {
80
+ const args = callExpr.getArguments();
81
+ if (args.length < 2)
82
+ return 'GET';
83
+ const options = args[1];
84
+ if (!Node.isObjectLiteralExpression(options))
85
+ return 'GET';
86
+ const methodProp = options.getProperty('method');
87
+ if (!methodProp || !Node.isPropertyAssignment(methodProp))
88
+ return 'GET';
89
+ const initializer = methodProp.getInitializer();
90
+ if (!initializer)
91
+ return 'GET';
92
+ const text = initializer.getText().replace(/['"]/g, '').toUpperCase();
93
+ const valid = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];
94
+ if (valid.includes(text)) {
95
+ return text;
96
+ }
97
+ return 'UNKNOWN';
98
+ }
99
+ //# sourceMappingURL=api-calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-calls.js","sourceRoot":"","sources":["../../../src/parsers/extractors/api-calls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Detection des decorateurs d'authentification sur les routes NestJS.
3
+ * Detecte @UseGuards, @Public, @Roles, @Auth, @Authorized sur les methodes et classes.
4
+ */
5
+ import type { MethodDeclaration, ClassDeclaration } from 'ts-morph';
6
+ /** Extrait les decorateurs d'auth sur une methode ou sa classe */
7
+ export declare function extractAuthGuards(method: MethodDeclaration, cls: ClassDeclaration): string[];
8
+ //# sourceMappingURL=auth-guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-guards.d.ts","sourceRoot":"","sources":["../../../src/parsers/extractors/auth-guards.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIpE,kEAAkE;AAClE,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,GAAG,EAAE,gBAAgB,GACpB,MAAM,EAAE,CAkBV"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Detection des decorateurs d'authentification sur les routes NestJS.
3
+ * Detecte @UseGuards, @Public, @Roles, @Auth, @Authorized sur les methodes et classes.
4
+ */
5
+ const AUTH_DECORATORS = ['UseGuards', 'Public', 'Roles', 'Auth', 'Authorized'];
6
+ /** Extrait les decorateurs d'auth sur une methode ou sa classe */
7
+ export function extractAuthGuards(method, cls) {
8
+ const guards = [];
9
+ // Decorateurs sur la methode
10
+ for (const deco of method.getDecorators()) {
11
+ if (AUTH_DECORATORS.includes(deco.getName())) {
12
+ guards.push(`@${deco.getName()}(${deco.getArguments().map(a => a.getText()).join(', ')})`);
13
+ }
14
+ }
15
+ // Decorateurs sur la classe (s'appliquent a toutes les routes)
16
+ for (const deco of cls.getDecorators()) {
17
+ if (AUTH_DECORATORS.includes(deco.getName())) {
18
+ guards.push(`@${deco.getName()}(${deco.getArguments().map(a => a.getText()).join(', ')})`);
19
+ }
20
+ }
21
+ return guards;
22
+ }
23
+ //# sourceMappingURL=auth-guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-guards.js","sourceRoot":"","sources":["../../../src/parsers/extractors/auth-guards.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAE/E,kEAAkE;AAClE,MAAM,UAAU,iBAAiB,CAC/B,MAAyB,EACzB,GAAqB;IAErB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,6BAA6B;IAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC;QAC1C,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;QACvC,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Parser custom pour schema.prisma.
3
+ * Extrait les modeles, champs, relations et enums.
4
+ * Produit un FileNode compatible avec le reste du systeme.
5
+ */
6
+ import type { FileNode } from './base-parser.js';
7
+ export interface PrismaModel {
8
+ name: string;
9
+ fields: PrismaField[];
10
+ /** Attributs de modele (@@map, @@index, etc.) */
11
+ attributes: string[];
12
+ line: number;
13
+ }
14
+ export interface PrismaField {
15
+ name: string;
16
+ type: string;
17
+ /** Type Prisma brut (ex: "String", "Int", "User", "Role") */
18
+ prismaType: string;
19
+ isOptional: boolean;
20
+ isList: boolean;
21
+ isRelation: boolean;
22
+ /** Modele cible si c'est une relation */
23
+ relationTarget?: string;
24
+ /** Attributs du champ (@id, @unique, @default, etc.) */
25
+ attributes: string[];
26
+ line: number;
27
+ }
28
+ export interface PrismaEnum {
29
+ name: string;
30
+ values: string[];
31
+ line: number;
32
+ }
33
+ export interface PrismaSchema {
34
+ models: PrismaModel[];
35
+ enums: PrismaEnum[];
36
+ filePath: string;
37
+ }
38
+ /** Parse un fichier schema.prisma */
39
+ export declare function parsePrismaSchema(filePath: string): PrismaSchema;
40
+ /**
41
+ * Convertit un schema Prisma en FileNode pour l'intégrer dans l'index CodeGuard.
42
+ * Chaque modele devient un TypeInfo, chaque enum aussi.
43
+ */
44
+ export declare function prismaSchemaToFileNode(schema: PrismaSchema): FileNode;
45
+ //# sourceMappingURL=prisma-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/prisma-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAA0B,MAAM,kBAAkB,CAAC;AAGzE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,iDAAiD;IACjD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qCAAqC;AACrC,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAiChE;AAgID;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,CAkDrE"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Parser custom pour schema.prisma.
3
+ * Extrait les modeles, champs, relations et enums.
4
+ * Produit un FileNode compatible avec le reste du systeme.
5
+ */
6
+ import { readFileSync } from 'node:fs';
7
+ /** Parse un fichier schema.prisma */
8
+ export function parsePrismaSchema(filePath) {
9
+ const content = readFileSync(filePath, 'utf-8');
10
+ const lines = content.split('\n');
11
+ const models = [];
12
+ const enums = [];
13
+ let i = 0;
14
+ while (i < lines.length) {
15
+ const line = lines[i].trim();
16
+ // Model
17
+ const modelMatch = line.match(/^model\s+(\w+)\s*\{/);
18
+ if (modelMatch) {
19
+ const { model, endLine } = parseModel(modelMatch[1], lines, i);
20
+ models.push(model);
21
+ i = endLine + 1;
22
+ continue;
23
+ }
24
+ // Enum
25
+ const enumMatch = line.match(/^enum\s+(\w+)\s*\{/);
26
+ if (enumMatch) {
27
+ const { prismaEnum, endLine } = parseEnum(enumMatch[1], lines, i);
28
+ enums.push(prismaEnum);
29
+ i = endLine + 1;
30
+ continue;
31
+ }
32
+ i++;
33
+ }
34
+ return { models, enums, filePath };
35
+ }
36
+ function parseModel(name, lines, startLine) {
37
+ const fields = [];
38
+ const attributes = [];
39
+ let i = startLine + 1;
40
+ while (i < lines.length) {
41
+ const line = lines[i].trim();
42
+ if (line === '}')
43
+ break;
44
+ // Attribut de modele (@@map, @@index, etc.)
45
+ if (line.startsWith('@@')) {
46
+ attributes.push(line);
47
+ i++;
48
+ continue;
49
+ }
50
+ // Ligne vide ou commentaire
51
+ if (!line || line.startsWith('//')) {
52
+ i++;
53
+ continue;
54
+ }
55
+ // Champ
56
+ const field = parseField(line, i + 1);
57
+ if (field)
58
+ fields.push(field);
59
+ i++;
60
+ }
61
+ return {
62
+ model: { name, fields, attributes, line: startLine + 1 },
63
+ endLine: i,
64
+ };
65
+ }
66
+ function parseField(line, lineNumber) {
67
+ // Format : nomChamp Type? @attributs...
68
+ // Exemples :
69
+ // id String @id @default(cuid())
70
+ // email String @unique
71
+ // role Role @default(TECHNICIEN)
72
+ // deletedAt DateTime?
73
+ // tournees Tournee[]
74
+ // user User @relation(fields: [userId], references: [id])
75
+ const match = line.match(/^(\w+)\s+(\w+)(\[\])?\s*(\?)?\s*(.*)?$/);
76
+ if (!match)
77
+ return null;
78
+ const [, name, rawType, listMarker, optionalMarker, rest] = match;
79
+ const isList = listMarker === '[]';
80
+ const isOptional = optionalMarker === '?' || (rest ?? '').includes('?');
81
+ const attributes = extractAttributes(rest ?? '');
82
+ // Detecter si c'est une relation (type commence par une majuscule et n'est pas un type Prisma primitif)
83
+ const primitiveTypes = new Set([
84
+ 'String', 'Int', 'Float', 'Boolean', 'DateTime', 'Json', 'Bytes', 'BigInt', 'Decimal',
85
+ ]);
86
+ const isRelation = !primitiveTypes.has(rawType) && /^[A-Z]/.test(rawType);
87
+ return {
88
+ name,
89
+ type: mapPrismaType(rawType, isList, isOptional),
90
+ prismaType: rawType,
91
+ isOptional,
92
+ isList,
93
+ isRelation,
94
+ relationTarget: isRelation ? rawType : undefined,
95
+ attributes,
96
+ line: lineNumber,
97
+ };
98
+ }
99
+ function parseEnum(name, lines, startLine) {
100
+ const values = [];
101
+ let i = startLine + 1;
102
+ while (i < lines.length) {
103
+ const line = lines[i].trim();
104
+ if (line === '}')
105
+ break;
106
+ if (line && !line.startsWith('//')) {
107
+ values.push(line);
108
+ }
109
+ i++;
110
+ }
111
+ return {
112
+ prismaEnum: { name, values, line: startLine + 1 },
113
+ endLine: i,
114
+ };
115
+ }
116
+ function extractAttributes(rest) {
117
+ const attrs = [];
118
+ const regex = /@\w+(\([^)]*\))?/g;
119
+ let match;
120
+ while ((match = regex.exec(rest)) !== null) {
121
+ attrs.push(match[0]);
122
+ }
123
+ return attrs;
124
+ }
125
+ /** Convertit un type Prisma en type TypeScript equivalent */
126
+ function mapPrismaType(prismaType, isList, isOptional) {
127
+ const typeMap = {
128
+ String: 'string',
129
+ Int: 'number',
130
+ Float: 'number',
131
+ Boolean: 'boolean',
132
+ DateTime: 'Date',
133
+ Json: 'unknown',
134
+ Bytes: 'Buffer',
135
+ BigInt: 'bigint',
136
+ Decimal: 'number',
137
+ };
138
+ let tsType = typeMap[prismaType] ?? prismaType;
139
+ if (isList)
140
+ tsType += '[]';
141
+ if (isOptional)
142
+ tsType += ' | null';
143
+ return tsType;
144
+ }
145
+ /**
146
+ * Convertit un schema Prisma en FileNode pour l'intégrer dans l'index CodeGuard.
147
+ * Chaque modele devient un TypeInfo, chaque enum aussi.
148
+ */
149
+ export function prismaSchemaToFileNode(schema) {
150
+ const types = [];
151
+ // Modeles → TypeInfo avec proprietes
152
+ for (const model of schema.models) {
153
+ types.push({
154
+ name: model.name,
155
+ kind: 'interface',
156
+ isExported: true,
157
+ properties: model.fields
158
+ .filter((f) => !f.isRelation) // Exclure les relations (pas dans les DTOs)
159
+ .map((f) => ({
160
+ name: f.name,
161
+ type: f.type,
162
+ isOptional: f.isOptional,
163
+ })),
164
+ line: model.line,
165
+ });
166
+ }
167
+ // Enums → TypeInfo
168
+ for (const prismaEnum of schema.enums) {
169
+ types.push({
170
+ name: prismaEnum.name,
171
+ kind: 'enum',
172
+ isExported: true,
173
+ properties: prismaEnum.values.map((v) => ({
174
+ name: v,
175
+ type: 'string',
176
+ isOptional: false,
177
+ })),
178
+ line: prismaEnum.line,
179
+ });
180
+ }
181
+ return {
182
+ filePath: schema.filePath,
183
+ language: 'prisma',
184
+ imports: [],
185
+ exports: types.map((t) => ({
186
+ name: t.name,
187
+ kind: t.kind === 'enum' ? 'enum' : 'type',
188
+ isTypeOnly: true,
189
+ })),
190
+ functions: [],
191
+ classes: [],
192
+ types,
193
+ routes: [],
194
+ parsedAt: Date.now(),
195
+ };
196
+ }
197
+ //# sourceMappingURL=prisma-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-parser.js","sourceRoot":"","sources":["../../src/parsers/prisma-parser.ts"],"names":[],"mappings":"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"}