From 08542b2e07792d0827fe6e0a12d46c27f4d4a70d Mon Sep 17 00:00:00 2001 From: edu-muller <45678020+edu-muller@users.noreply.github.com> Date: Thu, 14 Aug 2025 23:02:54 -0300 Subject: [PATCH] fix: enable strict compilerOption to prevent errors when importing lib --- index.ts | 2 +- src/socket-io.service.ts | 46 ++++++++++++++++++++++++++-------------- tsconfig.json | 3 +-- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/index.ts b/index.ts index 2beb6d2..1c14ed5 100644 --- a/index.ts +++ b/index.ts @@ -1,5 +1,5 @@ export { SocketIoModule, SOCKET_CONFIG_TOKEN, provideSocketIo } from './src/socket-io.module'; export { SocketIoConfig } from './src/config/socket-io.config'; export { WrappedSocket as Socket } from './src/socket-io.service'; -export type { AllButLast, First, FirstArg, Last } from './src/socket-io.service'; +export type { AllButLast, DecorateAcknowledgements, First, FirstArg, Last } from './src/socket-io.service'; export type { DefaultEventsMap, EventNames, EventParams, EventsMap, ReservedOrUserEventNames, ReservedOrUserListener } from '@socket.io/component-emitter'; \ No newline at end of file diff --git a/src/socket-io.service.ts b/src/socket-io.service.ts index 8dbda87..d33362b 100644 --- a/src/socket-io.service.ts +++ b/src/socket-io.service.ts @@ -20,6 +20,16 @@ export type IoSocket< EmitEvents extends EventsMap = ListenEvents, > = Socket; // socket.io-client internal types for emitWithAck +type PrependTimeoutError = { + [K in keyof T]: T[K] extends (...args: infer Params) => infer Result + ? (err: Error, ...args: Params) => Result + : T[K]; +}; +export type DecorateAcknowledgements = { + [K in keyof E]: E[K] extends (...args: infer Params) => infer Result + ? (...args: PrependTimeoutError) => Result + : E[K]; +}; export type First = T extends [infer F, ...infer L] ? F : any; export type Last = T extends [...infer H, infer L] ? L : any; export type AllButLast = T extends [...infer H, infer L] ? H : any[]; @@ -42,22 +52,24 @@ interface SocketReservedEvents { ) => void; } -type IgnoredWrapperEvents = 'receiveBuffer' | 'sendBuffer'; +type IgnoredWrapperEvents = 'receiveBuffer' | 'sendBuffer' | 'timeout'; -type WrappedSocketIface = { - [K in Exclude]: IoSocket[K] extends ( - ...args: any[] - ) => IoSocket - ? (...args: Parameters) => Wrapper // chainable methods on().off().emit()... - : IoSocket[K] extends IoSocket - ? Wrapper // ie: volatile is a getter - : IoSocket[K]; -}; +type WrappedSocketIface = Wrapper extends WrappedSocket + ? { + [K in Exclude, IgnoredWrapperEvents>]: IoSocket[K] extends ( + ...args: any[] + ) => IoSocket + ? (...args: Parameters[K]>) => Wrapper // chainable methods on().off().emit()... + : IoSocket[K] extends IoSocket + ? Wrapper // ie: volatile is a getter + : IoSocket[K]; + } + : never; export class WrappedSocket< ListenEvents extends EventsMap = DefaultEventsMap, EmitEvents extends EventsMap = ListenEvents, -> implements WrappedSocketIface { +> implements WrappedSocketIface> { private readonly subscribersCounter: Partial, number>> = {}; private readonly eventObservables$: Partial, Observable>> = {}; private readonly namespaces: Record = {}; @@ -96,12 +108,12 @@ export class WrappedSocket< } /** alias to connect */ - get open(): WrappedSocket['connect'] { + get open(): WrappedSocket['connect'] { return this.connect; } /** alias to disconnect */ - get close(): WrappedSocket['disconnect'] { + get close(): WrappedSocket['disconnect'] { return this.disconnect; } @@ -171,8 +183,8 @@ export class WrappedSocket< return this; } - send(..._args: any[]): this { - this.ioSocket.send.apply(this.ioSocket, arguments); + send(...args: any[]): this { + this.ioSocket.send(...args); return this; } @@ -297,7 +309,9 @@ export class WrappedSocket< return this; } - timeout(value: number): this { + timeout( + value: number + ): WrappedSocket> { this.ioSocket.timeout(value); return this; } diff --git a/tsconfig.json b/tsconfig.json index 4cb1914..0b0daef 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,8 +4,7 @@ "declaration": true, "stripInternal": true, "experimentalDecorators": true, - "strictNullChecks": true, - "noImplicitAny": true, + "strict": true, "module": "es2015", "moduleResolution": "node", "paths": {