@heymantle/litho 0.0.14 → 0.0.15
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/README.md +52 -0
- package/dist/cjs/components/Card.js +1 -1
- package/dist/cjs/components/Disclosure.js +46 -15
- package/dist/cjs/components/DropZone.js +89 -37
- package/dist/cjs/components/Layout.js +4 -2
- package/dist/cjs/components/Modal.js +14 -3
- package/dist/cjs/components/Popover.js +26 -9
- package/dist/cjs/components/Table.js +27 -11
- package/dist/cjs/components/Tabs.js +33 -2
- package/dist/cjs/playwright.config.js +114 -0
- package/dist/cjs/styles/Table.js +2 -7
- package/dist/cjs/tests/visual/stories.spec.js +637 -0
- package/dist/cjs/utilities/dates.js +7 -7
- package/dist/esm/components/Card.js +1 -1
- package/dist/esm/components/Disclosure.js +36 -5
- package/dist/esm/components/DropZone.js +89 -37
- package/dist/esm/components/Layout.js +4 -2
- package/dist/esm/components/Modal.js +14 -3
- package/dist/esm/components/Popover.js +26 -9
- package/dist/esm/components/Table.js +27 -11
- package/dist/esm/components/Tabs.js +33 -2
- package/dist/esm/playwright.config.js +104 -0
- package/dist/esm/styles/Table.js +2 -7
- package/dist/esm/tests/visual/stories.spec.js +633 -0
- package/dist/esm/utilities/dates.js +7 -7
- package/dist/types/components/Disclosure.d.ts.map +1 -1
- package/dist/types/components/DropZone.d.ts +2 -0
- package/dist/types/components/DropZone.d.ts.map +1 -1
- package/dist/types/components/Layout.d.ts.map +1 -1
- package/dist/types/components/Modal.d.ts.map +1 -1
- package/dist/types/components/Popover.d.ts +2 -0
- package/dist/types/components/Popover.d.ts.map +1 -1
- package/dist/types/components/Table.d.ts.map +1 -1
- package/dist/types/components/Tabs.d.ts +45 -1
- package/dist/types/components/Tabs.d.ts.map +1 -1
- package/dist/types/styles/Table.d.ts.map +1 -1
- package/package.json +12 -3
|
@@ -0,0 +1,637 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
var _test = require("@playwright/test");
|
|
6
|
+
var _fs = require("fs");
|
|
7
|
+
var _path = require("path");
|
|
8
|
+
var _url = require("url");
|
|
9
|
+
function _array_like_to_array(arr, len) {
|
|
10
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
11
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
12
|
+
return arr2;
|
|
13
|
+
}
|
|
14
|
+
function _array_with_holes(arr) {
|
|
15
|
+
if (Array.isArray(arr)) return arr;
|
|
16
|
+
}
|
|
17
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
18
|
+
try {
|
|
19
|
+
var info = gen[key](arg);
|
|
20
|
+
var value = info.value;
|
|
21
|
+
} catch (error) {
|
|
22
|
+
reject(error);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (info.done) {
|
|
26
|
+
resolve(value);
|
|
27
|
+
} else {
|
|
28
|
+
Promise.resolve(value).then(_next, _throw);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function _async_to_generator(fn) {
|
|
32
|
+
return function() {
|
|
33
|
+
var self = this, args = arguments;
|
|
34
|
+
return new Promise(function(resolve, reject) {
|
|
35
|
+
var gen = fn.apply(self, args);
|
|
36
|
+
function _next(value) {
|
|
37
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
38
|
+
}
|
|
39
|
+
function _throw(err) {
|
|
40
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
41
|
+
}
|
|
42
|
+
_next(undefined);
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function _iterable_to_array_limit(arr, i) {
|
|
47
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
48
|
+
if (_i == null) return;
|
|
49
|
+
var _arr = [];
|
|
50
|
+
var _n = true;
|
|
51
|
+
var _d = false;
|
|
52
|
+
var _s, _e;
|
|
53
|
+
try {
|
|
54
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
55
|
+
_arr.push(_s.value);
|
|
56
|
+
if (i && _arr.length === i) break;
|
|
57
|
+
}
|
|
58
|
+
} catch (err) {
|
|
59
|
+
_d = true;
|
|
60
|
+
_e = err;
|
|
61
|
+
} finally{
|
|
62
|
+
try {
|
|
63
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
64
|
+
} finally{
|
|
65
|
+
if (_d) throw _e;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return _arr;
|
|
69
|
+
}
|
|
70
|
+
function _non_iterable_rest() {
|
|
71
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
72
|
+
}
|
|
73
|
+
function _object_destructuring_empty(o) {
|
|
74
|
+
if (o === null || o === void 0) throw new TypeError("Cannot destructure " + o);
|
|
75
|
+
return o;
|
|
76
|
+
}
|
|
77
|
+
function _sliced_to_array(arr, i) {
|
|
78
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
79
|
+
}
|
|
80
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
81
|
+
if (!o) return;
|
|
82
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
83
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
84
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
85
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
86
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
87
|
+
}
|
|
88
|
+
function _ts_generator(thisArg, body) {
|
|
89
|
+
var f, y, t, _ = {
|
|
90
|
+
label: 0,
|
|
91
|
+
sent: function() {
|
|
92
|
+
if (t[0] & 1) throw t[1];
|
|
93
|
+
return t[1];
|
|
94
|
+
},
|
|
95
|
+
trys: [],
|
|
96
|
+
ops: []
|
|
97
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
98
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
99
|
+
return this;
|
|
100
|
+
}), g;
|
|
101
|
+
function verb(n) {
|
|
102
|
+
return function(v) {
|
|
103
|
+
return step([
|
|
104
|
+
n,
|
|
105
|
+
v
|
|
106
|
+
]);
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function step(op) {
|
|
110
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
111
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
112
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
113
|
+
if (y = 0, t) op = [
|
|
114
|
+
op[0] & 2,
|
|
115
|
+
t.value
|
|
116
|
+
];
|
|
117
|
+
switch(op[0]){
|
|
118
|
+
case 0:
|
|
119
|
+
case 1:
|
|
120
|
+
t = op;
|
|
121
|
+
break;
|
|
122
|
+
case 4:
|
|
123
|
+
_.label++;
|
|
124
|
+
return {
|
|
125
|
+
value: op[1],
|
|
126
|
+
done: false
|
|
127
|
+
};
|
|
128
|
+
case 5:
|
|
129
|
+
_.label++;
|
|
130
|
+
y = op[1];
|
|
131
|
+
op = [
|
|
132
|
+
0
|
|
133
|
+
];
|
|
134
|
+
continue;
|
|
135
|
+
case 7:
|
|
136
|
+
op = _.ops.pop();
|
|
137
|
+
_.trys.pop();
|
|
138
|
+
continue;
|
|
139
|
+
default:
|
|
140
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
141
|
+
_ = 0;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
145
|
+
_.label = op[1];
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
149
|
+
_.label = t[1];
|
|
150
|
+
t = op;
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
if (t && _.label < t[2]) {
|
|
154
|
+
_.label = t[2];
|
|
155
|
+
_.ops.push(op);
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
if (t[2]) _.ops.pop();
|
|
159
|
+
_.trys.pop();
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
op = body.call(thisArg, _);
|
|
163
|
+
} catch (e) {
|
|
164
|
+
op = [
|
|
165
|
+
6,
|
|
166
|
+
e
|
|
167
|
+
];
|
|
168
|
+
y = 0;
|
|
169
|
+
} finally{
|
|
170
|
+
f = t = 0;
|
|
171
|
+
}
|
|
172
|
+
if (op[0] & 5) throw op[1];
|
|
173
|
+
return {
|
|
174
|
+
value: op[0] ? op[1] : void 0,
|
|
175
|
+
done: true
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function _ts_values(o) {
|
|
180
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
181
|
+
if (m) return m.call(o);
|
|
182
|
+
if (o && typeof o.length === "number") return {
|
|
183
|
+
next: function() {
|
|
184
|
+
if (o && i >= o.length) o = void 0;
|
|
185
|
+
return {
|
|
186
|
+
value: o && o[i++],
|
|
187
|
+
done: !o
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
192
|
+
}
|
|
193
|
+
// ES module equivalent of __dirname
|
|
194
|
+
var __dirname = (0, _path.dirname)((0, _url.fileURLToPath)(require("url").pathToFileURL(__filename).toString()));
|
|
195
|
+
// Check if we should only update missing baselines
|
|
196
|
+
var UPDATE_MISSING_ONLY = process.env.UPDATE_MISSING_ONLY === 'true';
|
|
197
|
+
// Get the snapshots directory path
|
|
198
|
+
var SNAPSHOTS_DIR = (0, _path.join)(__dirname, 'stories.spec.js-snapshots');
|
|
199
|
+
// Stories to skip (e.g., ones with heavy animations, interactive-only content, or external images)
|
|
200
|
+
var SKIP_STORIES = [
|
|
201
|
+
// Image stories use picsum.photos with random images - not deterministic
|
|
202
|
+
'litho-image--default',
|
|
203
|
+
'litho-image--rounded-prop',
|
|
204
|
+
'litho-image--border-radius',
|
|
205
|
+
'litho-image--responsive-image',
|
|
206
|
+
'litho-image--with-load-callback',
|
|
207
|
+
'litho-image--profile-cards',
|
|
208
|
+
'litho-image--product-showcase',
|
|
209
|
+
'litho-image--image-gallery',
|
|
210
|
+
'litho-image--banner-images'
|
|
211
|
+
];
|
|
212
|
+
// Get all stories from Storybook's index
|
|
213
|
+
function getStories(baseURL) {
|
|
214
|
+
return _async_to_generator(function() {
|
|
215
|
+
var response, data, stories, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step_value, id, entry;
|
|
216
|
+
return _ts_generator(this, function(_state) {
|
|
217
|
+
switch(_state.label){
|
|
218
|
+
case 0:
|
|
219
|
+
return [
|
|
220
|
+
4,
|
|
221
|
+
fetch("".concat(baseURL, "/index.json"))
|
|
222
|
+
];
|
|
223
|
+
case 1:
|
|
224
|
+
response = _state.sent();
|
|
225
|
+
return [
|
|
226
|
+
4,
|
|
227
|
+
response.json()
|
|
228
|
+
];
|
|
229
|
+
case 2:
|
|
230
|
+
data = _state.sent();
|
|
231
|
+
stories = [];
|
|
232
|
+
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
233
|
+
try {
|
|
234
|
+
for(_iterator = Object.entries(data.entries)[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
235
|
+
_step_value = _sliced_to_array(_step.value, 2), id = _step_value[0], entry = _step_value[1];
|
|
236
|
+
// Skip docs entries
|
|
237
|
+
if (entry.type === 'docs') continue;
|
|
238
|
+
// Skip stories in the skip list
|
|
239
|
+
if (SKIP_STORIES.includes(id)) continue;
|
|
240
|
+
stories.push({
|
|
241
|
+
id: id,
|
|
242
|
+
title: entry.title,
|
|
243
|
+
name: entry.name
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
} catch (err) {
|
|
247
|
+
_didIteratorError = true;
|
|
248
|
+
_iteratorError = err;
|
|
249
|
+
} finally{
|
|
250
|
+
try {
|
|
251
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
252
|
+
_iterator.return();
|
|
253
|
+
}
|
|
254
|
+
} finally{
|
|
255
|
+
if (_didIteratorError) {
|
|
256
|
+
throw _iteratorError;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return [
|
|
261
|
+
2,
|
|
262
|
+
stories
|
|
263
|
+
];
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
})();
|
|
267
|
+
}
|
|
268
|
+
// Check if baseline exists for a story
|
|
269
|
+
function baselineExists(storyId) {
|
|
270
|
+
var baselinePath = (0, _path.join)(SNAPSHOTS_DIR, "".concat(storyId, ".png"));
|
|
271
|
+
return (0, _fs.existsSync)(baselinePath);
|
|
272
|
+
}
|
|
273
|
+
// Helper to screenshot a single story
|
|
274
|
+
function screenshotStory(page, storyId) {
|
|
275
|
+
return _async_to_generator(function() {
|
|
276
|
+
var storyURL, screenshotName;
|
|
277
|
+
return _ts_generator(this, function(_state) {
|
|
278
|
+
switch(_state.label){
|
|
279
|
+
case 0:
|
|
280
|
+
// Skip if baseline exists and we're only updating missing ones
|
|
281
|
+
if (UPDATE_MISSING_ONLY && baselineExists(storyId)) {
|
|
282
|
+
return [
|
|
283
|
+
2,
|
|
284
|
+
{
|
|
285
|
+
skipped: true
|
|
286
|
+
}
|
|
287
|
+
];
|
|
288
|
+
}
|
|
289
|
+
// Navigate to the story iframe URL
|
|
290
|
+
storyURL = "/iframe.html?id=".concat(storyId, "&viewMode=story");
|
|
291
|
+
return [
|
|
292
|
+
4,
|
|
293
|
+
page.goto(storyURL)
|
|
294
|
+
];
|
|
295
|
+
case 1:
|
|
296
|
+
_state.sent();
|
|
297
|
+
// Wait for the page to load (don't use networkidle - Storybook keeps connections open)
|
|
298
|
+
return [
|
|
299
|
+
4,
|
|
300
|
+
page.waitForLoadState('load')
|
|
301
|
+
];
|
|
302
|
+
case 2:
|
|
303
|
+
_state.sent();
|
|
304
|
+
// Wait for Storybook root element to be present
|
|
305
|
+
return [
|
|
306
|
+
4,
|
|
307
|
+
page.waitForSelector('#storybook-root', {
|
|
308
|
+
state: 'attached'
|
|
309
|
+
})
|
|
310
|
+
];
|
|
311
|
+
case 3:
|
|
312
|
+
_state.sent();
|
|
313
|
+
// Wait for fonts to load
|
|
314
|
+
return [
|
|
315
|
+
4,
|
|
316
|
+
page.evaluate(function() {
|
|
317
|
+
return document.fonts.ready;
|
|
318
|
+
})
|
|
319
|
+
];
|
|
320
|
+
case 4:
|
|
321
|
+
_state.sent();
|
|
322
|
+
// Wait for all images to load
|
|
323
|
+
return [
|
|
324
|
+
4,
|
|
325
|
+
page.evaluate(function() {
|
|
326
|
+
var images = Array.from(document.images);
|
|
327
|
+
return Promise.all(images.map(function(img) {
|
|
328
|
+
if (img.complete) return Promise.resolve();
|
|
329
|
+
return new Promise(function(resolve) {
|
|
330
|
+
img.addEventListener('load', resolve);
|
|
331
|
+
img.addEventListener('error', resolve); // Don't fail on broken images
|
|
332
|
+
});
|
|
333
|
+
}));
|
|
334
|
+
})
|
|
335
|
+
];
|
|
336
|
+
case 5:
|
|
337
|
+
_state.sent();
|
|
338
|
+
// Wait for document to have stable height (content fully rendered)
|
|
339
|
+
// This is critical for fullPage screenshots to capture the correct height
|
|
340
|
+
return [
|
|
341
|
+
4,
|
|
342
|
+
page.waitForFunction(function() {
|
|
343
|
+
return new Promise(function(resolve) {
|
|
344
|
+
var lastHeight = document.body.scrollHeight;
|
|
345
|
+
var checks = 0;
|
|
346
|
+
var interval = setInterval(function() {
|
|
347
|
+
var currentHeight = document.body.scrollHeight;
|
|
348
|
+
if (currentHeight === lastHeight && currentHeight > 0) {
|
|
349
|
+
checks++;
|
|
350
|
+
if (checks >= 5) {
|
|
351
|
+
clearInterval(interval);
|
|
352
|
+
resolve(true);
|
|
353
|
+
}
|
|
354
|
+
} else {
|
|
355
|
+
lastHeight = currentHeight;
|
|
356
|
+
checks = 0;
|
|
357
|
+
}
|
|
358
|
+
}, 100);
|
|
359
|
+
// Timeout after 5 seconds
|
|
360
|
+
setTimeout(function() {
|
|
361
|
+
clearInterval(interval);
|
|
362
|
+
resolve(true);
|
|
363
|
+
}, 5000);
|
|
364
|
+
});
|
|
365
|
+
})
|
|
366
|
+
];
|
|
367
|
+
case 6:
|
|
368
|
+
_state.sent();
|
|
369
|
+
// Additional wait for any lazy-loaded content
|
|
370
|
+
return [
|
|
371
|
+
4,
|
|
372
|
+
page.waitForTimeout(500)
|
|
373
|
+
];
|
|
374
|
+
case 7:
|
|
375
|
+
_state.sent();
|
|
376
|
+
// Disable animations and hide scrollbars for consistent screenshots
|
|
377
|
+
return [
|
|
378
|
+
4,
|
|
379
|
+
page.addStyleTag({
|
|
380
|
+
content: "\n *, *::before, *::after {\n animation-duration: 0s !important;\n animation-delay: 0s !important;\n transition-duration: 0s !important;\n transition-delay: 0s !important;\n }\n /* Hide scrollbars to prevent width variations */\n html, body {\n scrollbar-width: none !important;\n -ms-overflow-style: none !important;\n }\n html::-webkit-scrollbar, body::-webkit-scrollbar {\n display: none !important;\n width: 0 !important;\n height: 0 !important;\n }\n "
|
|
381
|
+
})
|
|
382
|
+
];
|
|
383
|
+
case 8:
|
|
384
|
+
_state.sent();
|
|
385
|
+
// Small wait for any re-renders after disabling animations
|
|
386
|
+
return [
|
|
387
|
+
4,
|
|
388
|
+
page.waitForTimeout(100)
|
|
389
|
+
];
|
|
390
|
+
case 9:
|
|
391
|
+
_state.sent();
|
|
392
|
+
// Take screenshot and compare
|
|
393
|
+
screenshotName = "".concat(storyId, ".png");
|
|
394
|
+
return [
|
|
395
|
+
4,
|
|
396
|
+
(0, _test.expect)(page).toHaveScreenshot(screenshotName, {
|
|
397
|
+
fullPage: true,
|
|
398
|
+
animations: 'disabled'
|
|
399
|
+
})
|
|
400
|
+
];
|
|
401
|
+
case 10:
|
|
402
|
+
_state.sent();
|
|
403
|
+
return [
|
|
404
|
+
2
|
|
405
|
+
];
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
})();
|
|
409
|
+
}
|
|
410
|
+
// Fetch stories once before all tests
|
|
411
|
+
var storiesList = null;
|
|
412
|
+
_test.test.beforeAll(function(param, testInfo) {
|
|
413
|
+
var ref = _object_destructuring_empty(param);
|
|
414
|
+
return _async_to_generator(function() {
|
|
415
|
+
var baseURL;
|
|
416
|
+
return _ts_generator(this, function(_state) {
|
|
417
|
+
switch(_state.label){
|
|
418
|
+
case 0:
|
|
419
|
+
baseURL = testInfo.project.use.baseURL || 'http://127.0.0.1:6006';
|
|
420
|
+
return [
|
|
421
|
+
4,
|
|
422
|
+
getStories(baseURL)
|
|
423
|
+
];
|
|
424
|
+
case 1:
|
|
425
|
+
storiesList = _state.sent();
|
|
426
|
+
return [
|
|
427
|
+
2
|
|
428
|
+
];
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
})();
|
|
432
|
+
});
|
|
433
|
+
_test.test.describe('Visual Regression Tests', function() {
|
|
434
|
+
(0, _test.test)('should have stories to test', function() {
|
|
435
|
+
return _async_to_generator(function() {
|
|
436
|
+
return _ts_generator(this, function(_state) {
|
|
437
|
+
// This test runs first to ensure stories are loaded
|
|
438
|
+
(0, _test.expect)(storiesList).not.toBeNull();
|
|
439
|
+
(0, _test.expect)(storiesList.length).toBeGreaterThan(0);
|
|
440
|
+
return [
|
|
441
|
+
2
|
|
442
|
+
];
|
|
443
|
+
});
|
|
444
|
+
})();
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
// Generate individual tests for each story
|
|
448
|
+
// Note: We use a wrapper test that iterates because Playwright needs
|
|
449
|
+
// static test definitions at collection time
|
|
450
|
+
_test.test.describe('Component Screenshots', function() {
|
|
451
|
+
// Disable retries - we handle errors ourselves and continue through all stories
|
|
452
|
+
_test.test.describe.configure({
|
|
453
|
+
retries: 0
|
|
454
|
+
});
|
|
455
|
+
(0, _test.test)('capture all component stories', function(param, testInfo) {
|
|
456
|
+
var page = param.page;
|
|
457
|
+
return _async_to_generator(function() {
|
|
458
|
+
var baseURL, completed, skipped, failed, failures, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step, err, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, f;
|
|
459
|
+
return _ts_generator(this, function(_state) {
|
|
460
|
+
switch(_state.label){
|
|
461
|
+
case 0:
|
|
462
|
+
// 20 minutes for all stories (500+ stories at ~2s each in CI)
|
|
463
|
+
_test.test.setTimeout(1200000);
|
|
464
|
+
baseURL = testInfo.project.use.baseURL || 'http://127.0.0.1:6006';
|
|
465
|
+
if (!!storiesList) return [
|
|
466
|
+
3,
|
|
467
|
+
2
|
|
468
|
+
];
|
|
469
|
+
return [
|
|
470
|
+
4,
|
|
471
|
+
getStories(baseURL)
|
|
472
|
+
];
|
|
473
|
+
case 1:
|
|
474
|
+
storiesList = _state.sent();
|
|
475
|
+
_state.label = 2;
|
|
476
|
+
case 2:
|
|
477
|
+
// Run each story, collecting failures to report at the end
|
|
478
|
+
completed = 0;
|
|
479
|
+
skipped = 0;
|
|
480
|
+
failed = 0;
|
|
481
|
+
failures = [];
|
|
482
|
+
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
483
|
+
_state.label = 3;
|
|
484
|
+
case 3:
|
|
485
|
+
_state.trys.push([
|
|
486
|
+
3,
|
|
487
|
+
8,
|
|
488
|
+
9,
|
|
489
|
+
10
|
|
490
|
+
]);
|
|
491
|
+
_loop = function() {
|
|
492
|
+
var story;
|
|
493
|
+
return _ts_generator(this, function(_state) {
|
|
494
|
+
switch(_state.label){
|
|
495
|
+
case 0:
|
|
496
|
+
story = _step.value;
|
|
497
|
+
return [
|
|
498
|
+
4,
|
|
499
|
+
_test.test.step("".concat(story.title, " - ").concat(story.name), function() {
|
|
500
|
+
return _async_to_generator(function() {
|
|
501
|
+
var result, error;
|
|
502
|
+
return _ts_generator(this, function(_state) {
|
|
503
|
+
switch(_state.label){
|
|
504
|
+
case 0:
|
|
505
|
+
_state.trys.push([
|
|
506
|
+
0,
|
|
507
|
+
2,
|
|
508
|
+
,
|
|
509
|
+
3
|
|
510
|
+
]);
|
|
511
|
+
return [
|
|
512
|
+
4,
|
|
513
|
+
screenshotStory(page, story.id)
|
|
514
|
+
];
|
|
515
|
+
case 1:
|
|
516
|
+
result = _state.sent();
|
|
517
|
+
if (result === null || result === void 0 ? void 0 : result.skipped) {
|
|
518
|
+
skipped++;
|
|
519
|
+
console.log(" [".concat(completed + skipped + failed, "/").concat(storiesList.length, "] SKIPPED: ").concat(story.id));
|
|
520
|
+
} else {
|
|
521
|
+
completed++;
|
|
522
|
+
console.log(" [".concat(completed + skipped + failed, "/").concat(storiesList.length, "] ✓ ").concat(story.id));
|
|
523
|
+
}
|
|
524
|
+
return [
|
|
525
|
+
3,
|
|
526
|
+
3
|
|
527
|
+
];
|
|
528
|
+
case 2:
|
|
529
|
+
error = _state.sent();
|
|
530
|
+
failed++;
|
|
531
|
+
failures.push({
|
|
532
|
+
story: story.id,
|
|
533
|
+
error: error.message
|
|
534
|
+
});
|
|
535
|
+
console.log(" [".concat(completed + skipped + failed, "/").concat(storiesList.length, "] ✗ ").concat(story.id, ": ").concat(error.message.split('\n')[0]));
|
|
536
|
+
return [
|
|
537
|
+
3,
|
|
538
|
+
3
|
|
539
|
+
];
|
|
540
|
+
case 3:
|
|
541
|
+
return [
|
|
542
|
+
2
|
|
543
|
+
];
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
})();
|
|
547
|
+
})
|
|
548
|
+
];
|
|
549
|
+
case 1:
|
|
550
|
+
_state.sent();
|
|
551
|
+
return [
|
|
552
|
+
2
|
|
553
|
+
];
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
};
|
|
557
|
+
_iterator = storiesList[Symbol.iterator]();
|
|
558
|
+
_state.label = 4;
|
|
559
|
+
case 4:
|
|
560
|
+
if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
|
|
561
|
+
3,
|
|
562
|
+
7
|
|
563
|
+
];
|
|
564
|
+
return [
|
|
565
|
+
5,
|
|
566
|
+
_ts_values(_loop())
|
|
567
|
+
];
|
|
568
|
+
case 5:
|
|
569
|
+
_state.sent();
|
|
570
|
+
_state.label = 6;
|
|
571
|
+
case 6:
|
|
572
|
+
_iteratorNormalCompletion = true;
|
|
573
|
+
return [
|
|
574
|
+
3,
|
|
575
|
+
4
|
|
576
|
+
];
|
|
577
|
+
case 7:
|
|
578
|
+
return [
|
|
579
|
+
3,
|
|
580
|
+
10
|
|
581
|
+
];
|
|
582
|
+
case 8:
|
|
583
|
+
err = _state.sent();
|
|
584
|
+
_didIteratorError = true;
|
|
585
|
+
_iteratorError = err;
|
|
586
|
+
return [
|
|
587
|
+
3,
|
|
588
|
+
10
|
|
589
|
+
];
|
|
590
|
+
case 9:
|
|
591
|
+
try {
|
|
592
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
593
|
+
_iterator.return();
|
|
594
|
+
}
|
|
595
|
+
} finally{
|
|
596
|
+
if (_didIteratorError) {
|
|
597
|
+
throw _iteratorError;
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
return [
|
|
601
|
+
7
|
|
602
|
+
];
|
|
603
|
+
case 10:
|
|
604
|
+
console.log("\n========================================");
|
|
605
|
+
console.log("Completed: ".concat(completed, ", Skipped: ").concat(skipped, ", Failed: ").concat(failed, ", Total: ").concat(storiesList.length));
|
|
606
|
+
if (failures.length > 0) {
|
|
607
|
+
console.log("\nFailed stories:");
|
|
608
|
+
_iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
609
|
+
try {
|
|
610
|
+
for(_iterator1 = failures[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
611
|
+
f = _step1.value;
|
|
612
|
+
console.log(" - ".concat(f.story));
|
|
613
|
+
}
|
|
614
|
+
} catch (err) {
|
|
615
|
+
_didIteratorError1 = true;
|
|
616
|
+
_iteratorError1 = err;
|
|
617
|
+
} finally{
|
|
618
|
+
try {
|
|
619
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
620
|
+
_iterator1.return();
|
|
621
|
+
}
|
|
622
|
+
} finally{
|
|
623
|
+
if (_didIteratorError1) {
|
|
624
|
+
throw _iteratorError1;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
throw new Error("".concat(failures.length, " story screenshot(s) failed. See logs above for details."));
|
|
629
|
+
}
|
|
630
|
+
return [
|
|
631
|
+
2
|
|
632
|
+
];
|
|
633
|
+
}
|
|
634
|
+
});
|
|
635
|
+
})();
|
|
636
|
+
});
|
|
637
|
+
});
|