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