@nithin554/code-crawler 0.1.63 → 0.1.65

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 (82) hide show
  1. package/README.md +35 -12
  2. package/dist/crawler.js +4 -7
  3. package/dist/crawler.js.map +1 -1
  4. package/dist/parser/frameworks/aspectj.d.ts +3 -0
  5. package/dist/parser/frameworks/aspectj.js +15 -0
  6. package/dist/parser/frameworks/aspectj.js.map +1 -0
  7. package/dist/parser/frameworks/celery.d.ts +3 -0
  8. package/dist/parser/frameworks/celery.js +15 -0
  9. package/dist/parser/frameworks/celery.js.map +1 -0
  10. package/dist/parser/frameworks/dependencyInjector.d.ts +3 -0
  11. package/dist/parser/frameworks/dependencyInjector.js +8 -0
  12. package/dist/parser/frameworks/dependencyInjector.js.map +1 -0
  13. package/dist/parser/frameworks/events.d.ts +3 -0
  14. package/dist/parser/frameworks/events.js +13 -0
  15. package/dist/parser/frameworks/events.js.map +1 -0
  16. package/dist/parser/frameworks/express.d.ts +6 -0
  17. package/dist/parser/frameworks/express.js +9 -0
  18. package/dist/parser/frameworks/express.js.map +1 -0
  19. package/dist/parser/frameworks/fastapi.d.ts +3 -0
  20. package/dist/parser/frameworks/fastapi.js +17 -0
  21. package/dist/parser/frameworks/fastapi.js.map +1 -0
  22. package/dist/parser/frameworks/fastify.d.ts +3 -0
  23. package/dist/parser/frameworks/fastify.js +6 -0
  24. package/dist/parser/frameworks/fastify.js.map +1 -0
  25. package/dist/parser/frameworks/flask.d.ts +3 -0
  26. package/dist/parser/frameworks/flask.js +12 -0
  27. package/dist/parser/frameworks/flask.js.map +1 -0
  28. package/dist/parser/frameworks/index.d.ts +38 -0
  29. package/dist/parser/frameworks/index.js +167 -0
  30. package/dist/parser/frameworks/index.js.map +1 -0
  31. package/dist/parser/frameworks/jakarta.d.ts +3 -0
  32. package/dist/parser/frameworks/jakarta.js +7 -0
  33. package/dist/parser/frameworks/jakarta.js.map +1 -0
  34. package/dist/parser/frameworks/jest.d.ts +3 -0
  35. package/dist/parser/frameworks/jest.js +10 -0
  36. package/dist/parser/frameworks/jest.js.map +1 -0
  37. package/dist/parser/frameworks/junit.d.ts +3 -0
  38. package/dist/parser/frameworks/junit.js +11 -0
  39. package/dist/parser/frameworks/junit.js.map +1 -0
  40. package/dist/parser/frameworks/nestjs.d.ts +7 -0
  41. package/dist/parser/frameworks/nestjs.js +49 -0
  42. package/dist/parser/frameworks/nestjs.js.map +1 -0
  43. package/dist/parser/frameworks/nestjsParam.d.ts +3 -0
  44. package/dist/parser/frameworks/nestjsParam.js +19 -0
  45. package/dist/parser/frameworks/nestjsParam.js.map +1 -0
  46. package/dist/parser/frameworks/pytest.d.ts +3 -0
  47. package/dist/parser/frameworks/pytest.js +11 -0
  48. package/dist/parser/frameworks/pytest.js.map +1 -0
  49. package/dist/parser/frameworks/spring.d.ts +3 -0
  50. package/dist/parser/frameworks/spring.js +23 -0
  51. package/dist/parser/frameworks/spring.js.map +1 -0
  52. package/dist/parser/frameworks/tsDi.d.ts +6 -0
  53. package/dist/parser/frameworks/tsDi.js +9 -0
  54. package/dist/parser/frameworks/tsDi.js.map +1 -0
  55. package/dist/parser/frameworks/types.d.ts +52 -0
  56. package/dist/parser/frameworks/types.js +2 -0
  57. package/dist/parser/frameworks/types.js.map +1 -0
  58. package/dist/parser/language.d.ts +16 -0
  59. package/dist/parser/languages/index.d.ts +4 -2
  60. package/dist/parser/languages/index.js +8 -4
  61. package/dist/parser/languages/index.js.map +1 -1
  62. package/dist/parser/languages/java.d.ts +2 -2
  63. package/dist/parser/languages/java.js +36 -70
  64. package/dist/parser/languages/java.js.map +1 -1
  65. package/dist/parser/languages/python.d.ts +2 -2
  66. package/dist/parser/languages/python.js +30 -21
  67. package/dist/parser/languages/python.js.map +1 -1
  68. package/dist/parser/languages/typescript.d.ts +2 -2
  69. package/dist/parser/languages/typescript.js +49 -66
  70. package/dist/parser/languages/typescript.js.map +1 -1
  71. package/dist/resolver/genericResolver.d.ts +7 -1
  72. package/dist/resolver/genericResolver.js +10 -0
  73. package/dist/resolver/genericResolver.js.map +1 -1
  74. package/dist/resolver/javaResolver.d.ts +6 -1
  75. package/dist/resolver/javaResolver.js +9 -0
  76. package/dist/resolver/javaResolver.js.map +1 -1
  77. package/dist/resolver/registry.d.ts +15 -0
  78. package/dist/resolver/registry.js +36 -0
  79. package/dist/resolver/registry.js.map +1 -0
  80. package/dist/resolver/types.d.ts +22 -0
  81. package/dist/resolver/types.js.map +1 -1
  82. package/package.json +1 -1
@@ -0,0 +1,167 @@
1
+ import { aspectj } from "./aspectj.js";
2
+ import { celery } from "./celery.js";
3
+ import { dependencyInjector } from "./dependencyInjector.js";
4
+ import { events } from "./events.js";
5
+ import { express } from "./express.js";
6
+ import { fastapi } from "./fastapi.js";
7
+ import { fastify } from "./fastify.js";
8
+ import { flask } from "./flask.js";
9
+ import { jakarta } from "./jakarta.js";
10
+ import { jest } from "./jest.js";
11
+ import { junit } from "./junit.js";
12
+ import { nestjs } from "./nestjs.js";
13
+ import { nestjsParam } from "./nestjsParam.js";
14
+ import { pytest } from "./pytest.js";
15
+ import { spring } from "./spring.js";
16
+ import { tsDi } from "./tsDi.js";
17
+ /**
18
+ * Registration order decides ties when no import evidence separates two claims,
19
+ * so specific frameworks are listed before generic ones.
20
+ */
21
+ const REGISTRY = [
22
+ spring,
23
+ jakarta,
24
+ aspectj,
25
+ junit,
26
+ jest,
27
+ nestjs,
28
+ nestjsParam,
29
+ fastapi,
30
+ flask,
31
+ dependencyInjector,
32
+ pytest,
33
+ celery,
34
+ events,
35
+ express,
36
+ fastify,
37
+ tsDi,
38
+ ];
39
+ const BY_NAME = new Map(REGISTRY.map((module) => [module.name, module]));
40
+ /** Every registered framework, in precedence order. */
41
+ export function listFrameworks() {
42
+ return [...REGISTRY];
43
+ }
44
+ /** Registered framework names, in precedence order. */
45
+ export function frameworkNames() {
46
+ return REGISTRY.map((module) => module.name);
47
+ }
48
+ export function frameworkNamed(name) {
49
+ return BY_NAME.get(name);
50
+ }
51
+ function evidenceMatches(importInfo, module) {
52
+ const prefixes = module.evidence ?? [];
53
+ if (prefixes.length === 0)
54
+ return false;
55
+ const candidates = [importInfo.fqn, importInfo.module, importInfo.importedName].filter((candidate) => typeof candidate === "string" && candidate.length > 0);
56
+ return candidates.some((candidate) => prefixes.some((prefix) => candidate === prefix || candidate.startsWith(prefix)));
57
+ }
58
+ /**
59
+ * Build the conventions a file is judged against. Imports come first so a
60
+ * project that evidences `dependency_injector` attributes `@inject` there,
61
+ * while a Java file with no such import still falls back to the registry.
62
+ */
63
+ export function frameworkScope(imports = [], preferred = [], caseInsensitive = false) {
64
+ const evidenced = REGISTRY.filter((module) => imports.some((importInfo) => evidenceMatches(importInfo, module)));
65
+ const preferredModules = preferred
66
+ .map((name) => frameworkNamed(name))
67
+ .filter((module) => module !== undefined);
68
+ return { evidenced, preferred: preferredModules, all: [...REGISTRY], caseInsensitive };
69
+ }
70
+ function ordered(scope) {
71
+ const seen = new Set();
72
+ const result = [];
73
+ for (const module of [...scope.evidenced, ...scope.preferred, ...scope.all]) {
74
+ if (seen.has(module.name))
75
+ continue;
76
+ seen.add(module.name);
77
+ result.push(module);
78
+ }
79
+ return result;
80
+ }
81
+ function lastSegment(name) {
82
+ const dot = name.lastIndexOf(".");
83
+ return dot === -1 ? [name] : [name, name.slice(dot + 1)];
84
+ }
85
+ function matchKey(table, candidate, caseInsensitive) {
86
+ if (!table)
87
+ return undefined;
88
+ const parts = lastSegment(candidate);
89
+ for (const key of parts) {
90
+ if (Object.hasOwn(table, key))
91
+ return table[key];
92
+ }
93
+ if (!caseInsensitive)
94
+ return undefined;
95
+ for (const [key, value] of Object.entries(table)) {
96
+ const lower = key.toLowerCase();
97
+ if (parts.some((part) => part.toLowerCase() === lower))
98
+ return value;
99
+ }
100
+ return undefined;
101
+ }
102
+ function matchQualifiedPrefix(table, qualified) {
103
+ if (!table)
104
+ return undefined;
105
+ const lower = qualified.toLowerCase();
106
+ for (const [prefix, value] of Object.entries(table)) {
107
+ if (lower.startsWith(prefix))
108
+ return value;
109
+ }
110
+ return undefined;
111
+ }
112
+ /**
113
+ * What an annotation means, if anything. `accept` lets a language keep its own
114
+ * extra condition (Python only treats a verb decorator as HTTP when a receiver
115
+ * or the `route` name is present).
116
+ */
117
+ export function entryPointIn(scope, name, qualified, accept) {
118
+ for (const module of ordered(scope)) {
119
+ const spec = matchKey(module.entryPoints, name, scope.caseInsensitive) ??
120
+ (qualified ? matchQualifiedPrefix(module.qualifiedPrefixes, qualified) : undefined);
121
+ if (!spec)
122
+ continue;
123
+ if (accept && !accept(spec))
124
+ continue;
125
+ return { module, spec };
126
+ }
127
+ return undefined;
128
+ }
129
+ /** Framework label an annotation attributes an injection to. */
130
+ export function injectionIn(scope, name) {
131
+ for (const module of ordered(scope)) {
132
+ const label = matchKey(module.injections, name, scope.caseInsensitive);
133
+ if (label === undefined)
134
+ continue;
135
+ return label === true ? module.name : label;
136
+ }
137
+ return undefined;
138
+ }
139
+ /** Whether an annotation marks a class as container-managed. */
140
+ export function injectableIn(scope, name) {
141
+ return ordered(scope).some((module) => (module.injectables ?? []).some((marker) => scope.caseInsensitive ? marker.toLowerCase() === name.toLowerCase() : marker === name));
142
+ }
143
+ /** Whether an annotation marks an aspect class. */
144
+ export function aspectIn(scope, name) {
145
+ return ordered(scope).some((module) => (module.aspects ?? []).some((marker) => scope.caseInsensitive ? marker.toLowerCase() === name.toLowerCase() : marker === name));
146
+ }
147
+ /** Advice kind an annotation implies (`before`, `around`, ...). */
148
+ export function adviceIn(scope, name) {
149
+ for (const module of ordered(scope)) {
150
+ const kind = matchKey(module.advice, name, scope.caseInsensitive);
151
+ if (kind)
152
+ return { module, kind };
153
+ }
154
+ return undefined;
155
+ }
156
+ /** Injection label implied by a raw marker in a parameter list, e.g. `Depends(`. */
157
+ export function paramMarkerIn(scope, text) {
158
+ const compact = text.replace(/\s+/g, "");
159
+ for (const module of ordered(scope)) {
160
+ for (const [marker, label] of Object.entries(module.paramMarkers ?? {})) {
161
+ if (compact.includes(marker.replace(/\s+/g, "")))
162
+ return label;
163
+ }
164
+ }
165
+ return undefined;
166
+ }
167
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parser/frameworks/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FrameworkModule } from "./types.js";
2
+ /** Jakarta EE / JSR-330 injection annotations. */
3
+ export declare const jakarta: FrameworkModule;
@@ -0,0 +1,7 @@
1
+ /** Jakarta EE / JSR-330 injection annotations. */
2
+ export const jakarta = {
3
+ name: "jakarta",
4
+ evidence: ["jakarta.", "javax."],
5
+ injections: { Inject: true, Resource: true, ManagedProperty: true },
6
+ };
7
+ //# sourceMappingURL=jakarta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jakarta.js","sourceRoot":"","sources":["../../../src/parser/frameworks/jakarta.ts"],"names":[],"mappings":"AAEA,kDAAkD;AAClD,MAAM,CAAC,MAAM,OAAO,GAAoB;IACtC,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;IAChC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE;CACpE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FrameworkModule } from "./types.js";
2
+ /** Jest/Mocha test declarations. */
3
+ export declare const jest: FrameworkModule;
@@ -0,0 +1,10 @@
1
+ /** Jest/Mocha test declarations. */
2
+ export const jest = {
3
+ name: "jest",
4
+ evidence: ["@jest/", "jest", "mocha"],
5
+ entryPoints: {
6
+ Test: { kind: "test" },
7
+ It: { kind: "test" },
8
+ },
9
+ };
10
+ //# sourceMappingURL=jest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jest.js","sourceRoot":"","sources":["../../../src/parser/frameworks/jest.ts"],"names":[],"mappings":"AAEA,oCAAoC;AACpC,MAAM,CAAC,MAAM,IAAI,GAAoB;IACnC,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;IACrC,WAAW,EAAE;QACX,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACtB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KACrB;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FrameworkModule } from "./types.js";
2
+ /** JUnit: test-method annotations that make a method a framework-invoked root. */
3
+ export declare const junit: FrameworkModule;
@@ -0,0 +1,11 @@
1
+ /** JUnit: test-method annotations that make a method a framework-invoked root. */
2
+ export const junit = {
3
+ name: "junit",
4
+ evidence: ["org.junit"],
5
+ entryPoints: {
6
+ Test: { kind: "test" },
7
+ ParameterizedTest: { kind: "test" },
8
+ RepeatedTest: { kind: "test" },
9
+ },
10
+ };
11
+ //# sourceMappingURL=junit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"junit.js","sourceRoot":"","sources":["../../../src/parser/frameworks/junit.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,MAAM,CAAC,MAAM,KAAK,GAAoB;IACpC,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,CAAC,WAAW,CAAC;IACvB,WAAW,EAAE;QACX,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACtB,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACnC,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAC/B;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { FrameworkModule } from "./types.js";
2
+ /**
3
+ * NestJS: route/messaging/scheduler/event decorators, its injection decorators,
4
+ * and the class decorators that make a class container-managed. The Angular
5
+ * class decorators share this list because the parser labels both `nestjs`.
6
+ */
7
+ export declare const nestjs: FrameworkModule;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * NestJS: route/messaging/scheduler/event decorators, its injection decorators,
3
+ * and the class decorators that make a class container-managed. The Angular
4
+ * class decorators share this list because the parser labels both `nestjs`.
5
+ */
6
+ export const nestjs = {
7
+ name: "nestjs",
8
+ evidence: ["@nestjs/"],
9
+ entryPoints: {
10
+ Get: { kind: "http", httpMethod: "GET" },
11
+ Post: { kind: "http", httpMethod: "POST" },
12
+ Put: { kind: "http", httpMethod: "PUT" },
13
+ Delete: { kind: "http", httpMethod: "DELETE" },
14
+ Patch: { kind: "http", httpMethod: "PATCH" },
15
+ Head: { kind: "http", httpMethod: "HEAD" },
16
+ Options: { kind: "http", httpMethod: "OPTIONS" },
17
+ All: { kind: "http", httpMethod: "ALL" },
18
+ MessagePattern: { kind: "messaging" },
19
+ EventPattern: { kind: "messaging" },
20
+ OnMessage: { kind: "messaging" },
21
+ Cron: { kind: "scheduler" },
22
+ Interval: { kind: "scheduler" },
23
+ Timeout: { kind: "scheduler" },
24
+ OnEvent: { kind: "event" },
25
+ EventSubscriber: { kind: "event" },
26
+ SubscribeMessage: { kind: "event" },
27
+ },
28
+ injections: {
29
+ Inject: true,
30
+ InjectRepository: true,
31
+ InjectModel: true,
32
+ InjectDataSource: true,
33
+ /** Spring-style decorator accepted by the TS parser. */
34
+ Autowired: "spring",
35
+ },
36
+ injectables: [
37
+ "Injectable",
38
+ "Controller",
39
+ "Component",
40
+ "Service",
41
+ "Directive",
42
+ "Pipe",
43
+ "Guard",
44
+ "Gateway",
45
+ "Resolver",
46
+ "Module",
47
+ ],
48
+ };
49
+ //# sourceMappingURL=nestjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestjs.js","sourceRoot":"","sources":["../../../src/parser/frameworks/nestjs.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAoB;IACrC,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,WAAW,EAAE;QACX,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;QACxC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE;QAC1C,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;QACxC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE;QAC9C,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE;QAC5C,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE;QAC1C,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE;QAChD,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;QACxC,cAAc,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QACrC,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QACnC,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAChC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC/B,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAC9B,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QAC1B,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QAClC,gBAAgB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KACpC;IACD,UAAU,EAAE;QACV,MAAM,EAAE,IAAI;QACZ,gBAAgB,EAAE,IAAI;QACtB,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,IAAI;QACtB,wDAAwD;QACxD,SAAS,EAAE,QAAQ;KACpB;IACD,WAAW,EAAE;QACX,YAAY;QACZ,YAAY;QACZ,WAAW;QACX,SAAS;QACT,WAAW;QACX,MAAM;QACN,OAAO;QACP,SAAS;QACT,UAAU;QACV,QAAQ;KACT;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FrameworkModule } from "./types.js";
2
+ /** Parameter decorators that bind a request value rather than inject a dependency. */
3
+ export declare const nestjsParam: FrameworkModule;
@@ -0,0 +1,19 @@
1
+ /** Parameter decorators that bind a request value rather than inject a dependency. */
2
+ export const nestjsParam = {
3
+ name: "nestjs-param",
4
+ evidence: ["@nestjs/"],
5
+ injections: {
6
+ Body: true,
7
+ Param: true,
8
+ Query: true,
9
+ Headers: true,
10
+ Req: true,
11
+ Res: true,
12
+ Session: true,
13
+ UploadedFile: true,
14
+ UploadedFiles: true,
15
+ Ip: true,
16
+ HostParam: true,
17
+ },
18
+ };
19
+ //# sourceMappingURL=nestjsParam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nestjsParam.js","sourceRoot":"","sources":["../../../src/parser/frameworks/nestjsParam.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,CAAC,MAAM,WAAW,GAAoB;IAC1C,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,UAAU,EAAE;QACV,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI;QACb,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,IAAI;QACT,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;QACnB,EAAE,EAAE,IAAI;QACR,SAAS,EAAE,IAAI;KAChB;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FrameworkModule } from "./types.js";
2
+ /** pytest: fixtures, parametrization, and `@pytest.mark.*` decorated tests. */
3
+ export declare const pytest: FrameworkModule;
@@ -0,0 +1,11 @@
1
+ /** pytest: fixtures, parametrization, and `@pytest.mark.*` decorated tests. */
2
+ export const pytest = {
3
+ name: "pytest",
4
+ evidence: ["pytest"],
5
+ entryPoints: {
6
+ fixture: { kind: "test" },
7
+ parametrize: { kind: "test" },
8
+ },
9
+ qualifiedPrefixes: { "mark.": { kind: "test" } },
10
+ };
11
+ //# sourceMappingURL=pytest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pytest.js","sourceRoot":"","sources":["../../../src/parser/frameworks/pytest.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,MAAM,GAAoB;IACrC,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACpB,WAAW,EAAE;QACX,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACzB,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAC9B;IACD,iBAAiB,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;CACjD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FrameworkModule } from "./types.js";
2
+ /** Spring: HTTP mappings, scheduling, events, and Spring messaging listeners. */
3
+ export declare const spring: FrameworkModule;
@@ -0,0 +1,23 @@
1
+ /** Spring: HTTP mappings, scheduling, events, and Spring messaging listeners. */
2
+ export const spring = {
3
+ name: "spring",
4
+ evidence: ["org.springframework"],
5
+ entryPoints: {
6
+ GetMapping: { kind: "http", httpMethod: "GET" },
7
+ PostMapping: { kind: "http", httpMethod: "POST" },
8
+ PutMapping: { kind: "http", httpMethod: "PUT" },
9
+ DeleteMapping: { kind: "http", httpMethod: "DELETE" },
10
+ PatchMapping: { kind: "http", httpMethod: "PATCH" },
11
+ RequestMapping: { kind: "http", httpMethod: "ANY" },
12
+ KafkaListener: { kind: "messaging" },
13
+ RabbitListener: { kind: "messaging" },
14
+ JmsListener: { kind: "messaging" },
15
+ StreamListener: { kind: "messaging" },
16
+ SqsListener: { kind: "messaging" },
17
+ Scheduled: { kind: "scheduler" },
18
+ EventListener: { kind: "event" },
19
+ TransactionalEventListener: { kind: "event" },
20
+ },
21
+ injections: { Autowired: true, Value: true, Qualifier: true },
22
+ };
23
+ //# sourceMappingURL=spring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring.js","sourceRoot":"","sources":["../../../src/parser/frameworks/spring.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,MAAM,CAAC,MAAM,MAAM,GAAoB;IACrC,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,qBAAqB,CAAC;IACjC,WAAW,EAAE;QACX,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;QAC/C,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE;QACjD,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;QAC/C,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE;QACrD,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE;QACnD,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;QACnD,aAAa,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QACpC,cAAc,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QACrC,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAClC,cAAc,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QACrC,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAClC,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;QAChC,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QAChC,0BAA0B,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KAC9C;IACD,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;CAC9D,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { FrameworkModule } from "./types.js";
2
+ /**
3
+ * TypeScript DI containers: no marker annotation, so a parameter is attributed
4
+ * here only through the parser's constructor-injection default.
5
+ */
6
+ export declare const tsDi: FrameworkModule;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * TypeScript DI containers: no marker annotation, so a parameter is attributed
3
+ * here only through the parser's constructor-injection default.
4
+ */
5
+ export const tsDi = {
6
+ name: "ts-di",
7
+ evidence: ["tsyringe", "inversify", "typedi", "@nestjs/"],
8
+ };
9
+ //# sourceMappingURL=tsDi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsDi.js","sourceRoot":"","sources":["../../../src/parser/frameworks/tsDi.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,IAAI,GAAoB;IACnC,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC;CAC1D,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { EntryPointInfo } from "../language.js";
2
+ /** What a framework annotation implies for the symbol it is attached to. */
3
+ export interface EntryPointSpec {
4
+ kind: EntryPointInfo["kind"];
5
+ /** HTTP verb the annotation implies; `ANY` when the annotation is verb-agnostic. */
6
+ httpMethod?: string;
7
+ }
8
+ /**
9
+ * One framework's conventions.
10
+ *
11
+ * Detection is data: a parser asks the registry what an annotation means instead
12
+ * of carrying its own table, so supporting a new framework is a new file here
13
+ * rather than an edit to every language that can host it.
14
+ */
15
+ export interface FrameworkModule {
16
+ /** Registry key; also the default label for injections attributed to it. */
17
+ name: string;
18
+ /**
19
+ * Import prefixes that evidence this framework in a file. Used to break ties
20
+ * when two frameworks claim the same annotation (e.g. `Inject`).
21
+ */
22
+ evidence?: string[];
23
+ /** Annotations/decorators that make the annotated method a root. */
24
+ entryPoints?: Record<string, EntryPointSpec>;
25
+ /** Qualified-name prefixes that also mark a root, e.g. pytest's `mark.`. */
26
+ qualifiedPrefixes?: Record<string, EntryPointSpec>;
27
+ /** Annotations that request injection: name -> label (defaults to `name`). */
28
+ injections?: Record<string, string | true>;
29
+ /** Annotations that mark a class as container-managed. */
30
+ injectables?: string[];
31
+ /** Annotations that mark an aspect class. */
32
+ aspects?: string[];
33
+ /** Advice annotations: name -> advice kind (`before`, `around`, ...). */
34
+ advice?: Record<string, string>;
35
+ /** Raw markers inside a parameter list -> injection label. */
36
+ paramMarkers?: Record<string, string>;
37
+ }
38
+ /**
39
+ * The framework conventions a single file is judged against, ordered by how
40
+ * much evidence supports them: imports first, then the language descriptor's
41
+ * declared frameworks, then everything registered.
42
+ */
43
+ export interface FrameworkScope {
44
+ /** Modules evidenced by the file's own imports. */
45
+ evidenced: FrameworkModule[];
46
+ /** Modules the language descriptor declares, in declaration order. */
47
+ preferred: FrameworkModule[];
48
+ /** Every registered module. */
49
+ all: FrameworkModule[];
50
+ /** Compare annotation names case-insensitively (Python lower-cases decorators). */
51
+ caseInsensitive: boolean;
52
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/parser/frameworks/types.ts"],"names":[],"mappings":""}
@@ -253,3 +253,19 @@ export interface LanguageConfig {
253
253
  /** Extract structural entities + raw call sites from source text. */
254
254
  parseFile(source: string, filePath: string, context?: ParseContext): Promise<ParsedFile>;
255
255
  }
256
+ /**
257
+ * Everything that makes a language a language. One descriptor per language,
258
+ * declared next to its parser, so adding language #5 is one config module, one
259
+ * resolver module, and one fixture directory — no edits to existing languages.
260
+ */
261
+ export interface LanguageDescriptor extends LanguageConfig {
262
+ /** Registry key of the call resolver in `src/resolver/registry.ts`. */
263
+ resolver: string;
264
+ /**
265
+ * Frameworks whose conventions this parser recognises, keyed by the import or
266
+ * annotation evidence that triggers detection.
267
+ */
268
+ frameworks: string[];
269
+ /** Conformance fixture directory, as segments relative to `tests/fixtures`. */
270
+ fixture: string[];
271
+ }
@@ -1,6 +1,8 @@
1
- import type { LanguageConfig } from "../language.js";
2
- export declare function getLanguageConfig(name: string): LanguageConfig | null;
1
+ import type { LanguageConfig, LanguageDescriptor } from "../language.js";
2
+ export declare function getLanguageConfig(name: string): LanguageDescriptor | null;
3
3
  export declare function listLanguages(): string[];
4
+ /** Every descriptor, in registration order. */
5
+ export declare function listLanguageDescriptors(): LanguageDescriptor[];
4
6
  /**
5
7
  * Pick the language for a file path based on its extension. A preferred
6
8
  * language narrows the result to that language's extensions; it never makes
@@ -2,10 +2,10 @@ import { javaConfig } from "./java.js";
2
2
  import { pythonConfig } from "./python.js";
3
3
  import { typescriptConfig } from "./typescript.js";
4
4
  /**
5
- * Registry of supported languages. Adding a language means:
6
- * 1. implement a LanguageConfig in `./<lang>.ts`
7
- * 2. register it here
8
- * 3. implement a resolver keyed by the same name in `src/resolver/`
5
+ * The one table that defines what this project speaks. Each language declares
6
+ * its own descriptor next to its parser (extensions → grammar → resolver →
7
+ * frameworks → fixture), so adding a language is a new module plus a row here,
8
+ * and never an edit to an existing language.
9
9
  */
10
10
  const registry = new Map([
11
11
  ["java", javaConfig],
@@ -18,6 +18,10 @@ export function getLanguageConfig(name) {
18
18
  export function listLanguages() {
19
19
  return [...registry.keys()];
20
20
  }
21
+ /** Every descriptor, in registration order. */
22
+ export function listLanguageDescriptors() {
23
+ return [...registry.values()];
24
+ }
21
25
  /** Preferred-name aliases that share a parser but cover a subset of extensions. */
22
26
  const PREFERRED_ALIASES = {
23
27
  javascript: { language: "typescript", extensions: ["js", "jsx", "mjs", "cjs"] },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parser/languages/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;;;GAKG;AAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAyB;IAC/C,CAAC,MAAM,EAAE,UAAU,CAAC;IACpB,CAAC,QAAQ,EAAE,YAAY,CAAC;IACxB,CAAC,YAAY,EAAE,gBAAgB,CAAC;CACjC,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,mFAAmF;AACnF,MAAM,iBAAiB,GAA+D;IACpF,UAAU,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE;CAChF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,SAAkB;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,CAAC,UAAoB,EAAW,EAAE,CACrD,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAEtD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,MAAM;YAAE,OAAO,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAEnE,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACjD,OAAO,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAClE,CAAC;IACH,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACvC,IAAI,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;YAAE,OAAO,MAAM,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parser/languages/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAA6B;IACnD,CAAC,MAAM,EAAE,UAAU,CAAC;IACpB,CAAC,QAAQ,EAAE,YAAY,CAAC;IACxB,CAAC,YAAY,EAAE,gBAAgB,CAAC;CACjC,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,uBAAuB;IACrC,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,mFAAmF;AACnF,MAAM,iBAAiB,GAA+D;IACpF,UAAU,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE;CAChF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,SAAkB;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,CAAC,UAAoB,EAAW,EAAE,CACrD,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAEtD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,MAAM;YAAE,OAAO,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAEnE,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACjD,OAAO,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAClE,CAAC;IACH,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACvC,IAAI,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC;YAAE,OAAO,MAAM,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { LanguageConfig, ParsedFile } from "../language.js";
1
+ import type { LanguageDescriptor, ParsedFile } from "../language.js";
2
2
  export interface JavaParsedFile extends ParsedFile {
3
3
  /**
4
4
  * Simple name -> qualified name for types declared in this file and for
@@ -6,5 +6,5 @@ export interface JavaParsedFile extends ParsedFile {
6
6
  */
7
7
  typeByName: Map<string, string>;
8
8
  }
9
- export declare const javaConfig: LanguageConfig;
9
+ export declare const javaConfig: LanguageDescriptor;
10
10
  export declare function parseFile(source: string, filePath: string): Promise<JavaParsedFile>;