circle-ir 3.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 (194) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +200 -0
  3. package/configs/sinks/code_injection.yaml +672 -0
  4. package/configs/sinks/command.yaml +917 -0
  5. package/configs/sinks/deserialization.yaml +105 -0
  6. package/configs/sinks/ldap.yaml +136 -0
  7. package/configs/sinks/nodejs.json +629 -0
  8. package/configs/sinks/path.yaml +715 -0
  9. package/configs/sinks/python.json +501 -0
  10. package/configs/sinks/rust.json +339 -0
  11. package/configs/sinks/sql.yaml +233 -0
  12. package/configs/sinks/ssrf.yaml +160 -0
  13. package/configs/sinks/xpath.yaml +121 -0
  14. package/configs/sinks/xss.yaml +727 -0
  15. package/configs/sources/db_sources.yaml +90 -0
  16. package/configs/sources/env_sources.yaml +94 -0
  17. package/configs/sources/express.json +197 -0
  18. package/configs/sources/file_sources.yaml +164 -0
  19. package/configs/sources/http_sources.yaml +379 -0
  20. package/configs/sources/io_sources.yaml +519 -0
  21. package/configs/sources/network_sources.yaml +99 -0
  22. package/configs/sources/python.json +230 -0
  23. package/configs/sources/rust.json +286 -0
  24. package/configs/sources/spring.yaml +70 -0
  25. package/dist/analysis/advisory-db.d.ts +86 -0
  26. package/dist/analysis/advisory-db.js +104 -0
  27. package/dist/analysis/advisory-db.js.map +1 -0
  28. package/dist/analysis/cargo-parser.d.ts +42 -0
  29. package/dist/analysis/cargo-parser.js +102 -0
  30. package/dist/analysis/cargo-parser.js.map +1 -0
  31. package/dist/analysis/config-loader.d.ts +37 -0
  32. package/dist/analysis/config-loader.js +1561 -0
  33. package/dist/analysis/config-loader.js.map +1 -0
  34. package/dist/analysis/constant-propagation/ast-utils.d.ts +25 -0
  35. package/dist/analysis/constant-propagation/ast-utils.js +34 -0
  36. package/dist/analysis/constant-propagation/ast-utils.js.map +1 -0
  37. package/dist/analysis/constant-propagation/evaluator.d.ts +32 -0
  38. package/dist/analysis/constant-propagation/evaluator.js +296 -0
  39. package/dist/analysis/constant-propagation/evaluator.js.map +1 -0
  40. package/dist/analysis/constant-propagation/index.d.ts +62 -0
  41. package/dist/analysis/constant-propagation/index.js +152 -0
  42. package/dist/analysis/constant-propagation/index.js.map +1 -0
  43. package/dist/analysis/constant-propagation/patterns.d.ts +8 -0
  44. package/dist/analysis/constant-propagation/patterns.js +126 -0
  45. package/dist/analysis/constant-propagation/patterns.js.map +1 -0
  46. package/dist/analysis/constant-propagation/propagator.d.ts +180 -0
  47. package/dist/analysis/constant-propagation/propagator.js +1985 -0
  48. package/dist/analysis/constant-propagation/propagator.js.map +1 -0
  49. package/dist/analysis/constant-propagation/types.d.ts +63 -0
  50. package/dist/analysis/constant-propagation/types.js +5 -0
  51. package/dist/analysis/constant-propagation/types.js.map +1 -0
  52. package/dist/analysis/constant-propagation.d.ts +9 -0
  53. package/dist/analysis/constant-propagation.js +18 -0
  54. package/dist/analysis/constant-propagation.js.map +1 -0
  55. package/dist/analysis/dependency-scanner.d.ts +79 -0
  56. package/dist/analysis/dependency-scanner.js +122 -0
  57. package/dist/analysis/dependency-scanner.js.map +1 -0
  58. package/dist/analysis/dfg-verifier.d.ts +116 -0
  59. package/dist/analysis/dfg-verifier.js +399 -0
  60. package/dist/analysis/dfg-verifier.js.map +1 -0
  61. package/dist/analysis/findings.d.ts +11 -0
  62. package/dist/analysis/findings.js +228 -0
  63. package/dist/analysis/findings.js.map +1 -0
  64. package/dist/analysis/index.d.ts +16 -0
  65. package/dist/analysis/index.js +18 -0
  66. package/dist/analysis/index.js.map +1 -0
  67. package/dist/analysis/interprocedural.d.ts +99 -0
  68. package/dist/analysis/interprocedural.js +526 -0
  69. package/dist/analysis/interprocedural.js.map +1 -0
  70. package/dist/analysis/path-finder.d.ts +133 -0
  71. package/dist/analysis/path-finder.js +354 -0
  72. package/dist/analysis/path-finder.js.map +1 -0
  73. package/dist/analysis/rules.d.ts +75 -0
  74. package/dist/analysis/rules.js +332 -0
  75. package/dist/analysis/rules.js.map +1 -0
  76. package/dist/analysis/semver.d.ts +27 -0
  77. package/dist/analysis/semver.js +127 -0
  78. package/dist/analysis/semver.js.map +1 -0
  79. package/dist/analysis/taint-matcher.d.ts +15 -0
  80. package/dist/analysis/taint-matcher.js +634 -0
  81. package/dist/analysis/taint-matcher.js.map +1 -0
  82. package/dist/analysis/taint-propagation.d.ts +67 -0
  83. package/dist/analysis/taint-propagation.js +298 -0
  84. package/dist/analysis/taint-propagation.js.map +1 -0
  85. package/dist/analysis/unresolved.d.ts +14 -0
  86. package/dist/analysis/unresolved.js +202 -0
  87. package/dist/analysis/unresolved.js.map +1 -0
  88. package/dist/analyzer.d.ts +43 -0
  89. package/dist/analyzer.js +1010 -0
  90. package/dist/analyzer.js.map +1 -0
  91. package/dist/browser/circle-ir.js +16576 -0
  92. package/dist/browser.d.ts +38 -0
  93. package/dist/browser.js +38 -0
  94. package/dist/browser.js.map +1 -0
  95. package/dist/core/circle-ir-core.cjs +13626 -0
  96. package/dist/core/circle-ir-core.d.ts +59 -0
  97. package/dist/core/circle-ir-core.js +13591 -0
  98. package/dist/core/extractors/calls.d.ts +13 -0
  99. package/dist/core/extractors/calls.js +1429 -0
  100. package/dist/core/extractors/calls.js.map +1 -0
  101. package/dist/core/extractors/cfg.d.ts +9 -0
  102. package/dist/core/extractors/cfg.js +519 -0
  103. package/dist/core/extractors/cfg.js.map +1 -0
  104. package/dist/core/extractors/dfg.d.ts +12 -0
  105. package/dist/core/extractors/dfg.js +1081 -0
  106. package/dist/core/extractors/dfg.js.map +1 -0
  107. package/dist/core/extractors/exports.d.ts +14 -0
  108. package/dist/core/extractors/exports.js +80 -0
  109. package/dist/core/extractors/exports.js.map +1 -0
  110. package/dist/core/extractors/imports.d.ts +9 -0
  111. package/dist/core/extractors/imports.js +739 -0
  112. package/dist/core/extractors/imports.js.map +1 -0
  113. package/dist/core/extractors/index.d.ts +10 -0
  114. package/dist/core/extractors/index.js +11 -0
  115. package/dist/core/extractors/index.js.map +1 -0
  116. package/dist/core/extractors/meta.d.ts +10 -0
  117. package/dist/core/extractors/meta.js +109 -0
  118. package/dist/core/extractors/meta.js.map +1 -0
  119. package/dist/core/extractors/types.d.ts +10 -0
  120. package/dist/core/extractors/types.js +1479 -0
  121. package/dist/core/extractors/types.js.map +1 -0
  122. package/dist/core/index.d.ts +5 -0
  123. package/dist/core/index.js +8 -0
  124. package/dist/core/index.js.map +1 -0
  125. package/dist/core/parser.d.ts +84 -0
  126. package/dist/core/parser.js +250 -0
  127. package/dist/core/parser.js.map +1 -0
  128. package/dist/core-lib.d.ts +59 -0
  129. package/dist/core-lib.js +62 -0
  130. package/dist/core-lib.js.map +1 -0
  131. package/dist/index.d.ts +15 -0
  132. package/dist/index.js +20 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/languages/index.d.ts +11 -0
  135. package/dist/languages/index.js +14 -0
  136. package/dist/languages/index.js.map +1 -0
  137. package/dist/languages/plugins/base.d.ts +44 -0
  138. package/dist/languages/plugins/base.js +82 -0
  139. package/dist/languages/plugins/base.js.map +1 -0
  140. package/dist/languages/plugins/index.d.ts +14 -0
  141. package/dist/languages/plugins/index.js +25 -0
  142. package/dist/languages/plugins/index.js.map +1 -0
  143. package/dist/languages/plugins/java.d.ts +49 -0
  144. package/dist/languages/plugins/java.js +402 -0
  145. package/dist/languages/plugins/java.js.map +1 -0
  146. package/dist/languages/plugins/javascript.d.ts +48 -0
  147. package/dist/languages/plugins/javascript.js +445 -0
  148. package/dist/languages/plugins/javascript.js.map +1 -0
  149. package/dist/languages/plugins/python.d.ts +47 -0
  150. package/dist/languages/plugins/python.js +480 -0
  151. package/dist/languages/plugins/python.js.map +1 -0
  152. package/dist/languages/plugins/rust.d.ts +47 -0
  153. package/dist/languages/plugins/rust.js +405 -0
  154. package/dist/languages/plugins/rust.js.map +1 -0
  155. package/dist/languages/registry.d.ts +30 -0
  156. package/dist/languages/registry.js +80 -0
  157. package/dist/languages/registry.js.map +1 -0
  158. package/dist/languages/types.d.ts +184 -0
  159. package/dist/languages/types.js +8 -0
  160. package/dist/languages/types.js.map +1 -0
  161. package/dist/resolution/cross-file.d.ts +146 -0
  162. package/dist/resolution/cross-file.js +439 -0
  163. package/dist/resolution/cross-file.js.map +1 -0
  164. package/dist/resolution/index.d.ts +12 -0
  165. package/dist/resolution/index.js +10 -0
  166. package/dist/resolution/index.js.map +1 -0
  167. package/dist/resolution/symbol-table.d.ts +136 -0
  168. package/dist/resolution/symbol-table.js +336 -0
  169. package/dist/resolution/symbol-table.js.map +1 -0
  170. package/dist/resolution/type-hierarchy.d.ts +124 -0
  171. package/dist/resolution/type-hierarchy.js +515 -0
  172. package/dist/resolution/type-hierarchy.js.map +1 -0
  173. package/dist/types/config.d.ts +45 -0
  174. package/dist/types/config.js +5 -0
  175. package/dist/types/config.js.map +1 -0
  176. package/dist/types/index.d.ts +392 -0
  177. package/dist/types/index.js +7 -0
  178. package/dist/types/index.js.map +1 -0
  179. package/dist/utils/logger.d.ts +85 -0
  180. package/dist/utils/logger.js +198 -0
  181. package/dist/utils/logger.js.map +1 -0
  182. package/dist/wasm/tree-sitter-java.wasm +0 -0
  183. package/dist/wasm/tree-sitter-javascript.wasm +0 -0
  184. package/dist/wasm/tree-sitter-python.wasm +0 -0
  185. package/dist/wasm/tree-sitter-rust.wasm +0 -0
  186. package/dist/wasm/web-tree-sitter.wasm +0 -0
  187. package/docs/SPEC.md +1021 -0
  188. package/examples/browser-example.html +610 -0
  189. package/examples/node-example.ts +215 -0
  190. package/package.json +107 -0
  191. package/wasm/tree-sitter-java.wasm +0 -0
  192. package/wasm/tree-sitter-javascript.wasm +0 -0
  193. package/wasm/tree-sitter-python.wasm +0 -0
  194. package/wasm/tree-sitter-rust.wasm +0 -0
@@ -0,0 +1,405 @@
1
+ /**
2
+ * Rust Language Plugin
3
+ *
4
+ * Provides Rust-specific AST handling, taint patterns, and framework detection.
5
+ */
6
+ import { BaseLanguagePlugin } from './base.js';
7
+ /**
8
+ * Rust language plugin implementation.
9
+ */
10
+ export class RustPlugin extends BaseLanguagePlugin {
11
+ id = 'rust';
12
+ name = 'Rust';
13
+ extensions = ['.rs'];
14
+ wasmPath = 'tree-sitter-rust.wasm';
15
+ nodeTypes = {
16
+ // Type declarations
17
+ classDeclaration: ['struct_item'],
18
+ interfaceDeclaration: ['trait_item'],
19
+ enumDeclaration: ['enum_item'],
20
+ functionDeclaration: ['function_item'],
21
+ methodDeclaration: ['function_item'], // Methods are function_item inside impl
22
+ // Expressions
23
+ methodCall: ['call_expression'],
24
+ functionCall: ['call_expression'],
25
+ assignment: ['assignment_expression', 'let_declaration'],
26
+ variableDeclaration: ['let_declaration'],
27
+ // Parameters and arguments
28
+ parameter: ['parameter', 'self_parameter'],
29
+ argument: ['arguments'],
30
+ // Annotations/decorators
31
+ annotation: ['attribute_item'],
32
+ decorator: [],
33
+ // Imports
34
+ importStatement: ['use_declaration'],
35
+ // Control flow
36
+ ifStatement: ['if_expression'],
37
+ forStatement: ['for_expression'],
38
+ whileStatement: ['while_expression'],
39
+ tryStatement: [], // Rust uses Result/Option, not try-catch
40
+ returnStatement: ['return_expression'],
41
+ };
42
+ /**
43
+ * Detect Rust frameworks from imports.
44
+ */
45
+ detectFramework(context) {
46
+ const indicators = [];
47
+ let framework;
48
+ let confidence = 0;
49
+ for (const imp of context.imports) {
50
+ const path = imp.from_package || imp.imported_name;
51
+ // Actix-web
52
+ if (path.startsWith('actix_web') || path.startsWith('actix-web')) {
53
+ framework = 'actix-web';
54
+ confidence = Math.max(confidence, 0.95);
55
+ indicators.push(`use: ${path}`);
56
+ }
57
+ // Rocket
58
+ if (path.startsWith('rocket')) {
59
+ framework = 'rocket';
60
+ confidence = Math.max(confidence, 0.95);
61
+ indicators.push(`use: ${path}`);
62
+ }
63
+ // Axum
64
+ if (path.startsWith('axum')) {
65
+ framework = 'axum';
66
+ confidence = Math.max(confidence, 0.95);
67
+ indicators.push(`use: ${path}`);
68
+ }
69
+ // Warp
70
+ if (path.startsWith('warp')) {
71
+ framework = 'warp';
72
+ confidence = Math.max(confidence, 0.95);
73
+ indicators.push(`use: ${path}`);
74
+ }
75
+ // Hyper
76
+ if (path.startsWith('hyper')) {
77
+ framework = framework || 'hyper';
78
+ confidence = Math.max(confidence, 0.85);
79
+ indicators.push(`use: ${path}`);
80
+ }
81
+ // Tokio (async runtime)
82
+ if (path.startsWith('tokio')) {
83
+ indicators.push(`use: ${path}`);
84
+ }
85
+ }
86
+ if (framework) {
87
+ return { name: framework, confidence, indicators };
88
+ }
89
+ return undefined;
90
+ }
91
+ /**
92
+ * Rust taint source patterns.
93
+ */
94
+ getBuiltinSources() {
95
+ return [
96
+ // Actix-web request extractors
97
+ {
98
+ method: 'Query',
99
+ type: 'http_param',
100
+ severity: 'high',
101
+ confidence: 0.95,
102
+ returnTainted: true,
103
+ },
104
+ {
105
+ method: 'Json',
106
+ type: 'http_body',
107
+ severity: 'high',
108
+ confidence: 0.95,
109
+ returnTainted: true,
110
+ },
111
+ {
112
+ method: 'Path',
113
+ type: 'http_path',
114
+ severity: 'high',
115
+ confidence: 0.95,
116
+ returnTainted: true,
117
+ },
118
+ {
119
+ method: 'Form',
120
+ type: 'http_body',
121
+ severity: 'high',
122
+ confidence: 0.95,
123
+ returnTainted: true,
124
+ },
125
+ // Standard library sources
126
+ {
127
+ method: 'args',
128
+ class: 'std::env',
129
+ type: 'cli_arg',
130
+ severity: 'medium',
131
+ confidence: 0.9,
132
+ returnTainted: true,
133
+ },
134
+ {
135
+ method: 'var',
136
+ class: 'std::env',
137
+ type: 'env_var',
138
+ severity: 'medium',
139
+ confidence: 0.85,
140
+ returnTainted: true,
141
+ },
142
+ {
143
+ method: 'vars',
144
+ class: 'std::env',
145
+ type: 'env_var',
146
+ severity: 'medium',
147
+ confidence: 0.85,
148
+ returnTainted: true,
149
+ },
150
+ // File I/O
151
+ {
152
+ method: 'read_to_string',
153
+ class: 'std::fs',
154
+ type: 'file_input',
155
+ severity: 'medium',
156
+ confidence: 0.8,
157
+ returnTainted: true,
158
+ },
159
+ {
160
+ method: 'read',
161
+ class: 'std::fs',
162
+ type: 'file_input',
163
+ severity: 'medium',
164
+ confidence: 0.8,
165
+ returnTainted: true,
166
+ },
167
+ {
168
+ method: 'read_line',
169
+ class: 'BufRead',
170
+ type: 'file_input',
171
+ severity: 'medium',
172
+ confidence: 0.8,
173
+ returnTainted: true,
174
+ },
175
+ // Network input
176
+ {
177
+ method: 'read',
178
+ class: 'TcpStream',
179
+ type: 'network_input',
180
+ severity: 'high',
181
+ confidence: 0.85,
182
+ returnTainted: true,
183
+ },
184
+ ];
185
+ }
186
+ /**
187
+ * Rust taint sink patterns.
188
+ */
189
+ getBuiltinSinks() {
190
+ return [
191
+ // Command Injection
192
+ {
193
+ method: 'Command',
194
+ class: 'std::process',
195
+ type: 'command_injection',
196
+ cwe: 'CWE-78',
197
+ severity: 'critical',
198
+ argPositions: [0],
199
+ },
200
+ {
201
+ method: 'arg',
202
+ class: 'Command',
203
+ type: 'command_injection',
204
+ cwe: 'CWE-78',
205
+ severity: 'critical',
206
+ argPositions: [0],
207
+ },
208
+ {
209
+ method: 'args',
210
+ class: 'Command',
211
+ type: 'command_injection',
212
+ cwe: 'CWE-78',
213
+ severity: 'critical',
214
+ argPositions: [0],
215
+ },
216
+ // SQL Injection
217
+ {
218
+ method: 'execute',
219
+ type: 'sql_injection',
220
+ cwe: 'CWE-89',
221
+ severity: 'critical',
222
+ argPositions: [0],
223
+ },
224
+ {
225
+ method: 'query',
226
+ type: 'sql_injection',
227
+ cwe: 'CWE-89',
228
+ severity: 'critical',
229
+ argPositions: [0],
230
+ },
231
+ {
232
+ method: 'query_raw',
233
+ type: 'sql_injection',
234
+ cwe: 'CWE-89',
235
+ severity: 'critical',
236
+ argPositions: [0],
237
+ },
238
+ // Path Traversal
239
+ {
240
+ method: 'open',
241
+ class: 'File',
242
+ type: 'path_traversal',
243
+ cwe: 'CWE-22',
244
+ severity: 'high',
245
+ argPositions: [0],
246
+ },
247
+ {
248
+ method: 'create',
249
+ class: 'File',
250
+ type: 'path_traversal',
251
+ cwe: 'CWE-22',
252
+ severity: 'high',
253
+ argPositions: [0],
254
+ },
255
+ {
256
+ method: 'read_to_string',
257
+ class: 'std::fs',
258
+ type: 'path_traversal',
259
+ cwe: 'CWE-22',
260
+ severity: 'high',
261
+ argPositions: [0],
262
+ },
263
+ {
264
+ method: 'write',
265
+ class: 'std::fs',
266
+ type: 'path_traversal',
267
+ cwe: 'CWE-22',
268
+ severity: 'high',
269
+ argPositions: [0],
270
+ },
271
+ // Format String (Rust is mostly safe, but unchecked format! can be dangerous)
272
+ {
273
+ method: 'format!',
274
+ type: 'format_string',
275
+ cwe: 'CWE-134',
276
+ severity: 'medium',
277
+ argPositions: [0],
278
+ },
279
+ // Unsafe operations
280
+ {
281
+ method: 'from_raw_parts',
282
+ type: 'unsafe_memory',
283
+ cwe: 'CWE-119',
284
+ severity: 'high',
285
+ argPositions: [0, 1],
286
+ },
287
+ {
288
+ method: 'transmute',
289
+ type: 'unsafe_memory',
290
+ cwe: 'CWE-119',
291
+ severity: 'critical',
292
+ argPositions: [0],
293
+ },
294
+ // Deserialization (with serde)
295
+ {
296
+ method: 'from_str',
297
+ class: 'serde_json',
298
+ type: 'deserialization',
299
+ cwe: 'CWE-502',
300
+ severity: 'medium',
301
+ argPositions: [0],
302
+ },
303
+ {
304
+ method: 'from_slice',
305
+ class: 'serde_json',
306
+ type: 'deserialization',
307
+ cwe: 'CWE-502',
308
+ severity: 'medium',
309
+ argPositions: [0],
310
+ },
311
+ // SSRF
312
+ {
313
+ method: 'get',
314
+ class: 'reqwest',
315
+ type: 'ssrf',
316
+ cwe: 'CWE-918',
317
+ severity: 'high',
318
+ argPositions: [0],
319
+ },
320
+ {
321
+ method: 'post',
322
+ class: 'reqwest',
323
+ type: 'ssrf',
324
+ cwe: 'CWE-918',
325
+ severity: 'high',
326
+ argPositions: [0],
327
+ },
328
+ // Regex DoS
329
+ {
330
+ method: 'new',
331
+ class: 'Regex',
332
+ type: 'regex_dos',
333
+ cwe: 'CWE-1333',
334
+ severity: 'medium',
335
+ argPositions: [0],
336
+ },
337
+ ];
338
+ }
339
+ /**
340
+ * Get receiver type from a call expression.
341
+ */
342
+ getReceiverType(node, context) {
343
+ if (node.type !== 'call_expression')
344
+ return undefined;
345
+ const func = node.childForFieldName('function');
346
+ if (!func)
347
+ return undefined;
348
+ // For field expressions like obj.method()
349
+ if (func.type === 'field_expression') {
350
+ const value = func.childForFieldName('value');
351
+ if (value) {
352
+ return value.text;
353
+ }
354
+ }
355
+ // For scoped identifiers like Module::function()
356
+ if (func.type === 'scoped_identifier') {
357
+ const path = func.childForFieldName('path');
358
+ if (path) {
359
+ return path.text;
360
+ }
361
+ }
362
+ return undefined;
363
+ }
364
+ /**
365
+ * Check if node is a Rust string literal.
366
+ */
367
+ isStringLiteral(node) {
368
+ return node.type === 'string_literal' ||
369
+ node.type === 'raw_string_literal';
370
+ }
371
+ /**
372
+ * Get string value from Rust string literal.
373
+ */
374
+ getStringValue(node) {
375
+ if (!this.isStringLiteral(node))
376
+ return undefined;
377
+ const text = node.text;
378
+ // Handle raw strings r"..." or r#"..."#
379
+ const rawMatch = text.match(/^r#*"(.*)"#*$/s);
380
+ if (rawMatch) {
381
+ return rawMatch[1];
382
+ }
383
+ // Handle regular strings
384
+ if (text.startsWith('"') && text.endsWith('"')) {
385
+ return text.slice(1, -1);
386
+ }
387
+ return text;
388
+ }
389
+ // Extraction methods - delegate to existing extractors for now
390
+ extractTypes(context) {
391
+ return [];
392
+ }
393
+ extractCalls(context) {
394
+ return [];
395
+ }
396
+ extractImports(context) {
397
+ return [];
398
+ }
399
+ extractPackage(context) {
400
+ // Rust uses crate and module paths
401
+ // Could look for Cargo.toml
402
+ return undefined;
403
+ }
404
+ }
405
+ //# sourceMappingURL=rust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.js","sourceRoot":"","sources":["../../../src/languages/plugins/rust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Language Plugin Registry
3
+ *
4
+ * Manages registration and lookup of language plugins.
5
+ */
6
+ import type { LanguagePlugin, LanguageRegistry, SupportedLanguage } from './types.js';
7
+ /**
8
+ * Get the global language registry
9
+ */
10
+ export declare function getLanguageRegistry(): LanguageRegistry;
11
+ /**
12
+ * Register a language plugin in the global registry
13
+ */
14
+ export declare function registerLanguage(plugin: LanguagePlugin): void;
15
+ /**
16
+ * Get a language plugin by language ID
17
+ */
18
+ export declare function getLanguagePlugin(language: SupportedLanguage): LanguagePlugin | undefined;
19
+ /**
20
+ * Get a language plugin for a file path
21
+ */
22
+ export declare function getLanguageForFile(filePath: string): LanguagePlugin | undefined;
23
+ /**
24
+ * Detect language from file path
25
+ */
26
+ export declare function detectLanguage(filePath: string): SupportedLanguage | undefined;
27
+ /**
28
+ * Check if a language is supported
29
+ */
30
+ export declare function isLanguageSupported(language: string): language is SupportedLanguage;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Language Plugin Registry
3
+ *
4
+ * Manages registration and lookup of language plugins.
5
+ */
6
+ /**
7
+ * Default language registry implementation
8
+ */
9
+ class DefaultLanguageRegistry {
10
+ plugins = new Map();
11
+ extensionMap = new Map();
12
+ register(plugin) {
13
+ this.plugins.set(plugin.id, plugin);
14
+ // Map extensions to plugin
15
+ for (const ext of plugin.extensions) {
16
+ const normalizedExt = ext.startsWith('.') ? ext : `.${ext}`;
17
+ this.extensionMap.set(normalizedExt, plugin);
18
+ }
19
+ }
20
+ get(language) {
21
+ return this.plugins.get(language);
22
+ }
23
+ getForFile(filePath) {
24
+ // Extract extension
25
+ const lastDot = filePath.lastIndexOf('.');
26
+ if (lastDot === -1)
27
+ return undefined;
28
+ const ext = filePath.substring(lastDot).toLowerCase();
29
+ return this.extensionMap.get(ext);
30
+ }
31
+ getAll() {
32
+ return Array.from(this.plugins.values());
33
+ }
34
+ getSupportedLanguages() {
35
+ return Array.from(this.plugins.keys());
36
+ }
37
+ }
38
+ // Singleton registry instance
39
+ let globalRegistry = null;
40
+ /**
41
+ * Get the global language registry
42
+ */
43
+ export function getLanguageRegistry() {
44
+ if (!globalRegistry) {
45
+ globalRegistry = new DefaultLanguageRegistry();
46
+ }
47
+ return globalRegistry;
48
+ }
49
+ /**
50
+ * Register a language plugin in the global registry
51
+ */
52
+ export function registerLanguage(plugin) {
53
+ getLanguageRegistry().register(plugin);
54
+ }
55
+ /**
56
+ * Get a language plugin by language ID
57
+ */
58
+ export function getLanguagePlugin(language) {
59
+ return getLanguageRegistry().get(language);
60
+ }
61
+ /**
62
+ * Get a language plugin for a file path
63
+ */
64
+ export function getLanguageForFile(filePath) {
65
+ return getLanguageRegistry().getForFile(filePath);
66
+ }
67
+ /**
68
+ * Detect language from file path
69
+ */
70
+ export function detectLanguage(filePath) {
71
+ const plugin = getLanguageForFile(filePath);
72
+ return plugin?.id;
73
+ }
74
+ /**
75
+ * Check if a language is supported
76
+ */
77
+ export function isLanguageSupported(language) {
78
+ return getLanguageRegistry().getSupportedLanguages().includes(language);
79
+ }
80
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/languages/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;GAEG;AACH,MAAM,uBAAuB;IACnB,OAAO,GAA2C,IAAI,GAAG,EAAE,CAAC;IAC5D,YAAY,GAAgC,IAAI,GAAG,EAAE,CAAC;IAE9D,QAAQ,CAAC,MAAsB;QAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEpC,2BAA2B;QAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACpC,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;YAC5D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,GAAG,CAAC,QAA2B;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,QAAgB;QACzB,oBAAoB;QACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAErC,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,qBAAqB;QACnB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;CACF;AAED,8BAA8B;AAC9B,IAAI,cAAc,GAA4B,IAAI,CAAC;AAEnD;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,IAAI,uBAAuB,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAsB;IACrD,mBAAmB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAA2B;IAC3D,OAAO,mBAAmB,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,mBAAmB,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,MAAM,EAAE,EAAE,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,OAAO,mBAAmB,EAAE,CAAC,qBAAqB,EAAE,CAAC,QAAQ,CAAC,QAA6B,CAAC,CAAC;AAC/F,CAAC"}