express-hooks
Advanced tools
Comparing version 1.0.4 to 1.0.5
167
index.js
@@ -8,38 +8,93 @@ 'use strict'; | ||
//console.log(process.mainModule); | ||
const HOOK_PREFIX = 'express-hook-'; | ||
const MAIN_MODULE_FOLDER = path.dirname(module.parent.filename); | ||
let mainModulePath = path.join(MAIN_MODULE_FOLDER, 'package.json'); | ||
let rcFilePath = path.join(MAIN_MODULE_FOLDER, '.expressrc'); | ||
let mainModulePath = path.join(MAIN_MODULE_FOLDER, 'package.json'); | ||
let currentPackage = require(mainModulePath); | ||
const injector = require("lightject"); | ||
const _ = require('lodash'); | ||
const ini = require('ini'); | ||
let HOOKS = {}; | ||
const stripJsonComments = require('strip-json-comments'); | ||
let HOOKS_MAP = new Map(); | ||
function addHook(hookName, realHookInfo) { | ||
function getMetaInformation(realHookInfo) { | ||
let hookInfo = { | ||
name : realHookInfo._name.length ? realHookInfo._name : hookName, | ||
hooks : { | ||
let metaInformation = {}; | ||
if (utils.isFunction(realHookInfo)) { | ||
let tempMeta = {}; | ||
for (let keyName in realHookInfo) { | ||
if (keyName[0] !== '_' || utils.isFunction(metaInformation[keyName])) continue; | ||
metaInformation[keyName] = realHookInfo[keyName]; | ||
} | ||
for (let keyName in realHookInfo.prototype) { | ||
if (keyName[0] !== '_' || utils.isFunction(metaInformation[keyName])) continue; | ||
metaInformation[keyName] = realHookInfo.prototype[keyName]; | ||
} | ||
return metaInformation; | ||
} | ||
if (!utils.isObject(realHookInfo)) return metaInformation; | ||
for (let keyName in metaInformation) { | ||
if (keyName[0] !== '_' || utils.isFunction(metaInformation[keyName])) continue; | ||
metaInformation[keyName] = realHookInfo[keyName]; | ||
} | ||
return metaInformation; | ||
} | ||
function getModuleHooks (realHookInfo) { | ||
let hooks = { | ||
'preinit' : null, | ||
'run' : null, | ||
}; | ||
if (utils.isFunction(realHookInfo)) { | ||
hookInfo.hooks.run = realHookInfo; | ||
if (utils.isFunction(realHookInfo)) { | ||
hooks.run = realHookInfo; | ||
} | ||
if (utils.isObject(hookInfo)) { | ||
hookInfo = utils.extendSettings(realHookInfo, hookInfo); | ||
HOOKS[hookName] = hookInfo; | ||
if (utils.isObject(realHookInfo)) { | ||
for (let hookName in realHookInfo) { | ||
if (hookName[0] === '_' || !utils.isFunction(realHookInfo[hookName]) || !(hookName in hooks)) continue; | ||
hooks[hookName] = realHookInfo[hookName]; | ||
} | ||
} | ||
return hooks; | ||
} | ||
if ('dependencies' in currentPackage) { | ||
function addHook(hookName, realHookInfo) { | ||
let metaInformation = getMetaInformation(realHookInfo); | ||
let hooks = getModuleHooks(realHookInfo); | ||
let defaultHookInfo = { | ||
_name : hookName, | ||
hooks : hooks, | ||
'_weight' : 0, | ||
'_enable' : true | ||
}; | ||
let hookInfo = _.assign({}, defaultHookInfo, metaInformation); | ||
HOOKS_MAP.set(hookName, hookInfo); | ||
} | ||
if ('dependencies' in currentPackage && utils.isObject(currentPackage.dependencies) && Object.keys(currentPackage.dependencies).length) { | ||
for (let depName in currentPackage.dependencies) { | ||
if (depName.indexOf(HOOK_PREFIX) === 0) { | ||
@@ -55,5 +110,43 @@ let hookName = depName.replace(HOOK_PREFIX, '').replace(/^[-]+/, ''); | ||
let rcFileContent = ''; | ||
let rcHooksConfig = {}; | ||
try { | ||
rcFileContent = fs.readFileSync(rcFilePath, 'UTF-8'); | ||
} catch (e) { } | ||
let testEmptyRc = rcFileContent.replace(/[\n ]+/gim, ''); | ||
if (testEmptyRc.length) { | ||
let isParsed = false; | ||
try { | ||
rcHooksConfig = JSON.parse(stripJsonComments(rcFileContent)); | ||
isParsed = true; | ||
} catch (error) {} | ||
if (!isParsed) { | ||
try { | ||
rcHooksConfig = ini.parse(rcFileContent); | ||
isParsed = true; | ||
} catch (error) {} | ||
} | ||
} | ||
/* | ||
TODO | ||
Продумать что должно быть в rc файле (скорее всего настройки и метанастройки хуков) | ||
Проверить чтобы у всех хуков была единые имена в инжекторе | ||
*/ | ||
for (let hookName in rcHooksConfig) { | ||
let hookInfo = HOOKS_MAP.get(hookName); | ||
let metaHookInfo = getMetaInformation(rcHooksConfig[hookName]); | ||
} | ||
/** | ||
@@ -76,34 +169,37 @@ * Hooks | ||
*/ | ||
module.exports = function (app, globalSettings) { | ||
module.exports.initApp = module.exports = function executeRunHooks(app, globalSettings) { | ||
if (app) app.hooks = HOOKS; | ||
injector.value("$hooks_implementations", HOOKS_MAP); | ||
injector.value("$app", app); | ||
injector.value("$settings", globalSettings); | ||
injector.value("$injector", injector); | ||
let promiseStack = []; | ||
for (let hookName in HOOKS) { | ||
if('hooks' in HOOKS[hookName] && 'run' in HOOKS[hookName].hooks && utils.isFunction(HOOKS[hookName].hooks.run)) { | ||
let hookInfo = HOOKS[hookName]; | ||
promiseStack.push(HOOKS[hookName].hooks.run.apply(hookInfo, [app, globalSettings])); | ||
} | ||
} | ||
let hooksResultList = Array.from(HOOKS_MAP.values()) | ||
.filter(hookInfo => hookInfo._enable === true) | ||
.sort((hookInfoPrev, hookInfoNext) => hookInfoPrev._weight === hookInfoNext._weight ? 0 : hookInfoPrev._weight > hookInfoNext._weight ? 1 : -1) | ||
.map(hookInfo => 'hooks' in hookInfo && 'preinit' in hookInfo.hooks && utils.isFunction(hookInfo.hooks.preinit) ? injector.run(hookInfo.hooks.preinit) : null); | ||
Promise.all(promiseStack).then(result => AppEvents.trigger('ready'), error => AppEvents.trigger('error')); | ||
} | ||
Promise.all(hooksResultList).then(result => { | ||
let PromisedList = Array.from(HOOKS_MAP.values()) | ||
.filter(hookInfo => hookInfo._enable === true) | ||
.sort((hookInfoPrev, hookInfoNext) => hookInfoPrev._weight === hookInfoNext._weight ? 0 : hookInfoPrev._weight > hookInfoNext._weight ? 1 : -1) | ||
.map(hookInfo => 'run' in hookInfo.hooks && utils.isFunction(hookInfo.hooks.run) ? injector.run(hookInfo.hooks.run) : null); | ||
return Promise.all(PromisedList); | ||
}) | ||
.then(result => AppEvents.emit('ready', injector), error => { AppEvents.trigger('error', error)}); | ||
return module.exports; | ||
} | ||
for (let utilName in utils) module.exports[utilName] = utils[utilName]; | ||
//console.log(module.exports); | ||
let isReady = false; | ||
AppEvents.on('ready', result => { isReady = true; }); | ||
AppEvents.on('ready', event => { isReady = true; }); | ||
module.exports.ready = function () { | ||
return new Promise(resolve => { | ||
if (isReady) return resolve(); | ||
else AppEvents.on('ready', event => { isReady = true; resovle() }).on('error', e => reject(e)); | ||
}); | ||
return new Promise((resolve, reject) => isReady ? resolve() : AppEvents.on('ready', resolve).on('error', reject)); | ||
} | ||
@@ -116,3 +212,4 @@ | ||
let hoookName = path.basename(hookPath); | ||
addHook(hoookName, hookInfo); | ||
addHook(hoookName, hookInfo); | ||
return module.exports; | ||
} |
{ | ||
"name": "express-hooks", | ||
"version": "1.0.4", | ||
"version": "1.0.5", | ||
"description": "Hooks for Express defined in npm modlues", | ||
@@ -22,3 +22,9 @@ "main": "index.js", | ||
}, | ||
"homepage": "https://github.com/westtrade/express-hooks#readme" | ||
"homepage": "https://github.com/westtrade/express-hooks#readme", | ||
"dependencies": { | ||
"ini": "^1.3.4", | ||
"lightject": "0.0.13", | ||
"lodash": "^4.7.0", | ||
"strip-json-comments": "^2.0.1" | ||
} | ||
} |
@@ -16,13 +16,14 @@ 'use strict'; | ||
let hookExpress = require('../index.js'); | ||
hookExpress | ||
.addCustomHook('./test_custom_hook') | ||
.initApp(app) | ||
.ready() | ||
hookExpress.addCustomHook('./test_custom_hook'); | ||
hookExpress(app, {}); | ||
.then((injector) => { console.log('hi'); }) | ||
.catch((err) => { console.log(err) }) | ||
; | ||
// view engine setup | ||
@@ -29,0 +30,0 @@ app.set('views', path.join(__dirname, 'views')); |
'use strict'; | ||
module.exports.run = function ($app, $settings) { | ||
module.exports = function (app, settings) { | ||
} | ||
console.log('test custom hooks'); | ||
module.exports.preinit = function ($hooks_implementations) { | ||
$hooks_implementations.get('test_custom_hook')._enable = true; | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
15015
17
303
4
+ Addedini@^1.3.4
+ Addedlightject@0.0.13
+ Addedlodash@^4.7.0
+ Addedstrip-json-comments@^2.0.1
+ Addedini@1.3.8(transitive)
+ Addedlightject@0.0.13(transitive)
+ Addedlodash@4.17.21(transitive)
+ Addedstrip-json-comments@2.0.1(transitive)