import cookie from '../plugin'; import { expectType } from 'tsd'; import * as fastifyCookieStar from '..'; import fastifyCookieCjsImport = require('..'); import fastifyCookieDefault, { fastifyCookie as fastifyCookieNamed } from '..'; import fastify, { FastifyInstance, FastifyReply, setCookieWrapper } from 'fastify'; const fastifyCookieCjs = require('..'); const app: FastifyInstance = fastify(); app.register(fastifyCookieNamed); app.register(fastifyCookieDefault); app.register(fastifyCookieCjs); app.register(fastifyCookieCjsImport.default); app.register(fastifyCookieCjsImport.fastifyCookie); app.register(fastifyCookieStar.default); app.register(fastifyCookieStar.fastifyCookie); expectType(fastifyCookieNamed); expectType(fastifyCookieDefault); expectType(fastifyCookieCjsImport.default); expectType(fastifyCookieCjsImport.fastifyCookie); expectType(fastifyCookieStar.default); expectType( fastifyCookieStar.fastifyCookie ); expectType(fastifyCookieCjs); expectType(fastifyCookieDefault.sign); expectType(fastifyCookieDefault.unsign); expectType(fastifyCookieDefault.signerFactory ); expectType(fastifyCookieNamed.sign); expectType(fastifyCookieNamed.unsign); expectType(fastifyCookieNamed.signerFactory ); const server = fastify(); server.register(cookie); server.after((_err) => { expectType<{ [key: string]: string }>( // See https://github.com/fastify/fastify-cookie#manual-cookie-parsing server.parseCookie('sessionId=aYb4uTIhdBXC') ); server.get('/', (request, reply) => { const test = request.cookies.test; expectType(test); expectType(reply.cookie); expectType(reply.setCookie); expectType( reply .setCookie('test', test!, { domain: 'example.com', path: '/' }) .clearCookie('foo') .send({ hello: 'world' }) ); }); }); const serverWithHttp2 = fastify({ http2: true }); serverWithHttp2.register(cookie); serverWithHttp2.after(() => { serverWithHttp2.get('/', (request, reply) => { const test = request.cookies.test; reply .setCookie('test', test!, { domain: 'example.com', path: '/' }) .clearCookie('foo') .send({ hello: 'world' }); }); }); const testSamesiteOptionsApp = fastify(); testSamesiteOptionsApp.register(cookie); testSamesiteOptionsApp.after(() => { server.get('/test-samesite-option-true', (request, reply) => { const test = request.cookies.test; reply.setCookie('test', test!, { sameSite: true }).send({ hello: 'world' }); }); server.get('/test-samesite-option-false', (request, reply) => { const test = request.cookies.test; reply.setCookie('test', test!, { sameSite: false }).send({ hello: 'world' }); }); server.get('/test-samesite-option-lax', (request, reply) => { const test = request.cookies.test; reply.setCookie('test', test!, { sameSite: 'lax' }).send({ hello: 'world' }); }); server.get('/test-samesite-option-strict', (request, reply) => { const test = request.cookies.test; reply .setCookie('test', test!, { sameSite: 'strict' }) .send({ hello: 'world' }); }); server.get('/test-samesite-option-none', (request, reply) => { const test = request.cookies.test; reply .setCookie('test', test!, { sameSite: 'none' }) .send({ hello: 'world' }); }); }); const appWithImplicitHttpSigned = fastify(); appWithImplicitHttpSigned.register(cookie, { secret: 'testsecret', }); appWithImplicitHttpSigned.register(cookie, { secret: 'testsecret', algorithm: 'sha512' }); appWithImplicitHttpSigned.after(() => { server.get('/', (request, reply) => { appWithImplicitHttpSigned.unsignCookie(request.cookies.test!); appWithImplicitHttpSigned.unsignCookie('test'); reply.unsignCookie(request.cookies.test!); reply.unsignCookie('test'); request.unsignCookie(request.cookies.anotherTest!); request.unsignCookie('anotherTest'); reply.send({ hello: 'world' }); }); }); const appWithRotationSecret = fastify(); appWithRotationSecret.register(cookie, { secret: ['testsecret'], }); appWithRotationSecret.after(() => { server.get('/', (request, reply) => { reply.unsignCookie(request.cookies.test!); const { valid, renew, value } = reply.unsignCookie('test'); expectType(valid); expectType(renew); expectType(value); reply.send({ hello: 'world' }); }); }); const appWithParseOptions = fastify(); const parseOptions: fastifyCookieStar.CookieSerializeOptions = { domain: 'example.com', encode: (value: string) => value, expires: new Date(), httpOnly: true, maxAge: 3600, path: '/', sameSite: 'lax', secure: true, signed: true, }; expectType(parseOptions); appWithParseOptions.register(cookie, { secret: 'testsecret', parseOptions, }); appWithParseOptions.after(() => { server.get('/', (request, reply) => { const { valid, renew, value } = reply.unsignCookie(request.cookies.test!); expectType(valid); expectType(renew); expectType(value); }); }); const appWithCustomSigner = fastify() appWithCustomSigner.register(cookie, { secret: { sign: (x) => x + '.signed', unsign: (x) => { if (x.endsWith('.signed')) { return { renew: false, valid: true, value: x.slice(0, -7) } } return { renew: false, valid: false, value: null } } } }) appWithCustomSigner.after(() => { server.get('/', (request, reply) => { reply.unsignCookie(request.cookies.test!) const { valid, renew, value } = reply.unsignCookie('test') expectType(valid) expectType(renew) expectType(value) reply.send({ hello: 'world' }) }) }) new fastifyCookieStar.Signer('secretString') new fastifyCookieStar.Signer(['secretStringInArray']) const signer = new fastifyCookieStar.Signer(['secretStringInArray'], 'sha256') signer.sign('Lorem Ipsum') signer.unsign('Lorem Ipsum')