1 | "use strict";
|
2 | const deleteEmpty = require("delete-empty");
|
3 | const fs = require("fs");
|
4 | const path_1 = require("path");
|
5 | const addConfig_1 = require("../fns/add-cmd/addConfig");
|
6 | const cmdName_1 = require("../fns/cmdName");
|
7 | const getFiles_1 = require("../fns/getFiles");
|
8 | function getNonEmptyLines(contents) {
|
9 | return contents.trim()
|
10 | .split(/\n/g)
|
11 | .map(l => l.trim())
|
12 | .filter(l => !!l);
|
13 | }
|
14 | function processDts(dirs) {
|
15 | const files = getFiles_1.getFiles(dirs, 'd.ts');
|
16 | if (!files.length) {
|
17 | return;
|
18 | }
|
19 | const reg = /^export\s*{};?\s*$/;
|
20 | for (const file of files) {
|
21 | const contents = fs.readFileSync(file, 'utf8');
|
22 | const lines = getNonEmptyLines(contents);
|
23 | if (lines.length !== 1 || !reg.test(lines[0])) {
|
24 | continue;
|
25 | }
|
26 | fs.unlinkSync(file);
|
27 | }
|
28 | }
|
29 | const jsReg = {
|
30 |
|
31 | defEsm: /^\s*Object\s*\.\s*defineProperty\s*\(\s*(module\s*\.\s*)?exports\s*,\s*['"]__esModule['"]\s*,\s*{\s*value\s*:\s*true\s*}\s*\)\s*;?\s*$/i,
|
32 | srcMap: /^\s*\/\s*\/\s*#\s*sourceMappingURL\s*=\s*.+\s*$/i,
|
33 | useStrict: /^\s*['"]use strict['"]\s*;?\s*$/i
|
34 | };
|
35 | function getLineType(line) {
|
36 | if (jsReg.defEsm.test(line)) {
|
37 | return 0 ;
|
38 | }
|
39 | else if (jsReg.srcMap.test(line)) {
|
40 | return 1 ;
|
41 | }
|
42 | else if (jsReg.useStrict.test(line)) {
|
43 | return 2 ;
|
44 | }
|
45 | else {
|
46 | return 3 ;
|
47 | }
|
48 | }
|
49 | function shouldDeleteJs(lines) {
|
50 |
|
51 | let l1;
|
52 | let l2;
|
53 | switch (lines.length) {
|
54 | case 1:
|
55 | return getLineType(lines[0]) !== 3 ;
|
56 | case 2:
|
57 | l1 = getLineType(lines[0]);
|
58 | l2 = getLineType(lines[1]);
|
59 | return ((l1 === 2 && (l2 === 0 || l2 === 1 ))
|
60 | || (l1 === 0 && l2 === 1 ));
|
61 | case 3:
|
62 | l1 = getLineType(lines[0]);
|
63 | l2 = getLineType(lines[1]);
|
64 | const l3 = getLineType(lines[2]);
|
65 | return l1 === 2 && l2 === 0 && l3 === 1 ;
|
66 | default:
|
67 | return false;
|
68 | }
|
69 |
|
70 | }
|
71 | function processJs(dirs) {
|
72 | const files = getFiles_1.getFiles(dirs, 'js');
|
73 | if (!files.length) {
|
74 | return;
|
75 | }
|
76 | for (const file of files) {
|
77 | const contents = fs.readFileSync(file, 'utf8');
|
78 | const lines = getNonEmptyLines(contents);
|
79 | if (!shouldDeleteJs(lines)) {
|
80 | continue;
|
81 | }
|
82 | fs.unlinkSync(file);
|
83 | const mapFile = path_1.join(path_1.dirname(file), `${path_1.basename(file)}.map`);
|
84 | if (fs.existsSync(mapFile)) {
|
85 | fs.unlinkSync(mapFile);
|
86 | }
|
87 | }
|
88 | }
|
89 | const command = cmdName_1.cmdName(__filename);
|
90 | const cmd = {
|
91 | builder(argv) {
|
92 | return addConfig_1.addConfig(argv, command)
|
93 | .option('dist-dirs', {
|
94 | alias: 'd',
|
95 | array: true,
|
96 | demandOption: true,
|
97 | describe: 'Directories to recursively scan'
|
98 | });
|
99 | },
|
100 | command,
|
101 | describe: 'Clean dist directory from empty interface JS files and internal declarations',
|
102 | handler(c) {
|
103 | processDts(c.distDirs);
|
104 | processJs(c.distDirs);
|
105 | for (const d of c.distDirs) {
|
106 | deleteEmpty.sync(d);
|
107 | }
|
108 | }
|
109 | };
|
110 | module.exports = cmd;
|