@lbroth/rothunter 1.0.0-rc.1

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 (269) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +141 -0
  3. package/dist/adapters/llm.d.ts +68 -0
  4. package/dist/adapters/llm.d.ts.map +1 -0
  5. package/dist/adapters/llm.js +189 -0
  6. package/dist/adapters/llm.js.map +1 -0
  7. package/dist/config.d.ts +37 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +81 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/detector-registry.d.ts +32 -0
  12. package/dist/detector-registry.d.ts.map +1 -0
  13. package/dist/detector-registry.js +74 -0
  14. package/dist/detector-registry.js.map +1 -0
  15. package/dist/detectors/api-race.d.ts +6 -0
  16. package/dist/detectors/api-race.d.ts.map +1 -0
  17. package/dist/detectors/api-race.js +222 -0
  18. package/dist/detectors/api-race.js.map +1 -0
  19. package/dist/detectors/bad-config.d.ts +6 -0
  20. package/dist/detectors/bad-config.d.ts.map +1 -0
  21. package/dist/detectors/bad-config.js +529 -0
  22. package/dist/detectors/bad-config.js.map +1 -0
  23. package/dist/detectors/console-log-prod.d.ts +6 -0
  24. package/dist/detectors/console-log-prod.d.ts.map +1 -0
  25. package/dist/detectors/console-log-prod.js +72 -0
  26. package/dist/detectors/console-log-prod.js.map +1 -0
  27. package/dist/detectors/dead-api.d.ts +10 -0
  28. package/dist/detectors/dead-api.d.ts.map +1 -0
  29. package/dist/detectors/dead-api.js +115 -0
  30. package/dist/detectors/dead-api.js.map +1 -0
  31. package/dist/detectors/dead-export.d.ts +12 -0
  32. package/dist/detectors/dead-export.d.ts.map +1 -0
  33. package/dist/detectors/dead-export.js +140 -0
  34. package/dist/detectors/dead-export.js.map +1 -0
  35. package/dist/detectors/dead-handler.d.ts +12 -0
  36. package/dist/detectors/dead-handler.d.ts.map +1 -0
  37. package/dist/detectors/dead-handler.js +40 -0
  38. package/dist/detectors/dead-handler.js.map +1 -0
  39. package/dist/detectors/dead-module.d.ts +14 -0
  40. package/dist/detectors/dead-module.d.ts.map +1 -0
  41. package/dist/detectors/dead-module.js +50 -0
  42. package/dist/detectors/dead-module.js.map +1 -0
  43. package/dist/detectors/deep-nesting.d.ts +12 -0
  44. package/dist/detectors/deep-nesting.d.ts.map +1 -0
  45. package/dist/detectors/deep-nesting.js +133 -0
  46. package/dist/detectors/deep-nesting.js.map +1 -0
  47. package/dist/detectors/duplicate-function.d.ts +9 -0
  48. package/dist/detectors/duplicate-function.d.ts.map +1 -0
  49. package/dist/detectors/duplicate-function.js +199 -0
  50. package/dist/detectors/duplicate-function.js.map +1 -0
  51. package/dist/detectors/duplicate-type.d.ts +9 -0
  52. package/dist/detectors/duplicate-type.d.ts.map +1 -0
  53. package/dist/detectors/duplicate-type.js +166 -0
  54. package/dist/detectors/duplicate-type.js.map +1 -0
  55. package/dist/detectors/hot-hub-file.d.ts +11 -0
  56. package/dist/detectors/hot-hub-file.d.ts.map +1 -0
  57. package/dist/detectors/hot-hub-file.js +42 -0
  58. package/dist/detectors/hot-hub-file.js.map +1 -0
  59. package/dist/detectors/long-file.d.ts +12 -0
  60. package/dist/detectors/long-file.d.ts.map +1 -0
  61. package/dist/detectors/long-file.js +82 -0
  62. package/dist/detectors/long-file.js.map +1 -0
  63. package/dist/detectors/long-function.d.ts +12 -0
  64. package/dist/detectors/long-function.d.ts.map +1 -0
  65. package/dist/detectors/long-function.js +45 -0
  66. package/dist/detectors/long-function.js.map +1 -0
  67. package/dist/detectors/magic-numbers.d.ts +10 -0
  68. package/dist/detectors/magic-numbers.d.ts.map +1 -0
  69. package/dist/detectors/magic-numbers.js +332 -0
  70. package/dist/detectors/magic-numbers.js.map +1 -0
  71. package/dist/detectors/mutable-globals.d.ts +6 -0
  72. package/dist/detectors/mutable-globals.d.ts.map +1 -0
  73. package/dist/detectors/mutable-globals.js +95 -0
  74. package/dist/detectors/mutable-globals.js.map +1 -0
  75. package/dist/detectors/mutation.d.ts +11 -0
  76. package/dist/detectors/mutation.d.ts.map +1 -0
  77. package/dist/detectors/mutation.js +397 -0
  78. package/dist/detectors/mutation.js.map +1 -0
  79. package/dist/detectors/public-any.d.ts +6 -0
  80. package/dist/detectors/public-any.d.ts.map +1 -0
  81. package/dist/detectors/public-any.js +52 -0
  82. package/dist/detectors/public-any.js.map +1 -0
  83. package/dist/detectors/race-condition.d.ts +6 -0
  84. package/dist/detectors/race-condition.d.ts.map +1 -0
  85. package/dist/detectors/race-condition.js +608 -0
  86. package/dist/detectors/race-condition.js.map +1 -0
  87. package/dist/detectors/shared-db-write.d.ts +6 -0
  88. package/dist/detectors/shared-db-write.d.ts.map +1 -0
  89. package/dist/detectors/shared-db-write.js +656 -0
  90. package/dist/detectors/shared-db-write.js.map +1 -0
  91. package/dist/detectors/silent-catch.d.ts +6 -0
  92. package/dist/detectors/silent-catch.d.ts.map +1 -0
  93. package/dist/detectors/silent-catch.js +167 -0
  94. package/dist/detectors/silent-catch.js.map +1 -0
  95. package/dist/detectors/similar-functions.d.ts +15 -0
  96. package/dist/detectors/similar-functions.d.ts.map +1 -0
  97. package/dist/detectors/similar-functions.js +334 -0
  98. package/dist/detectors/similar-functions.js.map +1 -0
  99. package/dist/detectors/skip-tests.d.ts +6 -0
  100. package/dist/detectors/skip-tests.d.ts.map +1 -0
  101. package/dist/detectors/skip-tests.js +69 -0
  102. package/dist/detectors/skip-tests.js.map +1 -0
  103. package/dist/detectors/todo-comments.d.ts +29 -0
  104. package/dist/detectors/todo-comments.d.ts.map +1 -0
  105. package/dist/detectors/todo-comments.js +154 -0
  106. package/dist/detectors/todo-comments.js.map +1 -0
  107. package/dist/detectors/unused-deps.d.ts +8 -0
  108. package/dist/detectors/unused-deps.d.ts.map +1 -0
  109. package/dist/detectors/unused-deps.js +115 -0
  110. package/dist/detectors/unused-deps.js.map +1 -0
  111. package/dist/extraction/api-race-confirmer.d.ts +31 -0
  112. package/dist/extraction/api-race-confirmer.d.ts.map +1 -0
  113. package/dist/extraction/api-race-confirmer.js +110 -0
  114. package/dist/extraction/api-race-confirmer.js.map +1 -0
  115. package/dist/extraction/llm-confirmer.d.ts +25 -0
  116. package/dist/extraction/llm-confirmer.d.ts.map +1 -0
  117. package/dist/extraction/llm-confirmer.js +118 -0
  118. package/dist/extraction/llm-confirmer.js.map +1 -0
  119. package/dist/extraction/mutation-confirmer.d.ts +30 -0
  120. package/dist/extraction/mutation-confirmer.d.ts.map +1 -0
  121. package/dist/extraction/mutation-confirmer.js +73 -0
  122. package/dist/extraction/mutation-confirmer.js.map +1 -0
  123. package/dist/extraction/prompt-chunking.d.ts +37 -0
  124. package/dist/extraction/prompt-chunking.d.ts.map +1 -0
  125. package/dist/extraction/prompt-chunking.js +61 -0
  126. package/dist/extraction/prompt-chunking.js.map +1 -0
  127. package/dist/extraction/race-confirmer.d.ts +28 -0
  128. package/dist/extraction/race-confirmer.d.ts.map +1 -0
  129. package/dist/extraction/race-confirmer.js +68 -0
  130. package/dist/extraction/race-confirmer.js.map +1 -0
  131. package/dist/extraction/shared-db-write-confirmer.d.ts +31 -0
  132. package/dist/extraction/shared-db-write-confirmer.d.ts.map +1 -0
  133. package/dist/extraction/shared-db-write-confirmer.js +141 -0
  134. package/dist/extraction/shared-db-write-confirmer.js.map +1 -0
  135. package/dist/extraction/triage-confirmer.d.ts +59 -0
  136. package/dist/extraction/triage-confirmer.d.ts.map +1 -0
  137. package/dist/extraction/triage-confirmer.js +104 -0
  138. package/dist/extraction/triage-confirmer.js.map +1 -0
  139. package/dist/graph/cfg.d.ts +45 -0
  140. package/dist/graph/cfg.d.ts.map +1 -0
  141. package/dist/graph/cfg.js +198 -0
  142. package/dist/graph/cfg.js.map +1 -0
  143. package/dist/graph/decorator-entries.d.ts +2 -0
  144. package/dist/graph/decorator-entries.d.ts.map +1 -0
  145. package/dist/graph/decorator-entries.js +89 -0
  146. package/dist/graph/decorator-entries.js.map +1 -0
  147. package/dist/graph/entry-points.d.ts +12 -0
  148. package/dist/graph/entry-points.d.ts.map +1 -0
  149. package/dist/graph/entry-points.js +282 -0
  150. package/dist/graph/entry-points.js.map +1 -0
  151. package/dist/graph/handler-conventions.d.ts +2 -0
  152. package/dist/graph/handler-conventions.d.ts.map +1 -0
  153. package/dist/graph/handler-conventions.js +26 -0
  154. package/dist/graph/handler-conventions.js.map +1 -0
  155. package/dist/graph/iac-entries.d.ts +2 -0
  156. package/dist/graph/iac-entries.d.ts.map +1 -0
  157. package/dist/graph/iac-entries.js +123 -0
  158. package/dist/graph/iac-entries.js.map +1 -0
  159. package/dist/graph/import-graph.d.ts +48 -0
  160. package/dist/graph/import-graph.d.ts.map +1 -0
  161. package/dist/graph/import-graph.js +86 -0
  162. package/dist/graph/import-graph.js.map +1 -0
  163. package/dist/graph/monorepo-detect.d.ts +3 -0
  164. package/dist/graph/monorepo-detect.d.ts.map +1 -0
  165. package/dist/graph/monorepo-detect.js +166 -0
  166. package/dist/graph/monorepo-detect.js.map +1 -0
  167. package/dist/graph/tsconfig-paths.d.ts +23 -0
  168. package/dist/graph/tsconfig-paths.d.ts.map +1 -0
  169. package/dist/graph/tsconfig-paths.js +217 -0
  170. package/dist/graph/tsconfig-paths.js.map +1 -0
  171. package/dist/multi-workspace-scanner.d.ts +13 -0
  172. package/dist/multi-workspace-scanner.d.ts.map +1 -0
  173. package/dist/multi-workspace-scanner.js +130 -0
  174. package/dist/multi-workspace-scanner.js.map +1 -0
  175. package/dist/normalizers/type-normalizer.d.ts +16 -0
  176. package/dist/normalizers/type-normalizer.d.ts.map +1 -0
  177. package/dist/normalizers/type-normalizer.js +189 -0
  178. package/dist/normalizers/type-normalizer.js.map +1 -0
  179. package/dist/parsers/typescript-parser.d.ts +57 -0
  180. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  181. package/dist/parsers/typescript-parser.js +502 -0
  182. package/dist/parsers/typescript-parser.js.map +1 -0
  183. package/dist/reporter/json-reporter.d.ts +12 -0
  184. package/dist/reporter/json-reporter.d.ts.map +1 -0
  185. package/dist/reporter/json-reporter.js +28 -0
  186. package/dist/reporter/json-reporter.js.map +1 -0
  187. package/dist/reporter/markdown-reporter.d.ts +11 -0
  188. package/dist/reporter/markdown-reporter.d.ts.map +1 -0
  189. package/dist/reporter/markdown-reporter.js +77 -0
  190. package/dist/reporter/markdown-reporter.js.map +1 -0
  191. package/dist/rothunter.d.ts +125 -0
  192. package/dist/rothunter.d.ts.map +1 -0
  193. package/dist/rothunter.js +1038 -0
  194. package/dist/rothunter.js.map +1 -0
  195. package/dist/server/false-positives.d.ts +34 -0
  196. package/dist/server/false-positives.d.ts.map +1 -0
  197. package/dist/server/false-positives.js +85 -0
  198. package/dist/server/false-positives.js.map +1 -0
  199. package/dist/server/index.d.ts +2 -0
  200. package/dist/server/index.d.ts.map +1 -0
  201. package/dist/server/index.js +1529 -0
  202. package/dist/server/index.js.map +1 -0
  203. package/dist/server/marked-to-fix.d.ts +16 -0
  204. package/dist/server/marked-to-fix.d.ts.map +1 -0
  205. package/dist/server/marked-to-fix.js +36 -0
  206. package/dist/server/marked-to-fix.js.map +1 -0
  207. package/dist/server/scan-store.d.ts +147 -0
  208. package/dist/server/scan-store.d.ts.map +1 -0
  209. package/dist/server/scan-store.js +291 -0
  210. package/dist/server/scan-store.js.map +1 -0
  211. package/dist/server/settings-store.d.ts +28 -0
  212. package/dist/server/settings-store.d.ts.map +1 -0
  213. package/dist/server/settings-store.js +46 -0
  214. package/dist/server/settings-store.js.map +1 -0
  215. package/dist/server/workspace-store.d.ts +39 -0
  216. package/dist/server/workspace-store.d.ts.map +1 -0
  217. package/dist/server/workspace-store.js +108 -0
  218. package/dist/server/workspace-store.js.map +1 -0
  219. package/dist/types/detector-input.d.ts +37 -0
  220. package/dist/types/detector-input.d.ts.map +1 -0
  221. package/dist/types/detector-input.js +2 -0
  222. package/dist/types/detector-input.js.map +1 -0
  223. package/dist/types.d.ts +110 -0
  224. package/dist/types.d.ts.map +1 -0
  225. package/dist/types.js +2 -0
  226. package/dist/types.js.map +1 -0
  227. package/dist/utils/clustering.d.ts +14 -0
  228. package/dist/utils/clustering.d.ts.map +1 -0
  229. package/dist/utils/clustering.js +56 -0
  230. package/dist/utils/clustering.js.map +1 -0
  231. package/dist/utils/gitignore.d.ts +32 -0
  232. package/dist/utils/gitignore.d.ts.map +1 -0
  233. package/dist/utils/gitignore.js +122 -0
  234. package/dist/utils/gitignore.js.map +1 -0
  235. package/dist/utils/hash.d.ts +11 -0
  236. package/dist/utils/hash.d.ts.map +1 -0
  237. package/dist/utils/hash.js +14 -0
  238. package/dist/utils/hash.js.map +1 -0
  239. package/dist/utils/ignore-annotation.d.ts +28 -0
  240. package/dist/utils/ignore-annotation.d.ts.map +1 -0
  241. package/dist/utils/ignore-annotation.js +46 -0
  242. package/dist/utils/ignore-annotation.js.map +1 -0
  243. package/dist/utils/llm-json.d.ts +2 -0
  244. package/dist/utils/llm-json.d.ts.map +1 -0
  245. package/dist/utils/llm-json.js +53 -0
  246. package/dist/utils/llm-json.js.map +1 -0
  247. package/dist/utils/logger.d.ts +3 -0
  248. package/dist/utils/logger.d.ts.map +1 -0
  249. package/dist/utils/logger.js +4 -0
  250. package/dist/utils/logger.js.map +1 -0
  251. package/dist/utils/project-conventions.d.ts +2 -0
  252. package/dist/utils/project-conventions.d.ts.map +1 -0
  253. package/dist/utils/project-conventions.js +108 -0
  254. package/dist/utils/project-conventions.js.map +1 -0
  255. package/dist/utils/regex.d.ts +9 -0
  256. package/dist/utils/regex.d.ts.map +1 -0
  257. package/dist/utils/regex.js +11 -0
  258. package/dist/utils/regex.js.map +1 -0
  259. package/dist/utils/snippet.d.ts +20 -0
  260. package/dist/utils/snippet.d.ts.map +1 -0
  261. package/dist/utils/snippet.js +28 -0
  262. package/dist/utils/snippet.js.map +1 -0
  263. package/dist/utils/source-reader.d.ts +19 -0
  264. package/dist/utils/source-reader.d.ts.map +1 -0
  265. package/dist/utils/source-reader.js +32 -0
  266. package/dist/utils/source-reader.js.map +1 -0
  267. package/logo.png +0 -0
  268. package/package.json +92 -0
  269. package/scripts/start-llm.mjs +161 -0
@@ -0,0 +1,189 @@
1
+ import * as crypto from 'node:crypto';
2
+ const FIELD_NAME_SYNONYMS = {
3
+ uid: 'id',
4
+ userid: 'id',
5
+ identifier: 'id',
6
+ mail: 'email',
7
+ emailaddress: 'email',
8
+ fullname: 'name',
9
+ displayname: 'name',
10
+ username: 'name',
11
+ created: 'createdat',
12
+ createdon: 'createdat',
13
+ updated: 'updatedat',
14
+ modified: 'updatedat',
15
+ modifiedon: 'updatedat',
16
+ };
17
+ export class TypeNormalizer {
18
+ normalize(record) {
19
+ if (record.structure?.kind === 'function') {
20
+ return this.normalizeFunction(record, record.structure);
21
+ }
22
+ if (!record.structure || record.structure.kind !== 'object') {
23
+ const raw = record.structure && 'raw' in record.structure ? record.structure.raw : undefined;
24
+ const fallback = raw ?? record.source;
25
+ const h = sha256(fallback);
26
+ return {
27
+ ...record,
28
+ hashStrict: h,
29
+ hashStructural: h,
30
+ hashNormalizedNames: h,
31
+ canonicalSignature: fallback,
32
+ };
33
+ }
34
+ const fields = record.structure.fields ?? [];
35
+ const sortedByName = [...fields].sort((a, b) => a.name.localeCompare(b.name));
36
+ const strictSig = serializeFields(sortedByName, { withNames: true, normalizeNames: false });
37
+ // For normalized-names matching, sort by the *normalized* name so that snake↔camel
38
+ // variants land in the same order before hashing (e.g. `user_id` and `uid` both → `id`).
39
+ const sortedByNormalizedName = [...fields].sort((a, b) => normalizeFieldName(a.name).localeCompare(normalizeFieldName(b.name)));
40
+ const normalizedNamesSig = serializeFields(sortedByNormalizedName, {
41
+ withNames: true,
42
+ normalizeNames: true,
43
+ });
44
+ // Structural ignores names completely → sort by type to get a stable order
45
+ const sortedByType = [...fields].sort((a, b) => canonicalType(a.type).localeCompare(canonicalType(b.type)));
46
+ const structuralSig = serializeFields(sortedByType, { withNames: false, normalizeNames: false });
47
+ return {
48
+ ...record,
49
+ hashStrict: sha256(strictSig),
50
+ hashStructural: sha256(structuralSig),
51
+ hashNormalizedNames: sha256(normalizedNamesSig),
52
+ canonicalSignature: strictSig,
53
+ };
54
+ }
55
+ normalizeAll(records) {
56
+ return records.map((r) => this.normalize(r));
57
+ }
58
+ /**
59
+ * Compute three function hashes:
60
+ * strict : `(param:type, ...) => returnType { body-normalized }`
61
+ * structural : same, but param names dropped and body identifiers stripped
62
+ * of token-identity (keep only structural tokens — kw, punct, types)
63
+ * normalized-names: param names mapped through the synonym table, body unchanged
64
+ *
65
+ * `bodyNormalized` was already whitespace-collapsed by the parser.
66
+ */
67
+ normalizeFunction(record, fn) {
68
+ const paramsStrict = serializeFunctionParams(fn.params, { withNames: true, normalizeNames: false });
69
+ const paramsNormalized = serializeFunctionParams(fn.params, { withNames: true, normalizeNames: true });
70
+ const paramsStructural = serializeFunctionParams(fn.params, { withNames: false, normalizeNames: false });
71
+ const ret = canonicalType(fn.returnType);
72
+ const flags = `${fn.async ? 'a' : ''}${fn.generator ? 'g' : ''}`;
73
+ const strictSig = `${flags}(${paramsStrict})=>${ret}::${fn.bodyNormalized}`;
74
+ const normalizedSig = `${flags}(${paramsNormalized})=>${ret}::${fn.bodyNormalized}`;
75
+ const structuralSig = `${flags}(${paramsStructural})=>${ret}::${anonymizeIdentifiers(fn.bodyNormalized)}`;
76
+ return {
77
+ ...record,
78
+ hashStrict: sha256(strictSig),
79
+ hashStructural: sha256(structuralSig),
80
+ hashNormalizedNames: sha256(normalizedSig),
81
+ canonicalSignature: strictSig,
82
+ };
83
+ }
84
+ }
85
+ function serializeFunctionParams(params, opts) {
86
+ return params
87
+ .map((p, i) => {
88
+ const name = opts.withNames
89
+ ? opts.normalizeNames
90
+ ? normalizeFieldName(p.name)
91
+ : p.name
92
+ : `_${i}`;
93
+ const opt = p.optional ? '?' : '';
94
+ return `${name}${opt}:${canonicalType(p.type)}`;
95
+ })
96
+ .join(',');
97
+ }
98
+ /**
99
+ * Replace every identifier token in a (collapsed) function body with a generic
100
+ * placeholder. Keeps keywords, punctuation, literals, and TypeScript built-in
101
+ * names so the structural skeleton stays intact while user-chosen identifiers
102
+ * (locals, parameter names, called functions) get equalised.
103
+ */
104
+ function anonymizeIdentifiers(body) {
105
+ const TS_KEYWORDS = new Set([
106
+ 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'default', 'break', 'continue',
107
+ 'return', 'throw', 'try', 'catch', 'finally', 'new', 'this', 'super', 'class', 'extends',
108
+ 'implements', 'function', 'const', 'let', 'var', 'typeof', 'instanceof', 'in', 'of',
109
+ 'await', 'async', 'yield', 'true', 'false', 'null', 'undefined', 'void', 'delete',
110
+ 'as', 'is', 'satisfies', 'keyof', 'readonly', 'public', 'private', 'protected', 'static',
111
+ 'export', 'import', 'from', 'string', 'number', 'boolean', 'object', 'never', 'any',
112
+ 'unknown', 'bigint', 'symbol', 'Date', 'Array', 'Map', 'Set', 'Promise', 'Record',
113
+ 'Partial', 'Pick', 'Omit', 'Readonly', 'ReadonlyArray',
114
+ ]);
115
+ return body.replace(/[A-Za-z_$][\w$]*/g, (token) => (TS_KEYWORDS.has(token) ? token : '_'));
116
+ }
117
+ function serializeFields(fields, opts) {
118
+ if (fields.length === 0)
119
+ return '{}';
120
+ const parts = fields.map((f) => {
121
+ const name = opts.withNames
122
+ ? opts.normalizeNames
123
+ ? normalizeFieldName(f.name)
124
+ : f.name
125
+ : '_';
126
+ const type = canonicalType(f.type);
127
+ const opt = f.optional ? '?' : '';
128
+ return `${name}${opt}:${type}`;
129
+ });
130
+ return `{${parts.join(',')}}`;
131
+ }
132
+ function normalizeFieldName(name) {
133
+ // snake_case → camelCase
134
+ let normalized = name.replace(/[_-]([a-zA-Z])/g, (_, c) => c.toUpperCase());
135
+ // Strip any residual underscores or dashes (e.g. before digits: `street_line_1`
136
+ // → `streetLine_1` from the previous step → `streetLine1`).
137
+ normalized = normalized.replace(/[_-]+/g, '');
138
+ // lowercase for synonym lookup, then map
139
+ const lower = normalized.toLowerCase();
140
+ return FIELD_NAME_SYNONYMS[lower] ?? lower;
141
+ }
142
+ function canonicalType(t) {
143
+ const compact = t.replace(/\s+/g, '');
144
+ // Only canonicalize top-level unions. Don't touch unions nested inside generics
145
+ // or function signatures (depth check via balanced brackets).
146
+ if (!hasTopLevelUnion(compact))
147
+ return compact;
148
+ const members = splitTopLevelUnion(compact)
149
+ .map((m) => m.replace(/^undefined$/, '')) // drop `undefined` member entirely
150
+ .filter((m) => m.length > 0);
151
+ if (members.length === 0)
152
+ return compact;
153
+ members.sort();
154
+ return members.length === 1 ? members[0] : members.join('|');
155
+ }
156
+ function hasTopLevelUnion(s) {
157
+ let depth = 0;
158
+ for (const ch of s) {
159
+ if (ch === '<' || ch === '(' || ch === '[' || ch === '{')
160
+ depth++;
161
+ else if (ch === '>' || ch === ')' || ch === ']' || ch === '}')
162
+ depth--;
163
+ else if (ch === '|' && depth === 0)
164
+ return true;
165
+ }
166
+ return false;
167
+ }
168
+ function splitTopLevelUnion(s) {
169
+ const out = [];
170
+ let depth = 0;
171
+ let start = 0;
172
+ for (let i = 0; i < s.length; i++) {
173
+ const ch = s[i];
174
+ if (ch === '<' || ch === '(' || ch === '[' || ch === '{')
175
+ depth++;
176
+ else if (ch === '>' || ch === ')' || ch === ']' || ch === '}')
177
+ depth--;
178
+ else if (ch === '|' && depth === 0) {
179
+ out.push(s.slice(start, i));
180
+ start = i + 1;
181
+ }
182
+ }
183
+ out.push(s.slice(start));
184
+ return out;
185
+ }
186
+ function sha256(s) {
187
+ return crypto.createHash('sha256').update(s).digest('hex').slice(0, 16);
188
+ }
189
+ //# sourceMappingURL=type-normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-normalizer.js","sourceRoot":"","sources":["../../src/normalizers/type-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAGtC,MAAM,mBAAmB,GAA2B;IAClD,GAAG,EAAE,IAAI;IACT,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,IAAI;IAChB,IAAI,EAAE,OAAO;IACb,YAAY,EAAE,OAAO;IACrB,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,MAAM;IACnB,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,WAAW;IACpB,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,WAAW;IACrB,UAAU,EAAE,WAAW;CACxB,CAAC;AAEF,MAAM,OAAO,cAAc;IACzB,SAAS,CAAC,MAAoB;QAC5B,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7F,MAAM,QAAQ,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC;YACtC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3B,OAAO;gBACL,GAAG,MAAM;gBACT,UAAU,EAAE,CAAC;gBACb,cAAc,EAAE,CAAC;gBACjB,mBAAmB,EAAE,CAAC;gBACtB,kBAAkB,EAAE,QAAQ;aAC7B,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC;QAC7C,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAE9E,MAAM,SAAS,GAAG,eAAe,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5F,mFAAmF;QACnF,yFAAyF;QACzF,MAAM,sBAAsB,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvD,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CACrE,CAAC;QACF,MAAM,kBAAkB,GAAG,eAAe,CAAC,sBAAsB,EAAE;YACjE,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QAEH,2EAA2E;QAC3E,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC7C,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAC3D,CAAC;QACF,MAAM,aAAa,GAAG,eAAe,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QAEjG,OAAO;YACL,GAAG,MAAM;YACT,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC;YAC7B,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC;YACrC,mBAAmB,EAAE,MAAM,CAAC,kBAAkB,CAAC;YAC/C,kBAAkB,EAAE,SAAS;SAC9B,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,OAAuB;QAClC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;;OAQG;IACK,iBAAiB,CAAC,MAAoB,EAAE,EAAqB;QACnE,MAAM,YAAY,GAAG,uBAAuB,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QACpG,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QACvG,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QACzG,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAEjE,MAAM,SAAS,GAAG,GAAG,KAAK,IAAI,YAAY,MAAM,GAAG,KAAK,EAAE,CAAC,cAAc,EAAE,CAAC;QAC5E,MAAM,aAAa,GAAG,GAAG,KAAK,IAAI,gBAAgB,MAAM,GAAG,KAAK,EAAE,CAAC,cAAc,EAAE,CAAC;QACpF,MAAM,aAAa,GAAG,GAAG,KAAK,IAAI,gBAAgB,MAAM,GAAG,KAAK,oBAAoB,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC;QAE1G,OAAO;YACL,GAAG,MAAM;YACT,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC;YAC7B,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC;YACrC,mBAAmB,EAAE,MAAM,CAAC,aAAa,CAAC;YAC1C,kBAAkB,EAAE,SAAS;SAC9B,CAAC;IACJ,CAAC;CACF;AAED,SAAS,uBAAuB,CAAC,MAAwB,EAAE,IAAsB;IAC/E,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS;YACzB,CAAC,CAAC,IAAI,CAAC,cAAc;gBACnB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC5B,CAAC,CAAC,CAAC,CAAC,IAAI;YACV,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,IAAI,GAAG,GAAG,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAClD,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;QAC1B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU;QACpF,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;QACxF,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI;QACnF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ;QACjF,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ;QACxF,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK;QACnF,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ;QACjF,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe;KACvD,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9F,CAAC;AAOD,SAAS,eAAe,CAAC,MAAwB,EAAE,IAAsB;IACvE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS;YACzB,CAAC,CAAC,IAAI,CAAC,cAAc;gBACnB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC5B,CAAC,CAAC,CAAC,CAAC,IAAI;YACV,CAAC,CAAC,GAAG,CAAC;QACR,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAChC,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,yBAAyB;IACzB,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5E,gFAAgF;IAChF,4DAA4D;IAC5D,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9C,yCAAyC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACvC,OAAO,mBAAmB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AAC7C,CAAC;AAED,SAAS,aAAa,CAAC,CAAS;IAC9B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,gFAAgF;IAChF,8DAA8D;IAC9D,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/C,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC;SACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,mCAAmC;SAC5E,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACzC,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAS;IACjC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aAC7D,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aAClE,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAS;IACnC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aAC7D,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aAClE,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5B,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACzB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { type ImportRecord } from '../graph/import-graph.js';
2
+ import type { SymbolRecord } from '../types.js';
3
+ export interface ParseOptions {
4
+ workspaceRoot: string;
5
+ tsConfigFilePath?: string;
6
+ filePatterns?: string[];
7
+ includeNodeModules?: boolean;
8
+ ignore?: string[];
9
+ /**
10
+ * Explicit list of file paths (absolute or workspace-relative) to scan.
11
+ * When set, overrides `filePatterns`. Used by `--diff` mode to restrict the
12
+ * scan to files changed in a git range.
13
+ */
14
+ files?: string[];
15
+ }
16
+ export interface ParseResult {
17
+ symbols: SymbolRecord[];
18
+ imports: ImportRecord[];
19
+ /** All workspace-relative file paths that were parsed (post node_modules/dist filtering). */
20
+ files: string[];
21
+ }
22
+ export declare class TypeScriptParser {
23
+ /** Backwards-compatible shortcut: returns only the symbols array. */
24
+ parseWorkspace(opts: ParseOptions): Promise<SymbolRecord[]>;
25
+ /** Full parse — symbols + imports + file list, built in a single ts-morph project. */
26
+ parseWorkspaceFull(opts: ParseOptions): Promise<ParseResult>;
27
+ private isDefault;
28
+ private fromInterface;
29
+ private fromTypeAlias;
30
+ /**
31
+ * Extract a class as a structural symbol so duplicate-type clustering can
32
+ * match it against interfaces, type aliases, and other classes that share
33
+ * the same shape. Class methods become pseudo-fields (`()methodName`) using
34
+ * the same convention as interfaces; instance properties become
35
+ * regular fields; static members are skipped (different surface area).
36
+ */
37
+ private fromClass;
38
+ private fieldFromClassProperty;
39
+ private fieldFromClassMethod;
40
+ /**
41
+ * Capture `const Foo = () => ...` / `const Foo = function() {...}` as a
42
+ * function symbol. The variable name becomes the symbol name; the arrow
43
+ * or function-expression body provides params + body. React functional
44
+ * components, mapped utility functions, and event-handler factories all
45
+ * land here.
46
+ *
47
+ * Returns null when the initializer is not a callable shape.
48
+ */
49
+ private fromVariableFunction;
50
+ private fromFunction;
51
+ private fieldFromProperty;
52
+ private fieldFromMethod;
53
+ private fieldFromIndexSignature;
54
+ private fieldFromCallSignature;
55
+ private fieldFromConstructSignature;
56
+ }
57
+ //# sourceMappingURL=typescript-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/typescript-parser.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,KAAK,EAAqC,YAAY,EAAiB,MAAM,aAAa,CAAC;AAElG,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,6FAA6F;IAC7F,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qBAAa,gBAAgB;IAC3B,qEAAqE;IAC/D,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAIjE,sFAAsF;IAChF,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAkIlE,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;IAwCrB;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IAkCjB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,oBAAoB;IAe5B;;;;;;;;OAQG;IACH,OAAO,CAAC,oBAAoB;IAsD5B,OAAO,CAAC,YAAY;IA4CpB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,sBAAsB;IAc9B,OAAO,CAAC,2BAA2B;CAapC"}