1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var fs = require("fs");
|
4 | var path = require("path");
|
5 | var browserify = require("browserify");
|
6 | var Util = require("./Util");
|
7 | var ConsoleLogger_1 = require("./ConsoleLogger");
|
8 | var StringStream_1 = require("./StringStream");
|
9 | var NodeModules;
|
10 | (function (NodeModules) {
|
11 | function listModuleFiles(basepath, modules, logger) {
|
12 | if (logger === void 0) { logger = new ConsoleLogger_1.ConsoleLogger(); }
|
13 | if (modules.length === 0)
|
14 | return Promise.resolve([]);
|
15 | return Promise.resolve()
|
16 | .then(function () { return NodeModules.listScriptFiles(basepath, modules, logger); })
|
17 | .then(function (paths) { return paths.concat(NodeModules.listPackageJsonsFromScriptsPath(basepath, paths)); });
|
18 | }
|
19 | NodeModules.listModuleFiles = listModuleFiles;
|
20 | function listPackageJsonsFromScriptsPath(basepath, filepaths) {
|
21 | var packageJsonPaths = [];
|
22 | var alreadyProcessed = {};
|
23 | filepaths.forEach(function (filepath) {
|
24 | var m = /(.*node_modules\/(?:@.*?\/)?(?:.*?)\/)/.exec(filepath);
|
25 | if (!m)
|
26 | return;
|
27 | var dirPath = m[1];
|
28 | if (alreadyProcessed[dirPath])
|
29 | return;
|
30 | alreadyProcessed[dirPath] = true;
|
31 | var packageJsonPath = Util.makeUnixPath(path.join(basepath, dirPath, "package.json"));
|
32 | try {
|
33 | if (!fs.lstatSync(packageJsonPath).isFile())
|
34 | return;
|
35 | packageJsonPaths.push(Util.makeUnixPath(path.relative(basepath, packageJsonPath)));
|
36 | }
|
37 | catch (e) { }
|
38 | });
|
39 | return packageJsonPaths;
|
40 | }
|
41 | NodeModules.listPackageJsonsFromScriptsPath = listPackageJsonsFromScriptsPath;
|
42 | function listModuleMainScripts(packageJsonFiles) {
|
43 | if (packageJsonFiles.length === 0)
|
44 | return {};
|
45 | var moduleMainScripts = {};
|
46 | for (var i = 0; i < packageJsonFiles.length; i++) {
|
47 | var packageJsonFile = packageJsonFiles[i];
|
48 | var packageJsonData = fs.readFileSync(packageJsonFile, "utf-8");
|
49 | var mainScript;
|
50 | var moduleName;
|
51 | try {
|
52 | var d = JSON.parse(packageJsonData);
|
53 | mainScript = path.join(path.dirname(packageJsonFile), d.main);
|
54 | moduleName = d.name;
|
55 | }
|
56 | catch (e) {
|
57 |
|
58 | }
|
59 | if (moduleName && moduleName !== "" && mainScript && mainScript !== "") {
|
60 | moduleMainScripts[moduleName] = Util.makeUnixPath(mainScript);
|
61 | }
|
62 | }
|
63 | return moduleMainScripts;
|
64 | }
|
65 | NodeModules.listModuleMainScripts = listModuleMainScripts;
|
66 | function listScriptFiles(basepath, modules, logger) {
|
67 | if (modules.length === 0)
|
68 | return Promise.resolve([]);
|
69 | var moduleNames = (typeof modules === "string") ? [modules] : modules;
|
70 |
|
71 |
|
72 |
|
73 | var dummyRootName = path.join(basepath, "__akashic-cli_dummy_require_root.js");
|
74 | var rootRequirer = moduleNames.map(function (name) {
|
75 | return "require(\"" + Util.makeModuleNameNoVer(name) + "\");";
|
76 | }).join("\n");
|
77 |
|
78 |
|
79 |
|
80 | var ignoreModulePaths = ["/akashic-cli-commons/node_modules/"];
|
81 | var b = browserify({
|
82 | entries: new StringStream_1.StringStream(rootRequirer, dummyRootName),
|
83 | basedir: basepath,
|
84 | builtins: true
|
85 | });
|
86 | b.external("g");
|
87 | return new Promise(function (resolve, reject) {
|
88 | var filePaths = [];
|
89 | b.on("dep", function (row) {
|
90 | var filePath = Util.makeUnixPath(path.relative(basepath, row.file));
|
91 | if (!(/^(?:\.\/)?node_modules/.test(filePath))) {
|
92 | return;
|
93 | }
|
94 | if (/^\.\.\//.test(filePath)) {
|
95 | var rawFilePath_1 = Util.makeUnixPath(row.file);
|
96 | if (ignoreModulePaths.find(function (modulePath) { return rawFilePath_1.includes(modulePath); })) {
|
97 | var detectedModuleName = path.basename(path.dirname(filePath));
|
98 | var msg_1 = "Reference to '" + detectedModuleName
|
99 | + "' is detected and skipped listing."
|
100 | + " Akashic content cannot depend on core modules of Node.js."
|
101 | + " You should build your game runnable without '" + detectedModuleName + "'.";
|
102 | logger.warn(msg_1);
|
103 | return;
|
104 | }
|
105 | var msg = "Unsupported module found in " + JSON.stringify(modules)
|
106 | + ". Skipped listing '" + filePath
|
107 | + "' that cannot be dealt with. (This may be a core module of Node.js)";
|
108 | reject(new Error(msg));
|
109 | return;
|
110 | }
|
111 | filePaths.push(filePath);
|
112 | });
|
113 | b.bundle(function (err) {
|
114 | err ? reject(err) : resolve(filePaths);
|
115 | });
|
116 | });
|
117 | }
|
118 | NodeModules.listScriptFiles = listScriptFiles;
|
119 | })(NodeModules = exports.NodeModules || (exports.NodeModules = {}));
|