-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
prepare.js
108 lines (94 loc) · 3.36 KB
/
prepare.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// prepare.js
// Copyright (C) 2020 Kaz Nishimura
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//
// SPDX-License-Identifier: MIT
"use strict";
let {basename} = require("path");
let {argv, exit, env, cwd} = require("process");
let {spawnSync} = require("child_process");
let {mkdirSync, readFileSync, writeFileSync} = require("fs");
let Terser = require("terser");
const PACKAGE_NAME = env["npm_package_name"] || "unknown";
const PACKAGE_VERSION = env["npm_package_version"] || "0.0.0";
/**
* Options for `terser.minify`.
*/
const MINIFY_OPTIONS = Object.freeze({
ecma: 6,
module: true,
});
/**
* Options for reading and writing files.
*/
const FILE_OPTIONS = Object.freeze({
encoding: "UTF-8",
});
/**
* Prepares scripts for deployment.
*
* @param {Array<string>} args command-line arguments after the script name
* @return {Promise<number>} exit status
*/
async function main(args)
{
if (args == null) {
args = [];
}
let outputdir = `${cwd()}/deploy`;
let result = spawnSync("rm", ["-rf", outputdir], {stdio: "inherit"});
if (result.status != 0) {
exit(1);
}
mkdirSync(outputdir, {recursive: true});
for (let script of args) {
console.log("Processing '%s'", script);
let content = readFileSync(script, FILE_OPTIONS);
let filteredContent = content
.replace(/[@]PACKAGE_NAME[@]/g, PACKAGE_NAME)
.replace(/[@]PACKAGE_VERSION[@]/g, PACKAGE_VERSION);
let name = basename(script);
writeFileSync(`${outputdir}/${name}`, filteredContent, FILE_OPTIONS);
if (name.endsWith(".js")) {
let minifiedName = name.replace(/\.js$/, ".min.js");
let options = Object.assign({}, MINIFY_OPTIONS, {
sourceMap: {
url: `${minifiedName}.map`,
},
});
let minified = await Terser.minify({
[name]: filteredContent,
}, options);
writeFileSync(`${outputdir}/${minifiedName}`, minified.code,
FILE_OPTIONS);
if (minified.map != null) {
writeFileSync(`${outputdir}/${minifiedName}.map`,
minified.map, FILE_OPTIONS);
}
}
}
return 0;
}
if (require.main === module) {
main(argv.slice(2))
.then((status) => {
exit(status);
});
}