lilacs
Version:
A web frontend building tool for teamwork, with automaticly compiling, merging, minifying, syncing files to server, supporting distributed servers, ensuring css or html files' inline reference with correct absolute path, and more.
142 lines (120 loc) • 3.79 kB
JavaScript
const _ = require('lodash');
const fs = require('fs');
const fsExtra = require('fs-extra');
const getAmdDependenciesFromContent = require('./get_amd_dependencies_from_content');
const getRealJsModules = require('./get_real_js_modules');
const getFilePathFromPackage = require('./get_file_path_from_package');
const fileUtil = require('./file');
/**
* get all require-js modules
*
* @returns {*}
* @param projectConfig
* @param entryModule
*/
module.exports = (projectConfig, entryModule) => {
/**
* require-js config and path, deps
* @type {*|{}}
*/
var config = projectConfig.requireJsConfig || {};
var configPaths = config.paths || {};
var configShim = config.shim || {};
/**
* ultimate result
* @type {[]}
*/
var ultimateModules = [];
/**
* dependencies
*
* example: moduleName -> deps(array)
*
* @type {{}}
*/
var moduleDeps = {};
/**
* find module dependency record
* @type {Array}
*/
var foundModules = [];
/**
* get module list record
*
* @type {Array}
*/
var loadedModules = [];
/**
* get all module dependencies
* @param name
*/
var getDependencies = (name) => {
if (foundModules.indexOf(name) != -1) return;
foundModules.push(name);
// make default
var realJsModule = name;
/**
* {
* jquery: 'lib/jquery/jquery'
* }
*
* require(['jquery']);
*/
if (configPaths[name]) realJsModule = configPaths[name];
/**
* {
* 'jquery-ui': 'lib/jquery-ui'
* }
*
* require(['jquery-ui/jquery-ui']);
*/
else if (name.indexOf('/') > -1) {
var nameArray = name.split('/'),
nameParent = nameArray.shift();
if (configPaths[nameParent]) {
realJsModule = configPaths[nameParent] + '/' + nameArray.join('/');
}
}
let jsFilePath = projectConfig.buildPaths.copiedDev.js + '/' + realJsModule + '.js';
let jsFileContent = '';
// do not exist in project
if (!fileUtil.fileExist(jsFilePath)) {
let realFilePath = getFilePathFromPackage(realJsModule, !0);
if (!realFilePath || !fileUtil.fileExist(realFilePath)) {
logger.error(`file not found corresponding to js module: ${name}`);
process.exit(1);
}
jsFileContent = fsExtra.readFileSync(realFilePath, 'utf8');
fsExtra.outputFileSync(jsFilePath, jsFileContent);
}
else {
jsFileContent = fsExtra.readFileSync(jsFilePath, 'utf8');
}
let configDep = configShim[name] && configShim[name].deps || [];
let contentDep = getRealJsModules(getAmdDependenciesFromContent(jsFileContent), realJsModule);
let currentDep = _.concat([], configDep, contentDep);
moduleDeps[name] = currentDep;
currentDep.forEach((subName) => {
getDependencies(subName);
});
};
/**
* load module
* @param name
*/
var loadModule = (name) => {
if (loadedModules.indexOf(name) != -1) return;
loadedModules.push(name);
var deps = moduleDeps[name] || [];
deps.length && deps.forEach((subName) => {
loadModule(subName);
});
var realName = configPaths[name] ? configPaths[name] : name;
if (ultimateModules.indexOf(realName) === -1) {
ultimateModules.push(realName);
}
};
getDependencies(entryModule || projectConfig.module);
loadModule(entryModule || projectConfig.module);
return ultimateModules;
};