Skip to content

Commit e179591

Browse files
authored
Improve Next Nuxt Nest endpoint extraction (#1777)
1 parent bedf354 commit e179591

15 files changed

Lines changed: 542 additions & 93 deletions

File tree

spec/functional_test/fixtures/javascript/nestjs/users.controller.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { Controller, Get, Post, Put, Delete, Param, Query, Body, Headers } from '@nestjs/common';
1+
import { Controller, Get, Post, Put, Delete, Param, Query, Body, Headers, Req, UploadedFile, UseGuards, UseInterceptors, Version } from '@nestjs/common';
2+
import { FileInterceptor } from '@nestjs/platform-express';
23

34
@Controller('users')
45
export class UserController {
@@ -39,4 +40,27 @@ export class ProtectedController {
3940
getProtected(@Headers('authorization') auth: string) {
4041
return {};
4142
}
42-
}
43+
}
44+
45+
@Controller('admin')
46+
export class AdminController {
47+
@Get('reports/:id')
48+
@UseGuards(AuthGuard)
49+
report(@Param('id') id: string, @Req() req: any) {
50+
const include = req.query.include;
51+
const token = req.headers['x-token'];
52+
return { id, include, token };
53+
}
54+
55+
@Post('upload')
56+
@UseInterceptors(FileInterceptor('avatar'))
57+
upload(@UploadedFile() file: any) {
58+
return { file };
59+
}
60+
61+
@Version('2')
62+
@Get('versioned')
63+
versioned() {
64+
return {};
65+
}
66+
}

spec/functional_test/fixtures/javascript/nestjs_versioning/cats.controller.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,14 @@ export class HealthController {
3131
return { ok: true }
3232
}
3333
}
34+
35+
// Method-level versioning overrides, rather than stacks on top of,
36+
// controller-level URI versioning.
37+
@Controller({ path: 'dogs', version: '1' })
38+
export class DogsController {
39+
@Version('2')
40+
@Get('override')
41+
override() {
42+
return []
43+
}
44+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { NextResponse } from "next/server"
2+
3+
// export async function GET() {
4+
// return NextResponse.json({ shouldNotAppear: true })
5+
// }
6+
7+
export async function POST() {
8+
return NextResponse.json({ ok: true })
9+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { cookies, headers } from "next/headers"
2+
import { NextRequest, NextResponse } from "next/server"
3+
4+
export async function POST(request: NextRequest) {
5+
const form = await request.formData()
6+
const avatar = form.get("avatar")
7+
const cookieStore = await cookies()
8+
const session = cookieStore.get("session")
9+
const forwarded = headers().get("x-forwarded-for")
10+
11+
return NextResponse.json({ avatar, session, forwarded })
12+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import type { NextApiRequest, NextApiResponse } from "next"
2+
3+
export default function handler(req: NextApiRequest, res: NextApiResponse) {
4+
switch (req.method) {
5+
case "GET": {
6+
const { cursor } = req.query
7+
res.status(200).json({ cursor })
8+
return
9+
}
10+
case "DELETE": {
11+
const id = req.body.id
12+
res.status(204).json({ id })
13+
return
14+
}
15+
default:
16+
res.status(405).end()
17+
}
18+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import type { NextApiRequest, NextApiResponse } from "next"
2+
3+
export default function handler(req: NextApiRequest, res: NextApiResponse) {
4+
switch (req.query.type) {
5+
case "GET":
6+
res.status(200).json({ type: "query-get" })
7+
return
8+
default:
9+
res.status(200).json({ ok: true })
10+
}
11+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export default defineEventHandler((event) => {
2+
const slug = getRouterParam(event, "slug")
3+
const { tag } = getQuery(event)
4+
return { slug, tag }
5+
})
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export default defineEventHandler(async (event) => {
2+
const { username, email } = await readValidatedBody(event, z.object({}))
3+
const auth = getRequestHeader(event, "authorization")
4+
const headers = getHeaders(event)
5+
return { username, email, auth, agent: headers["user-agent"] }
6+
})

spec/functional_test/testers/javascript/nestjs_spec.cr

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,20 @@ expected_endpoints = [
2525
Endpoint.new("/protected", "GET", [
2626
Param.new("authorization", "", "header"),
2727
]),
28+
# Decorators between the route decorator and method should not hide
29+
# method params or request-object usage.
30+
Endpoint.new("/admin/reports/:id", "GET", [
31+
Param.new("id", "", "path"),
32+
Param.new("include", "", "query"),
33+
Param.new("x-token", "", "header"),
34+
]),
35+
# FileInterceptor field names are the actual upload body surface.
36+
Endpoint.new("/admin/upload", "POST", [
37+
Param.new("avatar", "", "body"),
38+
Param.new("file", "", "body"),
39+
]),
40+
# Method-level URI versioning.
41+
Endpoint.new("/v2/admin/versioned", "GET"),
2842
]
2943

3044
FunctionalTester.new("fixtures/javascript/nestjs/", {

spec/functional_test/testers/javascript/nestjs_versioning_spec.cr

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ expected_endpoints = [
1212
Param.new("body", "", "body"),
1313
]),
1414
Endpoint.new("/health", "GET"),
15+
Endpoint.new("/v2/dogs/override", "GET"),
1516
]
1617

1718
FunctionalTester.new("fixtures/javascript/nestjs_versioning/", {
18-
:techs => 1,
19+
:techs => 1,
20+
:endpoints => expected_endpoints.size,
1921
}, expected_endpoints).perform_tests

0 commit comments

Comments
 (0)