Skip to content

Commit 14784fe

Browse files
committed
fix(audits): follow exported non-verb helpers when resolving raw-route contracts
1 parent 45bd2ab commit 14784fe

2 files changed

Lines changed: 10 additions & 2 deletions

File tree

‎scripts/check-route-verbs.test.ts‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ export const PUT = withRouteHandler((request, context) => PATCH(request, context
6565
})
6666

6767
describe('export-list verbs on raw routes', () => {
68+
it('follows an exported non-verb helper that parses the contract', () => {
69+
const source = `import { updateContract } from '@/lib/api/contracts/things'
70+
export async function parseUpdate(request) { return parseRequest(updateContract, request) }
71+
export const PUT = withRouteHandler((request) => parseUpdate(request))`
72+
expect(rawRouteContractSites(source)).toEqual([{ verb: 'PUT', identifier: 'updateContract' }])
73+
})
6874
it('checks a handler exported as \`export { GET }\`', () => {
6975
const source = `const GET = withRouteHandler((request) => parseRequest(listContract, request, {}))
7076
export { GET }`

‎scripts/check-route-verbs.ts‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,12 +229,14 @@ export function rawRouteContractSites(source: string): Array<{ verb: string; ide
229229
const statements = parse(source, { sourceType: 'module', plugins: ['typescript'] }).program.body
230230
const { locals, exports } = topLevelBindings(statements)
231231
const parsers = parseRequestNames(statements)
232-
const exportedLocals = new Set(exports.map(({ local }) => local))
232+
const verbLocals = new Set(
233+
exports.filter(({ exported }) => isVerb(exported)).map(({ local }) => local)
234+
)
233235
const sites: Array<{ verb: string; identifier: string }> = []
234236
for (const { exported: verb, local } of exports) {
235237
if (!isVerb(verb)) continue
236238
const identifiers = new Set<string>()
237-
const followed = new Set(exportedLocals)
239+
const followed = new Set(verbLocals)
238240
const visit = (value: unknown): void => {
239241
if (!value || typeof value !== 'object') return
240242
if (Array.isArray(value)) {

0 commit comments

Comments
 (0)