-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathbuild.mjs
92 lines (82 loc) · 2.62 KB
/
build.mjs
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
import fs from 'node:fs';
import path from 'node:path';
import { createRequire } from 'node:module';
import { fileURLToPath } from 'node:url';
import libEsm from 'lib-esm';
// const iswatch = process.argv.slice(2).includes('--watch');
const CJS = {
__filename: fileURLToPath(import.meta.url),
__dirname: path.dirname(fileURLToPath(import.meta.url)),
require: createRequire(import.meta.url),
};
/**
* @see https://stackoverflow.com/questions/9781218/how-to-change-node-jss-console-font-color
* @see https://en.wikipedia.org/wiki/ANSI_escape_code#Colors
*/
const colours = {
$_$: c => str => `\x1b[${c}m` + str + '\x1b[0m',
gary: str => colours.$_$(90)(str),
cyan: str => colours.$_$(36)(str),
yellow: str => colours.$_$(33)(str),
green: str => colours.$_$(32)(str),
red: str => colours.$_$(31)(str),
};
const presetsDir = path.join(CJS.__dirname, 'presets');
const presetRE = /(.+)-(v[\d._]+)\.js$/;
const files = fs.readdirSync(presetsDir).filter(file => presetRE.test(file));
/** @type {Record<string, Record<string, string>>} */
const records = {};
for (const file of files) {
const [, name, version] = presetRE.exec(file);
const dot2_ = str => str.replace('.', '_'); // . -> _
const record = { [dot2_(version)]: file };
if (records[name]) {
Object.assign(records[name], record);
} else {
records[name] = record;
}
}
// generate lib.json
const libfile = path.join(presetsDir, 'libs.json');
fs.writeFileSync(libfile, JSON.stringify(records, null, 2));
console.log(
colours.cyan('[write]'),
colours.gary(new Date().toLocaleTimeString()),
libfile,
);
// generate lib.d.ts
const types = [];
for (const [name, versions] of Object.entries(records)) {
const vs = Object.keys(versions);
types.push(`export declare const ${name.replaceAll('-', '_')}: {
${vs.map(v => ` ${v}: string`).join('\n')}
}`);
}
const typesfile = path.join(presetsDir, 'libs.d.ts');
fs.writeFileSync(typesfile, types.join('\n'));
console.log(
colours.cyan('[write]'),
colours.gary(new Date().toLocaleTimeString()),
typesfile,
);
// generate index.mjs
const cjsFiles = [
'presets/index.js'
];
for (const file of cjsFiles) {
const filename = path.join(CJS.__dirname, file);
const basename = path.basename(filename);
const destname = filename.replace('.js', '.mjs');
const members = Object.keys(CJS.require(filename));
const snippets = libEsm({
require: `./${basename}`,
exports: members,
});
fs.writeFileSync(destname, `${snippets.require}\n${snippets.exports}`);
console.log(
colours.cyan('[write]'),
colours.gary(new Date().toLocaleTimeString()),
destname,
);
}
console.log(colours.green('build success'));