From a52f590cbcc498c629f5f4df5273d20fbabfa8cb Mon Sep 17 00:00:00 2001 From: Tony133 Date: Sun, 26 Apr 2026 21:41:55 +0200 Subject: [PATCH 1/3] refactor(types): migrate from tsd to tstyche --- package.json | 6 +-- tsconfig.json | 10 +++-- types/index.test-d.ts | 84 ----------------------------------------- types/index.tst.ts | 88 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 91 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 87dd14c..04b102c 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "scripts": { "test": "npm run test:unit && npm run test:typescript", "test:unit": "c8 --100 node --test", - "test:typescript": "tsd", + "test:typescript": "tstyche", "lint": "eslint", "lint:fix": "eslint --fix" }, @@ -29,7 +29,7 @@ "fastify": "^5.0.0", "neostandard": "^0.13.0", "superagent": "^10.0.0", - "tsd": "^0.33.0" + "tstyche": "^7.0.0" }, "homepage": "http://github.com/fastify/fastify-request-context", "funding": [ @@ -71,4 +71,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 831e273..d67a670 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,14 @@ { "compilerOptions": { "outDir": "dist", - "module": "commonjs", + "rootDir": ".", + "module": "node16", "target": "es2022", "sourceMap": true, "declaration": true, "declarationMap": false, - "types": ["node"], "strict": true, - "moduleResolution": "node", + "moduleResolution": "node16", "noUnusedLocals": false, "noUnusedParameters": false, "noFallthroughCasesInSwitch": true, @@ -20,7 +20,9 @@ "allowSyntheticDefaultImports": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "exactOptionalPropertyTypes": true + "exactOptionalPropertyTypes": true, + "types": ["node"] }, + "include": ["types/**/*", "index.d.ts"], "exclude": ["node_modules", "test", "dist"] } diff --git a/types/index.test-d.ts b/types/index.test-d.ts deleted file mode 100644 index 2240d8a..0000000 --- a/types/index.test-d.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - requestContext, - asyncLocalStorage, - fastifyRequestContext, - FastifyRequestContextOptions, - RequestContext, - RequestContextDataFactory, -} from '..' -import { expectAssignable, expectType, expectError } from 'tsd' -import { FastifyBaseLogger, FastifyInstance, RouteHandlerMethod } from 'fastify' -import { AsyncLocalStorage } from 'node:async_hooks' - -const fastify = require('fastify') - -const app: FastifyInstance = fastify() -app.register(fastifyRequestContext) - -declare module './index' { - interface RequestContextData { - a?: string - log?: FastifyBaseLogger - } -} - -expectAssignable({}) -expectAssignable({ - defaultStoreValues: { a: 'dummy' }, -}) -expectAssignable({ - hook: 'preValidation', - defaultStoreValues: { a: 'dummy' }, -}) -expectAssignable({ - defaultStoreValues: () => ({ - a: 'dummy', - }), -}) - -expectError({ - defaultStoreValues: { bar: 'dummy' }, -}) - -expectError({ - defaultStoreValues: { log: 'dummy' }, -}) - -expectAssignable(() => ({ - a: 'dummy', -})) - -expectAssignable({ - defaultStoreValues: (req) => ({ - log: req.log.child({ childLog: true }), - }), -}) - -expectAssignable((req) => ({ - log: req.log.child({ childLog: true }), -})) - -expectError(() => ({ bar: 'dummy' })) -expectError(() => ({ log: 'dummy' })) - -expectType(app.requestContext) -expectType(requestContext) -expectType>(asyncLocalStorage) - -const getHandler: RouteHandlerMethod = function (request, _reply) { - expectType(request.requestContext) -} -expectType(getHandler) - -expectType(requestContext.get('a')) -expectType(requestContext.get('log')) - -expectError(requestContext.get('bar')) - -// Test exactOptionalPropertyTypes: true - -requestContext.set('a', undefined) // Should not error -expectError(requestContext.set('a', 123)) -expectError({ - defaultStoreValues: { a: undefined }, -}) diff --git a/types/index.tst.ts b/types/index.tst.ts new file mode 100644 index 0000000..518b7e5 --- /dev/null +++ b/types/index.tst.ts @@ -0,0 +1,88 @@ +import { + requestContext, + asyncLocalStorage, + fastifyRequestContext, + FastifyRequestContextOptions, + RequestContext, + RequestContextDataFactory, +} from '..' +import { expect } from 'tstyche' +import { fastify, FastifyBaseLogger, FastifyInstance, RouteHandlerMethod, FastifyRequest } from 'fastify' +import { AsyncLocalStorage } from 'node:async_hooks' + +const app: FastifyInstance = fastify() +app.register(fastifyRequestContext) + +declare module '..' { + interface RequestContextData { + a?: string + log?: FastifyBaseLogger + } +} + +expect({}).type.toBeAssignableTo() + +expect({ + defaultStoreValues: { a: 'dummy' }, +}).type.toBeAssignableTo() + +expect({ + hook: 'preValidation' as const, + defaultStoreValues: { a: 'dummy' }, +}).type.toBeAssignableTo() + +expect({ + defaultStoreValues: () => ({ + a: 'dummy', + }), +}).type.toBeAssignableTo() + +expect({ + defaultStoreValues: { bar: 'dummy' }, +}).type.not.toBeAssignableTo() + +expect({ + defaultStoreValues: { log: 'dummy' }, +}).type.not.toBeAssignableTo() + +expect(() => ({ + a: 'dummy', +})).type.toBeAssignableTo() + +expect({ + defaultStoreValues: (req: FastifyRequest) => ({ + log: req.log.child({ childLog: true }), + }), +}).type.toBeAssignableTo() + +expect((req: FastifyRequest) => ({ + log: req.log.child({ childLog: true }), +})).type.toBeAssignableTo() + +expect(() => ({ bar: 'dummy' })).type.not.toBeAssignableTo() + +expect(() => ({ log: 'dummy' })).type.not.toBeAssignableTo() + +expect(app.requestContext).type.toBe() +expect(requestContext).type.toBe() +expect(asyncLocalStorage).type.toBe>() + +const getHandler: RouteHandlerMethod = function (request, _reply) { + expect(request.requestContext).type.toBe() +} +expect(getHandler).type.toBe() + +expect(requestContext.get('a')).type.toBe() +expect(requestContext.get('log')).type.toBe() + +// @ts-expect-error: Argument of type '"bar"' is not assignable +requestContext.get('bar') + +requestContext.set('a', undefined) + +// @ts-expect-error: Argument of type 'number' is not assignable +requestContext.set('a', 123) + +expect({ + defaultStoreValues: { a: undefined }, +}).type.not.toBeAssignableTo() From 6e358c5104b941e2029f582b0f32b369791225f8 Mon Sep 17 00:00:00 2001 From: Antonio Tripodi Date: Mon, 27 Apr 2026 08:53:08 +0200 Subject: [PATCH 2/3] chore: update index.tst.ts Co-authored-by: Tom Mrazauskas Signed-off-by: Antonio Tripodi --- types/index.tst.ts | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/types/index.tst.ts b/types/index.tst.ts index 518b7e5..7f0a2a2 100644 --- a/types/index.tst.ts +++ b/types/index.tst.ts @@ -20,48 +20,48 @@ declare module '..' { } } -expect({}).type.toBeAssignableTo() +expect().type.toBeAssignableFrom({}) -expect({ +expect().type.toBeAssignableFrom({ defaultStoreValues: { a: 'dummy' }, -}).type.toBeAssignableTo() +}) -expect({ +expect().type.toBeAssignableFrom({ hook: 'preValidation' as const, defaultStoreValues: { a: 'dummy' }, -}).type.toBeAssignableTo() +}) -expect({ +expect().type.toBeAssignableFrom({ defaultStoreValues: () => ({ a: 'dummy', }), -}).type.toBeAssignableTo() +}) -expect({ +expect().type.not.toBeAssignableFrom({ defaultStoreValues: { bar: 'dummy' }, -}).type.not.toBeAssignableTo() +}) -expect({ +expect().type.not.toBeAssignableFrom({ defaultStoreValues: { log: 'dummy' }, -}).type.not.toBeAssignableTo() +}) -expect(() => ({ +expect().type.toBeAssignableFrom(() => ({ a: 'dummy', -})).type.toBeAssignableTo() +})) -expect({ +expect().type.toBeAssignableFrom({ defaultStoreValues: (req: FastifyRequest) => ({ log: req.log.child({ childLog: true }), }), -}).type.toBeAssignableTo() +}) -expect((req: FastifyRequest) => ({ +expect().type.toBeAssignableFrom((req: FastifyRequest) => ({ log: req.log.child({ childLog: true }), -})).type.toBeAssignableTo() +})) -expect(() => ({ bar: 'dummy' })).type.not.toBeAssignableTo() +expect().type.not.toBeAssignableFrom(() => ({ bar: 'dummy' })) -expect(() => ({ log: 'dummy' })).type.not.toBeAssignableTo() +expect().type.not.toBeAssignableFrom(() => ({ log: 'dummy' })) expect(app.requestContext).type.toBe() expect(requestContext).type.toBe() From 130a50708675e42d44babd949bfa82ba28e057d4 Mon Sep 17 00:00:00 2001 From: Antonio Tripodi Date: Mon, 27 Apr 2026 08:56:35 +0200 Subject: [PATCH 3/3] chore: update index.tst.ts Co-authored-by: Tom Mrazauskas Signed-off-by: Antonio Tripodi --- types/index.tst.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/types/index.tst.ts b/types/index.tst.ts index 7f0a2a2..0a54d0e 100644 --- a/types/index.tst.ts +++ b/types/index.tst.ts @@ -83,6 +83,6 @@ requestContext.set('a', undefined) // @ts-expect-error: Argument of type 'number' is not assignable requestContext.set('a', 123) -expect({ +expect().type.not.toBeAssignableFrom({ defaultStoreValues: { a: undefined }, -}).type.not.toBeAssignableTo() +})