diff --git a/README.md b/README.md index 7fcc440..4d926f4 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,9 @@ yarn add awilix-router-core The end-user of the routing library will be able to use decorators or a builder pattern to declaratively set up their routes, middleware and methods. +**Note**: in the examples below, an ES6 `default` export is used, but named exports and multiple exports +per file are supported. + ## With decorators ```js diff --git a/__fixtures__/mixedExports.js b/__fixtures__/mixedExports.js new file mode 100644 index 0000000..f30951e --- /dev/null +++ b/__fixtures__/mixedExports.js @@ -0,0 +1,9 @@ +const { createController } = require('../src/controller') + +class MixedDefaultExportClass {} +MixedDefaultExportClass.isMixedDefaultExport = true +module.exports.default = createController(MixedDefaultExportClass) + +class MixedNamedExportClass {} +MixedNamedExportClass.isMixedNamedExport = true +module.exports.MixedNamedExportClass = createController(MixedNamedExportClass) diff --git a/__fixtures__/mixedModuleExports.js b/__fixtures__/mixedModuleExports.js new file mode 100644 index 0000000..f2ce218 --- /dev/null +++ b/__fixtures__/mixedModuleExports.js @@ -0,0 +1,13 @@ +const { createController } = require('../src/controller') + +class MixedModuleExportsClass {} +MixedModuleExportsClass.isMixedModuleExports = true +module.exports = createController(MixedModuleExportsClass) + +class MixedModuleDefaultExportClass {} +MixedModuleDefaultExportClass.isMixedModuleDefaultExport = true +module.exports.default = createController(MixedModuleDefaultExportClass) + +class MixedModuleNamedExportClass {} +MixedModuleNamedExportClass.isMixedModuleNamedExport = true +module.exports.MixedModuleNamedExportClass = createController(MixedModuleNamedExportClass) diff --git a/__fixtures__/moduleNoneExports.js b/__fixtures__/moduleNoneExports.js new file mode 100644 index 0000000..7209432 --- /dev/null +++ b/__fixtures__/moduleNoneExports.js @@ -0,0 +1 @@ +module.exports = null diff --git a/__fixtures__/namedExport.js b/__fixtures__/namedExport.js new file mode 100644 index 0000000..a8a0848 --- /dev/null +++ b/__fixtures__/namedExport.js @@ -0,0 +1,5 @@ +const { createController } = require('../src/controller') + +class NamedExportClass {} +NamedExportClass.isNamedExport = true +module.exports.NamedExportClass = createController(NamedExportClass) diff --git a/src/__tests__/find-controllers.test.ts b/src/__tests__/find-controllers.test.ts index f1f730e..6c9ef83 100644 --- a/src/__tests__/find-controllers.test.ts +++ b/src/__tests__/find-controllers.test.ts @@ -5,8 +5,30 @@ describe('findControllers', () => { const result = findControllers('__fixtures__/*.js', { absolute: true }) const moduleExports = result.find((x: any) => x.target.isModuleExports) const defaultExports = result.find((x: any) => x.target.isDefaultExport) - expect(result.length).toBe(2) + const namedExports = result.find((x: any) => x.target.isNamedExport) + const mixedDefaultExports = result.find( + (x: any) => x.target.isMixedDefaultExport + ) + const mixedNamedExports = result.find( + (x: any) => x.target.isMixedNamedExport + ) + const mixedModuleExports = result.find( + (x: any) => x.target.isMixedModuleExports + ) + const mixedModuleDefaultExports = result.find( + (x: any) => x.target.isMixedModuleDefaultExport + ) + const mixedModuleNamedExports = result.find( + (x: any) => x.target.isMixedModuleNamedExport + ) + expect(result.length).toBe(6) expect(typeof (moduleExports as any).target).toBe('function') expect(typeof (defaultExports as any).target).toBe('function') + expect(typeof (namedExports as any).target).toBe('function') + expect(typeof (mixedDefaultExports as any).target).toBe('function') + expect(typeof (mixedNamedExports as any).target).toBe('function') + expect(typeof (mixedModuleExports as any).target).toBe('function') + expect(mixedModuleDefaultExports).toBeUndefined() + expect(mixedModuleNamedExports).toBeUndefined() }) }) diff --git a/src/find-controllers.ts b/src/find-controllers.ts index 1a239b8..811aeb3 100644 --- a/src/find-controllers.ts +++ b/src/find-controllers.ts @@ -19,14 +19,25 @@ export function findControllers( const result = glob.sync(pattern, opts) return result .map(path => { + const items: Array = [] + let required = require(path) - // Support default exports (ES6). - if (required.default) { - required = required.default + if (required) { + const stateAndTarget = getStateAndTarget(required) + if (stateAndTarget) { + items.push(stateAndTarget) + return items + } + + // loop through exports - this will cover named as well as a default export + for (const key of Object.keys(required)) { + items.push(getStateAndTarget(required[key])) + } } - return getStateAndTarget(required) + return items }) + .reduce((acc, cur) => acc.concat(cur), []) .filter(x => x !== null) as FindControllersResult }