From 2209445364fc77b6227c69cfea932804b513077b Mon Sep 17 00:00:00 2001 From: Tony133 Date: Mon, 27 Apr 2026 11:08:22 +0200 Subject: [PATCH] refactor(types): migrate from tsd to tstyche --- package.json | 9 +-- types/index.test-d.ts | 147 ----------------------------------- types/index.tst.ts | 173 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 153 deletions(-) delete mode 100644 types/index.test-d.ts create mode 100644 types/index.tst.ts diff --git a/package.json b/package.json index d8062e2..0fb2cdc 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "lint:fix": "eslint --fix", "lint:typescript": "npm run lint:fix - --parser @typescript-eslint/parser --plugin typescript \"test/types/*.ts\"", "test": "npm run lint && borp -C --check-coverage && npm run typescript", - "typescript": "tsd" + "typescript": "tstyche" }, "repository": { "type": "git", @@ -72,8 +72,8 @@ "pino-test": "^2.0.0", "socket.io": "^4.8.1", "socket.io-client": "^4.8.1", - "tsd": "^0.33.0", "typescript": "~6.0.2", + "tstyche": "^7.0.0", "why-is-node-running": "^3.2.2" }, "dependencies": { @@ -82,10 +82,7 @@ "fastify-plugin": "^5.1.0", "ws": "^8.18.3" }, - "tsd": { - "directory": "test/types" - }, "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/types/index.test-d.ts b/types/index.test-d.ts deleted file mode 100644 index 0e335d9..0000000 --- a/types/index.test-d.ts +++ /dev/null @@ -1,147 +0,0 @@ -import fastify, { - RawReplyDefaultExpression, - RawRequestDefaultExpression, - type FastifyRequest, - type RawServerBase, - type RequestGenericInterface, -} from 'fastify' -import { expectType } from 'tsd' -import fastifyHttpProxy from '..' - -const app = fastify() - -app.register(fastifyHttpProxy, { - upstream: 'http://origin.asd', -}) - -app.register(fastifyHttpProxy, { - upstream: 'http://origin.asd', - prefix: '/auth', - rewritePrefix: '/u', - http2: false, - config: { key: 1 }, - replyOptions: { contentType: 'application/json' }, - httpMethods: ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT', 'OPTIONS'], - preHandler: (request, reply) => { - expectType(request.raw) - expectType(reply.raw) - expectType<(url: string, params?: unknown, prefix?: string) => { url: string; options: unknown }>(reply.fromParameters) - }, - beforeHandler: (request, reply) => { - expectType(request.raw) - expectType(reply.raw) - expectType<(url: string, params?: unknown, prefix?: string) => { url: string; options: unknown }>(reply.fromParameters) - }, - preValidation: (request, reply) => { - expectType(request.raw) - expectType(reply.raw) - expectType<(url: string, params?: unknown, prefix?: string) => { url: string; options: unknown }>(reply.fromParameters) - - const result = reply.fromParameters('/') - expectType(result.options) - expectType(result.url) - }, - preRewrite: (url, params, prefix): string => { - expectType(url) - expectType(params) - expectType(prefix) - return '' - }, - base: 'whatever', - cacheURLs: 10, - undici: { - connections: 128, - pipelining: 1, - keepAliveTimeout: 60 * 1000, - connect: { - rejectUnauthorized: false, - }, - }, - http: { - agentOptions: { - keepAliveMsecs: 10 * 60 * 1000, - }, - requestOptions: { - timeout: 20000, - }, - }, - constraints: { version: '1.0.2' }, - websocket: true, - wsUpstream: 'ws://origin.asd/connection', - wsClientOptions: { - queryString (search, reqUrl, request) { - expectType(search) - expectType(reqUrl) - expectType>(request) - return '' - }, - }, - wsHooks: { - onConnect: (context, source, target) => { - expectType<{ log: import('pino').Logger }>(context) - expectType(source) - expectType(target) - }, - onDisconnect: (context, source) => { - expectType<{ log: import('pino').Logger }>(context) - expectType(source) - }, - onIncomingMessage: (context, source, target, message) => { - expectType<{ log: import('pino').Logger }>(context) - expectType(source) - expectType(target) - expectType<{ data: Buffer | ArrayBuffer | Buffer[], binary: boolean }>(message) - }, - onOutgoingMessage: (context, source, target, message) => { - expectType<{ log: import('pino').Logger }>(context) - expectType(source) - expectType(target) - expectType<{ data: Buffer | ArrayBuffer | Buffer[], binary: boolean }>(message) - }, - onPong: (context, source, target) => { - expectType<{ log: import('pino').Logger }>(context) - expectType(source) - expectType(target) - }, - onReconnect: (context, source, target) => { - expectType<{ log: import('pino').Logger }>(context) - expectType(source) - expectType(target) - } - }, - wsReconnect: { - pingInterval: 3000, - reconnectInterval: 1000, - reconnectDecay: 1.5, - maxReconnectionRetries: 5, - connectionTimeout: 5000, - reconnectOnClose: true, - logs: true - }, - internalRewriteLocationHeader: true, -}) - -// @ts-expect-error -app.register(fastifyHttpProxy, { - thisOptionDoesNotExist: 'triggers a typescript error', -}) - -// @ts-expect-error -app.register(fastifyHttpProxy, { - upstream: 'http://origin.asd', - wsUpstream: 'ws://origin.asd', -}) - -// @ts-expect-error -app.register(fastifyHttpProxy, { - upstream: 'http://origin.asd', - websocket: false, - wsUpstream: 'asdf', -}) - -// @ts-expect-error -app.register(fastifyHttpProxy, { - upstream: 'http://origin.asd', - websocket: false, - internalRewriteLocationHeader: 'NON_BOOLEAN_VALUE' -}) diff --git a/types/index.tst.ts b/types/index.tst.ts new file mode 100644 index 0000000..685ad94 --- /dev/null +++ b/types/index.tst.ts @@ -0,0 +1,173 @@ +import fastify, { + RawReplyDefaultExpression, + RawRequestDefaultExpression, + type FastifyRequest, + type RawServerBase, + type RequestGenericInterface, +} from 'fastify' +import { expect } from 'tstyche' +import fastifyHttpProxy from '..' + +const app = fastify() + +app.register(fastifyHttpProxy, { + upstream: 'http://origin.asd', +}) + +app.register(fastifyHttpProxy, { + upstream: 'http://origin.asd', + prefix: '/auth', + rewritePrefix: '/u', + http2: false, + config: { key: 1 }, + replyOptions: { contentType: 'application/json' }, + httpMethods: ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT', 'OPTIONS'], + preHandler: (request, reply) => { + expect(request.raw).type.toBe() + expect(reply.raw).type.toBe() + expect(reply.fromParameters).type.toBe< + ( + url: string, + params?: unknown, + prefix?: string + ) => { url: string, options: unknown } + >() + }, + beforeHandler: (request, reply) => { + expect(request.raw).type.toBe() + expect(reply.raw).type.toBe() + expect(reply.fromParameters).type.toBe< + ( + url: string, + params?: unknown, + prefix?: string + ) => { url: string, options: unknown } + >() + }, + preValidation: (request, reply) => { + expect(request.raw).type.toBe() + expect(reply.raw).type.toBe() + expect(reply.fromParameters).type.toBe< + ( + url: string, + params?: unknown, + prefix?: string + ) => { url: string, options: unknown } + >() + + const result = reply.fromParameters('/') + expect(result.options).type.toBe() + expect(result.url).type.toBe() + }, + preRewrite: (url, params, prefix): string => { + expect(url).type.toBe() + expect(params).type.toBe() + expect(prefix).type.toBe() + return '' + }, + base: 'whatever', + cacheURLs: 10, + undici: { + connections: 128, + pipelining: 1, + keepAliveTimeout: 60 * 1000, + connect: { + rejectUnauthorized: false + } + }, + http: { + agentOptions: { + keepAliveMsecs: 10 * 60 * 1000 + }, + requestOptions: { + timeout: 20000 + } + }, + constraints: { version: '1.0.2' }, + websocket: true, + wsUpstream: 'ws://origin.asd/connection', + wsClientOptions: { + queryString (search, reqUrl, request) { + expect(search).type.toBe() + expect(reqUrl).type.toBe() + expect(request).type.toBe< + FastifyRequest + >() + return '' + } + }, + wsHooks: { + onConnect: (context, source, target) => { + expect(context).type.toBe<{ log: import('pino').Logger }>() + expect(source).type.toBe() + expect(target).type.toBe() + }, + onDisconnect: (context, source) => { + expect(context).type.toBe<{ log: import('pino').Logger }>() + expect(source).type.toBe() + }, + onIncomingMessage: (context, source, target, message) => { + expect(context).type.toBe<{ log: import('pino').Logger }>() + expect(source).type.toBe() + expect(target).type.toBe() + expect(message).type.toBe<{ + data: import('ws').RawData + binary: boolean + }>() + }, + onOutgoingMessage: (context, source, target, message) => { + expect(context).type.toBe<{ log: import('pino').Logger }>() + expect(source).type.toBe() + expect(target).type.toBe() + expect(message).type.toBe<{ + data: import('ws').RawData + binary: boolean + }>() + }, + onPong: (context, source, target) => { + expect(context).type.toBe<{ log: import('pino').Logger }>() + expect(source).type.toBe() + expect(target).type.toBe() + }, + onReconnect: (context, source, target) => { + expect(context).type.toBe<{ log: import('pino').Logger }>() + expect(source).type.toBe() + expect(target).type.toBe() + } + }, + wsReconnect: { + pingInterval: 3000, + reconnectInterval: 1000, + reconnectDecay: 1.5, + maxReconnectionRetries: 5, + connectionTimeout: 5000, + reconnectOnClose: true, + logs: true + }, + internalRewriteLocationHeader: true +}) + +// @ts-expect-error: No overload matches this call +app.register(fastifyHttpProxy, { + thisOptionDoesNotExist: 'triggers a typescript error', +}) + +// @ts-expect-error: No overload matches this call +app.register(fastifyHttpProxy, { + upstream: 'http://origin.asd', + wsUpstream: 'ws://origin.asd', +}) + +// @ts-expect-error: No overload matches this call +app.register(fastifyHttpProxy, { + upstream: 'http://origin.asd', + websocket: false, + wsUpstream: 'asdf', +}) + +// @ts-expect-error: Type 'string' is not assignable to type 'boolean | undefined' +app.register(fastifyHttpProxy, { + upstream: 'http://origin.asd', + websocket: false, + internalRewriteLocationHeader: 'NON_BOOLEAN_VALUE' +})