From 83a89792fc502ff9fa1f7a1d504ea1d5d2032e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= Date: Tue, 6 Feb 2018 14:55:19 +0100 Subject: [PATCH 1/2] refactor: simplify app setup via RestApplication - Move any REST-related setup from app.start() back to app constructor. - Update the project template to use RestApplication too - Update authentication README to use RestApplication --- packages/authentication/README.md | 13 +++++++------ .../app/templates/src/application.ts | 18 +++++------------- packages/cli/test/app.js | 8 +++++--- packages/rest/README.md | 15 ++++++--------- 4 files changed, 23 insertions(+), 31 deletions(-) diff --git a/packages/authentication/README.md b/packages/authentication/README.md index 240ab27845a4..03bf9871b201 100644 --- a/packages/authentication/README.md +++ b/packages/authentication/README.md @@ -155,26 +155,27 @@ import {MyAuthStrategyProvider} from './providers/auth-strategy'; import {MyController} from './controllers/my-controller'; import {MySequence} from './sequence'; -class MyApp extends Application { +class MyApp extends RestApplication { constructor() { super({ - components: [AuthenticationComponent, RestComponent], + components: [AuthenticationComponent], rest: { sequence: MySequence }, controllers: [MyController], }); + this + .bind(AuthenticationBindings.STRATEGY) + .toProvider(MyAuthStrategyProvider); + this.controller(MyController); } async start() { - const server = await this.getServer(RestServer); - - server.bind(AuthenticationBindings.STRATEGY) - .toProvider(MyAuthStrategyProvider); await super.start(); + const server = await this.getServer(RestServer); console.log(`REST server running on port: ${server.getSync('rest.port')}`); } } diff --git a/packages/cli/generators/app/templates/src/application.ts b/packages/cli/generators/app/templates/src/application.ts index d82aada7cd76..539d1d2161c8 100644 --- a/packages/cli/generators/app/templates/src/application.ts +++ b/packages/cli/generators/app/templates/src/application.ts @@ -4,32 +4,24 @@ // License text available at https://opensource.org/licenses/MIT import {Application, ApplicationConfig} from '@loopback/core'; -import {RestComponent, RestServer} from '@loopback/rest'; +import {RestApplication, RestServer} from '@loopback/rest'; import {PingController} from './controllers/ping.controller'; import {MySequence} from './sequence'; -export class <%= project.applicationName %> extends Application { +export class <%= project.applicationName %> extends RestApplication { constructor(options?: ApplicationConfig) { - // Allow options to replace the defined components array, if desired. - options = Object.assign( - {}, - { - components: [RestComponent], - }, - options, - ); super(options); - this.server(RestServer); + this.sequence(MySequence); this.setupControllers(); } async start() { + await super.start(); + const server = await this.getServer(RestServer); - server.sequence(MySequence); const port = await server.get('rest.port'); console.log(`Server is running at http://127.0.0.1:${port}`); console.log(`Try http://127.0.0.1:${port}/ping`); - return await super.start(); } setupControllers() { diff --git a/packages/cli/test/app.js b/packages/cli/test/app.js index c33a8fd46a21..920ed0421326 100644 --- a/packages/cli/test/app.js +++ b/packages/cli/test/app.js @@ -27,11 +27,10 @@ describe('app-generator specfic files', () => { assert.file('src/application.ts'); assert.fileContent( 'src/application.ts', - /class MyAppApplication extends Application/ + /class MyAppApplication extends RestApplication/ ); assert.fileContent('src/application.ts', /constructor\(/); assert.fileContent('src/application.ts', /async start\(/); - assert.fileContent('src/application.ts', /RestComponent/); assert.file('src/index.ts'); assert.fileContent('src/index.ts', /new MyAppApplication/); @@ -48,7 +47,10 @@ describe('app-generator specfic files', () => { /@get\('\/ping'\)/ ); assert.fileContent('src/controllers/ping.controller.ts', /ping\(\)/); - assert.fileContent('src/controllers/ping.controller.ts', /\'\@loopback\/openapi\-v2\'/); + assert.fileContent( + 'src/controllers/ping.controller.ts', + /\'\@loopback\/openapi\-v2\'/ + ); assert.file; }); diff --git a/packages/rest/README.md b/packages/rest/README.md index 1c9497509e96..004c6443594c 100644 --- a/packages/rest/README.md +++ b/packages/rest/README.md @@ -27,20 +27,17 @@ Here's a basic "Hello World" application using `@loopback/core` and ```ts import {Application} from '@loopback/core'; - import {RestComponent, RestServer} from '@loopback/rest'; + import {RestApplication, RestServer} from '@loopback/rest'; - const app = new Application({ - components: [ - RestComponent, - ] + const app = new RestApplication(); + app.handler((sequence, request, response) => { + sequence.send(response, 'hello world'); }); (async function start() { - const rest = await app.getServer(RestServer); - rest.handler((sequence, request, response) => { - sequence.send(response, 'hello world'); - }); await app.start(); + + const rest = await app.getServer(RestServer); console.log(`REST server running on port: ${rest.getSync('rest.port')}`); })(); ``` From c1ad7cb56fb9b6ea42db555bddda7d5d9053f655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= Date: Fri, 9 Feb 2018 08:35:46 +0100 Subject: [PATCH 2/2] fixup! address code review comments --- packages/authentication/README.md | 14 +++++--------- .../generators/app/templates/src/application.ts | 2 +- packages/example-hello-world/src/application.ts | 3 --- packages/example-log-extension/README.md | 4 ++-- packages/rest/README.md | 1 - packages/rest/package.json | 1 + 6 files changed, 9 insertions(+), 16 deletions(-) diff --git a/packages/authentication/README.md b/packages/authentication/README.md index 03bf9871b201..c7ff6f374dde 100644 --- a/packages/authentication/README.md +++ b/packages/authentication/README.md @@ -145,30 +145,26 @@ export class MySequence implements SequenceHandler { Finally, put it all together in your application class: ```ts -import {Application} from '@loopback/core'; import { AuthenticationComponent, AuthenticationBindings, } from '@loopback/authentication'; -import {RestComponent, RestServer} from '@loopback/rest'; +import {RestApplication, RestServer} from '@loopback/rest'; import {MyAuthStrategyProvider} from './providers/auth-strategy'; import {MyController} from './controllers/my-controller'; import {MySequence} from './sequence'; class MyApp extends RestApplication { constructor() { - super({ - components: [AuthenticationComponent], - rest: { - sequence: MySequence - }, - controllers: [MyController], - }); + super(); + this.component(AuthenticationComponent); this .bind(AuthenticationBindings.STRATEGY) .toProvider(MyAuthStrategyProvider); + this.sequence(MySequence); + this.controller(MyController); } diff --git a/packages/cli/generators/app/templates/src/application.ts b/packages/cli/generators/app/templates/src/application.ts index 539d1d2161c8..a89100142af0 100644 --- a/packages/cli/generators/app/templates/src/application.ts +++ b/packages/cli/generators/app/templates/src/application.ts @@ -3,7 +3,7 @@ // This file is licensed under the MIT License. // License text available at https://opensource.org/licenses/MIT -import {Application, ApplicationConfig} from '@loopback/core'; +import {ApplicationConfig} from '@loopback/core'; import {RestApplication, RestServer} from '@loopback/rest'; import {PingController} from './controllers/ping.controller'; import {MySequence} from './sequence'; diff --git a/packages/example-hello-world/src/application.ts b/packages/example-hello-world/src/application.ts index 35098dfdfab8..bfa570c88383 100644 --- a/packages/example-hello-world/src/application.ts +++ b/packages/example-hello-world/src/application.ts @@ -3,9 +3,6 @@ // This file is licensed under the MIT License. // License text available at https://opensource.org/licenses/MIT -// tslint:disable-next-line:no-unused-variable -import {Application} from '@loopback/core'; - import {RestApplication, RestServer} from '@loopback/rest'; export class HelloWorldApplication extends RestApplication { diff --git a/packages/example-log-extension/README.md b/packages/example-log-extension/README.md index aeede0293832..18080b336179 100644 --- a/packages/example-log-extension/README.md +++ b/packages/example-log-extension/README.md @@ -32,10 +32,10 @@ import { } from 'loopback4-example-log-extension'; // Other imports ... -class LogApp extends LogLevelMixin(Application) { +class LogApp extends LogLevelMixin(RestApplication) { constructor() { super({ - components: [RestComponent, LogComponent], + components: [LogComponent], logLevel: LOG_LEVEL.ERROR, controllers: [MyController] }); diff --git a/packages/rest/README.md b/packages/rest/README.md index 004c6443594c..8e5b330f88ff 100644 --- a/packages/rest/README.md +++ b/packages/rest/README.md @@ -26,7 +26,6 @@ Here's a basic "Hello World" application using `@loopback/core` and `@loopback/rest`: ```ts - import {Application} from '@loopback/core'; import {RestApplication, RestServer} from '@loopback/rest'; const app = new RestApplication(); diff --git a/packages/rest/package.json b/packages/rest/package.json index e617a2f98cc5..ba082a0b419a 100644 --- a/packages/rest/package.json +++ b/packages/rest/package.json @@ -26,6 +26,7 @@ "@loopback/openapi-spec": "^4.0.0-alpha.25", "@loopback/openapi-v2": "^4.0.0-alpha.10", "@types/http-errors": "^1.6.1", + "@types/node": "^8.5.9", "body": "^5.1.0", "debug": "^3.1.0", "http-errors": "^1.6.1",