@fourteensystems/shipguard 0.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.
- package/README.md +213 -0
- package/bin/shipguard.mjs +2 -0
- package/dist/cli/commands/baseline.d.ts +7 -0
- package/dist/cli/commands/baseline.d.ts.map +1 -0
- package/dist/cli/commands/baseline.js +22 -0
- package/dist/cli/commands/baseline.js.map +1 -0
- package/dist/cli/commands/ci.d.ts +13 -0
- package/dist/cli/commands/ci.d.ts.map +1 -0
- package/dist/cli/commands/ci.js +91 -0
- package/dist/cli/commands/ci.js.map +1 -0
- package/dist/cli/commands/explain.d.ts +2 -0
- package/dist/cli/commands/explain.d.ts.map +1 -0
- package/dist/cli/commands/explain.js +20 -0
- package/dist/cli/commands/explain.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +91 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/rules.d.ts +2 -0
- package/dist/cli/commands/rules.d.ts.map +1 -0
- package/dist/cli/commands/rules.js +13 -0
- package/dist/cli/commands/rules.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +10 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +55 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/waive.d.ts +8 -0
- package/dist/cli/commands/waive.d.ts.map +1 -0
- package/dist/cli/commands/waive.js +34 -0
- package/dist/cli/commands/waive.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +63 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/engine/baseline.d.ts +11 -0
- package/dist/engine/baseline.d.ts.map +1 -0
- package/dist/engine/baseline.js +39 -0
- package/dist/engine/baseline.js.map +1 -0
- package/dist/engine/config.d.ts +8 -0
- package/dist/engine/config.d.ts.map +1 -0
- package/dist/engine/config.js +130 -0
- package/dist/engine/config.js.map +1 -0
- package/dist/engine/extensions/load.d.ts +11 -0
- package/dist/engine/extensions/load.d.ts.map +1 -0
- package/dist/engine/extensions/load.js +26 -0
- package/dist/engine/extensions/load.js.map +1 -0
- package/dist/engine/extensions/registry.d.ts +5 -0
- package/dist/engine/extensions/registry.d.ts.map +1 -0
- package/dist/engine/extensions/registry.js +11 -0
- package/dist/engine/extensions/registry.js.map +1 -0
- package/dist/engine/extensions/types.d.ts +51 -0
- package/dist/engine/extensions/types.d.ts.map +1 -0
- package/dist/engine/extensions/types.js +2 -0
- package/dist/engine/extensions/types.js.map +1 -0
- package/dist/engine/report.d.ts +5 -0
- package/dist/engine/report.d.ts.map +1 -0
- package/dist/engine/report.js +88 -0
- package/dist/engine/report.js.map +1 -0
- package/dist/engine/run.d.ts +9 -0
- package/dist/engine/run.d.ts.map +1 -0
- package/dist/engine/run.js +101 -0
- package/dist/engine/run.js.map +1 -0
- package/dist/engine/sarif.d.ts +3 -0
- package/dist/engine/sarif.d.ts.map +1 -0
- package/dist/engine/sarif.js +58 -0
- package/dist/engine/sarif.js.map +1 -0
- package/dist/engine/score.d.ts +13 -0
- package/dist/engine/score.d.ts.map +1 -0
- package/dist/engine/score.js +97 -0
- package/dist/engine/score.js.map +1 -0
- package/dist/engine/types.d.ts +119 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +2 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/version.d.ts +5 -0
- package/dist/engine/version.d.ts.map +1 -0
- package/dist/engine/version.js +15 -0
- package/dist/engine/version.js.map +1 -0
- package/dist/engine/waivers.d.ts +9 -0
- package/dist/engine/waivers.d.ts.map +1 -0
- package/dist/engine/waivers.js +55 -0
- package/dist/engine/waivers.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/next/deps.d.ts +4 -0
- package/dist/next/deps.d.ts.map +1 -0
- package/dist/next/deps.js +102 -0
- package/dist/next/deps.js.map +1 -0
- package/dist/next/detect.d.ts +10 -0
- package/dist/next/detect.d.ts.map +1 -0
- package/dist/next/detect.js +57 -0
- package/dist/next/detect.js.map +1 -0
- package/dist/next/index.d.ts +5 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +41 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/middleware.d.ts +3 -0
- package/dist/next/middleware.d.ts.map +1 -0
- package/dist/next/middleware.js +33 -0
- package/dist/next/middleware.js.map +1 -0
- package/dist/next/routes.d.ts +5 -0
- package/dist/next/routes.d.ts.map +1 -0
- package/dist/next/routes.js +125 -0
- package/dist/next/routes.js.map +1 -0
- package/dist/next/server-actions.d.ts +4 -0
- package/dist/next/server-actions.d.ts.map +1 -0
- package/dist/next/server-actions.js +107 -0
- package/dist/next/server-actions.js.map +1 -0
- package/dist/next/trpc.d.ts +3 -0
- package/dist/next/trpc.d.ts.map +1 -0
- package/dist/next/trpc.js +339 -0
- package/dist/next/trpc.js.map +1 -0
- package/dist/next/types.d.ts +100 -0
- package/dist/next/types.d.ts.map +1 -0
- package/dist/next/types.js +2 -0
- package/dist/next/types.js.map +1 -0
- package/dist/rules/auth-boundary-missing.d.ts +5 -0
- package/dist/rules/auth-boundary-missing.d.ts.map +1 -0
- package/dist/rules/auth-boundary-missing.js +278 -0
- package/dist/rules/auth-boundary-missing.js.map +1 -0
- package/dist/rules/index.d.ts +12 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +41 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/rate-limit-missing.d.ts +5 -0
- package/dist/rules/rate-limit-missing.d.ts.map +1 -0
- package/dist/rules/rate-limit-missing.js +230 -0
- package/dist/rules/rate-limit-missing.js.map +1 -0
- package/dist/rules/tenancy-scope-missing.d.ts +5 -0
- package/dist/rules/tenancy-scope-missing.d.ts.map +1 -0
- package/dist/rules/tenancy-scope-missing.js +149 -0
- package/dist/rules/tenancy-scope-missing.js.map +1 -0
- package/dist/util/paths.d.ts +6 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +18 -0
- package/dist/util/paths.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
3
|
+
import fg from "fast-glob";
|
|
4
|
+
import { detectMutationSignals } from "./routes.js";
|
|
5
|
+
/** Known tRPC handler markers in the proxy route file */
|
|
6
|
+
const TRPC_PROXY_MARKERS = [
|
|
7
|
+
"fetchRequestHandler",
|
|
8
|
+
"createNextApiHandler",
|
|
9
|
+
"@trpc/server",
|
|
10
|
+
"trpcNext",
|
|
11
|
+
];
|
|
12
|
+
/** Procedure names that indicate authenticated access */
|
|
13
|
+
const PROTECTED_PROCEDURE_NAMES = [
|
|
14
|
+
"protectedProcedure",
|
|
15
|
+
"authedProcedure",
|
|
16
|
+
"adminProcedure",
|
|
17
|
+
"privateProcedure",
|
|
18
|
+
"authenticatedProcedure",
|
|
19
|
+
];
|
|
20
|
+
const EMPTY_INDEX = {
|
|
21
|
+
detected: false,
|
|
22
|
+
procedures: [],
|
|
23
|
+
mutationProcedures: [],
|
|
24
|
+
};
|
|
25
|
+
export async function buildTrpcIndex(rootDir, appDir, _excludeGlobs) {
|
|
26
|
+
// Stage 1: Find tRPC proxy route
|
|
27
|
+
const proxyFile = findTrpcProxy(rootDir, appDir);
|
|
28
|
+
if (!proxyFile)
|
|
29
|
+
return EMPTY_INDEX;
|
|
30
|
+
const proxySrc = readSource(rootDir, proxyFile);
|
|
31
|
+
if (!proxySrc)
|
|
32
|
+
return EMPTY_INDEX;
|
|
33
|
+
// Stage 2: Resolve root router file
|
|
34
|
+
const rootRouterFile = resolveRootRouter(proxySrc, proxyFile, rootDir);
|
|
35
|
+
if (!rootRouterFile) {
|
|
36
|
+
return { detected: true, proxyFile, procedures: [], mutationProcedures: [] };
|
|
37
|
+
}
|
|
38
|
+
// Stage 3: Extract procedures from root router and sub-routers
|
|
39
|
+
const procedures = extractAllProcedures(rootDir, rootRouterFile);
|
|
40
|
+
const mutationProcedures = procedures.filter((p) => p.procedureKind === "mutation");
|
|
41
|
+
return {
|
|
42
|
+
detected: true,
|
|
43
|
+
proxyFile,
|
|
44
|
+
rootRouterFile,
|
|
45
|
+
procedures,
|
|
46
|
+
mutationProcedures,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Stage 1: Find tRPC proxy route
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
function findTrpcProxy(rootDir, appDir) {
|
|
53
|
+
// Look for App Router tRPC proxy: app/api/trpc/[trpc]/route.ts (or similar)
|
|
54
|
+
const candidates = fg.globSync(`${appDir}/**/api/trpc/**/route.{ts,js,tsx,jsx}`, { cwd: rootDir, ignore: ["**/node_modules/**"] });
|
|
55
|
+
for (const file of candidates) {
|
|
56
|
+
const src = readSource(rootDir, file);
|
|
57
|
+
if (!src)
|
|
58
|
+
continue;
|
|
59
|
+
if (TRPC_PROXY_MARKERS.some((m) => src.includes(m))) {
|
|
60
|
+
return file;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Stage 2: Resolve root router from proxy import
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
function resolveRootRouter(proxySrc, proxyFile, rootDir) {
|
|
69
|
+
// Pattern 1: import { appRouter } from '...'
|
|
70
|
+
// Pattern 2: import { someRouter as appRouter } from '...'
|
|
71
|
+
// Pattern 3: import appRouter from '...'
|
|
72
|
+
const importPatterns = [
|
|
73
|
+
/import\s+\{[^}]*appRouter[^}]*\}\s+from\s+['"]([^'"]+)['"]/,
|
|
74
|
+
/import\s+\{[^}]*\w+Router[^}]*\}\s+from\s+['"]([^'"]+)['"]/,
|
|
75
|
+
/import\s+(\w+Router)\s+from\s+['"]([^'"]+)['"]/,
|
|
76
|
+
];
|
|
77
|
+
for (const pattern of importPatterns) {
|
|
78
|
+
const match = pattern.exec(proxySrc);
|
|
79
|
+
if (match) {
|
|
80
|
+
// Last capture group is always the path
|
|
81
|
+
const importPath = match[match.length - 1] ?? match[1];
|
|
82
|
+
if (importPath) {
|
|
83
|
+
const resolved = resolveImportPath(proxyFile, importPath, rootDir);
|
|
84
|
+
if (resolved)
|
|
85
|
+
return resolved;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Pattern 4: router: appRouter — find the import that defines appRouter
|
|
90
|
+
const routerPropMatch = /router\s*:\s*(\w+)/.exec(proxySrc);
|
|
91
|
+
if (routerPropMatch) {
|
|
92
|
+
const routerName = routerPropMatch[1];
|
|
93
|
+
const importForRouter = new RegExp(`import\\s+\\{[^}]*\\b${routerName}\\b[^}]*\\}\\s+from\\s+['"]([^'"]+)['"]`);
|
|
94
|
+
const m = importForRouter.exec(proxySrc);
|
|
95
|
+
if (m?.[1]) {
|
|
96
|
+
const resolved = resolveImportPath(proxyFile, m[1], rootDir);
|
|
97
|
+
if (resolved)
|
|
98
|
+
return resolved;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// Stage 3: Extract procedures from router files
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
function extractAllProcedures(rootDir, rootRouterFile) {
|
|
107
|
+
const rootSrc = readSource(rootDir, rootRouterFile);
|
|
108
|
+
if (!rootSrc)
|
|
109
|
+
return [];
|
|
110
|
+
const procedures = [];
|
|
111
|
+
// Extract inline procedures from root router (e.g., healthcheck: publicProcedure.query(...))
|
|
112
|
+
const rootEntries = extractRouterEntries(rootSrc);
|
|
113
|
+
for (const entry of rootEntries) {
|
|
114
|
+
if (entry.type === "procedure") {
|
|
115
|
+
procedures.push(buildProcedure(entry.name, entry.name, rootRouterFile, entry, rootSrc));
|
|
116
|
+
}
|
|
117
|
+
else if (entry.type === "sub-router") {
|
|
118
|
+
// Resolve sub-router import and extract its procedures
|
|
119
|
+
const subRouterFile = resolveSubRouterImport(rootSrc, entry.importName, rootRouterFile, rootDir);
|
|
120
|
+
if (subRouterFile) {
|
|
121
|
+
const subSrc = readSource(rootDir, subRouterFile);
|
|
122
|
+
if (subSrc) {
|
|
123
|
+
const subEntries = extractRouterEntries(subSrc);
|
|
124
|
+
for (const sub of subEntries) {
|
|
125
|
+
if (sub.type === "procedure") {
|
|
126
|
+
procedures.push(buildProcedure(`${entry.name}.${sub.name}`, sub.name, subRouterFile, sub, subSrc));
|
|
127
|
+
}
|
|
128
|
+
// We don't follow nested sub-routers (one level only per spec)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return procedures;
|
|
135
|
+
}
|
|
136
|
+
function extractRouterEntries(src) {
|
|
137
|
+
const entries = [];
|
|
138
|
+
const lines = src.split("\n");
|
|
139
|
+
// Find the router({ ... }) block
|
|
140
|
+
// Match: router({ or createTRPCRouter({
|
|
141
|
+
const routerBlockStart = lines.findIndex((l) => /(?:router|createTRPCRouter)\s*\(\s*\{/.test(l));
|
|
142
|
+
if (routerBlockStart === -1)
|
|
143
|
+
return entries;
|
|
144
|
+
// Walk through lines inside the router block looking for entries
|
|
145
|
+
// Pattern: `name: someIdentifier` (sub-router) or `name: publicProcedure.query(...)` (procedure)
|
|
146
|
+
let braceDepth = 0;
|
|
147
|
+
let insideRouter = false;
|
|
148
|
+
for (let i = routerBlockStart; i < lines.length; i++) {
|
|
149
|
+
const line = lines[i];
|
|
150
|
+
// Track brace depth
|
|
151
|
+
for (const ch of line) {
|
|
152
|
+
if (ch === "{")
|
|
153
|
+
braceDepth++;
|
|
154
|
+
if (ch === "}")
|
|
155
|
+
braceDepth--;
|
|
156
|
+
}
|
|
157
|
+
// Start tracking after the opening brace of router({
|
|
158
|
+
if (i === routerBlockStart) {
|
|
159
|
+
insideRouter = true;
|
|
160
|
+
// The opening { might be on this line — it's already counted above
|
|
161
|
+
}
|
|
162
|
+
// Stop when we close the router block
|
|
163
|
+
if (insideRouter && braceDepth <= 0)
|
|
164
|
+
break;
|
|
165
|
+
// Only look at entries at the top level of the router object (depth ~2: router({ entry: ... }))
|
|
166
|
+
// Match: `identifier: something`
|
|
167
|
+
const entryMatch = /^\s*(\w+)\s*:\s*(.+)/.exec(line);
|
|
168
|
+
if (!entryMatch)
|
|
169
|
+
continue;
|
|
170
|
+
const name = entryMatch[1];
|
|
171
|
+
const value = entryMatch[2].trim();
|
|
172
|
+
// Check if it's a procedure definition
|
|
173
|
+
if (isProcedureLine(value)) {
|
|
174
|
+
// Gather the full procedure text (may span multiple lines until the closing)
|
|
175
|
+
const procSrc = gatherProcedureSource(lines, i);
|
|
176
|
+
entries.push({
|
|
177
|
+
name,
|
|
178
|
+
type: "procedure",
|
|
179
|
+
procedureType: classifyProcedureType(procSrc),
|
|
180
|
+
procedureKind: classifyProcedureKind(procSrc),
|
|
181
|
+
line: i + 1,
|
|
182
|
+
procedureSrc: procSrc,
|
|
183
|
+
importName: name,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// It's a sub-router reference (e.g., `post: postRouter` or `post: postRouter,`)
|
|
188
|
+
const identMatch = /^(\w+)/.exec(value);
|
|
189
|
+
if (identMatch) {
|
|
190
|
+
entries.push({
|
|
191
|
+
name,
|
|
192
|
+
type: "sub-router",
|
|
193
|
+
importName: identMatch[1],
|
|
194
|
+
line: i + 1,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return entries;
|
|
200
|
+
}
|
|
201
|
+
function isProcedureLine(value) {
|
|
202
|
+
// Matches: publicProcedure.query(...), protectedProcedure.input(...).mutation(...), etc.
|
|
203
|
+
return /(?:public|protected|authed|admin|private|authenticated)?[Pp]rocedure\b/.test(value);
|
|
204
|
+
}
|
|
205
|
+
function gatherProcedureSource(lines, startLine) {
|
|
206
|
+
// Collect lines from the entry start until we hit the next router entry
|
|
207
|
+
// or the closing of the router block.
|
|
208
|
+
// tRPC procedures are method chains that can span many lines:
|
|
209
|
+
// name: publicProcedure
|
|
210
|
+
// .input(z.object({...}))
|
|
211
|
+
// .mutation(async ({input}) => {
|
|
212
|
+
// ...
|
|
213
|
+
// }),
|
|
214
|
+
const collected = [lines[startLine]];
|
|
215
|
+
const entryIndent = lines[startLine].search(/\S/);
|
|
216
|
+
for (let i = startLine + 1; i < lines.length && i < startLine + 100; i++) {
|
|
217
|
+
const line = lines[i];
|
|
218
|
+
const trimmed = line.trimStart();
|
|
219
|
+
// Stop at closing of router block
|
|
220
|
+
if (trimmed.startsWith("});") || trimmed === "})")
|
|
221
|
+
break;
|
|
222
|
+
// Stop if we hit the next entry at the same indent level
|
|
223
|
+
// (a line like ` nextEntry: ...` at similar indentation)
|
|
224
|
+
const lineIndent = line.search(/\S/);
|
|
225
|
+
if (lineIndent >= 0 && lineIndent <= entryIndent && /^\s*\w+\s*:/.test(line)) {
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
collected.push(line);
|
|
229
|
+
// Stop after a trailing `),` at entry-level indentation (procedure chain ended)
|
|
230
|
+
if (trimmed === "),")
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
return collected.join("\n");
|
|
234
|
+
}
|
|
235
|
+
function classifyProcedureType(src) {
|
|
236
|
+
if (/\bpublicProcedure\b/.test(src))
|
|
237
|
+
return "public";
|
|
238
|
+
for (const name of PROTECTED_PROCEDURE_NAMES) {
|
|
239
|
+
if (src.includes(name))
|
|
240
|
+
return "protected";
|
|
241
|
+
}
|
|
242
|
+
// Bare `procedure` without prefix — could be either, mark unknown
|
|
243
|
+
if (/\bprocedure\b/.test(src) && !/Procedure\b/.test(src))
|
|
244
|
+
return "unknown";
|
|
245
|
+
return "unknown";
|
|
246
|
+
}
|
|
247
|
+
function classifyProcedureKind(src) {
|
|
248
|
+
if (/\.mutation\s*\(/.test(src))
|
|
249
|
+
return "mutation";
|
|
250
|
+
if (/\.query\s*\(/.test(src))
|
|
251
|
+
return "query";
|
|
252
|
+
if (/\.subscription\s*\(/.test(src))
|
|
253
|
+
return "subscription";
|
|
254
|
+
return "unknown";
|
|
255
|
+
}
|
|
256
|
+
function buildProcedure(fullName, _localName, file, entry, fileSrc) {
|
|
257
|
+
// Detect mutation signals from the procedure's source (handler body)
|
|
258
|
+
const procSrc = entry.procedureSrc ?? "";
|
|
259
|
+
const signals = detectMutationSignals(procSrc);
|
|
260
|
+
// If the procedure is a mutation, that's also mutation evidence
|
|
261
|
+
if (entry.procedureKind === "mutation" && !signals.hasMutationEvidence) {
|
|
262
|
+
signals.hasMutationEvidence = true;
|
|
263
|
+
signals.mutationDetails.push("tRPC .mutation() endpoint");
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
kind: "trpc-procedure",
|
|
267
|
+
name: fullName,
|
|
268
|
+
file,
|
|
269
|
+
line: entry.line,
|
|
270
|
+
procedureType: entry.procedureType ?? "unknown",
|
|
271
|
+
procedureKind: entry.procedureKind ?? "unknown",
|
|
272
|
+
signals,
|
|
273
|
+
routerName: entry.importName,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
function resolveSubRouterImport(routerSrc, importName, routerFile, rootDir) {
|
|
277
|
+
// Find the import statement that defines this identifier
|
|
278
|
+
const importPattern = new RegExp(`import\\s+\\{[^}]*\\b${escapeRegex(importName)}\\b[^}]*\\}\\s+from\\s+['"]([^'"]+)['"]`);
|
|
279
|
+
const match = importPattern.exec(routerSrc);
|
|
280
|
+
if (match?.[1]) {
|
|
281
|
+
return resolveImportPath(routerFile, match[1], rootDir);
|
|
282
|
+
}
|
|
283
|
+
// Default import: import postRouter from './post'
|
|
284
|
+
const defaultImport = new RegExp(`import\\s+${escapeRegex(importName)}\\s+from\\s+['"]([^'"]+)['"]`);
|
|
285
|
+
const m2 = defaultImport.exec(routerSrc);
|
|
286
|
+
if (m2?.[1]) {
|
|
287
|
+
return resolveImportPath(routerFile, m2[1], rootDir);
|
|
288
|
+
}
|
|
289
|
+
return undefined;
|
|
290
|
+
}
|
|
291
|
+
// ---------------------------------------------------------------------------
|
|
292
|
+
// Import resolution
|
|
293
|
+
// ---------------------------------------------------------------------------
|
|
294
|
+
function resolveImportPath(fromFile, importPath, rootDir) {
|
|
295
|
+
let resolved;
|
|
296
|
+
if (importPath.startsWith("~/") || importPath.startsWith("@/")) {
|
|
297
|
+
// T3 convention: ~/ and @/ map to src/
|
|
298
|
+
const stripped = importPath.slice(2);
|
|
299
|
+
resolved = path.join("src", stripped);
|
|
300
|
+
}
|
|
301
|
+
else if (importPath.startsWith(".")) {
|
|
302
|
+
// Relative import
|
|
303
|
+
const fromDir = path.dirname(fromFile);
|
|
304
|
+
resolved = path.join(fromDir, importPath);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
// Bare specifier (npm package) — can't resolve
|
|
308
|
+
return undefined;
|
|
309
|
+
}
|
|
310
|
+
// Try extensions
|
|
311
|
+
const extensions = [".ts", ".tsx", ".js", ".jsx"];
|
|
312
|
+
const candidates = [
|
|
313
|
+
resolved,
|
|
314
|
+
...extensions.map((ext) => resolved + ext),
|
|
315
|
+
...extensions.map((ext) => path.join(resolved, "index" + ext)),
|
|
316
|
+
...extensions.map((ext) => path.join(resolved, "_app" + ext)),
|
|
317
|
+
];
|
|
318
|
+
for (const candidate of candidates) {
|
|
319
|
+
if (existsSync(path.join(rootDir, candidate))) {
|
|
320
|
+
return candidate;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return undefined;
|
|
324
|
+
}
|
|
325
|
+
// ---------------------------------------------------------------------------
|
|
326
|
+
// Utilities
|
|
327
|
+
// ---------------------------------------------------------------------------
|
|
328
|
+
function readSource(rootDir, file) {
|
|
329
|
+
try {
|
|
330
|
+
return readFileSync(path.join(rootDir, file), "utf8");
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
function escapeRegex(str) {
|
|
337
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=trpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trpc.js","sourceRoot":"","sources":["../../src/next/trpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export type Framework = "next-app-router";
|
|
2
|
+
export type Severity = "low" | "med" | "high" | "critical";
|
|
3
|
+
export type Confidence = "low" | "med" | "high";
|
|
4
|
+
export type RouteKind = "route-handler" | "server-action";
|
|
5
|
+
export interface NextRoute {
|
|
6
|
+
kind: "route-handler";
|
|
7
|
+
file: string;
|
|
8
|
+
method?: string;
|
|
9
|
+
pathname?: string;
|
|
10
|
+
isApi: boolean;
|
|
11
|
+
isPublic: boolean;
|
|
12
|
+
signals: MutationSignals;
|
|
13
|
+
}
|
|
14
|
+
export interface NextServerAction {
|
|
15
|
+
kind: "server-action";
|
|
16
|
+
file: string;
|
|
17
|
+
exportName?: string;
|
|
18
|
+
signals: MutationSignals;
|
|
19
|
+
}
|
|
20
|
+
export interface MutationSignals {
|
|
21
|
+
hasMutationEvidence: boolean;
|
|
22
|
+
hasDbWriteEvidence: boolean;
|
|
23
|
+
hasStripeWriteEvidence: boolean;
|
|
24
|
+
mutationDetails: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface NextMiddlewareIndex {
|
|
27
|
+
file?: string;
|
|
28
|
+
authLikely: boolean;
|
|
29
|
+
rateLimitLikely: boolean;
|
|
30
|
+
matcherPatterns: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface NextDepsIndex {
|
|
33
|
+
hasNextAuth: boolean;
|
|
34
|
+
hasClerk: boolean;
|
|
35
|
+
hasSupabase: boolean;
|
|
36
|
+
hasKinde: boolean;
|
|
37
|
+
hasWorkOS: boolean;
|
|
38
|
+
hasBetterAuth: boolean;
|
|
39
|
+
hasLucia: boolean;
|
|
40
|
+
hasAuth0: boolean;
|
|
41
|
+
hasIronSession: boolean;
|
|
42
|
+
hasFirebaseAuth: boolean;
|
|
43
|
+
hasUpstashRatelimit: boolean;
|
|
44
|
+
hasArcjet: boolean;
|
|
45
|
+
hasUnkey: boolean;
|
|
46
|
+
hasPrisma: boolean;
|
|
47
|
+
hasDrizzle: boolean;
|
|
48
|
+
hasTrpc: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface NextHints {
|
|
51
|
+
auth: {
|
|
52
|
+
functions: string[];
|
|
53
|
+
middlewareFiles: string[];
|
|
54
|
+
allowlistPaths: string[];
|
|
55
|
+
};
|
|
56
|
+
rateLimit: {
|
|
57
|
+
wrappers: string[];
|
|
58
|
+
allowlistPaths: string[];
|
|
59
|
+
};
|
|
60
|
+
tenancy: {
|
|
61
|
+
orgFieldNames: string[];
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export interface TrpcProcedure {
|
|
65
|
+
kind: "trpc-procedure";
|
|
66
|
+
/** Dotted name, e.g. "post.add" */
|
|
67
|
+
name: string;
|
|
68
|
+
/** Router file where procedure is defined */
|
|
69
|
+
file: string;
|
|
70
|
+
line?: number;
|
|
71
|
+
procedureType: "public" | "protected" | "unknown";
|
|
72
|
+
procedureKind: "mutation" | "query" | "subscription" | "unknown";
|
|
73
|
+
signals: MutationSignals;
|
|
74
|
+
routerName?: string;
|
|
75
|
+
}
|
|
76
|
+
export interface TrpcIndex {
|
|
77
|
+
detected: boolean;
|
|
78
|
+
proxyFile?: string;
|
|
79
|
+
rootRouterFile?: string;
|
|
80
|
+
procedures: TrpcProcedure[];
|
|
81
|
+
mutationProcedures: TrpcProcedure[];
|
|
82
|
+
}
|
|
83
|
+
export interface NextIndex {
|
|
84
|
+
version: 1;
|
|
85
|
+
framework: Framework;
|
|
86
|
+
rootDir: string;
|
|
87
|
+
deps: NextDepsIndex;
|
|
88
|
+
hints: NextHints;
|
|
89
|
+
middleware: NextMiddlewareIndex;
|
|
90
|
+
routes: {
|
|
91
|
+
all: NextRoute[];
|
|
92
|
+
mutationRoutes: NextRoute[];
|
|
93
|
+
};
|
|
94
|
+
serverActions: {
|
|
95
|
+
all: NextServerAction[];
|
|
96
|
+
mutationActions: NextServerAction[];
|
|
97
|
+
};
|
|
98
|
+
trpc: TrpcIndex;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/next/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/next/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { NextIndex } from "../next/types.js";
|
|
2
|
+
import type { Finding, ShipguardConfig } from "../engine/types.js";
|
|
3
|
+
export declare const RULE_ID = "AUTH-BOUNDARY-MISSING";
|
|
4
|
+
export declare function run(index: NextIndex, config: ShipguardConfig): Finding[];
|
|
5
|
+
//# sourceMappingURL=auth-boundary-missing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-boundary-missing.d.ts","sourceRoot":"","sources":["../../src/rules/auth-boundary-missing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAA+B,MAAM,kBAAkB,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAInE,eAAO,MAAM,OAAO,0BAA0B,CAAC;AAE/C,wBAAgB,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,EAAE,CAqFxE"}
|