@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.
- package/dist/formatters/cli-terminal.d.ts +27 -0
- package/dist/formatters/cli-terminal.d.ts.map +1 -0
- package/dist/formatters/cli-terminal.js +412 -0
- package/dist/formatters/cli-terminal.js.map +1 -0
- package/dist/formatters/github-comment.d.ts +41 -0
- package/dist/formatters/github-comment.d.ts.map +1 -0
- package/dist/formatters/github-comment.js +306 -0
- package/dist/formatters/github-comment.js.map +1 -0
- package/dist/formatters/grouping.d.ts +52 -0
- package/dist/formatters/grouping.d.ts.map +1 -0
- package/dist/formatters/grouping.js +152 -0
- package/dist/formatters/grouping.js.map +1 -0
- package/dist/formatters/index.d.ts +9 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +35 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/vscode-diagnostic.d.ts +103 -0
- package/dist/formatters/vscode-diagnostic.d.ts.map +1 -0
- package/dist/formatters/vscode-diagnostic.js +151 -0
- package/dist/formatters/vscode-diagnostic.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +648 -0
- package/dist/index.js.map +1 -0
- package/dist/layer1/comments.d.ts +8 -0
- package/dist/layer1/comments.d.ts.map +1 -0
- package/dist/layer1/comments.js +203 -0
- package/dist/layer1/comments.js.map +1 -0
- package/dist/layer1/config-audit.d.ts +8 -0
- package/dist/layer1/config-audit.d.ts.map +1 -0
- package/dist/layer1/config-audit.js +252 -0
- package/dist/layer1/config-audit.js.map +1 -0
- package/dist/layer1/entropy.d.ts +8 -0
- package/dist/layer1/entropy.d.ts.map +1 -0
- package/dist/layer1/entropy.js +500 -0
- package/dist/layer1/entropy.js.map +1 -0
- package/dist/layer1/file-flags.d.ts +7 -0
- package/dist/layer1/file-flags.d.ts.map +1 -0
- package/dist/layer1/file-flags.js +112 -0
- package/dist/layer1/file-flags.js.map +1 -0
- package/dist/layer1/index.d.ts +36 -0
- package/dist/layer1/index.d.ts.map +1 -0
- package/dist/layer1/index.js +132 -0
- package/dist/layer1/index.js.map +1 -0
- package/dist/layer1/patterns.d.ts +8 -0
- package/dist/layer1/patterns.d.ts.map +1 -0
- package/dist/layer1/patterns.js +482 -0
- package/dist/layer1/patterns.js.map +1 -0
- package/dist/layer1/urls.d.ts +8 -0
- package/dist/layer1/urls.d.ts.map +1 -0
- package/dist/layer1/urls.js +296 -0
- package/dist/layer1/urls.js.map +1 -0
- package/dist/layer1/weak-crypto.d.ts +7 -0
- package/dist/layer1/weak-crypto.d.ts.map +1 -0
- package/dist/layer1/weak-crypto.js +291 -0
- package/dist/layer1/weak-crypto.js.map +1 -0
- package/dist/layer2/ai-agent-tools.d.ts +19 -0
- package/dist/layer2/ai-agent-tools.d.ts.map +1 -0
- package/dist/layer2/ai-agent-tools.js +528 -0
- package/dist/layer2/ai-agent-tools.js.map +1 -0
- package/dist/layer2/ai-endpoint-protection.d.ts +36 -0
- package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -0
- package/dist/layer2/ai-endpoint-protection.js +332 -0
- package/dist/layer2/ai-endpoint-protection.js.map +1 -0
- package/dist/layer2/ai-execution-sinks.d.ts +18 -0
- package/dist/layer2/ai-execution-sinks.d.ts.map +1 -0
- package/dist/layer2/ai-execution-sinks.js +496 -0
- package/dist/layer2/ai-execution-sinks.js.map +1 -0
- package/dist/layer2/ai-fingerprinting.d.ts +7 -0
- package/dist/layer2/ai-fingerprinting.d.ts.map +1 -0
- package/dist/layer2/ai-fingerprinting.js +654 -0
- package/dist/layer2/ai-fingerprinting.js.map +1 -0
- package/dist/layer2/ai-prompt-hygiene.d.ts +19 -0
- package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -0
- package/dist/layer2/ai-prompt-hygiene.js +356 -0
- package/dist/layer2/ai-prompt-hygiene.js.map +1 -0
- package/dist/layer2/ai-rag-safety.d.ts +21 -0
- package/dist/layer2/ai-rag-safety.d.ts.map +1 -0
- package/dist/layer2/ai-rag-safety.js +459 -0
- package/dist/layer2/ai-rag-safety.js.map +1 -0
- package/dist/layer2/ai-schema-validation.d.ts +25 -0
- package/dist/layer2/ai-schema-validation.d.ts.map +1 -0
- package/dist/layer2/ai-schema-validation.js +375 -0
- package/dist/layer2/ai-schema-validation.js.map +1 -0
- package/dist/layer2/auth-antipatterns.d.ts +20 -0
- package/dist/layer2/auth-antipatterns.d.ts.map +1 -0
- package/dist/layer2/auth-antipatterns.js +333 -0
- package/dist/layer2/auth-antipatterns.js.map +1 -0
- package/dist/layer2/byok-patterns.d.ts +12 -0
- package/dist/layer2/byok-patterns.d.ts.map +1 -0
- package/dist/layer2/byok-patterns.js +299 -0
- package/dist/layer2/byok-patterns.js.map +1 -0
- package/dist/layer2/dangerous-functions.d.ts +7 -0
- package/dist/layer2/dangerous-functions.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions.js +1375 -0
- package/dist/layer2/dangerous-functions.js.map +1 -0
- package/dist/layer2/data-exposure.d.ts +16 -0
- package/dist/layer2/data-exposure.d.ts.map +1 -0
- package/dist/layer2/data-exposure.js +279 -0
- package/dist/layer2/data-exposure.js.map +1 -0
- package/dist/layer2/framework-checks.d.ts +7 -0
- package/dist/layer2/framework-checks.d.ts.map +1 -0
- package/dist/layer2/framework-checks.js +388 -0
- package/dist/layer2/framework-checks.js.map +1 -0
- package/dist/layer2/index.d.ts +58 -0
- package/dist/layer2/index.d.ts.map +1 -0
- package/dist/layer2/index.js +380 -0
- package/dist/layer2/index.js.map +1 -0
- package/dist/layer2/logic-gates.d.ts +7 -0
- package/dist/layer2/logic-gates.d.ts.map +1 -0
- package/dist/layer2/logic-gates.js +182 -0
- package/dist/layer2/logic-gates.js.map +1 -0
- package/dist/layer2/risky-imports.d.ts +7 -0
- package/dist/layer2/risky-imports.d.ts.map +1 -0
- package/dist/layer2/risky-imports.js +161 -0
- package/dist/layer2/risky-imports.js.map +1 -0
- package/dist/layer2/variables.d.ts +8 -0
- package/dist/layer2/variables.d.ts.map +1 -0
- package/dist/layer2/variables.js +152 -0
- package/dist/layer2/variables.js.map +1 -0
- package/dist/layer3/anthropic.d.ts +83 -0
- package/dist/layer3/anthropic.d.ts.map +1 -0
- package/dist/layer3/anthropic.js +1745 -0
- package/dist/layer3/anthropic.js.map +1 -0
- package/dist/layer3/index.d.ts +24 -0
- package/dist/layer3/index.d.ts.map +1 -0
- package/dist/layer3/index.js +119 -0
- package/dist/layer3/index.js.map +1 -0
- package/dist/layer3/openai.d.ts +25 -0
- package/dist/layer3/openai.d.ts.map +1 -0
- package/dist/layer3/openai.js +238 -0
- package/dist/layer3/openai.js.map +1 -0
- package/dist/layer3/package-check.d.ts +63 -0
- package/dist/layer3/package-check.d.ts.map +1 -0
- package/dist/layer3/package-check.js +508 -0
- package/dist/layer3/package-check.js.map +1 -0
- package/dist/modes/incremental.d.ts +66 -0
- package/dist/modes/incremental.d.ts.map +1 -0
- package/dist/modes/incremental.js +200 -0
- package/dist/modes/incremental.js.map +1 -0
- package/dist/tiers.d.ts +125 -0
- package/dist/tiers.d.ts.map +1 -0
- package/dist/tiers.js +234 -0
- package/dist/tiers.js.map +1 -0
- package/dist/types.d.ts +175 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +50 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/auth-helper-detector.d.ts +56 -0
- package/dist/utils/auth-helper-detector.d.ts.map +1 -0
- package/dist/utils/auth-helper-detector.js +360 -0
- package/dist/utils/auth-helper-detector.js.map +1 -0
- package/dist/utils/context-helpers.d.ts +96 -0
- package/dist/utils/context-helpers.d.ts.map +1 -0
- package/dist/utils/context-helpers.js +493 -0
- package/dist/utils/context-helpers.js.map +1 -0
- package/dist/utils/diff-detector.d.ts +53 -0
- package/dist/utils/diff-detector.d.ts.map +1 -0
- package/dist/utils/diff-detector.js +104 -0
- package/dist/utils/diff-detector.js.map +1 -0
- package/dist/utils/diff-parser.d.ts +80 -0
- package/dist/utils/diff-parser.d.ts.map +1 -0
- package/dist/utils/diff-parser.js +202 -0
- package/dist/utils/diff-parser.js.map +1 -0
- package/dist/utils/imported-auth-detector.d.ts +37 -0
- package/dist/utils/imported-auth-detector.d.ts.map +1 -0
- package/dist/utils/imported-auth-detector.js +251 -0
- package/dist/utils/imported-auth-detector.js.map +1 -0
- package/dist/utils/middleware-detector.d.ts +55 -0
- package/dist/utils/middleware-detector.d.ts.map +1 -0
- package/dist/utils/middleware-detector.js +260 -0
- package/dist/utils/middleware-detector.js.map +1 -0
- package/dist/utils/oauth-flow-detector.d.ts +41 -0
- package/dist/utils/oauth-flow-detector.d.ts.map +1 -0
- package/dist/utils/oauth-flow-detector.js +202 -0
- package/dist/utils/oauth-flow-detector.js.map +1 -0
- package/dist/utils/path-exclusions.d.ts +55 -0
- package/dist/utils/path-exclusions.d.ts.map +1 -0
- package/dist/utils/path-exclusions.js +222 -0
- package/dist/utils/path-exclusions.js.map +1 -0
- package/dist/utils/project-context-builder.d.ts +119 -0
- package/dist/utils/project-context-builder.d.ts.map +1 -0
- package/dist/utils/project-context-builder.js +534 -0
- package/dist/utils/project-context-builder.js.map +1 -0
- package/dist/utils/registry-clients.d.ts +93 -0
- package/dist/utils/registry-clients.d.ts.map +1 -0
- package/dist/utils/registry-clients.js +273 -0
- package/dist/utils/registry-clients.js.map +1 -0
- package/dist/utils/trpc-analyzer.d.ts +78 -0
- package/dist/utils/trpc-analyzer.d.ts.map +1 -0
- package/dist/utils/trpc-analyzer.js +297 -0
- package/dist/utils/trpc-analyzer.js.map +1 -0
- package/package.json +45 -0
- package/src/__tests__/benchmark/fixtures/false-positives.ts +227 -0
- package/src/__tests__/benchmark/fixtures/index.ts +68 -0
- package/src/__tests__/benchmark/fixtures/layer1/config-audit.ts +364 -0
- package/src/__tests__/benchmark/fixtures/layer1/hardcoded-secrets.ts +173 -0
- package/src/__tests__/benchmark/fixtures/layer1/high-entropy.ts +234 -0
- package/src/__tests__/benchmark/fixtures/layer1/index.ts +31 -0
- package/src/__tests__/benchmark/fixtures/layer1/sensitive-urls.ts +90 -0
- package/src/__tests__/benchmark/fixtures/layer1/weak-crypto.ts +197 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-agent-tools.ts +170 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-endpoint-protection.ts +418 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +189 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-fingerprinting.ts +316 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +178 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +184 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-schema-validation.ts +434 -0
- package/src/__tests__/benchmark/fixtures/layer2/auth-antipatterns.ts +159 -0
- package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +112 -0
- package/src/__tests__/benchmark/fixtures/layer2/dangerous-functions.ts +246 -0
- package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +168 -0
- package/src/__tests__/benchmark/fixtures/layer2/framework-checks.ts +346 -0
- package/src/__tests__/benchmark/fixtures/layer2/index.ts +67 -0
- package/src/__tests__/benchmark/fixtures/layer2/injection-vulnerabilities.ts +239 -0
- package/src/__tests__/benchmark/fixtures/layer2/logic-gates.ts +246 -0
- package/src/__tests__/benchmark/fixtures/layer2/risky-imports.ts +231 -0
- package/src/__tests__/benchmark/fixtures/layer2/variables.ts +167 -0
- package/src/__tests__/benchmark/index.ts +29 -0
- package/src/__tests__/benchmark/run-benchmark.ts +144 -0
- package/src/__tests__/benchmark/run-depth-validation.ts +206 -0
- package/src/__tests__/benchmark/run-real-world-test.ts +243 -0
- package/src/__tests__/benchmark/security-benchmark-script.ts +1737 -0
- package/src/__tests__/benchmark/tier-integration-script.ts +177 -0
- package/src/__tests__/benchmark/types.ts +144 -0
- package/src/__tests__/benchmark/utils/test-runner.ts +475 -0
- package/src/__tests__/regression/known-false-positives.test.ts +467 -0
- package/src/__tests__/snapshots/__snapshots__/scan-depth.test.ts.snap +178 -0
- package/src/__tests__/snapshots/scan-depth.test.ts +258 -0
- package/src/__tests__/validation/analyze-results.ts +542 -0
- package/src/__tests__/validation/extract-for-triage.ts +146 -0
- package/src/__tests__/validation/fp-deep-analysis.ts +327 -0
- package/src/__tests__/validation/run-validation.ts +364 -0
- package/src/__tests__/validation/triage-template.md +132 -0
- package/src/formatters/cli-terminal.ts +446 -0
- package/src/formatters/github-comment.ts +382 -0
- package/src/formatters/grouping.ts +190 -0
- package/src/formatters/index.ts +47 -0
- package/src/formatters/vscode-diagnostic.ts +243 -0
- package/src/index.ts +823 -0
- package/src/layer1/comments.ts +218 -0
- package/src/layer1/config-audit.ts +289 -0
- package/src/layer1/entropy.ts +583 -0
- package/src/layer1/file-flags.ts +127 -0
- package/src/layer1/index.ts +181 -0
- package/src/layer1/patterns.ts +516 -0
- package/src/layer1/urls.ts +334 -0
- package/src/layer1/weak-crypto.ts +328 -0
- package/src/layer2/ai-agent-tools.ts +601 -0
- package/src/layer2/ai-endpoint-protection.ts +387 -0
- package/src/layer2/ai-execution-sinks.ts +580 -0
- package/src/layer2/ai-fingerprinting.ts +758 -0
- package/src/layer2/ai-prompt-hygiene.ts +411 -0
- package/src/layer2/ai-rag-safety.ts +511 -0
- package/src/layer2/ai-schema-validation.ts +421 -0
- package/src/layer2/auth-antipatterns.ts +394 -0
- package/src/layer2/byok-patterns.ts +336 -0
- package/src/layer2/dangerous-functions.ts +1563 -0
- package/src/layer2/data-exposure.ts +315 -0
- package/src/layer2/framework-checks.ts +433 -0
- package/src/layer2/index.ts +473 -0
- package/src/layer2/logic-gates.ts +206 -0
- package/src/layer2/risky-imports.ts +186 -0
- package/src/layer2/variables.ts +166 -0
- package/src/layer3/anthropic.ts +2030 -0
- package/src/layer3/index.ts +130 -0
- package/src/layer3/package-check.ts +604 -0
- package/src/modes/incremental.ts +293 -0
- package/src/tiers.ts +318 -0
- package/src/types.ts +284 -0
- package/src/utils/auth-helper-detector.ts +443 -0
- package/src/utils/context-helpers.ts +535 -0
- package/src/utils/diff-detector.ts +135 -0
- package/src/utils/diff-parser.ts +272 -0
- package/src/utils/imported-auth-detector.ts +320 -0
- package/src/utils/middleware-detector.ts +333 -0
- package/src/utils/oauth-flow-detector.ts +246 -0
- package/src/utils/path-exclusions.ts +266 -0
- package/src/utils/project-context-builder.ts +707 -0
- package/src/utils/registry-clients.ts +351 -0
- 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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"}
|