thamaraaalves
2/25/2020 - 5:42 AM

require.context customized to import models dynamicly

/** my personalized require.context 
 * did it, cause got require.context is not a function,
 * even using @types/webpack-env
 * Thamara Silva Alves
 * 25.02.2020
 */
if (typeof require.context === 'undefined') {
  const fs = require('fs');
  const path = require('path');
  // path: string, deep?: boolean, filter?: RegExp, mode?: "sync" | "eager" | "weak" | "lazy" | "lazy-once")
  require.context = (base = '.', scanSubDirectories = true, regularExpression = /\.ts$/, resolve = 'sync') => {
    const files = {};
    function readDirectory(directory) {
      fs.readdirSync(directory).forEach((file) => {
        const fullPath = path.resolve(directory, file);
       
        if (fs.statSync(fullPath).isDirectory()) {
          if (scanSubDirectories) readDirectory(fullPath);
          return;
        }
        if (!regularExpression.test(fullPath)) return;
        files[fullPath] = true;
      });
    }
    readDirectory(path.resolve(__dirname, base));
    function Module(file) {
      return require(file);
    }
    Module.keys = () => Object.keys(files);
    Module.resolve = (id: String) => ''; // gonna improve it 
    Module.id = ''; // gonna improve it 
    return Module;
  };
}

const requireModule = require.context('.', true, /\.ts$/)
requireModule.keys().forEach(fileName => {
  const path = fileName.replace(/(\.\/|\.ts)/g, '')
  const splited = path.split(/\.\/|\\/g)
  const moduleName = splited[splited.length-1]
  const folderName = splited[splited.length-2]
  const notAllowed = ['buildModel', 'index']
  let exportedModules = (!notAllowed.includes(moduleName)) ? require(`./${folderName}/${moduleName}`) : ''
  for (let elem in exportedModules) {
    module.exports[elem] = exportedModules[elem]
  }
})