@flowerforce/flower-react 4.0.5-beta.0 → 4.0.7-beta.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/dist/index.cjs.js CHANGED
@@ -6,9 +6,10 @@ var flowerCore = require('@flowerforce/flower-core');
6
6
  var flowerReactContext = require('@flowerforce/flower-react-context');
7
7
  var _get = require('lodash/get');
8
8
  var toolkit = require('@reduxjs/toolkit');
9
- var reselect = require('reselect');
10
9
  var flowerReactStore = require('@flowerforce/flower-react-store');
10
+ var reselect = require('reselect');
11
11
  var flowerReactShared = require('@flowerforce/flower-react-shared');
12
+ var set = require('lodash/set');
12
13
 
13
14
  // eslint-disable-next-line import/prefer-default-export
14
15
  const convertElements = (nodes) => {
@@ -26,6 +27,10 @@ const flowerFlowReducer = flowerReducer.reducer;
26
27
  const reducerFlower = {
27
28
  [flowerCore.REDUCER_NAME.FLOWER_FLOW]: flowerFlowReducer
28
29
  };
30
+ const flowerReducers = {
31
+ ...reducerFlower,
32
+ ...flowerReactStore.reducerData
33
+ };
29
34
 
30
35
  const { selectGlobal, selectGlobalData } = flowerCore.FlowerCoreStateSelectors;
31
36
  const selectFlower = (name) => reselect.createSelector(selectGlobal, flowerCore.FlowerCoreStateSelectors.selectFlower(name));
@@ -50,7 +55,7 @@ reselect.createSelector(selectGlobalData, flowerCore.FlowerStateUtils.getAllData
50
55
  */
51
56
  const FlowerClient = ({ children, name, destroyOnUnmount = true, startId = null, initialState = {}, initialData }) => {
52
57
  const flowName = name;
53
- const dispatch = flowerReactStore.useDispatch();
58
+ const { dispatch, store, useSelector } = flowerReactStore.ReduxFlowerProvider.getReduxHooks();
54
59
  const one = React.useRef(false);
55
60
  const [wsDevtools, setWsDevtools] = React.useState(flowerCore.devtoolState && _get(flowerCore.devtoolState, '__FLOWER_DEVTOOLS_INITIALIZED__', false));
56
61
  // TODO could make that transformation in CoreUtils.generateNodesForFlowerJson
@@ -59,12 +64,11 @@ const FlowerClient = ({ children, name, destroyOnUnmount = true, startId = null,
59
64
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
65
  () => convertElements(React.Children.toArray(children)), [children]);
61
66
  const nodeById = React.useMemo(() => _keyBy(React.Children.toArray(children), 'props.id'), [children]);
62
- const isInitialized = flowerReactStore.useSelector(makeSelectStartNodeId(name));
63
- const history = flowerReactStore.useSelector(selectFlowerHistory(name));
64
- const current = flowerReactStore.useSelector(makeSelectCurrentNodeId(flowName));
65
- const isDisabled = flowerReactStore.useSelector(makeSelectCurrentNodeDisabled(flowName));
66
- const prevFlowerNodeId = flowerReactStore.useSelector(makeSelectPrevNodeRetain(flowName));
67
- const store = flowerReactStore.useStore();
67
+ const isInitialized = useSelector(makeSelectStartNodeId(name));
68
+ const history = useSelector(selectFlowerHistory(name));
69
+ const current = useSelector(makeSelectCurrentNodeId(flowName));
70
+ const isDisabled = useSelector(makeSelectCurrentNodeDisabled(flowName));
71
+ const prevFlowerNodeId = useSelector(makeSelectPrevNodeRetain(flowName));
68
72
  React.useEffect(() => {
69
73
  if (nodes.length > 0 && one.current === false) {
70
74
  one.current = true;
@@ -326,12 +330,13 @@ const makeActionPayloadOnRestart = makeActionPayload(ACTION_TYPES.restart, PAYLO
326
330
  * @param {string} name - optional parameter, if flowName exist, name is not used
327
331
  */
328
332
  const useFlower = ({ flowName: customFlowName, name } = {}) => {
329
- const dispatch = flowerReactStore.useDispatch();
333
+ const { store, useSelector, dispatch } = flowerReactStore.ReduxFlowerProvider.getReduxHooks();
334
+ // const dispatch = useDispatch()
330
335
  const { name: flowNameDefault, initialData } = React.useContext(flowerReactContext.FlowerReactContext);
331
- const store = flowerReactStore.useStore();
336
+ // const store = useStore()
332
337
  const flowName = (customFlowName || name || flowNameDefault);
333
- const nodeId = flowerReactStore.useSelector(makeSelectCurrentNodeId(flowName ?? ''));
334
- const startId = flowerReactStore.useSelector(makeSelectStartNodeId(flowName ?? ''));
338
+ const nodeId = useSelector(makeSelectCurrentNodeId(flowName ?? ''));
339
+ const startId = useSelector(makeSelectStartNodeId(flowName ?? ''));
335
340
  const emitNavigateEvent = React.useCallback(
336
341
  //TODO check this function is needed
337
342
  (params) => {
@@ -528,7 +533,7 @@ component$3.displayName = 'FlowerNode';
528
533
  const FlowerNode = component$3;
529
534
 
530
535
  const _FlowerRoute = ({ autostart = true, children, onEnter, onExit }) => {
531
- const dispatch = flowerReactStore.useDispatch();
536
+ const { dispatch } = flowerReactStore.ReduxFlowerProvider.getReduxHooks();
532
537
  const one = React.useRef(false);
533
538
  const { name } = React.useContext(flowerReactContext.FlowerReactContext);
534
539
  React.useEffect(() => {
@@ -557,10 +562,10 @@ component$1.displayName = 'FlowerServer';
557
562
  const FlowerServer = component$1;
558
563
 
559
564
  function _FlowerStart() {
560
- const dispatch = flowerReactStore.useDispatch();
565
+ const { dispatch, useSelector } = flowerReactStore.ReduxFlowerProvider.getReduxHooks();
561
566
  const one = React.useRef(false);
562
567
  const { name, autostart = true, currentNode } = React.useContext(flowerReactContext.FlowerReactContext);
563
- const startNodeId = flowerReactStore.useSelector(makeSelectStartNodeId(name ?? ''));
568
+ const startNodeId = useSelector(makeSelectStartNodeId(name ?? ''));
564
569
  React.useEffect(() => {
565
570
  if (startNodeId === currentNode && autostart && one.current === false) {
566
571
  one.current = true;
@@ -593,17 +598,64 @@ const FlowerProvider = ({ children, enableReduxDevtool, configureStore }) => {
593
598
  } }, children));
594
599
  };
595
600
 
596
- Object.defineProperty(exports, "useDispatch", {
597
- enumerable: true,
598
- get: function () { return flowerReactStore.useDispatch; }
599
- });
600
- Object.defineProperty(exports, "useSelector", {
601
- enumerable: true,
602
- get: function () { return flowerReactStore.useSelector; }
603
- });
604
- Object.defineProperty(exports, "useStore", {
601
+ /**
602
+ *
603
+ * @param {ConfigureStoreOptions} configureStore object to configure store - same structure as redux configureStore options
604
+ * @param {MiddlewareList} middlewaresBlacklist list of flower middlewares to blacklist
605
+ * @returns {Store} redux store instance
606
+ */
607
+ const createStoreWithFlower = (configureStore, middlewaresBlacklist) => {
608
+ if (!configureStore) {
609
+ return toolkit.configureStore({
610
+ reducer: toolkit.combineReducers({ ...flowerReactStore.reducerData, ...reducerFlower }),
611
+ devTools: true
612
+ });
613
+ }
614
+ const { reducer, ...configOptions } = configureStore ?? {};
615
+ const combinedReducers = toolkit.combineReducers({
616
+ ...flowerReactStore.reducerData,
617
+ ...reducerFlower,
618
+ ...(reducer || {})
619
+ });
620
+ const flowerMiddlewares = middlewaresBlacklist && !!middlewaresBlacklist.length
621
+ ? flowerReactStore.middlewares.filter((middleware) => !middlewaresBlacklist.includes(middleware.name))
622
+ : flowerReactStore.middlewares;
623
+ return toolkit.configureStore({
624
+ reducer: combinedReducers,
625
+ ...configOptions,
626
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(...flowerMiddlewares, ...(configOptions.middleware ?? []))
627
+ });
628
+ };
629
+
630
+ // createSlice({
631
+ // name: "myStore",
632
+ // initialState: {
633
+ // gino: 1,
634
+ // } as Record<string, number>,
635
+ // reducers: {
636
+ // add: (state) => ({ ...state, gino: state.gino + 1 }),
637
+ // },
638
+ // });
639
+ const updateAction = (reducerName) => toolkit.createAction(`${reducerName}/flowerUpdateData`);
640
+ const createSliceWithFlower = (createSliceOptions) => {
641
+ const { name, reducers } = createSliceOptions;
642
+ updateAction(name);
643
+ const slice = toolkit.createSlice({
644
+ ...createSliceOptions,
645
+ reducers: {
646
+ ...reducers,
647
+ flowerUpdateData: (state, { payload }) => {
648
+ const { path, value } = payload;
649
+ set(state, path, value);
650
+ }
651
+ }
652
+ });
653
+ return slice;
654
+ };
655
+
656
+ Object.defineProperty(exports, "createApi", {
605
657
  enumerable: true,
606
- get: function () { return flowerReactStore.useStore; }
658
+ get: function () { return flowerReactStore.createApi; }
607
659
  });
608
660
  exports.Flower = Flower;
609
661
  exports.FlowerAction = FlowerAction;
@@ -615,6 +667,10 @@ exports.FlowerProvider = FlowerProvider;
615
667
  exports.FlowerRoute = FlowerRoute;
616
668
  exports.FlowerServer = FlowerServer;
617
669
  exports.FlowerStart = FlowerStart;
670
+ exports.createSliceWithFlower = createSliceWithFlower;
671
+ exports.createStoreWithFlower = createStoreWithFlower;
672
+ exports.flowerReducers = flowerReducers;
618
673
  exports.makeSelectData = makeSelectData;
674
+ exports.reducerFlower = reducerFlower;
619
675
  exports.useFlower = useFlower;
620
676
  exports.useFlowerNavigate = useFlowerNavigate;
package/dist/index.esm.js CHANGED
@@ -3,11 +3,12 @@ import _keyBy from 'lodash/keyBy';
3
3
  import { CoreUtils, FlowerCoreBaseReducers, REDUCER_NAME, FlowerCoreStateSelectors, FlowerStateUtils, devtoolState, Emitter } from '@flowerforce/flower-core';
4
4
  import { FlowerReactProvider, FlowerReactContext } from '@flowerforce/flower-react-context';
5
5
  import _get from 'lodash/get';
6
- import { createSlice } from '@reduxjs/toolkit';
6
+ import { createSlice, configureStore, combineReducers, createAction } from '@reduxjs/toolkit';
7
+ import { reducerData, ReduxFlowerProvider, flowerDataActions, middlewares } from '@flowerforce/flower-react-store';
8
+ export { createApi } from '@flowerforce/flower-react-store';
7
9
  import { createSelector } from 'reselect';
8
- import { useDispatch, useSelector, useStore, flowerDataActions, ReduxFlowerProvider } from '@flowerforce/flower-react-store';
9
- export { useDispatch, useSelector, useStore } from '@flowerforce/flower-react-store';
10
10
  import { FlowerRule } from '@flowerforce/flower-react-shared';
11
+ import set from 'lodash/set';
11
12
 
12
13
  // eslint-disable-next-line import/prefer-default-export
13
14
  const convertElements = (nodes) => {
@@ -25,6 +26,10 @@ const flowerFlowReducer = flowerReducer.reducer;
25
26
  const reducerFlower = {
26
27
  [REDUCER_NAME.FLOWER_FLOW]: flowerFlowReducer
27
28
  };
29
+ const flowerReducers = {
30
+ ...reducerFlower,
31
+ ...reducerData
32
+ };
28
33
 
29
34
  const { selectGlobal, selectGlobalData } = FlowerCoreStateSelectors;
30
35
  const selectFlower = (name) => createSelector(selectGlobal, FlowerCoreStateSelectors.selectFlower(name));
@@ -49,7 +54,7 @@ createSelector(selectGlobalData, FlowerStateUtils.getAllData);
49
54
  */
50
55
  const FlowerClient = ({ children, name, destroyOnUnmount = true, startId = null, initialState = {}, initialData }) => {
51
56
  const flowName = name;
52
- const dispatch = useDispatch();
57
+ const { dispatch, store, useSelector } = ReduxFlowerProvider.getReduxHooks();
53
58
  const one = useRef(false);
54
59
  const [wsDevtools, setWsDevtools] = useState(devtoolState && _get(devtoolState, '__FLOWER_DEVTOOLS_INITIALIZED__', false));
55
60
  // TODO could make that transformation in CoreUtils.generateNodesForFlowerJson
@@ -63,7 +68,6 @@ const FlowerClient = ({ children, name, destroyOnUnmount = true, startId = null,
63
68
  const current = useSelector(makeSelectCurrentNodeId(flowName));
64
69
  const isDisabled = useSelector(makeSelectCurrentNodeDisabled(flowName));
65
70
  const prevFlowerNodeId = useSelector(makeSelectPrevNodeRetain(flowName));
66
- const store = useStore();
67
71
  useEffect(() => {
68
72
  if (nodes.length > 0 && one.current === false) {
69
73
  one.current = true;
@@ -325,9 +329,10 @@ const makeActionPayloadOnRestart = makeActionPayload(ACTION_TYPES.restart, PAYLO
325
329
  * @param {string} name - optional parameter, if flowName exist, name is not used
326
330
  */
327
331
  const useFlower = ({ flowName: customFlowName, name } = {}) => {
328
- const dispatch = useDispatch();
332
+ const { store, useSelector, dispatch } = ReduxFlowerProvider.getReduxHooks();
333
+ // const dispatch = useDispatch()
329
334
  const { name: flowNameDefault, initialData } = useContext(FlowerReactContext);
330
- const store = useStore();
335
+ // const store = useStore()
331
336
  const flowName = (customFlowName || name || flowNameDefault);
332
337
  const nodeId = useSelector(makeSelectCurrentNodeId(flowName ?? ''));
333
338
  const startId = useSelector(makeSelectStartNodeId(flowName ?? ''));
@@ -527,7 +532,7 @@ component$3.displayName = 'FlowerNode';
527
532
  const FlowerNode = component$3;
528
533
 
529
534
  const _FlowerRoute = ({ autostart = true, children, onEnter, onExit }) => {
530
- const dispatch = useDispatch();
535
+ const { dispatch } = ReduxFlowerProvider.getReduxHooks();
531
536
  const one = useRef(false);
532
537
  const { name } = useContext(FlowerReactContext);
533
538
  useEffect(() => {
@@ -556,7 +561,7 @@ component$1.displayName = 'FlowerServer';
556
561
  const FlowerServer = component$1;
557
562
 
558
563
  function _FlowerStart() {
559
- const dispatch = useDispatch();
564
+ const { dispatch, useSelector } = ReduxFlowerProvider.getReduxHooks();
560
565
  const one = useRef(false);
561
566
  const { name, autostart = true, currentNode } = useContext(FlowerReactContext);
562
567
  const startNodeId = useSelector(makeSelectStartNodeId(name ?? ''));
@@ -592,4 +597,59 @@ const FlowerProvider = ({ children, enableReduxDevtool, configureStore }) => {
592
597
  } }, children));
593
598
  };
594
599
 
595
- export { Flower, FlowerAction, FlowerComponent, FlowerFlow, FlowerNavigate, FlowerNode, FlowerProvider, FlowerRoute, FlowerServer, FlowerStart, makeSelectData, useFlower, useFlowerNavigate };
600
+ /**
601
+ *
602
+ * @param {ConfigureStoreOptions} configureStore object to configure store - same structure as redux configureStore options
603
+ * @param {MiddlewareList} middlewaresBlacklist list of flower middlewares to blacklist
604
+ * @returns {Store} redux store instance
605
+ */
606
+ const createStoreWithFlower = (configureStore$1, middlewaresBlacklist) => {
607
+ if (!configureStore$1) {
608
+ return configureStore({
609
+ reducer: combineReducers({ ...reducerData, ...reducerFlower }),
610
+ devTools: true
611
+ });
612
+ }
613
+ const { reducer, ...configOptions } = configureStore$1 ?? {};
614
+ const combinedReducers = combineReducers({
615
+ ...reducerData,
616
+ ...reducerFlower,
617
+ ...(reducer || {})
618
+ });
619
+ const flowerMiddlewares = middlewaresBlacklist && !!middlewaresBlacklist.length
620
+ ? middlewares.filter((middleware) => !middlewaresBlacklist.includes(middleware.name))
621
+ : middlewares;
622
+ return configureStore({
623
+ reducer: combinedReducers,
624
+ ...configOptions,
625
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(...flowerMiddlewares, ...(configOptions.middleware ?? []))
626
+ });
627
+ };
628
+
629
+ // createSlice({
630
+ // name: "myStore",
631
+ // initialState: {
632
+ // gino: 1,
633
+ // } as Record<string, number>,
634
+ // reducers: {
635
+ // add: (state) => ({ ...state, gino: state.gino + 1 }),
636
+ // },
637
+ // });
638
+ const updateAction = (reducerName) => createAction(`${reducerName}/flowerUpdateData`);
639
+ const createSliceWithFlower = (createSliceOptions) => {
640
+ const { name, reducers } = createSliceOptions;
641
+ updateAction(name);
642
+ const slice = createSlice({
643
+ ...createSliceOptions,
644
+ reducers: {
645
+ ...reducers,
646
+ flowerUpdateData: (state, { payload }) => {
647
+ const { path, value } = payload;
648
+ set(state, path, value);
649
+ }
650
+ }
651
+ });
652
+ return slice;
653
+ };
654
+
655
+ export { Flower, FlowerAction, FlowerComponent, FlowerFlow, FlowerNavigate, FlowerNode, FlowerProvider, FlowerRoute, FlowerServer, FlowerStart, createSliceWithFlower, createStoreWithFlower, flowerReducers, makeSelectData, reducerFlower, useFlower, useFlowerNavigate };
@@ -1,6 +1,7 @@
1
- import { Flower, REDUCER_NAME } from '@flowerforce/flower-core';
1
+ import { REDUCER_NAME } from '@flowerforce/flower-core';
2
2
  import { REDUCERS_TYPES } from '@flowerforce/flower-react-store';
3
- export declare const flowerReducer: import("@reduxjs/toolkit").Slice<Record<string, Flower<Record<string, any>>>, import("@flowerforce/flower-core").CoreReducersFunctions, REDUCER_NAME.FLOWER_FLOW, REDUCER_NAME.FLOWER_FLOW, import("@reduxjs/toolkit").SliceSelectors<Record<string, Flower<Record<string, any>>>>>;
3
+ export declare const flowerReducer: import("@reduxjs/toolkit").Slice<{}, import("@flowerforce/flower-core").CoreReducersFunctions, REDUCER_NAME.FLOWER_FLOW, REDUCER_NAME.FLOWER_FLOW, import("@reduxjs/toolkit").SliceSelectors<{}>>;
4
4
  export declare const flowerActions: import("@reduxjs/toolkit").CaseReducerActions<import("@flowerforce/flower-core").CoreReducersFunctions, REDUCER_NAME.FLOWER_FLOW>;
5
- export declare const flowerFlowReducer: import("redux").Reducer<Record<string, Flower<Record<string, any>>>>;
5
+ export declare const flowerFlowReducer: import("redux").Reducer<{}>;
6
6
  export declare const reducerFlower: REDUCERS_TYPES;
7
+ export declare const flowerReducers: {};
@@ -1,5 +1,5 @@
1
1
  export * from './components';
2
2
  export * from './provider';
3
- export { makeSelectData } from './features';
3
+ export { makeSelectData, reducerFlower, flowerReducers } from './features';
4
4
  export type * from './types';
5
- export { useDispatch, useSelector, useStore } from '@flowerforce/flower-react-store';
5
+ export { createApi } from '@flowerforce/flower-react-store';
@@ -0,0 +1,2 @@
1
+ import { CreateSliceOptions, Slice, SliceCaseReducers, SliceSelectors } from '@reduxjs/toolkit';
2
+ export declare const createSliceWithFlower: <State extends object, CaseReducers extends SliceCaseReducers<State>, Name extends string, Selectors extends SliceSelectors<State>, ReducerPath extends string = Name>(createSliceOptions: CreateSliceOptions<State, CaseReducers, Name, ReducerPath, Selectors>) => Slice<State, CaseReducers, Name, ReducerPath, Selectors>;
@@ -0,0 +1,8 @@
1
+ import { CreateStoreWithFlower } from '../types/middlewares';
2
+ /**
3
+ *
4
+ * @param {ConfigureStoreOptions} configureStore object to configure store - same structure as redux configureStore options
5
+ * @param {MiddlewareList} middlewaresBlacklist list of flower middlewares to blacklist
6
+ * @returns {Store} redux store instance
7
+ */
8
+ export declare const createStoreWithFlower: CreateStoreWithFlower;
@@ -1 +1,3 @@
1
1
  export * from './provider';
2
+ export * from './createStoreWithFlower';
3
+ export * from './createSliceWithFlower';
@@ -1,11 +1,7 @@
1
1
  import React, { PropsWithChildren } from 'react';
2
- import { ConfigureStoreOptions, Reducer, UnknownAction } from '@reduxjs/toolkit';
3
- export declare const FlowerProvider: <T extends Record<string, unknown> = Record<string, unknown>>({ children, enableReduxDevtool, configureStore }: PropsWithChildren<{
4
- configureStore?: Omit<ConfigureStoreOptions, 'reducer'> & {
5
- reducer?: Reducer<T, UnknownAction> | {
6
- [x: string]: Reducer<T, UnknownAction>;
7
- };
8
- };
2
+ import { ConfigureStoreOptions } from '@reduxjs/toolkit';
3
+ export declare const FlowerProvider: ({ children, enableReduxDevtool, configureStore }: PropsWithChildren<{
4
+ configureStore?: ConfigureStoreOptions;
9
5
  /** @deprecated - uses devTools key from configureStoreOptions instead */
10
6
  enableReduxDevtool?: boolean;
11
7
  }>) => React.JSX.Element;
@@ -0,0 +1,16 @@
1
+ import { ConfigureStoreOptions, Store } from '@reduxjs/toolkit';
2
+ export type MiddlewareList = 'flowerUpdateMiddleware';
3
+ type Values<T> = T[keyof T];
4
+ type UniqueTuple<U extends string> = [U] extends [never] ? [] : Values<{
5
+ [K in U]: [K, ...UniqueTuple<Exclude<U, K>>];
6
+ }>;
7
+ export type UniqueMiddlewaresist = UniqueTuple<MiddlewareList>;
8
+ /**
9
+ * Generates a Redux store instance with flower reducers injected automatically.
10
+ *
11
+ * @param {ConfigureStoreOptions} configureStore - The configuration options for creating the Redux store.
12
+ * @param {MiddlewareList} middlewaresBlacklist - Blacklist of middlewares we don't want to be integrated
13
+ * @returns {Store} A configured REdux store instance with flower reducers
14
+ */
15
+ export type CreateStoreWithFlower = (configureStore?: ConfigureStoreOptions, middlewaresBlacklist?: Array<MiddlewareList>) => Store;
16
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowerforce/flower-react",
3
- "version": "4.0.5-beta.0",
3
+ "version": "4.0.7-beta.0",
4
4
  "description": "FlowerJS components, hooks and utils for React.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -37,10 +37,10 @@
37
37
  "typescript": "^5.4.5"
38
38
  },
39
39
  "dependencies": {
40
- "@flowerforce/flower-core": "4.0.1-beta.2",
41
- "@flowerforce/flower-react-context": "4.0.1-beta.2",
42
- "@flowerforce/flower-react-store": "4.0.1-beta.2",
43
- "@flowerforce/flower-react-shared": "4.0.3-beta.0",
40
+ "@flowerforce/flower-core": "4.0.1-beta.4",
41
+ "@flowerforce/flower-react-context": "4.0.1-beta.4",
42
+ "@flowerforce/flower-react-store": "4.0.1-beta.4",
43
+ "@flowerforce/flower-react-shared": "4.0.5-beta.0",
44
44
  "lodash": "^4.17.21"
45
45
  },
46
46
  "exports": {