creevey 0.8.0-beta.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -7
- package/README.md +9 -1
- package/addon/README.md +3 -0
- package/addon/package.json +4 -0
- package/docs/config.md +29 -26
- package/jest.config.js +6 -0
- package/lib/cjs/client/addon/Manager.js +122 -271
- package/lib/cjs/client/addon/components/Addon.js +17 -38
- package/lib/cjs/client/addon/components/Icons.js +11 -7
- package/lib/cjs/client/addon/components/Panel.js +17 -13
- package/lib/cjs/client/addon/components/TestSelect.js +11 -9
- package/lib/cjs/client/addon/components/Tools.js +21 -40
- package/lib/cjs/client/addon/decorator.js +1 -1
- package/lib/cjs/client/addon/index.js +31 -0
- package/lib/cjs/client/addon/preset.ie11.js +74 -0
- package/lib/cjs/client/addon/preset.js +13 -31
- package/lib/cjs/client/addon/readyForCapture.js +12 -0
- package/lib/cjs/client/addon/register.js +46 -70
- package/lib/cjs/client/addon/utils.js +6 -2
- package/lib/cjs/client/addon/withCreevey.js +221 -155
- package/lib/cjs/client/shared/components/ImagesView/BlendView.js +26 -24
- package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +22 -18
- package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +44 -66
- package/lib/cjs/client/shared/components/ImagesView/SlideView.js +38 -50
- package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -45
- package/lib/cjs/client/shared/components/ImagesView/index.js +9 -9
- package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +12 -8
- package/lib/cjs/client/shared/components/PageFooter/Paging.js +14 -18
- package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +22 -18
- package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +42 -67
- package/lib/cjs/client/shared/components/ResultsPage.js +39 -69
- package/lib/cjs/client/shared/creeveyClientApi.js +55 -82
- package/lib/cjs/client/shared/helpers.js +140 -211
- package/lib/cjs/client/shared/viewMode.js +5 -5
- package/lib/cjs/client/web/142.js +2 -0
- package/lib/cjs/client/web/142.js.LICENSE.txt +12 -0
- package/lib/cjs/client/web/32.js +1 -0
- package/lib/cjs/client/web/551.js +1 -0
- package/lib/cjs/client/web/566.js +2 -0
- package/lib/cjs/client/web/566.js.LICENSE.txt +31 -0
- package/lib/cjs/client/web/691.js +2 -0
- package/lib/cjs/client/web/691.js.LICENSE.txt +8 -0
- package/lib/cjs/client/web/725.js +1 -0
- package/lib/cjs/client/web/main.js +2 -38
- package/lib/cjs/client/web/main.js.LICENSE.txt +49 -0
- package/lib/cjs/creevey.js +3 -5
- package/lib/cjs/index.js +10 -15
- package/lib/cjs/server/config.js +5 -4
- package/lib/cjs/server/docker.js +3 -7
- package/lib/cjs/server/extract.js +7 -4
- package/lib/cjs/server/index.js +3 -5
- package/lib/cjs/server/loaders/babel/creevey-plugin.js +1 -3
- package/lib/cjs/server/loaders/babel/helpers.js +13 -23
- package/lib/cjs/server/loaders/babel/register.js +2 -4
- package/lib/cjs/server/loaders/webpack/compile.js +34 -51
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +20 -22
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +2 -7
- package/lib/cjs/server/loaders/webpack/mdx-loader.js +2 -2
- package/lib/cjs/server/loaders/webpack/start.js +1 -1
- package/lib/cjs/server/logger.js +2 -1
- package/lib/cjs/server/master/index.js +4 -4
- package/lib/cjs/server/master/master.js +1 -0
- package/lib/cjs/server/master/pool.js +38 -47
- package/lib/cjs/server/master/runner.js +53 -66
- package/lib/cjs/server/master/server.js +78 -4
- package/lib/cjs/server/messages.js +128 -18
- package/lib/cjs/server/selenium/browser.js +129 -55
- package/lib/cjs/server/selenium/selenoid.js +5 -7
- package/lib/cjs/server/stories.js +58 -72
- package/lib/cjs/server/storybook/entry.js +7 -22
- package/lib/cjs/server/storybook/helpers.js +20 -27
- package/lib/cjs/server/storybook/providers/browser.js +74 -0
- package/lib/cjs/server/storybook/{nodejs-provider.js → providers/nodejs.js} +37 -20
- package/lib/cjs/server/update.js +1 -5
- package/lib/cjs/server/utils.js +26 -35
- package/lib/cjs/server/worker/helpers.js +2 -6
- package/lib/cjs/server/worker/reporter.js +8 -20
- package/lib/cjs/server/worker/worker.js +21 -19
- package/lib/cjs/shared/index.js +101 -0
- package/lib/cjs/shared/serializeRegExp.js +42 -0
- package/lib/cjs/types.js +11 -6
- package/lib/esm/client/addon/Manager.js +122 -271
- package/lib/esm/client/addon/components/Addon.js +15 -34
- package/lib/esm/client/addon/components/Icons.js +10 -6
- package/lib/esm/client/addon/components/Panel.js +17 -13
- package/lib/esm/client/addon/components/TestSelect.js +11 -9
- package/lib/esm/client/addon/components/Tools.js +19 -36
- package/lib/esm/client/addon/decorator.js +1 -1
- package/lib/esm/client/addon/index.js +2 -0
- package/lib/esm/client/addon/preset.ie11.js +59 -0
- package/lib/esm/client/addon/preset.js +12 -26
- package/lib/esm/client/addon/readyForCapture.js +5 -0
- package/lib/esm/client/addon/register.js +42 -66
- package/lib/esm/client/addon/utils.js +3 -2
- package/lib/esm/client/addon/withCreevey.js +209 -156
- package/lib/esm/client/shared/components/ImagesView/BlendView.js +23 -20
- package/lib/esm/client/shared/components/ImagesView/ImagesView.js +21 -17
- package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +42 -63
- package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
- package/lib/esm/client/shared/components/ImagesView/SwapView.js +24 -42
- package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
- package/lib/esm/client/shared/components/PageFooter/Paging.js +14 -18
- package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +22 -18
- package/lib/esm/client/shared/components/PageHeader/PageHeader.js +37 -60
- package/lib/esm/client/shared/components/ResultsPage.js +36 -64
- package/lib/esm/client/shared/creeveyClientApi.js +57 -84
- package/lib/esm/client/shared/helpers.js +124 -195
- package/lib/esm/client/shared/viewMode.js +4 -4
- package/lib/esm/creevey.js +3 -5
- package/lib/esm/index.js +2 -3
- package/lib/esm/server/config.js +4 -5
- package/lib/esm/server/docker.js +2 -2
- package/lib/esm/server/extract.js +6 -4
- package/lib/esm/server/index.js +3 -4
- package/lib/esm/server/loaders/babel/creevey-plugin.js +1 -3
- package/lib/esm/server/loaders/babel/helpers.js +12 -22
- package/lib/esm/server/loaders/babel/register.js +3 -5
- package/lib/esm/server/loaders/webpack/compile.js +35 -52
- package/lib/esm/server/loaders/webpack/creevey-loader.js +9 -10
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +2 -6
- package/lib/esm/server/loaders/webpack/mdx-loader.js +2 -2
- package/lib/esm/server/loaders/webpack/start.js +1 -1
- package/lib/esm/server/master/index.js +4 -4
- package/lib/esm/server/master/master.js +1 -0
- package/lib/esm/server/master/pool.js +38 -49
- package/lib/esm/server/master/runner.js +53 -66
- package/lib/esm/server/master/server.js +76 -6
- package/lib/esm/server/messages.js +118 -14
- package/lib/esm/server/selenium/browser.js +126 -57
- package/lib/esm/server/selenium/selenoid.js +4 -6
- package/lib/esm/server/stories.js +58 -70
- package/lib/esm/server/storybook/entry.js +5 -22
- package/lib/esm/server/storybook/helpers.js +11 -20
- package/lib/esm/server/storybook/providers/browser.js +60 -0
- package/lib/esm/server/storybook/{nodejs-provider.js → providers/nodejs.js} +35 -19
- package/lib/esm/server/update.js +1 -5
- package/lib/esm/server/utils.js +18 -31
- package/lib/esm/server/worker/helpers.js +2 -6
- package/lib/esm/server/worker/reporter.js +8 -20
- package/lib/esm/server/worker/worker.js +22 -20
- package/lib/esm/shared/index.js +78 -0
- package/lib/esm/shared/serializeRegExp.js +24 -0
- package/lib/esm/types.js +3 -0
- package/lib/types/client/addon/Manager.d.ts +2 -2
- package/lib/types/client/addon/components/TestSelect.d.ts +0 -1
- package/lib/types/client/addon/index.d.ts +2 -0
- package/lib/types/client/addon/preset.d.ts +2 -1
- package/lib/types/client/addon/preset.ie11.d.ts +10 -0
- package/lib/types/client/addon/readyForCapture.d.ts +6 -0
- package/lib/types/client/addon/utils.d.ts +1 -0
- package/lib/types/client/addon/withCreevey.d.ts +13 -2
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +1 -1
- package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +0 -1
- package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
- package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +1 -1
- package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +1 -1
- package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +0 -1
- package/lib/types/client/shared/components/PageFooter/Paging.d.ts +0 -1
- package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +1 -1
- package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +0 -1
- package/lib/types/client/shared/components/ResultsPage.d.ts +1 -1
- package/lib/types/client/web/CreeveyApp.d.ts +0 -1
- package/lib/types/client/web/CreeveyLoader.d.ts +1 -2
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +1 -1
- package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +0 -1
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +6 -6
- package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +0 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +1 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +1 -1
- package/lib/types/index.d.ts +0 -1
- package/lib/types/server/loaders/babel/register.d.ts +1 -1
- package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -2
- package/lib/types/server/logger.d.ts +6 -2
- package/lib/types/server/master/master.d.ts +1 -0
- package/lib/types/server/master/pool.d.ts +1 -0
- package/lib/types/server/master/server.d.ts +1 -1
- package/lib/types/server/messages.d.ts +17 -6
- package/lib/types/server/selenium/browser.d.ts +5 -2
- package/lib/types/server/stories.d.ts +2 -2
- package/lib/types/server/storybook/entry.d.ts +2 -3
- package/lib/types/server/storybook/helpers.d.ts +1 -1
- package/lib/types/server/storybook/providers/browser.d.ts +4 -0
- package/lib/types/server/storybook/providers/nodejs.d.ts +9 -0
- package/lib/types/server/utils.d.ts +5 -1
- package/lib/types/server/worker/helpers.d.ts +2 -1
- package/lib/types/shared/index.d.ts +7 -0
- package/lib/types/shared/serializeRegExp.d.ts +9 -0
- package/lib/types/types.d.ts +32 -5
- package/package.json +120 -103
- package/preset/ie11.js +5 -0
- package/{preset.js → preset/index.js} +2 -2
- package/types/mdx.d.ts +3 -2
- package/types/mocha.d.ts +1 -0
- package/lib/cjs/client/web/1.js +0 -13
- package/lib/cjs/client/web/2.js +0 -1
- package/lib/cjs/shared.js +0 -35
- package/lib/esm/shared.js +0 -22
- package/lib/types/server/storybook/nodejs-provider.d.ts +0 -5
- package/lib/types/shared.d.ts +0 -4
@@ -19,18 +19,17 @@ var _types = require("../types");
|
|
19
19
|
|
20
20
|
var _utils = require("./utils");
|
21
21
|
|
22
|
-
var _helpers = require("./storybook/helpers");
|
23
|
-
|
24
|
-
var _shared = require("../shared");
|
25
|
-
|
26
22
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
27
23
|
|
28
24
|
function storyTestFabric(delay, testFn) {
|
29
25
|
return async function storyTest() {
|
30
|
-
var _testFn$call;
|
31
|
-
|
32
26
|
delay ? await new Promise(resolve => setTimeout(resolve, delay)) : void 0;
|
33
|
-
await (
|
27
|
+
await (testFn ? testFn.call(this) : this.screenshots.length > 0 ? this.expect(this.screenshots.reduce((screenshots, {
|
28
|
+
imageName,
|
29
|
+
screenshot
|
30
|
+
}, index) => ({ ...screenshots,
|
31
|
+
[imageName ?? `screenshot_${index}`]: screenshot
|
32
|
+
}), {})).to.matchImages() : this.expect(await this.takeScreenshot()).to.matchImage());
|
34
33
|
};
|
35
34
|
}
|
36
35
|
|
@@ -56,42 +55,38 @@ function createCreeveyTest(browser, storyMeta, skipOptions, testName) {
|
|
56
55
|
};
|
57
56
|
}
|
58
57
|
|
59
|
-
function convertStories(
|
58
|
+
function convertStories(browserName, stories) {
|
60
59
|
const tests = {};
|
61
60
|
(Array.isArray(stories) ? stories : Object.values(stories)).forEach(storyMeta => {
|
62
61
|
// TODO Skip docsOnly stories for now
|
63
62
|
if (storyMeta.parameters.docsOnly) return;
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
};
|
84
|
-
return;
|
85
|
-
}
|
63
|
+
const {
|
64
|
+
delay: delayParam,
|
65
|
+
tests: storyTests,
|
66
|
+
skip
|
67
|
+
} = storyMeta.parameters.creevey ?? {};
|
68
|
+
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]
|
69
|
+
// typeof tests === "function" => rootSuite -> kindSuite -> storyTest -> browser -> [images.png]
|
70
|
+
// typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> [browsers.png]
|
71
|
+
// typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> browser -> [images.png]
|
72
|
+
|
73
|
+
if (!storyTests) {
|
74
|
+
const test = createCreeveyTest(browserName, storyMeta, skip);
|
75
|
+
tests[test.id] = { ...test,
|
76
|
+
storyId: storyMeta.id,
|
77
|
+
story: storyMeta,
|
78
|
+
fn: storyTestFabric(delay)
|
79
|
+
};
|
80
|
+
return;
|
81
|
+
}
|
86
82
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
});
|
83
|
+
Object.entries(storyTests).forEach(([testName, testFn]) => {
|
84
|
+
const test = createCreeveyTest(browserName, storyMeta, skip, testName);
|
85
|
+
tests[test.id] = { ...test,
|
86
|
+
storyId: storyMeta.id,
|
87
|
+
story: storyMeta,
|
88
|
+
fn: storyTestFabric(delay, testFn)
|
89
|
+
};
|
95
90
|
});
|
96
91
|
});
|
97
92
|
return tests;
|
@@ -99,22 +94,24 @@ function convertStories(browsers, stories) {
|
|
99
94
|
|
100
95
|
async function loadTestsFromStories(browsers, provider, update) {
|
101
96
|
const testIdsByFiles = new Map();
|
102
|
-
const
|
97
|
+
const stories = await provider(storiesByFiles => {
|
103
98
|
const testsDiff = {};
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
99
|
+
const tests = {};
|
100
|
+
browsers.forEach(browser => {
|
101
|
+
Array.from(storiesByFiles.entries()).forEach(([filename, stories]) => {
|
102
|
+
var _testIdsByFiles$get;
|
103
|
+
|
104
|
+
Object.assign(tests, convertStories(browser, stories));
|
105
|
+
const changed = Object.keys(tests);
|
106
|
+
const removed = ((_testIdsByFiles$get = testIdsByFiles.get(filename)) === null || _testIdsByFiles$get === void 0 ? void 0 : _testIdsByFiles$get.filter(testId => !tests[testId])) ?? [];
|
107
|
+
if (changed.length == 0) testIdsByFiles.delete(filename);else testIdsByFiles.set(filename, changed);
|
108
|
+
Object.assign(testsDiff, tests);
|
109
|
+
removed.forEach(testId => testsDiff[testId] = undefined);
|
110
|
+
});
|
113
111
|
});
|
114
112
|
update === null || update === void 0 ? void 0 : update(testsDiff);
|
115
113
|
});
|
116
|
-
const
|
117
|
-
const tests = convertStories(browsers, stories);
|
114
|
+
const tests = browsers.reduce((tests, browser) => Object.assign(tests, convertStories(browser, stories)), {});
|
118
115
|
Object.values(tests).filter(_types.isDefined).forEach(({
|
119
116
|
id,
|
120
117
|
story: {
|
@@ -122,36 +119,25 @@ async function loadTestsFromStories(browsers, provider, update) {
|
|
122
119
|
fileName
|
123
120
|
}
|
124
121
|
}
|
125
|
-
}) =>
|
126
|
-
|
127
|
-
|
128
|
-
return (// TODO Don't use filename as a key, due possible collisions if two require.context with same structure of modules are defined
|
129
|
-
testIdsByFiles.set(fileName, [...((_testIdsByFiles$get2 = testIdsByFiles.get(fileName)) !== null && _testIdsByFiles$get2 !== void 0 ? _testIdsByFiles$get2 : []), id])
|
130
|
-
);
|
131
|
-
});
|
122
|
+
}) => // TODO Don't use filename as a key, due possible collisions if two require.context with same structure of modules are defined
|
123
|
+
testIdsByFiles.set(fileName, [...(testIdsByFiles.get(fileName) ?? []), id]));
|
132
124
|
return tests;
|
133
125
|
}
|
134
126
|
|
135
127
|
function saveStoriesJson(storiesData, extract) {
|
136
|
-
|
137
|
-
|
138
|
-
const outputDir = typeof extract == 'boolean' ? 'storybook-static' : extract;
|
139
|
-
|
140
|
-
if (!(0, _helpers.isStorybookVersionLessThan)(6)) {
|
141
|
-
// NOTE Copy-pasted from Storybook's `getStoriesJsonData` method
|
142
|
-
const allowed = ['fileName', 'docsOnly', 'framework', '__id', '__isArgsStory'];
|
143
|
-
storiesData.globalParameters = (0, _lodash.pick)(storiesData.globalParameters, allowed); // @ts-expect-error ignore error
|
128
|
+
const outputDir = typeof extract == 'boolean' ? 'storybook-static' : extract; // NOTE Copy-pasted from Storybook's `getStoriesJsonData` method
|
144
129
|
|
145
|
-
|
130
|
+
const allowed = ['fileName', 'docsOnly', 'framework', '__id', '__isArgsStory'];
|
131
|
+
storiesData.globalParameters = (0, _lodash.pick)(storiesData.globalParameters, allowed); // @ts-expect-error ignore error
|
146
132
|
|
147
|
-
|
148
|
-
parameters: (0, _lodash.pick)(v.parameters, allowed)
|
149
|
-
}));
|
150
|
-
} // TODO Fix args stories
|
133
|
+
storiesData.kindParameters = (0, _lodash.mapValues)(storiesData.kindParameters, v => (0, _lodash.pick)(v, allowed)); // @ts-expect-error ignore error
|
151
134
|
|
135
|
+
storiesData.stories = (0, _lodash.mapValues)(storiesData.stories, v => ({ ...(0, _lodash.pick)(v, ['id', 'name', 'kind', 'story']),
|
136
|
+
parameters: (0, _lodash.pick)(v.parameters, allowed)
|
137
|
+
})); // TODO Fix args stories
|
152
138
|
|
153
|
-
(0, _utils.removeProps)(storiesData
|
154
|
-
Object.values((
|
139
|
+
(0, _utils.removeProps)(storiesData ?? {}, ['stories', () => true, 'parameters', '__isArgsStory']);
|
140
|
+
Object.values((storiesData === null || storiesData === void 0 ? void 0 : storiesData.stories) ?? {}).forEach(story => (0, _types.isObject)(story) && 'parameters' in story && (0, _types.isObject)(story.parameters) && delete story.parameters.__isArgsStory);
|
155
141
|
(0, _fs.mkdirSync)(outputDir, {
|
156
142
|
recursive: true
|
157
143
|
});
|
@@ -3,23 +3,21 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.
|
6
|
+
exports.storiesOf = exports.setAddon = exports.raw = exports.getStorybook = exports.forceReRender = exports.configure = exports.clientApi = exports.clearDecorators = exports.channel = exports.addParameters = exports.addDecorator = void 0;
|
7
7
|
|
8
8
|
var _addons = require("@storybook/addons");
|
9
9
|
|
10
10
|
var _helpers = require("./helpers");
|
11
11
|
|
12
|
-
var _api$channel, _api$context;
|
13
|
-
|
14
12
|
const framework = (0, _helpers.getStorybookFramework)(); // eslint-disable-next-line @typescript-eslint/no-var-requires
|
15
13
|
|
16
|
-
const core = require((0, _helpers.resolveFromStorybook)('@storybook/core'));
|
17
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
18
|
-
|
14
|
+
const core = require((0, _helpers.resolveFromStorybook)('@storybook/core-client'));
|
19
15
|
|
20
|
-
const start =
|
16
|
+
const start = core.start;
|
21
17
|
const api = start(() => void 0);
|
22
|
-
|
18
|
+
|
19
|
+
const channel = _addons.addons.getChannel();
|
20
|
+
|
23
21
|
exports.channel = channel;
|
24
22
|
const clientApi = api.clientApi;
|
25
23
|
exports.clientApi = clientApi;
|
@@ -35,21 +33,8 @@ const storiesOf = (kind, m) => {
|
|
35
33
|
exports.storiesOf = storiesOf;
|
36
34
|
|
37
35
|
const configure = (...args) => {
|
38
|
-
|
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
|
36
|
+
//NOTE Storybook 6.x pass `framework` as first argument
|
50
37
|
//@ts-expect-error: ignore it
|
51
|
-
|
52
|
-
|
53
38
|
return api.configure(framework, ...args);
|
54
39
|
};
|
55
40
|
|
@@ -3,16 +3,18 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
+
exports.getStorybookFramework = getStorybookFramework;
|
7
|
+
exports.getStorybookVersion = getStorybookVersion;
|
6
8
|
exports.hasDocsAddon = hasDocsAddon;
|
7
9
|
exports.hasSvelteCSFAddon = hasSvelteCSFAddon;
|
8
|
-
exports.
|
9
|
-
exports.isStorybookVersionLessThan = isStorybookVersionLessThan;
|
10
|
-
exports.isStorybookVersionGreaterThan = isStorybookVersionGreaterThan;
|
11
|
-
exports.isStorybookVersion = isStorybookVersion;
|
12
|
-
exports.getStorybookFramework = getStorybookFramework;
|
10
|
+
exports.importStorybookClientLogger = void 0;
|
13
11
|
exports.importStorybookConfig = importStorybookConfig;
|
12
|
+
exports.importStorybookCoreEvents = exports.importStorybookCoreCommon = void 0;
|
14
13
|
exports.isCSFv3Enabled = isCSFv3Enabled;
|
15
|
-
exports.
|
14
|
+
exports.isStorybookVersion = isStorybookVersion;
|
15
|
+
exports.isStorybookVersionGreaterThan = isStorybookVersionGreaterThan;
|
16
|
+
exports.isStorybookVersionLessThan = isStorybookVersionLessThan;
|
17
|
+
exports.storybookDirRef = exports.storybookConfigRef = exports.resolveFromStorybookCoreServer = exports.resolveFromStorybookCoreClient = exports.resolveFromStorybookBuilderWebpack4 = exports.resolveFromStorybookAddonDocs = exports.resolveFromStorybook = void 0;
|
16
18
|
|
17
19
|
var _path = _interopRequireDefault(require("path"));
|
18
20
|
|
@@ -42,9 +44,9 @@ const resolveFromStorybookBuilderWebpack4 = modulePath => (0, _resolveFrom.defau
|
|
42
44
|
|
43
45
|
exports.resolveFromStorybookBuilderWebpack4 = resolveFromStorybookBuilderWebpack4;
|
44
46
|
|
45
|
-
const
|
47
|
+
const resolveFromStorybookCoreClient = modulePath => (0, _resolveFrom.default)(resolveFromStorybook('@storybook/core-client'), modulePath);
|
46
48
|
|
47
|
-
exports.
|
49
|
+
exports.resolveFromStorybookCoreClient = resolveFromStorybookCoreClient;
|
48
50
|
|
49
51
|
const resolveFromStorybookCoreServer = modulePath => (0, _resolveFrom.default)(resolveFromStorybook('@storybook/core-server'), modulePath);
|
50
52
|
|
@@ -92,30 +94,22 @@ function getStorybookVersion() {
|
|
92
94
|
}
|
93
95
|
|
94
96
|
function isStorybookVersionLessThan(major, minor) {
|
95
|
-
|
96
|
-
|
97
|
-
const [sbMajor, sbMinor] = ((_process$env$__CREEVE = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE !== void 0 ? _process$env$__CREEVE : getStorybookVersion()).split('.');
|
97
|
+
const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
|
98
98
|
return Number(sbMajor) < major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) < minor;
|
99
99
|
}
|
100
100
|
|
101
101
|
function isStorybookVersionGreaterThan(major, minor) {
|
102
|
-
|
103
|
-
|
104
|
-
const [sbMajor, sbMinor] = ((_process$env$__CREEVE2 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE2 !== void 0 ? _process$env$__CREEVE2 : getStorybookVersion()).split('.');
|
102
|
+
const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
|
105
103
|
return Number(sbMajor) > major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) > minor;
|
106
104
|
}
|
107
105
|
|
108
106
|
function isStorybookVersion(major, minor) {
|
109
|
-
|
110
|
-
|
111
|
-
const [sbMajor, sbMinor] = ((_process$env$__CREEVE3 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE3 !== void 0 ? _process$env$__CREEVE3 : getStorybookVersion()).split('.');
|
107
|
+
const [sbMajor, sbMinor] = (process.env.__CREEVEY_STORYBOOK_VERSION__ ?? getStorybookVersion()).split('.');
|
112
108
|
return Number(sbMajor) == major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) == minor;
|
113
109
|
}
|
114
110
|
|
115
111
|
function getStorybookFramework() {
|
116
|
-
|
117
|
-
|
118
|
-
const framework = (_process$env$__CREEVE4 = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__) !== null && _process$env$__CREEVE4 !== void 0 ? _process$env$__CREEVE4 : supportedFrameworks.find(framework => {
|
112
|
+
const framework = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__ ?? supportedFrameworks.find(framework => {
|
119
113
|
try {
|
120
114
|
return require.resolve(resolveFromStorybook(`@storybook/${framework}`));
|
121
115
|
} catch (_) {
|
@@ -139,8 +133,8 @@ async function importStorybookConfig() {
|
|
139
133
|
try {
|
140
134
|
return storybookConfigRef.current = (await Promise.resolve(`${require.resolve(configPath)}`).then(s => _interopRequireWildcard(require(s)))).default;
|
141
135
|
} catch (_) {
|
142
|
-
const storybookUtilsPath =
|
143
|
-
const serverRequireModule =
|
136
|
+
const storybookUtilsPath = '@storybook/core-common/dist/cjs/utils';
|
137
|
+
const serverRequireModule = 'interpret-require'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
144
138
|
|
145
139
|
const {
|
146
140
|
getInterpretedFile
|
@@ -149,17 +143,16 @@ async function importStorybookConfig() {
|
|
149
143
|
const {
|
150
144
|
default: serverRequireFallback,
|
151
145
|
serverRequire = serverRequireFallback
|
152
|
-
} = await Promise.resolve(`${resolveFromStorybook(`${storybookUtilsPath}/${serverRequireModule}`)}`).then(s => _interopRequireWildcard(require(s))); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
146
|
+
} = await Promise.resolve(`${resolveFromStorybook(`${storybookUtilsPath}/${serverRequireModule}`)}`).then(s => _interopRequireWildcard(require(s))); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
153
147
|
|
154
|
-
const mainConfigFile =
|
155
|
-
getInterpretedFile(configPath); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
148
|
+
const mainConfigFile = getInterpretedFile(configPath); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
156
149
|
|
157
150
|
return storybookConfigRef.current = serverRequire(mainConfigFile);
|
158
151
|
}
|
159
152
|
}
|
160
153
|
|
161
154
|
async function isCSFv3Enabled() {
|
162
|
-
var _await$importStoryboo, _await$importStoryboo2
|
155
|
+
var _await$importStoryboo, _await$importStoryboo2;
|
163
156
|
|
164
|
-
return (_await$importStoryboo =
|
157
|
+
return ((_await$importStoryboo = await importStorybookConfig()) === null || _await$importStoryboo === void 0 ? void 0 : (_await$importStoryboo2 = _await$importStoryboo.features) === null || _await$importStoryboo2 === void 0 ? void 0 : _await$importStoryboo2.previewCsfV3) ?? false;
|
165
158
|
}
|
@@ -0,0 +1,74 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.loadStories = loadStories;
|
7
|
+
|
8
|
+
var _cluster = _interopRequireDefault(require("cluster"));
|
9
|
+
|
10
|
+
var _selenium = require("../../selenium");
|
11
|
+
|
12
|
+
var _messages = require("../../messages");
|
13
|
+
|
14
|
+
var _types = require("../../../types");
|
15
|
+
|
16
|
+
var _logger = require("../../logger");
|
17
|
+
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
19
|
+
|
20
|
+
async function loadStories(_config, {
|
21
|
+
port
|
22
|
+
}, storiesListener) {
|
23
|
+
if (_cluster.default.isPrimary) {
|
24
|
+
return new Promise(resolve => {
|
25
|
+
const worker = Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).find(worker => worker.isConnected());
|
26
|
+
|
27
|
+
if (worker) {
|
28
|
+
const unsubscribe = (0, _messages.subscribeOnWorker)(worker, 'stories', message => {
|
29
|
+
if (message.type == 'set') {
|
30
|
+
const {
|
31
|
+
stories,
|
32
|
+
oldTests
|
33
|
+
} = message.payload;
|
34
|
+
if (oldTests.length > 0) _logger.logger.warn(`If you use browser stories provider of CSFv3 Storybook feature\n` + `Creevey will not load tests defined in story parameters from following stories:\n` + oldTests.join('\n'));
|
35
|
+
unsubscribe();
|
36
|
+
resolve(stories);
|
37
|
+
}
|
38
|
+
});
|
39
|
+
(0, _messages.sendStoriesMessage)(worker, {
|
40
|
+
type: 'get'
|
41
|
+
});
|
42
|
+
}
|
43
|
+
|
44
|
+
(0, _messages.subscribeOn)('stories', message => {
|
45
|
+
// TODO updates only one browser :(
|
46
|
+
if (message.type == 'update') storiesListener(new Map(message.payload));
|
47
|
+
});
|
48
|
+
});
|
49
|
+
} else {
|
50
|
+
(0, _messages.subscribeOn)('stories', message => {
|
51
|
+
if (message.type == 'get') (0, _messages.emitStoriesMessage)({
|
52
|
+
type: 'set',
|
53
|
+
payload: {
|
54
|
+
stories,
|
55
|
+
oldTests: storiesWithOldTests
|
56
|
+
}
|
57
|
+
});
|
58
|
+
if (message.type == 'update') storiesListener(new Map(message.payload));
|
59
|
+
});
|
60
|
+
const stories = await (0, _selenium.loadStoriesFromBrowser)(port);
|
61
|
+
const storiesWithOldTests = [];
|
62
|
+
Object.values(stories).forEach(story => {
|
63
|
+
var _parameters, _parameters$creevey;
|
64
|
+
|
65
|
+
if ((_parameters = story.parameters) !== null && _parameters !== void 0 && (_parameters$creevey = _parameters.creevey) !== null && _parameters$creevey !== void 0 && _parameters$creevey.tests) {
|
66
|
+
var _parameters2, _parameters2$creevey;
|
67
|
+
|
68
|
+
(_parameters2 = story.parameters) === null || _parameters2 === void 0 ? true : (_parameters2$creevey = _parameters2.creevey) === null || _parameters2$creevey === void 0 ? true : delete _parameters2$creevey.tests;
|
69
|
+
storiesWithOldTests.push(`${story.kind}/${story.name}`);
|
70
|
+
}
|
71
|
+
});
|
72
|
+
return stories;
|
73
|
+
}
|
74
|
+
}
|
@@ -3,25 +3,24 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
+
exports.extractStoriesData = extractStoriesData;
|
6
7
|
exports.loadStories = loadStories;
|
7
8
|
|
8
9
|
var _path = _interopRequireDefault(require("path"));
|
9
10
|
|
10
|
-
var _cluster = require("cluster");
|
11
|
+
var _cluster = _interopRequireDefault(require("cluster"));
|
11
12
|
|
12
13
|
var _chokidar = _interopRequireDefault(require("chokidar"));
|
13
14
|
|
14
|
-
var _types = require("
|
15
|
+
var _types = require("../../../types");
|
15
16
|
|
16
|
-
var _utils = require("
|
17
|
+
var _utils = require("../../utils");
|
17
18
|
|
18
|
-
var _messages = require("
|
19
|
+
var _messages = require("../../messages");
|
19
20
|
|
20
|
-
var _helpers = require("
|
21
|
+
var _helpers = require("../helpers");
|
21
22
|
|
22
|
-
var _logger = require("
|
23
|
-
|
24
|
-
var _shared = require("../../shared");
|
23
|
+
var _logger = require("../../logger");
|
25
24
|
|
26
25
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
27
26
|
|
@@ -30,7 +29,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
|
|
30
29
|
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; }
|
31
30
|
|
32
31
|
async function initStorybookEnvironment() {
|
33
|
-
// @ts-
|
32
|
+
// @ts-expect-error There is no @types/global-jsdom package
|
34
33
|
(await Promise.resolve().then(() => _interopRequireWildcard(require('global-jsdom')))).default(undefined, {
|
35
34
|
url: 'http://localhost'
|
36
35
|
}); // NOTE Cutoff `jsdom` part from userAgent, because storybook check enviroment and create events channel if runs in browser
|
@@ -45,10 +44,10 @@ async function initStorybookEnvironment() {
|
|
45
44
|
logger
|
46
45
|
} = await (0, _helpers.importStorybookClientLogger)(); // NOTE: Disable duplication warnings for >=6.2 storybook
|
47
46
|
|
48
|
-
if (_cluster.isWorker) logger.warn = _types.noop; // NOTE: disable logger for 5.x storybook
|
47
|
+
if (_cluster.default.isWorker) logger.warn = _types.noop; // NOTE: disable logger for 5.x storybook
|
49
48
|
|
50
49
|
logger.debug = _types.noop;
|
51
|
-
return Promise.resolve().then(() => _interopRequireWildcard(require('
|
50
|
+
return Promise.resolve().then(() => _interopRequireWildcard(require('../entry')));
|
52
51
|
}
|
53
52
|
|
54
53
|
function watchStories(channel, watcher, initialFiles) {
|
@@ -59,7 +58,7 @@ function watchStories(channel, watcher, initialFiles) {
|
|
59
58
|
watcher.on('change', filePath => storiesByFiles.set(_path.default.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
|
60
59
|
watcher.on('unlink', filePath => storiesByFiles.set(_path.default.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
|
61
60
|
return data => {
|
62
|
-
const stories =
|
61
|
+
const stories = data.stories;
|
63
62
|
const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
|
64
63
|
const addedFiles = Array.from(files).filter(filePath => !watchingFiles.has(filePath));
|
65
64
|
const removedFiles = Array.from(watchingFiles).filter(filePath => !files.has(filePath));
|
@@ -110,8 +109,8 @@ async function loadStoriesDirectly(config, {
|
|
110
109
|
const {
|
111
110
|
addParameters,
|
112
111
|
configure
|
113
|
-
} = await Promise.resolve().then(() => _interopRequireWildcard(require('
|
114
|
-
const requireContext = await (await Promise.resolve().then(() => _interopRequireWildcard(require('
|
112
|
+
} = await Promise.resolve().then(() => _interopRequireWildcard(require('../entry')));
|
113
|
+
const requireContext = await (await Promise.resolve().then(() => _interopRequireWildcard(require('../../loaders/babel/register')))).default(config, debug);
|
115
114
|
|
116
115
|
const preview = (() => {
|
117
116
|
try {
|
@@ -125,7 +124,7 @@ async function loadStoriesDirectly(config, {
|
|
125
124
|
stories
|
126
125
|
} = await (0, _helpers.importStorybookConfig)();
|
127
126
|
const contexts = stories.map(entry => {
|
128
|
-
const normalizedEntry =
|
127
|
+
const normalizedEntry = normalizeStoriesEntry(entry, {
|
129
128
|
configDir: config.storybookDir,
|
130
129
|
workingDir: process.cwd()
|
131
130
|
});
|
@@ -174,7 +173,7 @@ async function loadStoriesDirectly(config, {
|
|
174
173
|
try {
|
175
174
|
configure(contexts.map(ctx => ctx()), module, false);
|
176
175
|
} catch (error) {
|
177
|
-
if (_cluster.
|
176
|
+
if (_cluster.default.isPrimary) _logger.logger.error(error);
|
178
177
|
}
|
179
178
|
}
|
180
179
|
|
@@ -187,7 +186,8 @@ async function loadStoriesDirectly(config, {
|
|
187
186
|
void startStorybook();
|
188
187
|
});
|
189
188
|
void startStorybook();
|
190
|
-
}
|
189
|
+
} // TODO Do we need to support multiple storybooks here?
|
190
|
+
|
191
191
|
|
192
192
|
async function loadStories(config, {
|
193
193
|
watch,
|
@@ -200,16 +200,16 @@ async function loadStories(config, {
|
|
200
200
|
} = storybookApi;
|
201
201
|
channel.removeAllListeners(Events.CURRENT_STORY_WAS_SET);
|
202
202
|
channel.on('storiesUpdated', storiesListener);
|
203
|
-
let watcher
|
203
|
+
let watcher;
|
204
204
|
if (watch) watcher = _chokidar.default.watch([], {
|
205
205
|
ignoreInitial: true
|
206
206
|
});
|
207
207
|
const loadPromise = new Promise(resolve => {
|
208
208
|
channel.once(Events.SET_STORIES, data => {
|
209
|
-
const stories =
|
209
|
+
const stories = data.stories;
|
210
210
|
const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
|
211
211
|
if (watcher) channel.on(Events.SET_STORIES, watchStories(channel, watcher, files));
|
212
|
-
resolve(
|
212
|
+
resolve(stories);
|
213
213
|
});
|
214
214
|
});
|
215
215
|
if (config.useWebpackToExtractTests) loadStoriesFromBundle(watch);else void loadStoriesDirectly(config, {
|
@@ -217,4 +217,21 @@ async function loadStories(config, {
|
|
217
217
|
debug
|
218
218
|
});
|
219
219
|
return loadPromise;
|
220
|
+
}
|
221
|
+
|
222
|
+
async function extractStoriesData(config, {
|
223
|
+
watch,
|
224
|
+
debug
|
225
|
+
}) {
|
226
|
+
const storybookApi = await initStorybookEnvironment();
|
227
|
+
const Events = await (0, _helpers.importStorybookCoreEvents)();
|
228
|
+
const {
|
229
|
+
channel
|
230
|
+
} = storybookApi;
|
231
|
+
channel.removeAllListeners(Events.CURRENT_STORY_WAS_SET);
|
232
|
+
const loadPromise = new Promise(resolve => channel.once(Events.SET_STORIES, resolve));
|
233
|
+
if (config.useWebpackToExtractTests) loadStoriesFromBundle(watch);else void loadStoriesDirectly(config, {
|
234
|
+
debug
|
235
|
+
});
|
236
|
+
return loadPromise;
|
220
237
|
}
|
package/lib/cjs/server/update.js
CHANGED
@@ -31,11 +31,7 @@ function tryToLoadTestsData(filename) {
|
|
31
31
|
const actualRegex = /^(.*)-actual-(\d+)\.png$/i;
|
32
32
|
|
33
33
|
function approve(dirents, srcPath, dstPath, testPaths, isMatch) {
|
34
|
-
dirents.filter(dirent => dirent.isFile()).map(dirent => actualRegex.exec(dirent.name)).filter(_types.isDefined).filter(([fileName, imageName]) => !testPaths || testPaths.find(([token]) => token == imageName) && isMatch(_path.default.join(srcPath, fileName))).reduce((images, [, imageName, retry]) => {
|
35
|
-
var _images$get;
|
36
|
-
|
37
|
-
return Number(retry) > ((_images$get = images.get(imageName)) !== null && _images$get !== void 0 ? _images$get : -1) ? images.set(imageName, Number(retry)) : images;
|
38
|
-
}, new Map()).forEach((retry, imageName) => {
|
34
|
+
dirents.filter(dirent => dirent.isFile()).map(dirent => actualRegex.exec(dirent.name)).filter(_types.isDefined).filter(([fileName, imageName]) => !testPaths || testPaths.find(([token]) => token == imageName) && isMatch(_path.default.join(srcPath, fileName))).reduce((images, [, imageName, retry]) => Number(retry) > (images.get(imageName) ?? -1) ? images.set(imageName, Number(retry)) : images, new Map()).forEach((retry, imageName) => {
|
39
35
|
(0, _fs.mkdirSync)(dstPath, {
|
40
36
|
recursive: true
|
41
37
|
});
|