Skip to content

Commit

Permalink
Merge pull request #30 from kadirahq/require-context
Browse files Browse the repository at this point in the history
Add support for require.context
  • Loading branch information
roonyh committed Sep 30, 2016
2 parents e439c73 + b4de108 commit d1b8927
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 2 deletions.
11 changes: 9 additions & 2 deletions src/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import chokidar from 'chokidar';
import EventEmitter from 'events';
import loadBabelConfig from '@kadira/storybook/dist/server/babel_config';
import { filterStorybook } from './util';
import runWithRequireContext from './require_context';
const babel = require('babel-core');

program
.option('-c, --config-dir [dir-name]',
Expand All @@ -31,7 +33,7 @@ const {
exclude,
} = program;

const configPath = path.resolve(`${configDir}`, 'config');
const configPath = path.resolve(configDir, 'config.js');

const babelConfig = loadBabelConfig(configDir);

Expand Down Expand Up @@ -64,7 +66,12 @@ const runner = new Runner(program);

async function main() {
try {
require(configPath);
const content = babel.transformFileSync(configPath, babelConfig).code;
const contextOpts = {
filename: configPath,
dirname: path.resolve(configDir),
};
runWithRequireContext(content, contextOpts);
const storybook = require('@kadira/storybook').getStorybook();
const addons = require('@kadira/storybook-addons').default;

Expand Down
44 changes: 44 additions & 0 deletions src/require_context.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import vm from 'vm';
import fs from 'fs';
import path from 'path';
import moduleSystem from 'module';

function requireModules(keys, root, directory, regExp, recursive) {
const files = fs.readdirSync(path.join(root, directory));

files.forEach((filename) => {
if (regExp.test(filename)) {
// webpack adds a './' to the begining of the key
// TODO: Check this in windows
const entryKey = `./${path.join(directory, filename)}`;
// eslint-disable-next-line no-param-reassign, global-require, import/no-dynamic-require
keys[entryKey] = require(path.join(root, directory, filename));
return;
}

if (!recursive) {
return;
}

if (fs.statSync(path.join(root, directory, filename)).isDirectory()) {
requireModules(keys, root, path.join(directory, filename), regExp, recursive);
}
});
}

export default function runWithRequireContext(content, options) {
const { filename, dirname } = options;

require.context = (directory, useSubdirectories = false, regExp = /^\.\//) => {
const fullPath = path.resolve(dirname, directory);
const keys = {};
requireModules(keys, fullPath, '.', regExp, useSubdirectories);

const req = f => (keys[f]);
req.keys = () => (Object.keys(keys));
return req;
};

const compiledModule = vm.runInThisContext(moduleSystem.wrap(content));
compiledModule(module.exports, require, module, filename, dirname);
}

0 comments on commit d1b8927

Please sign in to comment.