creevey 0.9.0-beta.2 → 0.9.0-beta.20
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/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +1 -0
- package/CHANGELOG.md +51 -0
- package/README.md +9 -1
- package/addon/README.md +3 -0
- package/addon/package.json +5 -0
- package/docs/config.md +29 -26
- package/jest.config.js +6 -0
- package/lib/cjs/cli.js +1 -0
- package/lib/cjs/client/addon/Manager.js +170 -390
- package/lib/cjs/client/addon/components/Addon.js +17 -45
- package/lib/cjs/client/addon/components/Icons.js +12 -14
- package/lib/cjs/client/addon/components/Panel.js +21 -30
- package/lib/cjs/client/addon/components/TestSelect.js +20 -31
- package/lib/cjs/client/addon/components/Tools.js +35 -65
- package/lib/cjs/client/addon/decorator.js +1 -4
- package/lib/cjs/client/addon/index.js +27 -0
- package/lib/cjs/client/addon/preset.js +3 -76
- package/lib/cjs/client/addon/preview.js +11 -0
- package/lib/cjs/client/addon/readyForCapture.js +1 -4
- package/lib/cjs/client/addon/register.js +43 -82
- package/lib/cjs/client/addon/utils.js +4 -8
- package/lib/cjs/client/addon/withCreevey.js +145 -404
- package/lib/cjs/client/shared/components/ImagesView/BlendView.js +25 -35
- package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +29 -41
- package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +46 -83
- package/lib/cjs/client/shared/components/ImagesView/SlideView.js +39 -67
- package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -57
- package/lib/cjs/client/shared/components/ImagesView/index.js +9 -14
- package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +13 -16
- package/lib/cjs/client/shared/components/PageFooter/Paging.js +16 -37
- package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +42 -34
- package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +40 -84
- package/lib/cjs/client/shared/components/ResultsPage.js +42 -99
- package/lib/cjs/client/shared/creeveyClientApi.js +56 -93
- package/lib/cjs/client/shared/helpers.js +149 -274
- package/lib/cjs/client/shared/viewMode.js +5 -9
- package/lib/cjs/client/web/192.js +1 -0
- package/lib/cjs/client/web/632.js +43 -0
- package/lib/cjs/client/web/794.js +1 -0
- package/lib/cjs/client/web/main.js +79 -38
- package/lib/cjs/client/web/main.js.LICENSE.txt +34 -0
- package/lib/cjs/creevey.js +15 -30
- package/lib/cjs/index.js +0 -15
- package/lib/cjs/server/config.js +16 -36
- package/lib/cjs/server/docker.js +8 -34
- package/lib/cjs/server/index.js +9 -34
- package/lib/cjs/server/logger.js +7 -20
- package/lib/cjs/server/master/api.js +1 -14
- package/lib/cjs/server/master/index.js +25 -49
- package/lib/cjs/server/master/master.js +6 -21
- package/lib/cjs/server/master/pool.js +10 -53
- package/lib/cjs/server/master/runner.js +65 -105
- package/lib/cjs/server/master/server.js +10 -29
- package/lib/cjs/server/messages.js +14 -62
- package/lib/cjs/server/selenium/browser.js +149 -185
- package/lib/cjs/server/selenium/index.js +0 -4
- package/lib/cjs/server/selenium/selenoid.js +18 -44
- package/lib/cjs/server/stories.js +35 -57
- package/lib/cjs/server/storybook/providers/browser.js +15 -29
- package/lib/cjs/server/storybook/providers/hybrid.js +16 -37
- package/lib/cjs/server/telemetry.js +167 -0
- package/lib/cjs/server/testsFiles/parser.js +3 -19
- package/lib/cjs/server/testsFiles/register.js +8 -14
- package/lib/cjs/server/update.js +4 -25
- package/lib/cjs/server/utils.js +35 -76
- package/lib/cjs/server/worker/chai-image.js +1 -27
- package/lib/cjs/server/worker/helpers.js +2 -12
- package/lib/cjs/server/worker/index.js +1 -3
- package/lib/cjs/server/worker/reporter.js +16 -43
- package/lib/cjs/server/worker/worker.js +32 -72
- package/lib/cjs/shared/index.js +87 -0
- package/lib/cjs/shared/serializeRegExp.js +34 -0
- package/lib/cjs/types.js +11 -20
- package/lib/esm/cli.js +1 -1
- package/lib/esm/client/addon/Manager.js +170 -381
- package/lib/esm/client/addon/components/Addon.js +15 -34
- package/lib/esm/client/addon/components/Icons.js +10 -6
- package/lib/esm/client/addon/components/Panel.js +20 -18
- package/lib/esm/client/addon/components/TestSelect.js +19 -23
- package/lib/esm/client/addon/components/Tools.js +33 -49
- package/lib/esm/client/addon/decorator.js +1 -1
- package/lib/esm/client/addon/index.js +2 -0
- package/lib/esm/client/addon/preset.js +2 -56
- package/lib/esm/client/addon/preview.js +5 -0
- package/lib/esm/client/addon/readyForCapture.js +1 -3
- package/lib/esm/client/addon/register.js +41 -67
- package/lib/esm/client/addon/utils.js +3 -7
- package/lib/esm/client/addon/withCreevey.js +142 -388
- package/lib/esm/client/shared/components/ImagesView/BlendView.js +22 -18
- package/lib/esm/client/shared/components/ImagesView/ImagesView.js +27 -25
- package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +43 -63
- package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
- package/lib/esm/client/shared/components/ImagesView/SwapView.js +23 -40
- package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
- package/lib/esm/client/shared/components/PageFooter/Paging.js +15 -29
- package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +40 -25
- package/lib/esm/client/shared/components/PageHeader/PageHeader.js +38 -66
- package/lib/esm/client/shared/components/ResultsPage.js +39 -75
- package/lib/esm/client/shared/creeveyClientApi.js +56 -90
- package/lib/esm/client/shared/helpers.js +133 -230
- package/lib/esm/client/shared/viewMode.js +4 -4
- package/lib/esm/client/web/192.js +1 -0
- package/lib/esm/client/web/632.js +43 -0
- package/lib/esm/client/web/794.js +1 -0
- package/lib/esm/client/web/index.html +19 -0
- package/lib/esm/client/web/main.js +79 -0
- package/lib/esm/client/web/main.js.LICENSE.txt +34 -0
- package/lib/esm/creevey.js +13 -16
- package/lib/esm/index.js +1 -4
- package/lib/esm/server/config.js +9 -16
- package/lib/esm/server/docker.js +6 -14
- package/lib/esm/server/index.js +8 -22
- package/lib/esm/server/logger.js +0 -1
- package/lib/esm/server/master/api.js +0 -9
- package/lib/esm/server/master/index.js +25 -35
- package/lib/esm/server/master/master.js +2 -7
- package/lib/esm/server/master/pool.js +8 -41
- package/lib/esm/server/master/runner.js +64 -90
- package/lib/esm/server/master/server.js +9 -11
- package/lib/esm/server/messages.js +8 -42
- package/lib/esm/server/selenium/browser.js +147 -163
- package/lib/esm/server/selenium/selenoid.js +16 -27
- package/lib/esm/server/stories.js +34 -46
- package/lib/esm/server/storybook/providers/browser.js +12 -17
- package/lib/esm/server/storybook/providers/hybrid.js +11 -22
- package/lib/esm/server/telemetry.js +160 -0
- package/lib/esm/server/testsFiles/parser.js +0 -6
- package/lib/esm/server/testsFiles/register.js +6 -7
- package/lib/esm/server/update.js +1 -13
- package/lib/esm/server/utils.js +20 -41
- package/lib/esm/server/worker/chai-image.js +0 -21
- package/lib/esm/server/worker/helpers.js +2 -9
- package/lib/esm/server/worker/reporter.js +15 -29
- package/lib/esm/server/worker/worker.js +31 -48
- package/lib/esm/shared/index.js +77 -0
- package/lib/esm/shared/serializeRegExp.js +24 -0
- package/lib/esm/types.js +5 -1
- package/lib/types/client/addon/Manager.d.ts +3 -3
- package/lib/types/client/addon/components/Addon.d.ts +1 -0
- package/lib/types/client/addon/components/Icons.d.ts +1 -0
- package/lib/types/client/addon/components/Panel.d.ts +1 -0
- package/lib/types/client/addon/components/Tools.d.ts +1 -0
- package/lib/types/client/addon/decorator.d.ts +1 -1
- package/lib/types/client/addon/index.d.ts +2 -0
- package/lib/types/client/addon/preset.d.ts +2 -24
- package/lib/types/client/addon/preview.d.ts +4 -0
- package/lib/types/client/addon/utils.d.ts +1 -0
- package/lib/types/client/addon/withCreevey.d.ts +4 -3
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -1
- package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +3 -1
- package/lib/types/client/shared/components/ResultsPage.d.ts +3 -1
- package/lib/types/client/web/CreeveyLoader.d.ts +1 -1
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +6 -3
- package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +19 -14
- package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
- package/lib/types/client/web/KeyboardEventsContext.d.ts +4 -2
- package/lib/types/index.d.ts +4 -1
- package/lib/types/server/logger.d.ts +6 -2
- package/lib/types/server/messages.d.ts +14 -12
- package/lib/types/server/selenium/browser.d.ts +5 -3
- package/lib/types/server/storybook/providers/browser.d.ts +2 -4
- package/lib/types/server/storybook/providers/hybrid.d.ts +2 -4
- package/lib/types/server/telemetry.d.ts +2 -0
- package/lib/types/server/utils.d.ts +5 -1
- package/lib/types/shared/index.d.ts +7 -0
- package/lib/types/shared/serializeRegExp.d.ts +9 -0
- package/lib/types/types.d.ts +29 -36
- package/package.json +132 -133
- package/types/global.d.ts +5 -0
- package/lib/cjs/client/web/1.js +0 -13
- package/lib/cjs/client/web/2.js +0 -1
- package/lib/cjs/server/extract.js +0 -50
- package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -88
- package/lib/cjs/server/loaders/babel/helpers.js +0 -479
- package/lib/cjs/server/loaders/babel/register.js +0 -126
- package/lib/cjs/server/loaders/hooks/mdx.js +0 -30
- package/lib/cjs/server/loaders/hooks/svelte.js +0 -65
- package/lib/cjs/server/loaders/webpack/compile.js +0 -286
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -174
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -44
- package/lib/cjs/server/loaders/webpack/mdx-loader.js +0 -72
- package/lib/cjs/server/loaders/webpack/start.js +0 -41
- package/lib/cjs/server/storybook/entry.js +0 -68
- package/lib/cjs/server/storybook/helpers.js +0 -165
- package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
- package/lib/cjs/shared.js +0 -124
- package/lib/esm/server/extract.js +0 -34
- package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -74
- package/lib/esm/server/loaders/babel/helpers.js +0 -462
- package/lib/esm/server/loaders/babel/register.js +0 -105
- package/lib/esm/server/loaders/hooks/mdx.js +0 -15
- package/lib/esm/server/loaders/hooks/svelte.js +0 -49
- package/lib/esm/server/loaders/webpack/compile.js +0 -263
- package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -153
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -36
- package/lib/esm/server/loaders/webpack/mdx-loader.js +0 -58
- package/lib/esm/server/loaders/webpack/start.js +0 -27
- package/lib/esm/server/storybook/entry.js +0 -44
- package/lib/esm/server/storybook/helpers.js +0 -106
- package/lib/esm/server/storybook/providers/nodejs.js +0 -217
- package/lib/esm/shared.js +0 -93
- package/lib/types/server/extract.d.ts +0 -2
- package/lib/types/server/loaders/babel/creevey-plugin.d.ts +0 -1
- package/lib/types/server/loaders/babel/helpers.d.ts +0 -19
- package/lib/types/server/loaders/babel/register.d.ts +0 -5
- package/lib/types/server/loaders/hooks/mdx.d.ts +0 -1
- package/lib/types/server/loaders/hooks/svelte.d.ts +0 -1
- package/lib/types/server/loaders/webpack/compile.d.ts +0 -2
- package/lib/types/server/loaders/webpack/creevey-loader.d.ts +0 -2
- package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +0 -10
- package/lib/types/server/loaders/webpack/mdx-loader.d.ts +0 -6
- package/lib/types/server/loaders/webpack/start.d.ts +0 -1
- package/lib/types/server/storybook/entry.d.ts +0 -18
- package/lib/types/server/storybook/helpers.d.ts +0 -24
- package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
- package/lib/types/shared.d.ts +0 -16
- package/preset.js +0 -9
- package/storybook-static/stories.json +0 -21
- package/types/mdx.d.ts +0 -6
@@ -3,9 +3,7 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
|
7
6
|
var _browser = require("./browser");
|
8
|
-
|
9
7
|
Object.keys(_browser).forEach(function (key) {
|
10
8
|
if (key === "default" || key === "__esModule") return;
|
11
9
|
if (key in exports && exports[key] === _browser[key]) return;
|
@@ -16,9 +14,7 @@ Object.keys(_browser).forEach(function (key) {
|
|
16
14
|
}
|
17
15
|
});
|
18
16
|
});
|
19
|
-
|
20
17
|
var _selenoid = require("./selenoid");
|
21
|
-
|
22
18
|
Object.keys(_selenoid).forEach(function (key) {
|
23
19
|
if (key === "default" || key === "__esModule") return;
|
24
20
|
if (key in exports && exports[key] === _selenoid[key]) return;
|
@@ -3,52 +3,39 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.startSelenoidStandalone = startSelenoidStandalone;
|
7
6
|
exports.startSelenoidContainer = startSelenoidContainer;
|
8
|
-
|
7
|
+
exports.startSelenoidStandalone = startSelenoidStandalone;
|
9
8
|
var _path = _interopRequireDefault(require("path"));
|
10
|
-
|
11
9
|
var _util = require("util");
|
12
|
-
|
13
10
|
var _fs = require("fs");
|
14
|
-
|
15
11
|
var _utils = require("../utils");
|
16
|
-
|
17
12
|
var _docker = require("../docker");
|
18
|
-
|
19
13
|
var _core = require("@octokit/core");
|
20
|
-
|
21
14
|
var _messages = require("../messages");
|
22
|
-
|
23
|
-
var _cluster = require("cluster");
|
24
|
-
|
15
|
+
var _cluster = _interopRequireDefault(require("cluster"));
|
25
16
|
var _shelljs = require("shelljs");
|
26
|
-
|
27
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
28
|
-
|
17
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
29
18
|
const mkdirAsync = (0, _util.promisify)(_fs.mkdir);
|
30
19
|
const writeFileAsync = (0, _util.promisify)(_fs.writeFile);
|
31
20
|
const copyFileAsync = (0, _util.promisify)(_fs.copyFile);
|
32
|
-
|
33
21
|
async function createSelenoidConfig(browsers, {
|
34
22
|
useDocker
|
35
23
|
}) {
|
36
24
|
const selenoidConfig = {};
|
37
|
-
|
38
25
|
const selenoidConfigDir = _path.default.join((0, _utils.getCreeveyCache)(), 'selenoid');
|
39
|
-
|
40
26
|
browsers.forEach(({
|
41
27
|
browserName,
|
42
28
|
version = 'latest',
|
43
|
-
|
29
|
+
browserVersion = version,
|
30
|
+
dockerImage = `selenoid/${browserName}:${browserVersion}`,
|
44
31
|
webdriverCommand = []
|
45
32
|
}) => {
|
46
33
|
if (!selenoidConfig[browserName]) selenoidConfig[browserName] = {
|
47
|
-
default:
|
34
|
+
default: browserVersion,
|
48
35
|
versions: {}
|
49
36
|
};
|
50
37
|
if (!useDocker && webdriverCommand.length == 0) throw new Error('Please specify "webdriverCommand" browser option with path to browser webdriver');
|
51
|
-
selenoidConfig[browserName].versions[
|
38
|
+
selenoidConfig[browserName].versions[browserVersion] = {
|
52
39
|
image: useDocker ? dockerImage : webdriverCommand,
|
53
40
|
port: '4444',
|
54
41
|
path: !useDocker || ['chrome', 'opera', 'webkit', 'MicrosoftEdge'].includes(browserName) ? '/' : '/wd/hub'
|
@@ -60,10 +47,7 @@ async function createSelenoidConfig(browsers, {
|
|
60
47
|
await writeFileAsync(_path.default.join(selenoidConfigDir, 'browsers.json'), JSON.stringify(selenoidConfig));
|
61
48
|
return selenoidConfigDir;
|
62
49
|
}
|
63
|
-
|
64
50
|
async function downloadSelenoidBinary(destination) {
|
65
|
-
var _assets$find;
|
66
|
-
|
67
51
|
const platformNameMapping = {
|
68
52
|
darwin: 'selenoid_darwin_amd64',
|
69
53
|
linux: 'selenoid_linux_amd64',
|
@@ -80,56 +64,46 @@ async function downloadSelenoidBinary(destination) {
|
|
80
64
|
const {
|
81
65
|
browser_download_url: downloadUrl,
|
82
66
|
size: binarySize
|
83
|
-
} =
|
67
|
+
} = assets.find(({
|
84
68
|
name
|
85
|
-
}) => platformNameMapping[process.platform] == name)
|
69
|
+
}) => platformNameMapping[process.platform] == name) ?? {};
|
86
70
|
if ((0, _fs.existsSync)(destination) && (0, _fs.lstatSync)(destination).size == binarySize) return;
|
87
|
-
|
88
71
|
if (!downloadUrl) {
|
89
72
|
throw new Error(`Couldn't get download url for selenoid binary. Please download it manually from "https://github.com/aerokube/selenoid/releases/latest" and define "selenoidPath" option in the Creevey config`);
|
90
73
|
}
|
91
|
-
|
92
74
|
return (0, _utils.downloadBinary)(downloadUrl, destination);
|
93
75
|
}
|
94
|
-
|
95
76
|
async function startSelenoidStandalone(config, debug) {
|
96
77
|
config.gridUrl = 'http://localhost:4444/wd/hub';
|
97
|
-
if (_cluster.isWorker) return;
|
78
|
+
if (_cluster.default.isWorker) return;
|
98
79
|
const browsers = Object.values(config.browsers).filter(browser => !browser.gridUrl);
|
99
80
|
const selenoidConfigDir = await createSelenoidConfig(browsers, {
|
100
81
|
useDocker: false
|
101
82
|
});
|
102
|
-
|
103
83
|
const binaryPath = _path.default.join(selenoidConfigDir, process.platform == 'win32' ? 'selenoid.exe' : 'selenoid');
|
104
|
-
|
105
84
|
if (config.selenoidPath) {
|
106
85
|
await copyFileAsync(_path.default.resolve(config.selenoidPath), binaryPath);
|
107
86
|
} else {
|
108
87
|
await downloadSelenoidBinary(binaryPath);
|
109
|
-
}
|
110
|
-
|
88
|
+
}
|
111
89
|
|
90
|
+
// TODO Download browser webdrivers
|
112
91
|
try {
|
113
92
|
if (process.platform != 'win32') (0, _shelljs.chmod)('+x', binaryPath);
|
114
93
|
} catch (_) {
|
115
94
|
/* noop */
|
116
95
|
}
|
117
|
-
|
118
96
|
const selenoidProcess = (0, _shelljs.exec)(`${binaryPath} -conf ./browsers.json -disable-docker`, {
|
119
97
|
async: true,
|
120
98
|
cwd: selenoidConfigDir
|
121
99
|
});
|
122
|
-
|
123
100
|
if (debug) {
|
124
101
|
var _selenoidProcess$stdo, _selenoidProcess$stde;
|
125
|
-
|
126
|
-
(_selenoidProcess$
|
127
|
-
(_selenoidProcess$stde = selenoidProcess.stderr) === null || _selenoidProcess$stde === void 0 ? void 0 : _selenoidProcess$stde.pipe(process.stderr);
|
102
|
+
(_selenoidProcess$stdo = selenoidProcess.stdout) === null || _selenoidProcess$stdo === void 0 || _selenoidProcess$stdo.pipe(process.stdout);
|
103
|
+
(_selenoidProcess$stde = selenoidProcess.stderr) === null || _selenoidProcess$stde === void 0 || _selenoidProcess$stde.pipe(process.stderr);
|
128
104
|
}
|
129
|
-
|
130
105
|
(0, _messages.subscribeOn)('shutdown', () => selenoidProcess.kill());
|
131
106
|
}
|
132
|
-
|
133
107
|
async function startSelenoidContainer(config, debug) {
|
134
108
|
const browsers = Object.values(config.browsers).filter(browser => !browser.gridUrl);
|
135
109
|
const images = [];
|
@@ -137,8 +111,9 @@ async function startSelenoidContainer(config, debug) {
|
|
137
111
|
browsers.forEach(({
|
138
112
|
browserName,
|
139
113
|
version = 'latest',
|
114
|
+
browserVersion = version,
|
140
115
|
limit: browserLimit = 1,
|
141
|
-
dockerImage = `selenoid/${browserName}:${
|
116
|
+
dockerImage = `selenoid/${browserName}:${browserVersion}`
|
142
117
|
}) => {
|
143
118
|
limit += browserLimit;
|
144
119
|
images.push(dockerImage);
|
@@ -148,13 +123,12 @@ async function startSelenoidContainer(config, debug) {
|
|
148
123
|
auth: config.dockerAuth,
|
149
124
|
platform: config.dockerImagePlatform
|
150
125
|
};
|
151
|
-
|
152
126
|
if (config.pullImages) {
|
153
127
|
await (0, _docker.pullImages)([selenoidImage], pullOptions);
|
154
128
|
await (0, _docker.pullImages)(images, pullOptions);
|
155
|
-
}
|
156
|
-
|
129
|
+
}
|
157
130
|
|
131
|
+
// TODO Allow pass custom options
|
158
132
|
const selenoidOptions = {
|
159
133
|
ExposedPorts: {
|
160
134
|
'4444/tcp': {}
|
@@ -6,37 +6,25 @@ Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
exports.loadTestsFromStories = loadTestsFromStories;
|
7
7
|
exports.saveStoriesJson = saveStoriesJson;
|
8
8
|
exports.saveTestsJson = saveTestsJson;
|
9
|
-
|
10
9
|
var _path = _interopRequireDefault(require("path"));
|
11
|
-
|
12
10
|
var _fs = require("fs");
|
13
|
-
|
14
11
|
var _crypto = require("crypto");
|
15
|
-
|
16
12
|
var _lodash = require("lodash");
|
17
|
-
|
18
13
|
var _types = require("../types");
|
19
|
-
|
20
14
|
var _utils = require("./utils");
|
21
|
-
|
22
|
-
var _helpers = require("./storybook/helpers");
|
23
|
-
|
24
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
25
|
-
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
26
16
|
function storyTestFabric(delay, testFn) {
|
27
17
|
return async function storyTest() {
|
28
|
-
var _testFn$call;
|
29
|
-
|
30
18
|
delay ? await new Promise(resolve => setTimeout(resolve, delay)) : void 0;
|
31
|
-
await (
|
19
|
+
await (testFn ? testFn.call(this) : this.screenshots.length > 0 ? this.expect(this.screenshots.reduce((screenshots, {
|
32
20
|
imageName,
|
33
21
|
screenshot
|
34
|
-
}, index) => ({
|
35
|
-
|
22
|
+
}, index) => ({
|
23
|
+
...screenshots,
|
24
|
+
[imageName ?? `screenshot_${index}`]: screenshot
|
36
25
|
}), {})).to.matchImages() : this.expect(await this.takeScreenshot()).to.matchImage());
|
37
26
|
};
|
38
27
|
}
|
39
|
-
|
40
28
|
function createCreeveyTest(browser, storyMeta, skipOptions, testName) {
|
41
29
|
const {
|
42
30
|
kind,
|
@@ -58,37 +46,37 @@ function createCreeveyTest(browser, storyMeta, skipOptions, testName) {
|
|
58
46
|
storyId
|
59
47
|
};
|
60
48
|
}
|
61
|
-
|
62
49
|
function convertStories(browserName, stories) {
|
63
50
|
const tests = {};
|
64
51
|
(Array.isArray(stories) ? stories : Object.values(stories)).forEach(storyMeta => {
|
65
|
-
var _storyMeta$parameters;
|
66
|
-
|
67
52
|
// TODO Skip docsOnly stories for now
|
68
53
|
if (storyMeta.parameters.docsOnly) return;
|
69
54
|
const {
|
70
55
|
delay: delayParam,
|
71
56
|
tests: storyTests,
|
72
57
|
skip
|
73
|
-
} =
|
74
|
-
const delay = typeof delayParam == 'number' ? delayParam : delayParam !== null && delayParam !== void 0 && delayParam.for.includes(browserName) ? delayParam.ms : 0;
|
58
|
+
} = storyMeta.parameters.creevey ?? {};
|
59
|
+
const delay = typeof delayParam == 'number' ? delayParam : delayParam !== null && delayParam !== void 0 && delayParam.for.includes(browserName) ? delayParam.ms : 0;
|
60
|
+
|
61
|
+
// typeof tests === "undefined" => rootSuite -> kindSuite -> storyTest -> [browsers.png]
|
75
62
|
// typeof tests === "function" => rootSuite -> kindSuite -> storyTest -> browser -> [images.png]
|
76
63
|
// typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> [browsers.png]
|
77
64
|
// typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> browser -> [images.png]
|
78
65
|
|
79
66
|
if (!storyTests) {
|
80
67
|
const test = createCreeveyTest(browserName, storyMeta, skip);
|
81
|
-
tests[test.id] = {
|
68
|
+
tests[test.id] = {
|
69
|
+
...test,
|
82
70
|
storyId: storyMeta.id,
|
83
71
|
story: storyMeta,
|
84
72
|
fn: storyTestFabric(delay)
|
85
73
|
};
|
86
74
|
return;
|
87
75
|
}
|
88
|
-
|
89
76
|
Object.entries(storyTests).forEach(([testName, testFn]) => {
|
90
77
|
const test = createCreeveyTest(browserName, storyMeta, skip, testName);
|
91
|
-
tests[test.id] = {
|
78
|
+
tests[test.id] = {
|
79
|
+
...test,
|
92
80
|
storyId: storyMeta.id,
|
93
81
|
story: storyMeta,
|
94
82
|
fn: storyTestFabric(delay, testFn)
|
@@ -97,7 +85,6 @@ function convertStories(browserName, stories) {
|
|
97
85
|
});
|
98
86
|
return tests;
|
99
87
|
}
|
100
|
-
|
101
88
|
async function loadTestsFromStories(browsers, provider, update) {
|
102
89
|
const testIdsByFiles = new Map();
|
103
90
|
const stories = await provider(storiesByFiles => {
|
@@ -105,17 +92,16 @@ async function loadTestsFromStories(browsers, provider, update) {
|
|
105
92
|
const tests = {};
|
106
93
|
browsers.forEach(browser => {
|
107
94
|
Array.from(storiesByFiles.entries()).forEach(([filename, stories]) => {
|
108
|
-
var _testIdsByFiles$get
|
109
|
-
|
95
|
+
var _testIdsByFiles$get;
|
110
96
|
Object.assign(tests, convertStories(browser, stories));
|
111
97
|
const changed = Object.keys(tests);
|
112
|
-
const removed = (
|
98
|
+
const removed = ((_testIdsByFiles$get = testIdsByFiles.get(filename)) === null || _testIdsByFiles$get === void 0 ? void 0 : _testIdsByFiles$get.filter(testId => !tests[testId])) ?? [];
|
113
99
|
if (changed.length == 0) testIdsByFiles.delete(filename);else testIdsByFiles.set(filename, changed);
|
114
100
|
Object.assign(testsDiff, tests);
|
115
101
|
removed.forEach(testId => testsDiff[testId] = undefined);
|
116
102
|
});
|
117
103
|
});
|
118
|
-
update === null || update === void 0
|
104
|
+
update === null || update === void 0 || update(testsDiff);
|
119
105
|
});
|
120
106
|
const tests = browsers.reduce((tests, browser) => Object.assign(tests, convertStories(browser, stories)), {});
|
121
107
|
Object.values(tests).filter(_types.isDefined).forEach(({
|
@@ -125,46 +111,38 @@ async function loadTestsFromStories(browsers, provider, update) {
|
|
125
111
|
fileName
|
126
112
|
}
|
127
113
|
}
|
128
|
-
}) =>
|
129
|
-
|
130
|
-
|
131
|
-
return (// TODO Don't use filename as a key, due possible collisions if two require.context with same structure of modules are defined
|
132
|
-
testIdsByFiles.set(fileName, [...((_testIdsByFiles$get2 = testIdsByFiles.get(fileName)) !== null && _testIdsByFiles$get2 !== void 0 ? _testIdsByFiles$get2 : []), id])
|
133
|
-
);
|
134
|
-
});
|
114
|
+
}) =>
|
115
|
+
// TODO Don't use filename as a key, due possible collisions if two require.context with same structure of modules are defined
|
116
|
+
testIdsByFiles.set(fileName, [...(testIdsByFiles.get(fileName) ?? []), id]));
|
135
117
|
return tests;
|
136
118
|
}
|
137
|
-
|
138
119
|
function saveStoriesJson(storiesData, extract) {
|
139
|
-
var _storiesData$stories;
|
140
|
-
|
141
120
|
const outputDir = typeof extract == 'boolean' ? 'storybook-static' : extract;
|
142
121
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
Object.values((_storiesData$stories = storiesData === null || storiesData === void 0 ? void 0 : storiesData.stories) !== null && _storiesData$stories !== void 0 ? _storiesData$stories : {}).forEach(story => (0, _types.isObject)(story) && 'parameters' in story && (0, _types.isObject)(story.parameters) && delete story.parameters.__isArgsStory);
|
122
|
+
// NOTE Copy-pasted from Storybook's `getStoriesJsonData` method
|
123
|
+
const allowed = ['fileName', 'docsOnly', 'framework', '__id', '__isArgsStory'];
|
124
|
+
storiesData.globalParameters = (0, _lodash.pick)(storiesData.globalParameters, allowed);
|
125
|
+
// @ts-expect-error ignore error
|
126
|
+
storiesData.kindParameters = (0, _lodash.mapValues)(storiesData.kindParameters, v => (0, _lodash.pick)(v, allowed));
|
127
|
+
// @ts-expect-error ignore error
|
128
|
+
storiesData.stories = (0, _lodash.mapValues)(storiesData.stories, v => ({
|
129
|
+
...(0, _lodash.pick)(v, ['id', 'name', 'kind', 'story']),
|
130
|
+
parameters: (0, _lodash.pick)(v.parameters, allowed)
|
131
|
+
}));
|
132
|
+
|
133
|
+
// TODO Fix args stories
|
134
|
+
(0, _utils.removeProps)(storiesData ?? {}, ['stories', () => true, 'parameters', '__isArgsStory']);
|
135
|
+
Object.values((storiesData === null || storiesData === void 0 ? void 0 : storiesData.stories) ?? {}).forEach(story => (0, _types.isObject)(story) && 'parameters' in story && (0, _types.isObject)(story.parameters) && delete story.parameters.__isArgsStory);
|
158
136
|
(0, _fs.mkdirSync)(outputDir, {
|
159
137
|
recursive: true
|
160
138
|
});
|
161
139
|
(0, _fs.writeFileSync)(_path.default.join(outputDir, 'stories.json'), JSON.stringify(storiesData, null, 2));
|
162
140
|
}
|
163
|
-
|
164
141
|
function saveTestsJson(tests, dstPath = process.cwd()) {
|
165
142
|
(0, _fs.mkdirSync)(dstPath, {
|
166
143
|
recursive: true
|
167
144
|
});
|
168
|
-
(0, _fs.writeFileSync)(_path.default.join(dstPath, 'tests.json'),
|
145
|
+
(0, _fs.writeFileSync)(_path.default.join(dstPath, 'tests.json'),
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
169
147
|
JSON.stringify(tests, (_, value) => (0, _types.isFunction)(value) ? value.toString() : value, 2));
|
170
148
|
}
|
@@ -3,31 +3,18 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.loadStories =
|
7
|
-
|
8
|
-
var _cluster = _interopRequireWildcard(require("cluster"));
|
9
|
-
|
6
|
+
exports.loadStories = void 0;
|
7
|
+
var _cluster = _interopRequireDefault(require("cluster"));
|
10
8
|
var _selenium = require("../../selenium");
|
11
|
-
|
12
9
|
var _messages = require("../../messages");
|
13
|
-
|
14
|
-
var _shared = require("../../../shared");
|
15
|
-
|
16
10
|
var _types = require("../../../types");
|
17
|
-
|
18
11
|
var _logger = require("../../logger");
|
19
|
-
|
20
|
-
function
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
async function loadStories(_config, {
|
25
|
-
port
|
26
|
-
}, storiesListener) {
|
27
|
-
if (_cluster.isMaster) {
|
12
|
+
var _shared = require("../../../shared");
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
14
|
+
const loadStories = async (_config, _options, storiesListener) => {
|
15
|
+
if (_cluster.default.isPrimary) {
|
28
16
|
return new Promise(resolve => {
|
29
|
-
const worker = Object.values(_cluster.default.workers).filter(_types.isDefined).find(worker => worker.isConnected());
|
30
|
-
|
17
|
+
const worker = Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).find(worker => worker.isConnected());
|
31
18
|
if (worker) {
|
32
19
|
const unsubscribe = (0, _messages.subscribeOnWorker)(worker, 'stories', message => {
|
33
20
|
if (message.type == 'set') {
|
@@ -44,7 +31,6 @@ async function loadStories(_config, {
|
|
44
31
|
type: 'get'
|
45
32
|
});
|
46
33
|
}
|
47
|
-
|
48
34
|
(0, _messages.subscribeOn)('stories', message => {
|
49
35
|
// TODO updates only one browser :(
|
50
36
|
if (message.type == 'update') storiesListener(new Map(message.payload));
|
@@ -61,18 +47,18 @@ async function loadStories(_config, {
|
|
61
47
|
});
|
62
48
|
if (message.type == 'update') storiesListener(new Map(message.payload));
|
63
49
|
});
|
64
|
-
const stories = (0, _shared.deserializeRawStories)(await (0, _selenium.loadStoriesFromBrowser)(
|
50
|
+
const stories = (0, _shared.deserializeRawStories)(await (0, _selenium.loadStoriesFromBrowser)());
|
65
51
|
const storiesWithOldTests = [];
|
66
52
|
Object.values(stories).forEach(story => {
|
67
|
-
var _parameters
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
(_parameters2 = story.parameters) === null || _parameters2 === void 0 ? true : (_parameters2$creevey = _parameters2.creevey) === null || _parameters2$creevey === void 0 ? true : delete _parameters2$creevey.tests;
|
53
|
+
var _parameters;
|
54
|
+
if ((_parameters = story.parameters) !== null && _parameters !== void 0 && (_parameters = _parameters.creevey) !== null && _parameters !== void 0 && _parameters.tests) {
|
55
|
+
var _parameters2;
|
56
|
+
(_parameters2 = story.parameters) === null || _parameters2 === void 0 || (_parameters2 = _parameters2.creevey) === null || _parameters2 === void 0 || delete _parameters2.tests;
|
73
57
|
storiesWithOldTests.push(`${story.kind}/${story.name}`);
|
74
58
|
}
|
75
59
|
});
|
76
60
|
return stories;
|
77
61
|
}
|
78
|
-
}
|
62
|
+
};
|
63
|
+
exports.loadStories = loadStories;
|
64
|
+
loadStories.providerName = 'browser';
|
@@ -3,82 +3,61 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.loadStories =
|
7
|
-
|
6
|
+
exports.loadStories = void 0;
|
8
7
|
var _chokidar = _interopRequireDefault(require("chokidar"));
|
9
|
-
|
10
8
|
var _browser = require("./browser");
|
11
|
-
|
12
9
|
var _logger = require("../../logger");
|
13
|
-
|
14
10
|
var _parser = _interopRequireDefault(require("../../testsFiles/parser"));
|
15
|
-
|
16
11
|
var _utils = require("../../../server/utils");
|
17
|
-
|
18
12
|
var _shared = require("../../../shared");
|
19
|
-
|
20
|
-
function
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
25
|
-
|
26
|
-
async function loadStories(_config, {
|
27
|
-
port
|
28
|
-
}, storiesListener) {
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
14
|
+
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); }
|
15
|
+
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 && {}.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; }
|
16
|
+
const loadStories = async (_config, _options, storiesListener) => {
|
29
17
|
let creeveyParamsByStoryId = {};
|
30
|
-
|
31
18
|
const mergeParamsFromTestsToStory = (story, creeveyParams) => {
|
32
19
|
if (story.parameters) {
|
33
20
|
story.parameters.creevey = (0, _shared.combineParameters)(story.parameters.creevey || {}, creeveyParams);
|
34
21
|
}
|
35
22
|
};
|
36
|
-
|
37
|
-
const stories = await (0, _browser.loadStories)(_config, {
|
38
|
-
port
|
39
|
-
}, updatedStoriesByFiles => {
|
23
|
+
const stories = await (0, _browser.loadStories)(_config, {}, updatedStoriesByFiles => {
|
40
24
|
Array.from(updatedStoriesByFiles.entries()).forEach(([, storiesArray]) => {
|
41
25
|
storiesArray.forEach(story => {
|
42
26
|
const creeveyParams = creeveyParamsByStoryId[story.id];
|
43
|
-
|
44
27
|
if (creeveyParams) {
|
45
28
|
mergeParamsFromTestsToStory(story, creeveyParams);
|
46
29
|
}
|
47
30
|
});
|
48
31
|
});
|
49
32
|
storiesListener(updatedStoriesByFiles);
|
50
|
-
});
|
33
|
+
});
|
51
34
|
|
52
|
-
|
53
|
-
/*, (data) => console.log(data) */
|
54
|
-
);
|
35
|
+
// TODO fix test files hot reloading
|
36
|
+
creeveyParamsByStoryId = await parseParams(_config /*, (data) => console.log(data) */);
|
55
37
|
Object.entries(stories).forEach(([storyId, story]) => {
|
56
38
|
mergeParamsFromTestsToStory(story, creeveyParamsByStoryId[storyId]);
|
57
39
|
});
|
58
40
|
return stories;
|
59
|
-
}
|
60
|
-
|
41
|
+
};
|
42
|
+
exports.loadStories = loadStories;
|
61
43
|
async function parseParams(config, listener) {
|
62
44
|
if (!config.testsDir) {
|
63
45
|
return Promise.resolve({});
|
64
46
|
}
|
65
|
-
|
66
47
|
const testFiles = (0, _utils.readDirRecursive)(config.testsDir).filter(file => {
|
67
48
|
var _config$testsRegex;
|
68
|
-
|
69
49
|
return (_config$testsRegex = config.testsRegex) === null || _config$testsRegex === void 0 ? void 0 : _config$testsRegex.test(file);
|
70
50
|
});
|
71
51
|
await (await Promise.resolve().then(() => _interopRequireWildcard(require('../../testsFiles/register')))).default(config);
|
72
|
-
|
73
52
|
if (listener) {
|
74
53
|
_chokidar.default.watch(testFiles).on('change', filePath => {
|
75
|
-
_logger.logger.debug(`changed: ${filePath}`);
|
76
|
-
// see https://github.com/nodejs/modules/issues/307
|
77
|
-
|
54
|
+
_logger.logger.debug(`changed: ${filePath}`);
|
78
55
|
|
56
|
+
// doesn't work, always returns {} due modules caching
|
57
|
+
// see https://github.com/nodejs/modules/issues/307
|
79
58
|
void (0, _parser.default)(testFiles).then(data => listener(data));
|
80
59
|
});
|
81
60
|
}
|
82
|
-
|
83
61
|
return (0, _parser.default)(testFiles);
|
84
|
-
}
|
62
|
+
}
|
63
|
+
loadStories.providerName = 'hybrid';
|