Skip to content

Instantly share code, notes, and snippets.

@BideoWego
Created April 16, 2017 07:37
Show Gist options
  • Save BideoWego/c2de0ab1df7f335137d8dbf69372e288 to your computer and use it in GitHub Desktop.
Save BideoWego/c2de0ab1df7f335137d8dbf69372e288 to your computer and use it in GitHub Desktop.
Code for recursively requiring helpers and allows extending them
// Requires the `qs` package
var qs = require('qs');
var path = require('path');
var url = require('url');
module.exports = (helpers) => {
helpers.registerDirectory('url/', (helper) => {
Object.keys(helper).forEach((key) => {
var fn = helper[key];
var extended = (...args) => {
var n = args.length;
var lastArg = args[n - 1];
var query = '';
if (typeof lastArg === 'object') {
query = qs.stringify(lastArg);
args.pop();
}
var helperUrl = fn.apply(helper, args);
var parsedUrl = url.parse(helperUrl);
if (query) {
if (parsedUrl.search) {
parsedUrl.search += `&${ query }`;
} else {
parsedUrl.search = `?${ query }`;
}
}
return url.format(parsedUrl);
};
helper[key] = extended;
});
});
};
var fs = require('fs');
var path = require('path');
var express = require('express');
var basename = path.basename(__filename);
var Helpers = {};
Helpers.registered = {};
Helpers.register = function(key, cb) {
if (typeof key === 'object') {
var helpers = key;
for (var key in helpers) {
var cb = helpers[key];
this.registered[key] = cb;
}
} else {
this.registered[key] = cb;
}
};
Helpers.registerModule = function(helperModule) {
for (var key in helperModule) {
var value = helperModule[key];
this.register(key, value);
}
};
Helpers.registerDirectory = function(directory, cb) {
directory = directory || '';
var files = fs.readdirSync(`${ __dirname }/${ directory }`);
files.forEach((filename) => {
if (filename !== basename) {
var helperModule = require(`./${directory}${ filename }`);
if (typeof helperModule === 'function') {
helperModule = helperModule(Helpers);
}
if (cb) {
cb(helperModule);
}
for (var key in helperModule) {
var value = helperModule[key];
Helpers.register(key, value);
}
}
});
};
Helpers.registerDirectory();
Helpers.globalize = () => {
Object.keys(Helpers.registered).forEach((key) => {
global[key] = Helpers.registered[key];
});
return Helpers;
};
module.exports = Helpers;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment