import fastify, { FastifyInstance, FastifyReply } from 'fastify' import fastifyRateLimit from '@fastify/rate-limit' import fastifySensible, { FastifySensibleOptions, httpErrors, HttpError } from '..' import { expect } from 'tstyche' const app: FastifyInstance = fastify() app.register(fastifySensible) app.register(fastifyRateLimit) expect().type.toBeAssignableFrom({}) expect().type.toBeAssignableFrom({ sharedSchemaId: 'HttpError' }) expect().type.toBeAssignableFrom({ sharedSchemaId: undefined }) // codeql[js/missing-rate-limiting] app.get( '/', { preHandler: app.rateLimit(), config: { rateLimit: { max: 100, timeWindow: '1 minute' } } }, (_req, reply) => { expect(reply.badRequest()).type.toBeAssignableTo() expect(reply.unauthorized()).type.toBeAssignableTo() expect(reply.paymentRequired()).type.toBeAssignableTo() expect(reply.forbidden()).type.toBeAssignableTo() expect(reply.notFound()).type.toBeAssignableTo() expect(reply.methodNotAllowed()).type.toBeAssignableTo() expect(reply.notAcceptable()).type.toBeAssignableTo() expect( reply.proxyAuthenticationRequired() ).type.toBeAssignableTo() expect(reply.requestTimeout()).type.toBeAssignableTo() expect(reply.gone()).type.toBeAssignableTo() expect(reply.lengthRequired()).type.toBeAssignableTo() expect(reply.preconditionFailed()).type.toBeAssignableTo() expect(reply.payloadTooLarge()).type.toBeAssignableTo() expect(reply.uriTooLong()).type.toBeAssignableTo() expect(reply.unsupportedMediaType()).type.toBeAssignableTo() expect(reply.rangeNotSatisfiable()).type.toBeAssignableTo() expect(reply.expectationFailed()).type.toBeAssignableTo() expect(reply.imateapot()).type.toBeAssignableTo() expect(reply.unprocessableEntity()).type.toBeAssignableTo() expect(reply.locked()).type.toBeAssignableTo() expect(reply.failedDependency()).type.toBeAssignableTo() expect(reply.tooEarly()).type.toBeAssignableTo() expect(reply.upgradeRequired()).type.toBeAssignableTo() expect(reply.preconditionFailed()).type.toBeAssignableTo() expect(reply.tooManyRequests()).type.toBeAssignableTo() expect( reply.requestHeaderFieldsTooLarge() ).type.toBeAssignableTo() expect( reply.unavailableForLegalReasons() ).type.toBeAssignableTo() expect(reply.internalServerError()).type.toBeAssignableTo() expect(reply.notImplemented()).type.toBeAssignableTo() expect(reply.badGateway()).type.toBeAssignableTo() expect(reply.serviceUnavailable()).type.toBeAssignableTo() expect(reply.gatewayTimeout()).type.toBeAssignableTo() expect( reply.httpVersionNotSupported() ).type.toBeAssignableTo() expect(reply.variantAlsoNegotiates()).type.toBeAssignableTo() expect(reply.insufficientStorage()).type.toBeAssignableTo() expect(reply.loopDetected()).type.toBeAssignableTo() expect( reply.bandwidthLimitExceeded() ).type.toBeAssignableTo() expect(reply.notExtended()).type.toBeAssignableTo() expect( reply.networkAuthenticationRequired() ).type.toBeAssignableTo() } ) app.get( '/', { preHandler: app.rateLimit(), config: { rateLimit: { max: 100, timeWindow: '1 minute' } } }, (_req, reply) => { expect( reply.getHttpError(405, 'Method Not Allowed') ).type.toBeAssignableTo() expect( reply.getHttpError('405', 'Method Not Allowed') ).type.toBeAssignableTo() } ) app.get( '/', { preHandler: app.rateLimit(), config: { rateLimit: { max: 100, timeWindow: '1 minute' } } }, () => { expect( app.httpErrors.createError(405, 'Method Not Allowed') ).type.toBeAssignableTo() } ) app.get( '/', { preHandler: app.rateLimit(), config: { rateLimit: { max: 100, timeWindow: '1 minute' } } }, () => { expect( app.httpErrors.createError(405, 'Method Not Allowed') ).type.toBeAssignableTo() expect( app.httpErrors.createError(405, 'Method Not Allowed') ).type.toBeAssignableTo() expect(app.httpErrors.badRequest()).type.toBeAssignableTo>() } ) // codeql[js/missing-rate-limiting] app.get( '/', { preHandler: app.rateLimit(), config: { rateLimit: { max: 100, timeWindow: '1 minute' } } }, async () => { expect(app.httpErrors.badRequest()).type.toBeAssignableTo>() expect(app.httpErrors.unauthorized()).type.toBeAssignableTo< HttpError<401> >() expect(app.httpErrors.paymentRequired()).type.toBeAssignableTo< HttpError<402> >() expect(app.httpErrors.forbidden()).type.toBeAssignableTo>() expect(app.httpErrors.notFound()).type.toBeAssignableTo>() expect(app.httpErrors.methodNotAllowed()).type.toBeAssignableTo< HttpError<405> >() expect(app.httpErrors.notAcceptable()).type.toBeAssignableTo< HttpError<406> >() expect(app.httpErrors.proxyAuthenticationRequired()).type.toBeAssignableTo< HttpError<407> >() expect(app.httpErrors.requestTimeout()).type.toBeAssignableTo< HttpError<408> >() expect(app.httpErrors.gone()).type.toBeAssignableTo>() expect(app.httpErrors.lengthRequired()).type.toBeAssignableTo< HttpError<411> >() expect(app.httpErrors.preconditionFailed()).type.toBeAssignableTo< HttpError<412> >() expect(app.httpErrors.payloadTooLarge()).type.toBeAssignableTo< HttpError<413> >() expect(app.httpErrors.uriTooLong()).type.toBeAssignableTo>() expect(app.httpErrors.unsupportedMediaType()).type.toBeAssignableTo< HttpError<415> >() expect(app.httpErrors.rangeNotSatisfiable()).type.toBeAssignableTo< HttpError<416> >() expect(app.httpErrors.expectationFailed()).type.toBeAssignableTo< HttpError<417> >() expect(app.httpErrors.imateapot()).type.toBeAssignableTo>() expect(app.httpErrors.unprocessableEntity()).type.toBeAssignableTo< HttpError<422> >() expect(app.httpErrors.locked()).type.toBeAssignableTo>() expect(app.httpErrors.failedDependency()).type.toBeAssignableTo< HttpError<424> >() expect(app.httpErrors.tooEarly()).type.toBeAssignableTo>() expect(app.httpErrors.upgradeRequired()).type.toBeAssignableTo< HttpError<426> >() expect(app.httpErrors.tooManyRequests()).type.toBeAssignableTo< HttpError<429> >() expect(app.httpErrors.requestHeaderFieldsTooLarge()).type.toBeAssignableTo< HttpError<431> >() expect(app.httpErrors.unavailableForLegalReasons()).type.toBeAssignableTo< HttpError<451> >() expect(app.httpErrors.internalServerError()).type.toBeAssignableTo< HttpError<500> >() expect(app.httpErrors.notImplemented()).type.toBeAssignableTo< HttpError<501> >() expect(app.httpErrors.badGateway()).type.toBeAssignableTo>() expect(app.httpErrors.serviceUnavailable()).type.toBeAssignableTo< HttpError<503> >() expect(app.httpErrors.gatewayTimeout()).type.toBeAssignableTo< HttpError<504> >() expect(app.httpErrors.httpVersionNotSupported()).type.toBeAssignableTo< HttpError<505> >() expect(app.httpErrors.variantAlsoNegotiates()).type.toBeAssignableTo< HttpError<506> >() expect(app.httpErrors.insufficientStorage()).type.toBeAssignableTo< HttpError<507> >() expect(app.httpErrors.loopDetected()).type.toBeAssignableTo< HttpError<508> >() expect(app.httpErrors.bandwidthLimitExceeded()).type.toBeAssignableTo< HttpError<509> >() expect(app.httpErrors.notExtended()).type.toBeAssignableTo< HttpError<510> >() expect( app.httpErrors.networkAuthenticationRequired() ).type.toBeAssignableTo>() } ) app.get('/', async () => { expect(app.assert).type.not.toBeCallableWith(true) expect(app.assert(1, 400, 'Bad number')).type.toBe() expect(app.assert.ok(true, 400)).type.toBe() expect(app.assert.equal(1, 1, 400)).type.toBe() expect(app.assert.notEqual(1, 2, 400)).type.toBe() expect(app.assert.strictEqual(1, 1, 400)).type.toBe() expect(app.assert.notStrictEqual(1, 2, 400)).type.toBe() expect(app.assert.deepEqual({}, {}, 400)).type.toBe() expect(app.assert.notDeepEqual({}, { a: 1 }, 400)).type.toBe() }) app.get('/', async () => { expect(app.to(new Promise((resolve) => resolve()))).type.toBe< Promise<[Error, void]> >() }) app.get('/', (_req, reply) => { expect(reply.cacheControl('public')).type.toBeAssignableTo() }) app.get('/', (_req, reply) => { expect(reply.preventCache()).type.toBeAssignableTo() }) app.get('/', (_req, reply) => { expect( reply.cacheControl('max-age', 42) ).type.toBeAssignableTo() }) app.get('/', (_req, reply) => { expect(reply.cacheControl).type.not.toBeCallableWith('foobar') }) app.get('/', (_req, reply) => { expect( reply.stale('while-revalidate', 42) ).type.toBeAssignableTo() }) app.get('/', async (_req, reply) => { expect(reply.vary('test')).type.toBe() expect(reply.vary(['test'])).type.toBe() expect(reply.vary.append('X-Header', 'field1')).type.toBe() expect(reply.vary.append('X-Header', ['field1'])).type.toBe() }) app.get('/', async (req) => { expect(req.forwarded()).type.toBe() expect(req.is(['foo', 'bar'])).type.toBe() expect(req.is('foo', 'bar')).type.toBe() }) httpErrors.forbidden('This type should be also available') httpErrors.createError('MyError')