creevey 0.9.0-non-webpack.2.fix-capture-element → 0.9.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/.yarnrc.yml +1 -0
- package/CHANGELOG.md +51 -0
- package/README.md +4 -3
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/addon/components/Addon.d.ts +8 -0
- package/dist/client/addon/components/Addon.js +57 -0
- package/dist/client/addon/components/Addon.js.map +1 -0
- package/{lib/types → dist}/client/addon/components/Icons.d.ts +7 -7
- package/dist/client/addon/components/Icons.js +18 -0
- package/dist/client/addon/components/Icons.js.map +1 -0
- package/{lib/types → dist}/client/addon/components/Panel.d.ts +9 -9
- package/dist/client/addon/components/Panel.js +35 -0
- package/dist/client/addon/components/Panel.js.map +1 -0
- package/{lib/types → dist}/client/addon/components/TestSelect.d.ts +8 -8
- package/dist/client/addon/components/TestSelect.js +33 -0
- package/dist/client/addon/components/TestSelect.js.map +1 -0
- package/dist/client/addon/components/Tools.d.ts +6 -0
- package/dist/client/addon/components/Tools.js +89 -0
- package/dist/client/addon/components/Tools.js.map +1 -0
- package/{lib/types/client/addon/Manager.d.ts → dist/client/addon/controller.d.ts} +38 -37
- package/dist/client/addon/controller.js +208 -0
- package/dist/client/addon/controller.js.map +1 -0
- package/dist/client/addon/decorator.d.ts +1 -0
- package/dist/client/addon/decorator.js +6 -0
- package/dist/client/addon/decorator.js.map +1 -0
- package/dist/client/addon/index.d.ts +2 -0
- package/dist/client/addon/index.js +19 -0
- package/dist/client/addon/index.js.map +1 -0
- package/dist/client/addon/manager.d.ts +1 -0
- package/dist/client/addon/manager.js +41 -0
- package/dist/client/addon/manager.js.map +1 -0
- package/dist/client/addon/preset.d.ts +2 -0
- package/dist/client/addon/preset.js +6 -0
- package/dist/client/addon/preset.js.map +1 -0
- package/dist/client/addon/preview.d.ts +4 -0
- package/dist/client/addon/preview.js +8 -0
- package/dist/client/addon/preview.js.map +1 -0
- package/{lib/types → dist}/client/addon/readyForCapture.d.ts +6 -6
- package/dist/client/addon/readyForCapture.js +7 -0
- package/dist/client/addon/readyForCapture.js.map +1 -0
- package/{lib/types → dist}/client/addon/utils.d.ts +3 -2
- package/dist/client/addon/utils.js +27 -0
- package/dist/client/addon/utils.js.map +1 -0
- package/{lib/types → dist}/client/addon/withCreevey.d.ts +25 -24
- package/dist/client/addon/withCreevey.js +286 -0
- package/dist/client/addon/withCreevey.js.map +1 -0
- package/dist/client/shared/components/ImagesView/BlendView.d.ts +5 -0
- package/dist/client/shared/components/ImagesView/BlendView.js +74 -0
- package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -0
- package/dist/client/shared/components/ImagesView/ImagesView.d.ts +9 -0
- package/dist/client/shared/components/ImagesView/ImagesView.js +46 -0
- package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -0
- package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +5 -0
- package/dist/client/shared/components/ImagesView/SideBySideView.js +121 -0
- package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -0
- package/dist/client/shared/components/ImagesView/SlideView.d.ts +5 -0
- package/dist/client/shared/components/ImagesView/SlideView.js +136 -0
- package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -0
- package/dist/client/shared/components/ImagesView/SwapView.d.ts +5 -0
- package/dist/client/shared/components/ImagesView/SwapView.js +72 -0
- package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -0
- package/{lib/types/client/shared/components/ImagesView/ImagesView.d.ts → dist/client/shared/components/ImagesView/common.d.ts} +15 -24
- package/dist/client/shared/components/ImagesView/common.js +14 -0
- package/dist/client/shared/components/ImagesView/common.js.map +1 -0
- package/dist/client/shared/components/ImagesView/index.d.ts +5 -0
- package/dist/client/shared/components/ImagesView/index.js +14 -0
- package/dist/client/shared/components/ImagesView/index.js.map +1 -0
- package/dist/client/shared/components/PageFooter/PageFooter.d.ts +6 -0
- package/dist/client/shared/components/PageFooter/PageFooter.js +20 -0
- package/dist/client/shared/components/PageFooter/PageFooter.js.map +1 -0
- package/{lib/types → dist}/client/shared/components/PageFooter/Paging.d.ts +7 -7
- package/dist/client/shared/components/PageFooter/Paging.js +51 -0
- package/dist/client/shared/components/PageFooter/Paging.js.map +1 -0
- package/{lib/types → dist}/client/shared/components/PageHeader/ImagePreview.d.ts +14 -12
- package/dist/client/shared/components/PageHeader/ImagePreview.js +61 -0
- package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -0
- package/{lib/types → dist}/client/shared/components/PageHeader/PageHeader.d.ts +14 -16
- package/dist/client/shared/components/PageHeader/PageHeader.js +93 -0
- package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -0
- package/dist/client/shared/components/ResultsPage.d.ts +20 -0
- package/dist/client/shared/components/ResultsPage.js +87 -0
- package/dist/client/shared/components/ResultsPage.js.map +1 -0
- package/{lib/types → dist}/client/shared/creeveyClientApi.d.ts +10 -9
- package/dist/client/shared/creeveyClientApi.js +56 -0
- package/dist/client/shared/creeveyClientApi.js.map +1 -0
- package/{lib/types → dist}/client/shared/helpers.d.ts +47 -46
- package/dist/client/shared/helpers.js +396 -0
- package/dist/client/shared/helpers.js.map +1 -0
- package/{lib/types → dist}/client/shared/viewMode.d.ts +4 -4
- package/dist/client/shared/viewMode.js +11 -0
- package/dist/client/shared/viewMode.js.map +1 -0
- package/dist/client/web/202.js +1 -0
- package/dist/client/web/270.js +43 -0
- package/dist/client/web/752.js +1 -0
- package/{lib/types → dist}/client/web/CreeveyApp.d.ts +11 -11
- package/dist/client/web/CreeveyApp.js +167 -0
- package/dist/client/web/CreeveyApp.js.map +1 -0
- package/{lib/types → dist}/client/web/CreeveyContext.d.ts +14 -11
- package/dist/client/web/CreeveyContext.js +41 -0
- package/dist/client/web/CreeveyContext.js.map +1 -0
- package/dist/client/web/CreeveyLoader.d.ts +3 -0
- package/dist/client/web/CreeveyLoader.js +52 -0
- package/dist/client/web/CreeveyLoader.js.map +1 -0
- package/{lib/types → dist}/client/web/CreeveyView/SideBar/Checkbox.d.ts +22 -19
- package/dist/client/web/CreeveyView/SideBar/Checkbox.js +86 -0
- package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -0
- package/{lib/types → dist}/client/web/CreeveyView/SideBar/Search.d.ts +6 -6
- package/dist/client/web/CreeveyView/SideBar/Search.js +125 -0
- package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -0
- package/{lib/types → dist}/client/web/CreeveyView/SideBar/SideBar.d.ts +14 -14
- package/dist/client/web/CreeveyView/SideBar/SideBar.js +111 -0
- package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -0
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.d.ts +1 -0
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +32 -0
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -0
- package/{lib/types → dist}/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +12 -12
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +113 -0
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -0
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +43 -0
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +123 -0
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -0
- package/{lib/types → dist}/client/web/CreeveyView/SideBar/TestLink.d.ts +7 -7
- package/dist/client/web/CreeveyView/SideBar/TestLink.js +64 -0
- package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -0
- package/{lib/types → dist}/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +12 -10
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +59 -0
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -0
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.d.ts +11 -0
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +76 -0
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -0
- package/{lib/types → dist}/client/web/CreeveyView/SideBar/Toggle.d.ts +6 -6
- package/dist/client/web/CreeveyView/SideBar/Toggle.js +69 -0
- package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -0
- package/dist/client/web/CreeveyView/SideBar/index.d.ts +1 -0
- package/dist/client/web/CreeveyView/SideBar/index.js +6 -0
- package/dist/client/web/CreeveyView/SideBar/index.js.map +1 -0
- package/{lib/types → dist}/client/web/KeyboardEventsContext.d.ts +15 -13
- package/dist/client/web/KeyboardEventsContext.js +116 -0
- package/dist/client/web/KeyboardEventsContext.js.map +1 -0
- package/{lib/types → dist}/client/web/index.d.ts +4 -4
- package/{lib/cjs → dist}/client/web/index.html +12 -3
- package/dist/client/web/index.js +75 -0
- package/dist/client/web/index.js.map +1 -0
- package/dist/client/web/main.js +79 -0
- package/{lib/cjs → dist}/client/web/main.js.LICENSE.txt +0 -15
- package/{lib/types → dist}/creevey.d.ts +1 -1
- package/dist/creevey.js +52 -0
- package/dist/creevey.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/{lib/types → dist}/server/config.d.ts +4 -4
- package/dist/server/config.js +86 -0
- package/dist/server/config.js.map +1 -0
- package/{lib/types → dist}/server/docker.d.ts +7 -7
- package/dist/server/docker.js +122 -0
- package/dist/server/docker.js.map +1 -0
- package/{lib/types → dist}/server/index.d.ts +2 -2
- package/dist/server/index.js +47 -0
- package/dist/server/index.js.map +1 -0
- package/{lib/types → dist}/server/logger.d.ts +10 -10
- package/dist/server/logger.js +25 -0
- package/dist/server/logger.js.map +1 -0
- package/{lib/types → dist}/server/master/api.d.ts +7 -7
- package/dist/server/master/api.js +54 -0
- package/dist/server/master/api.js.map +1 -0
- package/dist/server/master/index.d.ts +3 -0
- package/dist/server/master/index.js +110 -0
- package/dist/server/master/index.js.map +1 -0
- package/{lib/types → dist}/server/master/master.d.ts +7 -7
- package/dist/server/master/master.js +40 -0
- package/dist/server/master/master.js.map +1 -0
- package/{lib/types → dist}/server/master/pool.d.ts +30 -31
- package/dist/server/master/pool.js +186 -0
- package/dist/server/master/pool.js.map +1 -0
- package/{lib/types → dist}/server/master/runner.d.ts +23 -26
- package/dist/server/master/runner.js +222 -0
- package/dist/server/master/runner.js.map +1 -0
- package/dist/server/master/server.d.ts +2 -0
- package/dist/server/master/server.js +114 -0
- package/dist/server/master/server.js.map +1 -0
- package/{lib/types → dist}/server/messages.d.ts +26 -27
- package/dist/server/messages.js +222 -0
- package/dist/server/messages.js.map +1 -0
- package/{lib/types → dist}/server/selenium/browser.d.ts +19 -17
- package/dist/server/selenium/browser.js +640 -0
- package/dist/server/selenium/browser.js.map +1 -0
- package/dist/server/selenium/index.d.ts +2 -0
- package/dist/server/selenium/index.js +19 -0
- package/dist/server/selenium/index.js.map +1 -0
- package/{lib/types → dist}/server/selenium/selenoid.d.ts +3 -3
- package/dist/server/selenium/selenoid.js +120 -0
- package/dist/server/selenium/selenoid.js.map +1 -0
- package/dist/server/stories.d.ts +3 -0
- package/dist/server/stories.js +92 -0
- package/dist/server/stories.js.map +1 -0
- package/dist/server/storybook/providers/browser.d.ts +2 -0
- package/dist/server/storybook/providers/browser.js +60 -0
- package/dist/server/storybook/providers/browser.js.map +1 -0
- package/dist/server/storybook/providers/hybrid.d.ts +2 -0
- package/dist/server/storybook/providers/hybrid.js +59 -0
- package/dist/server/storybook/providers/hybrid.js.map +1 -0
- package/dist/server/telemetry.d.ts +2 -0
- package/dist/server/telemetry.js +196 -0
- package/dist/server/telemetry.js.map +1 -0
- package/{lib/types → dist}/server/testsFiles/parser.d.ts +8 -12
- package/dist/server/testsFiles/parser.js +50 -0
- package/dist/server/testsFiles/parser.js.map +1 -0
- package/dist/server/update.d.ts +2 -0
- package/dist/server/update.js +53 -0
- package/dist/server/update.js.map +1 -0
- package/dist/server/utils.d.ts +25 -0
- package/dist/server/utils.js +157 -0
- package/dist/server/utils.js.map +1 -0
- package/{lib/types → dist}/server/worker/chai-image.d.ts +5 -6
- package/dist/server/worker/chai-image.js +113 -0
- package/dist/server/worker/chai-image.js.map +1 -0
- package/{lib/types → dist}/server/worker/helpers.d.ts +8 -8
- package/dist/server/worker/helpers.js +57 -0
- package/dist/server/worker/helpers.js.map +1 -0
- package/dist/server/worker/index.d.ts +1 -0
- package/dist/server/worker/index.js +6 -0
- package/dist/server/worker/index.js.map +1 -0
- package/{lib/types → dist}/server/worker/reporter.d.ts +8 -8
- package/dist/server/worker/reporter.js +130 -0
- package/dist/server/worker/reporter.js.map +1 -0
- package/dist/server/worker/worker.d.ts +4 -0
- package/dist/server/worker/worker.js +212 -0
- package/dist/server/worker/worker.js.map +1 -0
- package/{lib/types → dist}/shared/index.d.ts +7 -7
- package/dist/shared/index.js +77 -0
- package/dist/shared/index.js.map +1 -0
- package/{lib/types → dist}/shared/serializeRegExp.d.ts +9 -9
- package/dist/shared/serializeRegExp.js +25 -0
- package/dist/shared/serializeRegExp.js.map +1 -0
- package/{lib/types → dist}/types.d.ts +461 -490
- package/dist/types.js +61 -0
- package/dist/types.js.map +1 -0
- package/docs/config.md +30 -30
- package/docs/tests.md +3 -3
- package/manager/package.json +3 -0
- package/package.json +116 -156
- package/preset/README.md +3 -0
- package/preset/package.json +3 -0
- package/preview/README.md +3 -0
- package/preview/package.json +3 -0
- package/src/cli.ts +3 -0
- package/src/client/addon/components/Addon.tsx +53 -0
- package/src/client/addon/components/Icons.tsx +28 -0
- package/src/client/addon/components/Panel.tsx +57 -0
- package/src/client/addon/components/TestSelect.tsx +48 -0
- package/src/client/addon/components/Tools.tsx +93 -0
- package/src/client/addon/controller.ts +224 -0
- package/src/client/addon/decorator.ts +3 -0
- package/src/client/addon/index.ts +2 -0
- package/src/client/addon/manager.ts +44 -0
- package/src/client/addon/preset.ts +3 -0
- package/src/client/addon/preview.ts +7 -0
- package/src/client/addon/readyForCapture.ts +9 -0
- package/src/client/addon/utils.tsx +24 -0
- package/src/client/addon/withCreevey.ts +326 -0
- package/src/client/shared/components/ImagesView/BlendView.tsx +71 -0
- package/src/client/shared/components/ImagesView/ImagesView.tsx +70 -0
- package/src/client/shared/components/ImagesView/SideBySideView.tsx +139 -0
- package/src/client/shared/components/ImagesView/SlideView.tsx +146 -0
- package/src/client/shared/components/ImagesView/SwapView.tsx +81 -0
- package/src/client/shared/components/ImagesView/common.ts +23 -0
- package/src/client/shared/components/ImagesView/index.ts +5 -0
- package/src/client/shared/components/PageFooter/PageFooter.tsx +26 -0
- package/src/client/shared/components/PageFooter/Paging.tsx +90 -0
- package/src/client/shared/components/PageHeader/ImagePreview.tsx +82 -0
- package/src/client/shared/components/PageHeader/PageHeader.tsx +129 -0
- package/src/client/shared/components/ResultsPage.tsx +122 -0
- package/src/client/shared/creeveyClientApi.ts +68 -0
- package/src/client/shared/helpers.ts +436 -0
- package/src/client/shared/viewMode.ts +10 -0
- package/src/client/web/CreeveyApp.tsx +230 -0
- package/src/client/web/CreeveyContext.tsx +26 -0
- package/src/client/web/CreeveyLoader.tsx +56 -0
- package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +118 -0
- package/src/client/web/CreeveyView/SideBar/Search.tsx +140 -0
- package/src/client/web/CreeveyView/SideBar/SideBar.tsx +136 -0
- package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +38 -0
- package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +138 -0
- package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +137 -0
- package/src/client/web/CreeveyView/SideBar/TestLink.tsx +69 -0
- package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +64 -0
- package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +109 -0
- package/src/client/web/CreeveyView/SideBar/Toggle.tsx +85 -0
- package/src/client/web/CreeveyView/SideBar/index.ts +1 -0
- package/src/client/web/KeyboardEventsContext.tsx +121 -0
- package/src/client/web/index.html +28 -0
- package/src/client/web/index.tsx +63 -0
- package/src/creevey.ts +47 -0
- package/src/index.ts +4 -0
- package/src/server/config.ts +83 -0
- package/src/server/docker.ts +136 -0
- package/src/server/index.ts +51 -0
- package/{lib/esm/server/logger.js → src/server/logger.ts} +8 -7
- package/src/server/master/api.ts +59 -0
- package/src/server/master/index.ts +111 -0
- package/src/server/master/master.ts +47 -0
- package/src/server/master/pool.ts +203 -0
- package/src/server/master/runner.ts +245 -0
- package/src/server/master/server.ts +124 -0
- package/src/server/messages.ts +273 -0
- package/src/server/selenium/browser.ts +840 -0
- package/src/server/selenium/index.ts +2 -0
- package/src/server/selenium/selenoid.ts +154 -0
- package/src/server/stories.ts +133 -0
- package/src/server/storybook/providers/browser.ts +58 -0
- package/src/server/storybook/providers/hybrid.ts +70 -0
- package/src/server/telemetry.ts +212 -0
- package/src/server/testsFiles/parser.ts +62 -0
- package/src/server/update.ts +74 -0
- package/src/server/utils.ts +206 -0
- package/src/server/worker/chai-image.ts +147 -0
- package/src/server/worker/helpers.ts +61 -0
- package/src/server/worker/index.ts +1 -0
- package/src/server/worker/reporter.ts +170 -0
- package/src/server/worker/worker.ts +240 -0
- package/src/shared/index.ts +76 -0
- package/src/shared/serializeRegExp.ts +26 -0
- package/src/types.ts +501 -0
- package/types/chai.d.ts +0 -1
- package/types/global.d.ts +5 -0
- package/types/mocha.d.ts +1 -1
- package/addon/package.json +0 -4
- package/jest.config.js +0 -6
- package/lib/cjs/cli.js +0 -5
- package/lib/cjs/client/addon/Manager.js +0 -264
- package/lib/cjs/client/addon/components/Addon.js +0 -55
- package/lib/cjs/client/addon/components/Icons.js +0 -46
- package/lib/cjs/client/addon/components/Panel.js +0 -72
- package/lib/cjs/client/addon/components/TestSelect.js +0 -65
- package/lib/cjs/client/addon/components/Tools.js +0 -95
- package/lib/cjs/client/addon/decorator.js +0 -11
- package/lib/cjs/client/addon/index.js +0 -31
- package/lib/cjs/client/addon/preset.js +0 -62
- package/lib/cjs/client/addon/readyForCapture.js +0 -12
- package/lib/cjs/client/addon/register.js +0 -72
- package/lib/cjs/client/addon/utils.js +0 -38
- package/lib/cjs/client/addon/withCreevey.js +0 -346
- package/lib/cjs/client/shared/components/ImagesView/BlendView.js +0 -87
- package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +0 -92
- package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +0 -154
- package/lib/cjs/client/shared/components/ImagesView/SlideView.js +0 -166
- package/lib/cjs/client/shared/components/ImagesView/SwapView.js +0 -91
- package/lib/cjs/client/shared/components/ImagesView/index.js +0 -45
- package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +0 -50
- package/lib/cjs/client/shared/components/PageFooter/Paging.js +0 -94
- package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +0 -82
- package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +0 -119
- package/lib/cjs/client/shared/components/ResultsPage.js +0 -143
- package/lib/cjs/client/shared/creeveyClientApi.js +0 -76
- package/lib/cjs/client/shared/helpers.js +0 -411
- package/lib/cjs/client/shared/viewMode.js +0 -17
- package/lib/cjs/client/web/142.js +0 -2
- package/lib/cjs/client/web/142.js.LICENSE.txt +0 -12
- package/lib/cjs/client/web/32.js +0 -1
- package/lib/cjs/client/web/551.js +0 -1
- package/lib/cjs/client/web/566.js +0 -2
- package/lib/cjs/client/web/566.js.LICENSE.txt +0 -31
- package/lib/cjs/client/web/691.js +0 -2
- package/lib/cjs/client/web/691.js.LICENSE.txt +0 -8
- package/lib/cjs/client/web/725.js +0 -1
- package/lib/cjs/client/web/main.js +0 -2
- package/lib/cjs/creevey.js +0 -69
- package/lib/cjs/index.js +0 -62
- package/lib/cjs/server/config.js +0 -96
- package/lib/cjs/server/docker.js +0 -146
- package/lib/cjs/server/extract.js +0 -50
- package/lib/cjs/server/index.js +0 -83
- package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -86
- package/lib/cjs/server/loaders/babel/helpers.js +0 -469
- package/lib/cjs/server/loaders/babel/register.js +0 -124
- 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 -293
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -179
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -39
- 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/logger.js +0 -48
- package/lib/cjs/server/master/api.js +0 -75
- package/lib/cjs/server/master/index.js +0 -146
- package/lib/cjs/server/master/master.js +0 -57
- package/lib/cjs/server/master/pool.js +0 -197
- package/lib/cjs/server/master/runner.js +0 -281
- package/lib/cjs/server/master/server.js +0 -129
- package/lib/cjs/server/messages.js +0 -264
- package/lib/cjs/server/selenium/browser.js +0 -672
- package/lib/cjs/server/selenium/index.js +0 -31
- package/lib/cjs/server/selenium/selenoid.js +0 -172
- package/lib/cjs/server/stories.js +0 -159
- package/lib/cjs/server/storybook/entry.js +0 -70
- package/lib/cjs/server/storybook/helpers.js +0 -159
- package/lib/cjs/server/storybook/providers/browser.js +0 -74
- package/lib/cjs/server/storybook/providers/hybrid.js +0 -84
- package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
- package/lib/cjs/server/testsFiles/parser.js +0 -72
- package/lib/cjs/server/testsFiles/register.js +0 -48
- package/lib/cjs/server/update.js +0 -79
- package/lib/cjs/server/utils.js +0 -183
- package/lib/cjs/server/worker/chai-image.js +0 -142
- package/lib/cjs/server/worker/helpers.js +0 -69
- package/lib/cjs/server/worker/index.js +0 -15
- package/lib/cjs/server/worker/reporter.js +0 -108
- package/lib/cjs/server/worker/worker.js +0 -268
- package/lib/cjs/shared/index.js +0 -101
- package/lib/cjs/shared/serializeRegExp.js +0 -42
- package/lib/cjs/types.js +0 -74
- package/lib/esm/cli.js +0 -4
- package/lib/esm/client/addon/Manager.js +0 -248
- package/lib/esm/client/addon/components/Addon.js +0 -39
- package/lib/esm/client/addon/components/Icons.js +0 -31
- package/lib/esm/client/addon/components/Panel.js +0 -53
- package/lib/esm/client/addon/components/TestSelect.js +0 -51
- package/lib/esm/client/addon/components/Tools.js +0 -74
- package/lib/esm/client/addon/decorator.js +0 -2
- package/lib/esm/client/addon/index.js +0 -2
- package/lib/esm/client/addon/preset.js +0 -41
- package/lib/esm/client/addon/readyForCapture.js +0 -5
- package/lib/esm/client/addon/register.js +0 -51
- package/lib/esm/client/addon/utils.js +0 -31
- package/lib/esm/client/addon/withCreevey.js +0 -322
- package/lib/esm/client/shared/components/ImagesView/BlendView.js +0 -67
- package/lib/esm/client/shared/components/ImagesView/ImagesView.js +0 -69
- package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +0 -131
- package/lib/esm/client/shared/components/ImagesView/SlideView.js +0 -143
- package/lib/esm/client/shared/components/ImagesView/SwapView.js +0 -71
- package/lib/esm/client/shared/components/ImagesView/index.js +0 -5
- package/lib/esm/client/shared/components/PageFooter/PageFooter.js +0 -36
- package/lib/esm/client/shared/components/PageFooter/Paging.js +0 -80
- package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +0 -68
- package/lib/esm/client/shared/components/PageHeader/PageHeader.js +0 -97
- package/lib/esm/client/shared/components/ResultsPage.js +0 -115
- package/lib/esm/client/shared/creeveyClientApi.js +0 -67
- package/lib/esm/client/shared/helpers.js +0 -353
- package/lib/esm/client/shared/viewMode.js +0 -6
- package/lib/esm/creevey.js +0 -54
- package/lib/esm/index.js +0 -5
- package/lib/esm/server/config.js +0 -73
- package/lib/esm/server/docker.js +0 -123
- package/lib/esm/server/extract.js +0 -34
- package/lib/esm/server/index.js +0 -64
- package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -72
- package/lib/esm/server/loaders/babel/helpers.js +0 -452
- package/lib/esm/server/loaders/babel/register.js +0 -103
- 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 -270
- package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -158
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -32
- 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/master/api.js +0 -64
- package/lib/esm/server/master/index.js +0 -125
- package/lib/esm/server/master/master.js +0 -38
- package/lib/esm/server/master/pool.js +0 -176
- package/lib/esm/server/master/runner.js +0 -259
- package/lib/esm/server/master/server.js +0 -105
- package/lib/esm/server/messages.js +0 -232
- package/lib/esm/server/selenium/browser.js +0 -639
- package/lib/esm/server/selenium/index.js +0 -2
- package/lib/esm/server/selenium/selenoid.js +0 -149
- package/lib/esm/server/stories.js +0 -140
- package/lib/esm/server/storybook/entry.js +0 -46
- package/lib/esm/server/storybook/helpers.js +0 -98
- package/lib/esm/server/storybook/providers/browser.js +0 -60
- package/lib/esm/server/storybook/providers/hybrid.js +0 -64
- package/lib/esm/server/storybook/providers/nodejs.js +0 -217
- package/lib/esm/server/testsFiles/parser.js +0 -50
- package/lib/esm/server/testsFiles/register.js +0 -35
- package/lib/esm/server/update.js +0 -61
- package/lib/esm/server/utils.js +0 -142
- package/lib/esm/server/worker/chai-image.js +0 -130
- package/lib/esm/server/worker/helpers.js +0 -60
- package/lib/esm/server/worker/index.js +0 -1
- package/lib/esm/server/worker/reporter.js +0 -86
- package/lib/esm/server/worker/worker.js +0 -238
- package/lib/esm/shared/index.js +0 -78
- package/lib/esm/shared/serializeRegExp.js +0 -24
- package/lib/esm/types.js +0 -43
- package/lib/types/cli.d.ts +0 -1
- package/lib/types/client/addon/components/Addon.d.ts +0 -8
- package/lib/types/client/addon/components/Tools.d.ts +0 -6
- package/lib/types/client/addon/decorator.d.ts +0 -1
- package/lib/types/client/addon/index.d.ts +0 -2
- package/lib/types/client/addon/preset.d.ts +0 -23
- package/lib/types/client/addon/register.d.ts +0 -3
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +0 -3
- package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +0 -3
- package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +0 -3
- package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +0 -3
- package/lib/types/client/shared/components/ImagesView/index.d.ts +0 -5
- package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +0 -8
- package/lib/types/client/shared/components/ResultsPage.d.ts +0 -18
- package/lib/types/client/web/CreeveyLoader.d.ts +0 -2
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +0 -33
- package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +0 -9
- package/lib/types/client/web/CreeveyView/SideBar/index.d.ts +0 -1
- package/lib/types/index.d.ts +0 -2
- 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 -4
- 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/master/index.d.ts +0 -3
- package/lib/types/server/master/server.d.ts +0 -2
- package/lib/types/server/selenium/index.d.ts +0 -2
- package/lib/types/server/stories.d.ts +0 -8
- 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/browser.d.ts +0 -4
- package/lib/types/server/storybook/providers/hybrid.d.ts +0 -4
- package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
- package/lib/types/server/testsFiles/register.d.ts +0 -2
- package/lib/types/server/update.d.ts +0 -2
- package/lib/types/server/utils.d.ts +0 -20
- package/lib/types/server/worker/index.d.ts +0 -1
- package/lib/types/server/worker/worker.d.ts +0 -4
- package/preset.js +0 -9
- package/types/babel__register.d.ts +0 -1
- package/types/event-source-polyfill.d.ts +0 -6
- package/types/mdx.d.ts +0 -7
- /package/{addon → manager}/README.md +0 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
2
|
+
import { Placeholder } from '@storybook/components';
|
3
|
+
import { TestData } from '../../../types.js';
|
4
|
+
import { Panel } from './Panel.js';
|
5
|
+
import { CreeveyController } from '../controller.js';
|
6
|
+
|
7
|
+
interface AddonProps {
|
8
|
+
active?: boolean;
|
9
|
+
browser: string;
|
10
|
+
controller: CreeveyController;
|
11
|
+
}
|
12
|
+
export const Addon = ({ active, browser, controller }: AddonProps): JSX.Element | null => {
|
13
|
+
const [tests, setTests] = useState<TestData[]>([]);
|
14
|
+
|
15
|
+
const [selectedTestId, setSelectedTestId] = useState(controller.selectedTestId);
|
16
|
+
|
17
|
+
useEffect(() => {
|
18
|
+
if (active) {
|
19
|
+
controller.setActiveBrowser(browser);
|
20
|
+
const browserTests = controller.getTestsByStoryIdAndBrowser(controller.activeBrowser);
|
21
|
+
setTests(browserTests);
|
22
|
+
}
|
23
|
+
}, [active, browser, controller]);
|
24
|
+
|
25
|
+
useEffect(() => {
|
26
|
+
const unsubscribe = controller.onChangeTest((testId) => {
|
27
|
+
setSelectedTestId(testId);
|
28
|
+
const status = controller.getTestsByStoryIdAndBrowser(controller.activeBrowser);
|
29
|
+
setTests(status);
|
30
|
+
});
|
31
|
+
return unsubscribe;
|
32
|
+
}, [controller]);
|
33
|
+
|
34
|
+
useEffect(() => {
|
35
|
+
const unsubscribe = controller.onUpdateStatus(() => {
|
36
|
+
setTests(controller.getTestsByStoryIdAndBrowser(controller.activeBrowser));
|
37
|
+
});
|
38
|
+
return unsubscribe;
|
39
|
+
}, [controller, browser]);
|
40
|
+
|
41
|
+
return active ? (
|
42
|
+
tests.length ? (
|
43
|
+
<Panel
|
44
|
+
tests={tests}
|
45
|
+
selectedTestId={selectedTestId}
|
46
|
+
onChangeTest={controller.setSelectedTestId}
|
47
|
+
onImageApprove={controller.onImageApprove}
|
48
|
+
/>
|
49
|
+
) : (
|
50
|
+
<Placeholder>No test results</Placeholder>
|
51
|
+
)
|
52
|
+
) : null;
|
53
|
+
};
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
|
3
|
+
interface IconProps {
|
4
|
+
width?: number;
|
5
|
+
height?: number;
|
6
|
+
}
|
7
|
+
|
8
|
+
export const NextIcon = ({ width, height }: IconProps): JSX.Element => {
|
9
|
+
return (
|
10
|
+
<svg version="1.1" width={width} height={height} viewBox="0 0 306 306">
|
11
|
+
<path d="M0,306l216.75-153L0,0V306z M255,0v306h51V0H255z" fill="currentColor" />
|
12
|
+
</svg>
|
13
|
+
);
|
14
|
+
};
|
15
|
+
|
16
|
+
export const ForwardIcon = ({ width, height }: IconProps): JSX.Element => {
|
17
|
+
return (
|
18
|
+
<svg version="1.1" width={width} height={height} viewBox="0 0 512 512">
|
19
|
+
<path
|
20
|
+
fill="currentColor"
|
21
|
+
d="M460.9,246.8l-209-164.2c-7.8-6.1-19.2-0.6-19.2,9.2v328.4c0,9.8,11.4,15.3,19.2,9.2l209-164.2c5.1-4,6-11.4,2-16.5
|
22
|
+
C462.4,248,461.7,247.3,460.9,246.8L460.9,246.8z M228.2,246.8L19.2,82.5C11.4,76.4,0,82,0,91.8v328.4c0,9.8,11.4,15.3,19.2,9.2
|
23
|
+
l209-164.2c3-2.3,4.5-5.8,4.5-9.2C232.7,252.6,231.2,249.1,228.2,246.8z M507.3,64h-37.2c-2.5,0-4.7,2-4.7,4.4v375.3
|
24
|
+
c0,2.4,2.1,4.4,4.7,4.4h37.2c2.5,0,4.7-2,4.7-4.4V68.4C512,66,509.9,64,507.3,64z"
|
25
|
+
/>
|
26
|
+
</svg>
|
27
|
+
);
|
28
|
+
};
|
@@ -0,0 +1,57 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { Loader } from '@storybook/components';
|
3
|
+
import { styled } from '@storybook/theming';
|
4
|
+
import { TestData } from '../../../types.js';
|
5
|
+
import { ResultsPage } from '../../shared/components/ResultsPage.js';
|
6
|
+
import { getTestPath } from '../../shared/helpers.js';
|
7
|
+
import TestSelect from './TestSelect.js';
|
8
|
+
import { noop } from 'lodash';
|
9
|
+
interface PanelProps {
|
10
|
+
tests: TestData[];
|
11
|
+
selectedTestId: string;
|
12
|
+
onChangeTest: (testId: string) => void;
|
13
|
+
onImageApprove: (id: string, retry: number, image: string) => void;
|
14
|
+
}
|
15
|
+
|
16
|
+
const Wrapper = styled.div<{ isRunning: boolean }>(({ isRunning }) => ({
|
17
|
+
opacity: isRunning ? 0.5 : 1,
|
18
|
+
height: '100%',
|
19
|
+
}));
|
20
|
+
|
21
|
+
const TestSelectContainer = styled.div(({ theme }) => ({
|
22
|
+
padding: '8px',
|
23
|
+
border: `1px solid ${theme.appBorderColor}`,
|
24
|
+
}));
|
25
|
+
|
26
|
+
export const Panel = ({ tests, selectedTestId, onChangeTest }: PanelProps): JSX.Element => {
|
27
|
+
const result = tests.find((x) => x.id === selectedTestId);
|
28
|
+
|
29
|
+
const isRunning = result?.status === 'running';
|
30
|
+
|
31
|
+
return (
|
32
|
+
<div>
|
33
|
+
{tests.length > 1 && (
|
34
|
+
<TestSelectContainer>
|
35
|
+
<TestSelect tests={tests} selectedTestId={selectedTestId} onChangeTest={onChangeTest} />
|
36
|
+
</TestSelectContainer>
|
37
|
+
)}
|
38
|
+
{isRunning && <Loader />}
|
39
|
+
{result?.results?.length ? (
|
40
|
+
<Wrapper isRunning={isRunning}>
|
41
|
+
<ResultsPage
|
42
|
+
height={'100%'}
|
43
|
+
key={`${result.id}_${result.results.length}`} // TODO
|
44
|
+
path={getTestPath(result)} // TODO Memo?
|
45
|
+
results={result.results}
|
46
|
+
approved={result.approved}
|
47
|
+
// addon doesn't work, add only stubs
|
48
|
+
retry={0}
|
49
|
+
onRetryChange={noop}
|
50
|
+
imageName=""
|
51
|
+
onImageChange={noop}
|
52
|
+
/>
|
53
|
+
</Wrapper>
|
54
|
+
) : null}
|
55
|
+
</div>
|
56
|
+
);
|
57
|
+
};
|
@@ -0,0 +1,48 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { Button, Icons, TooltipLinkList, WithTooltip } from '@storybook/components';
|
3
|
+
import { styled } from '@storybook/theming';
|
4
|
+
import { TestData } from '../../../types.js';
|
5
|
+
import { getEmojiByTestStatus } from '../utils.js';
|
6
|
+
|
7
|
+
interface TestSelectProps {
|
8
|
+
tests: TestData[];
|
9
|
+
selectedTestId: string;
|
10
|
+
onChangeTest: (testId: string) => void;
|
11
|
+
}
|
12
|
+
|
13
|
+
const LinkIconContainer = styled.span(({ theme }) => ({
|
14
|
+
display: 'inline-block',
|
15
|
+
width: '20px',
|
16
|
+
color: theme.color.defaultText,
|
17
|
+
textAlign: 'center',
|
18
|
+
}));
|
19
|
+
|
20
|
+
export default function TestSelect(props: TestSelectProps): JSX.Element {
|
21
|
+
const testName = props.tests.find((x) => x.id === props.selectedTestId)?.testName ?? '';
|
22
|
+
return (
|
23
|
+
<WithTooltip
|
24
|
+
trigger="click"
|
25
|
+
placement="bottom"
|
26
|
+
closeOnClick
|
27
|
+
tooltip={({ onHide }) => (
|
28
|
+
<TooltipLinkList
|
29
|
+
links={props.tests.map((x) => ({
|
30
|
+
id: x.id,
|
31
|
+
title: x.testName ?? '',
|
32
|
+
active: props.selectedTestId === x.id,
|
33
|
+
onClick: () => {
|
34
|
+
props.onChangeTest(x.id);
|
35
|
+
onHide();
|
36
|
+
},
|
37
|
+
left: <LinkIconContainer>{getEmojiByTestStatus(x.status, x.skip)}</LinkIconContainer>,
|
38
|
+
}))}
|
39
|
+
/>
|
40
|
+
)}
|
41
|
+
>
|
42
|
+
<Button outline small>
|
43
|
+
<Icons icon="menu" />
|
44
|
+
{testName}
|
45
|
+
</Button>
|
46
|
+
</WithTooltip>
|
47
|
+
);
|
48
|
+
}
|
@@ -0,0 +1,93 @@
|
|
1
|
+
import React, { Fragment, useState, useEffect } from 'react';
|
2
|
+
import { stringify } from 'qs';
|
3
|
+
import { IconButton, Icons, Separator } from '@storybook/components';
|
4
|
+
import { styled } from '@storybook/theming';
|
5
|
+
import { ForwardIcon, NextIcon } from './Icons.js';
|
6
|
+
import { isDefined, TestData } from '../../../types.js';
|
7
|
+
import { getTestPath, useForceUpdate } from '../../shared/helpers.js';
|
8
|
+
import { CreeveyController } from '../controller.js';
|
9
|
+
|
10
|
+
interface ToolsProps {
|
11
|
+
controller: CreeveyController;
|
12
|
+
}
|
13
|
+
|
14
|
+
const Button = styled(IconButton)({
|
15
|
+
'&:disabled': {
|
16
|
+
opacity: 0.5,
|
17
|
+
cursor: 'default',
|
18
|
+
},
|
19
|
+
|
20
|
+
'&:disabled:hover': {
|
21
|
+
color: 'inherit',
|
22
|
+
},
|
23
|
+
});
|
24
|
+
|
25
|
+
type ButtonType = 'RunAll' | 'RunStoryTests' | 'RunTest';
|
26
|
+
|
27
|
+
export const Tools = ({ controller }: ToolsProps): JSX.Element | null => {
|
28
|
+
const [buttonClicked, setButtonClicked] = useState<ButtonType | null>();
|
29
|
+
const [isRunning, setRunning] = useState(controller.status.isRunning);
|
30
|
+
const forceUpdate = useForceUpdate();
|
31
|
+
const test: TestData | undefined = controller.getCurrentTest();
|
32
|
+
|
33
|
+
useEffect(() => {
|
34
|
+
const unsubscribe = controller.onChangeTest(() => {
|
35
|
+
forceUpdate();
|
36
|
+
});
|
37
|
+
return unsubscribe;
|
38
|
+
}, [controller, forceUpdate]);
|
39
|
+
|
40
|
+
useEffect(() => {
|
41
|
+
const unsubscribe = controller.onUpdateStatus(({ isRunning }) => {
|
42
|
+
if (isDefined(isRunning)) setRunning(isRunning);
|
43
|
+
});
|
44
|
+
return unsubscribe;
|
45
|
+
}, [controller]);
|
46
|
+
|
47
|
+
if (!test) return null;
|
48
|
+
|
49
|
+
function renderButton(type: ButtonType, title: string, onClick: () => void, icon: JSX.Element): JSX.Element {
|
50
|
+
const handleClick = (): void => {
|
51
|
+
setButtonClicked(type);
|
52
|
+
onClick();
|
53
|
+
};
|
54
|
+
const disabled = isRunning && buttonClicked != null && buttonClicked !== type;
|
55
|
+
return (
|
56
|
+
// @ts-expect-error Fixed in https://github.com/storybookjs/storybook/pull/26623
|
57
|
+
<Button
|
58
|
+
onClick={() => {
|
59
|
+
if (isRunning) controller.onStop();
|
60
|
+
else handleClick();
|
61
|
+
}}
|
62
|
+
title={disabled ? '' : title}
|
63
|
+
disabled={disabled}
|
64
|
+
>
|
65
|
+
{buttonClicked === type && isRunning ? <Icons icon={'stop'} /> : icon}
|
66
|
+
</Button>
|
67
|
+
);
|
68
|
+
}
|
69
|
+
|
70
|
+
return (
|
71
|
+
<Fragment>
|
72
|
+
{/* @ts-expect-error Fixed in https://github.com/storybookjs/storybook/pull/26623 */}
|
73
|
+
<IconButton
|
74
|
+
href={`http://localhost:${__CREEVEY_CLIENT_PORT__ ?? __CREEVEY_SERVER_PORT__ ?? 3000}/?${stringify({
|
75
|
+
testPath: getTestPath(test),
|
76
|
+
})}`}
|
77
|
+
target="_blank"
|
78
|
+
title="Show in Creevey UI"
|
79
|
+
>
|
80
|
+
<Icons icon="sharealt" />
|
81
|
+
</IconButton>
|
82
|
+
<Separator />
|
83
|
+
{renderButton('RunAll', 'Run all', controller.onStartAllTests, <ForwardIcon />)}
|
84
|
+
{renderButton(
|
85
|
+
'RunStoryTests',
|
86
|
+
'Run all story tests',
|
87
|
+
controller.onStartAllStoryTests,
|
88
|
+
<NextIcon width={15} height={11} />,
|
89
|
+
)}
|
90
|
+
{renderButton('RunTest', 'Run', controller.onStart, <Icons icon="play" />)}
|
91
|
+
</Fragment>
|
92
|
+
);
|
93
|
+
};
|
@@ -0,0 +1,224 @@
|
|
1
|
+
import { API } from '@storybook/api';
|
2
|
+
import { Addon_TypesEnum } from '@storybook/types';
|
3
|
+
import { SET_STORIES, STORY_RENDERED } from '@storybook/core-events';
|
4
|
+
import { denormalizeStoryParameters } from '../../shared/index.js';
|
5
|
+
import { CreeveyStatus, CreeveyUpdate, isDefined, TestData, TestStatus, StoriesRaw } from '../../types.js';
|
6
|
+
import { initCreeveyClientApi, CreeveyClientApi } from '../shared/creeveyClientApi.js';
|
7
|
+
import { calcStatus } from '../shared/helpers.js';
|
8
|
+
import { getEmojiByTestStatus } from './utils.js';
|
9
|
+
|
10
|
+
export const ADDON_ID = 'creevey';
|
11
|
+
|
12
|
+
// TODO Add `useController` hook
|
13
|
+
// TODO use `import { useGlobals, useStorybookApi } from '@storybook/manager-api';`
|
14
|
+
export class CreeveyController {
|
15
|
+
storyId = '';
|
16
|
+
activeBrowser = '';
|
17
|
+
selectedTestId = '';
|
18
|
+
status: CreeveyStatus = { isRunning: false, tests: {}, browsers: [] };
|
19
|
+
creeveyApi: CreeveyClientApi | null = null;
|
20
|
+
stories: StoriesRaw = {};
|
21
|
+
|
22
|
+
updateStatusListeners: ((update: CreeveyUpdate) => void)[] = [];
|
23
|
+
changeTestListeners: ((testId: string) => void)[] = [];
|
24
|
+
constructor(public storybookApi: API) {
|
25
|
+
this.storybookApi = storybookApi;
|
26
|
+
}
|
27
|
+
initAll = async (): Promise<void> => {
|
28
|
+
this.storybookApi.on(STORY_RENDERED, this.onStoryRendered);
|
29
|
+
this.storybookApi.on(SET_STORIES, this.onSetStories);
|
30
|
+
this.creeveyApi = await initCreeveyClientApi();
|
31
|
+
this.creeveyApi.onUpdate(this.handleCreeveyUpdate);
|
32
|
+
this.status = await this.creeveyApi.status;
|
33
|
+
};
|
34
|
+
|
35
|
+
onUpdateStatus(listener: (update: CreeveyUpdate) => void): () => void {
|
36
|
+
this.updateStatusListeners.push(listener);
|
37
|
+
return () => void (this.updateStatusListeners = this.updateStatusListeners.filter((x) => x != listener));
|
38
|
+
}
|
39
|
+
|
40
|
+
onChangeTest(listener: (testId: string) => void): () => void {
|
41
|
+
this.changeTestListeners.push(listener);
|
42
|
+
return () => void (this.changeTestListeners = this.changeTestListeners.filter((x) => x != listener));
|
43
|
+
}
|
44
|
+
|
45
|
+
handleCreeveyUpdate = (update: CreeveyUpdate): void => {
|
46
|
+
const { tests, removedTests = [], isRunning } = update;
|
47
|
+
if (isDefined(isRunning)) {
|
48
|
+
this.status.isRunning = isRunning;
|
49
|
+
}
|
50
|
+
if (isDefined(tests)) {
|
51
|
+
const prevTests = this.status.tests;
|
52
|
+
const prevStories = this.stories;
|
53
|
+
Object.values(tests)
|
54
|
+
.filter(isDefined)
|
55
|
+
.forEach((update) => {
|
56
|
+
const { id, skip, status, results, approved, storyId } = update;
|
57
|
+
const test = prevTests[id];
|
58
|
+
if (!test) {
|
59
|
+
return (prevTests[id] = update);
|
60
|
+
}
|
61
|
+
if (isDefined(skip)) test.skip = skip;
|
62
|
+
if (isDefined(status)) {
|
63
|
+
test.status = status;
|
64
|
+
if (isDefined(storyId) && isDefined(prevStories[storyId])) {
|
65
|
+
const story = prevStories[storyId];
|
66
|
+
const storyStatus = this.getStoryTests(storyId);
|
67
|
+
const oldStatus = storyStatus
|
68
|
+
.map((x) => (x.id === id ? status : x.status))
|
69
|
+
.reduce((oldStatus, newStatus) => calcStatus(oldStatus, newStatus), undefined);
|
70
|
+
|
71
|
+
story.name = this.addStatusToStoryName(story.name, calcStatus(oldStatus, status), skip ?? false);
|
72
|
+
}
|
73
|
+
}
|
74
|
+
if (isDefined(results)) {
|
75
|
+
if (test.results) test.results.push(...results);
|
76
|
+
else test.results = results;
|
77
|
+
}
|
78
|
+
if (isDefined(approved)) {
|
79
|
+
Object.entries(approved).forEach(
|
80
|
+
([image, retry]) => retry !== undefined && ((test.approved = test.approved ?? {})[image] = retry),
|
81
|
+
);
|
82
|
+
}
|
83
|
+
});
|
84
|
+
const nextTests: Partial<Record<string, TestData>> = {};
|
85
|
+
const testsToRemove = new Set(removedTests.map(({ id }) => id));
|
86
|
+
|
87
|
+
for (const id in prevTests) {
|
88
|
+
if (testsToRemove.has(id)) continue;
|
89
|
+
nextTests[id] = prevTests[id];
|
90
|
+
}
|
91
|
+
|
92
|
+
this.status.tests = nextTests;
|
93
|
+
this.stories = prevStories;
|
94
|
+
this.setPanelsTitle();
|
95
|
+
// TODO Check setStories method in 6.x and migrate properly
|
96
|
+
this.storybookApi.emit(SET_STORIES, this.stories);
|
97
|
+
}
|
98
|
+
this.updateStatusListeners.forEach((x) => {
|
99
|
+
x(update);
|
100
|
+
});
|
101
|
+
};
|
102
|
+
|
103
|
+
getCurrentTest = (): TestData | undefined => {
|
104
|
+
return this.status.tests[this.selectedTestId];
|
105
|
+
};
|
106
|
+
|
107
|
+
onStoryRendered = (storyId: string): void => {
|
108
|
+
if (this.storyId === '') this.addStatusesToSideBar();
|
109
|
+
if (this.storyId !== storyId) {
|
110
|
+
this.storyId = storyId;
|
111
|
+
this.selectedTestId = this.getTestsByStoryIdAndBrowser(this.activeBrowser)[0]?.id ?? '';
|
112
|
+
this.setPanelsTitle();
|
113
|
+
this.changeTestListeners.forEach((x) => {
|
114
|
+
x(this.selectedTestId);
|
115
|
+
});
|
116
|
+
}
|
117
|
+
};
|
118
|
+
|
119
|
+
onStart = (): void => {
|
120
|
+
this.creeveyApi?.start([this.selectedTestId]);
|
121
|
+
};
|
122
|
+
|
123
|
+
onStop = (): void => {
|
124
|
+
this.creeveyApi?.stop();
|
125
|
+
};
|
126
|
+
|
127
|
+
onImageApprove = (id: string, retry: number, image: string): void => this.creeveyApi?.approve(id, retry, image);
|
128
|
+
|
129
|
+
onStartAllStoryTests = (): void => {
|
130
|
+
const ids: string[] = Object.values(this.status.tests)
|
131
|
+
.filter(isDefined)
|
132
|
+
.filter((x) => x.storyId === this.storyId)
|
133
|
+
.map((x) => x.id);
|
134
|
+
this.creeveyApi?.start(ids);
|
135
|
+
};
|
136
|
+
|
137
|
+
onStartAllTests = (): void => {
|
138
|
+
const ids = Object.values(this.status.tests)
|
139
|
+
.filter(isDefined)
|
140
|
+
.map((x) => x.id);
|
141
|
+
this.creeveyApi?.start(ids);
|
142
|
+
};
|
143
|
+
onSetStories = (data: Parameters<typeof denormalizeStoryParameters>['0']): void => {
|
144
|
+
const stories = data.v ? denormalizeStoryParameters(data) : data.stories;
|
145
|
+
this.stories = stories;
|
146
|
+
};
|
147
|
+
|
148
|
+
setActiveBrowser = (browser: string): void => {
|
149
|
+
this.activeBrowser = browser;
|
150
|
+
this.selectedTestId = this.getTestsByStoryIdAndBrowser(this.activeBrowser)[0]?.id ?? '';
|
151
|
+
this.changeTestListeners.forEach((x) => {
|
152
|
+
x(this.selectedTestId);
|
153
|
+
});
|
154
|
+
};
|
155
|
+
|
156
|
+
setSelectedTestId = (testId: string): void => {
|
157
|
+
this.selectedTestId = testId;
|
158
|
+
this.changeTestListeners.forEach((x) => {
|
159
|
+
x(this.selectedTestId);
|
160
|
+
});
|
161
|
+
};
|
162
|
+
|
163
|
+
getStoryTests = (storyId: string): TestData[] => {
|
164
|
+
return Object.values(this.status.tests)
|
165
|
+
.filter((result) => result?.storyId === storyId)
|
166
|
+
.filter(isDefined);
|
167
|
+
};
|
168
|
+
|
169
|
+
getBrowsers = (): string[] => {
|
170
|
+
return this.status.browsers;
|
171
|
+
};
|
172
|
+
|
173
|
+
getTestsByStoryIdAndBrowser = (browser: string): TestData[] => {
|
174
|
+
return Object.values(this.status.tests)
|
175
|
+
.filter((x) => x?.browser === browser && x.storyId === this.storyId)
|
176
|
+
.filter(isDefined);
|
177
|
+
};
|
178
|
+
|
179
|
+
getTabTitle = (browser: string): string => {
|
180
|
+
const tests = this.getTestsByStoryIdAndBrowser(browser);
|
181
|
+
const browserStatus = tests
|
182
|
+
.map((x) => x.status)
|
183
|
+
.reduce((oldStatus, newStatus) => calcStatus(oldStatus, newStatus), undefined);
|
184
|
+
const browserSkip = tests.length > 0 ? tests.every((x) => x.skip) : false;
|
185
|
+
const emojiStatus = getEmojiByTestStatus(browserStatus, browserSkip);
|
186
|
+
return `${emojiStatus ? `${emojiStatus} ` : ''}Creevey/${browser}`;
|
187
|
+
};
|
188
|
+
|
189
|
+
setPanelsTitle = (): void => {
|
190
|
+
const panels = this.storybookApi.getElements(Addon_TypesEnum.PANEL);
|
191
|
+
let firstPanelBrowser = this.activeBrowser;
|
192
|
+
for (const p in panels) {
|
193
|
+
const panel = panels[p];
|
194
|
+
if (panel.id?.indexOf(ADDON_ID) === 0 && panel.paramKey) {
|
195
|
+
panel.title = this.getTabTitle(panel.paramKey);
|
196
|
+
if (!firstPanelBrowser) firstPanelBrowser = panel.paramKey;
|
197
|
+
}
|
198
|
+
}
|
199
|
+
this.storybookApi.setSelectedPanel(`${ADDON_ID}/panel/${firstPanelBrowser}`);
|
200
|
+
};
|
201
|
+
|
202
|
+
addStatusesToSideBar(): void {
|
203
|
+
if (!Object.keys(this.stories).length) return;
|
204
|
+
|
205
|
+
const stories = this.stories;
|
206
|
+
Object.keys(this.stories).forEach((storyId) => {
|
207
|
+
const storyStatus = this.getStoryTests(storyId);
|
208
|
+
const status = storyStatus
|
209
|
+
.map((x) => x.status)
|
210
|
+
.reduce((oldStatus, newStatus) => calcStatus(oldStatus, newStatus), undefined);
|
211
|
+
const skip = storyStatus.length > 0 ? storyStatus.every((x) => x.skip) : false;
|
212
|
+
this.stories[storyId].name = this.addStatusToStoryName(stories[storyId].name, status, skip);
|
213
|
+
});
|
214
|
+
|
215
|
+
// TODO Check setStories method in 6.x and migrate properly
|
216
|
+
this.storybookApi.emit(SET_STORIES, this.stories);
|
217
|
+
}
|
218
|
+
|
219
|
+
addStatusToStoryName(name: string, status: TestStatus | undefined, skip: string | boolean): string {
|
220
|
+
name = name.replace(/^(❌|✔|🟡|🕗|⏸) /, '');
|
221
|
+
const emojiStatus = getEmojiByTestStatus(status, skip);
|
222
|
+
return `${emojiStatus ? `${emojiStatus} ` : ''} ${name}`;
|
223
|
+
}
|
224
|
+
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { API } from '@storybook/api';
|
3
|
+
import { addons, types } from '@storybook/manager-api';
|
4
|
+
import { Addon } from './components/Addon.js';
|
5
|
+
import { Tools } from './components/Tools.js';
|
6
|
+
import { CreeveyController, ADDON_ID } from './controller.js';
|
7
|
+
|
8
|
+
// TODO Take api from `import { useGlobals, useStorybookApi } from '@storybook/manager-api';`
|
9
|
+
addons.register(ADDON_ID, (api) => {
|
10
|
+
void registerCreeveyPanels(api);
|
11
|
+
});
|
12
|
+
|
13
|
+
async function registerCreeveyPanels(storybookApi: API): Promise<void> {
|
14
|
+
const controller = new CreeveyController(storybookApi);
|
15
|
+
|
16
|
+
addons.add(`${ADDON_ID}/panel/run`, {
|
17
|
+
title: `Creevey/Run`,
|
18
|
+
match: ({ viewMode }) => !!(viewMode && /^story$/.exec(viewMode)),
|
19
|
+
type: types.TOOL,
|
20
|
+
|
21
|
+
render: () => React.createElement(Tools, { controller }),
|
22
|
+
});
|
23
|
+
await controller.initAll();
|
24
|
+
const browsers = controller.getBrowsers();
|
25
|
+
|
26
|
+
browsers.forEach((browser) => {
|
27
|
+
const panelId = `${ADDON_ID}/panel/${browser}`;
|
28
|
+
const title = controller.getTabTitle(browser);
|
29
|
+
addons.add(panelId, {
|
30
|
+
title,
|
31
|
+
type: types.PANEL,
|
32
|
+
paramKey: browser,
|
33
|
+
|
34
|
+
// NOTE key = PANEL_ID needs to correct render button in addons panel
|
35
|
+
|
36
|
+
render: ({ active }) =>
|
37
|
+
React.createElement(Addon, {
|
38
|
+
active,
|
39
|
+
controller,
|
40
|
+
browser,
|
41
|
+
}),
|
42
|
+
});
|
43
|
+
});
|
44
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import { TestStatus } from '../../types.js';
|
2
|
+
|
3
|
+
export function getEmojiByTestStatus(status: TestStatus | undefined, skip: string | boolean = false): string {
|
4
|
+
switch (status) {
|
5
|
+
case 'failed': {
|
6
|
+
return '❌';
|
7
|
+
}
|
8
|
+
case 'success': {
|
9
|
+
return '✔';
|
10
|
+
}
|
11
|
+
case 'running': {
|
12
|
+
return '🟡';
|
13
|
+
}
|
14
|
+
case 'pending': {
|
15
|
+
return '🕗';
|
16
|
+
}
|
17
|
+
default: {
|
18
|
+
if (skip) return '⏸';
|
19
|
+
return '';
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
export const isInternetExplorer = navigator.userAgent.includes('Trident/');
|