Skip to content
This repository was archived by the owner on Nov 25, 2025. It is now read-only.

Commit f92eadc

Browse files
author
Giedrius Grabauskas
committed
Initial commit.
0 parents  commit f92eadc

12 files changed

Lines changed: 975 additions & 0 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+
.vscode

dist/arguments.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const yargs = require('yargs');
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
exports.default = yargs
4+
.help('h', 'Show help')
5+
.alias('h', 'help')
6+
.version(() => {
7+
return `Current version: ${require('../package.json').version}`;
8+
})
9+
.alias('v', 'version')
10+
.option("p", {
11+
alias: "pattern",
12+
describe: "Files glob pattern",
13+
type: "string"
14+
})
15+
.config('config')
16+
.alias('c', 'config')
17+
.default('config', 'glob-uglifyjs.config.json')
18+
.option("", {
19+
alias: "",
20+
describe: "",
21+
type: ""
22+
})
23+
.usage('Usage: glob-uglifyjs [options]')
24+
.argv;

dist/cli.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
const arguments_1 = require('./arguments');
2+
const main_1 = require('./main');
3+
new main_1.default(arguments_1.default.pattern, arguments_1.default.options);

dist/main.js

Lines changed: 348 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,348 @@
1+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2+
return new (P || (P = Promise))(function (resolve, reject) {
3+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
4+
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
5+
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
6+
step((generator = generator.apply(thisArg, _arguments)).next());
7+
});
8+
};
9+
const uglifyjs = require('uglify-js');
10+
const glob = require('glob');
11+
const path = require('path');
12+
const options_1 = require('./options');
13+
const fs = require('fs');
14+
const JS_EXTENSION = ".js";
15+
const MINIFY_EXTENSION_PREFIX = ".min";
16+
class GlobsUglifyJs {
17+
constructor(globPattern, options) {
18+
this.options = new options_1.default(options);
19+
if (!this.validateExtension(globPattern)) {
20+
globPattern = this.addJsExtension(globPattern);
21+
}
22+
this.globPattern = path.join(this.options.RootDir, globPattern);
23+
this.main();
24+
}
25+
main() {
26+
return __awaiter(this, void 0, void 0, function* () {
27+
let rejected = false;
28+
let filesList = yield this.getGlobs(this.globPattern);
29+
if (filesList.length === 0) {
30+
console.log("No files found.");
31+
return;
32+
}
33+
yield this.recursiveUglify(filesList.slice())
34+
.catch(error => {
35+
console.log(error);
36+
rejected = true;
37+
});
38+
if (rejected) {
39+
return;
40+
}
41+
if (this.options.RemoveSource) {
42+
yield this.deleteFiles(filesList.slice())
43+
.catch(error => {
44+
console.log(error);
45+
rejected = true;
46+
});
47+
if (rejected) {
48+
return;
49+
}
50+
yield this.deleteEmptyDirectories(this.options.RootDir)
51+
.catch(error => {
52+
console.log(error);
53+
rejected = true;
54+
});
55+
if (rejected) {
56+
return;
57+
}
58+
}
59+
console.log(`Successfully minified ${filesList.length} files.`);
60+
});
61+
}
62+
deleteFiles(fileList) {
63+
return __awaiter(this, void 0, void 0, function* () {
64+
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
65+
let rejected = false;
66+
let file = fileList.shift();
67+
if (file == null) {
68+
resolve();
69+
return;
70+
}
71+
yield this.deleteFile(file)
72+
.catch(error => {
73+
rejected = true;
74+
reject(error);
75+
});
76+
if (!rejected) {
77+
yield this.deleteFiles(fileList);
78+
resolve();
79+
}
80+
}));
81+
});
82+
}
83+
deleteFile(filePath) {
84+
return __awaiter(this, void 0, void 0, function* () {
85+
return new Promise((resolve, reject) => {
86+
fs.unlink(filePath, error => {
87+
if (error) {
88+
reject(error);
89+
}
90+
else {
91+
resolve();
92+
}
93+
});
94+
});
95+
});
96+
}
97+
recursiveUglify(filesList) {
98+
return __awaiter(this, void 0, void 0, function* () {
99+
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
100+
let file = filesList.shift();
101+
if (file != null) {
102+
let rejected = false;
103+
let outputData = uglifyjs.minify(file);
104+
let outPath = this.resolveOutFilePath(file);
105+
yield this.ensureDirectoryExistence(outPath)
106+
.catch(error => {
107+
rejected = true;
108+
reject(error);
109+
});
110+
if (rejected) {
111+
return;
112+
}
113+
yield this.writeToFile(outPath, outputData.code)
114+
.catch(error => {
115+
rejected = true;
116+
reject(error);
117+
});
118+
if (rejected) {
119+
return;
120+
}
121+
yield this.recursiveUglify(filesList)
122+
.catch(error => {
123+
rejected = true;
124+
reject(error);
125+
});
126+
if (rejected) {
127+
return;
128+
}
129+
resolve();
130+
}
131+
else {
132+
resolve();
133+
}
134+
}));
135+
});
136+
}
137+
ensureDirectoryExistence(filePath) {
138+
return __awaiter(this, void 0, void 0, function* () {
139+
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
140+
let dirname = path.dirname(filePath);
141+
if (yield this.directoryExists(dirname)) {
142+
resolve();
143+
return;
144+
}
145+
yield this.ensureDirectoryExistence(dirname);
146+
fs.mkdir(dirname, (error) => {
147+
if (error) {
148+
reject(error);
149+
}
150+
else {
151+
resolve();
152+
}
153+
});
154+
}));
155+
});
156+
}
157+
directoryExists(path) {
158+
return __awaiter(this, void 0, void 0, function* () {
159+
return new Promise(resolve => {
160+
fs.stat(path, (error, stats) => {
161+
if (error) {
162+
resolve(false);
163+
}
164+
else {
165+
resolve(stats.isDirectory());
166+
}
167+
});
168+
});
169+
});
170+
}
171+
deleteEmptyDirectories(directoryPath) {
172+
return __awaiter(this, void 0, void 0, function* () {
173+
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
174+
let rejected = false;
175+
let isExist = yield this.directoryExists(directoryPath);
176+
if (!isExist) {
177+
resolve(); // or reject?
178+
return;
179+
}
180+
let files = yield this.readFilesInDirectory(directoryPath);
181+
if (files.length > 0) {
182+
for (let i = 0; i < files.length; i++) {
183+
let file = files[i];
184+
var fullPath = path.join(directoryPath, file);
185+
yield this.deleteEmptyDirectories(fullPath).catch(error => {
186+
console.log("Error: ", error);
187+
reject(error);
188+
rejected = true;
189+
});
190+
if (rejected) {
191+
break;
192+
}
193+
}
194+
if (rejected) {
195+
return;
196+
}
197+
if (rejected) {
198+
return;
199+
}
200+
files = yield this.readFilesInDirectory(directoryPath);
201+
}
202+
if (files.length == 0) {
203+
yield this.removeDirectory(directoryPath)
204+
.catch(error => {
205+
reject(error);
206+
rejected = true;
207+
});
208+
}
209+
if (!rejected) {
210+
resolve();
211+
}
212+
}));
213+
});
214+
}
215+
removeDirectory(directoryPath) {
216+
return __awaiter(this, void 0, void 0, function* () {
217+
return new Promise((resolve, reject) => {
218+
fs.rmdir(directoryPath, error => {
219+
if (error) {
220+
reject(error);
221+
}
222+
else {
223+
resolve();
224+
}
225+
});
226+
});
227+
});
228+
}
229+
readFilesInDirectory(directoryPath) {
230+
return __awaiter(this, void 0, void 0, function* () {
231+
return new Promise((resolve, reject) => {
232+
fs.readdir(directoryPath, (error, files) => {
233+
if (error) {
234+
reject(error);
235+
}
236+
else {
237+
resolve(files);
238+
}
239+
});
240+
});
241+
});
242+
}
243+
/**
244+
* Check if parsed name without extension has minified extension prefix.
245+
*
246+
* @private
247+
* @param {string} nameWithoutExt Parsed file name without extension.
248+
* @returns
249+
*
250+
* @memberOf GlobsUglifyJs
251+
*/
252+
hasMinifiedExt(nameWithoutExt) {
253+
let ext = path.extname(nameWithoutExt);
254+
return (ext != null && ext === MINIFY_EXTENSION_PREFIX);
255+
}
256+
resolveOutFilePath(filePath) {
257+
let parsedPath = path.parse(filePath), targetExt = parsedPath.ext;
258+
if (this.options.UseMinExt && !this.hasMinifiedExt(parsedPath.name)) {
259+
targetExt = MINIFY_EXTENSION_PREFIX + targetExt;
260+
}
261+
let relativeDir = path.relative(this.options.RootDir, parsedPath.dir);
262+
return path.format({
263+
ext: targetExt,
264+
name: parsedPath.name,
265+
dir: path.resolve(this.options.OutDir, relativeDir),
266+
base: parsedPath.name + targetExt,
267+
root: parsedPath.root
268+
});
269+
}
270+
/**
271+
* Asynchronously write data to file with flag 'wx'.
272+
*
273+
* @private
274+
* @param {string} filePath File path.
275+
* @param {string} data Data in 'utf-8'.
276+
* @returns
277+
*
278+
* @memberOf GlobsUglifyJs
279+
*/
280+
writeToFile(filePath, data) {
281+
return __awaiter(this, void 0, void 0, function* () {
282+
return new Promise((resolve, reject) => {
283+
fs.writeFile(filePath, data, { encoding: "utf-8", flag: "w" }, (error) => {
284+
if (error) {
285+
reject(error);
286+
}
287+
else {
288+
resolve();
289+
}
290+
});
291+
});
292+
});
293+
}
294+
/**
295+
* Asynchronously return files list by pattern.
296+
*
297+
* @private
298+
* @param {string} pattern
299+
* @param {glob.IOptions} [options={}]
300+
* @returns
301+
*
302+
* @memberOf GlobsUglifyJs
303+
*/
304+
getGlobs(pattern, options = {}) {
305+
return __awaiter(this, void 0, void 0, function* () {
306+
return new Promise((resolve, reject) => {
307+
glob(pattern, options, (err, matches) => {
308+
if (err != null) {
309+
reject(err);
310+
}
311+
else {
312+
resolve(matches);
313+
}
314+
});
315+
});
316+
});
317+
}
318+
/**
319+
* Validate JS extension.
320+
*
321+
* @private
322+
* @param {string} pattern
323+
* @returns {boolean} True if extension exist.
324+
*
325+
* @memberOf GlobsUglifyJs
326+
*/
327+
validateExtension(pattern) {
328+
let ext = path.extname(pattern);
329+
if (ext.length !== 0 && ext !== JS_EXTENSION) {
330+
console.warn("Using custom extension: ", ext);
331+
}
332+
return (ext != null && ext.length > 0);
333+
}
334+
/**
335+
* Add .js to glob pattern.
336+
*
337+
* @private
338+
* @param {string} pattern
339+
* @returns {string}
340+
*
341+
* @memberOf GlobsUglifyJs
342+
*/
343+
addJsExtension(pattern) {
344+
return pattern + JS_EXTENSION;
345+
}
346+
}
347+
Object.defineProperty(exports, "__esModule", { value: true });
348+
exports.default = GlobsUglifyJs;

0 commit comments

Comments
 (0)