@shopgate/pwa-common-commerce 6.22.0-beta.9 → 6.22.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/category/constants/index.js +1 -1
- package/category/helpers/index.js +6 -2
- package/category/streams/index.js +3 -3
- package/filter/actions/fetchFilters.js +3 -1
- package/filter/actions/helpers/buildFilterParams.js +3 -2
- package/filter/selectors/index.js +2 -2
- package/filter/streams/index.js +1 -1
- package/filter/subscriptions/index.js +2 -2
- package/package.json +3 -3
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export var CATEGORY_PATH='/category';export var ROOT_CATEGORY_PATTERN=CATEGORY_PATH;export var CATEGORY_PATTERN="".concat(CATEGORY_PATH,"/:categoryId");export var CATEGORY_FILTER_PATTERN="".concat(CATEGORY_PATH,"/:categoryId/filter");export var CATEGORY_LIFETIME=3600000;// 1 hour in milliseconds
|
|
1
|
+
export var CATEGORY_PATH='/category';export var ROOT_CATEGORY_PATTERN=CATEGORY_PATH;export var CATEGORY_PATTERN="".concat(CATEGORY_PATH,"/:categoryId");export var CATEGORY_FILTER_PATTERN="".concat(CATEGORY_PATH,"/:categoryId/filter");export var CATEGORY_ALL_PATTERN="".concat(CATEGORY_PATH,"/:categoryId/all");export var CATEGORY_ALL_FILTER_PATTERN="".concat(CATEGORY_PATH,"/:categoryId/all/filter");export var CATEGORY_LIFETIME=3600000;// 1 hour in milliseconds
|
|
2
2
|
export var REQUEST_ROOT_CATEGORIES='REQUEST_ROOT_CATEGORIES';export var RECEIVE_ROOT_CATEGORIES='RECEIVE_ROOT_CATEGORIES';export var ERROR_ROOT_CATEGORIES='ERROR_ROOT_CATEGORIES';export var REQUEST_CATEGORY='REQUEST_CATEGORY';export var RECEIVE_CATEGORY='RECEIVE_CATEGORY';export var ERROR_CATEGORY='ERROR_CATEGORY';export var REQUEST_CATEGORY_CHILDREN='REQUEST_CATEGORY_CHILDREN';export var RECEIVE_CATEGORY_CHILDREN='RECEIVE_CATEGORY_CHILDREN';export var ERROR_CATEGORY_CHILDREN='ERROR_CATEGORY_CHILDREN';
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import{bin2hex}from'@shopgate/pwa-common/helpers/data';import{CATEGORY_PATH}from"../constants";/**
|
|
1
|
+
import{bin2hex}from'@shopgate/pwa-common/helpers/data';import{i18n}from'@shopgate/engage/core';import{CATEGORY_PATH}from"../constants";/**
|
|
2
2
|
* Generate category route for navigation.
|
|
3
3
|
* @param {string} id category Id
|
|
4
4
|
* @returns {string}
|
|
5
|
-
*/export var getCategoryRoute=function getCategoryRoute(id){return"".concat(CATEGORY_PATH,"/").concat(bin2hex(id));}
|
|
5
|
+
*/export var getCategoryRoute=function getCategoryRoute(id){return"".concat(CATEGORY_PATH,"/").concat(bin2hex(id));};/**
|
|
6
|
+
* Generate filters for show all products.
|
|
7
|
+
* @param {Object} parentCategory parent category
|
|
8
|
+
* @returns {Object}
|
|
9
|
+
*/export var getShowAllProductsFilters=function getShowAllProductsFilters(parentCategory){var filters={categories:{id:'categories',label:i18n.text('filter.label.category'),source:'categories',type:'multiselect',value:[{id:parentCategory?parentCategory.path:null,label:parentCategory?parentCategory.name:null,isHidden:true,useForFetchFilters:true}]}};return filters;};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{main$,routeWillEnter$,routeDidEnter$,routeDidLeave$}from'@shopgate/pwa-common/streams';import{CATEGORY_PATTERN,RECEIVE_ROOT_CATEGORIES,ERROR_CATEGORY}from"../constants";export var categoryWillEnter$=routeWillEnter$.filter(function(_ref){var action=_ref.action;return action.route.pattern===CATEGORY_PATTERN;});export var categoryDidEnter$=routeDidEnter$.filter(function(_ref2){var action=_ref2.action;return action.route.pattern===CATEGORY_PATTERN;});export var categoryDidLeave$=routeDidLeave$.filter(function(_ref3){var action=_ref3.action;return action.route.pattern===CATEGORY_PATTERN;});/**
|
|
1
|
+
import{main$,routeWillEnter$,routeDidEnter$,routeDidLeave$}from'@shopgate/pwa-common/streams';import{CATEGORY_PATTERN,CATEGORY_ALL_PATTERN,RECEIVE_ROOT_CATEGORIES,ERROR_CATEGORY}from"../constants";export var categoryWillEnter$=routeWillEnter$.filter(function(_ref){var action=_ref.action;return action.route.pattern===CATEGORY_PATTERN;});export var categoryDidEnter$=routeDidEnter$.filter(function(_ref2){var action=_ref2.action;return action.route.pattern===CATEGORY_PATTERN;});export var categoryDidLeave$=routeDidLeave$.filter(function(_ref3){var action=_ref3.action;return action.route.pattern===CATEGORY_PATTERN;});export var categoryAllWillEnter$=routeWillEnter$.filter(function(_ref4){var action=_ref4.action;return action.route.pattern===CATEGORY_ALL_PATTERN;});export var categoryAllDidEnter$=routeDidEnter$.filter(function(_ref5){var action=_ref5.action;return action.route.pattern===CATEGORY_ALL_PATTERN;});export var categoryAllDidLeave$=routeDidLeave$.filter(function(_ref6){var action=_ref6.action;return action.route.pattern===CATEGORY_ALL_PATTERN;});/**
|
|
2
2
|
* Gets triggered when the root categories received.
|
|
3
|
-
*/export var receivedRootCategories$=main$.filter(function(
|
|
3
|
+
*/export var receivedRootCategories$=main$.filter(function(_ref7){var action=_ref7.action;return action.type===RECEIVE_ROOT_CATEGORIES;});/**
|
|
4
4
|
* Gets trigger when category error is dispatched.
|
|
5
|
-
*/export var categoryError$=main$.filter(function(
|
|
5
|
+
*/export var categoryError$=main$.filter(function(_ref8){var action=_ref8.action;return action.type===ERROR_CATEGORY;});
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
function _extends(){_extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};return _extends.apply(this,arguments);}import PipelineRequest from'@shopgate/pwa-core/classes/PipelineRequest';import{logger}from'@shopgate/pwa-core/helpers';import{generateResultHash,shouldFetchFilters}from'@shopgate/pwa-common/helpers/redux';import{SHOPGATE_CATALOG_GET_FILTERS}from"../constants/Pipelines";import requestFilters from"../action-creators/requestFilters";import receiveFilters from"../action-creators/receiveFilters";import errorFilters from"../action-creators/errorFilters";import{getFilterResults}from"../selectors";import buildFilterParams from"./helpers/buildFilterParams";import processParams from"./helpers/processParams";/**
|
|
2
2
|
* Retrieves the available filters for a list of products.
|
|
3
|
+
* @param {Object} options The options for the getProducts request.
|
|
4
|
+
* @param {Object} [options.filters = null] Filters object for the request
|
|
3
5
|
* @returns {Function} A redux thunk
|
|
4
|
-
*/function fetchFilters(){return function(dispatch,getState){var state=getState();var params=buildFilterParams(state);var hash=generateResultHash(_extends({pipeline:SHOPGATE_CATALOG_GET_FILTERS},params),false,false);var result=getFilterResults(state)[hash];if(!shouldFetchFilters(result)){return Promise.resolve(null);}// We need to process the params to handle edge cases in the pipeline params.
|
|
6
|
+
*/function fetchFilters(){var _ref=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},_ref$filters=_ref.filters,filters=_ref$filters===void 0?null:_ref$filters;return function(dispatch,getState){var state=getState();var params=buildFilterParams(state,filters);var hash=generateResultHash(_extends({pipeline:SHOPGATE_CATALOG_GET_FILTERS},params),false,false);var result=getFilterResults(state)[hash];if(!shouldFetchFilters(result)){return Promise.resolve(null);}// We need to process the params to handle edge cases in the pipeline params.
|
|
5
7
|
var requestParams=processParams(params);if(Object.keys(requestParams).length===0){var error="Attempt to call ".concat(SHOPGATE_CATALOG_GET_FILTERS," pipeline without parameters - aborted");logger.error(error);return Promise.reject(new Error(error));}dispatch(requestFilters(hash));var request=new PipelineRequest(SHOPGATE_CATALOG_GET_FILTERS).setInput(requestParams).dispatch();request.then(function(response){dispatch(receiveFilters(hash,response.filters));})["catch"](function(){dispatch(errorFilters(hash));});return request;};}export default fetchFilters;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
function _extends(){_extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};return _extends.apply(this,arguments);}import{getCurrentRoute}from'@shopgate/pwa-common/selectors/router';import{hex2bin}from'@shopgate/pwa-common/helpers/data';/**
|
|
1
|
+
function _extends(){_extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};return _extends.apply(this,arguments);}import{getCurrentRoute}from'@shopgate/pwa-common/selectors/router';import{CATEGORY_ALL_PATTERN,CATEGORY_ALL_FILTER_PATTERN}from'@shopgate/pwa-common-commerce/category/constants';import{hex2bin}from'@shopgate/pwa-common/helpers/data';import buildRequestFilters from"./buildRequestFilters";/**
|
|
2
2
|
* Creates the filter params.
|
|
3
3
|
* @param {Object} state The application state.
|
|
4
|
+
* @param {Object} [filters] Optional filters to be sent with the request
|
|
4
5
|
* @return {Object}
|
|
5
|
-
*/var buildFilterParams=function buildFilterParams(state){var _getCurrentRoute=getCurrentRoute(state),params=_getCurrentRoute.params,query=_getCurrentRoute.query;
|
|
6
|
+
*/var buildFilterParams=function buildFilterParams(state,filters){var _getCurrentRoute=getCurrentRoute(state),params=_getCurrentRoute.params,query=_getCurrentRoute.query,pattern=_getCurrentRoute.pattern;var filterParams=_extends({},params.categoryId&&{categoryId:hex2bin(params.categoryId)},query.s&&{searchPhrase:query.s});if([CATEGORY_ALL_PATTERN,CATEGORY_ALL_FILTER_PATTERN].includes(pattern)){filterParams={searchPhrase:'*'};}return _extends({},filterParams,filters?{filters:buildRequestFilters(filters)}:null);};export default buildFilterParams;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function _extends(){_extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};return _extends.apply(this,arguments);}import{createSelector}from'reselect';import{hex2bin}from'@shopgate/pwa-common/helpers/data';import{generateResultHash}from'@shopgate/pwa-common/helpers/redux';import{getCurrentState}from'@shopgate/pwa-common/selectors/router';import*as pipelines from"../constants/Pipelines";/**
|
|
1
|
+
function _extends(){_extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};return _extends.apply(this,arguments);}import{createSelector}from'reselect';import{hex2bin}from'@shopgate/pwa-common/helpers/data';import{generateResultHash}from'@shopgate/pwa-common/helpers/redux';import{getCurrentState}from'@shopgate/pwa-common/selectors/router';import*as pipelines from"../constants/Pipelines";import buildRequestFilters from"../actions/helpers/buildRequestFilters";/**
|
|
2
2
|
* Gets the filters reducer.
|
|
3
3
|
* @param {Object} state The application state.
|
|
4
4
|
* @return {Object}
|
|
@@ -11,7 +11,7 @@ function _extends(){_extends=Object.assign||function(target){for(var i=1;i<argum
|
|
|
11
11
|
* @param {Object} state The current application state.
|
|
12
12
|
* @param {Object} props The props.
|
|
13
13
|
* @return {Object}
|
|
14
|
-
*/export var getFiltersByHash=createSelector(getFilterResults,function(state,props){return props.categoryId;},function(state,props){return props.searchPhrase;},function(results,categoryId,searchPhrase){var hash=generateResultHash(_extends({pipeline:pipelines.SHOPGATE_CATALOG_GET_FILTERS},categoryId&&{categoryId:hex2bin(categoryId)},searchPhrase&&{searchPhrase:searchPhrase}),false,false);return results[hash]&&results[hash].filters||null;});/**
|
|
14
|
+
*/export var getFiltersByHash=createSelector(getFilterResults,function(state,props){return props.categoryId;},function(state,props){return props.searchPhrase;},function(state,props){return props.filters;},function(results,categoryId,searchPhrase,filters){var hash=generateResultHash(_extends({pipeline:pipelines.SHOPGATE_CATALOG_GET_FILTERS},categoryId&&{categoryId:hex2bin(categoryId)},searchPhrase&&{searchPhrase:searchPhrase},filters&&{filters:buildRequestFilters(filters)}),false,false);return results[hash]&&results[hash].filters||null;});/**
|
|
15
15
|
* Gets the currently active filters.
|
|
16
16
|
* @returns {Object|null}
|
|
17
17
|
*/export var getActiveFilters=createSelector(getCurrentState,function(_ref){var filters=_ref.filters;if(!filters){return null;}return filters;});/**
|
package/filter/streams/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{main$}from'@shopgate/pwa-common/streams/main';import{ACTION_PUSH,ACTION_POP}from'@virtuous/conductor';import{routeWillEnter$,routeDidEnter$,routeWillLeave$,routeDidLeave$}from'@shopgate/pwa-common/streams';import{CATEGORY_PATH}from"../../category/constants";import{SEARCH_PATH}from"../../search/constants";import{FILTER_PATH,UPDATE_FILTERS}from"../constants";export var filterWillEnter$=routeWillEnter$.filter(function(_ref){var action=_ref.action;return action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId").concat(FILTER_PATH)||action.route.pattern==="".concat(SEARCH_PATH).concat(FILTER_PATH);});export var filterDidEnter$=routeDidEnter$.filter(function(_ref2){var action=_ref2.action;return action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId").concat(FILTER_PATH)||action.route.pattern==="".concat(SEARCH_PATH).concat(FILTER_PATH);});export var filterWillLeave$=routeWillLeave$.filter(function(_ref3){var action=_ref3.action;return action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId").concat(FILTER_PATH)||action.route.pattern==="".concat(SEARCH_PATH).concat(FILTER_PATH);});export var filterDidLeave$=routeDidLeave$.filter(function(_ref4){var action=_ref4.action;return action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId").concat(FILTER_PATH)||action.route.pattern==="".concat(SEARCH_PATH).concat(FILTER_PATH);});export var filterableRoutesWillEnter$=routeWillEnter$.filter(function(_ref5){var action=_ref5.action;return action.historyAction===ACTION_PUSH&&(action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId")||action.route.pattern===SEARCH_PATH);});export var filterableRoutesWillReenter$=routeWillEnter$.filter(function(_ref6){var action=_ref6.action;return action.historyAction===ACTION_POP&&(action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId")||action.route.pattern===SEARCH_PATH);});export var filterableRoutesWillLeave$=routeWillLeave$.filter(function(_ref7){var action=_ref7.action;return action.historyAction===ACTION_POP&&(action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId")||action.route.pattern===SEARCH_PATH);});export var filtersDidUpdate$=main$.filter(function(_ref8){var action=_ref8.action;return action.type===UPDATE_FILTERS;});
|
|
1
|
+
import{main$}from'@shopgate/pwa-common/streams/main';import{ACTION_PUSH,ACTION_POP}from'@virtuous/conductor';import{routeWillEnter$,routeDidEnter$,routeWillLeave$,routeDidLeave$}from'@shopgate/pwa-common/streams';import{CATEGORY_PATH,CATEGORY_ALL_PATTERN,CATEGORY_ALL_FILTER_PATTERN}from"../../category/constants";import{SEARCH_PATH}from"../../search/constants";import{FILTER_PATH,UPDATE_FILTERS}from"../constants";export var filterWillEnter$=routeWillEnter$.filter(function(_ref){var action=_ref.action;return action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId").concat(FILTER_PATH)||action.route.pattern===CATEGORY_ALL_FILTER_PATTERN||action.route.pattern==="".concat(SEARCH_PATH).concat(FILTER_PATH);});export var filterDidEnter$=routeDidEnter$.filter(function(_ref2){var action=_ref2.action;return action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId").concat(FILTER_PATH)||action.route.pattern===CATEGORY_ALL_FILTER_PATTERN||action.route.pattern==="".concat(SEARCH_PATH).concat(FILTER_PATH);});export var filterWillLeave$=routeWillLeave$.filter(function(_ref3){var action=_ref3.action;return action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId").concat(FILTER_PATH)||action.route.pattern===CATEGORY_ALL_FILTER_PATTERN||action.route.pattern==="".concat(SEARCH_PATH).concat(FILTER_PATH);});export var filterDidLeave$=routeDidLeave$.filter(function(_ref4){var action=_ref4.action;return action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId").concat(FILTER_PATH)||action.route.pattern===CATEGORY_ALL_FILTER_PATTERN||action.route.pattern==="".concat(SEARCH_PATH).concat(FILTER_PATH);});export var filterableRoutesWillEnter$=routeWillEnter$.filter(function(_ref5){var action=_ref5.action;return action.historyAction===ACTION_PUSH&&(action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId")||action.route.pattern===CATEGORY_ALL_PATTERN||action.route.pattern===SEARCH_PATH);});export var filterableRoutesWillReenter$=routeWillEnter$.filter(function(_ref6){var action=_ref6.action;return action.historyAction===ACTION_POP&&(action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId")||action.route.pattern===CATEGORY_ALL_PATTERN||action.route.pattern===SEARCH_PATH);});export var filterableRoutesWillLeave$=routeWillLeave$.filter(function(_ref7){var action=_ref7.action;return action.historyAction===ACTION_POP&&(action.route.pattern==="".concat(CATEGORY_PATH,"/:categoryId")||action.route.pattern===CATEGORY_ALL_PATTERN||action.route.pattern===SEARCH_PATH);});export var filtersDidUpdate$=main$.filter(function(_ref8){var action=_ref8.action;return action.type===UPDATE_FILTERS;});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import fetchFilters from"../actions/fetchFilters";import{filterDidEnter$}from"../streams";/**
|
|
1
|
+
import _regeneratorRuntime from"@babel/runtime/regenerator";function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value;}catch(error){reject(error);return;}if(info.done){resolve(value);}else{Promise.resolve(value).then(_next,_throw);}}function _asyncToGenerator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value);}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err);}_next(undefined);});};}import{router}from'@shopgate/pwa-common/helpers/router';import{hex2bin}from'@shopgate/pwa-common/helpers/data';import{buildFilterParamsForFetchFiltersRequest}from'@shopgate/engage/filter';import{CATEGORY_ALL_FILTER_PATTERN}from"../../category/constants";import fetchCategory from"../../category/actions/fetchCategory";import{getShowAllProductsFilters}from"../../category/helpers";import fetchFilters from"../actions/fetchFilters";import{filterDidEnter$}from"../streams";/**
|
|
2
2
|
* Filters subscriptions.
|
|
3
3
|
* @param {Function} subscribe The subscribe function.
|
|
4
|
-
*/export default function filters(subscribe){subscribe(filterDidEnter
|
|
4
|
+
*/export default function filters(subscribe){subscribe(filterDidEnter$,/*#__PURE__*/function(){var _ref2=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref){var _action$route,_action$route2;var dispatch,action,_ref3,routeFilters,category;return _regeneratorRuntime.wrap(function _callee$(_context){while(1){switch(_context.prev=_context.next){case 0:dispatch=_ref.dispatch,action=_ref.action;_ref3=(action===null||action===void 0?void 0:(_action$route=action.route)===null||_action$route===void 0?void 0:_action$route.state)||{},routeFilters=_ref3.filters;if(!((action===null||action===void 0?void 0:(_action$route2=action.route)===null||_action$route2===void 0?void 0:_action$route2.pattern)===CATEGORY_ALL_FILTER_PATTERN)){_context.next=9;break;}if(routeFilters){_context.next=9;break;}_context.next=6;return dispatch(fetchCategory(hex2bin(action.route.params.categoryId)));case 6:category=_context.sent;routeFilters=getShowAllProductsFilters(category);router.update(action.route.id,{filters:routeFilters,categoryName:category.name});case 9:dispatch(fetchFilters({filters:buildFilterParamsForFetchFiltersRequest(routeFilters)}));case 10:case"end":return _context.stop();}}},_callee);}));return function(_x){return _ref2.apply(this,arguments);};}());}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shopgate/pwa-common-commerce",
|
|
3
|
-
"version": "6.22.0
|
|
3
|
+
"version": "6.22.0",
|
|
4
4
|
"description": "Commerce library for the Shopgate Connect PWA.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Shopgate <support@shopgate.com>",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"reselect": "^3.0.1"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@shopgate/pwa-common": "6.22.0
|
|
22
|
-
"@shopgate/pwa-core": "6.22.0
|
|
21
|
+
"@shopgate/pwa-common": "6.22.0",
|
|
22
|
+
"@shopgate/pwa-core": "6.22.0",
|
|
23
23
|
"lodash": "^4.17.4",
|
|
24
24
|
"react": "~16.12.0",
|
|
25
25
|
"react-dom": "~16.12.0"
|