@atlaskit/tokens 0.10.5 → 0.10.6

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/.eslintrc.js ADDED
@@ -0,0 +1,35 @@
1
+ module.exports = {
2
+ overrides: [
3
+ {
4
+ // Lint documentation to ensure usage examples are up-to-date
5
+ files: ['./examples/**', './docs/**'],
6
+ rules: {
7
+ '@atlaskit/design-system/no-deprecated-design-token-usage': ['warn'],
8
+ '@atlaskit/design-system/ensure-design-token-usage': [
9
+ 'error',
10
+ { shouldEnforceFallbacks: true },
11
+ ],
12
+ },
13
+ },
14
+ {
15
+ // Constellation examples, and docs, include fallbacks for now
16
+ files: ['./examples/constellation/**', './docs/**'],
17
+ rules: {
18
+ '@atlaskit/design-system/no-unsafe-design-token-usage': [
19
+ 'error',
20
+ { shouldEnforceFallbacks: true },
21
+ ],
22
+ },
23
+ },
24
+ {
25
+ // Atlaskit examples don't all have fallbacks
26
+ files: ['./examples/**.tsx'],
27
+ rules: {
28
+ '@atlaskit/design-system/no-unsafe-design-token-usage': [
29
+ 'error',
30
+ { shouldEnforceFallbacks: false },
31
+ ],
32
+ },
33
+ },
34
+ ],
35
+ };
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/tokens
2
2
 
3
+ ## 0.10.6
4
+
5
+ ### Patch Changes
6
+
7
+ - [`04fc3d5c658`](https://bitbucket.org/atlassian/atlassian-frontend/commits/04fc3d5c658) - Run token transform earlier by hooking into Program visitor
8
+
3
9
  ## 0.10.5
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -67,6 +67,6 @@ Add the plugin to your babel configuration:
67
67
  ### Options
68
68
 
69
69
  Currently the plugin supports one option, `shouldUseAutoFallback`. When enabled, the plugin will fetch the token's value in the default
70
- Atlassian theme (currently `atlassian-light`) and use it as the fallback value.
70
+ Atlassian theme (currently `atlassian-light`) and use it as the fallback value.
71
71
 
72
72
  This is useful for cases where tokens are in use, but token definitions aren't present in the top-level page CSS.
@@ -22,75 +22,79 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
22
22
  function plugin() {
23
23
  return {
24
24
  visitor: {
25
- CallExpression: function (_CallExpression) {
26
- function CallExpression(_x, _x2) {
27
- return _CallExpression.apply(this, arguments);
28
- }
25
+ Program: {
26
+ enter: function enter(path, state) {
27
+ path.traverse({
28
+ CallExpression: function (_CallExpression) {
29
+ function CallExpression(_x) {
30
+ return _CallExpression.apply(this, arguments);
31
+ }
29
32
 
30
- CallExpression.toString = function () {
31
- return _CallExpression.toString();
32
- };
33
+ CallExpression.toString = function () {
34
+ return _CallExpression.toString();
35
+ };
33
36
 
34
- return CallExpression;
35
- }(function (path, state) {
36
- var tokenImportScope = getTokenImportScope(path);
37
+ return CallExpression;
38
+ }(function (path) {
39
+ var tokenImportScope = getTokenImportScope(path);
37
40
 
38
- if (!tokenImportScope) {
39
- return;
40
- } // Check arguments have correct format
41
+ if (!tokenImportScope) {
42
+ return;
43
+ } // Check arguments have correct format
41
44
 
42
45
 
43
- if (!path.node.arguments[0]) {
44
- throw new Error("token() requires at least one argument");
45
- } else if (!t.isStringLiteral(path.node.arguments[0])) {
46
- throw new Error("token() must have a string as the first argument");
47
- } else if (path.node.arguments.length > 2) {
48
- throw new Error("token() does not accept ".concat(path.node.arguments.length, " arguments"));
49
- } // Check the token exists
46
+ if (!path.node.arguments[0]) {
47
+ throw new Error("token() requires at least one argument");
48
+ } else if (!t.isStringLiteral(path.node.arguments[0])) {
49
+ throw new Error("token() must have a string as the first argument");
50
+ } else if (path.node.arguments.length > 2) {
51
+ throw new Error("token() does not accept ".concat(path.node.arguments.length, " arguments"));
52
+ } // Check the token exists
50
53
 
51
54
 
52
- var tokenName = path.node.arguments[0].value;
53
- var cssTokenValue = _tokenNames.default[tokenName];
55
+ var tokenName = path.node.arguments[0].value;
56
+ var cssTokenValue = _tokenNames.default[tokenName];
54
57
 
55
- if (!cssTokenValue) {
56
- throw new Error("token '".concat(tokenName, "' does not exist"));
57
- }
58
+ if (!cssTokenValue) {
59
+ throw new Error("token '".concat(tokenName, "' does not exist"));
60
+ }
58
61
 
59
- var replacementNode; // if no fallback is set, optionally find one from the default theme
62
+ var replacementNode; // if no fallback is set, optionally find one from the default theme
60
63
 
61
- if (path.node.arguments.length < 2) {
62
- if (state.opts.shouldUseAutoFallback) {
63
- replacementNode = t.stringLiteral("var(".concat(cssTokenValue, ", ").concat(getDefaultFallback(tokenName), ")"));
64
- } else {
65
- replacementNode = t.stringLiteral("var(".concat(cssTokenValue, ")"));
66
- }
67
- } // Handle fallbacks
64
+ if (path.node.arguments.length < 2) {
65
+ if (state.opts.shouldUseAutoFallback) {
66
+ replacementNode = t.stringLiteral("var(".concat(cssTokenValue, ", ").concat(getDefaultFallback(tokenName), ")"));
67
+ } else {
68
+ replacementNode = t.stringLiteral("var(".concat(cssTokenValue, ")"));
69
+ }
70
+ } // Handle fallbacks
68
71
 
69
72
 
70
- var fallback = path.node.arguments[1];
73
+ var fallback = path.node.arguments[1];
71
74
 
72
- if (t.isStringLiteral(fallback)) {
73
- // String literals can be concatenated into css variable call
74
- // Empty string fallbacks are ignored. For now, as the user did specify a fallback, no default is inserted
75
- replacementNode = t.stringLiteral(fallback.value ? "var(".concat(cssTokenValue, ", ").concat(fallback.value, ")") : "var(".concat(cssTokenValue, ")"));
76
- } else if (t.isExpression(fallback)) {
77
- // Expressions should be placed in a template string/literal
78
- replacementNode = t.templateLiteral([t.templateElement({
79
- cooked: "var(".concat(cssTokenValue, ", "),
80
- // Currently we create a "raw" value by inserting escape characters via regex (https://github.com/babel/babel/issues/9242)
81
- raw: "var(".concat(cssTokenValue.replace(/\\|`|\${/g, '\\$&'), ", ")
82
- }, false), t.templateElement({
83
- raw: ')',
84
- cooked: ')'
85
- }, true)], [fallback]);
86
- } // Replace path and call scope.crawl() to refresh the scope bindings + references
75
+ if (t.isStringLiteral(fallback)) {
76
+ // String literals can be concatenated into css variable call
77
+ // Empty string fallbacks are ignored. For now, as the user did specify a fallback, no default is inserted
78
+ replacementNode = t.stringLiteral(fallback.value ? "var(".concat(cssTokenValue, ", ").concat(fallback.value, ")") : "var(".concat(cssTokenValue, ")"));
79
+ } else if (t.isExpression(fallback)) {
80
+ // Expressions should be placed in a template string/literal
81
+ replacementNode = t.templateLiteral([t.templateElement({
82
+ cooked: "var(".concat(cssTokenValue, ", "),
83
+ // Currently we create a "raw" value by inserting escape characters via regex (https://github.com/babel/babel/issues/9242)
84
+ raw: "var(".concat(cssTokenValue.replace(/\\|`|\${/g, '\\$&'), ", ")
85
+ }, false), t.templateElement({
86
+ raw: ')',
87
+ cooked: ')'
88
+ }, true)], [fallback]);
89
+ } // Replace path and call scope.crawl() to refresh the scope bindings + references
87
90
 
88
91
 
89
- replacementNode && path.replaceWith(replacementNode); // @ts-ignore crawl is a valid property
92
+ replacementNode && path.replaceWith(replacementNode); // @ts-ignore crawl is a valid property
90
93
 
91
- tokenImportScope.crawl();
92
- }),
93
- Program: {
94
+ tokenImportScope.crawl();
95
+ })
96
+ });
97
+ },
94
98
  exit: function exit(path) {
95
99
  path.traverse({
96
100
  ImportDeclaration: function ImportDeclaration(path) {
@@ -14,7 +14,7 @@ var _tokenNames = _interopRequireDefault(require("./artifacts/token-names"));
14
14
  var _constants = require("./constants");
15
15
 
16
16
  var name = "@atlaskit/tokens";
17
- var version = "0.10.5";
17
+ var version = "0.10.6";
18
18
 
19
19
  function token(path, fallback) {
20
20
  var token = _tokenNames.default[path];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/tokens",
3
- "version": "0.10.5",
3
+ "version": "0.10.6",
4
4
  "sideEffects": [
5
5
  "**/*.css"
6
6
  ]
@@ -4,66 +4,71 @@ import tokenNames from '../artifacts/token-names';
4
4
  export default function plugin() {
5
5
  return {
6
6
  visitor: {
7
- CallExpression(path, state) {
8
- const tokenImportScope = getTokenImportScope(path);
7
+ Program: {
8
+ enter(path, state) {
9
+ path.traverse({
10
+ CallExpression(path) {
11
+ const tokenImportScope = getTokenImportScope(path);
9
12
 
10
- if (!tokenImportScope) {
11
- return;
12
- } // Check arguments have correct format
13
+ if (!tokenImportScope) {
14
+ return;
15
+ } // Check arguments have correct format
13
16
 
14
17
 
15
- if (!path.node.arguments[0]) {
16
- throw new Error(`token() requires at least one argument`);
17
- } else if (!t.isStringLiteral(path.node.arguments[0])) {
18
- throw new Error(`token() must have a string as the first argument`);
19
- } else if (path.node.arguments.length > 2) {
20
- throw new Error(`token() does not accept ${path.node.arguments.length} arguments`);
21
- } // Check the token exists
18
+ if (!path.node.arguments[0]) {
19
+ throw new Error(`token() requires at least one argument`);
20
+ } else if (!t.isStringLiteral(path.node.arguments[0])) {
21
+ throw new Error(`token() must have a string as the first argument`);
22
+ } else if (path.node.arguments.length > 2) {
23
+ throw new Error(`token() does not accept ${path.node.arguments.length} arguments`);
24
+ } // Check the token exists
22
25
 
23
26
 
24
- const tokenName = path.node.arguments[0].value;
25
- const cssTokenValue = tokenNames[tokenName];
27
+ const tokenName = path.node.arguments[0].value;
28
+ const cssTokenValue = tokenNames[tokenName];
26
29
 
27
- if (!cssTokenValue) {
28
- throw new Error(`token '${tokenName}' does not exist`);
29
- }
30
+ if (!cssTokenValue) {
31
+ throw new Error(`token '${tokenName}' does not exist`);
32
+ }
30
33
 
31
- var replacementNode; // if no fallback is set, optionally find one from the default theme
34
+ var replacementNode; // if no fallback is set, optionally find one from the default theme
32
35
 
33
- if (path.node.arguments.length < 2) {
34
- if (state.opts.shouldUseAutoFallback) {
35
- replacementNode = t.stringLiteral(`var(${cssTokenValue}, ${getDefaultFallback(tokenName)})`);
36
- } else {
37
- replacementNode = t.stringLiteral(`var(${cssTokenValue})`);
38
- }
39
- } // Handle fallbacks
36
+ if (path.node.arguments.length < 2) {
37
+ if (state.opts.shouldUseAutoFallback) {
38
+ replacementNode = t.stringLiteral(`var(${cssTokenValue}, ${getDefaultFallback(tokenName)})`);
39
+ } else {
40
+ replacementNode = t.stringLiteral(`var(${cssTokenValue})`);
41
+ }
42
+ } // Handle fallbacks
40
43
 
41
44
 
42
- const fallback = path.node.arguments[1];
45
+ const fallback = path.node.arguments[1];
43
46
 
44
- if (t.isStringLiteral(fallback)) {
45
- // String literals can be concatenated into css variable call
46
- // Empty string fallbacks are ignored. For now, as the user did specify a fallback, no default is inserted
47
- replacementNode = t.stringLiteral(fallback.value ? `var(${cssTokenValue}, ${fallback.value})` : `var(${cssTokenValue})`);
48
- } else if (t.isExpression(fallback)) {
49
- // Expressions should be placed in a template string/literal
50
- replacementNode = t.templateLiteral([t.templateElement({
51
- cooked: `var(${cssTokenValue}, `,
52
- // Currently we create a "raw" value by inserting escape characters via regex (https://github.com/babel/babel/issues/9242)
53
- raw: `var(${cssTokenValue.replace(/\\|`|\${/g, '\\$&')}, `
54
- }, false), t.templateElement({
55
- raw: ')',
56
- cooked: ')'
57
- }, true)], [fallback]);
58
- } // Replace path and call scope.crawl() to refresh the scope bindings + references
47
+ if (t.isStringLiteral(fallback)) {
48
+ // String literals can be concatenated into css variable call
49
+ // Empty string fallbacks are ignored. For now, as the user did specify a fallback, no default is inserted
50
+ replacementNode = t.stringLiteral(fallback.value ? `var(${cssTokenValue}, ${fallback.value})` : `var(${cssTokenValue})`);
51
+ } else if (t.isExpression(fallback)) {
52
+ // Expressions should be placed in a template string/literal
53
+ replacementNode = t.templateLiteral([t.templateElement({
54
+ cooked: `var(${cssTokenValue}, `,
55
+ // Currently we create a "raw" value by inserting escape characters via regex (https://github.com/babel/babel/issues/9242)
56
+ raw: `var(${cssTokenValue.replace(/\\|`|\${/g, '\\$&')}, `
57
+ }, false), t.templateElement({
58
+ raw: ')',
59
+ cooked: ')'
60
+ }, true)], [fallback]);
61
+ } // Replace path and call scope.crawl() to refresh the scope bindings + references
59
62
 
60
63
 
61
- replacementNode && path.replaceWith(replacementNode); // @ts-ignore crawl is a valid property
64
+ replacementNode && path.replaceWith(replacementNode); // @ts-ignore crawl is a valid property
62
65
 
63
- tokenImportScope.crawl();
64
- },
66
+ tokenImportScope.crawl();
67
+ }
68
+
69
+ });
70
+ },
65
71
 
66
- Program: {
67
72
  exit(path) {
68
73
  path.traverse({
69
74
  ImportDeclaration(path) {
@@ -2,7 +2,7 @@ import warnOnce from '@atlaskit/ds-lib/warn-once';
2
2
  import tokens from './artifacts/token-names';
3
3
  import { TOKEN_NOT_FOUND_CSS_VAR } from './constants';
4
4
  const name = "@atlaskit/tokens";
5
- const version = "0.10.5";
5
+ const version = "0.10.6";
6
6
 
7
7
  function token(path, fallback) {
8
8
  let token = tokens[path];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/tokens",
3
- "version": "0.10.5",
3
+ "version": "0.10.6",
4
4
  "sideEffects": [
5
5
  "**/*.css"
6
6
  ]
@@ -4,75 +4,79 @@ import tokenNames from '../artifacts/token-names';
4
4
  export default function plugin() {
5
5
  return {
6
6
  visitor: {
7
- CallExpression: function (_CallExpression) {
8
- function CallExpression(_x, _x2) {
9
- return _CallExpression.apply(this, arguments);
10
- }
7
+ Program: {
8
+ enter: function enter(path, state) {
9
+ path.traverse({
10
+ CallExpression: function (_CallExpression) {
11
+ function CallExpression(_x) {
12
+ return _CallExpression.apply(this, arguments);
13
+ }
11
14
 
12
- CallExpression.toString = function () {
13
- return _CallExpression.toString();
14
- };
15
+ CallExpression.toString = function () {
16
+ return _CallExpression.toString();
17
+ };
15
18
 
16
- return CallExpression;
17
- }(function (path, state) {
18
- var tokenImportScope = getTokenImportScope(path);
19
+ return CallExpression;
20
+ }(function (path) {
21
+ var tokenImportScope = getTokenImportScope(path);
19
22
 
20
- if (!tokenImportScope) {
21
- return;
22
- } // Check arguments have correct format
23
+ if (!tokenImportScope) {
24
+ return;
25
+ } // Check arguments have correct format
23
26
 
24
27
 
25
- if (!path.node.arguments[0]) {
26
- throw new Error("token() requires at least one argument");
27
- } else if (!t.isStringLiteral(path.node.arguments[0])) {
28
- throw new Error("token() must have a string as the first argument");
29
- } else if (path.node.arguments.length > 2) {
30
- throw new Error("token() does not accept ".concat(path.node.arguments.length, " arguments"));
31
- } // Check the token exists
28
+ if (!path.node.arguments[0]) {
29
+ throw new Error("token() requires at least one argument");
30
+ } else if (!t.isStringLiteral(path.node.arguments[0])) {
31
+ throw new Error("token() must have a string as the first argument");
32
+ } else if (path.node.arguments.length > 2) {
33
+ throw new Error("token() does not accept ".concat(path.node.arguments.length, " arguments"));
34
+ } // Check the token exists
32
35
 
33
36
 
34
- var tokenName = path.node.arguments[0].value;
35
- var cssTokenValue = tokenNames[tokenName];
37
+ var tokenName = path.node.arguments[0].value;
38
+ var cssTokenValue = tokenNames[tokenName];
36
39
 
37
- if (!cssTokenValue) {
38
- throw new Error("token '".concat(tokenName, "' does not exist"));
39
- }
40
+ if (!cssTokenValue) {
41
+ throw new Error("token '".concat(tokenName, "' does not exist"));
42
+ }
40
43
 
41
- var replacementNode; // if no fallback is set, optionally find one from the default theme
44
+ var replacementNode; // if no fallback is set, optionally find one from the default theme
42
45
 
43
- if (path.node.arguments.length < 2) {
44
- if (state.opts.shouldUseAutoFallback) {
45
- replacementNode = t.stringLiteral("var(".concat(cssTokenValue, ", ").concat(getDefaultFallback(tokenName), ")"));
46
- } else {
47
- replacementNode = t.stringLiteral("var(".concat(cssTokenValue, ")"));
48
- }
49
- } // Handle fallbacks
46
+ if (path.node.arguments.length < 2) {
47
+ if (state.opts.shouldUseAutoFallback) {
48
+ replacementNode = t.stringLiteral("var(".concat(cssTokenValue, ", ").concat(getDefaultFallback(tokenName), ")"));
49
+ } else {
50
+ replacementNode = t.stringLiteral("var(".concat(cssTokenValue, ")"));
51
+ }
52
+ } // Handle fallbacks
50
53
 
51
54
 
52
- var fallback = path.node.arguments[1];
55
+ var fallback = path.node.arguments[1];
53
56
 
54
- if (t.isStringLiteral(fallback)) {
55
- // String literals can be concatenated into css variable call
56
- // Empty string fallbacks are ignored. For now, as the user did specify a fallback, no default is inserted
57
- replacementNode = t.stringLiteral(fallback.value ? "var(".concat(cssTokenValue, ", ").concat(fallback.value, ")") : "var(".concat(cssTokenValue, ")"));
58
- } else if (t.isExpression(fallback)) {
59
- // Expressions should be placed in a template string/literal
60
- replacementNode = t.templateLiteral([t.templateElement({
61
- cooked: "var(".concat(cssTokenValue, ", "),
62
- // Currently we create a "raw" value by inserting escape characters via regex (https://github.com/babel/babel/issues/9242)
63
- raw: "var(".concat(cssTokenValue.replace(/\\|`|\${/g, '\\$&'), ", ")
64
- }, false), t.templateElement({
65
- raw: ')',
66
- cooked: ')'
67
- }, true)], [fallback]);
68
- } // Replace path and call scope.crawl() to refresh the scope bindings + references
57
+ if (t.isStringLiteral(fallback)) {
58
+ // String literals can be concatenated into css variable call
59
+ // Empty string fallbacks are ignored. For now, as the user did specify a fallback, no default is inserted
60
+ replacementNode = t.stringLiteral(fallback.value ? "var(".concat(cssTokenValue, ", ").concat(fallback.value, ")") : "var(".concat(cssTokenValue, ")"));
61
+ } else if (t.isExpression(fallback)) {
62
+ // Expressions should be placed in a template string/literal
63
+ replacementNode = t.templateLiteral([t.templateElement({
64
+ cooked: "var(".concat(cssTokenValue, ", "),
65
+ // Currently we create a "raw" value by inserting escape characters via regex (https://github.com/babel/babel/issues/9242)
66
+ raw: "var(".concat(cssTokenValue.replace(/\\|`|\${/g, '\\$&'), ", ")
67
+ }, false), t.templateElement({
68
+ raw: ')',
69
+ cooked: ')'
70
+ }, true)], [fallback]);
71
+ } // Replace path and call scope.crawl() to refresh the scope bindings + references
69
72
 
70
73
 
71
- replacementNode && path.replaceWith(replacementNode); // @ts-ignore crawl is a valid property
74
+ replacementNode && path.replaceWith(replacementNode); // @ts-ignore crawl is a valid property
72
75
 
73
- tokenImportScope.crawl();
74
- }),
75
- Program: {
76
+ tokenImportScope.crawl();
77
+ })
78
+ });
79
+ },
76
80
  exit: function exit(path) {
77
81
  path.traverse({
78
82
  ImportDeclaration: function ImportDeclaration(path) {
@@ -2,7 +2,7 @@ import warnOnce from '@atlaskit/ds-lib/warn-once';
2
2
  import tokens from './artifacts/token-names';
3
3
  import { TOKEN_NOT_FOUND_CSS_VAR } from './constants';
4
4
  var name = "@atlaskit/tokens";
5
- var version = "0.10.5";
5
+ var version = "0.10.6";
6
6
 
7
7
  function token(path, fallback) {
8
8
  var token = tokens[path];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/tokens",
3
- "version": "0.10.5",
3
+ "version": "0.10.6",
4
4
  "sideEffects": [
5
5
  "**/*.css"
6
6
  ]
@@ -2,12 +2,12 @@ import { NodePath } from '@babel/traverse';
2
2
  import * as t from '@babel/types';
3
3
  export default function plugin(): {
4
4
  visitor: {
5
- CallExpression(path: NodePath<t.CallExpression>, state: {
6
- opts: {
7
- shouldUseAutoFallback?: boolean;
8
- };
9
- }): void;
10
5
  Program: {
6
+ enter(path: NodePath<t.Program>, state: {
7
+ opts: {
8
+ shouldUseAutoFallback?: boolean;
9
+ };
10
+ }): void;
11
11
  exit(path: NodePath<t.Program>): void;
12
12
  };
13
13
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/tokens",
3
- "version": "0.10.5",
3
+ "version": "0.10.6",
4
4
  "author": "Atlassian Pty Ltd",
5
5
  "description": "Design tokens are the single source of truth to name and store design decisions.",
6
6
  "license": "Apache-2.0",
@@ -55,6 +55,7 @@
55
55
  "@af/codegen": "*",
56
56
  "@atlaskit/badge": "^15.0.11",
57
57
  "@atlaskit/button": "^16.3.0",
58
+ "@atlaskit/checkbox": "^12.3.9",
58
59
  "@atlaskit/code": "^14.3.0",
59
60
  "@atlaskit/docs": "^9.0.10",
60
61
  "@atlaskit/dropdown-menu": "^11.2.0",
@@ -77,8 +78,10 @@
77
78
  "@testing-library/dom": "^7.7.3",
78
79
  "@testing-library/react": "^8.0.1",
79
80
  "@testing-library/react-hooks": "^1.0.4",
81
+ "@testing-library/user-event": "10.4.0",
80
82
  "@types/chrome": "^0.0.171",
81
83
  "copy-webpack-plugin": "^6.4.0",
84
+ "fuse.js": "^6.6.2",
82
85
  "lodash": "^4.17.21",
83
86
  "prettier": "^2.1.1",
84
87
  "react": "^16.8.0",