import { expectType } from 'tsd' import Router from '../../' import { Http2ServerRequest, Http2ServerResponse } from 'http2' import { IncomingMessage, ServerResponse } from 'http' let http1Req!: IncomingMessage; let http1Res!: ServerResponse; let http2Req!: Http2ServerRequest; let http2Res!: Http2ServerResponse; // HTTP1 { let handler: Router.Handler const router = Router({ ignoreTrailingSlash: true, ignoreDuplicateSlashes: true, allowUnsafeRegex: false, caseSensitive: false, maxParamLength: 42, defaultRoute (http1Req, http1Res) {}, onBadUrl (path, http1Req, http1Res) {}, constraints: { foo: { name: 'foo', mustMatchWhenDerived: true, storage () { return { get (version) { return handler }, set (version, handler) {} } }, deriveConstraint(req) { return '1.0.0' }, validate(value) { if (typeof value === "string") { throw new Error("invalid")} } } } }) expectType>(router) expectType(router.on('GET', '/', () => {})) expectType(router.on(['GET', 'POST'], '/', () => {})) expectType(router.on('GET', '/', { constraints: { version: '1.0.0' }}, () => {})) expectType(router.on('GET', '/', () => {}, {})) expectType(router.on('GET', '/', {constraints: { version: '1.0.0' }}, () => {}, {})) expectType(router.get('/', () => {})) expectType(router.get('/', { constraints: { version: '1.0.0' }}, () => {})) expectType(router.get('/', () => {}, {})) expectType(router.get('/', { constraints: { version: '1.0.0' }}, () => {}, {})) expectType(router.off('GET', '/')) expectType(router.off(['GET', 'POST'], '/')) expectType(router.lookup(http1Req, http1Res)) expectType | null>(router.find('GET', '/')) expectType | null>(router.find('GET', '/', {})) expectType | null>(router.find('GET', '/', {version: '1.0.0'})) expectType | null>(router.findRoute('GET', '/')); expectType | null>(router.findRoute('GET', '/', {})); expectType | null>(router.findRoute('GET', '/', {version: '1.0.0'})); expectType(router.reset()) expectType(router.prettyPrint()) expectType(router.prettyPrint({ method: 'GET' })) expectType(router.prettyPrint({ commonPrefix: false })) expectType(router.prettyPrint({ commonPrefix: true })) expectType(router.prettyPrint({ includeMeta: true })) expectType(router.prettyPrint({ includeMeta: ['test', Symbol('test')] })) } // HTTP2 { const constraints: { [key: string]: Router.ConstraintStrategy } = { foo: { name: 'foo', mustMatchWhenDerived: true, storage () { return { get (version) { return handler }, set (version, handler) {} } }, deriveConstraint(req) { return '1.0.0' }, validate(value) { if (typeof value === "string") { throw new Error("invalid")} } } } let handler: Router.Handler const router = Router({ ignoreTrailingSlash: true, ignoreDuplicateSlashes: true, allowUnsafeRegex: false, caseSensitive: false, maxParamLength: 42, defaultRoute (http1Req, http1Res) {}, onBadUrl (path, http1Req, http1Res) {}, constraints }) expectType>(router) expectType(router.on('GET', '/', () => {})) expectType(router.on(['GET', 'POST'], '/', () => {})) expectType(router.on('GET', '/', { constraints: { version: '1.0.0' }}, () => {})) expectType(router.on('GET', '/', () => {}, {})) expectType(router.on('GET', '/', { constraints: { version: '1.0.0' }}, () => {}, {})) expectType(router.addConstraintStrategy(constraints.foo)) expectType(router.get('/', () => {})) expectType(router.get('/', { constraints: { version: '1.0.0' }}, () => {})) expectType(router.get('/', () => {}, {})) expectType(router.get('/', { constraints: { version: '1.0.0' }}, () => {}, {})) expectType(router.off('GET', '/')) expectType(router.off(['GET', 'POST'], '/')) expectType(router.lookup(http2Req, http2Res)) expectType | null>(router.find('GET', '/', {})) expectType | null>(router.find('GET', '/', {version: '1.0.0', host: 'fastify.io'})) expectType(router.reset()) expectType(router.prettyPrint()) } // Custom Constraint { let handler: Router.Handler interface AcceptAndContentType { accept?: string, contentType?: string } const customConstraintWithObject: Router.ConstraintStrategy = { name: "customConstraintWithObject", deriveConstraint(req: Router.Req, ctx: Context | undefined): AcceptAndContentType { return { accept: req.headers.accept, contentType: req.headers["content-type"] } }, validate(value: unknown): void {}, storage () { return { get (version) { return handler }, set (version, handler) {} } } } const storageWithObject = customConstraintWithObject.storage() const acceptAndContentType: AcceptAndContentType = { accept: 'application/json', contentType: 'application/xml' } expectType(customConstraintWithObject.deriveConstraint(http1Req, http1Res)) expectType | null>(storageWithObject.get(acceptAndContentType)); expectType(storageWithObject.set(acceptAndContentType, () => {})); const customConstraintWithDefault: Router.ConstraintStrategy = { name: "customConstraintWithObject", deriveConstraint(req: Router.Req, ctx: Context | undefined): string { return req.headers.accept ?? '' }, storage () { return { get (version) { return handler }, set (version, handler) {} } } } const storageWithDefault = customConstraintWithDefault.storage() expectType(customConstraintWithDefault.deriveConstraint(http1Req, http1Res)) expectType | null>(storageWithDefault.get('')); expectType(storageWithDefault.set('', () => {})); }