@oculum/scanner 1.0.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 (281) hide show
  1. package/dist/formatters/cli-terminal.d.ts +27 -0
  2. package/dist/formatters/cli-terminal.d.ts.map +1 -0
  3. package/dist/formatters/cli-terminal.js +412 -0
  4. package/dist/formatters/cli-terminal.js.map +1 -0
  5. package/dist/formatters/github-comment.d.ts +41 -0
  6. package/dist/formatters/github-comment.d.ts.map +1 -0
  7. package/dist/formatters/github-comment.js +306 -0
  8. package/dist/formatters/github-comment.js.map +1 -0
  9. package/dist/formatters/grouping.d.ts +52 -0
  10. package/dist/formatters/grouping.d.ts.map +1 -0
  11. package/dist/formatters/grouping.js +152 -0
  12. package/dist/formatters/grouping.js.map +1 -0
  13. package/dist/formatters/index.d.ts +9 -0
  14. package/dist/formatters/index.d.ts.map +1 -0
  15. package/dist/formatters/index.js +35 -0
  16. package/dist/formatters/index.js.map +1 -0
  17. package/dist/formatters/vscode-diagnostic.d.ts +103 -0
  18. package/dist/formatters/vscode-diagnostic.d.ts.map +1 -0
  19. package/dist/formatters/vscode-diagnostic.js +151 -0
  20. package/dist/formatters/vscode-diagnostic.js.map +1 -0
  21. package/dist/index.d.ts +52 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +648 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/layer1/comments.d.ts +8 -0
  26. package/dist/layer1/comments.d.ts.map +1 -0
  27. package/dist/layer1/comments.js +203 -0
  28. package/dist/layer1/comments.js.map +1 -0
  29. package/dist/layer1/config-audit.d.ts +8 -0
  30. package/dist/layer1/config-audit.d.ts.map +1 -0
  31. package/dist/layer1/config-audit.js +252 -0
  32. package/dist/layer1/config-audit.js.map +1 -0
  33. package/dist/layer1/entropy.d.ts +8 -0
  34. package/dist/layer1/entropy.d.ts.map +1 -0
  35. package/dist/layer1/entropy.js +500 -0
  36. package/dist/layer1/entropy.js.map +1 -0
  37. package/dist/layer1/file-flags.d.ts +7 -0
  38. package/dist/layer1/file-flags.d.ts.map +1 -0
  39. package/dist/layer1/file-flags.js +112 -0
  40. package/dist/layer1/file-flags.js.map +1 -0
  41. package/dist/layer1/index.d.ts +36 -0
  42. package/dist/layer1/index.d.ts.map +1 -0
  43. package/dist/layer1/index.js +132 -0
  44. package/dist/layer1/index.js.map +1 -0
  45. package/dist/layer1/patterns.d.ts +8 -0
  46. package/dist/layer1/patterns.d.ts.map +1 -0
  47. package/dist/layer1/patterns.js +482 -0
  48. package/dist/layer1/patterns.js.map +1 -0
  49. package/dist/layer1/urls.d.ts +8 -0
  50. package/dist/layer1/urls.d.ts.map +1 -0
  51. package/dist/layer1/urls.js +296 -0
  52. package/dist/layer1/urls.js.map +1 -0
  53. package/dist/layer1/weak-crypto.d.ts +7 -0
  54. package/dist/layer1/weak-crypto.d.ts.map +1 -0
  55. package/dist/layer1/weak-crypto.js +291 -0
  56. package/dist/layer1/weak-crypto.js.map +1 -0
  57. package/dist/layer2/ai-agent-tools.d.ts +19 -0
  58. package/dist/layer2/ai-agent-tools.d.ts.map +1 -0
  59. package/dist/layer2/ai-agent-tools.js +528 -0
  60. package/dist/layer2/ai-agent-tools.js.map +1 -0
  61. package/dist/layer2/ai-endpoint-protection.d.ts +36 -0
  62. package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -0
  63. package/dist/layer2/ai-endpoint-protection.js +332 -0
  64. package/dist/layer2/ai-endpoint-protection.js.map +1 -0
  65. package/dist/layer2/ai-execution-sinks.d.ts +18 -0
  66. package/dist/layer2/ai-execution-sinks.d.ts.map +1 -0
  67. package/dist/layer2/ai-execution-sinks.js +496 -0
  68. package/dist/layer2/ai-execution-sinks.js.map +1 -0
  69. package/dist/layer2/ai-fingerprinting.d.ts +7 -0
  70. package/dist/layer2/ai-fingerprinting.d.ts.map +1 -0
  71. package/dist/layer2/ai-fingerprinting.js +654 -0
  72. package/dist/layer2/ai-fingerprinting.js.map +1 -0
  73. package/dist/layer2/ai-prompt-hygiene.d.ts +19 -0
  74. package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -0
  75. package/dist/layer2/ai-prompt-hygiene.js +356 -0
  76. package/dist/layer2/ai-prompt-hygiene.js.map +1 -0
  77. package/dist/layer2/ai-rag-safety.d.ts +21 -0
  78. package/dist/layer2/ai-rag-safety.d.ts.map +1 -0
  79. package/dist/layer2/ai-rag-safety.js +459 -0
  80. package/dist/layer2/ai-rag-safety.js.map +1 -0
  81. package/dist/layer2/ai-schema-validation.d.ts +25 -0
  82. package/dist/layer2/ai-schema-validation.d.ts.map +1 -0
  83. package/dist/layer2/ai-schema-validation.js +375 -0
  84. package/dist/layer2/ai-schema-validation.js.map +1 -0
  85. package/dist/layer2/auth-antipatterns.d.ts +20 -0
  86. package/dist/layer2/auth-antipatterns.d.ts.map +1 -0
  87. package/dist/layer2/auth-antipatterns.js +333 -0
  88. package/dist/layer2/auth-antipatterns.js.map +1 -0
  89. package/dist/layer2/byok-patterns.d.ts +12 -0
  90. package/dist/layer2/byok-patterns.d.ts.map +1 -0
  91. package/dist/layer2/byok-patterns.js +299 -0
  92. package/dist/layer2/byok-patterns.js.map +1 -0
  93. package/dist/layer2/dangerous-functions.d.ts +7 -0
  94. package/dist/layer2/dangerous-functions.d.ts.map +1 -0
  95. package/dist/layer2/dangerous-functions.js +1375 -0
  96. package/dist/layer2/dangerous-functions.js.map +1 -0
  97. package/dist/layer2/data-exposure.d.ts +16 -0
  98. package/dist/layer2/data-exposure.d.ts.map +1 -0
  99. package/dist/layer2/data-exposure.js +279 -0
  100. package/dist/layer2/data-exposure.js.map +1 -0
  101. package/dist/layer2/framework-checks.d.ts +7 -0
  102. package/dist/layer2/framework-checks.d.ts.map +1 -0
  103. package/dist/layer2/framework-checks.js +388 -0
  104. package/dist/layer2/framework-checks.js.map +1 -0
  105. package/dist/layer2/index.d.ts +58 -0
  106. package/dist/layer2/index.d.ts.map +1 -0
  107. package/dist/layer2/index.js +380 -0
  108. package/dist/layer2/index.js.map +1 -0
  109. package/dist/layer2/logic-gates.d.ts +7 -0
  110. package/dist/layer2/logic-gates.d.ts.map +1 -0
  111. package/dist/layer2/logic-gates.js +182 -0
  112. package/dist/layer2/logic-gates.js.map +1 -0
  113. package/dist/layer2/risky-imports.d.ts +7 -0
  114. package/dist/layer2/risky-imports.d.ts.map +1 -0
  115. package/dist/layer2/risky-imports.js +161 -0
  116. package/dist/layer2/risky-imports.js.map +1 -0
  117. package/dist/layer2/variables.d.ts +8 -0
  118. package/dist/layer2/variables.d.ts.map +1 -0
  119. package/dist/layer2/variables.js +152 -0
  120. package/dist/layer2/variables.js.map +1 -0
  121. package/dist/layer3/anthropic.d.ts +83 -0
  122. package/dist/layer3/anthropic.d.ts.map +1 -0
  123. package/dist/layer3/anthropic.js +1745 -0
  124. package/dist/layer3/anthropic.js.map +1 -0
  125. package/dist/layer3/index.d.ts +24 -0
  126. package/dist/layer3/index.d.ts.map +1 -0
  127. package/dist/layer3/index.js +119 -0
  128. package/dist/layer3/index.js.map +1 -0
  129. package/dist/layer3/openai.d.ts +25 -0
  130. package/dist/layer3/openai.d.ts.map +1 -0
  131. package/dist/layer3/openai.js +238 -0
  132. package/dist/layer3/openai.js.map +1 -0
  133. package/dist/layer3/package-check.d.ts +63 -0
  134. package/dist/layer3/package-check.d.ts.map +1 -0
  135. package/dist/layer3/package-check.js +508 -0
  136. package/dist/layer3/package-check.js.map +1 -0
  137. package/dist/modes/incremental.d.ts +66 -0
  138. package/dist/modes/incremental.d.ts.map +1 -0
  139. package/dist/modes/incremental.js +200 -0
  140. package/dist/modes/incremental.js.map +1 -0
  141. package/dist/tiers.d.ts +125 -0
  142. package/dist/tiers.d.ts.map +1 -0
  143. package/dist/tiers.js +234 -0
  144. package/dist/tiers.js.map +1 -0
  145. package/dist/types.d.ts +175 -0
  146. package/dist/types.d.ts.map +1 -0
  147. package/dist/types.js +50 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/utils/auth-helper-detector.d.ts +56 -0
  150. package/dist/utils/auth-helper-detector.d.ts.map +1 -0
  151. package/dist/utils/auth-helper-detector.js +360 -0
  152. package/dist/utils/auth-helper-detector.js.map +1 -0
  153. package/dist/utils/context-helpers.d.ts +96 -0
  154. package/dist/utils/context-helpers.d.ts.map +1 -0
  155. package/dist/utils/context-helpers.js +493 -0
  156. package/dist/utils/context-helpers.js.map +1 -0
  157. package/dist/utils/diff-detector.d.ts +53 -0
  158. package/dist/utils/diff-detector.d.ts.map +1 -0
  159. package/dist/utils/diff-detector.js +104 -0
  160. package/dist/utils/diff-detector.js.map +1 -0
  161. package/dist/utils/diff-parser.d.ts +80 -0
  162. package/dist/utils/diff-parser.d.ts.map +1 -0
  163. package/dist/utils/diff-parser.js +202 -0
  164. package/dist/utils/diff-parser.js.map +1 -0
  165. package/dist/utils/imported-auth-detector.d.ts +37 -0
  166. package/dist/utils/imported-auth-detector.d.ts.map +1 -0
  167. package/dist/utils/imported-auth-detector.js +251 -0
  168. package/dist/utils/imported-auth-detector.js.map +1 -0
  169. package/dist/utils/middleware-detector.d.ts +55 -0
  170. package/dist/utils/middleware-detector.d.ts.map +1 -0
  171. package/dist/utils/middleware-detector.js +260 -0
  172. package/dist/utils/middleware-detector.js.map +1 -0
  173. package/dist/utils/oauth-flow-detector.d.ts +41 -0
  174. package/dist/utils/oauth-flow-detector.d.ts.map +1 -0
  175. package/dist/utils/oauth-flow-detector.js +202 -0
  176. package/dist/utils/oauth-flow-detector.js.map +1 -0
  177. package/dist/utils/path-exclusions.d.ts +55 -0
  178. package/dist/utils/path-exclusions.d.ts.map +1 -0
  179. package/dist/utils/path-exclusions.js +222 -0
  180. package/dist/utils/path-exclusions.js.map +1 -0
  181. package/dist/utils/project-context-builder.d.ts +119 -0
  182. package/dist/utils/project-context-builder.d.ts.map +1 -0
  183. package/dist/utils/project-context-builder.js +534 -0
  184. package/dist/utils/project-context-builder.js.map +1 -0
  185. package/dist/utils/registry-clients.d.ts +93 -0
  186. package/dist/utils/registry-clients.d.ts.map +1 -0
  187. package/dist/utils/registry-clients.js +273 -0
  188. package/dist/utils/registry-clients.js.map +1 -0
  189. package/dist/utils/trpc-analyzer.d.ts +78 -0
  190. package/dist/utils/trpc-analyzer.d.ts.map +1 -0
  191. package/dist/utils/trpc-analyzer.js +297 -0
  192. package/dist/utils/trpc-analyzer.js.map +1 -0
  193. package/package.json +45 -0
  194. package/src/__tests__/benchmark/fixtures/false-positives.ts +227 -0
  195. package/src/__tests__/benchmark/fixtures/index.ts +68 -0
  196. package/src/__tests__/benchmark/fixtures/layer1/config-audit.ts +364 -0
  197. package/src/__tests__/benchmark/fixtures/layer1/hardcoded-secrets.ts +173 -0
  198. package/src/__tests__/benchmark/fixtures/layer1/high-entropy.ts +234 -0
  199. package/src/__tests__/benchmark/fixtures/layer1/index.ts +31 -0
  200. package/src/__tests__/benchmark/fixtures/layer1/sensitive-urls.ts +90 -0
  201. package/src/__tests__/benchmark/fixtures/layer1/weak-crypto.ts +197 -0
  202. package/src/__tests__/benchmark/fixtures/layer2/ai-agent-tools.ts +170 -0
  203. package/src/__tests__/benchmark/fixtures/layer2/ai-endpoint-protection.ts +418 -0
  204. package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +189 -0
  205. package/src/__tests__/benchmark/fixtures/layer2/ai-fingerprinting.ts +316 -0
  206. package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +178 -0
  207. package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +184 -0
  208. package/src/__tests__/benchmark/fixtures/layer2/ai-schema-validation.ts +434 -0
  209. package/src/__tests__/benchmark/fixtures/layer2/auth-antipatterns.ts +159 -0
  210. package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +112 -0
  211. package/src/__tests__/benchmark/fixtures/layer2/dangerous-functions.ts +246 -0
  212. package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +168 -0
  213. package/src/__tests__/benchmark/fixtures/layer2/framework-checks.ts +346 -0
  214. package/src/__tests__/benchmark/fixtures/layer2/index.ts +67 -0
  215. package/src/__tests__/benchmark/fixtures/layer2/injection-vulnerabilities.ts +239 -0
  216. package/src/__tests__/benchmark/fixtures/layer2/logic-gates.ts +246 -0
  217. package/src/__tests__/benchmark/fixtures/layer2/risky-imports.ts +231 -0
  218. package/src/__tests__/benchmark/fixtures/layer2/variables.ts +167 -0
  219. package/src/__tests__/benchmark/index.ts +29 -0
  220. package/src/__tests__/benchmark/run-benchmark.ts +144 -0
  221. package/src/__tests__/benchmark/run-depth-validation.ts +206 -0
  222. package/src/__tests__/benchmark/run-real-world-test.ts +243 -0
  223. package/src/__tests__/benchmark/security-benchmark-script.ts +1737 -0
  224. package/src/__tests__/benchmark/tier-integration-script.ts +177 -0
  225. package/src/__tests__/benchmark/types.ts +144 -0
  226. package/src/__tests__/benchmark/utils/test-runner.ts +475 -0
  227. package/src/__tests__/regression/known-false-positives.test.ts +467 -0
  228. package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +178 -0
  229. package/src/__tests__/snapshots/scan-depth.test.ts +258 -0
  230. package/src/__tests__/validation/analyze-results.ts +542 -0
  231. package/src/__tests__/validation/extract-for-triage.ts +146 -0
  232. package/src/__tests__/validation/fp-deep-analysis.ts +327 -0
  233. package/src/__tests__/validation/run-validation.ts +364 -0
  234. package/src/__tests__/validation/triage-template.md +132 -0
  235. package/src/formatters/cli-terminal.ts +446 -0
  236. package/src/formatters/github-comment.ts +382 -0
  237. package/src/formatters/grouping.ts +190 -0
  238. package/src/formatters/index.ts +47 -0
  239. package/src/formatters/vscode-diagnostic.ts +243 -0
  240. package/src/index.ts +823 -0
  241. package/src/layer1/comments.ts +218 -0
  242. package/src/layer1/config-audit.ts +289 -0
  243. package/src/layer1/entropy.ts +583 -0
  244. package/src/layer1/file-flags.ts +127 -0
  245. package/src/layer1/index.ts +181 -0
  246. package/src/layer1/patterns.ts +516 -0
  247. package/src/layer1/urls.ts +334 -0
  248. package/src/layer1/weak-crypto.ts +328 -0
  249. package/src/layer2/ai-agent-tools.ts +601 -0
  250. package/src/layer2/ai-endpoint-protection.ts +387 -0
  251. package/src/layer2/ai-execution-sinks.ts +580 -0
  252. package/src/layer2/ai-fingerprinting.ts +758 -0
  253. package/src/layer2/ai-prompt-hygiene.ts +411 -0
  254. package/src/layer2/ai-rag-safety.ts +511 -0
  255. package/src/layer2/ai-schema-validation.ts +421 -0
  256. package/src/layer2/auth-antipatterns.ts +394 -0
  257. package/src/layer2/byok-patterns.ts +336 -0
  258. package/src/layer2/dangerous-functions.ts +1563 -0
  259. package/src/layer2/data-exposure.ts +315 -0
  260. package/src/layer2/framework-checks.ts +433 -0
  261. package/src/layer2/index.ts +473 -0
  262. package/src/layer2/logic-gates.ts +206 -0
  263. package/src/layer2/risky-imports.ts +186 -0
  264. package/src/layer2/variables.ts +166 -0
  265. package/src/layer3/anthropic.ts +2030 -0
  266. package/src/layer3/index.ts +130 -0
  267. package/src/layer3/package-check.ts +604 -0
  268. package/src/modes/incremental.ts +293 -0
  269. package/src/tiers.ts +318 -0
  270. package/src/types.ts +284 -0
  271. package/src/utils/auth-helper-detector.ts +443 -0
  272. package/src/utils/context-helpers.ts +535 -0
  273. package/src/utils/diff-detector.ts +135 -0
  274. package/src/utils/diff-parser.ts +272 -0
  275. package/src/utils/imported-auth-detector.ts +320 -0
  276. package/src/utils/middleware-detector.ts +333 -0
  277. package/src/utils/oauth-flow-detector.ts +246 -0
  278. package/src/utils/path-exclusions.ts +266 -0
  279. package/src/utils/project-context-builder.ts +707 -0
  280. package/src/utils/registry-clients.ts +351 -0
  281. package/src/utils/trpc-analyzer.ts +382 -0
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ /**
3
+ * Registry Clients for Package Metadata
4
+ * Fetches package information from npm and PyPI registries
5
+ * Used by the Hallucination Firewall (Story C) to assess dependency risk
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.fetchNPMMetadata = fetchNPMMetadata;
9
+ exports.fetchPyPIMetadata = fetchPyPIMetadata;
10
+ exports.extractNpmDependencies = extractNpmDependencies;
11
+ exports.extractPythonRequirements = extractPythonRequirements;
12
+ exports.extractPyprojectDependencies = extractPyprojectDependencies;
13
+ exports.getPackageFileType = getPackageFileType;
14
+ exports.calculatePackageAgeDays = calculatePackageAgeDays;
15
+ exports.rateLimitDelay = rateLimitDelay;
16
+ exports.clearRegistryCaches = clearRegistryCaches;
17
+ // Cache for package metadata to avoid repeated requests
18
+ const npmMetadataCache = new Map();
19
+ const pypiMetadataCache = new Map();
20
+ // Rate limiting configuration
21
+ const RATE_LIMIT_DELAY_MS = 100;
22
+ /**
23
+ * Fetch package metadata from npm registry
24
+ * Returns null if package doesn't exist
25
+ */
26
+ async function fetchNPMMetadata(packageName) {
27
+ // Check cache first
28
+ if (npmMetadataCache.has(packageName)) {
29
+ return npmMetadataCache.get(packageName) || null;
30
+ }
31
+ try {
32
+ // Fetch package info from npm registry
33
+ const registryResponse = await fetch(`https://registry.npmjs.org/${encodeURIComponent(packageName)}`, {
34
+ headers: {
35
+ 'Accept': 'application/json',
36
+ },
37
+ });
38
+ if (!registryResponse.ok) {
39
+ if (registryResponse.status === 404) {
40
+ npmMetadataCache.set(packageName, null);
41
+ return null;
42
+ }
43
+ // Non-404 error - don't cache, might be transient
44
+ console.warn(`[Registry] npm registry error for ${packageName}: ${registryResponse.status}`);
45
+ return null;
46
+ }
47
+ const data = await registryResponse.json();
48
+ // Fetch download counts separately (different API)
49
+ let weeklyDownloads = 0;
50
+ try {
51
+ const downloadsResponse = await fetch(`https://api.npmjs.org/downloads/point/last-week/${encodeURIComponent(packageName)}`);
52
+ if (downloadsResponse.ok) {
53
+ const downloadsData = await downloadsResponse.json();
54
+ weeklyDownloads = downloadsData.downloads || 0;
55
+ }
56
+ }
57
+ catch {
58
+ // Download count is optional, don't fail
59
+ }
60
+ const metadata = {
61
+ name: data.name,
62
+ version: (data['dist-tags']?.latest) || '',
63
+ description: data.description,
64
+ maintainers: data.maintainers || [],
65
+ time: data.time || { created: '', modified: '' },
66
+ repository: data.repository,
67
+ homepage: data.homepage,
68
+ license: data.license,
69
+ downloads: { weekly: weeklyDownloads },
70
+ };
71
+ npmMetadataCache.set(packageName, metadata);
72
+ return metadata;
73
+ }
74
+ catch (error) {
75
+ console.warn(`[Registry] Failed to fetch npm metadata for ${packageName}:`, error);
76
+ // Don't cache network errors
77
+ return null;
78
+ }
79
+ }
80
+ /**
81
+ * Fetch package metadata from PyPI registry
82
+ * Returns null if package doesn't exist
83
+ */
84
+ async function fetchPyPIMetadata(packageName) {
85
+ // Check cache first
86
+ if (pypiMetadataCache.has(packageName)) {
87
+ return pypiMetadataCache.get(packageName) || null;
88
+ }
89
+ try {
90
+ const response = await fetch(`https://pypi.org/pypi/${encodeURIComponent(packageName)}/json`, {
91
+ headers: {
92
+ 'Accept': 'application/json',
93
+ },
94
+ });
95
+ if (!response.ok) {
96
+ if (response.status === 404) {
97
+ pypiMetadataCache.set(packageName, null);
98
+ return null;
99
+ }
100
+ console.warn(`[Registry] PyPI registry error for ${packageName}: ${response.status}`);
101
+ return null;
102
+ }
103
+ const data = await response.json();
104
+ const info = (data.info || {});
105
+ // Get release date from the latest version
106
+ let releaseDate;
107
+ const releases = data.releases?.[info.version];
108
+ if (releases && releases.length > 0) {
109
+ releaseDate = releases[0].upload_time;
110
+ }
111
+ const metadata = {
112
+ name: info.name,
113
+ version: info.version,
114
+ summary: info.summary,
115
+ author: info.author,
116
+ authorEmail: info.author_email,
117
+ license: info.license,
118
+ projectUrls: info.project_urls,
119
+ releaseDate,
120
+ requiresPython: info.requires_python,
121
+ };
122
+ pypiMetadataCache.set(packageName, metadata);
123
+ return metadata;
124
+ }
125
+ catch (error) {
126
+ console.warn(`[Registry] Failed to fetch PyPI metadata for ${packageName}:`, error);
127
+ return null;
128
+ }
129
+ }
130
+ /**
131
+ * Extract dependencies from package.json content
132
+ */
133
+ function extractNpmDependencies(content) {
134
+ try {
135
+ const pkg = JSON.parse(content);
136
+ const deps = [];
137
+ const lines = content.split('\n');
138
+ const depSections = [
139
+ { key: 'dependencies', source: 'dependencies' },
140
+ { key: 'devDependencies', source: 'devDependencies' },
141
+ { key: 'peerDependencies', source: 'peerDependencies' },
142
+ { key: 'optionalDependencies', source: 'optionalDependencies' },
143
+ ];
144
+ for (const { key, source } of depSections) {
145
+ const depsObj = pkg[key];
146
+ if (!depsObj || typeof depsObj !== 'object')
147
+ continue;
148
+ for (const [name, version] of Object.entries(depsObj)) {
149
+ // Find the line number for this dependency
150
+ const lineIndex = lines.findIndex(l => l.includes(`"${name}"`));
151
+ deps.push({
152
+ name,
153
+ version: version,
154
+ source,
155
+ line: lineIndex >= 0 ? lineIndex + 1 : 1,
156
+ });
157
+ }
158
+ }
159
+ return deps;
160
+ }
161
+ catch {
162
+ return [];
163
+ }
164
+ }
165
+ /**
166
+ * Extract dependencies from requirements.txt content
167
+ */
168
+ function extractPythonRequirements(content) {
169
+ const deps = [];
170
+ const lines = content.split('\n');
171
+ lines.forEach((line, index) => {
172
+ // Skip comments and empty lines
173
+ const trimmed = line.trim();
174
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('-')) {
175
+ return;
176
+ }
177
+ // Parse package name and optional version
178
+ // Formats: package, package==1.0.0, package>=1.0.0, package[extra], etc.
179
+ const match = trimmed.match(/^([a-zA-Z0-9_-]+)(?:\[.*?\])?(?:[=<>~!]+(.+))?/);
180
+ if (match) {
181
+ deps.push({
182
+ name: match[1],
183
+ version: match[2],
184
+ source: 'requirements',
185
+ line: index + 1,
186
+ });
187
+ }
188
+ });
189
+ return deps;
190
+ }
191
+ /**
192
+ * Extract dependencies from pyproject.toml content
193
+ */
194
+ function extractPyprojectDependencies(content) {
195
+ const deps = [];
196
+ const lines = content.split('\n');
197
+ let inDependencies = false;
198
+ lines.forEach((line, index) => {
199
+ const trimmed = line.trim();
200
+ // Check for dependencies section
201
+ if (trimmed === '[project.dependencies]' || trimmed === 'dependencies = [') {
202
+ inDependencies = true;
203
+ return;
204
+ }
205
+ // Exit dependencies section
206
+ if (inDependencies && (trimmed.startsWith('[') || trimmed === ']')) {
207
+ inDependencies = false;
208
+ return;
209
+ }
210
+ if (inDependencies) {
211
+ // Parse dependency line: "package>=1.0.0", or package = ">=1.0.0"
212
+ const match = trimmed.match(/^["']?([a-zA-Z0-9_-]+)(?:\[.*?\])?(?:[=<>~!]+)?/);
213
+ if (match && match[1]) {
214
+ deps.push({
215
+ name: match[1],
216
+ version: undefined,
217
+ source: 'requirements',
218
+ line: index + 1,
219
+ });
220
+ }
221
+ }
222
+ });
223
+ return deps;
224
+ }
225
+ /**
226
+ * Determine the package file type from path
227
+ */
228
+ function getPackageFileType(filePath) {
229
+ const fileName = filePath.split('/').pop()?.toLowerCase() || '';
230
+ if (fileName === 'package.json' ||
231
+ fileName === 'package-lock.json' ||
232
+ fileName === 'yarn.lock' ||
233
+ fileName === 'pnpm-lock.yaml') {
234
+ return 'npm';
235
+ }
236
+ if (fileName === 'requirements.txt' ||
237
+ fileName === 'pyproject.toml' ||
238
+ fileName === 'pipfile' ||
239
+ fileName === 'pipfile.lock') {
240
+ return 'python';
241
+ }
242
+ return null;
243
+ }
244
+ /**
245
+ * Calculate package age in days from creation date
246
+ */
247
+ function calculatePackageAgeDays(createdDate) {
248
+ if (!createdDate)
249
+ return Infinity; // Unknown age, treat as old (safe)
250
+ try {
251
+ const created = new Date(createdDate);
252
+ const now = new Date();
253
+ const diffMs = now.getTime() - created.getTime();
254
+ return Math.floor(diffMs / (1000 * 60 * 60 * 24));
255
+ }
256
+ catch {
257
+ return Infinity;
258
+ }
259
+ }
260
+ /**
261
+ * Rate limiter helper - adds delay between registry requests
262
+ */
263
+ async function rateLimitDelay() {
264
+ return new Promise(resolve => setTimeout(resolve, RATE_LIMIT_DELAY_MS));
265
+ }
266
+ /**
267
+ * Clear all caches (useful for testing)
268
+ */
269
+ function clearRegistryCaches() {
270
+ npmMetadataCache.clear();
271
+ pypiMetadataCache.clear();
272
+ }
273
+ //# sourceMappingURL=registry-clients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-clients.js","sourceRoot":"","sources":["../../src/utils/registry-clients.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * tRPC Router Analyzer
3
+ * Analyzes tRPC router definitions to understand which procedures are protected
4
+ * by middleware (e.g., adminProcedure, protectedProcedure).
5
+ *
6
+ * This helps prevent false positives when frontend code calls protected tRPC
7
+ * procedures - the backend already handles authorization.
8
+ */
9
+ import type { ScanFile } from '../types';
10
+ export interface TRPCMiddleware {
11
+ /** Name of the middleware/procedure base */
12
+ name: string;
13
+ /** Type of protection */
14
+ type: 'admin' | 'authenticated' | 'public' | 'unknown';
15
+ /** File where defined */
16
+ definedIn?: string;
17
+ /** Line number where defined */
18
+ lineNumber?: number;
19
+ }
20
+ export interface TRPCProcedure {
21
+ /** Procedure name (e.g., 'getUsers', 'createPost') */
22
+ name: string;
23
+ /** Router this procedure belongs to */
24
+ router: string;
25
+ /** Whether this procedure has auth middleware */
26
+ hasAuthMiddleware: boolean;
27
+ /** Type of middleware protection */
28
+ middlewareType?: 'admin' | 'authenticated' | 'public';
29
+ /** File where defined */
30
+ definedIn?: string;
31
+ }
32
+ export interface TRPCRouter {
33
+ /** Router name (e.g., 'admin', 'user', 'post') */
34
+ name: string;
35
+ /** File where router is defined */
36
+ file: string;
37
+ /** Procedures in this router */
38
+ procedures: string[];
39
+ /** Default middleware for this router (if any) */
40
+ defaultMiddleware?: string;
41
+ /** Whether all procedures in this router are protected */
42
+ isProtected: boolean;
43
+ }
44
+ export interface TRPCRouterContext {
45
+ /** All detected routers */
46
+ routers: Map<string, TRPCRouter>;
47
+ /** All detected procedures with their protection status */
48
+ procedures: Map<string, TRPCProcedure>;
49
+ /** All detected middleware definitions */
50
+ middlewares: Map<string, TRPCMiddleware>;
51
+ /** Whether tRPC is detected in the project */
52
+ hasTRPC: boolean;
53
+ }
54
+ /**
55
+ * Analyze tRPC routers across all files
56
+ */
57
+ export declare function analyzeTRPCRouters(files: ScanFile[]): TRPCRouterContext;
58
+ /**
59
+ * Check if a tRPC procedure is protected by middleware
60
+ */
61
+ export declare function isProcedureProtected(context: TRPCRouterContext, routerName: string, procedureName?: string): boolean;
62
+ /**
63
+ * Parse a tRPC client call to extract router and procedure names
64
+ * e.g., trpc.admin.getUsers.useQuery() -> { router: 'admin', procedure: 'getUsers' }
65
+ */
66
+ export declare function parseTRPCCall(lineContent: string): {
67
+ router: string;
68
+ procedure: string;
69
+ } | null;
70
+ /**
71
+ * Check if a line contains a tRPC client call
72
+ */
73
+ export declare function isTRPCClientCall(lineContent: string): boolean;
74
+ /**
75
+ * Get a summary of tRPC context for logging
76
+ */
77
+ export declare function getTRPCSummary(context: TRPCRouterContext): string;
78
+ //# sourceMappingURL=trpc-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trpc-analyzer.d.ts","sourceRoot":"","sources":["../../src/utils/trpc-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAA;IACZ,yBAAyB;IACzB,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,QAAQ,GAAG,SAAS,CAAA;IACtD,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,iBAAiB,EAAE,OAAO,CAAA;IAC1B,oCAAoC;IACpC,cAAc,CAAC,EAAE,OAAO,GAAG,eAAe,GAAG,QAAQ,CAAA;IACrD,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,gCAAgC;IAChC,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,0DAA0D;IAC1D,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAChC,2DAA2D;IAC3D,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACtC,0CAA0C;IAC1C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACxC,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAA;CACjB;AA0LD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAgDvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAqBT;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAmB/F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAcjE"}
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ /**
3
+ * tRPC Router Analyzer
4
+ * Analyzes tRPC router definitions to understand which procedures are protected
5
+ * by middleware (e.g., adminProcedure, protectedProcedure).
6
+ *
7
+ * This helps prevent false positives when frontend code calls protected tRPC
8
+ * procedures - the backend already handles authorization.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.analyzeTRPCRouters = analyzeTRPCRouters;
12
+ exports.isProcedureProtected = isProcedureProtected;
13
+ exports.parseTRPCCall = parseTRPCCall;
14
+ exports.isTRPCClientCall = isTRPCClientCall;
15
+ exports.getTRPCSummary = getTRPCSummary;
16
+ /**
17
+ * Patterns that indicate admin-level middleware
18
+ */
19
+ const ADMIN_MIDDLEWARE_PATTERNS = [
20
+ /adminProcedure/i,
21
+ /adminMiddleware/i,
22
+ /requireAdmin/i,
23
+ /isAdmin\s*:\s*true/i,
24
+ /role\s*===?\s*['"]admin['"]/i,
25
+ /\.admin\s*\(/i,
26
+ /adminRouter/i,
27
+ /superAdminProcedure/i,
28
+ ];
29
+ /**
30
+ * Patterns that indicate authenticated middleware
31
+ */
32
+ const AUTH_MIDDLEWARE_PATTERNS = [
33
+ /protectedProcedure/i,
34
+ /authenticatedProcedure/i,
35
+ /requireAuth/i,
36
+ /isAuthenticated/i,
37
+ /privateProcedure/i,
38
+ /authedProcedure/i,
39
+ /userProcedure/i,
40
+ /loggedInProcedure/i,
41
+ ];
42
+ /**
43
+ * Patterns that indicate public/unprotected procedures
44
+ */
45
+ const PUBLIC_MIDDLEWARE_PATTERNS = [
46
+ /publicProcedure/i,
47
+ /guestProcedure/i,
48
+ /unauthenticatedProcedure/i,
49
+ /openProcedure/i,
50
+ ];
51
+ /**
52
+ * Detect tRPC usage in files
53
+ */
54
+ function detectTRPCUsage(content) {
55
+ const trpcPatterns = [
56
+ /@trpc\/server/i,
57
+ /@trpc\/client/i,
58
+ /@trpc\/react-query/i,
59
+ /@trpc\/next/i,
60
+ /createTRPCRouter/i,
61
+ /initTRPC/i,
62
+ /trpc\.router/i,
63
+ /t\.router\s*\(/i,
64
+ /t\.procedure/i,
65
+ ];
66
+ return trpcPatterns.some(p => p.test(content));
67
+ }
68
+ /**
69
+ * Extract middleware definitions from a file
70
+ */
71
+ function extractMiddlewares(content, filePath) {
72
+ const middlewares = [];
73
+ const lines = content.split('\n');
74
+ // Look for procedure definitions with middleware
75
+ const procedureDefPatterns = [
76
+ /export\s+const\s+(\w+Procedure)\s*=\s*t\.procedure\.use/i,
77
+ /const\s+(\w+Procedure)\s*=\s*t\.procedure\.use/i,
78
+ /(\w+Procedure)\s*=\s*publicProcedure\.use/i,
79
+ /export\s+const\s+(\w+Procedure)\s*=/i,
80
+ ];
81
+ for (let i = 0; i < lines.length; i++) {
82
+ const line = lines[i];
83
+ for (const pattern of procedureDefPatterns) {
84
+ const match = line.match(pattern);
85
+ if (match) {
86
+ const name = match[1];
87
+ let type = 'unknown';
88
+ // Determine type based on name and context
89
+ if (ADMIN_MIDDLEWARE_PATTERNS.some(p => p.test(name) || p.test(line))) {
90
+ type = 'admin';
91
+ }
92
+ else if (AUTH_MIDDLEWARE_PATTERNS.some(p => p.test(name) || p.test(line))) {
93
+ type = 'authenticated';
94
+ }
95
+ else if (PUBLIC_MIDDLEWARE_PATTERNS.some(p => p.test(name) || p.test(line))) {
96
+ type = 'public';
97
+ }
98
+ middlewares.push({
99
+ name,
100
+ type,
101
+ definedIn: filePath,
102
+ lineNumber: i + 1,
103
+ });
104
+ }
105
+ }
106
+ }
107
+ return middlewares;
108
+ }
109
+ /**
110
+ * Extract router definitions from a file
111
+ */
112
+ function extractRouters(content, filePath, middlewares) {
113
+ const routers = [];
114
+ const lines = content.split('\n');
115
+ // Pattern to find router definitions
116
+ const routerDefPatterns = [
117
+ /export\s+const\s+(\w+Router)\s*=\s*(?:createTRPCRouter|t\.router)\s*\(\s*\{/i,
118
+ /const\s+(\w+Router)\s*=\s*(?:createTRPCRouter|t\.router)\s*\(\s*\{/i,
119
+ /(\w+):\s*(?:createTRPCRouter|t\.router)\s*\(\s*\{/i,
120
+ ];
121
+ for (let i = 0; i < lines.length; i++) {
122
+ const line = lines[i];
123
+ for (const pattern of routerDefPatterns) {
124
+ const match = line.match(pattern);
125
+ if (match) {
126
+ const name = match[1].replace(/Router$/i, '').toLowerCase();
127
+ // Look ahead to find procedures in this router
128
+ const procedures = [];
129
+ let isProtected = false;
130
+ let defaultMiddleware;
131
+ // Check if router name suggests admin protection
132
+ if (/admin/i.test(name)) {
133
+ isProtected = true;
134
+ defaultMiddleware = 'adminProcedure';
135
+ }
136
+ // Scan the router body for procedures
137
+ let braceDepth = 0;
138
+ let inRouter = false;
139
+ for (let j = i; j < Math.min(i + 100, lines.length); j++) {
140
+ const routerLine = lines[j];
141
+ if (routerLine.includes('{')) {
142
+ braceDepth += (routerLine.match(/\{/g) || []).length;
143
+ inRouter = true;
144
+ }
145
+ if (routerLine.includes('}')) {
146
+ braceDepth -= (routerLine.match(/\}/g) || []).length;
147
+ }
148
+ if (inRouter && braceDepth === 0)
149
+ break;
150
+ // Look for procedure definitions
151
+ const procMatch = routerLine.match(/(\w+)\s*:\s*(\w+Procedure)\./i);
152
+ if (procMatch) {
153
+ procedures.push(procMatch[1]);
154
+ const middlewareName = procMatch[2];
155
+ const middleware = middlewares.get(middlewareName);
156
+ if (middleware && (middleware.type === 'admin' || middleware.type === 'authenticated')) {
157
+ isProtected = true;
158
+ }
159
+ }
160
+ // Check for admin/protected procedure usage
161
+ if (ADMIN_MIDDLEWARE_PATTERNS.some(p => p.test(routerLine))) {
162
+ isProtected = true;
163
+ }
164
+ else if (AUTH_MIDDLEWARE_PATTERNS.some(p => p.test(routerLine))) {
165
+ isProtected = true;
166
+ }
167
+ }
168
+ routers.push({
169
+ name,
170
+ file: filePath,
171
+ procedures,
172
+ defaultMiddleware,
173
+ isProtected,
174
+ });
175
+ }
176
+ }
177
+ }
178
+ return routers;
179
+ }
180
+ /**
181
+ * Analyze tRPC routers across all files
182
+ */
183
+ function analyzeTRPCRouters(files) {
184
+ const context = {
185
+ routers: new Map(),
186
+ procedures: new Map(),
187
+ middlewares: new Map(),
188
+ hasTRPC: false,
189
+ };
190
+ // First pass: detect if tRPC is used
191
+ for (const file of files) {
192
+ if (detectTRPCUsage(file.content)) {
193
+ context.hasTRPC = true;
194
+ break;
195
+ }
196
+ }
197
+ if (!context.hasTRPC) {
198
+ return context;
199
+ }
200
+ // Second pass: extract middlewares
201
+ for (const file of files) {
202
+ const middlewares = extractMiddlewares(file.content, file.path);
203
+ for (const middleware of middlewares) {
204
+ context.middlewares.set(middleware.name, middleware);
205
+ }
206
+ }
207
+ // Third pass: extract routers
208
+ for (const file of files) {
209
+ const routers = extractRouters(file.content, file.path, context.middlewares);
210
+ for (const router of routers) {
211
+ context.routers.set(router.name, router);
212
+ // Add procedures to the procedures map
213
+ for (const procName of router.procedures) {
214
+ context.procedures.set(`${router.name}.${procName}`, {
215
+ name: procName,
216
+ router: router.name,
217
+ hasAuthMiddleware: router.isProtected,
218
+ middlewareType: router.isProtected ? 'authenticated' : 'public',
219
+ definedIn: router.file,
220
+ });
221
+ }
222
+ }
223
+ }
224
+ return context;
225
+ }
226
+ /**
227
+ * Check if a tRPC procedure is protected by middleware
228
+ */
229
+ function isProcedureProtected(context, routerName, procedureName) {
230
+ // Check if the router itself is protected
231
+ const router = context.routers.get(routerName.toLowerCase());
232
+ if (router?.isProtected) {
233
+ return true;
234
+ }
235
+ // Check specific procedure if provided
236
+ if (procedureName) {
237
+ const procedure = context.procedures.get(`${routerName.toLowerCase()}.${procedureName}`);
238
+ if (procedure?.hasAuthMiddleware) {
239
+ return true;
240
+ }
241
+ }
242
+ // Check if router name suggests admin protection
243
+ if (/admin/i.test(routerName)) {
244
+ return true;
245
+ }
246
+ return false;
247
+ }
248
+ /**
249
+ * Parse a tRPC client call to extract router and procedure names
250
+ * e.g., trpc.admin.getUsers.useQuery() -> { router: 'admin', procedure: 'getUsers' }
251
+ */
252
+ function parseTRPCCall(lineContent) {
253
+ // Pattern: trpc.routerName.procedureName
254
+ const patterns = [
255
+ /trpc\.(\w+)\.(\w+)\./i,
256
+ /api\.(\w+)\.(\w+)\./i,
257
+ /client\.(\w+)\.(\w+)\./i,
258
+ ];
259
+ for (const pattern of patterns) {
260
+ const match = lineContent.match(pattern);
261
+ if (match) {
262
+ return {
263
+ router: match[1],
264
+ procedure: match[2],
265
+ };
266
+ }
267
+ }
268
+ return null;
269
+ }
270
+ /**
271
+ * Check if a line contains a tRPC client call
272
+ */
273
+ function isTRPCClientCall(lineContent) {
274
+ const patterns = [
275
+ /trpc\.\w+\.\w+\.(useQuery|useMutation|useInfiniteQuery)/i,
276
+ /api\.\w+\.\w+\.(useQuery|useMutation|useInfiniteQuery)/i,
277
+ /trpc\.\w+\.\w+\.query\(/i,
278
+ /trpc\.\w+\.\w+\.mutate\(/i,
279
+ ];
280
+ return patterns.some(p => p.test(lineContent));
281
+ }
282
+ /**
283
+ * Get a summary of tRPC context for logging
284
+ */
285
+ function getTRPCSummary(context) {
286
+ if (!context.hasTRPC) {
287
+ return 'No tRPC detected';
288
+ }
289
+ const parts = [];
290
+ parts.push(`tRPC detected: ${context.routers.size} routers, ${context.procedures.size} procedures`);
291
+ const protectedRouters = Array.from(context.routers.values()).filter(r => r.isProtected);
292
+ if (protectedRouters.length > 0) {
293
+ parts.push(`Protected routers: ${protectedRouters.map(r => r.name).join(', ')}`);
294
+ }
295
+ return parts.join('; ');
296
+ }
297
+ //# sourceMappingURL=trpc-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trpc-analyzer.js","sourceRoot":"","sources":["../../src/utils/trpc-analyzer.ts"],"names":[],"mappings":"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"}