UNPKG

6.14 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var fs = require("fs");
4var path = require("path");
5var browserify = require("browserify");
6var Util = require("./Util");
7var ConsoleLogger_1 = require("./ConsoleLogger");
8var StringStream_1 = require("./StringStream");
9var 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) { /* nothing */ }
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 // do nothing
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 // moduleNamesをrequireするだけのソースコード文字列を作って依存性解析の基点にする
71 // (moduleNamesを直接b.require()してもよいはずだが、そうするとモジュールのエントリポイントの代わりに
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 // akashicコンテンツが Node.js のコアモジュールを参照するモジュールに依存している場合、
78 // akashic-cli-commons/node_modules 以下への依存として表現される。
79 // これを検知した場合、そのモジュールへの依存はgame.jsonに追記せず、akashicコマンドユーザには警告を表示する。
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 // builtins (コアモジュール) はサポートしていないが、b.on("dep", ...) で検出するために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 = {}));