@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,536 @@
1
+ import path from "node:path";
2
+ import { readFileSync } from "node:fs";
3
+ import ts from "typescript";
4
+ import { resolveImportPath, followReExport } from "../util/resolve.js";
5
+ import { extractHofWrapperChain, findImportSource } from "../util/hof.js";
6
+ // ---------------------------------------------------------------------------
7
+ // Public API
8
+ // ---------------------------------------------------------------------------
9
+ export function buildWrapperIndex(routes, rootDir, resolveOpts, authFunctions, rateLimitWrappers) {
10
+ const wrapperMap = new Map();
11
+ // Phase A: Extract wrapper calls from all route files
12
+ for (const route of routes) {
13
+ const src = readSource(rootDir, route.file);
14
+ if (!src)
15
+ continue;
16
+ const chain = extractHofWrapperChain(src);
17
+ for (const wrapperName of chain) {
18
+ let entry = wrapperMap.get(wrapperName);
19
+ if (!entry) {
20
+ // Phase B: Resolve and analyze on first encounter
21
+ const importSource = findImportSource(src, wrapperName);
22
+ const definition = resolveWrapper(wrapperName, importSource, route.file, src, rootDir, resolveOpts);
23
+ let evidence = {
24
+ authCallPresent: false,
25
+ authEnforced: false,
26
+ rateLimitCallPresent: false,
27
+ rateLimitEnforced: false,
28
+ authDetails: [],
29
+ rateLimitDetails: [],
30
+ };
31
+ if (definition) {
32
+ // Phase C: Analyze wrapper body
33
+ evidence = analyzeWrapperBody(wrapperName, definition.src, authFunctions, rateLimitWrappers);
34
+ }
35
+ entry = {
36
+ name: wrapperName,
37
+ definitionFile: definition?.file,
38
+ resolved: definition !== undefined,
39
+ evidence,
40
+ usageCount: 0,
41
+ usageFiles: [],
42
+ mutationRouteCount: 0,
43
+ };
44
+ wrapperMap.set(wrapperName, entry);
45
+ }
46
+ // Aggregate usage
47
+ entry.usageCount++;
48
+ entry.usageFiles.push(route.file);
49
+ if (route.signals.hasMutationEvidence ||
50
+ route.signals.hasDbWriteEvidence ||
51
+ route.signals.hasStripeWriteEvidence) {
52
+ entry.mutationRouteCount++;
53
+ }
54
+ }
55
+ }
56
+ return { wrappers: wrapperMap };
57
+ }
58
+ /**
59
+ * Compute ProtectionSummary for a route based on wrapper evidence,
60
+ * middleware coverage, and direct auth/rate-limit calls.
61
+ */
62
+ export function computeProtection(route, wrapperIndex, middleware, hints, rootDir) {
63
+ const src = readSource(rootDir, route.file);
64
+ const chain = src ? extractHofWrapperChain(src) : [];
65
+ const auth = computeAuthProtection(route, chain, wrapperIndex, middleware, hints, src);
66
+ const rateLimit = computeRateLimitProtection(route, chain, wrapperIndex, middleware, hints, src);
67
+ return { auth, rateLimit };
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // Wrapper Resolution (Phase B)
71
+ // ---------------------------------------------------------------------------
72
+ function resolveWrapper(wrapperName, importSource, routeFile, routeSrc, rootDir, resolveOpts) {
73
+ // 1. Same file — wrapper defined in the route file
74
+ if (!importSource) {
75
+ if (hasLocalDefinition(routeSrc, wrapperName)) {
76
+ return { file: routeFile, src: routeSrc };
77
+ }
78
+ return undefined;
79
+ }
80
+ // 2. Resolve the import to a file
81
+ const resolvedFile = resolveImportPath(routeFile, importSource, resolveOpts);
82
+ if (!resolvedFile)
83
+ return undefined;
84
+ // 3. Follow re-exports (barrel pattern), up to 5 hops
85
+ return followReExport(wrapperName, resolvedFile, resolveOpts, 5);
86
+ }
87
+ function hasLocalDefinition(src, name) {
88
+ const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
89
+ return new RegExp(`(?:export\\s+)?(?:async\\s+)?function\\s+${escaped}\\s*[(<]|` +
90
+ `(?:export\\s+)?(?:const|let|var)\\s+${escaped}\\s*[=:]`, "m").test(src);
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Wrapper Body Analysis (Phase C) — TypeScript AST
94
+ // ---------------------------------------------------------------------------
95
+ export function analyzeWrapperBody(wrapperName, src, authFunctions, rateLimitWrappers) {
96
+ const evidence = {
97
+ authCallPresent: false,
98
+ authEnforced: false,
99
+ rateLimitCallPresent: false,
100
+ rateLimitEnforced: false,
101
+ authDetails: [],
102
+ rateLimitDetails: [],
103
+ };
104
+ // Parse with TypeScript
105
+ const sourceFile = ts.createSourceFile("wrapper.ts", src, ts.ScriptTarget.Latest, true, // setParentNodes
106
+ ts.ScriptKind.TSX);
107
+ // Check for known imports at file level (imports are outside function bodies)
108
+ checkKnownImports(src, evidence);
109
+ // Find the wrapper function declaration
110
+ const wrapperBody = findFunctionBody(sourceFile, wrapperName);
111
+ if (!wrapperBody) {
112
+ // Fallback: analyze the entire file if we can't isolate the function
113
+ analyzeNodeForEvidence(sourceFile, authFunctions, rateLimitWrappers, evidence);
114
+ return evidence;
115
+ }
116
+ analyzeNodeForEvidence(wrapperBody, authFunctions, rateLimitWrappers, evidence);
117
+ return evidence;
118
+ }
119
+ function findFunctionBody(sourceFile, name) {
120
+ let result;
121
+ function visit(node) {
122
+ if (result)
123
+ return;
124
+ // function name(...) { ... }
125
+ if (ts.isFunctionDeclaration(node) && node.name?.text === name && node.body) {
126
+ result = node.body;
127
+ return;
128
+ }
129
+ // const name = (...) => { ... } or const name = function(...) { ... }
130
+ if (ts.isVariableStatement(node)) {
131
+ for (const decl of node.declarationList.declarations) {
132
+ if (ts.isIdentifier(decl.name) && decl.name.text === name && decl.initializer) {
133
+ result = extractFunctionBodyFromExpression(decl.initializer);
134
+ if (result)
135
+ return;
136
+ }
137
+ }
138
+ }
139
+ // export function name(...) { ... } — also captured by FunctionDeclaration check above
140
+ // export const name = ...
141
+ if (ts.isExportAssignment(node) || ts.isExportDeclaration(node)) {
142
+ // Skip — we handle exports via VariableStatement
143
+ }
144
+ ts.forEachChild(node, visit);
145
+ }
146
+ visit(sourceFile);
147
+ return result;
148
+ }
149
+ function extractFunctionBodyFromExpression(expr) {
150
+ // Arrow function: (...) => { ... } or (...) => expr
151
+ if (ts.isArrowFunction(expr)) {
152
+ return expr.body;
153
+ }
154
+ // Function expression: function(...) { ... }
155
+ if (ts.isFunctionExpression(expr)) {
156
+ return expr.body;
157
+ }
158
+ // Call expression returning a function: someHelper((...) => { ... })
159
+ // This handles factory patterns like: const withWorkspace = createWrapper((req) => { ... })
160
+ if (ts.isCallExpression(expr)) {
161
+ // Check all arguments for function expressions
162
+ for (const arg of expr.arguments) {
163
+ const body = extractFunctionBodyFromExpression(arg);
164
+ if (body)
165
+ return body;
166
+ }
167
+ // Also check the function itself if it's another call (chained)
168
+ return extractFunctionBodyFromExpression(expr.expression);
169
+ }
170
+ return undefined;
171
+ }
172
+ /**
173
+ * Check for known package imports at the file level.
174
+ * This runs against the full source, not just the function body,
175
+ * since imports are always at the top of the file.
176
+ */
177
+ function checkKnownImports(fileSrc, evidence) {
178
+ if (/@upstash\/ratelimit/.test(fileSrc)) {
179
+ evidence.rateLimitCallPresent = true;
180
+ evidence.rateLimitDetails.push("imports @upstash/ratelimit");
181
+ }
182
+ if (/@arcjet\/next/.test(fileSrc)) {
183
+ evidence.rateLimitCallPresent = true;
184
+ evidence.rateLimitDetails.push("imports @arcjet/next");
185
+ }
186
+ if (/@unkey\/ratelimit/.test(fileSrc)) {
187
+ evidence.rateLimitCallPresent = true;
188
+ evidence.rateLimitDetails.push("imports @unkey/ratelimit");
189
+ }
190
+ }
191
+ function analyzeNodeForEvidence(node, authFunctions, rateLimitWrappers, evidence) {
192
+ const authSet = new Set(authFunctions);
193
+ const rlSet = new Set(rateLimitWrappers);
194
+ const src = node.getFullText();
195
+ // Auth: check for known function calls
196
+ for (const fn of authFunctions) {
197
+ const pattern = new RegExp(`\\b${escapeRegex(fn)}\\s*\\(`, "m");
198
+ if (pattern.test(src)) {
199
+ evidence.authCallPresent = true;
200
+ evidence.authDetails.push(`calls ${fn}()`);
201
+ }
202
+ }
203
+ // Auth: built-in patterns (Supabase .auth.getUser(), .auth.getSession())
204
+ if (/\.auth\.getUser\s*\(/.test(src)) {
205
+ evidence.authCallPresent = true;
206
+ evidence.authEnforced = true;
207
+ evidence.authDetails.push("calls .auth.getUser()");
208
+ }
209
+ if (/\.auth\.getSession\s*\(/.test(src)) {
210
+ evidence.authCallPresent = true;
211
+ evidence.authEnforced = true;
212
+ evidence.authDetails.push("calls .auth.getSession()");
213
+ }
214
+ // Auth: webhook/cron signature verification patterns
215
+ if (/stripe\.webhooks\.constructEvent\s*\(/.test(src)) {
216
+ evidence.authCallPresent = true;
217
+ evidence.authEnforced = true;
218
+ evidence.authDetails.push("verifies Stripe webhook signature");
219
+ }
220
+ if (/workos\.webhooks\.constructEvent\s*\(/.test(src)) {
221
+ evidence.authCallPresent = true;
222
+ evidence.authEnforced = true;
223
+ evidence.authDetails.push("verifies WorkOS webhook signature");
224
+ }
225
+ if (/verifyVercelSignature\s*\(/.test(src)) {
226
+ evidence.authCallPresent = true;
227
+ evidence.authEnforced = true;
228
+ evidence.authDetails.push("verifies Vercel cron signature");
229
+ }
230
+ if (/verifyQstashSignature\s*\(/.test(src)) {
231
+ evidence.authCallPresent = true;
232
+ evidence.authEnforced = true;
233
+ evidence.authDetails.push("verifies QStash signature");
234
+ }
235
+ if (/createHmac\s*\(/.test(src) && /signature/i.test(src)) {
236
+ evidence.authCallPresent = true;
237
+ evidence.authEnforced = true;
238
+ evidence.authDetails.push("HMAC signature verification");
239
+ }
240
+ if (/timingSafeEqual\s*\(/.test(src)) {
241
+ evidence.authCallPresent = true;
242
+ evidence.authEnforced = true;
243
+ evidence.authDetails.push("timing-safe comparison (signature verification)");
244
+ }
245
+ // Rate limit: known wrappers
246
+ for (const fn of rateLimitWrappers) {
247
+ const pattern = new RegExp(`\\b${escapeRegex(fn)}\\s*[.(]`, "m");
248
+ if (pattern.test(src)) {
249
+ evidence.rateLimitCallPresent = true;
250
+ evidence.rateLimitDetails.push(`calls ${fn}()`);
251
+ }
252
+ }
253
+ // Rate limit: .limit() method calls on rate-limiter-like objects (Upstash pattern)
254
+ // Catches wrappers importing Upstash via local re-export modules
255
+ if (/(?:ratelimit|rateLimit|rl|limiter|rateLimiter)\.limit\s*\(/i.test(src)) {
256
+ evidence.rateLimitCallPresent = true;
257
+ evidence.rateLimitDetails.push("calls .limit() method");
258
+ }
259
+ // General pattern: any function call with "ratelimit" or "rate_limit" in the name
260
+ const rlCallMatch = src.match(/\b(\w*(?:rateLimit|ratelimit|rate_limit)\w*)\s*\(/i);
261
+ if (rlCallMatch && !evidence.rateLimitCallPresent) {
262
+ evidence.rateLimitCallPresent = true;
263
+ evidence.rateLimitEnforced = true; // Name implies rate limiting — trust it
264
+ evidence.rateLimitDetails.push(`calls ${rlCallMatch[1]}()`);
265
+ }
266
+ // Check for enforcement via AST (don't overwrite if already proven by built-in patterns)
267
+ if (evidence.authCallPresent && !evidence.authEnforced) {
268
+ evidence.authEnforced = detectEnforcement(node, authSet, "auth");
269
+ if (evidence.authEnforced) {
270
+ evidence.authDetails.push("enforces: conditional throw/return on auth failure");
271
+ }
272
+ }
273
+ if (evidence.rateLimitCallPresent && !evidence.rateLimitEnforced) {
274
+ evidence.rateLimitEnforced = detectEnforcement(node, rlSet, "rateLimit");
275
+ if (evidence.rateLimitEnforced) {
276
+ evidence.rateLimitDetails.push("enforces: conditional throw/return on rate limit");
277
+ }
278
+ }
279
+ }
280
+ /**
281
+ * Detect if auth/rate-limit calls are enforced (result checked + throw/return on failure).
282
+ *
283
+ * Heuristics:
284
+ * 1. The result of the call is stored in a variable (or destructured)
285
+ * 2. An if-statement or ternary checks the result (negation or falsy check)
286
+ * 3. The consequent throws, returns, or redirects
287
+ *
288
+ * Also covers common patterns:
289
+ * - `if (!session) throw/return`
290
+ * - `if (!success) throw/return Response(...429)`
291
+ * - `session ?? throw new Error()`
292
+ * - Early return patterns
293
+ */
294
+ function detectEnforcement(node, functionNames, kind) {
295
+ const src = node.getFullText();
296
+ if (kind === "auth") {
297
+ // Pattern: if (!session/!user/!token) throw/return/redirect
298
+ if (/if\s*\(\s*!(?:session|user|token|currentUser|auth)\b/.test(src)) {
299
+ if (/\bthrow\b|\breturn\b|NextResponse\.redirect|NextResponse\.json|Response\.json|new Response/.test(src)) {
300
+ return true;
301
+ }
302
+ }
303
+ // Pattern: session ?? throw / || throw
304
+ if (/(?:session|user|token|auth)\s*(?:\?\?|\|\|)\s*(?:throw|null)/.test(src)) {
305
+ return true;
306
+ }
307
+ // Pattern: throw or return right after the auth call (within a few lines)
308
+ // This catches: const session = await auth(); if (!session) { return ... }
309
+ if (/(?:auth|getSession|getServerSession|currentUser|getUser|validateRequest|getIronSession)\s*\([\s\S]{0,200}if\s*\(\s*!/.test(src)) {
310
+ if (/\bthrow\b|\breturn\b|redirect/.test(src)) {
311
+ return true;
312
+ }
313
+ }
314
+ }
315
+ if (kind === "rateLimit") {
316
+ // Pattern: if (!success) or if (remaining <= 0) throw/return 429
317
+ if (/if\s*\(\s*!success\b/.test(src) || /if\s*\(\s*remaining\s*<=?\s*0/.test(src)) {
318
+ if (/\bthrow\b|\breturn\b|429|too\s*many/i.test(src)) {
319
+ return true;
320
+ }
321
+ }
322
+ // Pattern: destructure { success } and check
323
+ if (/\{\s*success\s*\}/.test(src) && /!success/.test(src)) {
324
+ return true;
325
+ }
326
+ // Pattern: .limit( followed by conditional throw/return
327
+ if (/\.limit\s*\([\s\S]{0,200}(?:throw|return\s+(?:new\s+)?Response|429)/m.test(src)) {
328
+ return true;
329
+ }
330
+ // Pattern: ratelimit.limit() + any throw within 300 chars (looser — catches custom error classes)
331
+ if (/(?:ratelimit|rateLimit|rl|limiter)\.limit\s*\([\s\S]{0,300}\bthrow\b/i.test(src)) {
332
+ return true;
333
+ }
334
+ }
335
+ return false;
336
+ }
337
+ // ---------------------------------------------------------------------------
338
+ // Protection Computation
339
+ // ---------------------------------------------------------------------------
340
+ function computeAuthProtection(route, chain, wrapperIndex, middleware, hints, src) {
341
+ const status = {
342
+ satisfied: false,
343
+ enforced: false,
344
+ sources: [],
345
+ details: [],
346
+ unverifiedWrappers: [],
347
+ };
348
+ // 1. Direct auth call in route (hint-based)
349
+ if (src) {
350
+ for (const fn of hints.auth.functions) {
351
+ const pattern = new RegExp(`\\b${escapeRegex(fn)}\\s*\\(`, "m");
352
+ if (pattern.test(src)) {
353
+ status.satisfied = true;
354
+ status.enforced = true; // Trust direct calls in-handler (same as before)
355
+ status.sources.push("direct");
356
+ status.details.push(`calls ${fn}()`);
357
+ return status;
358
+ }
359
+ }
360
+ // Hint-based HOF wrapping (explicit hint = hard allow)
361
+ for (const fn of hints.auth.functions) {
362
+ const escaped = escapeRegex(fn);
363
+ const hofPattern = new RegExp(`export\\s+(?:const|let|var)\\s+(?:GET|POST|PUT|PATCH|DELETE)\\s*=\\s*${escaped}\\s*\\(`, "m");
364
+ if (hofPattern.test(src)) {
365
+ status.satisfied = true;
366
+ status.enforced = true;
367
+ status.sources.push("hint");
368
+ status.details.push(`wrapped by ${fn}() (in hints)`);
369
+ return status;
370
+ }
371
+ const defaultPattern = new RegExp(`export\\s+default\\s+${escaped}\\s*\\(`, "m");
372
+ if (defaultPattern.test(src)) {
373
+ status.satisfied = true;
374
+ status.enforced = true;
375
+ status.sources.push("hint");
376
+ status.details.push(`wrapped by ${fn}() (in hints)`);
377
+ return status;
378
+ }
379
+ }
380
+ }
381
+ // 2. Wrapper evidence from introspection
382
+ for (const wrapperName of chain) {
383
+ const wrapper = wrapperIndex.wrappers.get(wrapperName);
384
+ if (!wrapper)
385
+ continue;
386
+ if (wrapper.resolved && wrapper.evidence.authEnforced) {
387
+ status.satisfied = true;
388
+ status.enforced = true;
389
+ status.sources.push("wrapper");
390
+ status.details.push(`${wrapperName}() enforces auth: ${wrapper.evidence.authDetails.join(", ")}`);
391
+ return status;
392
+ }
393
+ if (wrapper.resolved && wrapper.evidence.authCallPresent && !wrapper.evidence.authEnforced) {
394
+ status.unverifiedWrappers.push(wrapperName);
395
+ status.details.push(`${wrapperName}() calls auth but enforcement not proven`);
396
+ }
397
+ else if (wrapper.resolved && !wrapper.evidence.authCallPresent) {
398
+ // Resolved wrapper with no auth at all — defer to WRAPPER-UNRECOGNIZED
399
+ status.unverifiedWrappers.push(wrapperName);
400
+ status.details.push(`${wrapperName}() resolved but has no auth evidence`);
401
+ }
402
+ if (!wrapper.resolved) {
403
+ status.unverifiedWrappers.push(wrapperName);
404
+ status.details.push(`${wrapperName}() could not be resolved`);
405
+ }
406
+ }
407
+ // 3. Middleware coverage
408
+ if (middleware.authLikely) {
409
+ const pathname = route.pathname ?? "";
410
+ const matchers = middleware.matcherPatterns;
411
+ const covered = matchers.length === 0 || matchers.some((m) => pathnameMatchesMatcher(pathname, m));
412
+ if (covered) {
413
+ status.satisfied = true;
414
+ status.enforced = true;
415
+ status.sources.push("middleware");
416
+ status.details.push("middleware.ts provides auth for this route");
417
+ return status;
418
+ }
419
+ }
420
+ return status;
421
+ }
422
+ function computeRateLimitProtection(route, chain, wrapperIndex, middleware, hints, src) {
423
+ const status = {
424
+ satisfied: false,
425
+ enforced: false,
426
+ sources: [],
427
+ details: [],
428
+ unverifiedWrappers: [],
429
+ };
430
+ // 1. Direct rate-limit call in route (hint-based)
431
+ if (src) {
432
+ for (const fn of hints.rateLimit.wrappers) {
433
+ const pattern = new RegExp(`\\b${escapeRegex(fn)}\\s*[.(]`, "m");
434
+ if (pattern.test(src)) {
435
+ status.satisfied = true;
436
+ status.enforced = true;
437
+ status.sources.push("direct");
438
+ status.details.push(`calls ${fn}()`);
439
+ return status;
440
+ }
441
+ }
442
+ // Known RL package imports
443
+ const rlImports = [/@upstash\/ratelimit/, /rate-limiter-flexible/, /@arcjet\/next/, /@unkey\/ratelimit/];
444
+ for (const pat of rlImports) {
445
+ if (pat.test(src)) {
446
+ status.satisfied = true;
447
+ status.enforced = true;
448
+ status.sources.push("direct");
449
+ status.details.push(`imports ${pat.source}`);
450
+ return status;
451
+ }
452
+ }
453
+ // General pattern: any function call with "ratelimit" or "rate_limit" in the name
454
+ const rlCallMatch = src.match(/\b(\w*(?:rateLimit|ratelimit|rate_limit)\w*)\s*\(/i);
455
+ if (rlCallMatch) {
456
+ status.satisfied = true;
457
+ status.enforced = true;
458
+ status.sources.push("direct");
459
+ status.details.push(`calls ${rlCallMatch[1]}()`);
460
+ return status;
461
+ }
462
+ // Hint-based HOF wrapping (explicit hint = hard allow)
463
+ for (const fn of hints.rateLimit.wrappers) {
464
+ const escaped = escapeRegex(fn);
465
+ const hofPattern = new RegExp(`export\\s+(?:const|let|var)\\s+(?:GET|POST|PUT|PATCH|DELETE)\\s*=\\s*${escaped}\\s*\\(`, "m");
466
+ if (hofPattern.test(src)) {
467
+ status.satisfied = true;
468
+ status.enforced = true;
469
+ status.sources.push("hint");
470
+ status.details.push(`wrapped by ${fn}() (in hints)`);
471
+ return status;
472
+ }
473
+ }
474
+ }
475
+ // 2. Wrapper evidence from introspection
476
+ for (const wrapperName of chain) {
477
+ const wrapper = wrapperIndex.wrappers.get(wrapperName);
478
+ if (!wrapper)
479
+ continue;
480
+ if (wrapper.resolved && wrapper.evidence.rateLimitEnforced) {
481
+ status.satisfied = true;
482
+ status.enforced = true;
483
+ status.sources.push("wrapper");
484
+ status.details.push(`${wrapperName}() enforces rate limiting: ${wrapper.evidence.rateLimitDetails.join(", ")}`);
485
+ return status;
486
+ }
487
+ if (wrapper.resolved && wrapper.evidence.rateLimitCallPresent && !wrapper.evidence.rateLimitEnforced) {
488
+ status.unverifiedWrappers.push(wrapperName);
489
+ status.details.push(`${wrapperName}() calls rate limiter but enforcement not proven`);
490
+ }
491
+ else if (wrapper.resolved && !wrapper.evidence.rateLimitCallPresent) {
492
+ // Resolved wrapper with no RL at all — defer to WRAPPER-UNRECOGNIZED
493
+ status.unverifiedWrappers.push(wrapperName);
494
+ status.details.push(`${wrapperName}() resolved but has no rate-limit evidence`);
495
+ }
496
+ if (!wrapper.resolved) {
497
+ status.unverifiedWrappers.push(wrapperName);
498
+ status.details.push(`${wrapperName}() could not be resolved`);
499
+ }
500
+ }
501
+ // 3. Middleware coverage
502
+ if (middleware.rateLimitLikely) {
503
+ status.satisfied = true;
504
+ status.enforced = true;
505
+ status.sources.push("middleware");
506
+ status.details.push("middleware.ts provides rate limiting");
507
+ return status;
508
+ }
509
+ return status;
510
+ }
511
+ function pathnameMatchesMatcher(pathname, matcher) {
512
+ if (matcher.endsWith("/:path*")) {
513
+ const prefix = matcher.replace("/:path*", "");
514
+ return pathname.startsWith(prefix);
515
+ }
516
+ if (matcher.endsWith("(.*)")) {
517
+ const prefix = matcher.replace("(.*)", "");
518
+ return pathname.startsWith(prefix);
519
+ }
520
+ return pathname === matcher || pathname.startsWith(matcher + "/");
521
+ }
522
+ // ---------------------------------------------------------------------------
523
+ // Utilities
524
+ // ---------------------------------------------------------------------------
525
+ function readSource(rootDir, file) {
526
+ try {
527
+ return readFileSync(path.join(rootDir, file), "utf8");
528
+ }
529
+ catch {
530
+ return null;
531
+ }
532
+ }
533
+ function escapeRegex(str) {
534
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
535
+ }
536
+ //# sourceMappingURL=wrappers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrappers.js","sourceRoot":"","sources":["../../src/next/wrappers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wrappers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrappers.test.d.ts","sourceRoot":"","sources":["../../src/next/wrappers.test.ts"],"names":[],"mappings":""}