-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathbuild.js
More file actions
144 lines (117 loc) · 4 KB
/
Copy pathbuild.js
File metadata and controls
144 lines (117 loc) · 4 KB
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/usr/bin/env node
/*
* Build script for van11y-accessible-tab-panel-aria.
*
* Replaces the previous gulp-based pipeline while keeping the exact same
* output files in `dist/`:
* - dist/<name>.es6.js (copy of the ES2015 source)
* - dist/<name>.js (ES5 transpilation)
* - dist/<name>.min.js (minified ES5 with banner)
*
* Usage:
* node build.js # default: same as the old `gulp` task
* node build.js --es5 # same as the old `gulp es5` task
*/
'use strict';
const fs = require('fs');
const path = require('path');
const babel = require('@babel/core');
const { minify } = require('terser');
const pkg = require('./package.json');
const ROOT = __dirname;
const SRC_DIR = path.join(ROOT, 'src');
const DIST_DIR = path.join(ROOT, 'dist');
const BANNER = [
'/**',
` * ${pkg.name} - ${pkg.description}`,
` * @version v${pkg.version}`,
` * @link ${pkg.homepage}`,
` * @license ${pkg.license} : https://github.com/nico3333fr/van11y-accessible-tab-panel-aria/blob/master/LICENSE`,
' */',
''
].join('\n');
const BABEL_OPTIONS = {
babelrc: false,
configFile: false,
compact: false,
presets: [
[require.resolve('@babel/preset-env'), {
targets: { ie: '9' },
modules: false,
loose: true
}]
]
};
function ensureDir(dir) {
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
}
function listFiles(dir, predicate) {
if (!fs.existsSync(dir)) return [];
return fs.readdirSync(dir).filter(predicate);
}
async function transpileEs6Files() {
const files = listFiles(SRC_DIR, (f) => f.endsWith('.es6.js'));
for (const file of files) {
const srcPath = path.join(SRC_DIR, file);
const baseName = file.replace(/\.es6\.js$/, '');
const source = fs.readFileSync(srcPath, 'utf8');
const { code } = await babel.transformAsync(source, BABEL_OPTIONS);
const jsPath = path.join(DIST_DIR, `${baseName}.js`);
fs.writeFileSync(jsPath, code);
console.log(` wrote ${path.relative(ROOT, jsPath)}`);
const minified = await minify(code, {
output: { comments: false }
});
if (minified.error) throw minified.error;
const minPath = path.join(DIST_DIR, `${baseName}.min.js`);
fs.writeFileSync(minPath, BANNER + minified.code);
console.log(` wrote ${path.relative(ROOT, minPath)}`);
}
}
async function copyAndMinifyPlainJsFiles() {
const files = listFiles(
SRC_DIR,
(f) => f.endsWith('.js') && !f.endsWith('.es6.js')
);
for (const file of files) {
const srcPath = path.join(SRC_DIR, file);
const baseName = file.replace(/\.js$/, '');
const source = fs.readFileSync(srcPath, 'utf8');
const jsPath = path.join(DIST_DIR, file);
fs.writeFileSync(jsPath, source);
console.log(` wrote ${path.relative(ROOT, jsPath)}`);
const minified = await minify(source, {
output: { comments: false }
});
if (minified.error) throw minified.error;
const minPath = path.join(DIST_DIR, `${baseName}.min.js`);
fs.writeFileSync(minPath, BANNER + minified.code);
console.log(` wrote ${path.relative(ROOT, minPath)}`);
}
}
function copyEs6SourcesToDist() {
const files = listFiles(SRC_DIR, (f) => f.endsWith('.es6.js'));
for (const file of files) {
const srcPath = path.join(SRC_DIR, file);
const destPath = path.join(DIST_DIR, file);
fs.copyFileSync(srcPath, destPath);
console.log(` wrote ${path.relative(ROOT, destPath)}`);
}
}
async function main() {
const onlyEs5 = process.argv.includes('--es5');
ensureDir(DIST_DIR);
console.log(onlyEs5 ? 'Building (es5 only)…' : 'Building…');
await transpileEs6Files();
if (!onlyEs5) {
await copyAndMinifyPlainJsFiles();
copyEs6SourcesToDist();
}
console.log('Done.');
}
main().catch((err) => {
console.error(err);
process.exit(1);
});