UNPKG

4.09 kBJavaScriptView Raw
1"use strict";
2const deleteEmpty = require("delete-empty");
3const fs = require("fs");
4const path_1 = require("path");
5const addConfig_1 = require("../fns/add-cmd/addConfig");
6const cmdName_1 = require("../fns/cmdName");
7const getFiles_1 = require("../fns/getFiles");
8function getNonEmptyLines(contents) {
9 return contents.trim()
10 .split(/\n/g)
11 .map(l => l.trim())
12 .filter(l => !!l);
13}
14function 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}
42const jsReg = {
43 //tslint:disable-next-line:max-line-length
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};
48function getLineType(line) {
49 if (jsReg.defEsm.test(line)) {
50 return 0 /* DEF_ESM */;
51 }
52 else if (jsReg.srcMap.test(line)) {
53 return 1 /* SRC_MAP */;
54 }
55 else if (jsReg.useStrict.test(line)) {
56 return 2 /* USE_STRICT */;
57 }
58 else {
59 return 3 /* ANY */;
60 }
61}
62function shouldDeleteJs(lines) {
63 //tslint:disable:no-magic-numbers
64 let l1;
65 let l2;
66 switch (lines.length) {
67 case 1:
68 return getLineType(lines[0]) !== 3 /* ANY */;
69 case 2:
70 l1 = getLineType(lines[0]);
71 l2 = getLineType(lines[1]);
72 return ((l1 === 2 /* USE_STRICT */ && (l2 === 0 /* DEF_ESM */ || l2 === 1 /* SRC_MAP */))
73 || (l1 === 0 /* DEF_ESM */ && l2 === 1 /* SRC_MAP */));
74 case 3:
75 l1 = getLineType(lines[0]);
76 l2 = getLineType(lines[1]);
77 const l3 = getLineType(lines[2]);
78 return l1 === 2 /* USE_STRICT */ && l2 === 0 /* DEF_ESM */ && l3 === 1 /* SRC_MAP */;
79 default:
80 return false;
81 }
82 //tslint:enable:no-magic-numbers
83}
84function 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}
116const command = cmdName_1.cmdName(__filename);
117const 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};
137module.exports = cmd;