Skip to content

Commit 66145e1

Browse files
authored
chore: dependency updates (#500)
1 parent 1d6236e commit 66145e1

13 files changed

+5302
-9320
lines changed

jest.config.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ module.exports = {
22
preset: 'ts-jest',
33
testEnvironment: 'node',
44
collectCoverageFrom: ['src/**/*.ts', '!src/**/index.ts', '!src/**/*.interface.ts'],
5-
globals: {
6-
'ts-jest': {
7-
tsConfig: 'tsconfig.spec.json',
8-
},
9-
},
5+
globals: {},
6+
setupFilesAfterEnv: ["./jest.setup.js"],
7+
transform: {
8+
'^.+\\.tsx?$': [
9+
'ts-jest',
10+
{tsconfig: './tsconfig.spec.json'},
11+
],
12+
}
1013
};

jest.setup.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
jest.setTimeout(30000);
2+
3+
require("reflect-metadata");

package-lock.json

Lines changed: 5211 additions & 9226 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -29,48 +29,34 @@
2929
"test:watch": "jest --watch",
3030
"test:ci": "jest --runInBand --no-cache --coverage --verbose"
3131
},
32-
"husky": {
33-
"hooks": {
34-
"pre-commit": "lint-staged"
35-
}
36-
},
37-
"lint-staged": {
38-
"*.md": [
39-
"npm run prettier:fix"
40-
],
41-
"*.ts": [
42-
"npm run prettier:fix"
43-
]
44-
},
4532
"dependencies": {
46-
"@types/path-to-regexp": "^1.7.0",
47-
"class-transformer": "^0.4.0",
48-
"glob": "^7.1.7",
49-
"path-to-regexp": "^6.2.0",
33+
"class-transformer": "^0.5.1",
34+
"glob": "^8.0.3",
35+
"path-to-regexp": "^6.2.1",
5036
"reflect-metadata": "^0.1.13",
51-
"socket.io": "^2.4.0"
37+
"socket.io": "^4.5.4"
5238
},
5339
"devDependencies": {
54-
"@types/glob": "^7.1.3",
55-
"@types/jest": "^26.0.23",
56-
"@types/node": "^15.12.1",
40+
"@types/glob": "^8.0.0",
41+
"@types/jest": "^29.2.4",
42+
"@types/node": "^18.11.17",
43+
"@types/path-to-regexp": "^1.7.0",
5744
"@types/socket.io": "^3.0.2",
58-
"@typescript-eslint/eslint-plugin": "^4.26.0",
59-
"@typescript-eslint/parser": "^4.26.0",
60-
"eslint": "^7.28.0",
61-
"eslint-config-prettier": "^8.3.0",
62-
"eslint-plugin-jest": "^24.3.6",
63-
"express": "^4.17.1",
64-
"husky": "^4.3.8",
65-
"jest": "^26.6.3",
66-
"lint-staged": "^11.0.0",
67-
"prettier": "^2.3.1",
68-
"reflect-metadata": "0.1.13",
45+
"@typescript-eslint/eslint-plugin": "^5.46.1",
46+
"@typescript-eslint/parser": "^5.46.1",
47+
"eslint": "^8.30.0",
48+
"eslint-config-prettier": "^8.5.0",
49+
"eslint-plugin-jest": "^27.1.7",
50+
"express": "^4.18.2",
51+
"husky": "^8.0.0",
52+
"jest": "^29.3.1",
53+
"lint-staged": "^13.1.0",
54+
"prettier": "^2.8.1",
6955
"rimraf": "3.0.2",
70-
"socket.io-client": "^2.4.0",
71-
"ts-jest": "^26.5.6",
72-
"ts-node": "^10.0.0",
56+
"socket.io-client": "^4.5.4",
57+
"ts-jest": "^29.0.3",
58+
"ts-node": "^10.9.1",
7359
"typedi": "^0.10.0",
74-
"typescript": "^4.3.2"
60+
"typescript": "^4.9.4"
7561
}
7662
}

src/SocketControllerExecutor.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { MetadataBuilder } from './metadata-builder/MetadataBuilder';
22
import { ActionMetadata } from './metadata/ActionMetadata';
3-
import { classToPlain, ClassTransformOptions, plainToClass } from 'class-transformer';
3+
import { instanceToPlain, ClassTransformOptions, plainToInstance } from 'class-transformer';
44
import { ActionTypes } from './metadata/types/ActionTypes';
55
import { ParamMetadata } from './metadata/ParamMetadata';
66
import { ParameterParseJsonError } from './error/ParameterParseJsonError';
@@ -20,19 +20,19 @@ export class SocketControllerExecutor {
2020
* Indicates if class-transformer package should be used to perform message body serialization / deserialization.
2121
* By default its enabled.
2222
*/
23-
useClassTransformer: boolean;
23+
useClassTransformer?: boolean;
2424

2525
/**
2626
* Global class transformer options passed to class-transformer during classToPlain operation.
2727
* This operation is being executed when server returns response to user.
2828
*/
29-
classToPlainTransformOptions: ClassTransformOptions;
29+
classToPlainTransformOptions?: ClassTransformOptions;
3030

3131
/**
32-
* Global class transformer options passed to class-transformer during plainToClass operation.
32+
* Global class transformer options passed to class-transformer during plainToInstance operation.
3333
* This operation is being executed when parsing user parameters.
3434
*/
35-
plainToClassTransformOptions: ClassTransformOptions;
35+
plainToClassTransformOptions?: ClassTransformOptions;
3636

3737
// -------------------------------------------------------------------------
3838
// Private properties
@@ -68,7 +68,7 @@ export class SocketControllerExecutor {
6868
const middlewares = this.metadataBuilder.buildMiddlewareMetadata(classes);
6969

7070
middlewares
71-
.sort((middleware1, middleware2) => middleware1.priority - middleware2.priority)
71+
.sort((middleware1, middleware2) => (middleware1.priority || 0) - (middleware2.priority || 0))
7272
.forEach(middleware => {
7373
this.io.use((socket: any, next: (err?: any) => any) => {
7474
middleware.instance.use(socket, next);
@@ -91,8 +91,8 @@ export class SocketControllerExecutor {
9191

9292
// register controllers with namespaces
9393
controllersWithNamespaces.forEach(controller => {
94-
let namespace: string | RegExp = controller.namespace;
95-
if (!(namespace instanceof RegExp)) {
94+
let namespace: string | RegExp | undefined = controller.namespace;
95+
if (namespace && !(namespace instanceof RegExp)) {
9696
namespace = pathToRegexp(namespace);
9797
}
9898
this.io.of(namespace).on('connection', (socket: any) => this.handleConnection([controller], socket));
@@ -103,7 +103,7 @@ export class SocketControllerExecutor {
103103

104104
private handleConnection(controllers: ControllerMetadata[], socket: any) {
105105
controllers.forEach(controller => {
106-
controller.actions.forEach(action => {
106+
(controller.actions || []).forEach(action => {
107107
if (action.type === ActionTypes.CONNECT) {
108108
this.handleAction(action, { socket: socket })
109109
.then(result => this.handleSuccessResult(result, action, socket))
@@ -128,7 +128,7 @@ export class SocketControllerExecutor {
128128

129129
private handleAction(action: ActionMetadata, options: { socket?: any; data?: any }): Promise<any> {
130130
// compute all parameters
131-
const paramsPromises = action.params
131+
const paramsPromises = (action.params || [])
132132
.sort((param1, param2) => param1.index - param2.index)
133133
.map(param => {
134134
if (param.type === ParamTypes.CONNECTED_SOCKET) {
@@ -203,7 +203,7 @@ export class SocketControllerExecutor {
203203
const parseValue = typeof value === 'string' ? JSON.parse(value) : value;
204204
if (paramMetadata.reflectedType !== Object && paramMetadata.reflectedType && this.useClassTransformer) {
205205
const options = paramMetadata.classTransformOptions || this.plainToClassTransformOptions;
206-
return plainToClass(paramMetadata.reflectedType, parseValue, options);
206+
return plainToInstance(paramMetadata.reflectedType as never, parseValue as never, options);
207207
} else {
208208
return parseValue;
209209
}
@@ -216,7 +216,7 @@ export class SocketControllerExecutor {
216216
if (result !== null && result !== undefined && action.emitOnSuccess) {
217217
const transformOptions = action.emitOnSuccess.classTransformOptions || this.classToPlainTransformOptions;
218218
const transformedResult =
219-
this.useClassTransformer && result instanceof Object ? classToPlain(result, transformOptions) : result;
219+
this.useClassTransformer && result instanceof Object ? instanceToPlain(result, transformOptions) : result;
220220
socket.emit(action.emitOnSuccess.value, transformedResult);
221221
} else if ((result === null || result === undefined) && action.emitOnSuccess && !action.skipEmitOnEmptyResult) {
222222
socket.emit(action.emitOnSuccess.value);
@@ -225,10 +225,10 @@ export class SocketControllerExecutor {
225225

226226
private handleFailResult(result: any, action: ActionMetadata, socket: any) {
227227
if (result !== null && result !== undefined && action.emitOnFail) {
228-
const transformOptions = action.emitOnSuccess.classTransformOptions || this.classToPlainTransformOptions;
228+
const transformOptions = action.emitOnSuccess?.classTransformOptions || this.classToPlainTransformOptions;
229229
let transformedResult =
230-
this.useClassTransformer && result instanceof Object ? classToPlain(result, transformOptions) : result;
231-
if (result instanceof Error && !Object.keys(transformedResult).length) {
230+
this.useClassTransformer && result instanceof Object ? instanceToPlain(result, transformOptions) : result;
231+
if (result instanceof Error && !Object.keys(transformedResult as never).length) {
232232
transformedResult = result.toString();
233233
}
234234
socket.emit(action.emitOnFail.value, transformedResult);
@@ -239,8 +239,8 @@ export class SocketControllerExecutor {
239239

240240
private handleNamespaceParams(socket: any, action: ActionMetadata, param: ParamMetadata): any[] {
241241
const keys: any[] = [];
242-
const regexp = pathToRegexp(action.controllerMetadata.namespace, keys);
243-
const parts: any[] = regexp.exec(socket.nsp.name);
242+
const regexp = pathToRegexp(action.controllerMetadata.namespace || '/', keys);
243+
const parts: any[] = regexp.exec(socket.nsp.name as string) || [];
244244
const params: any[] = [];
245245
keys.forEach((key: any, index: number) => {
246246
params[key.name] = this.handleParamFormat(parts[index + 1], param);

src/container.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const defaultContainer: { get<T>(someClass: { new (...args: any[]): T } | Functi
3131
})();
3232

3333
let userContainer: { get<T>(someClass: { new (...args: any[]): T } | Function): T };
34-
let userContainerOptions: UseContainerOptions;
34+
let userContainerOptions: UseContainerOptions | undefined;
3535

3636
/**
3737
* Sets container to be used by this library.

src/index.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,21 @@ function createExecutor(io: any, options: SocketControllersOptions): void {
3232
const executor = new SocketControllerExecutor(io);
3333

3434
// second import all controllers and middlewares and error handlers
35-
let controllerClasses: Function[];
36-
if (options && options.controllers && options.controllers.length)
35+
let controllerClasses: Function[] = [];
36+
if (options?.controllers?.length) {
3737
controllerClasses = (options.controllers as any[]).filter(controller => controller instanceof Function);
38-
const controllerDirs = (options.controllers as any[]).filter(controller => typeof controller === 'string');
39-
controllerClasses.push(...importClassesFromDirectories(controllerDirs));
38+
const controllerDirs = (options.controllers as any[]).filter(
39+
controller => typeof controller === 'string'
40+
) as string[];
41+
controllerClasses.push(...importClassesFromDirectories(controllerDirs));
42+
}
4043

41-
let middlewareClasses: Function[];
42-
if (options && options.middlewares && options.middlewares.length) {
44+
let middlewareClasses: Function[] = [];
45+
if (options?.middlewares?.length) {
4346
middlewareClasses = (options.middlewares as any[]).filter(controller => controller instanceof Function);
44-
const middlewareDirs = (options.middlewares as any[]).filter(controller => typeof controller === 'string');
47+
const middlewareDirs = (options.middlewares as any[]).filter(
48+
controller => typeof controller === 'string'
49+
) as string[];
4550
middlewareClasses.push(...importClassesFromDirectories(middlewareDirs));
4651
}
4752

src/metadata/ActionMetadata.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ export class ActionMetadata {
1818
/**
1919
* Action's parameters.
2020
*/
21-
params: ParamMetadata[];
21+
params?: ParamMetadata[];
2222

2323
/**
2424
* Action's result handlers.
2525
*/
26-
results: ResultMetadata[];
26+
results?: ResultMetadata[];
2727

2828
/**
2929
* Message name served by this action.
3030
*/
31-
name: string;
31+
name?: string;
3232

3333
/**
3434
* Class on which's method this action is attached.
@@ -58,29 +58,29 @@ export class ActionMetadata {
5858
this.type = args.type;
5959
}
6060

61-
// -------------------------------------------------------------------------
62-
// Public Methods
63-
// -------------------------------------------------------------------------
64-
65-
executeAction(params: any[]) {
66-
// TODO: remove fix this eslint warning
67-
// eslint-disable-next-line prefer-spread
68-
return this.controllerMetadata.instance[this.method].apply(this.controllerMetadata.instance, params);
69-
}
70-
7161
// -------------------------------------------------------------------------
7262
// Accessors
7363
// -------------------------------------------------------------------------
7464

7565
get emitOnSuccess() {
76-
return this.results.find(resultHandler => resultHandler.type === ResultTypes.EMIT_ON_SUCCESS);
66+
return (this.results || []).find(resultHandler => resultHandler.type === ResultTypes.EMIT_ON_SUCCESS);
7767
}
7868

7969
get emitOnFail() {
80-
return this.results.find(resultHandler => resultHandler.type === ResultTypes.EMIT_ON_FAIL);
70+
return (this.results || []).find(resultHandler => resultHandler.type === ResultTypes.EMIT_ON_FAIL);
8171
}
8272

8373
get skipEmitOnEmptyResult() {
84-
return this.results.find(resultHandler => resultHandler.type === ResultTypes.SKIP_EMIT_ON_EMPTY_RESULT);
74+
return (this.results || []).find(resultHandler => resultHandler.type === ResultTypes.SKIP_EMIT_ON_EMPTY_RESULT);
75+
}
76+
77+
// -------------------------------------------------------------------------
78+
// Public Methods
79+
// -------------------------------------------------------------------------
80+
81+
executeAction(params: any[]) {
82+
// TODO: remove fix this eslint warning
83+
// eslint-disable-next-line prefer-spread
84+
return this.controllerMetadata.instance[this.method].apply(this.controllerMetadata.instance, params);
8585
}
8686
}

src/metadata/ControllerMetadata.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export class ControllerMetadata {
1010
/**
1111
* Controller actions.
1212
*/
13-
actions: ActionMetadata[];
13+
actions?: ActionMetadata[];
1414

1515
/**
1616
* Indicates object which is used by this controller.
@@ -20,7 +20,7 @@ export class ControllerMetadata {
2020
/**
2121
* Base route for all actions registered in this controller.
2222
*/
23-
namespace: string | RegExp;
23+
namespace?: string | RegExp;
2424

2525
// -------------------------------------------------------------------------
2626
// Constructor

src/metadata/MiddlewareMetadata.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export class MiddlewareMetadata {
88
// -------------------------------------------------------------------------
99

1010
target: Function;
11-
priority: number;
11+
priority?: number;
1212

1313
// -------------------------------------------------------------------------
1414
// Constructor

0 commit comments

Comments
 (0)