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 557b42d43af4..402418af143d 100644 --- a/packages/booter-lb3app/src/__tests__/acceptance/booter-lb3app.acceptance.ts +++ b/packages/booter-lb3app/src/__tests__/acceptance/booter-lb3app.acceptance.ts @@ -242,4 +242,20 @@ describe('booter-lb3app', () => { expect(ds).to.eql(expected); }); }); + + context('binding LoopBack 3 models', () => { + before(async () => { + ({app, client} = await setupApplication({ + lb3app: {path: '../fixtures/app-with-model'}, + })); + }); + + it('binds model to the context', async () => { + const expected = require('../../../fixtures/app-with-model').models.Color; + const modelBindings = app.findByTag('lb3-model'); + const key = modelBindings[0].key; + const model = await app.get(key); + expect(model).to.eql(expected); + }); + }); }); diff --git a/packages/booter-lb3app/src/lb3app.booter.ts b/packages/booter-lb3app/src/lb3app.booter.ts index 88050609e5dc..60b5ea5d8bf1 100644 --- a/packages/booter-lb3app/src/lb3app.booter.ts +++ b/packages/booter-lb3app/src/lb3app.booter.ts @@ -73,6 +73,17 @@ export class Lb3AppBooter implements Booter { }); } + const models = lb3App.models; + if (models) { + const visited: unknown[] = []; + Object.keys(models).forEach(key => { + const model = models[key]; + if (visited.includes(model)) return; + visited.push(model); + this.app.bind(`lb3-models.${key}`).to(model).tag('lb3-model'); + }); + } + // TODO(bajtos) Listen for the following events to update the OpenAPI spec: // - modelRemoted // - modelDeleted @@ -149,4 +160,6 @@ export interface Lb3AppBooterOptions { interface Lb3Application extends ExpressApplication { handler(name: 'rest'): ExpressRequestHandler; dataSources?: {[name: string]: unknown}; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + models?: {[name: string]: any}; }