reg-cli 0.17.7 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/cli.js +149 -109
- package/dist/diff.js +53 -60
- package/dist/icon.js +2 -1
- package/dist/image-finder.js +15 -36
- package/dist/index.js +158 -221
- package/dist/log.js +7 -7
- package/dist/process-adaptor.js +29 -52
- package/dist/report.js +123 -82
- package/package.json +24 -21
- package/report/ui/LICENSE +21 -0
- package/report/ui/README.md +85 -0
package/dist/index.js
CHANGED
|
@@ -1,263 +1,200 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _glob = _interopRequireDefault(require("glob"));
|
|
4
|
+
var _makeDir = _interopRequireDefault(require("make-dir"));
|
|
5
|
+
var _del = _interopRequireDefault(require("del"));
|
|
6
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
7
|
+
var _path = _interopRequireDefault(require("path"));
|
|
8
|
+
var _lodash = require("lodash");
|
|
9
|
+
var _log = _interopRequireDefault(require("./log"));
|
|
10
|
+
var _report = _interopRequireDefault(require("./report"));
|
|
11
|
+
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
12
|
+
var _events = _interopRequireDefault(require("events"));
|
|
13
|
+
var _processAdaptor = _interopRequireDefault(require("./process-adaptor"));
|
|
14
|
+
var _imageFinder = require("./image-finder");
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
4
16
|
// $FlowIgnore
|
|
5
17
|
// $FlowIgnore
|
|
6
|
-
|
|
7
18
|
// $FlowIgnore
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
var
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
var _path = require('path');
|
|
27
|
-
|
|
28
|
-
var _path2 = _interopRequireDefault(_path);
|
|
29
|
-
|
|
30
|
-
var _lodash = require('lodash');
|
|
31
|
-
|
|
32
|
-
var _log = require('./log');
|
|
33
|
-
|
|
34
|
-
var _log2 = _interopRequireDefault(_log);
|
|
35
|
-
|
|
36
|
-
var _report = require('./report');
|
|
37
|
-
|
|
38
|
-
var _report2 = _interopRequireDefault(_report);
|
|
39
|
-
|
|
40
|
-
var _bluebird = require('bluebird');
|
|
41
|
-
|
|
42
|
-
var _bluebird2 = _interopRequireDefault(_bluebird);
|
|
43
|
-
|
|
44
|
-
var _events = require('events');
|
|
45
|
-
|
|
46
|
-
var _events2 = _interopRequireDefault(_events);
|
|
47
|
-
|
|
48
|
-
var _processAdaptor = require('./process-adaptor');
|
|
49
|
-
|
|
50
|
-
var _processAdaptor2 = _interopRequireDefault(_processAdaptor);
|
|
51
|
-
|
|
52
|
-
var _imageFinder = require('./image-finder');
|
|
53
|
-
|
|
54
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
55
|
-
|
|
56
|
-
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
57
|
-
|
|
58
|
-
var copyImages = function copyImages(actualImages, _ref) {
|
|
59
|
-
var expectedDir = _ref.expectedDir,
|
|
60
|
-
actualDir = _ref.actualDir;
|
|
61
|
-
|
|
62
|
-
return Promise.all(actualImages.map(function (image) {
|
|
63
|
-
return new Promise(function (resolve, reject) {
|
|
64
|
-
try {
|
|
65
|
-
_makeDir2.default.sync(_path2.default.dirname(_path2.default.join(expectedDir, image)));
|
|
66
|
-
var writeStream = _fs2.default.createWriteStream(_path2.default.join(expectedDir, image));
|
|
67
|
-
_fs2.default.createReadStream(_path2.default.join(actualDir, image)).pipe(writeStream);
|
|
68
|
-
writeStream.on('finish', function (err) {
|
|
69
|
-
if (err) reject(err);
|
|
70
|
-
resolve();
|
|
71
|
-
});
|
|
72
|
-
} catch (err) {
|
|
73
|
-
reject(err);
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
}));
|
|
19
|
+
// $FlowIgnore
|
|
20
|
+
var copyImages = (actualImages, {
|
|
21
|
+
expectedDir,
|
|
22
|
+
actualDir
|
|
23
|
+
}) => {
|
|
24
|
+
return Promise.all(actualImages.map(image => new Promise((resolve, reject) => {
|
|
25
|
+
try {
|
|
26
|
+
_makeDir.default.sync(_path.default.dirname(_path.default.join(expectedDir, image)));
|
|
27
|
+
var writeStream = _fs.default.createWriteStream(_path.default.join(expectedDir, image));
|
|
28
|
+
_fs.default.createReadStream(_path.default.join(actualDir, image)).pipe(writeStream);
|
|
29
|
+
writeStream.on('finish', err => {
|
|
30
|
+
if (err) reject(err);
|
|
31
|
+
resolve();
|
|
32
|
+
});
|
|
33
|
+
} catch (err) {
|
|
34
|
+
reject(err);
|
|
35
|
+
}
|
|
36
|
+
})));
|
|
77
37
|
};
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
var images = actualImages.filter(function (actualImage) {
|
|
90
|
-
return expectedImages.includes(actualImage);
|
|
91
|
-
});
|
|
38
|
+
var compareImages = (emitter, {
|
|
39
|
+
expectedImages,
|
|
40
|
+
actualImages,
|
|
41
|
+
dirs,
|
|
42
|
+
matchingThreshold,
|
|
43
|
+
thresholdPixel,
|
|
44
|
+
thresholdRate,
|
|
45
|
+
concurrency,
|
|
46
|
+
enableAntialias
|
|
47
|
+
}) => {
|
|
48
|
+
var images = actualImages.filter(actualImage => expectedImages.includes(actualImage));
|
|
92
49
|
concurrency = images.length < 20 ? 1 : concurrency || 4;
|
|
93
|
-
var processes = (0, _lodash.range)(concurrency).map(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return _bluebird2.default.map(images, function (image) {
|
|
97
|
-
var p = processes.find(function (p) {
|
|
98
|
-
return !p.isRunning();
|
|
99
|
-
});
|
|
50
|
+
var processes = (0, _lodash.range)(concurrency).map(() => new _processAdaptor.default(emitter));
|
|
51
|
+
return _bluebird.default.map(images, image => {
|
|
52
|
+
var p = processes.find(p => !p.isRunning());
|
|
100
53
|
if (p) {
|
|
101
|
-
return p.run(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
54
|
+
return p.run({
|
|
55
|
+
...dirs,
|
|
56
|
+
image,
|
|
57
|
+
matchingThreshold,
|
|
58
|
+
thresholdRate,
|
|
59
|
+
thresholdPixel,
|
|
60
|
+
enableAntialias
|
|
61
|
+
});
|
|
108
62
|
}
|
|
109
|
-
}, {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
63
|
+
}, {
|
|
64
|
+
concurrency
|
|
65
|
+
}).then(result => {
|
|
66
|
+
processes.forEach(p => p.close());
|
|
113
67
|
return result;
|
|
114
|
-
}).filter(
|
|
115
|
-
return !!r;
|
|
116
|
-
});
|
|
68
|
+
}).filter(r => !!r);
|
|
117
69
|
};
|
|
118
|
-
|
|
119
|
-
var
|
|
120
|
-
var paths = changedFiles.map(function (image) {
|
|
121
|
-
var _path$posix;
|
|
122
|
-
|
|
70
|
+
var cleanupExpectedDir = (expectedDir, changedFiles) => {
|
|
71
|
+
var paths = changedFiles.map(image => {
|
|
123
72
|
var directories = expectedDir.split("\\");
|
|
124
|
-
return escapeGlob(
|
|
73
|
+
return escapeGlob(_path.default.posix.join(...directories, image));
|
|
125
74
|
});
|
|
126
75
|
// force: true needed to allow deleting outside working directory
|
|
127
|
-
return (0,
|
|
76
|
+
return (0, _del.default)(paths, {
|
|
77
|
+
force: true
|
|
78
|
+
});
|
|
128
79
|
};
|
|
129
|
-
|
|
130
|
-
var escapeGlob = function escapeGlob(fileName) {
|
|
80
|
+
var escapeGlob = fileName => {
|
|
131
81
|
return fileName.replace(/(\*)/g, '[$1]').replace(/(\*)/g, '[$1]').replace(/(\?)/g, '[$1]').replace(/(\[)/g, '[$1]').replace(/(\])/g, '[$1]').replace(/(\{)/g, '[$1]').replace(/(\})/g, '[$1]').replace(/(\))/g, '[$1]').replace(/(\()/g, '[$1]').replace(/(\!)/g, '[$1]');
|
|
132
82
|
};
|
|
133
|
-
|
|
134
|
-
var
|
|
135
|
-
var
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
}).map(function (r) {
|
|
143
|
-
return r.image;
|
|
144
|
-
});
|
|
145
|
-
var diffItems = failed.map(function (image) {
|
|
146
|
-
return image.replace(/\.[^\.]+$/, '.png');
|
|
147
|
-
});
|
|
148
|
-
return { passed: passed, failed: failed, diffItems: diffItems };
|
|
83
|
+
var aggregate = result => {
|
|
84
|
+
var passed = result.filter(r => r.passed).map(r => r.image);
|
|
85
|
+
var failed = result.filter(r => !r.passed).map(r => r.image);
|
|
86
|
+
var diffItems = failed.map(image => image.replace(/\.[^\.]+$/, '.png'));
|
|
87
|
+
return {
|
|
88
|
+
passed,
|
|
89
|
+
failed,
|
|
90
|
+
diffItems
|
|
91
|
+
};
|
|
149
92
|
};
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
});
|
|
165
|
-
}).then(function () {
|
|
166
|
-
_log2.default.success('\nAll images are updated. ');
|
|
93
|
+
var updateExpected = ({
|
|
94
|
+
actualDir,
|
|
95
|
+
expectedDir,
|
|
96
|
+
diffDir,
|
|
97
|
+
deletedImages,
|
|
98
|
+
newImages,
|
|
99
|
+
diffItems
|
|
100
|
+
}) => {
|
|
101
|
+
return cleanupExpectedDir(expectedDir, [...deletedImages, ...diffItems]).then(() => copyImages([...newImages, ...diffItems], {
|
|
102
|
+
actualDir,
|
|
103
|
+
expectedDir,
|
|
104
|
+
diffDir
|
|
105
|
+
})).then(() => {
|
|
106
|
+
_log.default.success(`\nAll images are updated. `);
|
|
167
107
|
});
|
|
168
108
|
};
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
var dirs = {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
109
|
+
module.exports = params => {
|
|
110
|
+
var {
|
|
111
|
+
actualDir,
|
|
112
|
+
expectedDir,
|
|
113
|
+
diffDir,
|
|
114
|
+
json,
|
|
115
|
+
concurrency = 4,
|
|
116
|
+
update,
|
|
117
|
+
report,
|
|
118
|
+
junitReport,
|
|
119
|
+
extendedErrors,
|
|
120
|
+
urlPrefix,
|
|
121
|
+
threshold,
|
|
122
|
+
matchingThreshold = 0,
|
|
123
|
+
thresholdRate,
|
|
124
|
+
thresholdPixel,
|
|
125
|
+
enableAntialias,
|
|
126
|
+
enableClientAdditionalDetection
|
|
127
|
+
} = params;
|
|
128
|
+
var dirs = {
|
|
129
|
+
actualDir,
|
|
130
|
+
expectedDir,
|
|
131
|
+
diffDir
|
|
132
|
+
};
|
|
133
|
+
var emitter = new _events.default();
|
|
134
|
+
var {
|
|
135
|
+
expectedImages,
|
|
136
|
+
actualImages,
|
|
137
|
+
deletedImages,
|
|
138
|
+
newImages
|
|
139
|
+
} = (0, _imageFinder.findImages)(expectedDir, actualDir);
|
|
140
|
+
_makeDir.default.sync(expectedDir);
|
|
141
|
+
_makeDir.default.sync(diffDir);
|
|
142
|
+
setImmediate(() => emitter.emit('start'));
|
|
203
143
|
compareImages(emitter, {
|
|
204
|
-
expectedImages
|
|
205
|
-
actualImages
|
|
206
|
-
dirs
|
|
207
|
-
matchingThreshold
|
|
144
|
+
expectedImages,
|
|
145
|
+
actualImages,
|
|
146
|
+
dirs,
|
|
147
|
+
matchingThreshold,
|
|
208
148
|
thresholdRate: thresholdRate || threshold,
|
|
209
|
-
thresholdPixel
|
|
210
|
-
concurrency
|
|
149
|
+
thresholdPixel,
|
|
150
|
+
concurrency,
|
|
211
151
|
enableAntialias: !!enableAntialias
|
|
212
|
-
}).then(
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
return (0, _report2.default)({
|
|
152
|
+
}).then(result => aggregate(result)).then(({
|
|
153
|
+
passed,
|
|
154
|
+
failed,
|
|
155
|
+
diffItems
|
|
156
|
+
}) => {
|
|
157
|
+
return (0, _report.default)({
|
|
220
158
|
passedItems: passed,
|
|
221
159
|
failedItems: failed,
|
|
222
160
|
newItems: newImages,
|
|
223
161
|
deletedItems: deletedImages,
|
|
224
162
|
expectedItems: update ? actualImages : expectedImages,
|
|
225
163
|
actualItems: actualImages,
|
|
226
|
-
diffItems
|
|
164
|
+
diffItems,
|
|
227
165
|
json: json || './reg.json',
|
|
228
|
-
actualDir
|
|
229
|
-
expectedDir
|
|
230
|
-
diffDir
|
|
166
|
+
actualDir,
|
|
167
|
+
expectedDir,
|
|
168
|
+
diffDir,
|
|
231
169
|
report: report || '',
|
|
170
|
+
junitReport: junitReport || '',
|
|
171
|
+
extendedErrors: !!extendedErrors,
|
|
232
172
|
urlPrefix: urlPrefix || '',
|
|
233
173
|
enableClientAdditionalDetection: !!enableClientAdditionalDetection
|
|
234
174
|
});
|
|
235
|
-
}).then(
|
|
236
|
-
deletedImages.forEach(
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
175
|
+
}).then(result => {
|
|
176
|
+
deletedImages.forEach(image => emitter.emit('compare', {
|
|
177
|
+
type: 'delete',
|
|
178
|
+
path: image
|
|
179
|
+
}));
|
|
180
|
+
newImages.forEach(image => emitter.emit('compare', {
|
|
181
|
+
type: 'new',
|
|
182
|
+
path: image
|
|
183
|
+
}));
|
|
242
184
|
if (update) {
|
|
243
185
|
return updateExpected({
|
|
244
|
-
actualDir
|
|
245
|
-
expectedDir
|
|
246
|
-
diffDir
|
|
247
|
-
deletedImages
|
|
248
|
-
newImages
|
|
186
|
+
actualDir,
|
|
187
|
+
expectedDir,
|
|
188
|
+
diffDir,
|
|
189
|
+
deletedImages,
|
|
190
|
+
newImages,
|
|
249
191
|
diffItems: result.diffItems
|
|
250
|
-
}).then(
|
|
192
|
+
}).then(() => {
|
|
251
193
|
emitter.emit('update');
|
|
252
194
|
return result;
|
|
253
195
|
});
|
|
254
196
|
}
|
|
255
197
|
return result;
|
|
256
|
-
}).then(
|
|
257
|
-
return emitter.emit('complete', result);
|
|
258
|
-
}).catch(function (err) {
|
|
259
|
-
return emitter.emit('error', err);
|
|
260
|
-
});
|
|
261
|
-
|
|
198
|
+
}).then(result => emitter.emit('complete', result)).catch(err => emitter.emit('error', err));
|
|
262
199
|
return emitter;
|
|
263
200
|
};
|
package/dist/log.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.default = void 0;
|
|
6
7
|
var chalk = require('chalk');
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
info: function info(text) {
|
|
8
|
+
var _default = exports.default = {
|
|
9
|
+
info(text) {
|
|
10
10
|
console.log(chalk.cyan(text));
|
|
11
11
|
},
|
|
12
|
-
warn
|
|
12
|
+
warn(text) {
|
|
13
13
|
console.log(chalk.gray(text));
|
|
14
14
|
},
|
|
15
|
-
success
|
|
15
|
+
success(text) {
|
|
16
16
|
console.log(chalk.green(text));
|
|
17
17
|
},
|
|
18
|
-
fail
|
|
18
|
+
fail(text) {
|
|
19
19
|
console.log(chalk.red(text));
|
|
20
20
|
}
|
|
21
21
|
};
|
package/dist/process-adaptor.js
CHANGED
|
@@ -1,63 +1,40 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
var _child_process = require('child_process');
|
|
11
|
-
|
|
12
|
-
var _path = require('path');
|
|
13
|
-
|
|
14
|
-
var _path2 = _interopRequireDefault(_path);
|
|
15
|
-
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _child_process = require("child_process");
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
16
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
function ProcessAdaptor(emitter) {
|
|
22
|
-
_classCallCheck(this, ProcessAdaptor);
|
|
23
|
-
|
|
24
|
-
this._process = (0, _child_process.fork)(_path2.default.resolve(__dirname, './diff.js'));
|
|
10
|
+
// $FlowIgnore
|
|
11
|
+
class ProcessAdaptor {
|
|
12
|
+
constructor(emitter) {
|
|
13
|
+
this._process = (0, _child_process.fork)(_path.default.resolve(__dirname, './diff.js'));
|
|
25
14
|
this._isRunning = false;
|
|
26
15
|
this._emitter = emitter;
|
|
27
16
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (!_this._process || !_this._process.send) resolve();
|
|
42
|
-
_this._process.send(params);
|
|
43
|
-
_this._process.once('message', function (result) {
|
|
44
|
-
_this._isRunning = false;
|
|
45
|
-
_this._emitter.emit('compare', {
|
|
46
|
-
type: result.passed ? 'pass' : 'fail', path: result.image
|
|
47
|
-
});
|
|
48
|
-
resolve(result);
|
|
17
|
+
isRunning() {
|
|
18
|
+
return this._isRunning;
|
|
19
|
+
}
|
|
20
|
+
run(params) {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
this._isRunning = true;
|
|
23
|
+
if (!this._process || !this._process.send) resolve();
|
|
24
|
+
this._process.send(params);
|
|
25
|
+
this._process.once('message', result => {
|
|
26
|
+
this._isRunning = false;
|
|
27
|
+
this._emitter.emit('compare', {
|
|
28
|
+
type: result.passed ? 'pass' : 'fail',
|
|
29
|
+
path: result.image
|
|
49
30
|
});
|
|
31
|
+
resolve(result);
|
|
50
32
|
});
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}]);
|
|
59
|
-
|
|
60
|
-
return ProcessAdaptor;
|
|
61
|
-
}();
|
|
62
|
-
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
close() {
|
|
36
|
+
if (!this._process || !this._process.kill) return;
|
|
37
|
+
this._process.kill();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
63
40
|
exports.default = ProcessAdaptor;
|