creevey 0.9.0-beta.1 → 0.9.0-beta.2

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.
Files changed (145) hide show
  1. package/lib/cjs/cli.js +5 -0
  2. package/lib/cjs/client/addon/Manager.js +412 -0
  3. package/lib/cjs/client/addon/components/Addon.js +76 -0
  4. package/lib/cjs/client/addon/components/Icons.js +42 -0
  5. package/lib/cjs/client/addon/components/Panel.js +68 -0
  6. package/lib/cjs/client/addon/components/TestSelect.js +63 -0
  7. package/lib/cjs/client/addon/components/Tools.js +114 -0
  8. package/lib/cjs/client/addon/decorator.js +11 -0
  9. package/lib/cjs/client/addon/preset.js +81 -0
  10. package/lib/cjs/client/addon/readyForCapture.js +12 -0
  11. package/lib/cjs/client/addon/register.js +96 -0
  12. package/lib/cjs/client/addon/utils.js +38 -0
  13. package/lib/cjs/client/addon/withCreevey.js +531 -0
  14. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +85 -0
  15. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +88 -0
  16. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +176 -0
  17. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +179 -0
  18. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +110 -0
  19. package/lib/cjs/client/shared/components/ImagesView/index.js +45 -0
  20. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +46 -0
  21. package/lib/cjs/client/shared/components/PageFooter/Paging.js +98 -0
  22. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +78 -0
  23. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +144 -0
  24. package/lib/cjs/client/shared/components/ResultsPage.js +173 -0
  25. package/lib/cjs/client/shared/creeveyClientApi.js +103 -0
  26. package/lib/cjs/client/shared/helpers.js +482 -0
  27. package/lib/cjs/client/shared/viewMode.js +17 -0
  28. package/lib/cjs/client/web/index.html +19 -0
  29. package/lib/cjs/creevey.js +71 -0
  30. package/lib/cjs/index.js +62 -0
  31. package/lib/cjs/server/config.js +96 -0
  32. package/lib/cjs/server/docker.js +150 -0
  33. package/lib/cjs/server/extract.js +50 -0
  34. package/lib/cjs/server/index.js +83 -0
  35. package/lib/cjs/server/loaders/babel/creevey-plugin.js +88 -0
  36. package/lib/cjs/server/loaders/babel/helpers.js +479 -0
  37. package/lib/cjs/server/loaders/babel/register.js +126 -0
  38. package/lib/cjs/server/loaders/hooks/mdx.js +30 -0
  39. package/lib/cjs/server/loaders/hooks/svelte.js +65 -0
  40. package/lib/cjs/server/loaders/webpack/compile.js +286 -0
  41. package/lib/cjs/server/loaders/webpack/creevey-loader.js +174 -0
  42. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +44 -0
  43. package/lib/cjs/server/loaders/webpack/mdx-loader.js +72 -0
  44. package/lib/cjs/server/loaders/webpack/start.js +41 -0
  45. package/lib/cjs/server/logger.js +47 -0
  46. package/lib/cjs/server/master/api.js +71 -0
  47. package/lib/cjs/server/master/index.js +146 -0
  48. package/lib/cjs/server/master/master.js +57 -0
  49. package/lib/cjs/server/master/pool.js +206 -0
  50. package/lib/cjs/server/master/runner.js +294 -0
  51. package/lib/cjs/server/master/server.js +129 -0
  52. package/lib/cjs/server/messages.js +266 -0
  53. package/lib/cjs/server/selenium/browser.js +680 -0
  54. package/lib/cjs/server/selenium/index.js +31 -0
  55. package/lib/cjs/server/selenium/selenoid.js +174 -0
  56. package/lib/cjs/server/stories.js +170 -0
  57. package/lib/cjs/server/storybook/entry.js +68 -0
  58. package/lib/cjs/server/storybook/helpers.js +165 -0
  59. package/lib/cjs/server/storybook/providers/browser.js +78 -0
  60. package/lib/cjs/server/storybook/providers/hybrid.js +84 -0
  61. package/lib/cjs/server/storybook/providers/nodejs.js +239 -0
  62. package/lib/cjs/server/testsFiles/parser.js +72 -0
  63. package/lib/cjs/server/testsFiles/register.js +48 -0
  64. package/lib/cjs/server/update.js +83 -0
  65. package/lib/cjs/server/utils.js +185 -0
  66. package/lib/cjs/server/worker/chai-image.js +142 -0
  67. package/lib/cjs/server/worker/helpers.js +69 -0
  68. package/lib/cjs/server/worker/index.js +15 -0
  69. package/lib/cjs/server/worker/reporter.js +120 -0
  70. package/lib/cjs/server/worker/worker.js +278 -0
  71. package/lib/cjs/shared.js +124 -0
  72. package/lib/cjs/types.js +74 -0
  73. package/lib/esm/cli.js +4 -0
  74. package/lib/esm/client/addon/Manager.js +396 -0
  75. package/lib/esm/client/addon/components/Addon.js +58 -0
  76. package/lib/esm/client/addon/components/Icons.js +27 -0
  77. package/lib/esm/client/addon/components/Panel.js +49 -0
  78. package/lib/esm/client/addon/components/TestSelect.js +49 -0
  79. package/lib/esm/client/addon/components/Tools.js +91 -0
  80. package/lib/esm/client/addon/decorator.js +2 -0
  81. package/lib/esm/client/addon/preset.js +56 -0
  82. package/lib/esm/client/addon/readyForCapture.js +5 -0
  83. package/lib/esm/client/addon/register.js +75 -0
  84. package/lib/esm/client/addon/utils.js +31 -0
  85. package/lib/esm/client/addon/withCreevey.js +509 -0
  86. package/lib/esm/client/shared/components/ImagesView/BlendView.js +63 -0
  87. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +65 -0
  88. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +151 -0
  89. package/lib/esm/client/shared/components/ImagesView/SlideView.js +154 -0
  90. package/lib/esm/client/shared/components/ImagesView/SwapView.js +88 -0
  91. package/lib/esm/client/shared/components/ImagesView/index.js +5 -0
  92. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +32 -0
  93. package/lib/esm/client/shared/components/PageFooter/Paging.js +84 -0
  94. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +64 -0
  95. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +120 -0
  96. package/lib/esm/client/shared/components/ResultsPage.js +143 -0
  97. package/lib/esm/client/shared/creeveyClientApi.js +94 -0
  98. package/lib/esm/client/shared/helpers.js +424 -0
  99. package/lib/esm/client/shared/viewMode.js +6 -0
  100. package/lib/esm/creevey.js +56 -0
  101. package/lib/esm/index.js +7 -0
  102. package/lib/esm/server/config.js +73 -0
  103. package/lib/esm/server/docker.js +123 -0
  104. package/lib/esm/server/extract.js +34 -0
  105. package/lib/esm/server/index.js +64 -0
  106. package/lib/esm/server/loaders/babel/creevey-plugin.js +74 -0
  107. package/lib/esm/server/loaders/babel/helpers.js +462 -0
  108. package/lib/esm/server/loaders/babel/register.js +105 -0
  109. package/lib/esm/server/loaders/hooks/mdx.js +15 -0
  110. package/lib/esm/server/loaders/hooks/svelte.js +49 -0
  111. package/lib/esm/server/loaders/webpack/compile.js +263 -0
  112. package/lib/esm/server/loaders/webpack/creevey-loader.js +153 -0
  113. package/lib/esm/server/loaders/webpack/dummy-hmr.js +36 -0
  114. package/lib/esm/server/loaders/webpack/mdx-loader.js +58 -0
  115. package/lib/esm/server/loaders/webpack/start.js +27 -0
  116. package/lib/esm/server/logger.js +20 -0
  117. package/lib/esm/server/master/api.js +60 -0
  118. package/lib/esm/server/master/index.js +125 -0
  119. package/lib/esm/server/master/master.js +38 -0
  120. package/lib/esm/server/master/pool.js +187 -0
  121. package/lib/esm/server/master/runner.js +272 -0
  122. package/lib/esm/server/master/server.js +105 -0
  123. package/lib/esm/server/messages.js +234 -0
  124. package/lib/esm/server/selenium/browser.js +647 -0
  125. package/lib/esm/server/selenium/index.js +2 -0
  126. package/lib/esm/server/selenium/selenoid.js +151 -0
  127. package/lib/esm/server/stories.js +151 -0
  128. package/lib/esm/server/storybook/entry.js +44 -0
  129. package/lib/esm/server/storybook/helpers.js +106 -0
  130. package/lib/esm/server/storybook/providers/browser.js +61 -0
  131. package/lib/esm/server/storybook/providers/hybrid.js +64 -0
  132. package/lib/esm/server/storybook/providers/nodejs.js +217 -0
  133. package/lib/esm/server/testsFiles/parser.js +50 -0
  134. package/lib/esm/server/testsFiles/register.js +35 -0
  135. package/lib/esm/server/update.js +65 -0
  136. package/lib/esm/server/utils.js +146 -0
  137. package/lib/esm/server/worker/chai-image.js +130 -0
  138. package/lib/esm/server/worker/helpers.js +60 -0
  139. package/lib/esm/server/worker/index.js +1 -0
  140. package/lib/esm/server/worker/reporter.js +98 -0
  141. package/lib/esm/server/worker/worker.js +248 -0
  142. package/lib/esm/shared.js +93 -0
  143. package/lib/esm/types.js +43 -0
  144. package/lib/types/index.d.ts +2 -4
  145. package/package.json +1 -1
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _browser = require("./browser");
8
+
9
+ Object.keys(_browser).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _browser[key]) return;
12
+ Object.defineProperty(exports, key, {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _browser[key];
16
+ }
17
+ });
18
+ });
19
+
20
+ var _selenoid = require("./selenoid");
21
+
22
+ Object.keys(_selenoid).forEach(function (key) {
23
+ if (key === "default" || key === "__esModule") return;
24
+ if (key in exports && exports[key] === _selenoid[key]) return;
25
+ Object.defineProperty(exports, key, {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _selenoid[key];
29
+ }
30
+ });
31
+ });
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.startSelenoidStandalone = startSelenoidStandalone;
7
+ exports.startSelenoidContainer = startSelenoidContainer;
8
+
9
+ var _path = _interopRequireDefault(require("path"));
10
+
11
+ var _util = require("util");
12
+
13
+ var _fs = require("fs");
14
+
15
+ var _utils = require("../utils");
16
+
17
+ var _docker = require("../docker");
18
+
19
+ var _core = require("@octokit/core");
20
+
21
+ var _messages = require("../messages");
22
+
23
+ var _cluster = require("cluster");
24
+
25
+ var _shelljs = require("shelljs");
26
+
27
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
28
+
29
+ const mkdirAsync = (0, _util.promisify)(_fs.mkdir);
30
+ const writeFileAsync = (0, _util.promisify)(_fs.writeFile);
31
+ const copyFileAsync = (0, _util.promisify)(_fs.copyFile);
32
+
33
+ async function createSelenoidConfig(browsers, {
34
+ useDocker
35
+ }) {
36
+ const selenoidConfig = {};
37
+
38
+ const selenoidConfigDir = _path.default.join((0, _utils.getCreeveyCache)(), 'selenoid');
39
+
40
+ browsers.forEach(({
41
+ browserName,
42
+ version = 'latest',
43
+ dockerImage = `selenoid/${browserName}:${version}`,
44
+ webdriverCommand = []
45
+ }) => {
46
+ if (!selenoidConfig[browserName]) selenoidConfig[browserName] = {
47
+ default: version,
48
+ versions: {}
49
+ };
50
+ if (!useDocker && webdriverCommand.length == 0) throw new Error('Please specify "webdriverCommand" browser option with path to browser webdriver');
51
+ selenoidConfig[browserName].versions[version] = {
52
+ image: useDocker ? dockerImage : webdriverCommand,
53
+ port: '4444',
54
+ path: !useDocker || ['chrome', 'opera', 'webkit', 'MicrosoftEdge'].includes(browserName) ? '/' : '/wd/hub'
55
+ };
56
+ });
57
+ await mkdirAsync(selenoidConfigDir, {
58
+ recursive: true
59
+ });
60
+ await writeFileAsync(_path.default.join(selenoidConfigDir, 'browsers.json'), JSON.stringify(selenoidConfig));
61
+ return selenoidConfigDir;
62
+ }
63
+
64
+ async function downloadSelenoidBinary(destination) {
65
+ var _assets$find;
66
+
67
+ const platformNameMapping = {
68
+ darwin: 'selenoid_darwin_amd64',
69
+ linux: 'selenoid_linux_amd64',
70
+ win32: 'selenoid_windows_amd64.exe'
71
+ };
72
+ const octokit = new _core.Octokit();
73
+ const response = await octokit.request('GET /repos/{owner}/{repo}/releases/latest', {
74
+ owner: 'aerokube',
75
+ repo: 'selenoid'
76
+ });
77
+ const {
78
+ assets
79
+ } = response.data;
80
+ const {
81
+ browser_download_url: downloadUrl,
82
+ size: binarySize
83
+ } = (_assets$find = assets.find(({
84
+ name
85
+ }) => platformNameMapping[process.platform] == name)) !== null && _assets$find !== void 0 ? _assets$find : {};
86
+ if ((0, _fs.existsSync)(destination) && (0, _fs.lstatSync)(destination).size == binarySize) return;
87
+
88
+ if (!downloadUrl) {
89
+ throw new Error(`Couldn't get download url for selenoid binary. Please download it manually from "https://github.com/aerokube/selenoid/releases/latest" and define "selenoidPath" option in the Creevey config`);
90
+ }
91
+
92
+ return (0, _utils.downloadBinary)(downloadUrl, destination);
93
+ }
94
+
95
+ async function startSelenoidStandalone(config, debug) {
96
+ config.gridUrl = 'http://localhost:4444/wd/hub';
97
+ if (_cluster.isWorker) return;
98
+ const browsers = Object.values(config.browsers).filter(browser => !browser.gridUrl);
99
+ const selenoidConfigDir = await createSelenoidConfig(browsers, {
100
+ useDocker: false
101
+ });
102
+
103
+ const binaryPath = _path.default.join(selenoidConfigDir, process.platform == 'win32' ? 'selenoid.exe' : 'selenoid');
104
+
105
+ if (config.selenoidPath) {
106
+ await copyFileAsync(_path.default.resolve(config.selenoidPath), binaryPath);
107
+ } else {
108
+ await downloadSelenoidBinary(binaryPath);
109
+ } // TODO Download browser webdrivers
110
+
111
+
112
+ try {
113
+ if (process.platform != 'win32') (0, _shelljs.chmod)('+x', binaryPath);
114
+ } catch (_) {
115
+ /* noop */
116
+ }
117
+
118
+ const selenoidProcess = (0, _shelljs.exec)(`${binaryPath} -conf ./browsers.json -disable-docker`, {
119
+ async: true,
120
+ cwd: selenoidConfigDir
121
+ });
122
+
123
+ if (debug) {
124
+ var _selenoidProcess$stdo, _selenoidProcess$stde;
125
+
126
+ (_selenoidProcess$stdo = selenoidProcess.stdout) === null || _selenoidProcess$stdo === void 0 ? void 0 : _selenoidProcess$stdo.pipe(process.stdout);
127
+ (_selenoidProcess$stde = selenoidProcess.stderr) === null || _selenoidProcess$stde === void 0 ? void 0 : _selenoidProcess$stde.pipe(process.stderr);
128
+ }
129
+
130
+ (0, _messages.subscribeOn)('shutdown', () => selenoidProcess.kill());
131
+ }
132
+
133
+ async function startSelenoidContainer(config, debug) {
134
+ const browsers = Object.values(config.browsers).filter(browser => !browser.gridUrl);
135
+ const images = [];
136
+ let limit = 0;
137
+ browsers.forEach(({
138
+ browserName,
139
+ version = 'latest',
140
+ limit: browserLimit = 1,
141
+ dockerImage = `selenoid/${browserName}:${version}`
142
+ }) => {
143
+ limit += browserLimit;
144
+ images.push(dockerImage);
145
+ });
146
+ const selenoidImage = config.dockerImage;
147
+ const pullOptions = {
148
+ auth: config.dockerAuth,
149
+ platform: config.dockerImagePlatform
150
+ };
151
+
152
+ if (config.pullImages) {
153
+ await (0, _docker.pullImages)([selenoidImage], pullOptions);
154
+ await (0, _docker.pullImages)(images, pullOptions);
155
+ } // TODO Allow pass custom options
156
+
157
+
158
+ const selenoidOptions = {
159
+ ExposedPorts: {
160
+ '4444/tcp': {}
161
+ },
162
+ HostConfig: {
163
+ PortBindings: {
164
+ '4444/tcp': [{
165
+ HostPort: '4444'
166
+ }]
167
+ },
168
+ Binds: ['/var/run/docker.sock:/var/run/docker.sock', `${await createSelenoidConfig(browsers, {
169
+ useDocker: true
170
+ })}:/etc/selenoid/:ro`]
171
+ }
172
+ };
173
+ return (0, _docker.runImage)(selenoidImage, ['-limit', String(limit)], selenoidOptions, debug);
174
+ }
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.loadTestsFromStories = loadTestsFromStories;
7
+ exports.saveStoriesJson = saveStoriesJson;
8
+ exports.saveTestsJson = saveTestsJson;
9
+
10
+ var _path = _interopRequireDefault(require("path"));
11
+
12
+ var _fs = require("fs");
13
+
14
+ var _crypto = require("crypto");
15
+
16
+ var _lodash = require("lodash");
17
+
18
+ var _types = require("../types");
19
+
20
+ var _utils = require("./utils");
21
+
22
+ var _helpers = require("./storybook/helpers");
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ function storyTestFabric(delay, testFn) {
27
+ return async function storyTest() {
28
+ var _testFn$call;
29
+
30
+ delay ? await new Promise(resolve => setTimeout(resolve, delay)) : void 0;
31
+ await ((_testFn$call = testFn === null || testFn === void 0 ? void 0 : testFn.call(this)) !== null && _testFn$call !== void 0 ? _testFn$call : this.screenshots.length > 0 ? this.expect(this.screenshots.reduce((screenshots, {
32
+ imageName,
33
+ screenshot
34
+ }, index) => ({ ...screenshots,
35
+ [imageName !== null && imageName !== void 0 ? imageName : `screenshot_${index}`]: screenshot
36
+ }), {})).to.matchImages() : this.expect(await this.takeScreenshot()).to.matchImage());
37
+ };
38
+ }
39
+
40
+ function createCreeveyTest(browser, storyMeta, skipOptions, testName) {
41
+ const {
42
+ kind,
43
+ name: story,
44
+ id: storyId
45
+ } = storyMeta;
46
+ const path = [kind, story, testName, browser].filter(_types.isDefined);
47
+ const skip = skipOptions ? (0, _utils.shouldSkip)(browser, {
48
+ kind,
49
+ story
50
+ }, skipOptions, testName) : false;
51
+ const id = (0, _crypto.createHash)('sha1').update(path.join('/')).digest('hex');
52
+ return {
53
+ id,
54
+ skip,
55
+ browser,
56
+ testName,
57
+ storyPath: [...kind.split('/').map(x => x.trim()), story],
58
+ storyId
59
+ };
60
+ }
61
+
62
+ function convertStories(browserName, stories) {
63
+ const tests = {};
64
+ (Array.isArray(stories) ? stories : Object.values(stories)).forEach(storyMeta => {
65
+ var _storyMeta$parameters;
66
+
67
+ // TODO Skip docsOnly stories for now
68
+ if (storyMeta.parameters.docsOnly) return;
69
+ const {
70
+ delay: delayParam,
71
+ tests: storyTests,
72
+ skip
73
+ } = (_storyMeta$parameters = storyMeta.parameters.creevey) !== null && _storyMeta$parameters !== void 0 ? _storyMeta$parameters : {};
74
+ const delay = typeof delayParam == 'number' ? delayParam : delayParam !== null && delayParam !== void 0 && delayParam.for.includes(browserName) ? delayParam.ms : 0; // typeof tests === "undefined" => rootSuite -> kindSuite -> storyTest -> [browsers.png]
75
+ // typeof tests === "function" => rootSuite -> kindSuite -> storyTest -> browser -> [images.png]
76
+ // typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> [browsers.png]
77
+ // typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> browser -> [images.png]
78
+
79
+ if (!storyTests) {
80
+ const test = createCreeveyTest(browserName, storyMeta, skip);
81
+ tests[test.id] = { ...test,
82
+ storyId: storyMeta.id,
83
+ story: storyMeta,
84
+ fn: storyTestFabric(delay)
85
+ };
86
+ return;
87
+ }
88
+
89
+ Object.entries(storyTests).forEach(([testName, testFn]) => {
90
+ const test = createCreeveyTest(browserName, storyMeta, skip, testName);
91
+ tests[test.id] = { ...test,
92
+ storyId: storyMeta.id,
93
+ story: storyMeta,
94
+ fn: storyTestFabric(delay, testFn)
95
+ };
96
+ });
97
+ });
98
+ return tests;
99
+ }
100
+
101
+ async function loadTestsFromStories(browsers, provider, update) {
102
+ const testIdsByFiles = new Map();
103
+ const stories = await provider(storiesByFiles => {
104
+ const testsDiff = {};
105
+ const tests = {};
106
+ browsers.forEach(browser => {
107
+ Array.from(storiesByFiles.entries()).forEach(([filename, stories]) => {
108
+ var _testIdsByFiles$get$f, _testIdsByFiles$get;
109
+
110
+ Object.assign(tests, convertStories(browser, stories));
111
+ const changed = Object.keys(tests);
112
+ const removed = (_testIdsByFiles$get$f = (_testIdsByFiles$get = testIdsByFiles.get(filename)) === null || _testIdsByFiles$get === void 0 ? void 0 : _testIdsByFiles$get.filter(testId => !tests[testId])) !== null && _testIdsByFiles$get$f !== void 0 ? _testIdsByFiles$get$f : [];
113
+ if (changed.length == 0) testIdsByFiles.delete(filename);else testIdsByFiles.set(filename, changed);
114
+ Object.assign(testsDiff, tests);
115
+ removed.forEach(testId => testsDiff[testId] = undefined);
116
+ });
117
+ });
118
+ update === null || update === void 0 ? void 0 : update(testsDiff);
119
+ });
120
+ const tests = browsers.reduce((tests, browser) => Object.assign(tests, convertStories(browser, stories)), {});
121
+ Object.values(tests).filter(_types.isDefined).forEach(({
122
+ id,
123
+ story: {
124
+ parameters: {
125
+ fileName
126
+ }
127
+ }
128
+ }) => {
129
+ var _testIdsByFiles$get2;
130
+
131
+ return (// TODO Don't use filename as a key, due possible collisions if two require.context with same structure of modules are defined
132
+ testIdsByFiles.set(fileName, [...((_testIdsByFiles$get2 = testIdsByFiles.get(fileName)) !== null && _testIdsByFiles$get2 !== void 0 ? _testIdsByFiles$get2 : []), id])
133
+ );
134
+ });
135
+ return tests;
136
+ }
137
+
138
+ function saveStoriesJson(storiesData, extract) {
139
+ var _storiesData$stories;
140
+
141
+ const outputDir = typeof extract == 'boolean' ? 'storybook-static' : extract;
142
+
143
+ if (!(0, _helpers.isStorybookVersionLessThan)(6)) {
144
+ // NOTE Copy-pasted from Storybook's `getStoriesJsonData` method
145
+ const allowed = ['fileName', 'docsOnly', 'framework', '__id', '__isArgsStory'];
146
+ storiesData.globalParameters = (0, _lodash.pick)(storiesData.globalParameters, allowed); // @ts-expect-error ignore error
147
+
148
+ storiesData.kindParameters = (0, _lodash.mapValues)(storiesData.kindParameters, v => (0, _lodash.pick)(v, allowed)); // @ts-expect-error ignore error
149
+
150
+ storiesData.stories = (0, _lodash.mapValues)(storiesData.stories, v => ({ ...(0, _lodash.pick)(v, ['id', 'name', 'kind', 'story']),
151
+ parameters: (0, _lodash.pick)(v.parameters, allowed)
152
+ }));
153
+ } // TODO Fix args stories
154
+
155
+
156
+ (0, _utils.removeProps)(storiesData !== null && storiesData !== void 0 ? storiesData : {}, ['stories', () => true, 'parameters', '__isArgsStory']);
157
+ Object.values((_storiesData$stories = storiesData === null || storiesData === void 0 ? void 0 : storiesData.stories) !== null && _storiesData$stories !== void 0 ? _storiesData$stories : {}).forEach(story => (0, _types.isObject)(story) && 'parameters' in story && (0, _types.isObject)(story.parameters) && delete story.parameters.__isArgsStory);
158
+ (0, _fs.mkdirSync)(outputDir, {
159
+ recursive: true
160
+ });
161
+ (0, _fs.writeFileSync)(_path.default.join(outputDir, 'stories.json'), JSON.stringify(storiesData, null, 2));
162
+ }
163
+
164
+ function saveTestsJson(tests, dstPath = process.cwd()) {
165
+ (0, _fs.mkdirSync)(dstPath, {
166
+ recursive: true
167
+ });
168
+ (0, _fs.writeFileSync)(_path.default.join(dstPath, 'tests.json'), // eslint-disable-next-line @typescript-eslint/no-unsafe-return
169
+ JSON.stringify(tests, (_, value) => (0, _types.isFunction)(value) ? value.toString() : value, 2));
170
+ }
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.raw = exports.getStorybook = exports.setAddon = exports.clearDecorators = exports.addParameters = exports.addDecorator = exports.configure = exports.storiesOf = exports.forceReRender = exports.clientApi = exports.channel = void 0;
7
+
8
+ var _addons = require("@storybook/addons");
9
+
10
+ var _helpers = require("./helpers");
11
+
12
+ var _api$channel, _api$context;
13
+
14
+ const framework = (0, _helpers.getStorybookFramework)(); // eslint-disable-next-line @typescript-eslint/no-var-requires
15
+
16
+ const core = require((0, _helpers.resolveFromStorybook)('@storybook/core')); //@ts-expect-error: 6.2 use named exports
17
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
18
+
19
+
20
+ const start = (0, _helpers.isStorybookVersionLessThan)(6, 2) ? core.default.start : core.start;
21
+ const api = start(() => void 0);
22
+ const channel = (0, _helpers.isStorybookVersionLessThan)(6, 4) ? (_api$channel = api.channel) !== null && _api$channel !== void 0 ? _api$channel : (_api$context = api.context) === null || _api$context === void 0 ? void 0 : _api$context.channel : _addons.addons.getChannel();
23
+ exports.channel = channel;
24
+ const clientApi = api.clientApi;
25
+ exports.clientApi = clientApi;
26
+ const forceReRender = api.forceReRender;
27
+ exports.forceReRender = forceReRender;
28
+
29
+ const storiesOf = (kind, m) => {
30
+ return clientApi.storiesOf(kind, m).addParameters({
31
+ framework
32
+ });
33
+ };
34
+
35
+ exports.storiesOf = storiesOf;
36
+
37
+ const configure = (...args) => {
38
+ if ((0, _helpers.isStorybookVersionLessThan)(5, 2)) {
39
+ //NOTE: Storybook <= 5.1 pass args as is
40
+ //@ts-expect-error: ignore it
41
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
42
+ return api.configApi.configure(...args);
43
+ }
44
+
45
+ if ((0, _helpers.isStorybookVersionLessThan)(6)) {
46
+ //NOTE: Storybook <= 5.3 pass `framework` as last argument
47
+ //@ts-expect-error: ignore it
48
+ return api.configure(...args, framework);
49
+ } //NOTE Storybook 6.x pass `framework` as first argument
50
+ //@ts-expect-error: ignore it
51
+
52
+
53
+ return api.configure(framework, ...args);
54
+ };
55
+
56
+ exports.configure = configure;
57
+ const addDecorator = clientApi.addDecorator;
58
+ exports.addDecorator = addDecorator;
59
+ const addParameters = clientApi.addParameters;
60
+ exports.addParameters = addParameters;
61
+ const clearDecorators = clientApi.clearDecorators;
62
+ exports.clearDecorators = clearDecorators;
63
+ const setAddon = clientApi.setAddon;
64
+ exports.setAddon = setAddon;
65
+ const getStorybook = clientApi.getStorybook;
66
+ exports.getStorybook = getStorybook;
67
+ const raw = clientApi.raw;
68
+ exports.raw = raw;
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.hasDocsAddon = hasDocsAddon;
7
+ exports.hasSvelteCSFAddon = hasSvelteCSFAddon;
8
+ exports.getStorybookVersion = getStorybookVersion;
9
+ exports.isStorybookVersionLessThan = isStorybookVersionLessThan;
10
+ exports.isStorybookVersionGreaterThan = isStorybookVersionGreaterThan;
11
+ exports.isStorybookVersion = isStorybookVersion;
12
+ exports.getStorybookFramework = getStorybookFramework;
13
+ exports.importStorybookConfig = importStorybookConfig;
14
+ exports.isCSFv3Enabled = isCSFv3Enabled;
15
+ exports.storybookConfigRef = exports.importStorybookCoreEvents = exports.importStorybookCoreCommon = exports.importStorybookClientLogger = exports.resolveFromStorybookCoreServer = exports.resolveFromStorybookCore = exports.resolveFromStorybookBuilderWebpack4 = exports.resolveFromStorybookAddonDocs = exports.resolveFromStorybook = exports.storybookDirRef = void 0;
16
+
17
+ var _path = _interopRequireDefault(require("path"));
18
+
19
+ var _resolveFrom = _interopRequireDefault(require("resolve-from"));
20
+
21
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
+
23
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
24
+
25
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
26
+
27
+ const supportedFrameworks = ['react', 'vue', 'vue3', 'angular', 'marionette', 'mithril', 'marko', 'html', 'svelte', 'riot', 'ember', 'preact', 'rax', 'aurelia', 'server', 'web-components'];
28
+ const storybookDirRef = {
29
+ current: _path.default.resolve('.storybook')
30
+ };
31
+ exports.storybookDirRef = storybookDirRef;
32
+
33
+ const resolveFromStorybook = modulePath => (0, _resolveFrom.default)(storybookDirRef.current, modulePath);
34
+
35
+ exports.resolveFromStorybook = resolveFromStorybook;
36
+
37
+ const resolveFromStorybookAddonDocs = modulePath => (0, _resolveFrom.default)(resolveFromStorybook('@storybook/addon-docs'), modulePath);
38
+
39
+ exports.resolveFromStorybookAddonDocs = resolveFromStorybookAddonDocs;
40
+
41
+ const resolveFromStorybookBuilderWebpack4 = modulePath => (0, _resolveFrom.default)(resolveFromStorybook('@storybook/builder-webpack4'), modulePath);
42
+
43
+ exports.resolveFromStorybookBuilderWebpack4 = resolveFromStorybookBuilderWebpack4;
44
+
45
+ const resolveFromStorybookCore = modulePath => (0, _resolveFrom.default)(resolveFromStorybook('@storybook/core'), modulePath);
46
+
47
+ exports.resolveFromStorybookCore = resolveFromStorybookCore;
48
+
49
+ const resolveFromStorybookCoreServer = modulePath => (0, _resolveFrom.default)(resolveFromStorybook('@storybook/core-server'), modulePath);
50
+
51
+ exports.resolveFromStorybookCoreServer = resolveFromStorybookCoreServer;
52
+
53
+ const importFromStorybook = modulePath => Promise.resolve(`${resolveFromStorybook(modulePath)}`).then(s => _interopRequireWildcard(require(s)));
54
+
55
+ const importStorybookClientLogger = () => importFromStorybook('@storybook/client-logger');
56
+
57
+ exports.importStorybookClientLogger = importStorybookClientLogger;
58
+
59
+ const importStorybookCoreCommon = () => importFromStorybook('@storybook/core-common');
60
+
61
+ exports.importStorybookCoreCommon = importStorybookCoreCommon;
62
+
63
+ const importStorybookCoreEvents = () => importFromStorybook('@storybook/core-events');
64
+
65
+ exports.importStorybookCoreEvents = importStorybookCoreEvents;
66
+
67
+ function hasDocsAddon() {
68
+ try {
69
+ resolveFromStorybook('@storybook/addon-docs');
70
+ return true;
71
+ } catch (_) {
72
+ return false;
73
+ }
74
+ }
75
+
76
+ function hasSvelteCSFAddon() {
77
+ try {
78
+ resolveFromStorybook('@storybook/addon-svelte-csf');
79
+ return true;
80
+ } catch (_) {
81
+ return false;
82
+ }
83
+ }
84
+
85
+ function getStorybookVersion() {
86
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
87
+ const {
88
+ version
89
+ } = require(resolveFromStorybook('@storybook/core/package.json'));
90
+
91
+ return version;
92
+ }
93
+
94
+ function isStorybookVersionLessThan(major, minor) {
95
+ var _process$env$__CREEVE;
96
+
97
+ const [sbMajor, sbMinor] = ((_process$env$__CREEVE = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE !== void 0 ? _process$env$__CREEVE : getStorybookVersion()).split('.');
98
+ return Number(sbMajor) < major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) < minor;
99
+ }
100
+
101
+ function isStorybookVersionGreaterThan(major, minor) {
102
+ var _process$env$__CREEVE2;
103
+
104
+ const [sbMajor, sbMinor] = ((_process$env$__CREEVE2 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE2 !== void 0 ? _process$env$__CREEVE2 : getStorybookVersion()).split('.');
105
+ return Number(sbMajor) > major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) > minor;
106
+ }
107
+
108
+ function isStorybookVersion(major, minor) {
109
+ var _process$env$__CREEVE3;
110
+
111
+ const [sbMajor, sbMinor] = ((_process$env$__CREEVE3 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE3 !== void 0 ? _process$env$__CREEVE3 : getStorybookVersion()).split('.');
112
+ return Number(sbMajor) == major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) == minor;
113
+ }
114
+
115
+ function getStorybookFramework() {
116
+ var _process$env$__CREEVE4;
117
+
118
+ const framework = (_process$env$__CREEVE4 = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__) !== null && _process$env$__CREEVE4 !== void 0 ? _process$env$__CREEVE4 : supportedFrameworks.find(framework => {
119
+ try {
120
+ return require.resolve(resolveFromStorybook(`@storybook/${framework}`));
121
+ } catch (_) {
122
+ return false;
123
+ }
124
+ });
125
+ if (!framework) throw new Error("Couldn't detect used Storybook framework. Please ensure that you install `@storybook/<framework>` package");
126
+ return framework;
127
+ }
128
+
129
+ const storybookConfigRef = {
130
+ current: {
131
+ stories: []
132
+ }
133
+ };
134
+ exports.storybookConfigRef = storybookConfigRef;
135
+
136
+ async function importStorybookConfig() {
137
+ const configPath = `${storybookDirRef.current}/main`;
138
+
139
+ try {
140
+ return storybookConfigRef.current = (await Promise.resolve(`${require.resolve(configPath)}`).then(s => _interopRequireWildcard(require(s)))).default;
141
+ } catch (_) {
142
+ const storybookUtilsPath = isStorybookVersionLessThan(6, 2) ? '@storybook/core/dist/server/utils' : '@storybook/core-common/dist/cjs/utils';
143
+ const serverRequireModule = isStorybookVersionLessThan(6, 2) ? 'server-require' : 'interpret-require'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
144
+
145
+ const {
146
+ getInterpretedFile
147
+ } = await Promise.resolve(`${resolveFromStorybook(`${storybookUtilsPath}/interpret-files`)}`).then(s => _interopRequireWildcard(require(s))); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
148
+
149
+ const {
150
+ default: serverRequireFallback,
151
+ serverRequire = serverRequireFallback
152
+ } = await Promise.resolve(`${resolveFromStorybook(`${storybookUtilsPath}/${serverRequireModule}`)}`).then(s => _interopRequireWildcard(require(s))); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
153
+
154
+ const mainConfigFile = isStorybookVersionLessThan(6, 1) ? configPath : // eslint-disable-next-line @typescript-eslint/no-unsafe-call
155
+ getInterpretedFile(configPath); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
156
+
157
+ return storybookConfigRef.current = serverRequire(mainConfigFile);
158
+ }
159
+ }
160
+
161
+ async function isCSFv3Enabled() {
162
+ var _await$importStoryboo, _await$importStoryboo2, _await$importStoryboo3;
163
+
164
+ return (_await$importStoryboo = (_await$importStoryboo2 = await importStorybookConfig()) === null || _await$importStoryboo2 === void 0 ? void 0 : (_await$importStoryboo3 = _await$importStoryboo2.features) === null || _await$importStoryboo3 === void 0 ? void 0 : _await$importStoryboo3.previewCsfV3) !== null && _await$importStoryboo !== void 0 ? _await$importStoryboo : false;
165
+ }