UNPKG

3.18 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = void 0;
7
8var _os = _interopRequireDefault(require("os"));
9
10var _cacache = _interopRequireDefault(require("cacache"));
11
12var _findCacheDir = _interopRequireDefault(require("find-cache-dir"));
13
14var _workerFarm = _interopRequireDefault(require("worker-farm"));
15
16var _serializeJavascript = _interopRequireDefault(require("serialize-javascript"));
17
18var _minify = _interopRequireDefault(require("./minify"));
19
20function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
22const workerFile = require.resolve('./worker');
23
24class TaskRunner {
25 constructor(options = {}) {
26 const {
27 cache,
28 parallel
29 } = options;
30 this.cacheDir = cache === true ? (0, _findCacheDir.default)({
31 name: 'uglifyjs-webpack-plugin'
32 }) : cache; // In some cases cpus() returns undefined
33 // https://github.com/nodejs/node/issues/19022
34
35 const cpus = _os.default.cpus() || {
36 length: 1
37 };
38 this.maxConcurrentWorkers = parallel === true ? cpus.length - 1 : Math.min(Number(parallel) || 0, cpus.length - 1);
39 }
40
41 run(tasks, callback) {
42 /* istanbul ignore if */
43 if (!tasks.length) {
44 callback(null, []);
45 return;
46 }
47
48 if (this.maxConcurrentWorkers > 1) {
49 const workerOptions = process.platform === 'win32' ? {
50 maxConcurrentWorkers: this.maxConcurrentWorkers,
51 maxConcurrentCallsPerWorker: 1
52 } : {
53 maxConcurrentWorkers: this.maxConcurrentWorkers
54 };
55 this.workers = (0, _workerFarm.default)(workerOptions, workerFile);
56
57 this.boundWorkers = (options, cb) => {
58 try {
59 this.workers((0, _serializeJavascript.default)(options), cb);
60 } catch (error) {
61 // worker-farm can fail with ENOMEM or something else
62 cb(error);
63 }
64 };
65 } else {
66 this.boundWorkers = (options, cb) => {
67 try {
68 cb(null, (0, _minify.default)(options));
69 } catch (error) {
70 cb(error);
71 }
72 };
73 }
74
75 let toRun = tasks.length;
76 const results = [];
77
78 const step = (index, data) => {
79 toRun -= 1;
80 results[index] = data;
81
82 if (!toRun) {
83 callback(null, results);
84 }
85 };
86
87 tasks.forEach((task, index) => {
88 const enqueue = () => {
89 this.boundWorkers(task, (error, data) => {
90 const result = error ? {
91 error
92 } : data;
93
94 const done = () => step(index, result);
95
96 if (this.cacheDir && !result.error) {
97 _cacache.default.put(this.cacheDir, (0, _serializeJavascript.default)(task.cacheKeys), JSON.stringify(data)).then(done, done);
98 } else {
99 done();
100 }
101 });
102 };
103
104 if (this.cacheDir) {
105 _cacache.default.get(this.cacheDir, (0, _serializeJavascript.default)(task.cacheKeys)).then(({
106 data
107 }) => step(index, JSON.parse(data)), enqueue);
108 } else {
109 enqueue();
110 }
111 });
112 }
113
114 exit() {
115 if (this.workers) {
116 _workerFarm.default.end(this.workers);
117 }
118 }
119
120}
121
122exports.default = TaskRunner;
\No newline at end of file