function inputPathToRequireName(input, root) { var resolvedInputPath = path.relative(root, input); var result = resolvedInputPath .replace(/\.js$/, "") .replace(/^(\..\/)+/, ""); return unixify(result); }
var resolvedModulePaths = modulePaths.map(function (m) { try { var resolvedModule = resolve(path.resolve(options.input), m); } catch (err) { throw "Error: Can't resolve module \"" + m + "\" from \"" + options.input + '"'; } var result = path.relative(options.root, resolvedModule); result = unixify(result); return result; });
function cutNodeModule(inputName, options) { var cwd = path.join(options.root, inputName); var p = readPkgUp.sync({cwd: cwd}); var name = p.pkg.name; var main = p.pkg.main; var lib = unixify(path.join(name, main)); if (inputName === lib || (inputName + ".js") === lib) { inputName = name; } return inputName; }
function convert(options) { var inputData = options.inputData; if (!inputData) { try { inputData = fs.readFileSync(options.input, "utf8"); } catch (err) { throw "Error: Can't read input file \"" + options.input + "\". " + err.code; } } var requireInputName = inputPathToRequireName(options.input, options.root); if (options.cutNodePath) { var realPath = null; try { realPath = require.resolve(requireInputName); } catch (e) { } if (realPath) { var p = readPkgUp.sync({cwd: realPath}); var name = p.pkg.name; var main = p.pkg.main; var lib = unixify(path.join(name, main)); if (requireInputName === lib || (requireInputName + ".js") === lib) { requireInputName = name; } } } var dependencies = getDependencies({ inputData: inputData, input: options.input, cutNodePath: options.cutNodePath, root: options.root }); var modulesListInDefine = "[" + dependencies .map(function(d) { if (options.cutNodePath) { return cutNodeModule(d.requireName, {root: options.root}); } return d.requireName; }) .map(function (name) { return '"' + name + '"'; }).join(", ") + "]"; var modulesListInFunction = dependencies.map(function (d) { return d.jsName; }).join(", "); var body = inputData.replace(/require\(['"]([^'"]+)['"]\)/g, function(_, modulePath) { var dependency = dependencies.find(function(d) { return d.originalPath == modulePath; }); return dependency.jsName; }); var converted = (options.require ? "require(" : 'define("' + (options.name || requireInputName) + '", ') + (dependencies.length ? modulesListInDefine : "[]") + ", " + "function (" + (dependencies.length ? modulesListInFunction : "") + ") {\n" + "var exports = {}, module = { exports: exports };\n\n" + body + "\n" + ((options.global && options.name) ? 'window["' + options.name + '"] = module.exports;\n' : "") + "return module.exports;\n" + "});"; if (options.recursive) { var res = options._deps || {}; res[requireInputName] = converted; dependencies.forEach(function (d) { if (res[d.requireName]) { return; } var dependencyRes = convert({ input: path.join(options.root, d.resolvedPath), root: options.root, recursive: true, _deps: res, cutNodePath: options.cutNodePath, _recursiveReally: true }); res = merge(res, dependencyRes); }); if (options._recursiveReally === undefined) { if (options.bundle) { if (options.noDefineSelf) { var key = Object.keys(res)[0]; res[key] = ""; } res = createBundle(res, options); } } return res; } else { return converted; } }