@wise/dynamic-flow-client-internal 3.8.0-experimental-6700be9 → 3.9.0-experimental-bd037e3
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 +51 -2
- package/build/dynamicFlow/DynamicFlow.js +4 -3
- package/build/main.js +4 -3
- package/build/main.min.js +1 -1
- package/build/main.mjs +4 -3
- package/build/stories/DynamicFlowWithRef.story.js +102 -0
- package/build/types/dynamicFlow/DynamicFlow.d.ts +2 -2
- package/build/types/index.d.ts +2 -0
- package/build/types/stories/DynamicFlowWithRef.story.d.ts +8 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
translations as dynamicFlowsTranslations,
|
|
59
59
|
} from '@wise/dynamic-flow-client-internal';
|
|
60
60
|
|
|
61
|
-
const messages = getLocalisedMessages(locale, [componentTranslations, dynamicFlowsTranslations])
|
|
61
|
+
const messages = getLocalisedMessages(locale, [componentTranslations, dynamicFlowsTranslations]);
|
|
62
62
|
|
|
63
63
|
return (
|
|
64
64
|
<Provider i18n={{ locale, messages }}>
|
|
@@ -73,7 +73,7 @@ return (
|
|
|
73
73
|
|
|
74
74
|
### For non-CRAB apps
|
|
75
75
|
|
|
76
|
-
You'll need to merge the '@transferwise/components' translations with the '@wise/dynamic-flow-client' translations.
|
|
76
|
+
You'll need to merge the '@transferwise/components' translations with the '@wise/dynamic-flow-client' translations.
|
|
77
77
|
|
|
78
78
|
```js
|
|
79
79
|
import {
|
|
@@ -238,6 +238,55 @@ type LoaderConfig = {
|
|
|
238
238
|
| `initial` | boolean | Whether or not to display the Loader component while loading the initial step. | true |
|
|
239
239
|
| `submission` | boolean | Whether or not to display the Loader component during form submissions. | false |
|
|
240
240
|
|
|
241
|
+
## Using Dynamic Flow with a ref
|
|
242
|
+
|
|
243
|
+
**Note:** this only works with `DynamicFlowRevamp`.
|
|
244
|
+
|
|
245
|
+
If you need to extract the submittable data outside of a submission, you can do so by providing us with a ref. This will give you access to two methods: `getValue` and `validate`. For example:
|
|
246
|
+
|
|
247
|
+
```tsx
|
|
248
|
+
import type { DynamicFlowController } from '@wise/dynamic-flow-client-internal';
|
|
249
|
+
import { DynamicFlowRevamp } from '@wise/dynamic-flow-client-internal';
|
|
250
|
+
import { useRef } from 'react';
|
|
251
|
+
|
|
252
|
+
function DynamicFlowWithRef() {
|
|
253
|
+
const ref = useRef<DynamicFlowController | null>(null);
|
|
254
|
+
|
|
255
|
+
return (
|
|
256
|
+
<>
|
|
257
|
+
<DynamicFlowRevamp
|
|
258
|
+
ref={ref}
|
|
259
|
+
flowId={"id"}
|
|
260
|
+
customFetch={fetch}
|
|
261
|
+
initialStep={selectedStep}
|
|
262
|
+
onEvent={(eventName, props) => {
|
|
263
|
+
// Note - this event will only be fired if you provide a ref
|
|
264
|
+
if (eventName === 'Dynamic Flow - Value Changed') {
|
|
265
|
+
// Value has changed.
|
|
266
|
+
}
|
|
267
|
+
}}
|
|
268
|
+
onCompletion={(error) => console.error(error)}
|
|
269
|
+
onCompletion={() => console.log('Completed')}
|
|
270
|
+
/>
|
|
271
|
+
<Button
|
|
272
|
+
onClick={async () => {
|
|
273
|
+
// This will get the value, whether or not the form is valid
|
|
274
|
+
const value = (await ref.current?.getValue()) ?? null);
|
|
275
|
+
|
|
276
|
+
// This will trigger validation of the form and show any validation messages to the user.
|
|
277
|
+
// The response is a boolean indicating whether or not the form is valid.
|
|
278
|
+
const isValid = ref.current?.validate();
|
|
279
|
+
|
|
280
|
+
// Whatever you want to do with value
|
|
281
|
+
}}
|
|
282
|
+
>
|
|
283
|
+
Log value
|
|
284
|
+
</Button>
|
|
285
|
+
</>
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
241
290
|
## Contributing
|
|
242
291
|
|
|
243
292
|
We love contributions! Check out `CONTRIBUTING.md` for more information.
|
|
@@ -11,13 +11,14 @@ var __assign = (this && this.__assign) || function () {
|
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
13
|
import { DynamicFlowRevamp as DynamicFlowCoreRevamp, DynamicFlow as DynamicFlowCoreLegacy, } from '@wise/dynamic-flow-client';
|
|
14
|
+
import { forwardRef } from 'react';
|
|
14
15
|
export function DynamicFlowLegacy(props) {
|
|
15
16
|
var _a = props.customFetch, customFetch = _a === void 0 ? globalThis.fetch : _a;
|
|
16
17
|
var coreProps = __assign(__assign({}, props), { httpClient: customFetch });
|
|
17
18
|
return _jsx(DynamicFlowCoreLegacy, __assign({}, coreProps));
|
|
18
19
|
}
|
|
19
|
-
export function DynamicFlowRevamp(props) {
|
|
20
|
+
export var DynamicFlowRevamp = forwardRef(function DynamicFlowRevamp(props, ref) {
|
|
20
21
|
var _a = props.customFetch, customFetch = _a === void 0 ? globalThis.fetch : _a;
|
|
21
22
|
var coreProps = __assign(__assign({}, props), { httpClient: customFetch });
|
|
22
|
-
return _jsx(DynamicFlowCoreRevamp, __assign({}, coreProps));
|
|
23
|
-
}
|
|
23
|
+
return _jsx(DynamicFlowCoreRevamp, __assign({ ref: ref }, coreProps));
|
|
24
|
+
});
|
package/build/main.js
CHANGED
|
@@ -51,17 +51,18 @@ var import_dynamic_flow_client3 = require("@wise/dynamic-flow-client");
|
|
|
51
51
|
|
|
52
52
|
// src/dynamicFlow/DynamicFlow.tsx
|
|
53
53
|
var import_dynamic_flow_client = require("@wise/dynamic-flow-client");
|
|
54
|
+
var import_react = require("react");
|
|
54
55
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
55
56
|
function DynamicFlowLegacy(props) {
|
|
56
57
|
const { customFetch = globalThis.fetch } = props;
|
|
57
58
|
const coreProps = __spreadProps(__spreadValues({}, props), { httpClient: customFetch });
|
|
58
59
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dynamic_flow_client.DynamicFlow, __spreadValues({}, coreProps));
|
|
59
60
|
}
|
|
60
|
-
|
|
61
|
+
var DynamicFlowRevamp = (0, import_react.forwardRef)(function DynamicFlowRevamp2(props, ref) {
|
|
61
62
|
const { customFetch = globalThis.fetch } = props;
|
|
62
63
|
const coreProps = __spreadProps(__spreadValues({}, props), { httpClient: customFetch });
|
|
63
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dynamic_flow_client.DynamicFlowRevamp, __spreadValues({}, coreProps));
|
|
64
|
-
}
|
|
64
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dynamic_flow_client.DynamicFlowRevamp, __spreadValues({ ref }, coreProps));
|
|
65
|
+
});
|
|
65
66
|
|
|
66
67
|
// src/index.ts
|
|
67
68
|
var makeCustomFetch = import_dynamic_flow_client2.makeHttpClient;
|
package/build/main.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var m=Object.defineProperty,f=Object.defineProperties,C=Object.getOwnPropertyDescriptor,R=Object.getOwnPropertyDescriptors,v=Object.getOwnPropertyNames,s=Object.getOwnPropertySymbols;var F=Object.prototype.hasOwnProperty,g=Object.prototype.propertyIsEnumerable;var w=(t,o,i)=>o in t?m(t,o,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[o]=i,n=(t,o)=>{for(var i in o||(o={}))F.call(o,i)&&w(t,i,o[i]);if(s)for(var i of s(o))g.call(o,i)&&w(t,i,o[i]);return t},p=(t,o)=>f(t,R(o));var d=(t,o)=>{for(var i in o)m(t,i,{get:o[i],enumerable:!0})},L=(t,o,i,c)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of v(o))!F.call(t,e)&&e!==i&&m(t,e,{get:()=>o[e],enumerable:!(c=C(o,e))||c.enumerable});return t};var u=t=>L(m({},"__esModule",{value:!0}),t);var I={};d(I,{DynamicFlow:()=>r,DynamicFlowLegacy:()=>r,DynamicFlowRevamp:()=>h,JsonSchemaForm:()=>a.JsonSchemaForm,isValidSchema:()=>a.isValidSchema,makeCustomFetch:()=>x,translations:()=>a.translations});module.exports=u(I);var P=require("@wise/dynamic-flow-client"),a=require("@wise/dynamic-flow-client");var l=require("@wise/dynamic-flow-client"),D=require("react");var y=require("react/jsx-runtime");function r(t){let{customFetch:o=globalThis.fetch}=t,i=p(n({},t),{httpClient:o});return(0,y.jsx)(l.DynamicFlow,n({},i))}var h=(0,D.forwardRef)(function(o,i){let{customFetch:c=globalThis.fetch}=o,e=p(n({},o),{httpClient:c});return(0,y.jsx)(l.DynamicFlowRevamp,n({ref:i},e))});var x=P.makeHttpClient;
|
package/build/main.mjs
CHANGED
|
@@ -27,17 +27,18 @@ import {
|
|
|
27
27
|
DynamicFlowRevamp as DynamicFlowCoreRevamp,
|
|
28
28
|
DynamicFlow as DynamicFlowCoreLegacy
|
|
29
29
|
} from "@wise/dynamic-flow-client";
|
|
30
|
+
import { forwardRef } from "react";
|
|
30
31
|
import { jsx } from "react/jsx-runtime";
|
|
31
32
|
function DynamicFlowLegacy(props) {
|
|
32
33
|
const { customFetch = globalThis.fetch } = props;
|
|
33
34
|
const coreProps = __spreadProps(__spreadValues({}, props), { httpClient: customFetch });
|
|
34
35
|
return /* @__PURE__ */ jsx(DynamicFlowCoreLegacy, __spreadValues({}, coreProps));
|
|
35
36
|
}
|
|
36
|
-
|
|
37
|
+
var DynamicFlowRevamp = forwardRef(function DynamicFlowRevamp2(props, ref) {
|
|
37
38
|
const { customFetch = globalThis.fetch } = props;
|
|
38
39
|
const coreProps = __spreadProps(__spreadValues({}, props), { httpClient: customFetch });
|
|
39
|
-
return /* @__PURE__ */ jsx(DynamicFlowCoreRevamp, __spreadValues({}, coreProps));
|
|
40
|
-
}
|
|
40
|
+
return /* @__PURE__ */ jsx(DynamicFlowCoreRevamp, __spreadValues({ ref }, coreProps));
|
|
41
|
+
});
|
|
41
42
|
|
|
42
43
|
// src/index.ts
|
|
43
44
|
var makeCustomFetch = makeHttpClient;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
22
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
23
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
24
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
25
|
+
function step(op) {
|
|
26
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
27
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
28
|
+
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;
|
|
29
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
30
|
+
switch (op[0]) {
|
|
31
|
+
case 0: case 1: t = op; break;
|
|
32
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
33
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
34
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
35
|
+
default:
|
|
36
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
37
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
38
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
39
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
40
|
+
if (t[2]) _.ops.pop();
|
|
41
|
+
_.trys.pop(); continue;
|
|
42
|
+
}
|
|
43
|
+
op = body.call(thisArg, _);
|
|
44
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
45
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
49
|
+
import { action } from '@storybook/addon-actions';
|
|
50
|
+
import { layouts, features, examples, schemas } from '@wise/dynamic-flow-fixtures';
|
|
51
|
+
import { fixtureHttpClient } from './utils/fixtureHttpClient';
|
|
52
|
+
import { useRef } from 'react';
|
|
53
|
+
import { Button } from '@transferwise/components';
|
|
54
|
+
import { DynamicFlowRevamp } from '../dynamicFlow/DynamicFlow';
|
|
55
|
+
var fixtures = __assign(__assign(__assign(__assign({}, examples), schemas), layouts), features);
|
|
56
|
+
function DynamicFlowWithRef(_a) {
|
|
57
|
+
var _this = this;
|
|
58
|
+
var _b = _a.initialStepName, initialStepName = _b === void 0 ? '' : _b;
|
|
59
|
+
var selectedStep = (fixtures[initialStepName] || {});
|
|
60
|
+
var ref = useRef(null);
|
|
61
|
+
var props = {
|
|
62
|
+
flowId: 'storybook',
|
|
63
|
+
customFetch: fixtureHttpClient,
|
|
64
|
+
onCompletion: action('onCompletion'),
|
|
65
|
+
onError: action('onError'),
|
|
66
|
+
onEvent: action('onEvent'),
|
|
67
|
+
onLog: action('onLog'),
|
|
68
|
+
};
|
|
69
|
+
return (_jsxs(_Fragment, { children: [_jsx(DynamicFlowRevamp, __assign({ ref: ref, initialStep: selectedStep }, props)), _jsx(Button, { onClick: function () { return __awaiter(_this, void 0, void 0, function () {
|
|
70
|
+
var _a;
|
|
71
|
+
var _b, _c, _d;
|
|
72
|
+
return __generator(this, function (_e) {
|
|
73
|
+
switch (_e.label) {
|
|
74
|
+
case 0:
|
|
75
|
+
_a = action('getValue');
|
|
76
|
+
return [4 /*yield*/, ((_b = ref.current) === null || _b === void 0 ? void 0 : _b.getValue())];
|
|
77
|
+
case 1:
|
|
78
|
+
_a.apply(void 0, [(_c = (_e.sent())) !== null && _c !== void 0 ? _c : null]);
|
|
79
|
+
action('validate')((_d = ref.current) === null || _d === void 0 ? void 0 : _d.validate());
|
|
80
|
+
return [2 /*return*/];
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}); }, children: "Log value" })] }));
|
|
84
|
+
}
|
|
85
|
+
var meta = {
|
|
86
|
+
title: 'Dynamic Flow With Ref',
|
|
87
|
+
component: DynamicFlowWithRef,
|
|
88
|
+
};
|
|
89
|
+
export var AllFixtures = {
|
|
90
|
+
argTypes: {
|
|
91
|
+
initialStepName: {
|
|
92
|
+
label: 'Initial Step',
|
|
93
|
+
control: 'select',
|
|
94
|
+
options: Object.keys(fixtures),
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
args: { initialStepName: Object.keys(fixtures)[1] },
|
|
98
|
+
parameters: {
|
|
99
|
+
chromatic: { disableSnapshot: true },
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
export default meta;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
import { type DynamicFlowProps as DynamicFlowCoreLegacyProps, type DynamicFlowRevampProps as DynamicFlowCoreRevampProps, type DynamicFlowRevampPropsWithInitialAction, type DynamicFlowRevampPropsWithInitialStep } from '@wise/dynamic-flow-client';
|
|
2
|
+
import { type DynamicFlowProps as DynamicFlowCoreLegacyProps, type DynamicFlowRevampProps as DynamicFlowCoreRevampProps, type DynamicFlowRevampPropsWithInitialAction, type DynamicFlowRevampPropsWithInitialStep, type DynamicFlowController } from '@wise/dynamic-flow-client';
|
|
3
3
|
import type { DynamicFlowPropsWithInitialAction, DynamicFlowPropsWithInitialStep } from '@wise/dynamic-flow-client/build/types/legacy/dynamic-flow-types';
|
|
4
4
|
export type DynamicFlowLegacyProps = (Omit<DynamicFlowPropsWithInitialAction, 'httpClient'> | Omit<DynamicFlowPropsWithInitialStep, 'httpClient'>) & {
|
|
5
5
|
customFetch?: DynamicFlowCoreLegacyProps['httpClient'];
|
|
@@ -8,4 +8,4 @@ export type DynamicFlowRevampProps = (Omit<DynamicFlowRevampPropsWithInitialActi
|
|
|
8
8
|
customFetch?: DynamicFlowCoreRevampProps['httpClient'];
|
|
9
9
|
};
|
|
10
10
|
export declare function DynamicFlowLegacy(props: DynamicFlowLegacyProps): JSX.Element;
|
|
11
|
-
export declare
|
|
11
|
+
export declare const DynamicFlowRevamp: import("react").ForwardRefExoticComponent<DynamicFlowRevampProps & import("react").RefAttributes<DynamicFlowController>>;
|
package/build/types/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { type DynamicFlowController } from '@wise/dynamic-flow-client';
|
|
1
2
|
export type { DynamicFlowProps, Step, InitialAction } from '@wise/dynamic-flow-client';
|
|
2
3
|
export { translations, JsonSchemaForm, isValidSchema } from '@wise/dynamic-flow-client';
|
|
3
4
|
export type { DynamicFlowLegacyProps as WiseDynamicFlowProps, DynamicFlowLegacyProps, DynamicFlowRevampProps, } from './dynamicFlow/DynamicFlow';
|
|
4
5
|
export { DynamicFlowLegacy as DynamicFlow, DynamicFlowLegacy, DynamicFlowRevamp, } from './dynamicFlow/DynamicFlow';
|
|
5
6
|
export declare const makeCustomFetch: (baseUrl: string, additionalHeaders?: HeadersInit | undefined) => typeof fetch;
|
|
7
|
+
export type { DynamicFlowController };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { StoryObj, Meta } from '@storybook/react';
|
|
3
|
+
declare function DynamicFlowWithRef({ initialStepName }: {
|
|
4
|
+
initialStepName?: string | undefined;
|
|
5
|
+
}): JSX.Element;
|
|
6
|
+
declare const meta: Meta<typeof DynamicFlowWithRef>;
|
|
7
|
+
export declare const AllFixtures: StoryObj<typeof DynamicFlowWithRef>;
|
|
8
|
+
export default meta;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wise/dynamic-flow-client-internal",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.0-experimental-bd037e3",
|
|
4
4
|
"description": "Dynamic Flow web client for Wise",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "./build/main.min.js",
|
|
@@ -72,7 +72,8 @@
|
|
|
72
72
|
"stylelint-value-no-unknown-custom-properties": "6.0.1",
|
|
73
73
|
"typescript": "5.1.6",
|
|
74
74
|
"webpack": "5.91.0",
|
|
75
|
-
"@wise/dynamic-flow-fixtures": "0.0.1"
|
|
75
|
+
"@wise/dynamic-flow-fixtures": "0.0.1",
|
|
76
|
+
"@wise/dynamic-flow-types": "2.14.0"
|
|
76
77
|
},
|
|
77
78
|
"peerDependencies": {
|
|
78
79
|
"react": "^18",
|
|
@@ -80,7 +81,7 @@
|
|
|
80
81
|
"react-intl": "^6"
|
|
81
82
|
},
|
|
82
83
|
"dependencies": {
|
|
83
|
-
"@wise/dynamic-flow-client": "3.
|
|
84
|
+
"@wise/dynamic-flow-client": "3.9.0-experimental-bd037e3"
|
|
84
85
|
},
|
|
85
86
|
"scripts": {
|
|
86
87
|
"dev": "storybook dev -p 3005",
|