@atlaskit/user-picker 8.6.0 → 8.6.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/user-picker
2
2
 
3
+ ## 8.6.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`9cadd6e79ac`](https://bitbucket.org/atlassian/atlassian-frontend/commits/9cadd6e79ac) - Add in UFO events
8
+
3
9
  ## 8.6.0
4
10
 
5
11
  ### Minor Changes
@@ -11,7 +11,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
11
11
 
12
12
  var _analyticsNext = require("@atlaskit/analytics-next");
13
13
 
14
- var _v = _interopRequireDefault(require("uuid/v4"));
14
+ var _uuid = require("uuid");
15
15
 
16
16
  var _version = require("./version.json");
17
17
 
@@ -27,7 +27,7 @@ var UUID_REGEXP_NEW_AAID = /^[a-fA-F0-9]{24,24}/;
27
27
 
28
28
  var startSession = function startSession() {
29
29
  return {
30
- id: (0, _v.default)(),
30
+ id: (0, _uuid.v4)(),
31
31
  start: Date.now(),
32
32
  inputChangeTime: Date.now(),
33
33
  upCount: 0,
@@ -43,6 +43,10 @@ var _MessagesIntlProvider = _interopRequireDefault(require("./MessagesIntlProvid
43
43
 
44
44
  var _UserSourceProvider = require("./../clients/UserSourceProvider");
45
45
 
46
+ var _utils = require("./utils");
47
+
48
+ var _uuid = require("uuid");
49
+
46
50
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
47
51
 
48
52
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -60,12 +64,32 @@ var UserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Component) {
60
64
 
61
65
  var _super = _createSuper(UserPickerWithoutAnalytics);
62
66
 
63
- function UserPickerWithoutAnalytics() {
67
+ function UserPickerWithoutAnalytics(props) {
68
+ var _this;
69
+
64
70
  (0, _classCallCheck2.default)(this, UserPickerWithoutAnalytics);
65
- return _super.apply(this, arguments);
71
+ _this = _super.call(this, props);
72
+ _this.ufoId = (0, _uuid.v4)();
73
+
74
+ if (_this.ufoId) {
75
+ var experienceForId = _utils.userPickerRenderedUfoExperience.getInstance(_this.ufoId);
76
+
77
+ experienceForId.start();
78
+ }
79
+
80
+ return _this;
66
81
  }
67
82
 
68
83
  (0, _createClass2.default)(UserPickerWithoutAnalytics, [{
84
+ key: "componentDidMount",
85
+ value: function componentDidMount() {
86
+ if (this.ufoId) {
87
+ var experienceForId = _utils.userPickerRenderedUfoExperience.getInstance(this.ufoId);
88
+
89
+ experienceForId.success();
90
+ }
91
+ }
92
+ }, {
69
93
  key: "render",
70
94
  value: function render() {
71
95
  var _this$props = this.props,
@@ -32,7 +32,7 @@ var _react = _interopRequireDefault(require("react"));
32
32
 
33
33
  var _debounce = _interopRequireDefault(require("lodash/debounce"));
34
34
 
35
- var _v = _interopRequireDefault(require("uuid/v4"));
35
+ var _uuid = require("uuid");
36
36
 
37
37
  var _analyticsNext = require("@atlaskit/analytics-next");
38
38
 
@@ -523,7 +523,7 @@ var SmartUserPicker = /*#__PURE__*/function (_React$Component) {
523
523
  prefetch = this.props.prefetch;
524
524
 
525
525
  if (prefetch) {
526
- sessionId = (0, _v.default)();
526
+ sessionId = (0, _uuid.v4)();
527
527
  this.fireEvent(_analytics.mountedWithPrefetchEvent, {
528
528
  sessionId: sessionId
529
529
  });
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.optionToSelectableOptions = exports.optionToSelectableOption = exports.isUser = exports.isTeam = exports.isSingleValue = exports.isPopupUserPickerByProps = exports.isPopupUserPickerByComponent = exports.isIterable = exports.isGroup = exports.isExternalUser = exports.isEmail = exports.isChildInput = exports.hasValue = exports.getOptions = exports.getAvatarUrl = exports.getAvatarSize = exports.extractOptionValue = exports.callCallback = void 0;
8
+ exports.userPickerRenderedUfoExperience = exports.optionToSelectableOptions = exports.optionToSelectableOption = exports.isUser = exports.isTeam = exports.isSingleValue = exports.isPopupUserPickerByProps = exports.isPopupUserPickerByComponent = exports.isIterable = exports.isGroup = exports.isExternalUser = exports.isEmail = exports.isChildInput = exports.hasValue = exports.getOptions = exports.getAvatarUrl = exports.getAvatarSize = exports.extractOptionValue = exports.callCallback = void 0;
9
9
 
10
10
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
11
 
@@ -17,6 +17,8 @@ var _types = require("../types");
17
17
 
18
18
  var _select = require("@atlaskit/select");
19
19
 
20
+ var _ufo = require("@atlaskit/ufo");
21
+
20
22
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
23
 
22
24
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -176,4 +178,13 @@ var isPopupUserPickerByProps = function isPopupUserPickerByProps(selectProps) {
176
178
  return selectProps.searchThreshold === -1;
177
179
  };
178
180
 
179
- exports.isPopupUserPickerByProps = isPopupUserPickerByProps;
181
+ exports.isPopupUserPickerByProps = isPopupUserPickerByProps;
182
+ var COMPONENT_NAME = 'user-picker';
183
+ var userPickerRenderedUfoExperience = new _ufo.ConcurrentExperience('user-picker-rendered', {
184
+ platform: {
185
+ component: COMPONENT_NAME
186
+ },
187
+ type: _ufo.ExperienceTypes.Load,
188
+ performanceType: _ufo.ExperiencePerformanceTypes.PageSegmentLoad
189
+ });
190
+ exports.userPickerRenderedUfoExperience = userPickerRenderedUfoExperience;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/user-picker",
3
- "version": "8.6.0",
3
+ "version": "8.6.1",
4
4
  "sideEffects": false
5
5
  }
@@ -1,12 +1,12 @@
1
1
  import { createAndFireEvent } from '@atlaskit/analytics-next';
2
- import uuid from 'uuid/v4';
2
+ import { v4 as uuidv4 } from 'uuid';
3
3
  import { name as packageName, version as packageVersion } from './version.json';
4
4
  import { isExternalUser } from './components/utils';
5
5
  const UUID_REGEXP_TEAMS_GROUPS = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;
6
6
  const UUID_REGEXP_OLD_AAID = /^[a-fA-F0-9]{1,8}:[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;
7
7
  const UUID_REGEXP_NEW_AAID = /^[a-fA-F0-9]{24,24}/;
8
8
  export const startSession = () => ({
9
- id: uuid(),
9
+ id: uuidv4(),
10
10
  start: Date.now(),
11
11
  inputChangeTime: Date.now(),
12
12
  upCount: 0,
@@ -10,7 +10,26 @@ import { getCreatableProps } from './creatable';
10
10
  import { getCreatableSuggestedEmailProps } from './creatableEmailSuggestion';
11
11
  import MessagesIntlProvider from './MessagesIntlProvider';
12
12
  import { ExusUserSourceProvider } from './../clients/UserSourceProvider';
13
+ import { userPickerRenderedUfoExperience as experience } from './utils';
14
+ import { v4 as uuidv4 } from 'uuid';
13
15
  export class UserPickerWithoutAnalytics extends React.Component {
16
+ constructor(props) {
17
+ super(props);
18
+ this.ufoId = uuidv4();
19
+
20
+ if (this.ufoId) {
21
+ const experienceForId = experience.getInstance(this.ufoId);
22
+ experienceForId.start();
23
+ }
24
+ }
25
+
26
+ componentDidMount() {
27
+ if (this.ufoId) {
28
+ const experienceForId = experience.getInstance(this.ufoId);
29
+ experienceForId.success();
30
+ }
31
+ }
32
+
14
33
  render() {
15
34
  const {
16
35
  emailLabel,
@@ -2,7 +2,7 @@ import _extends from "@babel/runtime/helpers/extends";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import React from 'react';
4
4
  import debounce from 'lodash/debounce';
5
- import uuidV4 from 'uuid/v4';
5
+ import { v4 as uuidv4 } from 'uuid';
6
6
  import { withAnalyticsEvents } from '@atlaskit/analytics-next';
7
7
  import memoizeOne from 'memoize-one';
8
8
  import { injectIntl } from 'react-intl-next';
@@ -338,7 +338,7 @@ class SmartUserPicker extends React.Component {
338
338
  } = this.props;
339
339
 
340
340
  if (prefetch) {
341
- const sessionId = uuidV4();
341
+ const sessionId = uuidv4();
342
342
  this.fireEvent(mountedWithPrefetchEvent, {
343
343
  sessionId
344
344
  });
@@ -1,6 +1,7 @@
1
1
  import memoizeOne from 'memoize-one';
2
2
  import { EmailType, TeamType, GroupType, UserType } from '../types';
3
3
  import { PopupSelect } from '@atlaskit/select';
4
+ import { ExperiencePerformanceTypes, ExperienceTypes, ConcurrentExperience } from '@atlaskit/ufo';
4
5
  export const isExternalUser = option => isUser(option) && Boolean(option.isExternal);
5
6
  export const isUser = option => option.type === undefined || option.type === UserType;
6
7
  export const isTeam = option => option.type === TeamType;
@@ -75,4 +76,12 @@ export const getAvatarUrl = optionData => {
75
76
  return undefined;
76
77
  };
77
78
  export const isPopupUserPickerByComponent = SelectComponent => SelectComponent === PopupSelect;
78
- export const isPopupUserPickerByProps = selectProps => selectProps.searchThreshold === -1;
79
+ export const isPopupUserPickerByProps = selectProps => selectProps.searchThreshold === -1;
80
+ const COMPONENT_NAME = 'user-picker';
81
+ export const userPickerRenderedUfoExperience = new ConcurrentExperience('user-picker-rendered', {
82
+ platform: {
83
+ component: COMPONENT_NAME
84
+ },
85
+ type: ExperienceTypes.Load,
86
+ performanceType: ExperiencePerformanceTypes.PageSegmentLoad
87
+ });
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/user-picker",
3
- "version": "8.6.0",
3
+ "version": "8.6.1",
4
4
  "sideEffects": false
5
5
  }
@@ -5,7 +5,7 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
5
5
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
6
 
7
7
  import { createAndFireEvent } from '@atlaskit/analytics-next';
8
- import uuid from 'uuid/v4';
8
+ import { v4 as uuidv4 } from 'uuid';
9
9
  import { name as packageName, version as packageVersion } from './version.json';
10
10
  import { isExternalUser } from './components/utils';
11
11
  var UUID_REGEXP_TEAMS_GROUPS = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;
@@ -13,7 +13,7 @@ var UUID_REGEXP_OLD_AAID = /^[a-fA-F0-9]{1,8}:[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-f
13
13
  var UUID_REGEXP_NEW_AAID = /^[a-fA-F0-9]{24,24}/;
14
14
  export var startSession = function startSession() {
15
15
  return {
16
- id: uuid(),
16
+ id: uuidv4(),
17
17
  start: Date.now(),
18
18
  inputChangeTime: Date.now(),
19
19
  upCount: 0,
@@ -24,18 +24,38 @@ import { getCreatableProps } from './creatable';
24
24
  import { getCreatableSuggestedEmailProps } from './creatableEmailSuggestion';
25
25
  import MessagesIntlProvider from './MessagesIntlProvider';
26
26
  import { ExusUserSourceProvider } from './../clients/UserSourceProvider';
27
+ import { userPickerRenderedUfoExperience as experience } from './utils';
28
+ import { v4 as uuidv4 } from 'uuid';
27
29
  export var UserPickerWithoutAnalytics = /*#__PURE__*/function (_React$Component) {
28
30
  _inherits(UserPickerWithoutAnalytics, _React$Component);
29
31
 
30
32
  var _super = _createSuper(UserPickerWithoutAnalytics);
31
33
 
32
- function UserPickerWithoutAnalytics() {
34
+ function UserPickerWithoutAnalytics(props) {
35
+ var _this;
36
+
33
37
  _classCallCheck(this, UserPickerWithoutAnalytics);
34
38
 
35
- return _super.apply(this, arguments);
39
+ _this = _super.call(this, props);
40
+ _this.ufoId = uuidv4();
41
+
42
+ if (_this.ufoId) {
43
+ var experienceForId = experience.getInstance(_this.ufoId);
44
+ experienceForId.start();
45
+ }
46
+
47
+ return _this;
36
48
  }
37
49
 
38
50
  _createClass(UserPickerWithoutAnalytics, [{
51
+ key: "componentDidMount",
52
+ value: function componentDidMount() {
53
+ if (this.ufoId) {
54
+ var experienceForId = experience.getInstance(this.ufoId);
55
+ experienceForId.success();
56
+ }
57
+ }
58
+ }, {
39
59
  key: "render",
40
60
  value: function render() {
41
61
  var _this$props = this.props,
@@ -19,7 +19,7 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
19
19
 
20
20
  import React from 'react';
21
21
  import debounce from 'lodash/debounce';
22
- import uuidV4 from 'uuid/v4';
22
+ import { v4 as uuidv4 } from 'uuid';
23
23
  import { withAnalyticsEvents } from '@atlaskit/analytics-next';
24
24
  import memoizeOne from 'memoize-one';
25
25
  import { injectIntl } from 'react-intl-next';
@@ -502,7 +502,7 @@ var SmartUserPicker = /*#__PURE__*/function (_React$Component) {
502
502
  prefetch = this.props.prefetch;
503
503
 
504
504
  if (prefetch) {
505
- sessionId = uuidV4();
505
+ sessionId = uuidv4();
506
506
  this.fireEvent(mountedWithPrefetchEvent, {
507
507
  sessionId: sessionId
508
508
  });
@@ -8,6 +8,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
8
8
  import memoizeOne from 'memoize-one';
9
9
  import { EmailType, TeamType, GroupType, UserType } from '../types';
10
10
  import { PopupSelect } from '@atlaskit/select';
11
+ import { ExperiencePerformanceTypes, ExperienceTypes, ConcurrentExperience } from '@atlaskit/ufo';
11
12
  export var isExternalUser = function isExternalUser(option) {
12
13
  return isUser(option) && Boolean(option.isExternal);
13
14
  };
@@ -115,4 +116,12 @@ export var isPopupUserPickerByComponent = function isPopupUserPickerByComponent(
115
116
  };
116
117
  export var isPopupUserPickerByProps = function isPopupUserPickerByProps(selectProps) {
117
118
  return selectProps.searchThreshold === -1;
118
- };
119
+ };
120
+ var COMPONENT_NAME = 'user-picker';
121
+ export var userPickerRenderedUfoExperience = new ConcurrentExperience('user-picker-rendered', {
122
+ platform: {
123
+ component: COMPONENT_NAME
124
+ },
125
+ type: ExperienceTypes.Load,
126
+ performanceType: ExperiencePerformanceTypes.PageSegmentLoad
127
+ });
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/user-picker",
3
- "version": "8.6.0",
3
+ "version": "8.6.1",
4
4
  "sideEffects": false
5
5
  }
@@ -1,10 +1,13 @@
1
1
  import React from 'react';
2
2
  import { UserPickerProps } from '../types';
3
3
  export declare class UserPickerWithoutAnalytics extends React.Component<UserPickerProps> {
4
+ ufoId: string;
5
+ constructor(props: UserPickerProps);
4
6
  static defaultProps: {
5
7
  width: number;
6
8
  isMulti: boolean;
7
9
  };
10
+ componentDidMount(): void;
8
11
  render(): JSX.Element;
9
12
  }
10
13
  export declare const UserPicker: React.ForwardRefExoticComponent<Pick<Pick<UserPickerProps, "placeholder" | "autoFocus" | "captureMenuScroll" | "closeMenuOnScroll" | "inputId" | "isClearable" | "isDisabled" | "isLoading" | "isMulti" | "menuPosition" | "menuPortalTarget" | "menuShouldBlockScroll" | "noOptionsMessage" | "onBlur" | "onChange" | "onFocus" | "onInputChange" | "options" | "styles" | "value" | "defaultValue" | "fieldId" | "width" | "menuMinWidth" | "maxPickerHeight" | "textFieldBackgroundColor" | "loadOptions" | "loadUserSource" | "search" | "anchor" | "open" | "onSelection" | "onClear" | "onClose" | "appearance" | "subtle" | "noBorder" | "addMoreMessage" | "clearValueLabel" | "allowEmail" | "suggestEmailsForDomain" | "emailLabel" | "disableInput" | "isValidEmail" | "maxOptions">, "placeholder" | "autoFocus" | "captureMenuScroll" | "closeMenuOnScroll" | "inputId" | "isClearable" | "isDisabled" | "isLoading" | "menuPosition" | "menuPortalTarget" | "menuShouldBlockScroll" | "noOptionsMessage" | "onBlur" | "onChange" | "onFocus" | "onInputChange" | "options" | "styles" | "value" | "defaultValue" | "fieldId" | "menuMinWidth" | "maxPickerHeight" | "textFieldBackgroundColor" | "loadOptions" | "loadUserSource" | "search" | "anchor" | "open" | "onSelection" | "onClear" | "onClose" | "appearance" | "subtle" | "noBorder" | "addMoreMessage" | "clearValueLabel" | "allowEmail" | "suggestEmailsForDomain" | "emailLabel" | "disableInput" | "isValidEmail" | "maxOptions"> & Partial<Pick<Pick<UserPickerProps, "placeholder" | "autoFocus" | "captureMenuScroll" | "closeMenuOnScroll" | "inputId" | "isClearable" | "isDisabled" | "isLoading" | "isMulti" | "menuPosition" | "menuPortalTarget" | "menuShouldBlockScroll" | "noOptionsMessage" | "onBlur" | "onChange" | "onFocus" | "onInputChange" | "options" | "styles" | "value" | "defaultValue" | "fieldId" | "width" | "menuMinWidth" | "maxPickerHeight" | "textFieldBackgroundColor" | "loadOptions" | "loadUserSource" | "search" | "anchor" | "open" | "onSelection" | "onClear" | "onClose" | "appearance" | "subtle" | "noBorder" | "addMoreMessage" | "clearValueLabel" | "allowEmail" | "suggestEmailsForDomain" | "emailLabel" | "disableInput" | "isValidEmail" | "maxOptions">, "isMulti" | "width">> & Partial<Pick<{
@@ -1,5 +1,6 @@
1
1
  import { ReactChild, ReactElement } from 'react';
2
2
  import { AtlaskitSelectValue, ExternalUser, Email, Option, OptionData, Promisable, Team, Group, User, OptionIdentifier, DefaultValue } from '../types';
3
+ import { ConcurrentExperience } from '@atlaskit/ufo';
3
4
  export declare const isExternalUser: (option: OptionData) => option is ExternalUser;
4
5
  export declare const isUser: (option: OptionData) => option is User;
5
6
  export declare const isTeam: (option: OptionData) => option is Team;
@@ -24,3 +25,4 @@ export declare const callCallback: <U extends any[], R>(callback: ((...U: U) =>
24
25
  export declare const getAvatarUrl: (optionData: OptionData) => string | undefined;
25
26
  export declare const isPopupUserPickerByComponent: (SelectComponent: React.ComponentClass<any>) => boolean;
26
27
  export declare const isPopupUserPickerByProps: (selectProps: any) => boolean;
28
+ export declare const userPickerRenderedUfoExperience: ConcurrentExperience;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/user-picker",
3
- "version": "8.6.0",
3
+ "version": "8.6.1",
4
4
  "description": "Fabric component for display a dropdown to select a user from",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -37,6 +37,7 @@
37
37
  "@atlaskit/theme": "^12.1.0",
38
38
  "@atlaskit/tokens": "^0.6.0",
39
39
  "@atlaskit/tooltip": "^17.5.0",
40
+ "@atlaskit/ufo": "^0.1.0",
40
41
  "@babel/runtime": "^7.0.0",
41
42
  "lodash": "^4.17.21",
42
43
  "memoize-one": "^6.0.0",