creevey 0.10.0-beta.9 → 0.10.0-rc.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/AUTHORS +2 -0
- package/CHANGELOG.md +281 -0
- package/README.md +19 -41
- package/dist/client/addon/components/Addon.js +18 -8
- package/dist/client/addon/components/Addon.js.map +1 -1
- package/dist/client/addon/components/Panel.js +2 -2
- package/dist/client/addon/components/Panel.js.map +1 -1
- package/dist/client/addon/components/TestSelect.js +2 -2
- package/dist/client/addon/components/TestSelect.js.map +1 -1
- package/dist/client/addon/components/Tools.js +19 -9
- package/dist/client/addon/components/Tools.js.map +1 -1
- package/dist/client/addon/controller.d.ts +1 -1
- package/dist/client/addon/controller.js +3 -3
- package/dist/client/addon/controller.js.map +1 -1
- package/dist/client/addon/decorator.d.ts +1 -1
- package/dist/client/addon/makeDecorator.d.ts +9 -0
- package/dist/client/addon/makeDecorator.js +48 -0
- package/dist/client/addon/makeDecorator.js.map +1 -0
- package/dist/client/addon/manager.js +38 -39
- package/dist/client/addon/manager.js.map +1 -1
- package/dist/client/addon/preset.d.ts +0 -1
- package/dist/client/addon/preset.js +3 -2
- package/dist/client/addon/preset.js.map +1 -1
- package/dist/client/addon/preview.d.ts +1 -1
- package/dist/client/addon/withCreevey.d.ts +5 -3
- package/dist/client/addon/withCreevey.js +5 -20
- package/dist/client/addon/withCreevey.js.map +1 -1
- package/dist/client/shared/components/ImagesView/BlendView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/BlendView.js +18 -8
- package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/ImagesView.js +1 -1
- package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/SideBySideView.js +19 -9
- package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SlideView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/SlideView.js +19 -9
- package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SwapView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/SwapView.js +19 -9
- package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/common.d.ts +1 -1
- package/dist/client/shared/components/PageFooter/PageFooter.js +1 -1
- package/dist/client/shared/components/PageFooter/PageFooter.js.map +1 -1
- package/dist/client/shared/components/PageFooter/Paging.js +1 -1
- package/dist/client/shared/components/PageFooter/Paging.js.map +1 -1
- package/dist/client/shared/components/PageHeader/ImagePreview.d.ts +2 -2
- package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -1
- package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
- package/dist/client/shared/components/PageHeader/PageHeader.js +34 -13
- package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/client/shared/components/ResultsPage.d.ts +2 -2
- package/dist/client/shared/components/ResultsPage.js +22 -10
- package/dist/client/shared/components/ResultsPage.js.map +1 -1
- package/dist/client/shared/creeveyClientApi.js +18 -1
- package/dist/client/shared/creeveyClientApi.js.map +1 -1
- package/dist/client/shared/helpers.d.ts +1 -3
- package/dist/client/shared/helpers.js +4 -19
- package/dist/client/shared/helpers.js.map +1 -1
- package/dist/client/web/CreeveyApp.d.ts +1 -0
- package/dist/client/web/CreeveyApp.js +22 -9
- package/dist/client/web/CreeveyApp.js.map +1 -1
- package/dist/client/web/CreeveyContext.d.ts +1 -0
- package/dist/client/web/CreeveyContext.js +18 -7
- package/dist/client/web/CreeveyContext.js.map +1 -1
- package/dist/client/web/CreeveyLoader.d.ts +1 -1
- package/dist/client/web/CreeveyLoader.js +3 -3
- package/dist/client/web/CreeveyLoader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Checkbox.d.ts +4 -4
- package/dist/client/web/CreeveyView/SideBar/Checkbox.js +36 -6
- package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Search.js +18 -8
- package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBar.js +26 -12
- package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +28 -17
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +32 -12
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +6 -6
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +20 -11
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestLink.js +20 -11
- package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +2 -2
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +2 -2
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.d.ts +2 -2
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +3 -2
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Toggle.js +1 -1
- package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -1
- package/dist/client/web/KeyboardEventsContext.js +17 -7
- package/dist/client/web/KeyboardEventsContext.js.map +1 -1
- package/dist/client/web/assets/index-CtSq3IhG.js +518 -0
- package/dist/client/web/index.html +1 -1
- package/dist/client/web/index.js +26 -11
- package/dist/client/web/index.js.map +1 -1
- package/dist/client/web/themes.d.ts +2 -0
- package/dist/client/web/themes.js +22 -0
- package/dist/client/web/themes.js.map +1 -0
- package/dist/creevey.d.ts +1 -1
- package/dist/creevey.js +122 -41
- package/dist/creevey.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/playwright/generator.d.ts +34 -0
- package/dist/playwright/generator.js +267 -0
- package/dist/playwright/generator.js.map +1 -0
- package/dist/playwright/helpers.d.ts +2 -0
- package/dist/playwright/helpers.js +29 -0
- package/dist/playwright/helpers.js.map +1 -0
- package/dist/playwright/reporter.d.ts +83 -0
- package/dist/playwright/reporter.js +334 -0
- package/dist/playwright/reporter.js.map +1 -0
- package/dist/playwright/setup.d.ts +3 -0
- package/dist/playwright/setup.js +72 -0
- package/dist/playwright/setup.js.map +1 -0
- package/dist/playwright.d.ts +1 -0
- package/dist/playwright.js +3 -1
- package/dist/playwright.js.map +1 -1
- package/dist/server/compare.d.ts +18 -0
- package/dist/server/compare.js +182 -0
- package/dist/server/compare.js.map +1 -0
- package/dist/server/config.d.ts +3 -3
- package/dist/server/config.js +75 -8
- package/dist/server/config.js.map +1 -1
- package/dist/server/connection.d.ts +3 -0
- package/dist/server/connection.js +28 -0
- package/dist/server/connection.js.map +1 -0
- package/dist/server/docker.d.ts +1 -1
- package/dist/server/docker.js +54 -32
- package/dist/server/docker.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +166 -64
- package/dist/server/index.js.map +1 -1
- package/dist/server/master/api.d.ts +11 -6
- package/dist/server/master/api.js +88 -25
- package/dist/server/master/api.js.map +1 -1
- package/dist/server/master/handlers/capture-handler.d.ts +5 -0
- package/dist/server/master/handlers/capture-handler.js +25 -0
- package/dist/server/master/handlers/capture-handler.js.map +1 -0
- package/dist/server/master/handlers/index.d.ts +4 -0
- package/dist/server/master/handlers/index.js +21 -0
- package/dist/server/master/handlers/index.js.map +1 -0
- package/dist/server/master/handlers/ping-handler.d.ts +2 -0
- package/dist/server/master/handlers/ping-handler.js +8 -0
- package/dist/server/master/handlers/ping-handler.js.map +1 -0
- package/dist/server/master/handlers/static-handler.d.ts +1 -0
- package/dist/server/master/handlers/static-handler.js +20 -0
- package/dist/server/master/handlers/static-handler.js.map +1 -0
- package/dist/server/master/handlers/stories-handler.d.ts +4 -0
- package/dist/server/master/handlers/stories-handler.js +24 -0
- package/dist/server/master/handlers/stories-handler.js.map +1 -0
- package/dist/server/master/master.js +7 -24
- package/dist/server/master/master.js.map +1 -1
- package/dist/server/master/pool.d.ts +1 -0
- package/dist/server/master/pool.js +5 -3
- package/dist/server/master/pool.js.map +1 -1
- package/dist/server/master/queue.d.ts +1 -1
- package/dist/server/master/queue.js +14 -6
- package/dist/server/master/queue.js.map +1 -1
- package/dist/server/master/runner.d.ts +6 -6
- package/dist/server/master/runner.js +98 -130
- package/dist/server/master/runner.js.map +1 -1
- package/dist/server/master/server.d.ts +1 -1
- package/dist/server/master/server.js +193 -88
- package/dist/server/master/server.js.map +1 -1
- package/dist/server/master/start.d.ts +1 -2
- package/dist/server/master/start.js +13 -29
- package/dist/server/master/start.js.map +1 -1
- package/dist/server/master/testsManager.d.ts +81 -0
- package/dist/server/master/testsManager.js +282 -0
- package/dist/server/master/testsManager.js.map +1 -0
- package/dist/server/playwright/docker-file.d.ts +1 -1
- package/dist/server/playwright/docker-file.js +17 -8
- package/dist/server/playwright/docker-file.js.map +1 -1
- package/dist/server/playwright/docker.d.ts +2 -1
- package/dist/server/playwright/docker.js +10 -2
- package/dist/server/playwright/docker.js.map +1 -1
- package/dist/server/playwright/index-source.mjs +16 -0
- package/dist/server/playwright/internal.d.ts +7 -7
- package/dist/server/playwright/internal.js +137 -79
- package/dist/server/playwright/internal.js.map +1 -1
- package/dist/server/playwright/webdriver.d.ts +3 -3
- package/dist/server/playwright/webdriver.js +0 -6
- package/dist/server/playwright/webdriver.js.map +1 -1
- package/dist/server/providers/browser.js +4 -3
- package/dist/server/providers/browser.js.map +1 -1
- package/dist/server/providers/hybrid.js +2 -2
- package/dist/server/providers/hybrid.js.map +1 -1
- package/dist/server/report.d.ts +10 -0
- package/dist/server/report.js +45 -0
- package/dist/server/report.js.map +1 -0
- package/dist/server/reporters/creevey.d.ts +7 -0
- package/dist/server/reporters/creevey.js +63 -0
- package/dist/server/reporters/creevey.js.map +1 -0
- package/dist/server/reporters/index.d.ts +2 -0
- package/dist/server/reporters/index.js +16 -0
- package/dist/server/reporters/index.js.map +1 -0
- package/dist/server/reporters/junit.d.ts +16 -0
- package/dist/server/reporters/junit.js +167 -0
- package/dist/server/reporters/junit.js.map +1 -0
- package/dist/server/reporters/teamcity.d.ts +7 -0
- package/dist/server/reporters/teamcity.js +60 -0
- package/dist/server/reporters/teamcity.js.map +1 -0
- package/dist/server/selenium/internal.d.ts +3 -3
- package/dist/server/selenium/internal.js +48 -34
- package/dist/server/selenium/internal.js.map +1 -1
- package/dist/server/selenium/selenoid.js +12 -6
- package/dist/server/selenium/selenoid.js.map +1 -1
- package/dist/server/selenium/webdriver.d.ts +3 -3
- package/dist/server/selenium/webdriver.js +4 -8
- package/dist/server/selenium/webdriver.js.map +1 -1
- package/dist/server/shutdown.d.ts +1 -0
- package/dist/server/shutdown.js +23 -0
- package/dist/server/shutdown.js.map +1 -0
- package/dist/server/stories.d.ts +0 -1
- package/dist/server/stories.js +0 -12
- package/dist/server/stories.js.map +1 -1
- package/dist/server/telemetry.js +3 -3
- package/dist/server/telemetry.js.map +1 -1
- package/dist/server/testsFiles/parser.js +45 -5
- package/dist/server/testsFiles/parser.js.map +1 -1
- package/dist/server/utils.d.ts +23 -0
- package/dist/server/utils.js +113 -13
- package/dist/server/utils.js.map +1 -1
- package/dist/server/webdriver.d.ts +1 -1
- package/dist/server/worker/context.d.ts +3 -0
- package/dist/server/worker/context.js +15 -0
- package/dist/server/worker/context.js.map +1 -0
- package/dist/server/worker/match-image.d.ts +8 -12
- package/dist/server/worker/match-image.js +11 -178
- package/dist/server/worker/match-image.js.map +1 -1
- package/dist/server/worker/start.d.ts +2 -2
- package/dist/server/worker/start.js +27 -63
- package/dist/server/worker/start.js.map +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.js +9 -7
- package/dist/shared/index.js.map +1 -1
- package/dist/types.d.ts +84 -43
- package/dist/types.js +65 -1
- package/dist/types.js.map +1 -1
- package/docs/cli.md +80 -0
- package/docs/config.md +179 -165
- package/docs/examples/playwright-reporer/playwright.config.ts +36 -0
- package/docs/migration-0.9-to-0.10.md +182 -0
- package/docs/playwright-reporter.md +170 -0
- package/docs/storybook.md +60 -0
- package/docs/tests.md +50 -45
- package/package.json +78 -83
- package/playwright.config.mts +46 -0
- package/src/client/addon/components/Addon.tsx +1 -1
- package/src/client/addon/components/Panel.tsx +2 -2
- package/src/client/addon/components/TestSelect.tsx +2 -2
- package/src/client/addon/components/Tools.tsx +2 -2
- package/src/client/addon/controller.ts +4 -4
- package/src/client/addon/makeDecorator.ts +69 -0
- package/src/client/addon/manager.ts +38 -37
- package/src/client/addon/preset.ts +2 -1
- package/src/client/addon/withCreevey.ts +10 -18
- package/src/client/shared/components/ImagesView/BlendView.tsx +1 -1
- package/src/client/shared/components/ImagesView/ImagesView.tsx +1 -1
- package/src/client/shared/components/ImagesView/SideBySideView.tsx +2 -2
- package/src/client/shared/components/ImagesView/SlideView.tsx +2 -2
- package/src/client/shared/components/ImagesView/SwapView.tsx +2 -2
- package/src/client/shared/components/ImagesView/common.ts +1 -1
- package/src/client/shared/components/PageFooter/PageFooter.tsx +1 -1
- package/src/client/shared/components/PageFooter/Paging.tsx +1 -1
- package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -1
- package/src/client/shared/components/PageHeader/PageHeader.tsx +23 -7
- package/src/client/shared/components/ResultsPage.tsx +6 -4
- package/src/client/shared/creeveyClientApi.ts +19 -1
- package/src/client/shared/helpers.ts +4 -24
- package/src/client/web/CreeveyApp.tsx +5 -2
- package/src/client/web/CreeveyContext.tsx +2 -0
- package/src/client/web/CreeveyLoader.tsx +2 -2
- package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +3 -3
- package/src/client/web/CreeveyView/SideBar/Search.tsx +1 -1
- package/src/client/web/CreeveyView/SideBar/SideBar.tsx +11 -6
- package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +21 -19
- package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +20 -5
- package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +10 -8
- package/src/client/web/CreeveyView/SideBar/TestLink.tsx +9 -7
- package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +2 -2
- package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +3 -2
- package/src/client/web/CreeveyView/SideBar/Toggle.tsx +1 -1
- package/src/client/web/index.tsx +10 -5
- package/src/client/web/themes.ts +24 -0
- package/src/creevey.ts +92 -38
- package/src/playwright/generator.ts +360 -0
- package/src/playwright/helpers.ts +31 -0
- package/src/playwright/reporter.ts +381 -0
- package/src/playwright/setup.ts +84 -0
- package/src/playwright.ts +1 -0
- package/src/server/compare.ts +260 -0
- package/src/server/config.ts +52 -9
- package/src/server/connection.ts +26 -0
- package/src/server/docker.ts +62 -34
- package/src/server/index.ts +165 -79
- package/src/server/master/api.ts +94 -28
- package/src/server/master/handlers/capture-handler.ts +20 -0
- package/src/server/master/handlers/index.ts +4 -0
- package/src/server/master/handlers/ping-handler.ts +6 -0
- package/src/server/master/handlers/static-handler.ts +16 -0
- package/src/server/master/handlers/stories-handler.ts +20 -0
- package/src/server/master/master.ts +10 -27
- package/src/server/master/pool.ts +7 -3
- package/src/server/master/queue.ts +21 -7
- package/src/server/master/runner.ts +123 -134
- package/src/server/master/server.ts +214 -101
- package/src/server/master/start.ts +19 -41
- package/src/server/master/testsManager.ts +316 -0
- package/src/server/playwright/docker-file.ts +20 -8
- package/src/server/playwright/docker.ts +16 -3
- package/src/server/playwright/index-source.mjs +16 -0
- package/src/server/playwright/internal.ts +169 -96
- package/src/server/playwright/webdriver.ts +4 -10
- package/src/server/providers/browser.ts +4 -3
- package/src/server/providers/hybrid.ts +2 -3
- package/src/server/report.ts +51 -0
- package/src/server/reporters/creevey.ts +74 -0
- package/src/server/reporters/index.ts +11 -0
- package/src/server/reporters/junit.ts +207 -0
- package/src/server/reporters/teamcity.ts +74 -0
- package/src/server/selenium/internal.ts +62 -45
- package/src/server/selenium/selenoid.ts +13 -6
- package/src/server/selenium/webdriver.ts +8 -12
- package/src/server/shutdown.ts +19 -0
- package/src/server/stories.ts +1 -12
- package/src/server/telemetry.ts +3 -3
- package/src/server/testsFiles/parser.ts +52 -4
- package/src/server/utils.ts +123 -14
- package/src/server/webdriver.ts +1 -1
- package/src/server/worker/context.ts +14 -0
- package/src/server/worker/match-image.ts +16 -248
- package/src/server/worker/start.ts +32 -75
- package/src/shared/index.ts +10 -8
- package/src/types.ts +91 -58
- package/types/global.d.ts +1 -0
- package/dist/client/web/assets/index-BE9CL5_G.js +0 -591
- package/dist/server/reporter.d.ts +0 -26
- package/dist/server/reporter.js +0 -108
- package/dist/server/reporter.js.map +0 -1
- package/dist/server/update.d.ts +0 -2
- package/dist/server/update.js +0 -53
- package/dist/server/update.js.map +0 -1
- package/src/server/reporter.ts +0 -139
- package/src/server/update.ts +0 -74
@@ -0,0 +1,45 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.report = report;
|
7
|
+
const open_1 = __importDefault(require("open"));
|
8
|
+
const logger_js_1 = require("./logger.js");
|
9
|
+
const testsManager_js_1 = require("./master/testsManager.js");
|
10
|
+
const server_js_1 = require("./master/server.js");
|
11
|
+
const api_js_1 = require("./master/api.js");
|
12
|
+
const utils_js_1 = require("./utils.js");
|
13
|
+
/**
|
14
|
+
* UI Update Mode implementation.
|
15
|
+
* This mode allows users to review and approve screenshots from the browser interface.
|
16
|
+
* It combines the functionality of both --ui and --update flags.
|
17
|
+
*
|
18
|
+
* @param config Creevey configuration
|
19
|
+
* @param port Port to run the server on
|
20
|
+
*/
|
21
|
+
function report(config, reportDir, port) {
|
22
|
+
(0, logger_js_1.logger)().info('Starting UI Update Mode');
|
23
|
+
process.on('SIGINT', () => void (0, utils_js_1.shutdownWorkers)());
|
24
|
+
const url = `http://localhost:${port}`;
|
25
|
+
// Initialize TestsManager with the configured directories
|
26
|
+
const testsManager = new testsManager_js_1.TestsManager(config.screenDir, reportDir);
|
27
|
+
// Load tests from the report
|
28
|
+
const testsFromReport = testsManager.loadTestsFromReport();
|
29
|
+
if (Object.keys(testsFromReport).length === 0) {
|
30
|
+
(0, logger_js_1.logger)().warn('No tests found in report. Run tests first to generate report data.');
|
31
|
+
return;
|
32
|
+
}
|
33
|
+
// Set tests in the manager
|
34
|
+
testsManager.updateTests(testsFromReport);
|
35
|
+
// Start API server with UI enabled
|
36
|
+
const resolveApi = (0, server_js_1.start)(reportDir, port, true);
|
37
|
+
// Initialize API
|
38
|
+
const api = new api_js_1.CreeveyApi(testsManager);
|
39
|
+
// Resolve the API for the server
|
40
|
+
resolveApi(api);
|
41
|
+
(0, logger_js_1.logger)().info(`UI Update Mode started on ${url}`);
|
42
|
+
(0, logger_js_1.logger)().info('You can now review and approve screenshots from the browser.');
|
43
|
+
void (0, open_1.default)(url);
|
44
|
+
}
|
45
|
+
//# sourceMappingURL=report.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/server/report.ts"],"names":[],"mappings":";;;;;AAgBA,wBAkCC;AAlDD,gDAAwB;AAExB,2CAAqC;AACrC,8DAAwD;AACxD,kDAA0D;AAC1D,4CAA6C;AAC7C,yCAA6C;AAE7C;;;;;;;GAOG;AACH,SAAgB,MAAM,CAAC,MAAc,EAAE,SAAiB,EAAE,IAAY;IACpE,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAEzC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,IAAA,0BAAe,GAAE,CAAC,CAAC;IAEnD,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAEvC,0DAA0D;IAC1D,MAAM,YAAY,GAAG,IAAI,8BAAY,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEnE,6BAA6B;IAC7B,MAAM,eAAe,GAAG,YAAY,CAAC,mBAAmB,EAAE,CAAC;IAE3D,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,YAAY,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAE1C,mCAAmC;IACnC,MAAM,UAAU,GAAG,IAAA,iBAAW,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAEtD,iBAAiB;IACjB,MAAM,GAAG,GAAG,IAAI,mBAAU,CAAC,YAAY,CAAC,CAAC;IAEzC,iCAAiC;IACjC,UAAU,CAAC,GAAG,CAAC,CAAC;IAEhB,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IAClD,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAE9E,KAAK,IAAA,cAAI,EAAC,GAAG,CAAC,CAAC;AACjB,CAAC"}
|
@@ -0,0 +1,63 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.CreeveyReporter = void 0;
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
8
|
+
const loglevel_1 = __importDefault(require("loglevel"));
|
9
|
+
const loglevel_plugin_prefix_1 = __importDefault(require("loglevel-plugin-prefix"));
|
10
|
+
const types_js_1 = require("../../types.js");
|
11
|
+
const testLevels = {
|
12
|
+
INFO: chalk_1.default.green('PASS'),
|
13
|
+
WARN: chalk_1.default.yellow('START'),
|
14
|
+
ERROR: chalk_1.default.red('FAIL'),
|
15
|
+
};
|
16
|
+
class CreeveyReporter {
|
17
|
+
logger = null;
|
18
|
+
// TODO Output in better way, like vitest, maybe
|
19
|
+
constructor(runner) {
|
20
|
+
runner.on(types_js_1.TEST_EVENTS.TEST_BEGIN, (test) => {
|
21
|
+
this.getLogger(test.creevey).warn(chalk_1.default.cyan(test.fullTitle()));
|
22
|
+
});
|
23
|
+
runner.on(types_js_1.TEST_EVENTS.TEST_PASS, (test) => {
|
24
|
+
this.getLogger(test.creevey).info(chalk_1.default.cyan(test.fullTitle()), test.duration ? chalk_1.default.gray(`(${test.duration} ms)`) : '');
|
25
|
+
});
|
26
|
+
runner.on(types_js_1.TEST_EVENTS.TEST_FAIL, (test, error) => {
|
27
|
+
this.getLogger(test.creevey).error(chalk_1.default.cyan(test.fullTitle()), test.duration ? chalk_1.default.gray(`(${test.duration} ms)`) : '', '\n ', this.getErrors(error, (error, imageName) => `${chalk_1.default.bold(imageName ?? test.creevey.browserName)}:${error}`, (error) => error.stack ?? error.message).join('\n '));
|
28
|
+
});
|
29
|
+
}
|
30
|
+
getLogger(options) {
|
31
|
+
if (this.logger)
|
32
|
+
return this.logger;
|
33
|
+
const { sessionId, browserName } = options;
|
34
|
+
const testLogger = loglevel_1.default.getLogger(sessionId);
|
35
|
+
this.logger = loglevel_plugin_prefix_1.default.apply(testLogger, {
|
36
|
+
format(level) {
|
37
|
+
return `[${browserName}:${chalk_1.default.gray(process.pid)}] ${testLevels[level]} => ${chalk_1.default.gray(sessionId)}`;
|
38
|
+
},
|
39
|
+
});
|
40
|
+
return this.logger;
|
41
|
+
}
|
42
|
+
getErrors(error, imageErrorToString, errorToString) {
|
43
|
+
const errors = [];
|
44
|
+
if (!(error instanceof Error)) {
|
45
|
+
errors.push(error);
|
46
|
+
}
|
47
|
+
else if (!(0, types_js_1.isImageError)(error)) {
|
48
|
+
errors.push(errorToString(error));
|
49
|
+
}
|
50
|
+
else if (typeof error.images == 'string') {
|
51
|
+
errors.push(imageErrorToString(error.images));
|
52
|
+
}
|
53
|
+
else {
|
54
|
+
const imageErrors = error.images ?? {};
|
55
|
+
Object.keys(imageErrors).forEach((imageName) => {
|
56
|
+
errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
|
57
|
+
});
|
58
|
+
}
|
59
|
+
return errors;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
exports.CreeveyReporter = CreeveyReporter;
|
63
|
+
//# sourceMappingURL=creevey.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"creevey.js","sourceRoot":"","sources":["../../../src/server/reporters/creevey.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getReporter = getReporter;
|
4
|
+
const creevey_js_1 = require("./creevey.js");
|
5
|
+
const junit_js_1 = require("./junit.js");
|
6
|
+
const teamcity_js_1 = require("./teamcity.js");
|
7
|
+
function getReporter(reporter) {
|
8
|
+
if (reporter === 'creevey')
|
9
|
+
return creevey_js_1.CreeveyReporter;
|
10
|
+
if (reporter === 'teamcity')
|
11
|
+
return teamcity_js_1.TeamcityReporter;
|
12
|
+
if (reporter === 'junit')
|
13
|
+
return junit_js_1.JUnitReporter;
|
14
|
+
return reporter;
|
15
|
+
}
|
16
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/reporters/index.ts"],"names":[],"mappings":";;AAKA,kCAKC;AATD,6CAA+C;AAC/C,yCAA2C;AAC3C,+CAAiD;AAEjD,SAAgB,WAAW,CAAC,QAAyD;IACnF,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,4BAAe,CAAC;IACnD,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,8BAAgB,CAAC;IACrD,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,wBAAa,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import EventEmitter from 'events';
|
2
|
+
export declare class JUnitReporter {
|
3
|
+
private reportFile;
|
4
|
+
private fileFd?;
|
5
|
+
private logger;
|
6
|
+
private suites;
|
7
|
+
constructor(runner: EventEmitter, options: {
|
8
|
+
reportDir: string;
|
9
|
+
reporterOptions: {
|
10
|
+
outputFile?: string;
|
11
|
+
};
|
12
|
+
});
|
13
|
+
private writeElement;
|
14
|
+
private writeTasks;
|
15
|
+
private onFinished;
|
16
|
+
}
|
@@ -0,0 +1,167 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.JUnitReporter = void 0;
|
4
|
+
const path_1 = require("path");
|
5
|
+
const fs_1 = require("fs");
|
6
|
+
const types_js_1 = require("../../types.js");
|
7
|
+
const logger_js_1 = require("../logger.js");
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
9
|
+
class IndentedLogger {
|
10
|
+
baseLog;
|
11
|
+
currentIndent = '';
|
12
|
+
constructor(baseLog) {
|
13
|
+
this.baseLog = baseLog;
|
14
|
+
}
|
15
|
+
indent() {
|
16
|
+
this.currentIndent += ' ';
|
17
|
+
}
|
18
|
+
unindent() {
|
19
|
+
this.currentIndent = this.currentIndent.substring(0, this.currentIndent.length - 4);
|
20
|
+
}
|
21
|
+
log(text) {
|
22
|
+
return this.baseLog(this.currentIndent + text);
|
23
|
+
}
|
24
|
+
}
|
25
|
+
// NOTE: This is a reworked copy of the JUnitReporter class from Vitest.
|
26
|
+
class JUnitReporter {
|
27
|
+
reportFile;
|
28
|
+
fileFd;
|
29
|
+
logger;
|
30
|
+
suites = {};
|
31
|
+
// TODO classnameTemplate
|
32
|
+
// TODO Output console logs
|
33
|
+
// TODO Output attachments
|
34
|
+
constructor(runner, options) {
|
35
|
+
const { reportDir, reporterOptions } = options;
|
36
|
+
this.reportFile = reporterOptions.outputFile ?? (0, path_1.resolve)(reportDir, 'junit.xml');
|
37
|
+
this.logger = new IndentedLogger((text) => {
|
38
|
+
this.fileFd ??= (0, fs_1.openSync)(this.reportFile, 'w+');
|
39
|
+
(0, fs_1.writeFileSync)(this.fileFd, `${text}\n`);
|
40
|
+
});
|
41
|
+
runner.on(types_js_1.TEST_EVENTS.RUN_BEGIN, () => {
|
42
|
+
this.suites = {};
|
43
|
+
const outputDirectory = (0, path_1.dirname)(this.reportFile);
|
44
|
+
if (!(0, fs_1.existsSync)(outputDirectory)) {
|
45
|
+
(0, fs_1.mkdirSync)(outputDirectory, { recursive: true });
|
46
|
+
}
|
47
|
+
this.fileFd = (0, fs_1.openSync)(this.reportFile, 'w+');
|
48
|
+
});
|
49
|
+
runner.on(types_js_1.TEST_EVENTS.TEST_PASS, (test) => {
|
50
|
+
const suite = (this.suites[test.parent.title] ??= []);
|
51
|
+
suite.push(test);
|
52
|
+
});
|
53
|
+
runner.on(types_js_1.TEST_EVENTS.TEST_FAIL, (test) => {
|
54
|
+
const suite = (this.suites[test.parent.title] ??= []);
|
55
|
+
suite.push(test);
|
56
|
+
});
|
57
|
+
runner.on(types_js_1.TEST_EVENTS.RUN_END, () => {
|
58
|
+
this.onFinished();
|
59
|
+
});
|
60
|
+
}
|
61
|
+
writeElement(name, attrs, children) {
|
62
|
+
const pairs = [];
|
63
|
+
for (const key in attrs) {
|
64
|
+
const attr = attrs[key];
|
65
|
+
if (attr === undefined) {
|
66
|
+
continue;
|
67
|
+
}
|
68
|
+
pairs.push(`${key}="${escapeXML(attr)}"`);
|
69
|
+
}
|
70
|
+
this.logger.log(`<${name}${pairs.length ? ` ${pairs.join(' ')}` : ''}>`);
|
71
|
+
this.logger.indent();
|
72
|
+
children?.call(this);
|
73
|
+
this.logger.unindent();
|
74
|
+
this.logger.log(`</${name}>`);
|
75
|
+
}
|
76
|
+
writeTasks(tests) {
|
77
|
+
for (const test of tests) {
|
78
|
+
const classname = test.parent.title;
|
79
|
+
this.writeElement('testcase', {
|
80
|
+
classname,
|
81
|
+
name: test.title,
|
82
|
+
time: getDuration(test),
|
83
|
+
}, () => {
|
84
|
+
if (test.state === 'failed') {
|
85
|
+
const error = test.err;
|
86
|
+
this.writeElement('failure', { message: error });
|
87
|
+
}
|
88
|
+
});
|
89
|
+
}
|
90
|
+
}
|
91
|
+
onFinished() {
|
92
|
+
this.logger.log('<?xml version="1.0" encoding="UTF-8" ?>');
|
93
|
+
const suites = Object.entries(this.suites).map(([name, tests]) => {
|
94
|
+
return {
|
95
|
+
name,
|
96
|
+
tests,
|
97
|
+
failures: tests.filter((test) => test.state === 'failed').length,
|
98
|
+
time: tests.reduce((acc, test) => acc + (test.duration ?? 0), 0),
|
99
|
+
};
|
100
|
+
});
|
101
|
+
const stats = suites.reduce((s, { tests, failures, time }) => {
|
102
|
+
s.tests += tests.length;
|
103
|
+
s.failures += failures;
|
104
|
+
s.time += time;
|
105
|
+
return s;
|
106
|
+
}, { name: 'creevey tests', tests: 0, failures: 0, time: 0 });
|
107
|
+
this.writeElement('testsuites', { ...stats, time: executionTime(stats.time) }, () => {
|
108
|
+
suites.forEach(({ name, tests, failures, time }) => {
|
109
|
+
this.writeElement('testsuite', {
|
110
|
+
name,
|
111
|
+
tests: tests.length,
|
112
|
+
failures,
|
113
|
+
time: executionTime(time),
|
114
|
+
}, () => {
|
115
|
+
this.writeTasks(tests);
|
116
|
+
});
|
117
|
+
});
|
118
|
+
});
|
119
|
+
if (this.reportFile) {
|
120
|
+
(0, logger_js_1.logger)().info(`JUNIT report written to ${this.reportFile}`);
|
121
|
+
}
|
122
|
+
if (this.fileFd) {
|
123
|
+
(0, fs_1.closeSync)(this.fileFd);
|
124
|
+
this.fileFd = undefined;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
exports.JUnitReporter = JUnitReporter;
|
129
|
+
// https://gist.github.com/john-doherty/b9195065884cdbfd2017a4756e6409cc
|
130
|
+
function removeInvalidXMLCharacters(value, removeDiscouragedChars) {
|
131
|
+
let regex =
|
132
|
+
// eslint-disable-next-line no-control-regex
|
133
|
+
/([\0-\x08\v\f\x0E-\x1F\uFFFD\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g;
|
134
|
+
value = String(value).replace(regex, '');
|
135
|
+
if (removeDiscouragedChars) {
|
136
|
+
// remove everything discouraged by XML 1.0 specifications
|
137
|
+
regex = new RegExp('([\\x7F-\\x84]|[\\x86-\\x9F]|[\\uFDD0-\\uFDEF]|\\uD83F[\\uDFFE\\uDFFF]|(?:\\uD87F[\\uDF' +
|
138
|
+
'FE\\uDFFF])|\\uD8BF[\\uDFFE\\uDFFF]|\\uD8FF[\\uDFFE\\uDFFF]|(?:\\uD93F[\\uDFFE\\uD' +
|
139
|
+
'FFF])|\\uD97F[\\uDFFE\\uDFFF]|\\uD9BF[\\uDFFE\\uDFFF]|\\uD9FF[\\uDFFE\\uDFFF]' +
|
140
|
+
'|\\uDA3F[\\uDFFE\\uDFFF]|\\uDA7F[\\uDFFE\\uDFFF]|\\uDABF[\\uDFFE\\uDFFF]|(?:\\' +
|
141
|
+
'uDAFF[\\uDFFE\\uDFFF])|\\uDB3F[\\uDFFE\\uDFFF]|\\uDB7F[\\uDFFE\\uDFFF]|(?:\\uDBBF' +
|
142
|
+
'[\\uDFFE\\uDFFF])|\\uDBFF[\\uDFFE\\uDFFF](?:[\\0-\\t\\v\\f\\x0E-\\u2027\\u202A-\\uD7FF\\' +
|
143
|
+
'uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|' +
|
144
|
+
'(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]))', 'g');
|
145
|
+
value = value.replace(regex, '');
|
146
|
+
}
|
147
|
+
return value;
|
148
|
+
}
|
149
|
+
function escapeXML(value) {
|
150
|
+
return removeInvalidXMLCharacters(String(value)
|
151
|
+
.replace(/&/g, '&')
|
152
|
+
.replace(/"/g, '"')
|
153
|
+
.replace(/'/g, ''')
|
154
|
+
.replace(/</g, '<')
|
155
|
+
.replace(/>/g, '>'), true);
|
156
|
+
}
|
157
|
+
function executionTime(durationMS) {
|
158
|
+
return (durationMS / 1000).toLocaleString('en-US', {
|
159
|
+
useGrouping: false,
|
160
|
+
maximumFractionDigits: 10,
|
161
|
+
});
|
162
|
+
}
|
163
|
+
function getDuration(task) {
|
164
|
+
const duration = task.duration ?? 0;
|
165
|
+
return executionTime(duration);
|
166
|
+
}
|
167
|
+
//# sourceMappingURL=junit.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"junit.js","sourceRoot":"","sources":["../../../src/server/reporters/junit.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.TeamcityReporter = void 0;
|
4
|
+
const types_js_1 = require("../../types.js");
|
5
|
+
class TeamcityReporter {
|
6
|
+
constructor(runner, options) {
|
7
|
+
const { reportDir } = options;
|
8
|
+
runner.on(types_js_1.TEST_EVENTS.TEST_BEGIN, (test) => {
|
9
|
+
console.log(`##teamcity[testStarted name='${this.escape(test.fullTitle())}' flowId='${test.creevey.workerId}']`);
|
10
|
+
});
|
11
|
+
runner.on(types_js_1.TEST_EVENTS.TEST_PASS, (test) => {
|
12
|
+
console.log(`##teamcity[testFinished name='${this.escape(test.fullTitle())}' flowId='${test.creevey.workerId}']`);
|
13
|
+
});
|
14
|
+
runner.on(types_js_1.TEST_EVENTS.TEST_FAIL, (test, error) => {
|
15
|
+
const browserName = this.escape(test.creevey.browserName);
|
16
|
+
Object.entries(test.creevey.images).forEach(([name, image]) => {
|
17
|
+
if (!image)
|
18
|
+
return;
|
19
|
+
const filePath = test
|
20
|
+
.titlePath()
|
21
|
+
.slice(0, -1)
|
22
|
+
.concat(name == browserName ? [] : [browserName])
|
23
|
+
.map(this.escape)
|
24
|
+
.join('/');
|
25
|
+
const { error: _, ...rest } = image;
|
26
|
+
Object.values(rest)
|
27
|
+
.filter(types_js_1.isDefined)
|
28
|
+
.forEach((fileName) => {
|
29
|
+
console.log(`##teamcity[publishArtifacts '${reportDir}/${filePath}/${fileName} => report/${filePath}']`);
|
30
|
+
console.log(`##teamcity[testMetadata testName='${this.escape(test.fullTitle())}' type='image' value='report/${filePath}/${fileName}' flowId='${test.creevey.workerId}']`);
|
31
|
+
});
|
32
|
+
});
|
33
|
+
// Output failed test as passed due TC don't support retry mechanic
|
34
|
+
// https://teamcity-support.jetbrains.com/hc/en-us/community/posts/207216829-Count-test-as-successful-if-at-least-one-try-is-successful?page=1#community_comment_207394125
|
35
|
+
if (test.creevey.willRetry)
|
36
|
+
console.log(`##teamcity[testFinished name='${this.escape(test.fullTitle())}' flowId='${test.creevey.workerId}']`);
|
37
|
+
else
|
38
|
+
console.log(`##teamcity[testFailed name='${this.escape(test.fullTitle())}' message='${this.escape(error.message)}' details='${this.escape(error.stack ?? '')}' flowId='${test.creevey.workerId}']`);
|
39
|
+
});
|
40
|
+
}
|
41
|
+
escape = (str) => {
|
42
|
+
if (!str)
|
43
|
+
return '';
|
44
|
+
return (str
|
45
|
+
.toString()
|
46
|
+
// eslint-disable-next-line no-control-regex
|
47
|
+
.replace(/\x1B.*?m/g, '')
|
48
|
+
.replace(/\|/g, '||')
|
49
|
+
.replace(/\n/g, '|n')
|
50
|
+
.replace(/\r/g, '|r')
|
51
|
+
.replace(/\[/g, '|[')
|
52
|
+
.replace(/\]/g, '|]')
|
53
|
+
.replace(/\u0085/g, '|x')
|
54
|
+
.replace(/\u2028/g, '|l')
|
55
|
+
.replace(/\u2029/g, '|p')
|
56
|
+
.replace(/'/g, "|'"));
|
57
|
+
};
|
58
|
+
}
|
59
|
+
exports.TeamcityReporter = TeamcityReporter;
|
60
|
+
//# sourceMappingURL=teamcity.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"teamcity.js","sourceRoot":"","sources":["../../../src/server/reporters/teamcity.ts"],"names":[],"mappings":"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"}
|
@@ -1,6 +1,6 @@
|
|
1
|
-
import { Args } from '
|
1
|
+
import type { Args } from 'storybook/internal/types';
|
2
2
|
import { WebDriver } from 'selenium-webdriver';
|
3
|
-
import { Config, StorybookGlobals, StoryInput, StoriesRaw,
|
3
|
+
import { Config, StorybookGlobals, StoryInput, StoriesRaw, WorkerOptions, ServerTest } from '../../types.js';
|
4
4
|
export declare class InternalBrowser {
|
5
5
|
#private;
|
6
6
|
constructor(browser: WebDriver, port: number, storybookGlobals?: StorybookGlobals);
|
@@ -12,7 +12,7 @@ export declare class InternalBrowser {
|
|
12
12
|
updateStoryArgs(story: StoryInput, updatedArgs: Args): Promise<void>;
|
13
13
|
loadStoriesFromBrowser(): Promise<StoriesRaw>;
|
14
14
|
afterTest(test: ServerTest): Promise<void>;
|
15
|
-
static getBrowser(browserName: string, gridUrl: string, config: Config, options:
|
15
|
+
static getBrowser(browserName: string, gridUrl: string, config: Config, options: WorkerOptions): Promise<InternalBrowser | null>;
|
16
16
|
private init;
|
17
17
|
private openStorybookPage;
|
18
18
|
private checkUrl;
|
@@ -190,7 +190,7 @@ class InternalBrowser {
|
|
190
190
|
else {
|
191
191
|
(0, logger_js_1.logger)().debug(`Checking is element ${chalk_1.default.cyan(captureElement)} fit into viewport`);
|
192
192
|
const rects = await this.#browser.executeScript(function (selector) {
|
193
|
-
window.scrollTo(0, 0);
|
193
|
+
window.scrollTo(0, 0);
|
194
194
|
// eslint-disable-next-line no-var
|
195
195
|
var element = document.querySelector(selector);
|
196
196
|
if (!element)
|
@@ -206,9 +206,7 @@ class InternalBrowser {
|
|
206
206
|
},
|
207
207
|
// NOTE page_Offset is used only for IE9-11
|
208
208
|
windowRect: {
|
209
|
-
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
210
209
|
top: Math.round(window.scrollY || window.pageYOffset),
|
211
|
-
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
212
210
|
left: Math.round(window.scrollX || window.pageXOffset),
|
213
211
|
width: window.innerWidth,
|
214
212
|
height: window.innerHeight,
|
@@ -230,12 +228,10 @@ class InternalBrowser {
|
|
230
228
|
// ? context
|
231
229
|
// ? await context.captureElementScreenshot(await element.getId())
|
232
230
|
// : await browser.findElement(By.css(captureElement)).takeScreenshot()
|
233
|
-
// :
|
234
|
-
// await takeCompositeScreenshot(browser, windowRect, elementRect);
|
231
|
+
// : await takeCompositeScreenshot(browser, windowRect, elementRect);
|
235
232
|
screenshot = isFitIntoViewport
|
236
233
|
? await this.#browser.findElement(selenium_webdriver_1.By.css(captureElement)).takeScreenshot()
|
237
|
-
:
|
238
|
-
await this.takeCompositeScreenshot(windowRect, elementRect);
|
234
|
+
: await this.takeCompositeScreenshot(windowRect, elementRect);
|
239
235
|
(0, logger_js_1.logger)().debug(`${chalk_1.default.cyan(captureElement)} is captured`);
|
240
236
|
}
|
241
237
|
}
|
@@ -281,9 +277,27 @@ class InternalBrowser {
|
|
281
277
|
}, story.id, updatedArgs, types_js_1.StorybookEvents.UPDATE_STORY_ARGS, types_js_1.StorybookEvents.STORY_RENDERED);
|
282
278
|
}
|
283
279
|
async loadStoriesFromBrowser() {
|
284
|
-
const
|
285
|
-
|
280
|
+
const result = await this.#browser.executeAsyncScript(function (callback) {
|
281
|
+
window
|
282
|
+
.__CREEVEY_GET_STORIES__()
|
283
|
+
.then((stories) => {
|
284
|
+
callback([null, stories]);
|
285
|
+
})
|
286
|
+
.catch((error) => {
|
287
|
+
const errorInfo = {
|
288
|
+
message: error instanceof Error ? error.message : String(error),
|
289
|
+
stack: error instanceof Error ? error.stack : undefined,
|
290
|
+
};
|
291
|
+
callback([errorInfo]);
|
292
|
+
});
|
286
293
|
});
|
294
|
+
const [error, stories] = result;
|
295
|
+
if (error) {
|
296
|
+
const errorObj = new Error(error.message);
|
297
|
+
if (error.stack)
|
298
|
+
errorObj.stack = error.stack;
|
299
|
+
throw errorObj;
|
300
|
+
}
|
287
301
|
if (!stories)
|
288
302
|
throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
|
289
303
|
return stories;
|
@@ -301,12 +315,14 @@ class InternalBrowser {
|
|
301
315
|
}
|
302
316
|
static async getBrowser(browserName, gridUrl, config, options) {
|
303
317
|
const browserConfig = config.browsers[browserName];
|
304
|
-
const { storybookUrl: address = config.storybookUrl, limit, viewport,
|
318
|
+
const { storybookUrl: address = config.storybookUrl, limit, viewport,
|
319
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
320
|
+
_storybookGlobals, storybookGlobals = _storybookGlobals, } = browserConfig;
|
305
321
|
void limit;
|
306
322
|
const browser = await buildWebdriver(browserName, gridUrl, config, options);
|
307
323
|
if (!browser)
|
308
324
|
return null;
|
309
|
-
const internalBrowser = new InternalBrowser(browser, options.port,
|
325
|
+
const internalBrowser = new InternalBrowser(browser, options.port, storybookGlobals);
|
310
326
|
try {
|
311
327
|
if (utils_js_1.isShuttingDown.current)
|
312
328
|
return null;
|
@@ -315,7 +331,6 @@ class InternalBrowser {
|
|
315
331
|
gridUrl,
|
316
332
|
viewport,
|
317
333
|
storybookUrl: address,
|
318
|
-
resolveStorybookUrl: config.resolveStorybookUrl,
|
319
334
|
});
|
320
335
|
return done ? internalBrowser : null;
|
321
336
|
}
|
@@ -329,7 +344,7 @@ class InternalBrowser {
|
|
329
344
|
return null;
|
330
345
|
}
|
331
346
|
}
|
332
|
-
async init({ browserName, gridUrl, viewport, storybookUrl,
|
347
|
+
async init({ browserName, gridUrl, viewport, storybookUrl, }) {
|
333
348
|
const sessionId = (await this.#browser.getSession()).getId();
|
334
349
|
let browserHost = '';
|
335
350
|
try {
|
@@ -349,7 +364,7 @@ class InternalBrowser {
|
|
349
364
|
(0, logger_js_1.logger)().debug(`Connected successful with ${chalk_1.default.green(browserHost)}`);
|
350
365
|
return await (0, utils_js_1.runSequence)([
|
351
366
|
() => this.#browser.manage().setTimeouts({ pageLoad: 60000, script: 60000 }),
|
352
|
-
() => this.openStorybookPage(storybookUrl
|
367
|
+
() => this.openStorybookPage(storybookUrl),
|
353
368
|
() => this.waitForStorybook(),
|
354
369
|
() => this.updateStorybookGlobals(),
|
355
370
|
() => this.resolveCreeveyHost(),
|
@@ -363,22 +378,13 @@ class InternalBrowser {
|
|
363
378
|
},
|
364
379
|
], () => !this.#isShuttingDown);
|
365
380
|
}
|
366
|
-
async openStorybookPage(storybookUrl
|
381
|
+
async openStorybookPage(storybookUrl) {
|
367
382
|
if (!webdriver_js_1.LOCALHOST_REGEXP.test(storybookUrl)) {
|
368
383
|
return this.#browser.get((0, webdriver_js_1.appendIframePath)(storybookUrl));
|
369
384
|
}
|
370
385
|
try {
|
371
|
-
|
372
|
-
|
373
|
-
const resolvedUrl = await resolver();
|
374
|
-
(0, logger_js_1.logger)().debug(`Resolver storybook url ${resolvedUrl}`);
|
375
|
-
await this.#browser.get((0, webdriver_js_1.appendIframePath)(resolvedUrl));
|
376
|
-
}
|
377
|
-
else {
|
378
|
-
// TODO Pageload timeout 10s
|
379
|
-
// NOTE: getUrlChecker already calls `browser.get` so we don't need another one
|
380
|
-
await (0, webdriver_js_1.resolveStorybookUrl)((0, webdriver_js_1.appendIframePath)(storybookUrl), (url) => this.checkUrl(url));
|
381
|
-
}
|
386
|
+
// NOTE: getUrlChecker already calls `browser.get` so we don't need another one
|
387
|
+
await (0, webdriver_js_1.resolveStorybookUrl)((0, webdriver_js_1.appendIframePath)(storybookUrl), (url) => this.checkUrl(url));
|
382
388
|
}
|
383
389
|
catch (error) {
|
384
390
|
(0, logger_js_1.logger)().error('Failed to resolve storybook URL', error instanceof Error ? error.message : '');
|
@@ -407,7 +413,7 @@ class InternalBrowser {
|
|
407
413
|
}
|
408
414
|
}
|
409
415
|
async waitForStorybook() {
|
410
|
-
(0, logger_js_1.logger)().debug('Waiting for
|
416
|
+
(0, logger_js_1.logger)().debug('Waiting for Storybook to initiate');
|
411
417
|
const isTimeout = await Promise.race([
|
412
418
|
new Promise((resolve) => {
|
413
419
|
setTimeout(() => {
|
@@ -419,9 +425,6 @@ class InternalBrowser {
|
|
419
425
|
do {
|
420
426
|
// TODO Research a different way to ensure storybook is initiated
|
421
427
|
wait = await this.#browser.executeScript(function (SET_GLOBALS) {
|
422
|
-
// TODO Maybe use
|
423
|
-
// import { global } from '@storybook/global';
|
424
|
-
// global.IS_STORYBOOK
|
425
428
|
if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined')
|
426
429
|
return true;
|
427
430
|
if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_GLOBALS) == undefined)
|
@@ -432,9 +435,8 @@ class InternalBrowser {
|
|
432
435
|
return false;
|
433
436
|
})(),
|
434
437
|
]);
|
435
|
-
// TODO Change the message to describe a reason why it might happen
|
436
438
|
if (isTimeout)
|
437
|
-
throw new Error('Failed to wait
|
439
|
+
throw new Error('Failed to wait Storybook init');
|
438
440
|
}
|
439
441
|
async updateStorybookGlobals() {
|
440
442
|
if (!this.#storybookGlobals)
|
@@ -445,7 +447,9 @@ class InternalBrowser {
|
|
445
447
|
}, this.#storybookGlobals);
|
446
448
|
}
|
447
449
|
async resolveCreeveyHost() {
|
448
|
-
const
|
450
|
+
const storybookUrl = await this.#browser.getCurrentUrl();
|
451
|
+
const storybookHost = new URL(storybookUrl).hostname;
|
452
|
+
const addresses = [storybookHost, ...(0, webdriver_js_1.getAddresses)()];
|
449
453
|
this.#serverHost = await this.#browser.executeAsyncScript(function (hosts, port, callback) {
|
450
454
|
void Promise.all(hosts.map(function (host) {
|
451
455
|
return Promise.race([
|
@@ -474,6 +478,7 @@ class InternalBrowser {
|
|
474
478
|
}
|
475
479
|
async updateBrowserGlobalVariables() {
|
476
480
|
await this.#browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
|
481
|
+
window.__CREEVEY_ENV__ = true;
|
477
482
|
window.__CREEVEY_WORKER_ID__ = workerId;
|
478
483
|
window.__CREEVEY_SERVER_HOST__ = creeveyHost;
|
479
484
|
window.__CREEVEY_SERVER_PORT__ = creeveyPort;
|
@@ -633,8 +638,17 @@ class InternalBrowser {
|
|
633
638
|
keepAlive() {
|
634
639
|
this.#keepAliveInterval = setInterval(() => {
|
635
640
|
// NOTE Simple way to keep session alive
|
636
|
-
void this.#browser
|
641
|
+
void this.#browser
|
642
|
+
.getCurrentUrl()
|
643
|
+
.then((url) => {
|
637
644
|
(0, logger_js_1.logger)().debug('current url', chalk_1.default.magenta(url));
|
645
|
+
})
|
646
|
+
.catch((error) => {
|
647
|
+
(0, logger_js_1.logger)().error(error);
|
648
|
+
(0, messages_js_1.emitWorkerMessage)({
|
649
|
+
type: 'error',
|
650
|
+
payload: { subtype: 'browser', error: 'Failed to ping browser' },
|
651
|
+
});
|
638
652
|
});
|
639
653
|
}, 10 * 1000);
|
640
654
|
}
|