diff --git a/extensions/socketio/src/socketio.server.ts b/extensions/socketio/src/socketio.server.ts index 1a5915ed92d2..6f4c668dfb24 100644 --- a/extensions/socketio/src/socketio.server.ts +++ b/extensions/socketio/src/socketio.server.ts @@ -152,9 +152,9 @@ export class SocketIoServer extends Context { this.app.bind(getNamespaceKeyForName(meta.name)).to(nsp); } - nsp.on('connection', socket => - this.createSocketHandler(controllerClass)(socket), - ); + nsp.on('connection', async socket => { + await this.createSocketHandler(controllerClass)(socket); + }); return nsp; } @@ -164,7 +164,7 @@ export class SocketIoServer extends Context { */ private createSocketHandler( controllerClass: Constructor, - ): (socket: Socket) => void { + ): (socket: Socket) => Promise { return async socket => { debug( 'SocketIo connected: id=%s namespace=%s', diff --git a/packages/booter-lb3app/src/__tests__/acceptance/booter-lb3app.acceptance.ts b/packages/booter-lb3app/src/__tests__/acceptance/booter-lb3app.acceptance.ts index 402418af143d..5410e4c96e18 100644 --- a/packages/booter-lb3app/src/__tests__/acceptance/booter-lb3app.acceptance.ts +++ b/packages/booter-lb3app/src/__tests__/acceptance/booter-lb3app.acceptance.ts @@ -52,7 +52,7 @@ describe('booter-lb3app', () => { }, }); - const schemas = (spec.components ?? {}).schemas ?? {}; + const schemas = spec.components?.schemas ?? {}; expect(schemas._new_CoffeeShop) .to.have.property('properties') .eql({ @@ -68,7 +68,7 @@ describe('booter-lb3app', () => { it('includes the target model as a property of the source model in a relation', async () => { const spec = await app.restServer.getApiSpec(); - const schemas = (spec.components ?? {}).schemas ?? {}; + const schemas = spec.components?.schemas ?? {}; expect(schemas.CoffeeShop) .to.have.property('properties') diff --git a/packages/context/src/__tests__/unit/resolver.unit.ts b/packages/context/src/__tests__/unit/resolver.unit.ts index 93d8fa085a60..04c19b4a494d 100644 --- a/packages/context/src/__tests__/unit/resolver.unit.ts +++ b/packages/context/src/__tests__/unit/resolver.unit.ts @@ -631,6 +631,7 @@ describe('method injection', () => { let savedInstance; class TestClass { test(@inject('foo') foo: string) { + // eslint-disable-next-line @typescript-eslint/no-this-alias savedInstance = this; return `hello ${foo}`; } @@ -647,6 +648,7 @@ describe('method injection', () => { bar: string; test(@inject('foo') foo: string) { + // eslint-disable-next-line @typescript-eslint/no-this-alias savedInstance = this; this.bar = foo; return `hello ${foo}`; @@ -724,6 +726,7 @@ describe('async method injection', () => { bar: string; test(@inject('foo') foo: string) { + // eslint-disable-next-line @typescript-eslint/no-this-alias savedInstance = this; this.bar = foo; return Promise.resolve(`hello ${foo}`); diff --git a/packages/eslint-config/eslintrc.js b/packages/eslint-config/eslintrc.js index 8df08e7a8188..b3ad3f0d5ec4 100644 --- a/packages/eslint-config/eslintrc.js +++ b/packages/eslint-config/eslintrc.js @@ -162,20 +162,14 @@ module.exports = { { selector: 'variable', format: null, - filter: { - regex: '^_$', - match: true, - }, + filter: '^_$', }, // For mixin functions { selector: 'function', format: ['PascalCase'], - filter: { - regex: 'Mixin$', - match: true, - }, + filter: 'Mixin$', }, { @@ -184,18 +178,6 @@ module.exports = { leadingUnderscore: 'allow', }, - // For members such as `Content-Type` or `application/json` or `200` - { - selector: 'memberLike', - format: null, - filter: { - // you can expand this regex as you find more cases that require - // quoting that you want to allow - regex: '[0-9-/ ]', - match: true, - }, - }, - // For enum members { selector: 'enumMember', @@ -243,6 +225,13 @@ module.exports = { selector: 'typeLike', format: ['PascalCase'], }, + + { + selector: 'objectLiteralProperty', + format: null, + // filter: '^([2-5]{1}[0-9]{2})$|[-/ ]', + modifiers: ['requiresQuotes'], + }, ], }, diff --git a/packages/express/src/__tests__/acceptance/test-helpers.ts b/packages/express/src/__tests__/acceptance/test-helpers.ts index 54ba1fea9e60..f1bec173f98b 100644 --- a/packages/express/src/__tests__/acceptance/test-helpers.ts +++ b/packages/express/src/__tests__/acceptance/test-helpers.ts @@ -11,13 +11,22 @@ import { } from '@loopback/core'; import {Client, givenHttpServerConfig, supertest} from '@loopback/testlab'; import bodyParser from 'body-parser'; +import {NextFunction, Request, Response} from 'express'; import {ExpressApplication} from '../../express.application'; import {ExpressRequestHandler} from '../../types'; import {SpyAction, SpyConfig} from '../fixtures/spy-config'; -import spyFactory from '../fixtures/spy.middleware'; -export const spy = spyFactory; + +export {default as spy} from '../fixtures/spy.middleware'; export {SpyConfig} from '../fixtures/spy-config'; +function runAsyncWrapper( + callback: (req: Request, res: Response, next: NextFunction) => Promise, +): ExpressRequestHandler { + return function (req: Request, res: Response, next: NextFunction) { + callback(req, res, next).catch(next); + }; +} + export type TestFunction = ( spyBinding: Binding, path?: string, @@ -62,23 +71,26 @@ export class TestHelper { } } const binding = this.app.controller(MyController); - const handler: ExpressRequestHandler = async (req, res, next) => { - try { - const controller = await this.app.get(binding.key); - const proxy = createProxyWithInterceptors( - controller, - this.app.expressServer.getMiddlewareContext(req), - undefined, - { - type: 'route', - value: controller, - }, - ); - res.send(await proxy.hello(req.body)); - } catch (err) { - next(err); - } - }; + + const handler: ExpressRequestHandler = runAsyncWrapper( + async (req, res, next) => { + try { + const controller = await this.app.get(binding.key); + const proxy = createProxyWithInterceptors( + controller, + this.app.expressServer.getMiddlewareContext(req), + undefined, + { + type: 'route', + value: controller, + }, + ); + res.send(await proxy.hello(req.body)); + } catch (err) { + next(err); + } + }, + ); this.app.expressServer.expressApp.post('/hello', handler); this.app.expressServer.expressApp.post('/greet', handler); } diff --git a/packages/express/src/middleware.ts b/packages/express/src/middleware.ts index de817a835ffb..841f314d66c0 100644 --- a/packages/express/src/middleware.ts +++ b/packages/express/src/middleware.ts @@ -353,16 +353,23 @@ export function invokeExpressMiddleware( * @param ctx - Context object to discover registered middleware */ export function toExpressMiddleware(ctx: Context): ExpressRequestHandler { - return async (req, res, next) => { + return (req, res, next) => { const middlewareCtx = new MiddlewareContext(req, res, ctx); - try { - const result = await invokeMiddleware(middlewareCtx); - if (result !== res) { - next(); - } - } catch (err) { - next(err); - } + new Promise((resolve, reject) => { + // eslint-disable-next-line no-void + void (async () => { + try { + const result = await invokeMiddleware(middlewareCtx); + resolve(result); + } catch (err) { + reject(err); + } + })(); + }) + .then(result => { + if (result !== res) next(); + }) + .catch(next); }; } diff --git a/packages/monorepo/lib/config-lerna-scopes.js b/packages/monorepo/lib/config-lerna-scopes.js index dfc0ee5d1bd4..ee892fb2422f 100644 --- a/packages/monorepo/lib/config-lerna-scopes.js +++ b/packages/monorepo/lib/config-lerna-scopes.js @@ -14,7 +14,7 @@ const {getPackages, runMain} = require('./script-util'); module.exports = { rules: { - // https://github.com/marionebl/commitlint/blob/master/docs/reference-rules.md + // eslint-disable-next-line @typescript-eslint/naming-convention 'scope-enum': async ctx => [2, 'always', await getPackageNames(ctx)], }, }; diff --git a/packages/openapi-v3/src/__tests__/integration/controller-spec.integration.ts b/packages/openapi-v3/src/__tests__/integration/controller-spec.integration.ts index 6e5d602c9f93..0ccbab1eb664 100644 --- a/packages/openapi-v3/src/__tests__/integration/controller-spec.integration.ts +++ b/packages/openapi-v3/src/__tests__/integration/controller-spec.integration.ts @@ -313,7 +313,7 @@ describe('controller spec', () => { $ref: '#/components/schemas/Todo', }); - const globalSchemas = (spec.components ?? {}).schemas; + const globalSchemas = spec.components?.schemas; expect(globalSchemas).to.deepEqual({ Todo: { title: 'Todo', @@ -362,7 +362,7 @@ describe('controller spec', () => { $ref: '#/definitions/Todo', }); - const globalSchemas = (spec.components ?? {}).schemas; + const globalSchemas = spec.components?.schemas; expect(globalSchemas).to.deepEqual({ Todo: { title: 'Todo', @@ -462,7 +462,7 @@ describe('controller spec', () => { } const spec = getControllerSpec(MyController); - const globalSchemas = (spec.components ?? {}).schemas; + const globalSchemas = spec.components?.schemas; expect(globalSchemas).to.be.undefined(); }); @@ -533,7 +533,7 @@ describe('controller spec', () => { }, }); - const globalSchemas = (spec.components ?? {}).schemas; + const globalSchemas = spec.components?.schemas; expect(globalSchemas).to.deepEqual({ Todo: { title: 'Todo', @@ -593,7 +593,7 @@ describe('controller spec', () => { $ref: '#/components/schemas/Todo', }); - const globalSchemas = (spec.components ?? {}).schemas; + const globalSchemas = spec.components?.schemas; expect(globalSchemas).to.deepEqual({ Todo: { title: 'Todo', @@ -861,7 +861,7 @@ describe('controller spec', () => { $ref: '#/components/schemas/MyModel', }); - const globalSchemas = (spec.components ?? {}).schemas; + const globalSchemas = spec.components?.schemas; expect(globalSchemas).to.deepEqual({ MyModel: { title: 'MyModel', diff --git a/packages/repository-tests/src/helpers.repository-tests.ts b/packages/repository-tests/src/helpers.repository-tests.ts index 4b6294c59a40..1c61fee68c9d 100644 --- a/packages/repository-tests/src/helpers.repository-tests.ts +++ b/packages/repository-tests/src/helpers.repository-tests.ts @@ -37,7 +37,7 @@ export function withCrudCtx( */ export const deleteAllModelsInDefaultDataSource = withCrudCtx(ctx => { ctx.dataSource.deleteAllModels(); -}); +}) as Mocha.Func; /** * A union type between string and number to use since MongoDB and MySQL use diff --git a/packages/rest-crud/src/crud-rest.controller.ts b/packages/rest-crud/src/crud-rest.controller.ts index d299af479506..5033347bb052 100644 --- a/packages/rest-crud/src/crud-rest.controller.ts +++ b/packages/rest-crud/src/crud-rest.controller.ts @@ -280,7 +280,7 @@ function getIdSchema( const modelSchema = jsonToSchemaObject( getJsonSchema(modelCtor), ) as SchemaObject; - return (modelSchema.properties ?? {})[idProp] as SchemaObject; + return modelSchema.properties?.[idProp] as SchemaObject; } // Temporary implementation of a short-hand version of `@requestBody`