From cb1b3b4ef9a3799c6bf8c8b8c8cef877f339a8c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20S=C3=B8rensen?= Date: Thu, 19 Mar 2026 08:45:53 +0100 Subject: [PATCH 1/2] ValidatorExtractor: Support tryValidate --- .../routes_scanner/validator_extractor.ts | 3 ++ .../code_scanners/validator_extractor.spec.ts | 38 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/code_scanners/routes_scanner/validator_extractor.ts b/src/code_scanners/routes_scanner/validator_extractor.ts index 36eb7828..dd1d197a 100644 --- a/src/code_scanners/routes_scanner/validator_extractor.ts +++ b/src/code_scanners/routes_scanner/validator_extractor.ts @@ -81,8 +81,11 @@ export async function extractValidators( */ const validationCalls = inspectMethodArguments(method, [ 'request.validateUsing', + 'request.tryValidateUsing', '$CTX.request.validateUsing', + '$CTX.request.tryValidateUsing', 'vine.validate', + 'vine.tryValidate', ]) .map((node) => { const firstArg = node.find({ diff --git a/tests/code_scanners/validator_extractor.spec.ts b/tests/code_scanners/validator_extractor.spec.ts index 56f9806f..57a4cec5 100644 --- a/tests/code_scanners/validator_extractor.spec.ts +++ b/tests/code_scanners/validator_extractor.spec.ts @@ -446,6 +446,44 @@ test.group('Validator extractor', () => { ) }) + test('extract validator when using ctx.request.tryValidateUsing', async ({ assert, fs }) => { + await fs.create( + 'app/controllers/users_controller.ts', + ` + import { createUserValidator } from '#validators/user' + + export default class UsersController { + async store(ctx: HttpContext) { + await ctx.request.tryValidateUsing(createUserValidator) + } + } + ` + ) + + assert.deepEqual( + await extractValidators(fs.basePath, new VirtualFileSystem(fs.basePath), { + path: join(fs.basePath, 'app/controllers/users_controller.ts'), + method: 'store', + name: 'UsersController', + import: { + type: 'default', + value: 'UsersController', + specifier: '#controllers/users_controller', + }, + }), + [ + { + import: { + specifier: '#validators/user', + type: 'named', + value: 'createUserValidator', + }, + name: 'createUserValidator', + }, + ] + ) + }) + test('do not match method name when it appear in body of another method', async ({ assert, fs, From 85987724076331d4ec56059b8ff925124eaf535d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20S=C3=B8rensen?= Date: Thu, 19 Mar 2026 12:30:57 +0100 Subject: [PATCH 2/2] ValidatorExtractor: Add test for request.validateUsing (w.o. ctx) --- .../code_scanners/validator_extractor.spec.ts | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/code_scanners/validator_extractor.spec.ts b/tests/code_scanners/validator_extractor.spec.ts index 57a4cec5..8ac43390 100644 --- a/tests/code_scanners/validator_extractor.spec.ts +++ b/tests/code_scanners/validator_extractor.spec.ts @@ -484,6 +484,44 @@ test.group('Validator extractor', () => { ) }) + test('extract validator when using request.tryValidateUsing', async ({ assert, fs }) => { + await fs.create( + 'app/controllers/users_controller.ts', + ` + import { createUserValidator } from '#validators/user' + + export default class UsersController { + async store({ request }: HttpContext) { + await request.tryValidateUsing(createUserValidator) + } + } + ` + ) + + assert.deepEqual( + await extractValidators(fs.basePath, new VirtualFileSystem(fs.basePath), { + path: join(fs.basePath, 'app/controllers/users_controller.ts'), + method: 'store', + name: 'UsersController', + import: { + type: 'default', + value: 'UsersController', + specifier: '#controllers/users_controller', + }, + }), + [ + { + import: { + specifier: '#validators/user', + type: 'named', + value: 'createUserValidator', + }, + name: 'createUserValidator', + }, + ] + ) + }) + test('do not match method name when it appear in body of another method', async ({ assert, fs,