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 | let stat;
|
21 | let lines;
|
22 | let contents;
|
23 | for (const file of files) {
|
24 | try {
|
25 | stat = fs.lstatSync(file);
|
26 | if (!stat.isFile()) {
|
27 | continue;
|
28 | }
|
29 | contents = fs.readFileSync(file, 'utf8');
|
30 | lines = getNonEmptyLines(contents);
|
31 | if (lines.length !== 1 || !reg.test(lines[0])) {
|
32 | continue;
|
33 | }
|
34 | fs.unlinkSync(file);
|
35 | }
|
36 | catch (e) {
|
37 | console.error('Error processing', file, e);
|
38 | process.exit(1);
|
39 | }
|
40 | }
|
41 | }
|
42 | const jsReg = {
|
43 |
|
44 | 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,
|
45 | srcMap: /^\s*\/\s*\/\s*#\s*sourceMappingURL\s*=\s*.+\s*$/i,
|
46 | useStrict: /^\s*['"]use strict['"]\s*;?\s*$/i
|
47 | };
|
48 | function getLineType(line) {
|
49 | if (jsReg.defEsm.test(line)) {
|
50 | return 0 ;
|
51 | }
|
52 | else if (jsReg.srcMap.test(line)) {
|
53 | return 1 ;
|
54 | }
|
55 | else if (jsReg.useStrict.test(line)) {
|
56 | return 2 ;
|
57 | }
|
58 | else {
|
59 | return 3 ;
|
60 | }
|
61 | }
|
62 | function shouldDeleteJs(lines) {
|
63 |
|
64 | let l1;
|
65 | let l2;
|
66 | switch (lines.length) {
|
67 | case 1:
|
68 | return getLineType(lines[0]) !== 3 ;
|
69 | case 2:
|
70 | l1 = getLineType(lines[0]);
|
71 | l2 = getLineType(lines[1]);
|
72 | return ((l1 === 2 && (l2 === 0 || l2 === 1 ))
|
73 | || (l1 === 0 && l2 === 1 ));
|
74 | case 3:
|
75 | l1 = getLineType(lines[0]);
|
76 | l2 = getLineType(lines[1]);
|
77 | const l3 = getLineType(lines[2]);
|
78 | return l1 === 2 && l2 === 0 && l3 === 1 ;
|
79 | default:
|
80 | return false;
|
81 | }
|
82 |
|
83 | }
|
84 | function processJs(dirs) {
|
85 | const files = getFiles_1.getFiles(dirs, 'js');
|
86 | if (!files.length) {
|
87 | return;
|
88 | }
|
89 | let contents;
|
90 | let lines;
|
91 | let mapFile;
|
92 | let stat;
|
93 | for (const file of files) {
|
94 | try {
|
95 | stat = fs.lstatSync(file);
|
96 | if (!stat.isFile()) {
|
97 | continue;
|
98 | }
|
99 | contents = fs.readFileSync(file, 'utf8');
|
100 | lines = getNonEmptyLines(contents);
|
101 | if (!shouldDeleteJs(lines)) {
|
102 | continue;
|
103 | }
|
104 | fs.unlinkSync(file);
|
105 | mapFile = path_1.join(path_1.dirname(file), `${path_1.basename(file)}.map`);
|
106 | if (fs.existsSync(mapFile)) {
|
107 | fs.unlinkSync(mapFile);
|
108 | }
|
109 | }
|
110 | catch (e) {
|
111 | console.error('Error processing', file, e);
|
112 | process.exit(1);
|
113 | }
|
114 | }
|
115 | }
|
116 | const command = cmdName_1.cmdName(__filename);
|
117 | const cmd = {
|
118 | builder(argv) {
|
119 | return addConfig_1.addConfig(argv, command)
|
120 | .option('dist-dirs', {
|
121 | alias: 'd',
|
122 | array: true,
|
123 | demandOption: true,
|
124 | describe: 'Directories to recursively scan'
|
125 | });
|
126 | },
|
127 | command,
|
128 | describe: 'Clean dist directory from empty interface JS files and internal declarations',
|
129 | handler(c) {
|
130 | processDts(c.distDirs);
|
131 | processJs(c.distDirs);
|
132 | for (const d of c.distDirs) {
|
133 | deleteEmpty.sync(d);
|
134 | }
|
135 | }
|
136 | };
|
137 | module.exports = cmd;
|