UNPKG

3.82 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var fs = require("fs");
4var path = require("path");
5var os = require("os");
6var cmn = require("@akashic/akashic-cli-commons");
7var archiver = require("archiver");
8var readdir = require("fs-readdir-recursive");
9var convert_1 = require("./convert");
10function _createExportInfo(param) {
11 return {
12 version: JSON.parse(fs.readFileSync(path.resolve(__dirname, "..", "package.json"), "utf8")).version,
13 option: {
14 force: !!param.force,
15 strip: !!param.strip,
16 minify: !!param.minify,
17 bundle: !!param.bundle,
18 babel: !!param.babel,
19 omitEmptyJs: !!param.omitEmptyJs
20 }
21 };
22}
23function _completeExportZipParameterObject(param) {
24 return {
25 bundle: !!param.bundle,
26 babel: !!param.babel,
27 minify: !!param.minify,
28 strip: !!param.strip,
29 source: param.source || process.cwd(),
30 dest: param.dest || "./game.zip",
31 force: !!param.force,
32 logger: param.logger || new cmn.ConsoleLogger(),
33 hashLength: param.hashLength,
34 omitEmptyJs: param.omitEmptyJs,
35 exportInfo: param.exportInfo || _createExportInfo(param)
36 };
37}
38exports._completeExportZipParameterObject = _completeExportZipParameterObject;
39// TODO akashic-cli-commons に移して export html と実装を共有する
40function _checkDestinationValidity(dest, force) {
41 return new Promise(function (resolve, reject) {
42 fs.stat(path.resolve(dest), function (error, stat) {
43 if (error) {
44 if (error.code === "ENOENT") {
45 resolve();
46 }
47 else {
48 reject(new Error("Error code " + error.code + " for " + dest));
49 }
50 return;
51 }
52 if (!force)
53 reject(new Error(dest + " already exists. Use --force option to overwrite."));
54 else
55 resolve();
56 });
57 });
58}
59exports._checkDestinationValidity = _checkDestinationValidity;
60function promiseExportZip(param) {
61 param = _completeExportZipParameterObject(param);
62 var outZip = /\.zip$/.test(param.dest);
63 var destDir = outZip ? fs.mkdtempSync(path.join(os.tmpdir(), "akashic-export-zip-")) : param.dest;
64 return _checkDestinationValidity(param.dest, param.force)
65 .then(function () {
66 return convert_1.convertGame({
67 bundle: param.bundle,
68 babel: param.babel,
69 minify: param.minify,
70 strip: param.strip,
71 source: param.source,
72 dest: destDir,
73 hashLength: param.hashLength,
74 omitEmptyJs: param.omitEmptyJs,
75 logger: param.logger,
76 exportInfo: param.exportInfo
77 });
78 })
79 .then(function () {
80 if (!outZip)
81 return;
82 return new Promise(function (resolve, reject) {
83 var files = readdir(destDir).map(function (p) { return ({
84 src: path.resolve(destDir, p),
85 entryName: p
86 }); });
87 var ostream = fs.createWriteStream(param.dest);
88 var archive = archiver("zip");
89 ostream.on("close", function () { return resolve(); });
90 archive.on("error", function (err) { return reject(err); });
91 archive.pipe(ostream);
92 files.forEach(function (f) { return archive.file(f.src, { name: f.entryName }); });
93 archive.finalize();
94 });
95 // TODO mkdtempのフォルダを削除すべき?
96 });
97}
98exports.promiseExportZip = promiseExportZip;
99function exportZip(param, callback) {
100 promiseExportZip(param).then(function () { return callback(); }, callback);
101}
102exports.exportZip = exportZip;