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/report.js
CHANGED
|
@@ -1,49 +1,30 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
|
|
7
|
-
var _mustache = require(
|
|
8
|
-
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
var
|
|
14
|
-
|
|
15
|
-
var _fs = require('fs');
|
|
16
|
-
|
|
17
|
-
var _fs2 = _interopRequireDefault(_fs);
|
|
18
|
-
|
|
19
|
-
var _mkdirp = require('mkdirp');
|
|
20
|
-
|
|
21
|
-
var _mkdirp2 = _interopRequireDefault(_mkdirp);
|
|
22
|
-
|
|
23
|
-
var _path = require('path');
|
|
24
|
-
|
|
25
|
-
var _path2 = _interopRequireDefault(_path);
|
|
26
|
-
|
|
27
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
28
|
-
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _mustache = _interopRequireDefault(require("mustache"));
|
|
8
|
+
var detectDiff = _interopRequireWildcard(require("x-img-diff-js"));
|
|
9
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
10
|
+
var _makeDir = _interopRequireDefault(require("make-dir"));
|
|
11
|
+
var _path = _interopRequireDefault(require("path"));
|
|
12
|
+
var xmlBuilder = _interopRequireWildcard(require("xmlbuilder2"));
|
|
13
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
14
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
29
15
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
16
|
+
// $FlowIgnore
|
|
17
|
+
// $FlowIgnore
|
|
18
|
+
// $FlowIgnore
|
|
19
|
+
var loadFaviconAsDataURL = type => {
|
|
20
|
+
var fname = _path.default.resolve(__dirname, `../report/assets/favicon_${type}.png`);
|
|
21
|
+
var buffer = _fs.default.readFileSync(fname);
|
|
34
22
|
return 'data:image/png;base64,' + buffer.toString('base64');
|
|
35
23
|
};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
var encodeFilePath = function encodeFilePath(filePath) {
|
|
41
|
-
return filePath.split(_path2.default.sep).map(function (p) {
|
|
42
|
-
return encodeURIComponent(p);
|
|
43
|
-
}).join(_path2.default.sep);
|
|
24
|
+
var encodeFilePath = filePath => {
|
|
25
|
+
return filePath.split(_path.default.sep).map(p => encodeURIComponent(p)).join(_path.default.sep);
|
|
44
26
|
};
|
|
45
|
-
|
|
46
|
-
var createJSONReport = function createJSONReport(params) {
|
|
27
|
+
var createJSONReport = params => {
|
|
47
28
|
return {
|
|
48
29
|
failedItems: params.failedItems,
|
|
49
30
|
newItems: params.newItems,
|
|
@@ -52,77 +33,137 @@ var createJSONReport = function createJSONReport(params) {
|
|
|
52
33
|
expectedItems: params.expectedItems,
|
|
53
34
|
actualItems: params.actualItems,
|
|
54
35
|
diffItems: params.diffItems,
|
|
55
|
-
actualDir:
|
|
56
|
-
expectedDir:
|
|
57
|
-
diffDir:
|
|
36
|
+
actualDir: `${params.urlPrefix}${_path.default.relative(_path.default.dirname(params.json), params.actualDir)}`,
|
|
37
|
+
expectedDir: `${params.urlPrefix}${_path.default.relative(_path.default.dirname(params.json), params.expectedDir)}`,
|
|
38
|
+
diffDir: `${params.urlPrefix}${_path.default.relative(_path.default.dirname(params.json), params.diffDir)}`
|
|
58
39
|
};
|
|
59
40
|
};
|
|
60
|
-
|
|
61
|
-
var
|
|
62
|
-
var
|
|
63
|
-
var
|
|
64
|
-
var template = _fs2.default.readFileSync(file);
|
|
41
|
+
var createHTMLReport = params => {
|
|
42
|
+
var file = _path.default.join(__dirname, '../template/template.html');
|
|
43
|
+
var js = _fs.default.readFileSync(_path.default.join(__dirname, '../report/ui/dist/report.js'));
|
|
44
|
+
var template = _fs.default.readFileSync(file);
|
|
65
45
|
var json = {
|
|
66
46
|
type: params.failedItems.length === 0 ? 'success' : 'danger',
|
|
67
47
|
hasNew: params.newItems.length > 0,
|
|
68
|
-
newItems: params.newItems.map(
|
|
69
|
-
|
|
70
|
-
|
|
48
|
+
newItems: params.newItems.map(item => ({
|
|
49
|
+
raw: item,
|
|
50
|
+
encoded: encodeFilePath(item)
|
|
51
|
+
})),
|
|
71
52
|
hasDeleted: params.deletedItems.length > 0,
|
|
72
|
-
deletedItems: params.deletedItems.map(
|
|
73
|
-
|
|
74
|
-
|
|
53
|
+
deletedItems: params.deletedItems.map(item => ({
|
|
54
|
+
raw: item,
|
|
55
|
+
encoded: encodeFilePath(item)
|
|
56
|
+
})),
|
|
75
57
|
hasPassed: params.passedItems.length > 0,
|
|
76
|
-
passedItems: params.passedItems.map(
|
|
77
|
-
|
|
78
|
-
|
|
58
|
+
passedItems: params.passedItems.map(item => ({
|
|
59
|
+
raw: item,
|
|
60
|
+
encoded: encodeFilePath(item)
|
|
61
|
+
})),
|
|
79
62
|
hasFailed: params.failedItems.length > 0,
|
|
80
|
-
failedItems: params.failedItems.map(
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
63
|
+
failedItems: params.failedItems.map(item => ({
|
|
64
|
+
raw: item,
|
|
65
|
+
encoded: encodeFilePath(item)
|
|
66
|
+
})),
|
|
67
|
+
actualDir: params.fromJSON ? params.actualDir : `${params.urlPrefix}${_path.default.relative(_path.default.dirname(params.report), params.actualDir)}`,
|
|
68
|
+
expectedDir: params.fromJSON ? params.expectedDir : `${params.urlPrefix}${_path.default.relative(_path.default.dirname(params.report), params.expectedDir)}`,
|
|
69
|
+
diffDir: params.fromJSON ? params.diffDir : `${params.urlPrefix}${_path.default.relative(_path.default.dirname(params.report), params.diffDir)}`,
|
|
86
70
|
ximgdiffConfig: {
|
|
87
71
|
enabled: params.enableClientAdditionalDetection,
|
|
88
|
-
workerUrl: params.urlPrefix
|
|
72
|
+
workerUrl: `${params.urlPrefix}worker.js`
|
|
89
73
|
}
|
|
90
74
|
};
|
|
91
75
|
var faviconType = json.hasFailed || json.hasNew || json.hasDeleted ? 'failure' : 'success';
|
|
92
76
|
var view = {
|
|
93
|
-
js
|
|
77
|
+
js,
|
|
94
78
|
report: JSON.stringify(json),
|
|
95
79
|
faviconData: loadFaviconAsDataURL(faviconType)
|
|
96
80
|
};
|
|
97
|
-
return
|
|
81
|
+
return _mustache.default.render(template.toString(), view);
|
|
98
82
|
};
|
|
99
|
-
|
|
83
|
+
var createJunitReport = params => {
|
|
84
|
+
var failedTests = params.failedItems.length + params.newItems.length + params.deletedItems.length;
|
|
85
|
+
var numberOfTests = failedTests + params.passedItems.length;
|
|
86
|
+
var doc = xmlBuilder.create({
|
|
87
|
+
version: '1.0'
|
|
88
|
+
});
|
|
89
|
+
var testsuitesElement = doc.ele('testsuites', {
|
|
90
|
+
name: 'reg-cli tests',
|
|
91
|
+
tests: numberOfTests,
|
|
92
|
+
failures: failedTests
|
|
93
|
+
});
|
|
94
|
+
var testsuiteElement = testsuitesElement.ele('testsuite', {
|
|
95
|
+
name: 'reg-cli',
|
|
96
|
+
tests: numberOfTests,
|
|
97
|
+
failures: failedTests
|
|
98
|
+
});
|
|
99
|
+
params.failedItems.forEach(item => {
|
|
100
|
+
addFailedJunitTestElement(testsuiteElement, item, 'failed');
|
|
101
|
+
});
|
|
102
|
+
params.newItems.forEach(item => {
|
|
103
|
+
if (params.extendedErrors) {
|
|
104
|
+
addFailedJunitTestElement(testsuiteElement, item, 'newItem');
|
|
105
|
+
} else {
|
|
106
|
+
addPassedJunitTestElement(testsuiteElement, item);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
params.deletedItems.forEach(item => {
|
|
110
|
+
if (params.extendedErrors) {
|
|
111
|
+
addFailedJunitTestElement(testsuiteElement, item, 'deletedItem');
|
|
112
|
+
} else {
|
|
113
|
+
addPassedJunitTestElement(testsuiteElement, item);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
params.passedItems.forEach(item => {
|
|
117
|
+
addPassedJunitTestElement(testsuiteElement, item);
|
|
118
|
+
});
|
|
119
|
+
return doc.end({
|
|
120
|
+
prettyPrint: true
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
function addPassedJunitTestElement(testsuiteElement, item) {
|
|
124
|
+
testsuiteElement.ele('testcase', {
|
|
125
|
+
name: item
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
function addFailedJunitTestElement(testsuiteElement, item, reason) {
|
|
129
|
+
testsuiteElement.ele('testcase', {
|
|
130
|
+
name: item
|
|
131
|
+
}).ele('failure', {
|
|
132
|
+
message: reason
|
|
133
|
+
});
|
|
134
|
+
}
|
|
100
135
|
function createXimdiffWorker(params) {
|
|
101
|
-
var file =
|
|
102
|
-
var moduleJs =
|
|
103
|
-
var wasmLoaderJs =
|
|
104
|
-
var template =
|
|
105
|
-
var ximgdiffWasmUrl = params.urlPrefix
|
|
106
|
-
return
|
|
136
|
+
var file = _path.default.join(__dirname, '../template/worker_pre.js');
|
|
137
|
+
var moduleJs = _fs.default.readFileSync(_path.default.join(__dirname, '../report/ui/dist/worker.js'), 'utf8');
|
|
138
|
+
var wasmLoaderJs = _fs.default.readFileSync(detectDiff.getBrowserJsPath(), 'utf8');
|
|
139
|
+
var template = _fs.default.readFileSync(file);
|
|
140
|
+
var ximgdiffWasmUrl = `${params.urlPrefix}detector.wasm`;
|
|
141
|
+
return _mustache.default.render(template.toString(), {
|
|
142
|
+
ximgdiffWasmUrl
|
|
143
|
+
}) + '\n' + moduleJs + '\n' + wasmLoaderJs;
|
|
107
144
|
}
|
|
108
|
-
|
|
109
|
-
exports.default = function (params) {
|
|
145
|
+
var _default = params => {
|
|
110
146
|
if (!!params.report) {
|
|
111
147
|
var html = createHTMLReport(params);
|
|
112
|
-
|
|
113
|
-
|
|
148
|
+
_makeDir.default.sync(_path.default.dirname(params.report));
|
|
149
|
+
_fs.default.writeFileSync(params.report, html);
|
|
114
150
|
if (!!params.enableClientAdditionalDetection) {
|
|
115
151
|
var workerjs = createXimdiffWorker(params);
|
|
116
|
-
|
|
117
|
-
var wasmBuf =
|
|
118
|
-
|
|
152
|
+
_fs.default.writeFileSync(_path.default.resolve(_path.default.dirname(params.report), 'worker.js'), workerjs);
|
|
153
|
+
var wasmBuf = _fs.default.readFileSync(detectDiff.getBrowserWasmPath());
|
|
154
|
+
_fs.default.writeFileSync(_path.default.resolve(_path.default.dirname(params.report), 'detector.wasm'), wasmBuf);
|
|
119
155
|
}
|
|
120
156
|
}
|
|
121
|
-
|
|
157
|
+
if (!!params.junitReport) {
|
|
158
|
+
var junitXml = createJunitReport(params);
|
|
159
|
+
_makeDir.default.sync(_path.default.dirname(params.junitReport));
|
|
160
|
+
_fs.default.writeFileSync(params.junitReport, junitXml);
|
|
161
|
+
}
|
|
122
162
|
var json = createJSONReport(params);
|
|
123
163
|
if (!params.fromJSON) {
|
|
124
|
-
|
|
125
|
-
|
|
164
|
+
_makeDir.default.sync(_path.default.dirname(params.json));
|
|
165
|
+
_fs.default.writeFileSync(params.json, JSON.stringify(json));
|
|
126
166
|
}
|
|
127
167
|
return json;
|
|
128
|
-
};
|
|
168
|
+
};
|
|
169
|
+
exports.default = _default;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reg-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"start": "node ./dist/cli.js",
|
|
@@ -15,17 +15,20 @@
|
|
|
15
15
|
"reg": "node dist/cli.js ./sample/actual ./sample/expected ./sample/diff -I -R ./sample/index.html -T 0.01 -X client",
|
|
16
16
|
"reg:from": "node dist/cli.js -F ./sample/reg.json -R ./sample/index.html",
|
|
17
17
|
"screenshot": "node test/screenshot.js",
|
|
18
|
-
"test:cli": "chmod +x dist/cli.js && ava test/cli.test.
|
|
18
|
+
"test:cli": "chmod +x dist/cli.js && ava test/cli.test.mjs",
|
|
19
19
|
"test:screenshot": "npm run build:report && npm run reg && npm run screenshot",
|
|
20
|
-
"test": "cross-env NODE_ENV=\"debug\"
|
|
20
|
+
"test": "export NODE_OPTIONS=--openssl-legacy-provider && cross-env NODE_ENV=\"debug\" npm run build:report && npm run build && npm run test:cli && npm run test:screenshot"
|
|
21
21
|
},
|
|
22
22
|
"engines": {
|
|
23
|
-
"node": ">=
|
|
23
|
+
"node": ">=18"
|
|
24
24
|
},
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|
|
27
27
|
"url": "https://github.com/reg-viz/reg-cli/"
|
|
28
28
|
},
|
|
29
|
+
"ava": {
|
|
30
|
+
"workerThreads": false
|
|
31
|
+
},
|
|
29
32
|
"author": "bokuweb",
|
|
30
33
|
"license": "MIT",
|
|
31
34
|
"resolutions": {
|
|
@@ -48,43 +51,43 @@
|
|
|
48
51
|
"**/serialize-javascript": "^6.0.0",
|
|
49
52
|
"**/y18n": "^5.0.0",
|
|
50
53
|
"**/braces": "^3.0.0",
|
|
51
|
-
"**/trim-newlines": "^3.0.1"
|
|
54
|
+
"**/trim-newlines": "^3.0.1",
|
|
55
|
+
"**/debug": "^4.3.4"
|
|
52
56
|
},
|
|
53
57
|
"dependencies": {
|
|
54
58
|
"bluebird": "3.7.2",
|
|
55
59
|
"chalk": "4.1.2",
|
|
56
60
|
"cli-spinner": "0.2.10",
|
|
57
61
|
"cross-spawn": "7.0.3",
|
|
58
|
-
"del": "6.
|
|
59
|
-
"glob": "7.2.
|
|
62
|
+
"del": "6.1.1",
|
|
63
|
+
"glob": "7.2.3",
|
|
60
64
|
"img-diff-js": "0.5.2",
|
|
61
|
-
"jpeg-js": "^0.4.
|
|
65
|
+
"jpeg-js": "^0.4.4",
|
|
62
66
|
"lodash": "4.17.21",
|
|
63
67
|
"make-dir": "3.1.0",
|
|
64
68
|
"md5-file": "4.0.0",
|
|
65
|
-
"meow": "
|
|
69
|
+
"meow": "^9.0.0",
|
|
66
70
|
"mustache": "4.2.0",
|
|
67
71
|
"x-img-diff-js": "0.3.5",
|
|
72
|
+
"xmlbuilder2": "^3.1.1",
|
|
68
73
|
"yargs-parser": "^21.0.1"
|
|
69
74
|
},
|
|
70
75
|
"devDependencies": {
|
|
71
|
-
"
|
|
72
|
-
"babel
|
|
73
|
-
"babel-
|
|
74
|
-
"babel-
|
|
75
|
-
"babel-
|
|
76
|
-
"babel
|
|
77
|
-
"
|
|
78
|
-
"babel-preset-es2017": "6.24.1",
|
|
79
|
-
"babel-preset-stage-2": "6.24.1",
|
|
76
|
+
"@babel/cli": "^7.23.4",
|
|
77
|
+
"@babel/core": "^7.23.7",
|
|
78
|
+
"@babel/plugin-transform-block-scoping": "^7.23.4",
|
|
79
|
+
"@babel/preset-env": "^7.23.8",
|
|
80
|
+
"@babel/preset-flow": "^7.23.3",
|
|
81
|
+
"@babel/preset-stage-2": "^7.8.3",
|
|
82
|
+
"ava": "6.1.0",
|
|
80
83
|
"copyfiles": "2.4.1",
|
|
81
84
|
"cross-env": "7.0.3",
|
|
82
85
|
"finalhandler": "1.2.0",
|
|
83
86
|
"flow-bin": "0.77.0",
|
|
84
|
-
"flow-typed": "3.
|
|
85
|
-
"puppeteer": "13.
|
|
87
|
+
"flow-typed": "3.9.0",
|
|
88
|
+
"puppeteer": "13.7.0",
|
|
86
89
|
"rimraf": "3.0.2",
|
|
87
|
-
"serve-static": "1.
|
|
90
|
+
"serve-static": "1.15.0"
|
|
88
91
|
},
|
|
89
92
|
"files": [
|
|
90
93
|
"dist",
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2019 reg-viz.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# reg-cli-report-ui
|
|
2
|
+
|
|
3
|
+
[](https://github.com/reg-viz/reg-cli-report-ui/actions)
|
|
4
|
+
|
|
5
|
+
> :gem: New face of reg-cli report UI.
|
|
6
|
+
|
|
7
|
+
This repository is the Report UI of [reg-viz/reg-cli][reg-cli]
|
|
8
|
+
|
|
9
|
+
## Screenshots
|
|
10
|
+
|
|
11
|
+

|
|
12
|
+

|
|
13
|
+

|
|
14
|
+
|
|
15
|
+
## Available scripts
|
|
16
|
+
|
|
17
|
+
The following list is scripts used during development.
|
|
18
|
+
|
|
19
|
+
### `yarn start`
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
$ yarn start
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Launch the Report UI with the mock data.
|
|
26
|
+
|
|
27
|
+
### `yarn build`
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
$ yarn build
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Generate the JavaScript file required to embed Report UI. This is usually called in [reg-viz/reg-cli][reg-cli].
|
|
34
|
+
|
|
35
|
+
### `yarn typecheck`
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
$ yarn typecheck
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Run static type checking using TypeScript.
|
|
42
|
+
|
|
43
|
+
### `yarn lint`
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
$ yarn lint
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Run Lint with ESLint.
|
|
50
|
+
|
|
51
|
+
### `yarn format`
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
$ yarn format
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Format the source code using Prettier and ESLint.
|
|
58
|
+
|
|
59
|
+
### `yarn storybook`
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
$ yarn storybook
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Launch the component catalog with Storybook.
|
|
66
|
+
|
|
67
|
+
### `yarn scaffold`
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
$ yarn scaffold
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Generate a component template.
|
|
74
|
+
|
|
75
|
+
## Contribute
|
|
76
|
+
|
|
77
|
+
PRs welcome.
|
|
78
|
+
|
|
79
|
+
## License
|
|
80
|
+
|
|
81
|
+
[MIT License @ reg-viz](./LICENSE)
|
|
82
|
+
|
|
83
|
+

|
|
84
|
+
|
|
85
|
+
[reg-cli]: https://github.com/reg-viz/reg-cli
|