UNPKG

3.44 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 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}
29const jsReg = {
30 //tslint:disable-next-line:max-line-length
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};
35function getLineType(line) {
36 if (jsReg.defEsm.test(line)) {
37 return 0 /* DEF_ESM */;
38 }
39 else if (jsReg.srcMap.test(line)) {
40 return 1 /* SRC_MAP */;
41 }
42 else if (jsReg.useStrict.test(line)) {
43 return 2 /* USE_STRICT */;
44 }
45 else {
46 return 3 /* ANY */;
47 }
48}
49function shouldDeleteJs(lines) {
50 //tslint:disable:no-magic-numbers
51 let l1;
52 let l2;
53 switch (lines.length) {
54 case 1:
55 return getLineType(lines[0]) !== 3 /* ANY */;
56 case 2:
57 l1 = getLineType(lines[0]);
58 l2 = getLineType(lines[1]);
59 return ((l1 === 2 /* USE_STRICT */ && (l2 === 0 /* DEF_ESM */ || l2 === 1 /* SRC_MAP */))
60 || (l1 === 0 /* DEF_ESM */ && l2 === 1 /* SRC_MAP */));
61 case 3:
62 l1 = getLineType(lines[0]);
63 l2 = getLineType(lines[1]);
64 const l3 = getLineType(lines[2]);
65 return l1 === 2 /* USE_STRICT */ && l2 === 0 /* DEF_ESM */ && l3 === 1 /* SRC_MAP */;
66 default:
67 return false;
68 }
69 //tslint:enable:no-magic-numbers
70}
71function 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}
89const command = cmdName_1.cmdName(__filename);
90const 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};
110module.exports = cmd;