@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,361 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ import { buildWrapperIndex, analyzeWrapperBody, computeProtection } from "./wrappers.js";
6
+ function makeRoute(overrides = {}) {
7
+ return {
8
+ kind: "route-handler",
9
+ file: "app/api/test/route.ts",
10
+ isApi: true,
11
+ isPublic: true,
12
+ signals: {
13
+ hasMutationEvidence: true,
14
+ hasDbWriteEvidence: true,
15
+ hasStripeWriteEvidence: false,
16
+ mutationDetails: ["prisma.create"],
17
+ },
18
+ ...overrides,
19
+ };
20
+ }
21
+ const DEFAULT_HINTS = {
22
+ auth: { functions: ["auth", "getSession", "getServerSession"], middlewareFiles: [], allowlistPaths: [] },
23
+ rateLimit: { wrappers: ["rateLimit", "withRateLimit"], allowlistPaths: [] },
24
+ tenancy: { orgFieldNames: [] },
25
+ };
26
+ const DEFAULT_MIDDLEWARE = {
27
+ authLikely: false,
28
+ rateLimitLikely: false,
29
+ matcherPatterns: [],
30
+ };
31
+ describe("buildWrapperIndex", () => {
32
+ let tmpDir;
33
+ beforeEach(() => {
34
+ tmpDir = mkdtempSync(path.join(os.tmpdir(), "prodcheck-wrapper-"));
35
+ });
36
+ afterEach(() => {
37
+ rmSync(tmpDir, { recursive: true, force: true });
38
+ });
39
+ it("discovers wrapper from route file", () => {
40
+ mkdirSync(path.join(tmpDir, "app", "api", "test"), { recursive: true });
41
+ mkdirSync(path.join(tmpDir, "src", "lib"), { recursive: true });
42
+ writeFileSync(path.join(tmpDir, "app", "api", "test", "route.ts"), `import { withWorkspace } from "@/lib/auth";
43
+ export const POST = withWorkspace(async (req) => {
44
+ await prisma.user.create({ data: { name: "test" } });
45
+ return Response.json({});
46
+ });`);
47
+ writeFileSync(path.join(tmpDir, "src", "lib", "auth.ts"), `export function withWorkspace(handler: any) {
48
+ return async (req: any) => {
49
+ const session = await getSession();
50
+ if (!session) throw new Error("Unauthorized");
51
+ return handler(req, { session });
52
+ };
53
+ }`);
54
+ const routes = [makeRoute({ file: "app/api/test/route.ts" })];
55
+ const result = buildWrapperIndex(routes, tmpDir, { rootDir: tmpDir }, ["auth", "getSession"], ["rateLimit"]);
56
+ expect(result.wrappers.size).toBe(1);
57
+ const wrapper = result.wrappers.get("withWorkspace");
58
+ expect(wrapper).toBeDefined();
59
+ expect(wrapper.resolved).toBe(true);
60
+ expect(wrapper.evidence.authCallPresent).toBe(true);
61
+ expect(wrapper.evidence.authEnforced).toBe(true);
62
+ expect(wrapper.usageCount).toBe(1);
63
+ expect(wrapper.mutationRouteCount).toBe(1);
64
+ });
65
+ it("detects unresolvable npm package wrapper", () => {
66
+ mkdirSync(path.join(tmpDir, "app", "api", "test"), { recursive: true });
67
+ writeFileSync(path.join(tmpDir, "app", "api", "test", "route.ts"), `import { withAuth } from "some-npm-package";
68
+ export const POST = withAuth(async (req) => {
69
+ return Response.json({});
70
+ });`);
71
+ const routes = [makeRoute({ file: "app/api/test/route.ts" })];
72
+ const result = buildWrapperIndex(routes, tmpDir, { rootDir: tmpDir }, ["auth"], ["rateLimit"]);
73
+ const wrapper = result.wrappers.get("withAuth");
74
+ expect(wrapper).toBeDefined();
75
+ expect(wrapper.resolved).toBe(false);
76
+ });
77
+ it("aggregates usage across multiple routes", () => {
78
+ mkdirSync(path.join(tmpDir, "app", "api", "a"), { recursive: true });
79
+ mkdirSync(path.join(tmpDir, "app", "api", "b"), { recursive: true });
80
+ mkdirSync(path.join(tmpDir, "src", "lib"), { recursive: true });
81
+ const routeContent = `import { withWorkspace } from "@/lib/auth";
82
+ export const POST = withWorkspace(async (req) => {
83
+ await prisma.user.create({ data: {} });
84
+ return Response.json({});
85
+ });`;
86
+ writeFileSync(path.join(tmpDir, "app", "api", "a", "route.ts"), routeContent);
87
+ writeFileSync(path.join(tmpDir, "app", "api", "b", "route.ts"), routeContent);
88
+ writeFileSync(path.join(tmpDir, "src", "lib", "auth.ts"), `export function withWorkspace(handler: any) { return handler; }`);
89
+ const routes = [
90
+ makeRoute({ file: "app/api/a/route.ts" }),
91
+ makeRoute({ file: "app/api/b/route.ts" }),
92
+ ];
93
+ const result = buildWrapperIndex(routes, tmpDir, { rootDir: tmpDir }, ["auth"], ["rateLimit"]);
94
+ const wrapper = result.wrappers.get("withWorkspace");
95
+ expect(wrapper.usageCount).toBe(2);
96
+ expect(wrapper.mutationRouteCount).toBe(2);
97
+ });
98
+ it("handles same-file wrapper definition", () => {
99
+ mkdirSync(path.join(tmpDir, "app", "api", "test"), { recursive: true });
100
+ writeFileSync(path.join(tmpDir, "app", "api", "test", "route.ts"), `function withAuth(handler: any) {
101
+ return async (req: any) => {
102
+ const session = await auth();
103
+ if (!session) throw new Error("Unauthorized");
104
+ return handler(req);
105
+ };
106
+ }
107
+ export const POST = withAuth(async (req) => {
108
+ return Response.json({});
109
+ });`);
110
+ const routes = [makeRoute({ file: "app/api/test/route.ts" })];
111
+ const result = buildWrapperIndex(routes, tmpDir, { rootDir: tmpDir }, ["auth"], ["rateLimit"]);
112
+ const wrapper = result.wrappers.get("withAuth");
113
+ expect(wrapper).toBeDefined();
114
+ expect(wrapper.resolved).toBe(true);
115
+ expect(wrapper.evidence.authCallPresent).toBe(true);
116
+ });
117
+ });
118
+ describe("analyzeWrapperBody", () => {
119
+ it("detects auth call + enforcement", () => {
120
+ const src = `
121
+ export function withAuth(handler: any) {
122
+ return async (req: any) => {
123
+ const session = await getSession();
124
+ if (!session) {
125
+ throw new Error("Unauthorized");
126
+ }
127
+ return handler(req, { session });
128
+ };
129
+ }
130
+ `;
131
+ const evidence = analyzeWrapperBody("withAuth", src, ["getSession"], []);
132
+ expect(evidence.authCallPresent).toBe(true);
133
+ expect(evidence.authEnforced).toBe(true);
134
+ });
135
+ it("detects auth call without enforcement", () => {
136
+ const src = `
137
+ export function withLogging(handler: any) {
138
+ return async (req: any) => {
139
+ const session = await getSession();
140
+ console.log("User:", session?.user?.name);
141
+ return handler(req);
142
+ };
143
+ }
144
+ `;
145
+ const evidence = analyzeWrapperBody("withLogging", src, ["getSession"], []);
146
+ expect(evidence.authCallPresent).toBe(true);
147
+ expect(evidence.authEnforced).toBe(false);
148
+ });
149
+ it("detects rate-limit call + enforcement", () => {
150
+ const src = `
151
+ export function withRateLimiting(handler: any) {
152
+ return async (req: any) => {
153
+ const { success } = await rateLimit(req);
154
+ if (!success) {
155
+ return new Response("Too many requests", { status: 429 });
156
+ }
157
+ return handler(req);
158
+ };
159
+ }
160
+ `;
161
+ const evidence = analyzeWrapperBody("withRateLimiting", src, [], ["rateLimit"]);
162
+ expect(evidence.rateLimitCallPresent).toBe(true);
163
+ expect(evidence.rateLimitEnforced).toBe(true);
164
+ });
165
+ it("detects both auth and rate-limit", () => {
166
+ const src = `
167
+ import { getSession } from "next-auth";
168
+ import { Ratelimit } from "@upstash/ratelimit";
169
+
170
+ export function withWorkspace(handler: any) {
171
+ return async (req: any) => {
172
+ const session = await getSession();
173
+ if (!session) return new Response("Unauthorized", { status: 401 });
174
+
175
+ const { success } = await rateLimit.limit(session.user.id);
176
+ if (!success) return new Response("Rate limited", { status: 429 });
177
+
178
+ return handler(req, { session });
179
+ };
180
+ }
181
+ `;
182
+ const evidence = analyzeWrapperBody("withWorkspace", src, ["getSession"], ["rateLimit"]);
183
+ expect(evidence.authCallPresent).toBe(true);
184
+ expect(evidence.authEnforced).toBe(true);
185
+ expect(evidence.rateLimitCallPresent).toBe(true);
186
+ expect(evidence.rateLimitEnforced).toBe(true);
187
+ });
188
+ it("detects Supabase auth pattern in wrapper", () => {
189
+ const src = `
190
+ export function withAuth(handler: any) {
191
+ return async (req: any) => {
192
+ const { data: { user } } = await supabase.auth.getUser();
193
+ if (!user) throw new Error("Unauthorized");
194
+ return handler(req, { user });
195
+ };
196
+ }
197
+ `;
198
+ const evidence = analyzeWrapperBody("withAuth", src, [], []);
199
+ expect(evidence.authCallPresent).toBe(true);
200
+ expect(evidence.authEnforced).toBe(true);
201
+ });
202
+ it("detects upstash ratelimit import as RL evidence", () => {
203
+ const src = `
204
+ import { Ratelimit } from "@upstash/ratelimit";
205
+ const ratelimit = new Ratelimit({ ... });
206
+
207
+ export function withRL(handler: any) {
208
+ return async (req: any) => {
209
+ const { success } = await ratelimit.limit("key");
210
+ if (!success) throw new Error("Rate limited");
211
+ return handler(req);
212
+ };
213
+ }
214
+ `;
215
+ const evidence = analyzeWrapperBody("withRL", src, [], []);
216
+ expect(evidence.rateLimitCallPresent).toBe(true);
217
+ expect(evidence.rateLimitEnforced).toBe(true);
218
+ });
219
+ it("returns no evidence for generic wrapper", () => {
220
+ const src = `
221
+ export function withErrorBoundary(handler: any) {
222
+ return async (req: any) => {
223
+ try {
224
+ return handler(req);
225
+ } catch (e) {
226
+ return new Response("Error", { status: 500 });
227
+ }
228
+ };
229
+ }
230
+ `;
231
+ const evidence = analyzeWrapperBody("withErrorBoundary", src, ["auth", "getSession"], ["rateLimit"]);
232
+ expect(evidence.authCallPresent).toBe(false);
233
+ expect(evidence.rateLimitCallPresent).toBe(false);
234
+ });
235
+ });
236
+ describe("computeProtection", () => {
237
+ let tmpDir;
238
+ beforeEach(() => {
239
+ tmpDir = mkdtempSync(path.join(os.tmpdir(), "prodcheck-prot-"));
240
+ });
241
+ afterEach(() => {
242
+ rmSync(tmpDir, { recursive: true, force: true });
243
+ });
244
+ it("marks satisfied when wrapper has auth enforcement", () => {
245
+ mkdirSync(path.join(tmpDir, "app", "api", "test"), { recursive: true });
246
+ writeFileSync(path.join(tmpDir, "app", "api", "test", "route.ts"), `import { withWorkspace } from "@/lib/auth";
247
+ export const POST = withWorkspace(async (req) => {});`);
248
+ const wrapperIndex = {
249
+ wrappers: new Map([
250
+ ["withWorkspace", {
251
+ name: "withWorkspace",
252
+ definitionFile: "src/lib/auth.ts",
253
+ resolved: true,
254
+ evidence: {
255
+ authCallPresent: true,
256
+ authEnforced: true,
257
+ rateLimitCallPresent: true,
258
+ rateLimitEnforced: true,
259
+ authDetails: ["calls getSession()"],
260
+ rateLimitDetails: ["calls rateLimit()"],
261
+ },
262
+ usageCount: 1,
263
+ usageFiles: ["app/api/test/route.ts"],
264
+ mutationRouteCount: 1,
265
+ }],
266
+ ]),
267
+ };
268
+ const route = makeRoute({ file: "app/api/test/route.ts" });
269
+ const protection = computeProtection(route, wrapperIndex, DEFAULT_MIDDLEWARE, DEFAULT_HINTS, tmpDir);
270
+ expect(protection.auth.satisfied).toBe(true);
271
+ expect(protection.auth.enforced).toBe(true);
272
+ expect(protection.auth.sources).toContain("wrapper");
273
+ expect(protection.rateLimit.satisfied).toBe(true);
274
+ });
275
+ it("marks unverified when wrapper calls auth but doesn't enforce", () => {
276
+ mkdirSync(path.join(tmpDir, "app", "api", "test"), { recursive: true });
277
+ writeFileSync(path.join(tmpDir, "app", "api", "test", "route.ts"), `import { withLogging } from "@/lib/logging";
278
+ export const POST = withLogging(async (req) => {});`);
279
+ const wrapperIndex = {
280
+ wrappers: new Map([
281
+ ["withLogging", {
282
+ name: "withLogging",
283
+ definitionFile: "src/lib/logging.ts",
284
+ resolved: true,
285
+ evidence: {
286
+ authCallPresent: true,
287
+ authEnforced: false,
288
+ rateLimitCallPresent: false,
289
+ rateLimitEnforced: false,
290
+ authDetails: ["calls getSession()"],
291
+ rateLimitDetails: [],
292
+ },
293
+ usageCount: 1,
294
+ usageFiles: ["app/api/test/route.ts"],
295
+ mutationRouteCount: 1,
296
+ }],
297
+ ]),
298
+ };
299
+ const route = makeRoute({ file: "app/api/test/route.ts" });
300
+ const protection = computeProtection(route, wrapperIndex, DEFAULT_MIDDLEWARE, DEFAULT_HINTS, tmpDir);
301
+ expect(protection.auth.satisfied).toBe(false);
302
+ expect(protection.auth.unverifiedWrappers).toContain("withLogging");
303
+ });
304
+ it("marks satisfied when direct auth call in route", () => {
305
+ mkdirSync(path.join(tmpDir, "app", "api", "test"), { recursive: true });
306
+ writeFileSync(path.join(tmpDir, "app", "api", "test", "route.ts"), `export async function POST(req: Request) {
307
+ const session = await auth();
308
+ return Response.json({});
309
+ }`);
310
+ const emptyWrappers = { wrappers: new Map() };
311
+ const route = makeRoute({ file: "app/api/test/route.ts" });
312
+ const protection = computeProtection(route, emptyWrappers, DEFAULT_MIDDLEWARE, DEFAULT_HINTS, tmpDir);
313
+ expect(protection.auth.satisfied).toBe(true);
314
+ expect(protection.auth.sources).toContain("direct");
315
+ });
316
+ it("marks satisfied when middleware covers route", () => {
317
+ mkdirSync(path.join(tmpDir, "app", "api", "test"), { recursive: true });
318
+ writeFileSync(path.join(tmpDir, "app", "api", "test", "route.ts"), `export async function POST(req: Request) {
319
+ return Response.json({});
320
+ }`);
321
+ const middleware = {
322
+ authLikely: true,
323
+ rateLimitLikely: false,
324
+ matcherPatterns: ["/api/:path*"],
325
+ };
326
+ const emptyWrappers = { wrappers: new Map() };
327
+ const route = makeRoute({ file: "app/api/test/route.ts", pathname: "/api/test" });
328
+ const protection = computeProtection(route, emptyWrappers, middleware, DEFAULT_HINTS, tmpDir);
329
+ expect(protection.auth.satisfied).toBe(true);
330
+ expect(protection.auth.sources).toContain("middleware");
331
+ });
332
+ it("marks unverified when wrapper is unresolved", () => {
333
+ mkdirSync(path.join(tmpDir, "app", "api", "test"), { recursive: true });
334
+ writeFileSync(path.join(tmpDir, "app", "api", "test", "route.ts"), `import { withUnknown } from "some-package";
335
+ export const POST = withUnknown(async (req) => {});`);
336
+ const wrapperIndex = {
337
+ wrappers: new Map([
338
+ ["withUnknown", {
339
+ name: "withUnknown",
340
+ resolved: false,
341
+ evidence: {
342
+ authCallPresent: false,
343
+ authEnforced: false,
344
+ rateLimitCallPresent: false,
345
+ rateLimitEnforced: false,
346
+ authDetails: [],
347
+ rateLimitDetails: [],
348
+ },
349
+ usageCount: 1,
350
+ usageFiles: ["app/api/test/route.ts"],
351
+ mutationRouteCount: 1,
352
+ }],
353
+ ]),
354
+ };
355
+ const route = makeRoute({ file: "app/api/test/route.ts" });
356
+ const protection = computeProtection(route, wrapperIndex, DEFAULT_MIDDLEWARE, DEFAULT_HINTS, tmpDir);
357
+ expect(protection.auth.satisfied).toBe(false);
358
+ expect(protection.auth.unverifiedWrappers).toContain("withUnknown");
359
+ });
360
+ });
361
+ //# sourceMappingURL=wrappers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrappers.test.js","sourceRoot":"","sources":["../../src/next/wrappers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { NextIndex } from "../next/types.js";
2
+ import type { Finding, ProdcheckConfig } from "../engine/types.js";
3
+ export declare const RULE_ID = "AUTH-BOUNDARY-MISSING";
4
+ export declare function run(index: NextIndex, config: ProdcheckConfig): 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;AAc/C,wBAAgB,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,EAAE,CAkGxE"}