From 6c1ed1de1d080715fcd2b2dd738e971f6dd697b2 Mon Sep 17 00:00:00 2001 From: eyolas Date: Thu, 10 Aug 2017 23:09:18 +0200 Subject: [PATCH] feat(loader): split module and config loader --- ...est.ts.snap => loader-config.test.ts.snap} | 0 ...est.ts.snap => loader-module.test.ts.snap} | 8 +-- ...g-loader.test.ts => loader-config.test.ts} | 22 +++---- .../{loader.test.ts => loader-module.test.ts} | 14 ++--- packages/core/src/gabliam.ts | 10 +-- packages/core/src/loaders/index.ts | 2 + packages/core/src/loaders/loader-config.ts | 57 +++++++++++++++++ .../{loader.ts => loaders/loader-module.ts} | 62 ++----------------- packages/core/src/testing/gabliam.ts | 8 +-- packages/core/src/testing/loader.ts | 8 +-- 10 files changed, 100 insertions(+), 91 deletions(-) rename packages/core/__tests__/__snapshots__/{config-loader.test.ts.snap => loader-config.test.ts.snap} (100%) rename packages/core/__tests__/__snapshots__/{loader.test.ts.snap => loader-module.test.ts.snap} (98%) rename packages/core/__tests__/{config-loader.test.ts => loader-config.test.ts} (73%) rename packages/core/__tests__/{loader.test.ts => loader-module.test.ts} (82%) create mode 100644 packages/core/src/loaders/index.ts create mode 100644 packages/core/src/loaders/loader-config.ts rename packages/core/src/{loader.ts => loaders/loader-module.ts} (63%) diff --git a/packages/core/__tests__/__snapshots__/config-loader.test.ts.snap b/packages/core/__tests__/__snapshots__/loader-config.test.ts.snap similarity index 100% rename from packages/core/__tests__/__snapshots__/config-loader.test.ts.snap rename to packages/core/__tests__/__snapshots__/loader-config.test.ts.snap diff --git a/packages/core/__tests__/__snapshots__/loader.test.ts.snap b/packages/core/__tests__/__snapshots__/loader-module.test.ts.snap similarity index 98% rename from packages/core/__tests__/__snapshots__/loader.test.ts.snap rename to packages/core/__tests__/__snapshots__/loader-module.test.ts.snap index 3c8b0320..f517a22e 100644 --- a/packages/core/__tests__/__snapshots__/loader.test.ts.snap +++ b/packages/core/__tests__/__snapshots__/loader-module.test.ts.snap @@ -27,7 +27,7 @@ Registry { `; exports[`whitout other scan 2`] = ` -Loader { +LoaderModule { "loadedFolder": Array [ "/__tests__/fixtures/loader/withoutscan", ], @@ -80,7 +80,7 @@ Registry { `; exports[`with plugin 2`] = ` -Loader { +LoaderModule { "loadedFolder": Array [ "/__tests__/fixtures/loader/withoutscan", "/__tests__/fixtures/loader/withscan", @@ -116,7 +116,7 @@ Registry { `; exports[`with plugin and false scan path 2`] = ` -Loader { +LoaderModule { "loadedFolder": Array [ "/__tests__/fixtures/loader/withoutscan", ], @@ -154,7 +154,7 @@ Registry { `; exports[`with scan 2`] = ` -Loader { +LoaderModule { "loadedFolder": Array [ "/__tests__/fixtures/loader/withscan", "/__tests__/fixtures/loader/subfoldertoscan", diff --git a/packages/core/__tests__/config-loader.test.ts b/packages/core/__tests__/loader-config.test.ts similarity index 73% rename from packages/core/__tests__/config-loader.test.ts rename to packages/core/__tests__/loader-config.test.ts index ae7a2caf..4afc3ed9 100644 --- a/packages/core/__tests__/config-loader.test.ts +++ b/packages/core/__tests__/loader-config.test.ts @@ -1,23 +1,21 @@ // tslint:disable:one-line // tslint:disable:no-unused-expression -import { Loader } from '../src/loader'; +import { LoaderConfig } from '../src/loaders'; import * as mock from 'mock-fs'; import * as path from 'path'; -let loader: Loader; +let loader: LoaderConfig; beforeEach(() => { - loader = new Loader(); + loader = new LoaderConfig(); }); test(`with config folder doesn't exist`, () => { - const config = loader.loadConfig('doesntexist/config'); + const config = loader.load('doesntexist/config'); expect(config).toMatchSnapshot(); }); test(`with bad application.yml`, () => { - const config = loader.loadConfig( - path.resolve(__dirname, './fixtures/badyml') - ); + const config = loader.load(path.resolve(__dirname, './fixtures/badyml')); expect(config).toMatchSnapshot(); }); @@ -27,7 +25,7 @@ test(`with application.yml empty`, () => { 'application.yml': `` } }); - const config = loader.loadConfig('test/config'); + const config = loader.load('test/config'); expect(config).toMatchSnapshot(); mock.restore(); }); @@ -41,7 +39,7 @@ test(`with application.yml with nothing`, () => { ` } }); - const config = loader.loadConfig('test/config'); + const config = loader.load('test/config'); expect(config).toEqual({}); mock.restore(); }); @@ -64,17 +62,17 @@ describe('with application.yml', () => { }); test('load application.yml', () => { - const config = loader.loadConfig('test/config'); + const config = loader.load('test/config'); expect(config).toMatchSnapshot(); }); test('load with bad profile', () => { - const config = loader.loadConfig('test/config', 'int'); + const config = loader.load('test/config', 'int'); expect(config).toMatchSnapshot(); }); test('load with prod profile', () => { - const config = loader.loadConfig('test/config', 'prod'); + const config = loader.load('test/config', 'prod'); expect(config).toMatchSnapshot(); }); diff --git a/packages/core/__tests__/loader.test.ts b/packages/core/__tests__/loader-module.test.ts similarity index 82% rename from packages/core/__tests__/loader.test.ts rename to packages/core/__tests__/loader-module.test.ts index c51e64b9..18e3e35e 100644 --- a/packages/core/__tests__/loader.test.ts +++ b/packages/core/__tests__/loader-module.test.ts @@ -1,17 +1,17 @@ // tslint:disable:one-line // tslint:disable:no-unused-expression -import { Loader } from '../src/loader'; +import { LoaderModule } from '../src/loaders'; import * as path from 'path'; import { Scan } from '../src/index'; import { METADATA_KEY } from '../src/constants'; -let loader: Loader; +let loader: LoaderModule; beforeEach(() => { - loader = new Loader(); + loader = new LoaderModule(); }); test('whitout other scan', () => { - const registry = loader.loadModules( + const registry = loader.load( path.resolve(__dirname, './fixtures/loader/withoutscan'), [] ); @@ -20,7 +20,7 @@ test('whitout other scan', () => { }); test('with scan', () => { - const registry = loader.loadModules( + const registry = loader.load( path.resolve(__dirname, './fixtures/loader/withscan'), [] ); @@ -32,7 +32,7 @@ test('with plugin', () => { @Scan(path.resolve(__dirname, './fixtures/loader/withscan')) class Plugin {} - const registry = loader.loadModules( + const registry = loader.load( path.resolve(__dirname, './fixtures/loader/withoutscan'), [new Plugin()] ); @@ -45,7 +45,7 @@ test('with plugin and false scan path', () => { Reflect.defineMetadata(METADATA_KEY.scan, [], Plugin); - const registry = loader.loadModules( + const registry = loader.load( path.resolve(__dirname, './fixtures/loader/withoutscan'), [new Plugin()] ); diff --git a/packages/core/src/gabliam.ts b/packages/core/src/gabliam.ts index 2d164d5f..0f092a8e 100644 --- a/packages/core/src/gabliam.ts +++ b/packages/core/src/gabliam.ts @@ -8,7 +8,7 @@ import { CORE_CONFIG, VALUE_EXTRACTOR } from './constants'; -import { Loader } from './loader'; +import { LoaderModule, LoaderConfig } from './loaders'; import { createContainer } from './container'; import { Registry } from './registry'; import * as d from 'debug'; @@ -34,7 +34,9 @@ export class Gabliam { */ public registry: Registry = new Registry(); - public loader: Loader = new Loader(); + public loaderModule: LoaderModule = new LoaderModule(); + + public loaderConfig: LoaderConfig = new LoaderConfig(); public plugins: interfaces.GabliamPlugin[] = []; @@ -89,7 +91,7 @@ export class Gabliam { * Loading phase */ this.registry.addRegistry( - this.loader.loadModules(this.options.scanPath, this.plugins) + this.loaderModule.load(this.options.scanPath, this.plugins) ); /** @@ -184,7 +186,7 @@ export class Gabliam { * Load config file and bind result in APP_CONFIG */ private _initializeConfig() { - const config = (this.config = this.loader.loadConfig( + const config = (this.config = this.loaderConfig.load( this.options.configPath )); this.container.bind(APP_CONFIG).toConstantValue(config); diff --git a/packages/core/src/loaders/index.ts b/packages/core/src/loaders/index.ts new file mode 100644 index 00000000..e4855ed2 --- /dev/null +++ b/packages/core/src/loaders/index.ts @@ -0,0 +1,2 @@ +export * from './loader-config'; +export * from './loader-module'; diff --git a/packages/core/src/loaders/loader-config.ts b/packages/core/src/loaders/loader-config.ts new file mode 100644 index 00000000..564b6264 --- /dev/null +++ b/packages/core/src/loaders/loader-config.ts @@ -0,0 +1,57 @@ +import * as glob from 'glob'; +import * as yaml from 'js-yaml'; +import * as fs from 'fs'; +import * as _ from 'lodash'; +import * as d from 'debug'; + +const debug = d('Gabliam:loader-config'); + +export class LoaderConfig { + /** + * Load configuration + * @param {string} folder the configuration folder + * @returns any + */ + load(folder: string, profile = process.env.PROFILE || null): any { + debug('loadConfig', folder); + const files = glob.sync('**/application?(-+([a-zA-Z])).yml', { + cwd: folder + }); + let config = {}; + + if (!files || files.length === 0) { + return config; + } + + const defaultProfileFile = files.find(file => file === 'application.yml'); + + if (defaultProfileFile) { + config = this.loadYmlFile(`${folder}/${defaultProfileFile}`); + } + + if (profile) { + const profileFile = files.find( + file => file === `application-${profile}.yml` + ); + + if (profileFile) { + config = _.merge( + {}, + config, + this.loadYmlFile(`${folder}/${profileFile}`) + ); + } + } + debug('loadConfig', config); + return config; + } + + private loadYmlFile(ymlPath: string) { + const data = fs.readFileSync(ymlPath, 'utf8'); + try { + return yaml.load(data) || {}; + } catch (e) { + return {}; + } + } +} diff --git a/packages/core/src/loader.ts b/packages/core/src/loaders/loader-module.ts similarity index 63% rename from packages/core/src/loader.ts rename to packages/core/src/loaders/loader-module.ts index cacb7509..9022dbba 100644 --- a/packages/core/src/loader.ts +++ b/packages/core/src/loaders/loader-module.ts @@ -1,13 +1,11 @@ import * as glob from 'glob'; -import * as yaml from 'js-yaml'; -import * as fs from 'fs'; import * as _ from 'lodash'; import * as d from 'debug'; -import { Registry } from './registry'; -import { METADATA_KEY } from './constants'; -import { RegistryMetada, GabliamPlugin } from './interfaces'; -import { isObject } from './utils'; +import { Registry } from '../registry'; +import { METADATA_KEY } from '../constants'; +import { RegistryMetada, GabliamPlugin } from '../interfaces'; +import { isObject } from '../utils'; const debug = d('Gabliam:loader'); const reg = /^.*(git|svn|node_modules|dist|build).*/; @@ -15,7 +13,7 @@ const reg = /^.*(git|svn|node_modules|dist|build).*/; /** * Loader */ -export class Loader { +export class LoaderModule { /** * List of loaded folder */ @@ -26,7 +24,7 @@ export class Loader { * @param {string} scan * @param {GabliamPlugin[]} plugins */ - loadModules(scan: string, plugins: GabliamPlugin[]) { + load(scan: string, plugins: GabliamPlugin[]) { const folders = plugins.reduce( (prev, current) => { if ( @@ -48,45 +46,6 @@ export class Loader { return this.loadFolders(...folders); } - /** - * Load configuration - * @param {string} folder the configuration folder - * @returns any - */ - loadConfig(folder: string, profile = process.env.PROFILE || null): any { - debug('loadConfig', folder); - const files = glob.sync('**/application?(-+([a-zA-Z])).yml', { - cwd: folder - }); - let config = {}; - - if (!files || files.length === 0) { - return config; - } - - const defaultProfileFile = files.find(file => file === 'application.yml'); - - if (defaultProfileFile) { - config = this.loadYmlFile(`${folder}/${defaultProfileFile}`); - } - - if (profile) { - const profileFile = files.find( - file => file === `application-${profile}.yml` - ); - - if (profileFile) { - config = _.merge( - {}, - config, - this.loadYmlFile(`${folder}/${profileFile}`) - ); - } - } - debug('loadConfig', config); - return config; - } - /** * Load on folder * @param {string} folder @@ -143,13 +102,4 @@ export class Loader { } return registry; } - - private loadYmlFile(ymlPath: string) { - const data = fs.readFileSync(ymlPath, 'utf8'); - try { - return yaml.load(data) || {}; - } catch (e) { - return {}; - } - } } diff --git a/packages/core/src/testing/gabliam.ts b/packages/core/src/testing/gabliam.ts index 66dc89de..399358e0 100644 --- a/packages/core/src/testing/gabliam.ts +++ b/packages/core/src/testing/gabliam.ts @@ -1,6 +1,6 @@ import * as path from 'path'; import { Gabliam } from '../gabliam'; -import { LoaderTest } from './loader'; +import { LoaderConfigTest } from './loader'; import { METADATA_KEY } from '../constants'; import { RegistryMetada } from '../interfaces'; import * as _ from 'lodash'; @@ -8,7 +8,7 @@ import * as _ from 'lodash'; export class GabliamTest { public gab: Gabliam; - public loader: LoaderTest; + public loaderConfig: LoaderConfigTest; constructor(gab?: Gabliam) { if (gab) { @@ -20,7 +20,7 @@ export class GabliamTest { }); } - this.loader = this.gab.loader = new LoaderTest(); + this.loaderConfig = this.gab.loaderConfig = new LoaderConfigTest(); } async build() { @@ -43,7 +43,7 @@ export class GabliamTest { } addConf(p: string, conf: any) { - this.loader.addConfig(p, conf); + this.loaderConfig.addConfig(p, conf); } addClass(ctrl: any) { diff --git a/packages/core/src/testing/loader.ts b/packages/core/src/testing/loader.ts index 716110e7..9c71ae06 100644 --- a/packages/core/src/testing/loader.ts +++ b/packages/core/src/testing/loader.ts @@ -1,15 +1,15 @@ -import { Loader } from '../loader'; +import { LoaderConfig } from '../loaders'; import * as _ from 'lodash'; -export class LoaderTest extends Loader { +export class LoaderConfigTest extends LoaderConfig { conf = {}; addConfig(p: string, conf: any) { this.conf = _.set(this.conf, p, conf); } - loadConfig(folder: string, profile?: string | null): any { - const config = super.loadConfig(folder, profile); + load(folder: string, profile?: string | null): any { + const config = super.load(folder, profile); return _.merge({}, config, this.conf); } }