@itcase/storybook-config 1.2.71 → 1.2.73

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 (32) hide show
  1. package/README.md +9 -0
  2. package/dist/FormSubmitWrapper-kEv1DMjn.js +296 -0
  3. package/dist/{_rollupPluginBabelHelpers-D8XyM9rZ.js → _rollupPluginBabelHelpers-B1r4NF8e.js} +61 -0
  4. package/dist/cjs/components/FormSubmitWrapper.js +2 -2
  5. package/dist/cjs/decorators/withFigmaSourceLink.js +59 -3
  6. package/dist/cjs/decorators/withFormSubmitDecorator.js +1128 -6
  7. package/dist/cjs/decorators/withNextDecorator.js +7 -12
  8. package/dist/cjs/decorators/withUiDecorator.js +4 -9
  9. package/dist/cjs/decorators.js +6 -8
  10. package/dist/components/EmailTemplatePreview.js +2 -2
  11. package/dist/components/FormSubmitWrapper-obAauTlP.js +294 -0
  12. package/dist/components/FormSubmitWrapper.js +2 -2
  13. package/dist/components/{_rollupPluginBabelHelpers-DQ-fuxJg.js → _rollupPluginBabelHelpers-CEVa9ZMs.js} +61 -1
  14. package/dist/components/isArray-CPoGkdXv.js +43 -0
  15. package/dist/config/sourceLink/sourceLink.js +8 -16
  16. package/dist/decorators/withClearStoresDecorator.js +2 -2
  17. package/dist/decorators/withExtraProviders.js +2 -2
  18. package/dist/decorators/withFigmaSourceLink.js +61 -5
  19. package/dist/decorators/withFormSubmitDecorator.js +1131 -9
  20. package/dist/decorators/withLayoutDecorator.js +9 -9
  21. package/dist/decorators/withNextDecorator.js +8 -13
  22. package/dist/decorators/withUiDecorator.js +5 -10
  23. package/dist/decorators.js +6 -8
  24. package/dist/isArray-DJguRq_2.js +47 -0
  25. package/dist/utils/handleMSWParameters.js +20 -8
  26. package/dist/utils/index.js +2 -0
  27. package/dist/utils/storybookServerErrorOnSubmit.js +21 -0
  28. package/package.json +35 -29
  29. package/dist/FormSubmitWrapper-DXUEGLuS.js +0 -247
  30. package/dist/Notification-Cqx2_tCE.js +0 -7945
  31. package/dist/components/FormSubmitWrapper-YokGjDrh.js +0 -245
  32. package/dist/components/Notification-qLYjGbKN.js +0 -7923
package/README.md CHANGED
@@ -67,3 +67,12 @@ npm run storybook-react-native-web
67
67
  # или:
68
68
  make storybook-react-native-web
69
69
  ```
70
+
71
+ ## Peer dependencies
72
+
73
+ Декораторы `withNextDecoratorFactory` и `withUiDecorator` используют `UIProvider` и уведомления из пакетов ITCase UI. В проекте-потребителе должны быть установлены:
74
+
75
+ - `@itcase/ui-core` — контекст устройства (`useUserDeviceContext`)
76
+ - `@itcase/ui-web` — `NotificationWrapper`
77
+
78
+ Оба пакета резолвятся из `node_modules` потребителя (не бандлятся в `@itcase/storybook-config`), чтобы React Context был общим с компонентами приложения.
@@ -0,0 +1,296 @@
1
+ 'use strict';
2
+
3
+ var _rollupPluginBabelHelpers = require('./_rollupPluginBabelHelpers-B1r4NF8e.js');
4
+ var React = require('react');
5
+
6
+ var SUBMIT_TIMEOUT_MS = 15000;
7
+ var SUBMIT_POLL_MS = 50;
8
+ function getStoryPreviewDocument() {
9
+ var _document$getElementB, _previewIframe$conten;
10
+ var previewIframe = (_document$getElementB = document.getElementById('storybook-preview-iframe')) !== null && _document$getElementB !== void 0 ? _document$getElementB : document.querySelector('iframe[data-is-storybook="true"]');
11
+ return (_previewIframe$conten = previewIframe === null || previewIframe === void 0 ? void 0 : previewIframe.contentDocument) !== null && _previewIframe$conten !== void 0 ? _previewIframe$conten : null;
12
+ }
13
+ function getMountRoot() {
14
+ var _ref2, _document$getElementB2;
15
+ var previewDocument = getStoryPreviewDocument();
16
+ if (previewDocument) {
17
+ var _ref, _previewDocument$getE;
18
+ return (_ref = (_previewDocument$getE = previewDocument.getElementById('storybook-root')) !== null && _previewDocument$getE !== void 0 ? _previewDocument$getE : previewDocument.getElementById('root')) !== null && _ref !== void 0 ? _ref : previewDocument.body;
19
+ }
20
+ return (_ref2 = (_document$getElementB2 = document.getElementById('storybook-root')) !== null && _document$getElementB2 !== void 0 ? _document$getElementB2 : document.getElementById('root')) !== null && _ref2 !== void 0 ? _ref2 : document.body;
21
+ }
22
+ function canSubmitFormApi(form) {
23
+ return typeof (form === null || form === void 0 ? void 0 : form.submit) === 'function' && typeof form.getRegisteredFields === 'function' && form.getRegisteredFields().length > 0;
24
+ }
25
+ function findSaveDraftButton(root) {
26
+ if (!root) {
27
+ return null;
28
+ }
29
+ var saveDraft = root.querySelector('[data-testid$="SaveDraftButton"]');
30
+ if (!saveDraft) {
31
+ return null;
32
+ }
33
+ return saveDraft.tagName === 'BUTTON' ? saveDraft : saveDraft.querySelector('button');
34
+ }
35
+ function findSubmitButton(root) {
36
+ var _form$querySelector;
37
+ if (!root) {
38
+ return null;
39
+ }
40
+ var byType = root.querySelector('button[type="submit"]');
41
+ if (byType) {
42
+ return byType;
43
+ }
44
+ var form = root.querySelector('form[data-testid], form');
45
+ if (!form) {
46
+ return null;
47
+ }
48
+ return (_form$querySelector = form.querySelector('.form__button .form__button-item, .form__button-item')) !== null && _form$querySelector !== void 0 ? _form$querySelector : null;
49
+ }
50
+ function touchFieldsBeforeSubmit(form) {
51
+ if (!canSubmitFormApi(form)) {
52
+ return;
53
+ }
54
+ var _iterator = _rollupPluginBabelHelpers._createForOfIteratorHelper(form.getRegisteredFields()),
55
+ _step;
56
+ try {
57
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
58
+ var _form$getFieldState;
59
+ var fieldName = _step.value;
60
+ if (!((_form$getFieldState = form.getFieldState(fieldName)) !== null && _form$getFieldState !== void 0 && _form$getFieldState.touched)) {
61
+ form.blur(fieldName);
62
+ }
63
+ }
64
+ } catch (err) {
65
+ _iterator.e(err);
66
+ } finally {
67
+ _iterator.f();
68
+ }
69
+ }
70
+ function hasModifiedFields(form) {
71
+ return Object.values(form.getState().modified).some(Boolean);
72
+ }
73
+
74
+ /** Filled edit-формы (#1167): без modified submit не уходит — для story auto-submit. */
75
+ function ensureFormModifiedForStorybookSubmit(form) {
76
+ if (!canSubmitFormApi(form) || hasModifiedFields(form)) {
77
+ return;
78
+ }
79
+ var _form$getState = form.getState(),
80
+ values = _form$getState.values;
81
+ var _iterator2 = _rollupPluginBabelHelpers._createForOfIteratorHelper(form.getRegisteredFields()),
82
+ _step2;
83
+ try {
84
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
85
+ var fieldName = _step2.value;
86
+ var value = values[fieldName];
87
+ if (typeof value === 'string' && value.length > 0) {
88
+ form.change(fieldName, "".concat(value, "x"));
89
+ return;
90
+ }
91
+ }
92
+ } catch (err) {
93
+ _iterator2.e(err);
94
+ } finally {
95
+ _iterator2.f();
96
+ }
97
+ }
98
+ function clickSubmitButton(submitButton) {
99
+ if (!submitButton) {
100
+ return;
101
+ }
102
+ var nativeButton = submitButton.tagName === 'BUTTON' ? submitButton : submitButton.querySelector('button');
103
+ (nativeButton !== null && nativeButton !== void 0 ? nativeButton : submitButton).click();
104
+ }
105
+ function triggerFormSubmit(_ref3) {
106
+ var form = _ref3.form,
107
+ root = _ref3.root,
108
+ submitButton = _ref3.submitButton;
109
+ var saveDraftButton = findSaveDraftButton(root !== null && root !== void 0 ? root : getMountRoot());
110
+ if (saveDraftButton) {
111
+ saveDraftButton.click();
112
+ return;
113
+ }
114
+ if (canSubmitFormApi(form)) {
115
+ ensureFormModifiedForStorybookSubmit(form);
116
+ touchFieldsBeforeSubmit(form);
117
+ form.submit();
118
+ return;
119
+ }
120
+ clickSubmitButton(submitButton);
121
+ }
122
+ function autoSubmitForm(_x, _x2) {
123
+ return _autoSubmitForm.apply(this, arguments);
124
+ }
125
+ function _autoSubmitForm() {
126
+ _autoSubmitForm = _rollupPluginBabelHelpers._asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers._regenerator().m(function _callee(formRef, signal) {
127
+ var deadline, _submitButton$querySe, root, form, submitButton, saveDraftButton, canSubmitViaFormApi, canClickNativeSubmit, canClickSaveDraft;
128
+ return _rollupPluginBabelHelpers._regenerator().w(function (_context) {
129
+ while (1) switch (_context.n) {
130
+ case 0:
131
+ if (!formRef.__itcaseDidAutoSubmit) {
132
+ _context.n = 1;
133
+ break;
134
+ }
135
+ return _context.a(2);
136
+ case 1:
137
+ deadline = Date.now() + SUBMIT_TIMEOUT_MS;
138
+ case 2:
139
+ if (!(Date.now() < deadline && !signal.aborted)) {
140
+ _context.n = 9;
141
+ break;
142
+ }
143
+ root = getMountRoot();
144
+ form = formRef.current;
145
+ submitButton = findSubmitButton(root);
146
+ saveDraftButton = findSaveDraftButton(root);
147
+ canSubmitViaFormApi = canSubmitFormApi(form);
148
+ canClickNativeSubmit = Boolean(submitButton && (submitButton.type === 'submit' || ((_submitButton$querySe = submitButton.querySelector) === null || _submitButton$querySe === void 0 ? void 0 : _submitButton$querySe.call(submitButton, 'button[type="submit"]'))));
149
+ canClickSaveDraft = Boolean(saveDraftButton); // primaryButtonHtmlType="button": ждём final-form API или кнопку черновика в DOM
150
+ if (!(!canSubmitViaFormApi && !canClickNativeSubmit && !canClickSaveDraft)) {
151
+ _context.n = 4;
152
+ break;
153
+ }
154
+ _context.n = 3;
155
+ return new Promise(function (resolve) {
156
+ setTimeout(resolve, SUBMIT_POLL_MS);
157
+ });
158
+ case 3:
159
+ return _context.a(3, 2);
160
+ case 4:
161
+ if (!(!canSubmitViaFormApi && canClickNativeSubmit && !canClickSaveDraft)) {
162
+ _context.n = 6;
163
+ break;
164
+ }
165
+ _context.n = 5;
166
+ return new Promise(function (resolve) {
167
+ setTimeout(resolve, SUBMIT_POLL_MS);
168
+ });
169
+ case 5:
170
+ return _context.a(3, 2);
171
+ case 6:
172
+ formRef.__itcaseDidAutoSubmit = true;
173
+ _context.n = 7;
174
+ return new Promise(function (resolve) {
175
+ requestAnimationFrame(function () {
176
+ requestAnimationFrame(resolve);
177
+ });
178
+ });
179
+ case 7:
180
+ if (!signal.aborted) {
181
+ _context.n = 8;
182
+ break;
183
+ }
184
+ return _context.a(2);
185
+ case 8:
186
+ triggerFormSubmit({
187
+ form: formRef.current,
188
+ root: root,
189
+ submitButton: submitButton
190
+ });
191
+ return _context.a(2);
192
+ case 9:
193
+ return _context.a(2);
194
+ }
195
+ }, _callee);
196
+ }));
197
+ return _autoSubmitForm.apply(this, arguments);
198
+ }
199
+
200
+ function wrapRender(component, render, formRef) {
201
+ var defaultArgs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
202
+ if (typeof render !== 'function') {
203
+ return render;
204
+ }
205
+ return function renderWithRef(storyArgs) {
206
+ var args = _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, defaultArgs), storyArgs !== null && storyArgs !== void 0 ? storyArgs : {});
207
+ delete args.ref;
208
+ delete args.errors;
209
+ if (!args.onSubmit && defaultArgs.onSubmit) {
210
+ args.onSubmit = defaultArgs.onSubmit;
211
+ }
212
+ var rendered = render(args);
213
+ if (/*#__PURE__*/React.isValidElement(rendered)) {
214
+ return /*#__PURE__*/React.cloneElement(rendered, _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, rendered.props), args), {}, {
215
+ ref: formRef
216
+ }));
217
+ }
218
+ if (component) {
219
+ return /*#__PURE__*/React.createElement(component, _rollupPluginBabelHelpers._objectSpread2({
220
+ ref: formRef
221
+ }, args));
222
+ }
223
+ return rendered;
224
+ };
225
+ }
226
+ function withFormRef(children, formRef, bindings) {
227
+ var _ref, _ref2, _children$props, _ref3, _children$props2, _ref4, _children$props3;
228
+ var component = bindings.component,
229
+ args = bindings.args,
230
+ storyRender = bindings.render,
231
+ allArgs = bindings.allArgs,
232
+ context = bindings.context;
233
+ var storyArgs = (_ref = (_ref2 = args !== null && args !== void 0 ? args : context === null || context === void 0 ? void 0 : context.args) !== null && _ref2 !== void 0 ? _ref2 : children === null || children === void 0 || (_children$props = children.props) === null || _children$props === void 0 ? void 0 : _children$props.args) !== null && _ref !== void 0 ? _ref : {};
234
+ var storyComponent = (_ref3 = component !== null && component !== void 0 ? component : context === null || context === void 0 ? void 0 : context.component) !== null && _ref3 !== void 0 ? _ref3 : children === null || children === void 0 || (_children$props2 = children.props) === null || _children$props2 === void 0 ? void 0 : _children$props2.component;
235
+ var storyRenderFn = (_ref4 = storyRender !== null && storyRender !== void 0 ? storyRender : context === null || context === void 0 ? void 0 : context.render) !== null && _ref4 !== void 0 ? _ref4 : children === null || children === void 0 || (_children$props3 = children.props) === null || _children$props3 === void 0 ? void 0 : _children$props3.render;
236
+ var boundRender = wrapRender(storyComponent, storyRenderFn, formRef, storyArgs);
237
+ var addRef = function addRef(value) {
238
+ return value ? _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, value), {}, {
239
+ ref: formRef
240
+ }) : value;
241
+ };
242
+ return /*#__PURE__*/React.cloneElement(children, {
243
+ component: storyComponent,
244
+ args: addRef(storyArgs),
245
+ render: boundRender,
246
+ allArgs: addRef(allArgs),
247
+ context: context ? _rollupPluginBabelHelpers._objectSpread2(_rollupPluginBabelHelpers._objectSpread2({}, context), {}, {
248
+ component: storyComponent,
249
+ args: addRef(context.args),
250
+ render: boundRender,
251
+ allArgs: addRef(context.allArgs)
252
+ }) : context
253
+ });
254
+ }
255
+
256
+ /**
257
+ * Авто-submit для интерактивного Storybook (Require / Validation / ServerError).
258
+ * При primaryButtonHtmlType="button" — formRef.current.submit() (final-form API),
259
+ * при type="submit" — click по кнопке. В Vitest submit в play.
260
+ */
261
+ function FormSubmitWrapper(props) {
262
+ var _ref5, _ref6, _children$props4;
263
+ var formRef = React.useRef(null);
264
+ var component = props.component,
265
+ args = props.args,
266
+ render = props.render,
267
+ allArgs = props.allArgs,
268
+ context = props.context,
269
+ _props$submit = props.submit,
270
+ submit = _props$submit === void 0 ? true : _props$submit,
271
+ children = props.children;
272
+ var storyArgs = (_ref5 = (_ref6 = args !== null && args !== void 0 ? args : context === null || context === void 0 ? void 0 : context.args) !== null && _ref6 !== void 0 ? _ref6 : children === null || children === void 0 || (_children$props4 = children.props) === null || _children$props4 === void 0 ? void 0 : _children$props4.args) !== null && _ref5 !== void 0 ? _ref5 : {};
273
+ React.useEffect(function () {
274
+ if (!submit) {
275
+ return undefined;
276
+ }
277
+ delete formRef.__itcaseDidAutoSubmit;
278
+ var abortController = new AbortController();
279
+ autoSubmitForm(formRef, abortController.signal);
280
+ return function () {
281
+ abortController.abort();
282
+ delete formRef.__itcaseDidAutoSubmit;
283
+ };
284
+ }, [submit, storyArgs.errors]);
285
+
286
+ // eslint-disable-next-line react-hooks/refs -- ref уходит в cloneElement внутри bound render
287
+ return withFormRef(children, formRef, {
288
+ component: component,
289
+ args: storyArgs,
290
+ render: render,
291
+ allArgs: allArgs,
292
+ context: context
293
+ });
294
+ }
295
+
296
+ exports.FormSubmitWrapper = FormSubmitWrapper;
@@ -1,5 +1,10 @@
1
1
  'use strict';
2
2
 
3
+ function _arrayLikeToArray(r, a) {
4
+ (null == a || a > r.length) && (a = r.length);
5
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
6
+ return n;
7
+ }
3
8
  function asyncGeneratorStep(n, t, e, r, o, a, c) {
4
9
  try {
5
10
  var i = n[a](c),
@@ -25,6 +30,54 @@ function _asyncToGenerator(n) {
25
30
  });
26
31
  };
27
32
  }
33
+ function _createForOfIteratorHelper(r, e) {
34
+ var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
35
+ if (!t) {
36
+ if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) {
37
+ t && (r = t);
38
+ var n = 0,
39
+ F = function () {};
40
+ return {
41
+ s: F,
42
+ n: function () {
43
+ return n >= r.length ? {
44
+ done: true
45
+ } : {
46
+ done: false,
47
+ value: r[n++]
48
+ };
49
+ },
50
+ e: function (r) {
51
+ throw r;
52
+ },
53
+ f: F
54
+ };
55
+ }
56
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
57
+ }
58
+ var o,
59
+ a = true,
60
+ u = false;
61
+ return {
62
+ s: function () {
63
+ t = t.call(r);
64
+ },
65
+ n: function () {
66
+ var r = t.next();
67
+ return a = r.done, r;
68
+ },
69
+ e: function (r) {
70
+ u = true, o = r;
71
+ },
72
+ f: function () {
73
+ try {
74
+ a || null == t.return || t.return();
75
+ } finally {
76
+ if (u) throw o;
77
+ }
78
+ }
79
+ };
80
+ }
28
81
  function _defineProperty(e, r, t) {
29
82
  return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
30
83
  value: t,
@@ -196,8 +249,16 @@ function _toPropertyKey(t) {
196
249
  var i = _toPrimitive(t, "string");
197
250
  return "symbol" == typeof i ? i : i + "";
198
251
  }
252
+ function _unsupportedIterableToArray(r, a) {
253
+ if (r) {
254
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
255
+ var t = {}.toString.call(r).slice(8, -1);
256
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
257
+ }
258
+ }
199
259
 
200
260
  exports._asyncToGenerator = _asyncToGenerator;
261
+ exports._createForOfIteratorHelper = _createForOfIteratorHelper;
201
262
  exports._objectSpread2 = _objectSpread2;
202
263
  exports._objectWithoutProperties = _objectWithoutProperties;
203
264
  exports._regenerator = _regenerator;
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var FormSubmitWrapper = require('../../FormSubmitWrapper-DXUEGLuS.js');
4
- require('../../_rollupPluginBabelHelpers-D8XyM9rZ.js');
3
+ var FormSubmitWrapper = require('../../FormSubmitWrapper-kEv1DMjn.js');
4
+ require('../../_rollupPluginBabelHelpers-B1r4NF8e.js');
5
5
  require('react');
6
6
 
7
7
 
@@ -1,8 +1,64 @@
1
1
  'use strict';
2
2
 
3
- var _rollupPluginBabelHelpers = require('../../_rollupPluginBabelHelpers-D8XyM9rZ.js');
3
+ var _rollupPluginBabelHelpers = require('../../_rollupPluginBabelHelpers-B1r4NF8e.js');
4
4
  var React = require('react');
5
- var s = require('lodash/castArray');
5
+ var isArray = require('../../isArray-DJguRq_2.js');
6
+
7
+ var castArray_1;
8
+ var hasRequiredCastArray;
9
+
10
+ function requireCastArray () {
11
+ if (hasRequiredCastArray) return castArray_1;
12
+ hasRequiredCastArray = 1;
13
+ var isArray$1 = isArray.requireIsArray();
14
+
15
+ /**
16
+ * Casts `value` as an array if it's not one.
17
+ *
18
+ * @static
19
+ * @memberOf _
20
+ * @since 4.4.0
21
+ * @category Lang
22
+ * @param {*} value The value to inspect.
23
+ * @returns {Array} Returns the cast array.
24
+ * @example
25
+ *
26
+ * _.castArray(1);
27
+ * // => [1]
28
+ *
29
+ * _.castArray({ 'a': 1 });
30
+ * // => [{ 'a': 1 }]
31
+ *
32
+ * _.castArray('abc');
33
+ * // => ['abc']
34
+ *
35
+ * _.castArray(null);
36
+ * // => [null]
37
+ *
38
+ * _.castArray(undefined);
39
+ * // => [undefined]
40
+ *
41
+ * _.castArray();
42
+ * // => []
43
+ *
44
+ * var array = [1, 2, 3];
45
+ * console.log(_.castArray(array) === array);
46
+ * // => true
47
+ */
48
+ function castArray() {
49
+ if (!arguments.length) {
50
+ return [];
51
+ }
52
+ var value = arguments[0];
53
+ return isArray$1(value) ? value : [value];
54
+ }
55
+
56
+ castArray_1 = castArray;
57
+ return castArray_1;
58
+ }
59
+
60
+ var castArrayExports = requireCastArray();
61
+ var castArray = /*@__PURE__*/isArray.getDefaultExportFromCjs(castArrayExports);
6
62
 
7
63
  function withFigmaSourceLink() {
8
64
  var decorator = function decorator(Story, _ref) {
@@ -10,7 +66,7 @@ function withFigmaSourceLink() {
10
66
  context = _ref.context;
11
67
  var sourceLink = parameters.sourceLink || {};
12
68
  if (parameters.design) {
13
- var designList = s(parameters.design);
69
+ var designList = castArray(parameters.design);
14
70
  if (!sourceLink.links) {
15
71
  sourceLink.links = {};
16
72
  }