creevey 0.8.0-beta.0 → 0.8.0-beta.1
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/CHANGELOG.md +25 -8
- package/README.md +8 -0
- package/addon/README.md +3 -0
- package/addon/package.json +4 -0
- package/jest.config.js +6 -0
- package/lib/cjs/client/addon/Manager.js +122 -271
- package/lib/cjs/client/addon/components/Addon.js +17 -38
- package/lib/cjs/client/addon/components/Icons.js +11 -7
- package/lib/cjs/client/addon/components/Panel.js +17 -13
- package/lib/cjs/client/addon/components/TestSelect.js +11 -9
- package/lib/cjs/client/addon/components/Tools.js +21 -40
- package/lib/cjs/client/addon/decorator.js +1 -1
- package/lib/cjs/client/addon/index.js +31 -0
- package/lib/cjs/client/addon/preset.ie11.js +74 -0
- package/lib/cjs/client/addon/preset.js +13 -31
- package/lib/cjs/client/addon/readyForCapture.js +12 -0
- package/lib/cjs/client/addon/register.js +46 -70
- package/lib/cjs/client/addon/utils.js +6 -2
- package/lib/cjs/client/addon/withCreevey.js +221 -155
- package/lib/cjs/client/shared/components/ImagesView/BlendView.js +26 -24
- package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +22 -18
- package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +44 -66
- package/lib/cjs/client/shared/components/ImagesView/SlideView.js +38 -50
- package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -45
- package/lib/cjs/client/shared/components/ImagesView/index.js +9 -9
- package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +12 -8
- package/lib/cjs/client/shared/components/PageFooter/Paging.js +14 -18
- package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +22 -18
- package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +42 -67
- package/lib/cjs/client/shared/components/ResultsPage.js +39 -69
- package/lib/cjs/client/shared/creeveyClientApi.js +55 -82
- package/lib/cjs/client/shared/helpers.js +140 -211
- package/lib/cjs/client/shared/viewMode.js +5 -5
- package/lib/cjs/client/web/142.js +2 -0
- package/lib/cjs/client/web/142.js.LICENSE.txt +12 -0
- package/lib/cjs/client/web/32.js +1 -0
- package/lib/cjs/client/web/551.js +1 -0
- package/lib/cjs/client/web/566.js +2 -0
- package/lib/cjs/client/web/566.js.LICENSE.txt +31 -0
- package/lib/cjs/client/web/691.js +2 -0
- package/lib/cjs/client/web/691.js.LICENSE.txt +8 -0
- package/lib/cjs/client/web/725.js +1 -0
- package/lib/cjs/client/web/main.js +2 -38
- package/lib/cjs/client/web/main.js.LICENSE.txt +49 -0
- package/lib/cjs/creevey.js +3 -5
- package/lib/cjs/index.js +10 -15
- package/lib/cjs/server/config.js +5 -4
- package/lib/cjs/server/docker.js +3 -7
- package/lib/cjs/server/extract.js +7 -4
- package/lib/cjs/server/index.js +3 -5
- package/lib/cjs/server/loaders/babel/creevey-plugin.js +1 -3
- package/lib/cjs/server/loaders/babel/helpers.js +13 -23
- package/lib/cjs/server/loaders/babel/register.js +2 -4
- package/lib/cjs/server/loaders/webpack/compile.js +33 -50
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +20 -22
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +2 -7
- package/lib/cjs/server/loaders/webpack/mdx-loader.js +2 -2
- package/lib/cjs/server/loaders/webpack/start.js +1 -1
- package/lib/cjs/server/logger.js +2 -1
- package/lib/cjs/server/master/index.js +4 -4
- package/lib/cjs/server/master/master.js +1 -0
- package/lib/cjs/server/master/pool.js +38 -47
- package/lib/cjs/server/master/runner.js +53 -66
- package/lib/cjs/server/master/server.js +78 -4
- package/lib/cjs/server/messages.js +128 -18
- package/lib/cjs/server/selenium/browser.js +129 -55
- package/lib/cjs/server/selenium/selenoid.js +5 -7
- package/lib/cjs/server/stories.js +58 -72
- package/lib/cjs/server/storybook/entry.js +7 -22
- package/lib/cjs/server/storybook/helpers.js +18 -25
- package/lib/cjs/server/storybook/providers/browser.js +74 -0
- package/lib/cjs/server/storybook/{nodejs-provider.js → providers/nodejs.js} +37 -20
- package/lib/cjs/server/update.js +1 -5
- package/lib/cjs/server/utils.js +12 -14
- package/lib/cjs/server/worker/helpers.js +2 -6
- package/lib/cjs/server/worker/reporter.js +8 -20
- package/lib/cjs/server/worker/worker.js +21 -19
- package/lib/cjs/shared/index.js +101 -0
- package/lib/cjs/shared/serializeRegExp.js +42 -0
- package/lib/cjs/types.js +11 -6
- package/lib/esm/client/addon/Manager.js +122 -271
- 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 +17 -13
- package/lib/esm/client/addon/components/TestSelect.js +11 -9
- package/lib/esm/client/addon/components/Tools.js +19 -36
- package/lib/esm/client/addon/decorator.js +1 -1
- package/lib/esm/client/addon/index.js +2 -0
- package/lib/esm/client/addon/preset.ie11.js +59 -0
- package/lib/esm/client/addon/preset.js +12 -26
- package/lib/esm/client/addon/readyForCapture.js +5 -0
- package/lib/esm/client/addon/register.js +42 -66
- package/lib/esm/client/addon/utils.js +3 -2
- package/lib/esm/client/addon/withCreevey.js +209 -156
- package/lib/esm/client/shared/components/ImagesView/BlendView.js +23 -20
- package/lib/esm/client/shared/components/ImagesView/ImagesView.js +21 -17
- package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +42 -63
- package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
- package/lib/esm/client/shared/components/ImagesView/SwapView.js +24 -42
- package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
- package/lib/esm/client/shared/components/PageFooter/Paging.js +14 -18
- package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +22 -18
- package/lib/esm/client/shared/components/PageHeader/PageHeader.js +37 -60
- package/lib/esm/client/shared/components/ResultsPage.js +36 -64
- package/lib/esm/client/shared/creeveyClientApi.js +57 -84
- package/lib/esm/client/shared/helpers.js +124 -195
- package/lib/esm/client/shared/viewMode.js +4 -4
- package/lib/esm/creevey.js +3 -5
- package/lib/esm/index.js +2 -3
- package/lib/esm/server/config.js +4 -5
- package/lib/esm/server/docker.js +2 -2
- package/lib/esm/server/extract.js +6 -4
- package/lib/esm/server/index.js +3 -4
- package/lib/esm/server/loaders/babel/creevey-plugin.js +1 -3
- package/lib/esm/server/loaders/babel/helpers.js +12 -22
- package/lib/esm/server/loaders/babel/register.js +3 -5
- package/lib/esm/server/loaders/webpack/compile.js +34 -51
- package/lib/esm/server/loaders/webpack/creevey-loader.js +9 -10
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +2 -6
- package/lib/esm/server/loaders/webpack/mdx-loader.js +2 -2
- package/lib/esm/server/loaders/webpack/start.js +1 -1
- package/lib/esm/server/master/index.js +4 -4
- package/lib/esm/server/master/master.js +1 -0
- package/lib/esm/server/master/pool.js +38 -49
- package/lib/esm/server/master/runner.js +53 -66
- package/lib/esm/server/master/server.js +76 -6
- package/lib/esm/server/messages.js +118 -14
- package/lib/esm/server/selenium/browser.js +126 -57
- package/lib/esm/server/selenium/selenoid.js +4 -6
- package/lib/esm/server/stories.js +58 -70
- package/lib/esm/server/storybook/entry.js +5 -22
- package/lib/esm/server/storybook/helpers.js +10 -19
- package/lib/esm/server/storybook/providers/browser.js +60 -0
- package/lib/esm/server/storybook/{nodejs-provider.js → providers/nodejs.js} +35 -19
- package/lib/esm/server/update.js +1 -5
- package/lib/esm/server/utils.js +5 -9
- package/lib/esm/server/worker/helpers.js +2 -6
- package/lib/esm/server/worker/reporter.js +8 -20
- package/lib/esm/server/worker/worker.js +22 -20
- package/lib/esm/shared/index.js +78 -0
- package/lib/esm/shared/serializeRegExp.js +24 -0
- package/lib/esm/types.js +3 -0
- package/lib/types/client/addon/Manager.d.ts +2 -2
- package/lib/types/client/addon/components/TestSelect.d.ts +0 -1
- package/lib/types/client/addon/index.d.ts +2 -0
- package/lib/types/client/addon/preset.d.ts +2 -1
- package/lib/types/client/addon/preset.ie11.d.ts +10 -0
- package/lib/types/client/addon/readyForCapture.d.ts +6 -0
- package/lib/types/client/addon/utils.d.ts +1 -0
- package/lib/types/client/addon/withCreevey.d.ts +13 -2
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +1 -1
- package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +0 -1
- package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
- package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +1 -1
- package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +1 -1
- package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +0 -1
- package/lib/types/client/shared/components/PageFooter/Paging.d.ts +0 -1
- package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +1 -1
- package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +0 -1
- package/lib/types/client/shared/components/ResultsPage.d.ts +1 -1
- package/lib/types/client/web/CreeveyApp.d.ts +0 -1
- package/lib/types/client/web/CreeveyLoader.d.ts +1 -2
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +1 -1
- package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +0 -1
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +6 -6
- package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +0 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +1 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +1 -1
- package/lib/types/index.d.ts +0 -1
- package/lib/types/server/loaders/babel/register.d.ts +1 -1
- package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -2
- package/lib/types/server/logger.d.ts +6 -2
- package/lib/types/server/master/master.d.ts +1 -0
- package/lib/types/server/master/pool.d.ts +1 -0
- package/lib/types/server/master/server.d.ts +1 -1
- package/lib/types/server/messages.d.ts +17 -6
- package/lib/types/server/selenium/browser.d.ts +5 -2
- package/lib/types/server/stories.d.ts +2 -2
- package/lib/types/server/storybook/entry.d.ts +1 -2
- package/lib/types/server/storybook/providers/browser.d.ts +4 -0
- package/lib/types/server/storybook/providers/nodejs.d.ts +9 -0
- package/lib/types/server/worker/helpers.d.ts +2 -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 +31 -3
- package/package.json +121 -103
- package/preset/ie11.js +5 -0
- package/{preset.js → preset/index.js} +2 -2
- package/types/mdx.d.ts +3 -2
- package/types/mocha.d.ts +1 -0
- package/lib/cjs/client/web/1.js +0 -13
- package/lib/cjs/client/web/2.js +0 -1
- package/lib/cjs/shared.js +0 -35
- package/lib/esm/shared.js +0 -22
- package/lib/types/server/storybook/nodejs-provider.d.ts +0 -5
- package/lib/types/shared.d.ts +0 -4
@@ -3,8 +3,8 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.registerCreeveyPanels = registerCreeveyPanels;
|
7
6
|
exports.ADDON_ID = void 0;
|
7
|
+
exports.registerCreeveyPanels = registerCreeveyPanels;
|
8
8
|
|
9
9
|
var _addons = require("@storybook/addons");
|
10
10
|
|
@@ -18,79 +18,55 @@ var _Manager = require("./Manager");
|
|
18
18
|
|
19
19
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
24
|
-
|
25
|
-
var ADDON_ID = 'creevey';
|
21
|
+
const ADDON_ID = 'creevey';
|
26
22
|
exports.ADDON_ID = ADDON_ID;
|
27
23
|
|
28
|
-
_addons.addons.register(ADDON_ID,
|
24
|
+
_addons.addons.register(ADDON_ID, api => {
|
29
25
|
void registerCreeveyPanels(api);
|
30
26
|
});
|
31
27
|
|
32
|
-
function registerCreeveyPanels(
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
// NOTE key = PANEL_ID needs to correct render button in addons panel
|
74
|
-
// eslint-disable-next-line react/display-name
|
75
|
-
render: function render(_ref2) {
|
76
|
-
var active = _ref2.active,
|
77
|
-
key = _ref2.key;
|
78
|
-
return /*#__PURE__*/_react.default.createElement(_Addon.Addon, {
|
79
|
-
active: active,
|
80
|
-
key: key,
|
81
|
-
manager: manager,
|
82
|
-
browser: browser
|
83
|
-
});
|
84
|
-
}
|
85
|
-
});
|
86
|
-
});
|
87
|
-
|
88
|
-
case 6:
|
89
|
-
case "end":
|
90
|
-
return _context.stop();
|
91
|
-
}
|
28
|
+
async function registerCreeveyPanels(storybookApi) {
|
29
|
+
const manager = new _Manager.CreeveyManager(storybookApi);
|
30
|
+
|
31
|
+
_addons.addons.addPanel("".concat(ADDON_ID, "/panel/run"), {
|
32
|
+
title: "Creevey/Run",
|
33
|
+
match: _ref => {
|
34
|
+
let {
|
35
|
+
viewMode
|
36
|
+
} = _ref;
|
37
|
+
return !!(viewMode && /^story$/.exec(viewMode));
|
38
|
+
},
|
39
|
+
type: _addons.types.TOOL,
|
40
|
+
// eslint-disable-next-line react/display-name
|
41
|
+
render: () => /*#__PURE__*/_react.default.createElement(_Tools.Tools, {
|
42
|
+
manager
|
43
|
+
})
|
44
|
+
});
|
45
|
+
|
46
|
+
await manager.initAll();
|
47
|
+
const browsers = manager.getBrowsers();
|
48
|
+
browsers.forEach(browser => {
|
49
|
+
const panelId = "".concat(ADDON_ID, "/panel/").concat(browser);
|
50
|
+
const title = manager.getTabTitle(browser);
|
51
|
+
|
52
|
+
_addons.addons.addPanel(panelId, {
|
53
|
+
title,
|
54
|
+
type: _addons.types.PANEL,
|
55
|
+
paramKey: browser,
|
56
|
+
// NOTE key = PANEL_ID needs to correct render button in addons panel
|
57
|
+
// eslint-disable-next-line react/display-name
|
58
|
+
render: _ref2 => {
|
59
|
+
let {
|
60
|
+
active,
|
61
|
+
key
|
62
|
+
} = _ref2;
|
63
|
+
return /*#__PURE__*/_react.default.createElement(_Addon.Addon, {
|
64
|
+
active,
|
65
|
+
key,
|
66
|
+
manager,
|
67
|
+
browser
|
68
|
+
});
|
92
69
|
}
|
93
|
-
}
|
94
|
-
})
|
95
|
-
return _registerCreeveyPanels.apply(this, arguments);
|
70
|
+
});
|
71
|
+
});
|
96
72
|
}
|
@@ -4,9 +4,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.getEmojiByTestStatus = getEmojiByTestStatus;
|
7
|
+
exports.isInternetExplorer = void 0;
|
7
8
|
|
8
9
|
function getEmojiByTestStatus(status) {
|
9
|
-
|
10
|
+
let skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
10
11
|
|
11
12
|
switch (status) {
|
12
13
|
case 'failed':
|
@@ -35,4 +36,7 @@ function getEmojiByTestStatus(status) {
|
|
35
36
|
return '';
|
36
37
|
}
|
37
38
|
}
|
38
|
-
}
|
39
|
+
}
|
40
|
+
|
41
|
+
const isInternetExplorer = navigator.userAgent.includes('Trident/');
|
42
|
+
exports.isInternetExplorer = isInternetExplorer;
|
@@ -3,79 +3,62 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
+
exports.capture = capture;
|
6
7
|
exports.withCreevey = withCreevey;
|
7
8
|
|
8
9
|
var Events = _interopRequireWildcard(require("@storybook/core-events"));
|
9
10
|
|
10
11
|
var polyfill = _interopRequireWildcard(require("event-source-polyfill"));
|
11
12
|
|
13
|
+
var _testingLibrary = require("@storybook/testing-library");
|
14
|
+
|
12
15
|
var _addons = require("@storybook/addons");
|
13
16
|
|
14
17
|
var _types = require("../../types");
|
15
18
|
|
16
|
-
|
19
|
+
var _shared = require("../../shared");
|
17
20
|
|
18
|
-
|
21
|
+
var _helpers = require("../shared/helpers");
|
19
22
|
|
20
|
-
|
23
|
+
var _utils = require("./utils");
|
21
24
|
|
22
|
-
function
|
25
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
23
26
|
|
24
|
-
function
|
27
|
+
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
28
|
|
26
|
-
if (
|
29
|
+
if (typeof process != 'object' || typeof process.version != 'string') {
|
27
30
|
// NOTE If you don't use babel-polyfill or any other polyfills that add EventSource for IE11
|
28
31
|
// You don't get hot reload in IE11. So put polyfill for that to better UX
|
29
32
|
// Don't load in nodejs environment
|
30
33
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
31
|
-
|
32
|
-
|
34
|
+
const {
|
35
|
+
NativeEventSource,
|
36
|
+
EventSourcePolyfill
|
37
|
+
} = polyfill; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
33
38
|
|
34
39
|
window.EventSource = NativeEventSource || EventSourcePolyfill;
|
35
40
|
}
|
36
41
|
|
37
|
-
|
38
|
-
|
39
|
-
function resetCurrentStory(_x) {
|
40
|
-
return _resetCurrentStory.apply(this, arguments);
|
41
|
-
}
|
42
|
+
const disableAnimationsStyles = "\n*,\n*:hover,\n*::before,\n*::after {\n animation-delay: -0.0001ms !important;\n animation-duration: 0s !important;\n animation-play-state: paused !important;\n cursor: none !important;\n caret-color: transparent !important;\n transition: 0s !important;\n}\n";
|
42
43
|
|
43
|
-
function
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
return channel.emit(Events.SET_CURRENT_STORY, {
|
51
|
-
storyId: true,
|
52
|
-
name: '',
|
53
|
-
kind: ''
|
54
|
-
});
|
55
|
-
}, 0);
|
56
|
-
return _context3.abrupt("return", new Promise(function (resolve) {
|
57
|
-
return channel.once(Events.STORY_MISSING, resolve);
|
58
|
-
}));
|
59
|
-
|
60
|
-
case 2:
|
61
|
-
case "end":
|
62
|
-
return _context3.stop();
|
63
|
-
}
|
64
|
-
}
|
65
|
-
}, _callee3);
|
66
|
-
}));
|
67
|
-
return _resetCurrentStory.apply(this, arguments);
|
44
|
+
async function resetCurrentStory(channel) {
|
45
|
+
setTimeout(() => channel.emit(Events.SET_CURRENT_STORY, {
|
46
|
+
storyId: true,
|
47
|
+
name: '',
|
48
|
+
kind: ''
|
49
|
+
}), 0);
|
50
|
+
return new Promise(resolve => channel.once(Events.STORY_MISSING, resolve));
|
68
51
|
}
|
69
52
|
|
70
53
|
function catchRenderError(channel) {
|
71
|
-
|
72
|
-
|
73
|
-
return rejectCallback = reject;
|
74
|
-
});
|
54
|
+
let rejectCallback;
|
55
|
+
const promise = new Promise((_resolve, reject) => rejectCallback = reject);
|
75
56
|
|
76
57
|
function errorHandler(_ref) {
|
77
|
-
|
78
|
-
|
58
|
+
let {
|
59
|
+
title,
|
60
|
+
description
|
61
|
+
} = _ref;
|
79
62
|
rejectCallback({
|
80
63
|
message: title,
|
81
64
|
stack: description
|
@@ -99,10 +82,8 @@ function catchRenderError(channel) {
|
|
99
82
|
}
|
100
83
|
|
101
84
|
function waitForStoryRendered(channel) {
|
102
|
-
|
103
|
-
|
104
|
-
return resolveCallback = resolve;
|
105
|
-
});
|
85
|
+
let resolveCallback;
|
86
|
+
const promise = new Promise(resolve => resolveCallback = resolve);
|
106
87
|
|
107
88
|
function renderHandler() {
|
108
89
|
resolveCallback();
|
@@ -120,13 +101,11 @@ function waitForStoryRendered(channel) {
|
|
120
101
|
|
121
102
|
function waitForFontsLoaded() {
|
122
103
|
if (!document.fonts) return;
|
123
|
-
|
124
|
-
return font.status == 'loading';
|
125
|
-
});
|
104
|
+
const areFontsLoading = Array.from(document.fonts).some(font => font.status == 'loading');
|
126
105
|
|
127
106
|
if (areFontsLoading) {
|
128
|
-
return new Promise(
|
129
|
-
|
107
|
+
return new Promise(resolve => {
|
108
|
+
const fontsLoadedHandler = () => {
|
130
109
|
document.fonts.removeEventListener('loadingdone', fontsLoadedHandler);
|
131
110
|
resolve();
|
132
111
|
};
|
@@ -136,128 +115,134 @@ function waitForFontsLoaded() {
|
|
136
115
|
}
|
137
116
|
}
|
138
117
|
|
118
|
+
function waitForCaptureCall() {
|
119
|
+
return new Promise(resolve => captureResolver = resolve);
|
120
|
+
}
|
121
|
+
|
122
|
+
function initCreeveyState() {
|
123
|
+
var _window$localStorage$;
|
124
|
+
|
125
|
+
const prevState = JSON.parse((_window$localStorage$ = window.localStorage.getItem('Creevey_Tests')) !== null && _window$localStorage$ !== void 0 ? _window$localStorage$ : '{}');
|
126
|
+
if (prevState.creeveyHost) window.__CREEVEY_SERVER_HOST__ = prevState.creeveyHost;
|
127
|
+
if (prevState.creeveyPort) window.__CREEVEY_SERVER_PORT__ = prevState.creeveyPort;
|
128
|
+
if (prevState.setStoriesCounter) setStoriesCounter = prevState.setStoriesCounter;
|
129
|
+
if (prevState.isTestBrowser) isTestBrowser = prevState.isTestBrowser;
|
130
|
+
window.addEventListener('beforeunload', () => {
|
131
|
+
window.localStorage.setItem('Creevey_Tests', JSON.stringify({
|
132
|
+
creeveyHost: window.__CREEVEY_SERVER_HOST__,
|
133
|
+
creeveyPort: window.__CREEVEY_SERVER_PORT__,
|
134
|
+
setStoriesCounter,
|
135
|
+
isTestBrowser
|
136
|
+
}));
|
137
|
+
});
|
138
|
+
}
|
139
|
+
|
140
|
+
let isTestBrowser = false;
|
141
|
+
let captureResolver;
|
142
|
+
let waitForCreevey;
|
143
|
+
let creeveyReady;
|
144
|
+
let setStoriesCounter = 0;
|
145
|
+
|
139
146
|
function withCreevey() {
|
140
|
-
|
141
|
-
|
147
|
+
let currentStory = '';
|
148
|
+
let isAnimationDisabled = false;
|
149
|
+
initCreeveyState();
|
142
150
|
|
143
151
|
function disableAnimation() {
|
144
152
|
isAnimationDisabled = true;
|
145
|
-
|
146
|
-
|
153
|
+
const style = document.createElement('style');
|
154
|
+
const textNode = document.createTextNode(disableAnimationsStyles);
|
147
155
|
style.setAttribute('type', 'text/css');
|
148
156
|
style.appendChild(textNode);
|
149
157
|
document.head.appendChild(style);
|
150
158
|
}
|
151
159
|
|
152
|
-
function
|
153
|
-
|
160
|
+
async function getStories() {
|
161
|
+
var _window$__STORYBOOK_S;
|
162
|
+
|
163
|
+
const storiesPromise = new Promise(resolve => _addons.addons.getChannel().once(Events.SET_STORIES, data => resolve((0, _shared.serializeRawStories)((0, _shared.denormalizeStoryParameters)(data)))));
|
164
|
+
const store = (_window$__STORYBOOK_S = window.__STORYBOOK_STORY_STORE__) !== null && _window$__STORYBOOK_S !== void 0 ? _window$__STORYBOOK_S : {};
|
165
|
+
|
166
|
+
if (store.cacheAllCSFFiles) {
|
167
|
+
await store.cacheAllCSFFiles();
|
168
|
+
|
169
|
+
_addons.addons.getChannel().emit(Events.SET_STORIES, store.getSetStoriesPayload());
|
170
|
+
} else return;
|
171
|
+
|
172
|
+
_addons.addons.getChannel().on(Events.SET_STORIES, data => {
|
173
|
+
// TODO Figure out how to get only updated stories
|
174
|
+
// TODO Subscribe on hmr? like use dummy-hmr
|
175
|
+
setStoriesCounter += 1;
|
176
|
+
const stories = (0, _shared.serializeRawStories)((0, _shared.denormalizeStoryParameters)(data));
|
177
|
+
const storiesByFiles = new Map();
|
178
|
+
Object.values(stories).forEach(story => {
|
179
|
+
const storiesFromFile = storiesByFiles.get(story.parameters.fileName);
|
180
|
+
if (storiesFromFile) storiesFromFile.push(story);else storiesByFiles.set(story.parameters.fileName, [story]);
|
181
|
+
});
|
182
|
+
void fetch("http://".concat((0, _helpers.getConnectionUrl)(), "/stories"), {
|
183
|
+
method: 'POST',
|
184
|
+
headers: {
|
185
|
+
'Content-Type': 'application/json'
|
186
|
+
},
|
187
|
+
body: JSON.stringify({
|
188
|
+
setStoriesCounter,
|
189
|
+
stories: [...storiesByFiles.entries()]
|
190
|
+
})
|
191
|
+
});
|
192
|
+
});
|
193
|
+
|
194
|
+
return storiesPromise;
|
154
195
|
}
|
155
196
|
|
156
|
-
function
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
kind: kind
|
193
|
-
});
|
194
|
-
}, 0);
|
195
|
-
_context2.prev = 12;
|
196
|
-
_context2.next = 15;
|
197
|
-
return Promise.race([_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
198
|
-
return regeneratorRuntime.wrap(function _callee$(_context) {
|
199
|
-
while (1) {
|
200
|
-
switch (_context.prev = _context.next) {
|
201
|
-
case 0:
|
202
|
-
_context.next = 2;
|
203
|
-
return renderPromise;
|
204
|
-
|
205
|
-
case 2:
|
206
|
-
_context.next = 4;
|
207
|
-
return waitForFontsLoaded();
|
208
|
-
|
209
|
-
case 4:
|
210
|
-
_context.next = 6;
|
211
|
-
return waitForReady;
|
212
|
-
|
213
|
-
case 6:
|
214
|
-
case "end":
|
215
|
-
return _context.stop();
|
216
|
-
}
|
217
|
-
}
|
218
|
-
}, _callee);
|
219
|
-
}))(), errorPromise]);
|
220
|
-
|
221
|
-
case 15:
|
222
|
-
callback();
|
223
|
-
_context2.next = 22;
|
224
|
-
break;
|
225
|
-
|
226
|
-
case 18:
|
227
|
-
_context2.prev = 18;
|
228
|
-
_context2.t0 = _context2["catch"](12);
|
229
|
-
// NOTE Event `STORY_THREW_EXCEPTION` triggered only in react and vue frameworks and return Error instance
|
230
|
-
// NOTE Event `STORY_ERRORED` return error-like object without `name` field
|
231
|
-
errorMessage = _context2.t0 instanceof Error ? (_reason$stack = _context2.t0.stack) !== null && _reason$stack !== void 0 ? _reason$stack : _context2.t0.message : (0, _types.isObject)(_context2.t0) ? "".concat(_context2.t0.message, "\n ").concat(_context2.t0.stack) : _context2.t0;
|
232
|
-
callback(errorMessage);
|
233
|
-
|
234
|
-
case 22:
|
235
|
-
_context2.prev = 22;
|
236
|
-
renderPromise.cancel();
|
237
|
-
errorPromise.cancel();
|
238
|
-
return _context2.finish(22);
|
239
|
-
|
240
|
-
case 26:
|
241
|
-
case "end":
|
242
|
-
return _context2.stop();
|
243
|
-
}
|
244
|
-
}
|
245
|
-
}, _callee2, null, [[12, 18, 22, 26]]);
|
246
|
-
}));
|
247
|
-
return _selectStory.apply(this, arguments);
|
197
|
+
async function selectStory(storyId, kind, name, shouldWaitForReady, callback) {
|
198
|
+
if (!isAnimationDisabled) disableAnimation();
|
199
|
+
isTestBrowser = true;
|
200
|
+
|
201
|
+
const channel = _addons.addons.getChannel();
|
202
|
+
|
203
|
+
const waitForReady = shouldWaitForReady ? new Promise(resolve => window.__CREEVEY_SET_READY_FOR_CAPTURE__ = resolve) : Promise.resolve();
|
204
|
+
if (storyId == currentStory) await resetCurrentStory(channel);else currentStory = storyId;
|
205
|
+
let isCaptureCalled = false;
|
206
|
+
const renderPromise = waitForStoryRendered(channel);
|
207
|
+
const errorPromise = catchRenderError(channel);
|
208
|
+
const capturePromise = waitForCaptureCall().then(() => isCaptureCalled = true);
|
209
|
+
setTimeout(() => channel.emit(Events.SET_CURRENT_STORY, {
|
210
|
+
storyId,
|
211
|
+
name,
|
212
|
+
kind
|
213
|
+
}), 0);
|
214
|
+
|
215
|
+
try {
|
216
|
+
await Promise.race([(async () => {
|
217
|
+
await Promise.race([renderPromise, capturePromise]);
|
218
|
+
await waitForFontsLoaded();
|
219
|
+
await waitForReady;
|
220
|
+
})(), errorPromise]);
|
221
|
+
callback([null, isCaptureCalled]);
|
222
|
+
} catch (reason) {
|
223
|
+
var _reason$stack;
|
224
|
+
|
225
|
+
// NOTE Event `STORY_THREW_EXCEPTION` triggered only in react and vue frameworks and return Error instance
|
226
|
+
// NOTE Event `STORY_ERRORED` return error-like object without `name` field
|
227
|
+
const errorMessage = reason instanceof Error ? (_reason$stack = reason.stack) !== null && _reason$stack !== void 0 ? _reason$stack : reason.message : (0, _types.isObject)(reason) ? "".concat(reason.message, "\n ").concat(reason.stack) : reason;
|
228
|
+
callback([errorMessage]);
|
229
|
+
} finally {
|
230
|
+
renderPromise.cancel();
|
231
|
+
errorPromise.cancel();
|
232
|
+
}
|
248
233
|
}
|
249
234
|
|
250
235
|
function updateGlobals(globals) {
|
251
236
|
_addons.addons.getChannel().emit(Events.UPDATE_GLOBALS, {
|
252
|
-
globals
|
237
|
+
globals
|
253
238
|
});
|
254
239
|
}
|
255
240
|
|
256
241
|
function insertIgnoreStyles(ignoreSelectors) {
|
257
|
-
|
242
|
+
const stylesElement = document.createElement('style');
|
258
243
|
stylesElement.setAttribute('type', 'text/css');
|
259
244
|
document.head.appendChild(stylesElement);
|
260
|
-
ignoreSelectors.forEach(
|
245
|
+
ignoreSelectors.forEach(selector => {
|
261
246
|
stylesElement.innerHTML += "\n ".concat(selector, " {\n background: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n outline: 0 !important;\n color: rgba(0,0,0,0) !important;\n }\n ").concat(selector, " *, ").concat(selector, "::before, ").concat(selector, "::after {\n visibility: hidden !important;\n }\n ");
|
262
247
|
});
|
263
248
|
return stylesElement;
|
@@ -269,16 +254,97 @@ function withCreevey() {
|
|
269
254
|
(_ignoreStyles$parentN = ignoreStyles.parentNode) === null || _ignoreStyles$parentN === void 0 ? void 0 : _ignoreStyles$parentN.removeChild(ignoreStyles);
|
270
255
|
}
|
271
256
|
|
257
|
+
function hasPlayCompletedYet(callback) {
|
258
|
+
creeveyReady();
|
259
|
+
let isCaptureCalled = false;
|
260
|
+
let isPlayCompleted = false;
|
261
|
+
|
262
|
+
const channel = _addons.addons.getChannel();
|
263
|
+
|
264
|
+
void waitForStoryRendered(channel).then(() => {
|
265
|
+
if (isCaptureCalled) return;
|
266
|
+
isPlayCompleted = true;
|
267
|
+
callback(true);
|
268
|
+
});
|
269
|
+
void waitForCaptureCall().then(() => {
|
270
|
+
if (isPlayCompleted) return;
|
271
|
+
isCaptureCalled = true;
|
272
|
+
callback(false);
|
273
|
+
});
|
274
|
+
}
|
275
|
+
|
276
|
+
window.__CREEVEY_GET_STORIES__ = getStories;
|
272
277
|
window.__CREEVEY_SELECT_STORY__ = selectStory;
|
273
278
|
window.__CREEVEY_UPDATE_GLOBALS__ = updateGlobals;
|
274
279
|
window.__CREEVEY_INSERT_IGNORE_STYLES__ = insertIgnoreStyles;
|
275
280
|
window.__CREEVEY_REMOVE_IGNORE_STYLES__ = removeIgnoreStyles;
|
281
|
+
window.__CREEVEY_HAS_PLAY_COMPLETED_YET__ = hasPlayCompletedYet;
|
276
282
|
window.__CREEVEY_SET_READY_FOR_CAPTURE__ = _types.noop;
|
283
|
+
|
284
|
+
const queryAllByQuery = (container, query) => [...container.querySelectorAll(query)].filter(e => e instanceof HTMLElement);
|
285
|
+
|
286
|
+
const getMultipleError = (_, query) => "Found multiple elements by query: ".concat(query);
|
287
|
+
|
288
|
+
const getMissingError = (_, query) => "Unable to find an element by query: ".concat(query);
|
289
|
+
|
290
|
+
const [queryByQuery, getAllByQuery, getByQuery, findAllByQuery, findByQuery] = (0, _testingLibrary.buildQueries)(queryAllByQuery, getMultipleError, getMissingError);
|
291
|
+
const queries = {
|
292
|
+
queryByQuery,
|
293
|
+
getAllByQuery,
|
294
|
+
getByQuery,
|
295
|
+
findAllByQuery,
|
296
|
+
findByQuery
|
297
|
+
};
|
277
298
|
return (0, _addons.makeDecorator)({
|
278
299
|
name: 'withCreevey',
|
279
300
|
parameterName: 'creevey',
|
280
|
-
wrapper:
|
301
|
+
wrapper: (getStory, context) => {
|
302
|
+
var _ref2;
|
303
|
+
|
304
|
+
// TODO Define proper types, like captureElement is a promise
|
305
|
+
const {
|
306
|
+
captureElement
|
307
|
+
} = context.parameters.creevey = (_ref2 = context.parameters.creevey) !== null && _ref2 !== void 0 ? _ref2 : {};
|
308
|
+
Object.defineProperty(context.parameters.creevey, 'captureElement', {
|
309
|
+
get() {
|
310
|
+
switch (true) {
|
311
|
+
case captureElement === undefined:
|
312
|
+
return Promise.resolve(context.canvasElement);
|
313
|
+
|
314
|
+
case captureElement === null:
|
315
|
+
return Promise.resolve(document.documentElement);
|
316
|
+
|
317
|
+
case typeof captureElement == 'string':
|
318
|
+
return _utils.isInternetExplorer // some code from testing-library makes IE hang
|
319
|
+
? Promise.resolve(context.canvasElement.querySelector(captureElement)) : (0, _testingLibrary.within)(context.canvasElement, queries).findByQuery(captureElement);
|
320
|
+
|
321
|
+
case typeof captureElement == 'function':
|
322
|
+
// TODO Define type for it
|
323
|
+
return Promise.resolve(captureElement(context));
|
324
|
+
}
|
325
|
+
},
|
326
|
+
|
327
|
+
enumerable: true,
|
328
|
+
configurable: true
|
329
|
+
});
|
281
330
|
return getStory(context);
|
282
331
|
}
|
283
332
|
});
|
333
|
+
}
|
334
|
+
|
335
|
+
async function capture(options) {
|
336
|
+
if (!isTestBrowser) return;
|
337
|
+
captureResolver();
|
338
|
+
waitForCreevey = new Promise(resolve => creeveyReady = resolve);
|
339
|
+
await fetch("http://".concat((0, _helpers.getConnectionUrl)(), "/capture"), {
|
340
|
+
method: 'POST',
|
341
|
+
headers: {
|
342
|
+
'Content-Type': 'application/json'
|
343
|
+
},
|
344
|
+
body: JSON.stringify({
|
345
|
+
workerId: window.__CREEVEY_WORKER_ID__,
|
346
|
+
options
|
347
|
+
})
|
348
|
+
});
|
349
|
+
await waitForCreevey;
|
284
350
|
}
|