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..0a54d0e --- /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.toBeAssignableFrom({}) + +expect().type.toBeAssignableFrom({ + defaultStoreValues: { a: 'dummy' }, +}) + +expect().type.toBeAssignableFrom({ + hook: 'preValidation' as const, + defaultStoreValues: { a: 'dummy' }, +}) + +expect().type.toBeAssignableFrom({ + defaultStoreValues: () => ({ + a: 'dummy', + }), +}) + +expect().type.not.toBeAssignableFrom({ + defaultStoreValues: { bar: 'dummy' }, +}) + +expect().type.not.toBeAssignableFrom({ + defaultStoreValues: { log: 'dummy' }, +}) + +expect().type.toBeAssignableFrom(() => ({ + a: 'dummy', +})) + +expect().type.toBeAssignableFrom({ + defaultStoreValues: (req: FastifyRequest) => ({ + log: req.log.child({ childLog: true }), + }), +}) + +expect().type.toBeAssignableFrom((req: FastifyRequest) => ({ + log: req.log.child({ childLog: true }), +})) + +expect().type.not.toBeAssignableFrom(() => ({ bar: 'dummy' })) + +expect().type.not.toBeAssignableFrom(() => ({ log: 'dummy' })) + +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().type.not.toBeAssignableFrom({ + defaultStoreValues: { a: undefined }, +})