From 3eeab1d63c3230dff7955e457336759c2ebf5686 Mon Sep 17 00:00:00 2001 From: Marcin Dryka Date: Wed, 6 Jun 2018 19:58:24 +0200 Subject: [PATCH 1/5] Autoreload nodemon during development --- .rebuild.ts | 0 package.json | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .rebuild.ts diff --git a/.rebuild.ts b/.rebuild.ts new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json index c6e5bd0..24620c5 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "dist", "scripts": { "start": "NODE_ENV=production NODE_PATH=./packages/hadron-demo/dist npm start --prefix packages/hadron-demo", - "start:test": "NODE_ENV=development NODE_PATH=./packages/hadron-demo ts-node packages/hadron-demo", + "start:dev": "NODE_ENV=development NODE_PATH=./packages/hadron-demo nodemon --watch 'packages/hadron-demo/**/*.ts' --watch .rebuild.ts --ignore 'packages/hadron-demo/**/*.spec.ts' --exec 'ts-node' packages/hadron-demo/index.ts", + "start:lerna": "nodemon --watch 'packages/**/*.ts' --exec 'npm run build && touch .rebuild.ts' -e ts", "build": "lerna bootstrap", "prestart": "npm run build", "precommit": "lint-staged", @@ -28,6 +29,7 @@ "@types/bunyan": "1.8.4", "body-parser": "1.18.2", "dotenv": "4.0.0", + "http-status": "1.1.0", "mysql": "2.15.0", "pg": "7.4.1", "pm2": "github:Unitech/pm2#development" From 0911d5a8322b30257b70459e7a2c09714f7d4797 Mon Sep 17 00:00:00 2001 From: Marcin Dryka Date: Sun, 10 Jun 2018 10:19:45 +0200 Subject: [PATCH 2/5] Remove express as a hard dependency --- packages/hadron-core/src/hadronCore.ts | 29 +++++++++++++++----------- packages/hadron-demo/index.ts | 18 +++++----------- packages/hadron-express/index.ts | 18 ++++++++++++++-- packages/hadron-express/src/types.ts | 1 + 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/packages/hadron-core/src/hadronCore.ts b/packages/hadron-core/src/hadronCore.ts index d4f89f7..712e737 100644 --- a/packages/hadron-core/src/hadronCore.ts +++ b/packages/hadron-core/src/hadronCore.ts @@ -20,22 +20,27 @@ export const prepareConfig = ( }; export default ( - server: any, packages: any[] = [], config: any = {}, ): Promise => { - container.register('server', server); - const logger = createLogger({ name: 'hadron-logger' }); container.register('hadronLogger', logger); - return prepareConfig(hadronDefaultConfig, config, logger).then( - (hadronConfig) => { - return Promise.all( - packages - .filter(({ register }) => !!register) - .map(({ register }) => register(container, hadronConfig)), - ).then(() => container); - }, - ); + return prepareConfig(hadronDefaultConfig, config, logger) + .then((hadronConfig) => { + const registers = packages + .filter(({ register }) => !!register) + .map(({ register }) => register); + + let p = Promise.resolve(); + + registers.forEach((register) => { + p = p.then(() => { + register(container, hadronConfig); + }); + }); + + return p; + }) + .then(() => container); }; diff --git a/packages/hadron-demo/index.ts b/packages/hadron-demo/index.ts index 78d0f8a..5702ef5 100644 --- a/packages/hadron-demo/index.ts +++ b/packages/hadron-demo/index.ts @@ -1,10 +1,7 @@ -import * as bodyParser from 'body-parser'; -import * as express from 'express'; import hadron, { IContainer } from '@brainhubeu/hadron-core'; import * as hadronEvents from '@brainhubeu/hadron-events'; import * as hadronSerialization from '@brainhubeu/hadron-serialization'; import * as hadronExpress from '@brainhubeu/hadron-express'; -import * as hadronLogger from '@brainhubeu/hadron-logger'; import * as hadronTypeORM from '@brainhubeu/hadron-typeorm'; import jsonProvider from '@brainhubeu/hadron-json-provider'; import expressConfig from './express-demo'; @@ -15,10 +12,6 @@ import serializationRoutes from './serialization/routing'; import { setupSerializer } from './serialization/serialization-demo'; import 'reflect-metadata'; -const port = process.env.PORT || 8080; -const expressApp = express(); -expressApp.use(bodyParser.json()); - jsonProvider(['./routing/*'], ['js']).then((routes: any) => { const config = { ...typeormConfig, @@ -32,16 +25,15 @@ jsonProvider(['./routing/*'], ['js']).then((routes: any) => { }; hadron( - expressApp, - [hadronEvents, hadronSerialization, hadronExpress, hadronTypeORM], + [hadronExpress, hadronEvents, hadronSerialization, hadronTypeORM], config, ).then((container: IContainer) => { - expressApp.use((req, res, next) => - res.status(404).json('Request not found.'), - ); + container + .register('server') + .use((req, res) => res.status(404).json('Request not found.')); container.register('customValue', 'From Brainhub with ❤️'); setupSerializer(); - expressApp.listen(port); + container.take('server_listen')(); }); return; diff --git a/packages/hadron-express/index.ts b/packages/hadron-express/index.ts index 48c6811..50643e3 100644 --- a/packages/hadron-express/index.ts +++ b/packages/hadron-express/index.ts @@ -1,4 +1,7 @@ import hadronExpress from './src/hadronToExpress'; +import * as express from 'express'; +import * as bodyParser from 'body-parser'; + export { Callback, IRoutesConfig, @@ -16,11 +19,22 @@ import { export default hadronExpress; -export const register = (container: IContainer, config: IHadronExpressConfig) => - hadronExpress( +export const register = ( + container: IContainer, + config: IHadronExpressConfig, +) => { + const port = process.env.PORT || 8080; + const expressApp = express(); + expressApp.use(bodyParser.json()); + container.register('server', expressApp); + container.register('server_listen', () => { + expressApp.listen(port); + }); + return hadronExpress( { routes: config.routes as IRoutesConfig, routePaths: config.routePaths as RoutePathsConfig, }, container, ); +}; diff --git a/packages/hadron-express/src/types.ts b/packages/hadron-express/src/types.ts index 30b5afe..2f3c059 100644 --- a/packages/hadron-express/src/types.ts +++ b/packages/hadron-express/src/types.ts @@ -24,6 +24,7 @@ export type RoutePathsConfig = string[][]; export interface IContainer { take: (key: string) => any; keys: () => string[]; + register: (key: string, value: any) => any; } export interface IHeaders { From 2b42edc411c562686fd56a47743d14c31ba01425 Mon Sep 17 00:00:00 2001 From: Marcin Dryka Date: Sun, 10 Jun 2018 10:40:05 +0200 Subject: [PATCH 3/5] Lerna bootstrap as post install --- package.json | 4 ++-- packages/hadron-demo/index.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 7074c5d..ed97952 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "docker:build": "docker build -t brainhub-framework-app .", "format": "prettier --write \"*/**/*.ts\"", "tsc": "lerna exec tsc --parallel", - "clean": "bash ./scripts/clean" + "clean": "bash ./scripts/clean", + "postinstall": "lerna bootstrap" }, "author": "Brainhub", "license": "MIT", @@ -29,7 +30,6 @@ "@types/bunyan": "1.8.4", "body-parser": "1.18.2", "dotenv": "4.0.0", - "http-status": "1.1.0", "mysql": "2.15.0", "pg": "7.4.1", "pm2": "github:Unitech/pm2#development" diff --git a/packages/hadron-demo/index.ts b/packages/hadron-demo/index.ts index 5702ef5..3149609 100644 --- a/packages/hadron-demo/index.ts +++ b/packages/hadron-demo/index.ts @@ -29,8 +29,8 @@ jsonProvider(['./routing/*'], ['js']).then((routes: any) => { config, ).then((container: IContainer) => { container - .register('server') - .use((req, res) => res.status(404).json('Request not found.')); + .take('server') + .use((req: any, res: any) => res.status(404).json('Request not found.')); container.register('customValue', 'From Brainhub with ❤️'); setupSerializer(); container.take('server_listen')(); From 156de5b6438ea1153f9f704cf7e12dce16be8608 Mon Sep 17 00:00:00 2001 From: Marcin Dryka Date: Sun, 10 Jun 2018 10:46:45 +0200 Subject: [PATCH 4/5] Lerna bootstrap instead of additional package --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7074c5d..ed97952 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "docker:build": "docker build -t brainhub-framework-app .", "format": "prettier --write \"*/**/*.ts\"", "tsc": "lerna exec tsc --parallel", - "clean": "bash ./scripts/clean" + "clean": "bash ./scripts/clean", + "postinstall": "lerna bootstrap" }, "author": "Brainhub", "license": "MIT", @@ -29,7 +30,6 @@ "@types/bunyan": "1.8.4", "body-parser": "1.18.2", "dotenv": "4.0.0", - "http-status": "1.1.0", "mysql": "2.15.0", "pg": "7.4.1", "pm2": "github:Unitech/pm2#development" From 7f234b06eb054858fb2b29f9bffef56407fb7e1f Mon Sep 17 00:00:00 2001 From: Marcin Dryka Date: Sun, 10 Jun 2018 10:59:32 +0200 Subject: [PATCH 5/5] Naming convention --- packages/hadron-demo/index.ts | 2 +- packages/hadron-express/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hadron-demo/index.ts b/packages/hadron-demo/index.ts index 3149609..a3ca704 100644 --- a/packages/hadron-demo/index.ts +++ b/packages/hadron-demo/index.ts @@ -33,7 +33,7 @@ jsonProvider(['./routing/*'], ['js']).then((routes: any) => { .use((req: any, res: any) => res.status(404).json('Request not found.')); container.register('customValue', 'From Brainhub with ❤️'); setupSerializer(); - container.take('server_listen')(); + container.take('serverListen')(); }); return; diff --git a/packages/hadron-express/index.ts b/packages/hadron-express/index.ts index 50643e3..76a3d84 100644 --- a/packages/hadron-express/index.ts +++ b/packages/hadron-express/index.ts @@ -27,7 +27,7 @@ export const register = ( const expressApp = express(); expressApp.use(bodyParser.json()); container.register('server', expressApp); - container.register('server_listen', () => { + container.register('serverListen', () => { expressApp.listen(port); }); return hadronExpress(