diff --git a/packages/next/server.d.ts b/packages/next/server.d.ts index 2099f54835e10..70b0c0cd9e294 100644 --- a/packages/next/server.d.ts +++ b/packages/next/server.d.ts @@ -11,3 +11,9 @@ export { NextMiddleware } from 'next/dist/server/web/types' export { userAgentFromString } from 'next/dist/server/web/spec-extension/user-agent' export { userAgent } from 'next/dist/server/web/spec-extension/user-agent' export { URLPattern } from 'next/dist/compiled/@edge-runtime/primitives/url' +export { RequestCookies } from 'next/dist/server/web/spec-extension/cookies/request-cookies' +export { ResponseCookies } from 'next/dist/server/web/spec-extension/cookies/response-cookies' +export { + RequestCookie, + ResponseCookie, +} from 'next/dist/server/web/spec-extension/cookies/types' diff --git a/packages/next/server.js b/packages/next/server.js index 53325c11e290c..ada5455db6545 100644 --- a/packages/next/server.js +++ b/packages/next/server.js @@ -7,6 +7,12 @@ const serverExports = { .userAgentFromString, userAgent: require('next/dist/server/web/spec-extension/user-agent') .userAgent, + RequestCookies: + require('next/dist/server/web/spec-extension/cookies/request-cookies') + .RequestCookies, + ResponseCookies: + require('next/dist/server/web/spec-extension/cookies/response-cookies') + .ResponseCookies, } if (typeof URLPattern !== 'undefined') { @@ -24,3 +30,5 @@ exports.NextResponse = serverExports.NextResponse exports.userAgentFromString = serverExports.userAgentFromString exports.userAgent = serverExports.userAgent exports.URLPattern = serverExports.URLPattern +exports.RequestCookies = serverExports.RequestCookies +exports.ResponseCookies = serverExports.ResponseCookies diff --git a/test/integration/typescript/pages/api/edge.ts b/test/integration/typescript/pages/api/edge.ts new file mode 100644 index 0000000000000..438125d6af567 --- /dev/null +++ b/test/integration/typescript/pages/api/edge.ts @@ -0,0 +1,36 @@ +import { + NextRequest, + NextResponse, + RequestCookie, + RequestCookies, + ResponseCookie, + ResponseCookies, +} from 'next/server' + +export const config = { + runtime: 'experimental-edge', +} + +const AsyncApiEndpoint = async (req: NextRequest) => { + // Test cookies type + const cookies: RequestCookies = req.cookies + + const res = new NextResponse() + + const resCookies: ResponseCookies = res.cookies + + const cookie: RequestCookie = { name: 'foo', value: 'bar' } + + req.cookies.set(cookie) + + const resCookie: ResponseCookie = { name: 'foo', value: 'bar' } + + res.cookies.set(resCookie) + + return NextResponse.json({ + RequestCookies: cookies instanceof RequestCookies, + ResponseCookies: resCookies instanceof ResponseCookies, + }) +} + +export default AsyncApiEndpoint diff --git a/test/integration/typescript/test/index.test.js b/test/integration/typescript/test/index.test.js index 3268404f6c7d5..a22e887f9751f 100644 --- a/test/integration/typescript/test/index.test.js +++ b/test/integration/typescript/test/index.test.js @@ -64,6 +64,13 @@ describe('TypeScript Features', () => { expect($('#imported-value').text()).toBe('OK') }) + it('should handle edge api route and req cookies', async () => { + const data = JSON.parse(await renderViaHTTP(appPort, '/api/edge')) + + expect(data.RequestCookies).toBe(true) + expect(data.ResponseCookies).toBe(true) + }) + // old behavior: it.skip('should report type checking to stdout', async () => { expect(output).toContain('waiting for typecheck results...')