Переглянути джерело

Generalize dash helper.

main
Steve Ruiz 4 роки тому
джерело
коміт
9e2938c3d5

+ 57
- 0
__tests__/__snapshots__/dashes.ts.snap Переглянути файл

1
+// Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+exports[`ellipse dash props renders dashed props on a circle correctly: large dashed circle dash props 1`] = `
4
+Object {
5
+  "strokeDasharray": "16 17.333333333333332",
6
+  "strokeDashoffset": "8",
7
+}
8
+`;
9
+
10
+exports[`ellipse dash props renders dashed props on a circle correctly: large dashed ellipse dash props 1`] = `
11
+Object {
12
+  "strokeDasharray": "16 17.333333333333332",
13
+  "strokeDashoffset": "8",
14
+}
15
+`;
16
+
17
+exports[`ellipse dash props renders dashed props on a circle correctly: small dashed circle dash props 1`] = `
18
+Object {
19
+  "strokeDasharray": "8 8.666666666666666",
20
+  "strokeDashoffset": "4",
21
+}
22
+`;
23
+
24
+exports[`ellipse dash props renders dashed props on a circle correctly: small dashed ellipse dash props 1`] = `
25
+Object {
26
+  "strokeDasharray": "8 8.666666666666666",
27
+  "strokeDashoffset": "4",
28
+}
29
+`;
30
+
31
+exports[`ellipse dash props renders dotted props on a circle correctly: large dotted circle dash props 1`] = `
32
+Object {
33
+  "strokeDasharray": "2 14.666666666666666",
34
+  "strokeDashoffset": "0",
35
+}
36
+`;
37
+
38
+exports[`ellipse dash props renders dotted props on a circle correctly: large dotted ellipse dash props 1`] = `
39
+Object {
40
+  "strokeDasharray": "2 14.666666666666666",
41
+  "strokeDashoffset": "0",
42
+}
43
+`;
44
+
45
+exports[`ellipse dash props renders dotted props on a circle correctly: small dotted circle dash props 1`] = `
46
+Object {
47
+  "strokeDasharray": "1 7.333333333333333",
48
+  "strokeDashoffset": "0",
49
+}
50
+`;
51
+
52
+exports[`ellipse dash props renders dotted props on a circle correctly: small dotted ellipse dash props 1`] = `
53
+Object {
54
+  "strokeDasharray": "1 7.333333333333333",
55
+  "strokeDashoffset": "0",
56
+}
57
+`;

+ 33
- 0
__tests__/dashes.ts Переглянути файл

1
+import { getPerfectDashProps } from 'utils/dashes'
2
+
3
+describe('ellipse dash props', () => {
4
+  it('renders dashed props on a circle correctly', () => {
5
+    expect(getPerfectDashProps(100, 4, 'dashed')).toMatchSnapshot(
6
+      'small dashed circle dash props'
7
+    )
8
+    expect(getPerfectDashProps(100, 4, 'dashed')).toMatchSnapshot(
9
+      'small dashed ellipse dash props'
10
+    )
11
+    expect(getPerfectDashProps(200, 8, 'dashed')).toMatchSnapshot(
12
+      'large dashed circle dash props'
13
+    )
14
+    expect(getPerfectDashProps(200, 8, 'dashed')).toMatchSnapshot(
15
+      'large dashed ellipse dash props'
16
+    )
17
+  })
18
+
19
+  it('renders dotted props on a circle correctly', () => {
20
+    expect(getPerfectDashProps(100, 4, 'dotted')).toMatchSnapshot(
21
+      'small dotted circle dash props'
22
+    )
23
+    expect(getPerfectDashProps(100, 4, 'dotted')).toMatchSnapshot(
24
+      'small dotted ellipse dash props'
25
+    )
26
+    expect(getPerfectDashProps(200, 8, 'dotted')).toMatchSnapshot(
27
+      'large dotted circle dash props'
28
+    )
29
+    expect(getPerfectDashProps(200, 8, 'dotted')).toMatchSnapshot(
30
+      'large dotted ellipse dash props'
31
+    )
32
+  })
33
+})

+ 7
- 4
jest.config.js Переглянути файл

1
 module.exports = {
1
 module.exports = {
2
   roots: ['<rootDir>'],
2
   roots: ['<rootDir>'],
3
   testEnvironment: 'jsdom',
3
   testEnvironment: 'jsdom',
4
-  moduleFileExtensions: ['ts', 'tsx', 'js', 'json', 'jsx'],
4
+  moduleFileExtensions: ['ts', 'tsx', 'mjs', 'js', 'json', 'jsx'],
5
   testPathIgnorePatterns: ['<rootDir>[/\\\\](node_modules|.next)[/\\\\]'],
5
   testPathIgnorePatterns: ['<rootDir>[/\\\\](node_modules|.next)[/\\\\]'],
6
-  transformIgnorePatterns: ['[/\\\\]node_modules[/\\\\].+\\.(ts|tsx)$'],
6
+  transformIgnorePatterns: [
7
+    'node_modules/(?!(roughjs|points-on-curve|path-data-parser|points-on-path|browser-fs-access)/)'
8
+  ],
7
   transform: {
9
   transform: {
8
-    '^.+\\.(ts|tsx)$': 'babel-jest',
10
+    '^.+\\.(ts|tsx|mjs)$': 'babel-jest',
11
+    '^.+\\.mjs$': 'babel-jest',
9
   },
12
   },
10
-  modulePaths: ['<rootDir>'],
13
+  modulePaths: ['<rootDir>', 'node_modules'],
11
   watchPlugins: [
14
   watchPlugins: [
12
     'jest-watch-typeahead/filename',
15
     'jest-watch-typeahead/filename',
13
     'jest-watch-typeahead/testname',
16
     'jest-watch-typeahead/testname',

+ 6
- 0
package.json Переглянути файл

81
     "lint-staged": "^10.0.10",
81
     "lint-staged": "^10.0.10",
82
     "prettier": "^2.3.1",
82
     "prettier": "^2.3.1",
83
     "typescript": "^4.1.3"
83
     "typescript": "^4.1.3"
84
+  },
85
+  "prettier": {
86
+    "semi": false,
87
+    "singleQuote": true,
88
+    "tabWidth": 2,
89
+    "useTabs": false
84
   }
90
   }
85
 }
91
 }

+ 57
- 51
state/commands/stretch.ts Переглянути файл

1
 import Command from './command'
1
 import Command from './command'
2
 import history from '../history'
2
 import history from '../history'
3
 import { StretchType, Data, Corner } from 'types'
3
 import { StretchType, Data, Corner } from 'types'
4
-import { getCommonBounds, getPage, getSelectedShapes } from 'utils/utils'
4
+import {
5
+  deepClone,
6
+  getCommonBounds,
7
+  getPage,
8
+  getSelectedShapes,
9
+} from 'utils/utils'
5
 import { getShapeUtils } from 'state/shape-utils'
10
 import { getShapeUtils } from 'state/shape-utils'
6
-import { current } from 'immer'
7
 
11
 
8
 export default function stretchCommand(data: Data, type: StretchType): void {
12
 export default function stretchCommand(data: Data, type: StretchType): void {
9
   const { currentPageId } = data
13
   const { currentPageId } = data
10
-  const initialShapes = getSelectedShapes(current(data))
11
-  const entries = initialShapes.map(
12
-    (shape) => [shape.id, getShapeUtils(shape).getBounds(shape)] as const
14
+
15
+  const initialShapes = getSelectedShapes(data).map((shape) => deepClone(shape))
16
+
17
+  const snapshot = Object.fromEntries(
18
+    initialShapes.map((shape) => [
19
+      shape.id,
20
+      {
21
+        initialShape: shape,
22
+        initialBounds: getShapeUtils(shape).getBounds(shape),
23
+      },
24
+    ])
25
+  )
26
+
27
+  const commonBounds = getCommonBounds(
28
+    ...initialShapes.map((shape) => getShapeUtils(shape).getBounds(shape))
13
   )
29
   )
14
-  const boundsForShapes = Object.fromEntries(entries)
15
-  const commonBounds = getCommonBounds(...entries.map((entry) => entry[1]))
16
 
30
 
17
   history.execute(
31
   history.execute(
18
     data,
32
     data,
24
 
38
 
25
         switch (type) {
39
         switch (type) {
26
           case StretchType.Horizontal: {
40
           case StretchType.Horizontal: {
27
-            for (const id in boundsForShapes) {
28
-              const initialShape = initialShapes[id]
29
-              const shape = shapes[id]
30
-              const oldBounds = boundsForShapes[id]
31
-              const newBounds = { ...oldBounds }
32
-              newBounds.minX = commonBounds.minX
33
-              newBounds.width = commonBounds.width
34
-              newBounds.maxX = commonBounds.maxX
41
+            Object.values(snapshot).forEach(
42
+              ({ initialShape, initialBounds }) => {
43
+                const newBounds = { ...initialBounds }
44
+                newBounds.minX = commonBounds.minX
45
+                newBounds.width = commonBounds.width
46
+                newBounds.maxX = commonBounds.maxX
47
+
48
+                const shape = shapes[initialShape.id]
49
+
50
+                getShapeUtils(shape).transform(shape, newBounds, {
51
+                  type: Corner.TopLeft,
52
+                  scaleX: newBounds.width / initialBounds.width,
53
+                  scaleY: 1,
54
+                  initialShape,
55
+                  transformOrigin: [0.5, 0.5],
56
+                })
57
+              }
58
+            )
35
 
59
 
36
-              getShapeUtils(shape).transform(shape, newBounds, {
37
-                type: Corner.TopLeft,
38
-                scaleX: newBounds.width / oldBounds.width,
39
-                scaleY: 1,
40
-                initialShape,
41
-                transformOrigin: [0.5, 0.5],
42
-              })
43
-            }
44
             break
60
             break
45
           }
61
           }
46
           case StretchType.Vertical: {
62
           case StretchType.Vertical: {
47
-            for (const id in boundsForShapes) {
48
-              const initialShape = initialShapes[id]
49
-              const shape = shapes[id]
50
-              const oldBounds = boundsForShapes[id]
51
-              const newBounds = { ...oldBounds }
52
-              newBounds.minY = commonBounds.minY
53
-              newBounds.height = commonBounds.height
54
-              newBounds.maxY = commonBounds.maxY
63
+            Object.values(snapshot).forEach(
64
+              ({ initialShape, initialBounds }) => {
65
+                const newBounds = { ...initialBounds }
66
+                newBounds.minY = commonBounds.minY
67
+                newBounds.height = commonBounds.height
68
+                newBounds.maxY = commonBounds.maxY
55
 
69
 
56
-              getShapeUtils(shape).transform(shape, newBounds, {
57
-                type: Corner.TopLeft,
58
-                scaleX: 1,
59
-                scaleY: newBounds.height / oldBounds.height,
60
-                initialShape,
61
-                transformOrigin: [0.5, 0.5],
62
-              })
63
-            }
70
+                const shape = shapes[initialShape.id]
71
+
72
+                getShapeUtils(shape).transform(shape, newBounds, {
73
+                  type: Corner.TopLeft,
74
+                  scaleX: 1,
75
+                  scaleY: newBounds.height / initialBounds.height,
76
+                  initialShape,
77
+                  transformOrigin: [0.5, 0.5],
78
+                })
79
+              }
80
+            )
64
           }
81
           }
65
         }
82
         }
66
       },
83
       },
67
       undo(data) {
84
       undo(data) {
68
         const { shapes } = getPage(data, currentPageId)
85
         const { shapes } = getPage(data, currentPageId)
69
-        for (const id in boundsForShapes) {
70
-          const shape = shapes[id]
71
-          const initialShape = initialShapes[id]
72
-          const initialBounds = boundsForShapes[id]
73
-          getShapeUtils(shape).transform(shape, initialBounds, {
74
-            type: Corner.BottomRight,
75
-            scaleX: 1,
76
-            scaleY: 1,
77
-            initialShape,
78
-            transformOrigin: [0.5, 0.5],
79
-          })
80
-        }
86
+        initialShapes.forEach((shape) => (shapes[shape.id] = shape))
81
       },
87
       },
82
     })
88
     })
83
   )
89
   )

+ 1
- 3
state/shape-styles.ts Переглянути файл

74
 export function getShapeStyle(
74
 export function getShapeStyle(
75
   style: ShapeStyles
75
   style: ShapeStyles
76
 ): Partial<SVGProps<SVGUseElement>> {
76
 ): Partial<SVGProps<SVGUseElement>> {
77
-  const { color, size, dash, isFilled } = style
77
+  const { color, size, isFilled } = style
78
 
78
 
79
   const strokeWidth = getStrokeWidth(size)
79
   const strokeWidth = getStrokeWidth(size)
80
-  const strokeDasharray = getStrokeDashArray(dash, strokeWidth).join()
81
 
80
 
82
   return {
81
   return {
83
     stroke: strokes[color],
82
     stroke: strokes[color],
84
     fill: isFilled ? fills[color] : 'none',
83
     fill: isFilled ? fills[color] : 'none',
85
     strokeWidth,
84
     strokeWidth,
86
-    strokeDasharray,
87
   }
85
   }
88
 }
86
 }
89
 
87
 

+ 41
- 46
state/shape-utils/arrow.tsx Переглянути файл

19
 import getStroke from 'perfect-freehand'
19
 import getStroke from 'perfect-freehand'
20
 import React from 'react'
20
 import React from 'react'
21
 import { registerShapeUtils } from './register'
21
 import { registerShapeUtils } from './register'
22
+import { getPerfectDashProps } from 'utils/dashes'
22
 
23
 
23
 const pathCache = new WeakMap<ArrowShape, string>([])
24
 const pathCache = new WeakMap<ArrowShape, string>([])
24
 
25
 
95
 
96
 
96
     const strokeWidth = +styles.strokeWidth
97
     const strokeWidth = +styles.strokeWidth
97
 
98
 
99
+    const arrowDist = vec.dist(start.point, end.point)
100
+
98
     if (isStraightLine) {
101
     if (isStraightLine) {
99
       // Render a straight arrow as a freehand path.
102
       // Render a straight arrow as a freehand path.
100
       if (!pathCache.has(shape)) {
103
       if (!pathCache.has(shape)) {
101
         renderPath(shape)
104
         renderPath(shape)
102
       }
105
       }
103
 
106
 
104
-      const offset = -vec.dist(start.point, end.point) + strokeWidth
105
-
106
       const path = pathCache.get(shape)
107
       const path = pathCache.get(shape)
107
 
108
 
109
+      const { strokeDasharray, strokeDashoffset } =
110
+        shape.style.dash === DashStyle.Solid
111
+          ? {
112
+              strokeDasharray: 'none',
113
+              strokeDashoffset: '0',
114
+            }
115
+          : getPerfectDashProps(
116
+              arrowDist,
117
+              strokeWidth * 1.618,
118
+              shape.style.dash === DashStyle.Dotted ? 'dotted' : 'dashed',
119
+              2
120
+            )
121
+
108
       return (
122
       return (
109
         <g id={id}>
123
         <g id={id}>
110
           {/* Improves hit testing */}
124
           {/* Improves hit testing */}
113
             stroke="transparent"
127
             stroke="transparent"
114
             fill="none"
128
             fill="none"
115
             strokeWidth={Math.max(8, strokeWidth * 2)}
129
             strokeWidth={Math.max(8, strokeWidth * 2)}
116
-            strokeLinecap="round"
117
             strokeDasharray="none"
130
             strokeDasharray="none"
131
+            strokeDashoffset="none"
132
+            strokeLinecap="round"
118
           />
133
           />
119
           {/* Arrowshaft */}
134
           {/* Arrowshaft */}
120
-          <circle
121
-            cx={start.point[0]}
122
-            cy={start.point[1]}
123
-            r={strokeWidth}
124
-            fill={styles.stroke}
125
-            stroke="none"
126
-          />
127
           <path
135
           <path
128
             d={path}
136
             d={path}
129
             fill="none"
137
             fill="none"
130
             strokeWidth={
138
             strokeWidth={
131
               strokeWidth * (style.dash === DashStyle.Solid ? 1 : 1.618)
139
               strokeWidth * (style.dash === DashStyle.Solid ? 1 : 1.618)
132
             }
140
             }
133
-            strokeDashoffset={offset}
141
+            strokeDasharray={strokeDasharray}
142
+            strokeDashoffset={strokeDashoffset}
134
             strokeLinecap="round"
143
             strokeLinecap="round"
135
           />
144
           />
136
           {/* Arrowhead */}
145
           {/* Arrowhead */}
138
             <path
147
             <path
139
               d={getArrowHeadPath(shape, 0)}
148
               d={getArrowHeadPath(shape, 0)}
140
               strokeWidth={strokeWidth * 1.618}
149
               strokeWidth={strokeWidth * 1.618}
141
-              strokeDasharray="none"
142
               fill="none"
150
               fill="none"
151
+              strokeDashoffset="none"
152
+              strokeDasharray="none"
143
             />
153
             />
144
           )}
154
           )}
145
         </g>
155
         </g>
159
 
169
 
160
     const path = getArrowArcPath(start, end, circle, bend)
170
     const path = getArrowArcPath(start, end, circle, bend)
161
 
171
 
162
-    const strokeDashOffset = getStrokeDashOffsetForArc(
163
-      shape,
164
-      circle,
165
-      strokeWidth
166
-    )
172
+    const { strokeDasharray, strokeDashoffset } =
173
+      shape.style.dash === DashStyle.Solid
174
+        ? {
175
+            strokeDasharray: 'none',
176
+            strokeDashoffset: '0',
177
+          }
178
+        : getPerfectDashProps(
179
+            getArcLength(
180
+              [circle[0], circle[1]],
181
+              circle[2],
182
+              start.point,
183
+              end.point
184
+            ) - 1,
185
+            strokeWidth * 1.618,
186
+            shape.style.dash === DashStyle.Dotted ? 'dotted' : 'dashed',
187
+            2
188
+          )
167
 
189
 
168
     return (
190
     return (
169
       <g id={id}>
191
       <g id={id}>
177
           strokeDasharray="none"
199
           strokeDasharray="none"
178
         />
200
         />
179
         {/* Arrow Shaft */}
201
         {/* Arrow Shaft */}
180
-        <circle
181
-          cx={start.point[0]}
182
-          cy={start.point[1]}
183
-          r={strokeWidth}
184
-          fill={styles.stroke}
185
-          stroke="none"
186
-        />
187
         <path
202
         <path
188
           d={path}
203
           d={path}
189
           fill="none"
204
           fill="none"
190
           strokeWidth={strokeWidth * 1.618}
205
           strokeWidth={strokeWidth * 1.618}
191
           strokeLinecap="round"
206
           strokeLinecap="round"
192
-          strokeDashoffset={strokeDashOffset}
207
+          strokeDasharray={strokeDasharray}
208
+          strokeDashoffset={strokeDashoffset}
193
         />
209
         />
194
         {/* Arrowhead */}
210
         {/* Arrowhead */}
195
         <path
211
         <path
537
     ),
553
     ),
538
   }
554
   }
539
 }
555
 }
540
-
541
-function getStrokeDashOffsetForArc(
542
-  shape: ArrowShape,
543
-  circle: number[],
544
-  strokeWidth: number
545
-) {
546
-  const { start, end } = shape.handles
547
-
548
-  const sweep = getArcLength(
549
-    [circle[0], circle[1]],
550
-    circle[2],
551
-    start.point,
552
-    end.point
553
-  )
554
-
555
-  return Math.abs(shape.bend) === 1
556
-    ? -strokeWidth / 2
557
-    : shape.bend < 0
558
-    ? sweep + strokeWidth
559
-    : -sweep + strokeWidth
560
-}

+ 22
- 11
state/shape-utils/ellipse.tsx Переглянути файл

1
-import { uniqueId, getPerfectEllipseDashProps } from 'utils/utils'
1
+import { getPerfectDashProps } from 'utils/dashes'
2
 import vec from 'utils/vec'
2
 import vec from 'utils/vec'
3
 import { DashStyle, EllipseShape, ShapeType } from 'types'
3
 import { DashStyle, EllipseShape, ShapeType } from 'types'
4
 import { getShapeUtils } from './index'
4
 import { getShapeUtils } from './index'
5
 import { boundsContained, getRotatedEllipseBounds } from 'utils/bounds'
5
 import { boundsContained, getRotatedEllipseBounds } from 'utils/bounds'
6
 import { intersectEllipseBounds } from 'utils/intersections'
6
 import { intersectEllipseBounds } from 'utils/intersections'
7
 import { pointInEllipse } from 'utils/hitTests'
7
 import { pointInEllipse } from 'utils/hitTests'
8
-import { ease, getSvgPathFromStroke, rng, translateBounds } from 'utils/utils'
8
+import {
9
+  uniqueId,
10
+  ease,
11
+  getSvgPathFromStroke,
12
+  rng,
13
+  translateBounds,
14
+} from 'utils/utils'
9
 import { defaultStyle, getShapeStyle } from 'state/shape-styles'
15
 import { defaultStyle, getShapeStyle } from 'state/shape-styles'
10
 import getStroke from 'perfect-freehand'
16
 import getStroke from 'perfect-freehand'
11
 import { registerShapeUtils } from './register'
17
 import { registerShapeUtils } from './register'
41
     const styles = getShapeStyle(style)
47
     const styles = getShapeStyle(style)
42
     const strokeWidth = +styles.strokeWidth
48
     const strokeWidth = +styles.strokeWidth
43
 
49
 
50
+    const rx = Math.max(0, radiusX - strokeWidth / 2)
51
+    const ry = Math.max(0, radiusY - strokeWidth / 2)
52
+
44
     if (style.dash === DashStyle.Solid) {
53
     if (style.dash === DashStyle.Solid) {
45
       if (!pathCache.has(shape)) {
54
       if (!pathCache.has(shape)) {
46
         renderPath(shape)
55
         renderPath(shape)
54
             id={id}
63
             id={id}
55
             cx={radiusX}
64
             cx={radiusX}
56
             cy={radiusY}
65
             cy={radiusY}
57
-            rx={Math.max(0, radiusX - strokeWidth / 2)}
58
-            ry={Math.max(0, radiusY - strokeWidth / 2)}
66
+            rx={rx}
67
+            ry={ry}
59
             stroke="none"
68
             stroke="none"
60
           />
69
           />
61
           <path d={path} fill={styles.stroke} />
70
           <path d={path} fill={styles.stroke} />
63
       )
72
       )
64
     }
73
     }
65
 
74
 
66
-    const rx = Math.max(0, radiusX - strokeWidth / 2)
67
-    const ry = Math.max(0, radiusY - strokeWidth / 2)
75
+    const h = Math.pow(rx - ry, 2) / Math.pow(rx + ry, 2)
76
+    const perimeter =
77
+      Math.PI * (rx + ry) * (1 + (3 * h) / (10 + Math.sqrt(4 - 3 * h)))
68
 
78
 
69
-    const { strokeDasharray, strokeDashoffset } = getPerfectEllipseDashProps(
70
-      rx,
71
-      ry,
72
-      strokeWidth,
73
-      shape.style.dash === DashStyle.Dotted ? 'dotted' : 'dashed'
79
+    const { strokeDasharray, strokeDashoffset } = getPerfectDashProps(
80
+      perimeter,
81
+      strokeWidth * 1.618,
82
+      shape.style.dash === DashStyle.Dotted ? 'dotted' : 'dashed',
83
+      4
74
     )
84
     )
75
 
85
 
76
     return (
86
     return (
83
           ry={ry}
93
           ry={ry}
84
           fill={styles.fill}
94
           fill={styles.fill}
85
           stroke={styles.stroke}
95
           stroke={styles.stroke}
96
+          strokeWidth={strokeWidth * 1.618}
86
           strokeDasharray={strokeDasharray}
97
           strokeDasharray={strokeDasharray}
87
           strokeDashoffset={strokeDashoffset}
98
           strokeDashoffset={strokeDashoffset}
88
         />
99
         />

+ 51
- 20
state/shape-utils/rectangle.tsx Переглянути файл

8
   shuffleArr,
8
   shuffleArr,
9
   pointsBetween,
9
   pointsBetween,
10
 } from 'utils/utils'
10
 } from 'utils/utils'
11
-import {
12
-  defaultStyle,
13
-  getShapeStyle,
14
-  getStrokeDashArray,
15
-} from 'state/shape-styles'
11
+import { defaultStyle, getShapeStyle } from 'state/shape-styles'
16
 import getStroke from 'perfect-freehand'
12
 import getStroke from 'perfect-freehand'
17
 import { registerShapeUtils } from './register'
13
 import { registerShapeUtils } from './register'
14
+import { getPerfectDashProps } from 'utils/dashes'
18
 
15
 
19
 const pathCache = new WeakMap<number[], string>([])
16
 const pathCache = new WeakMap<number[], string>([])
20
 
17
 
44
 
41
 
45
   render(shape) {
42
   render(shape) {
46
     const { id, size, radius, style } = shape
43
     const { id, size, radius, style } = shape
47
-
48
     const styles = getShapeStyle(style)
44
     const styles = getShapeStyle(style)
45
+    const strokeWidth = +styles.strokeWidth
49
 
46
 
50
     if (style.dash === DashStyle.Solid) {
47
     if (style.dash === DashStyle.Solid) {
51
       if (!pathCache.has(shape.size)) {
48
       if (!pathCache.has(shape.size)) {
61
             ry={radius}
58
             ry={radius}
62
             x={+styles.strokeWidth / 2}
59
             x={+styles.strokeWidth / 2}
63
             y={+styles.strokeWidth / 2}
60
             y={+styles.strokeWidth / 2}
64
-            width={Math.max(0, size[0] + -styles.strokeWidth)}
65
-            height={Math.max(0, size[1] + -styles.strokeWidth)}
61
+            width={Math.max(0, size[0] - strokeWidth)}
62
+            height={Math.max(0, size[1] - strokeWidth)}
66
             strokeWidth={0}
63
             strokeWidth={0}
67
             fill={styles.fill}
64
             fill={styles.fill}
68
           />
65
           />
71
       )
68
       )
72
     }
69
     }
73
 
70
 
71
+    const sw = strokeWidth * 1.618
72
+
73
+    const w = Math.max(0, size[0])
74
+    const h = Math.max(0, size[1])
75
+
76
+    const strokes: [number[], number[], number][] = [
77
+      [[sw / 2, sw / 2], [w - sw, sw / 2], w - sw],
78
+      [[w - sw / 2, sw / 2], [w - sw / 2, h - sw / 2], h - sw],
79
+      [[w - sw / 2, h - sw / 2], [sw / 2, h - sw / 2], w - sw],
80
+      [[sw / 2, h - sw / 2], [sw / 2, sw / 2], h - sw],
81
+    ]
82
+
83
+    const paths = strokes.map(([start, end, length], i) => {
84
+      const { strokeDasharray, strokeDashoffset } = getPerfectDashProps(
85
+        length,
86
+        sw,
87
+        shape.style.dash === DashStyle.Dotted ? 'dotted' : 'dashed'
88
+      )
89
+
90
+      return (
91
+        <line
92
+          key={id + '_' + i}
93
+          x1={start[0]}
94
+          y1={start[1]}
95
+          x2={end[0]}
96
+          y2={end[1]}
97
+          stroke={styles.stroke}
98
+          strokeWidth={sw}
99
+          strokeLinecap="round"
100
+          strokeDasharray={strokeDasharray}
101
+          strokeDashoffset={strokeDashoffset}
102
+        />
103
+      )
104
+    })
105
+
74
     return (
106
     return (
75
-      <rect
76
-        id={id}
77
-        width={size[0]}
78
-        height={size[1]}
79
-        fill={styles.fill}
80
-        stroke={styles.stroke}
81
-        strokeDasharray={getStrokeDashArray(
82
-          style.dash,
83
-          +styles.strokeWidth
84
-        ).join(' ')}
85
-        strokeDashoffset={-(size[0] + size[1])}
86
-      />
107
+      <g id={id}>
108
+        <rect
109
+          x={sw / 2}
110
+          y={sw / 2}
111
+          width={size[0] - sw}
112
+          height={size[1] - sw}
113
+          fill={styles.fill}
114
+          stroke="none"
115
+        />
116
+        {paths}
117
+      </g>
87
     )
118
     )
88
   },
119
   },
89
 
120
 

+ 0
- 1
test/__mocks__/fileMock.js Переглянути файл

1
-module.exports = 'test-file-stub'

+ 0
- 11
test/pages/__snapshots__/index.test.tsx.snap Переглянути файл

1
-// Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
-exports[`Home page matches snapshot 1`] = `
4
-<DocumentFragment>
5
-  <div
6
-    class="container"
7
-  >
8
-    hey world Hello!
9
-  </div>
10
-</DocumentFragment>
11
-`;

+ 0
- 9
test/pages/index.test.tsx Переглянути файл

1
-import React from 'react'
2
-import { render } from '../testUtils'
3
-import Home from '../../pages/index'
4
-
5
-describe('Home page', () => {
6
-  it('renders', () => {
7
-    render(<Home />, {})
8
-  })
9
-})

+ 0
- 26
test/testUtils.ts Переглянути файл

1
-import { render } from '@testing-library/react'
2
-import { ReactElement } from 'react'
3
-// import { ThemeProvider } from "my-ui-lib"
4
-// import { TranslationProvider } from "my-i18n-lib"
5
-// import defaultStrings from "i18n/en-x-default"
6
-
7
-const Providers = ({ children }) => {
8
-  return children
9
-  // return (
10
-  //   <ThemeProvider theme="light">
11
-  //     <TranslationProvider messages={defaultStrings}>
12
-  //       {children}
13
-  //     </TranslationProvider>
14
-  //   </ThemeProvider>
15
-  // )
16
-}
17
-
18
-const customRender = (ui: ReactElement, options = {}): void => {
19
-  render(ui, { wrapper: Providers, ...options })
20
-}
21
-
22
-// re-export everything
23
-export * from '@testing-library/react'
24
-
25
-// override render method
26
-export { customRender as render }

+ 41
- 0
utils/dashes.ts Переглянути файл

1
+/**
2
+ * Get balanced dash-strokearray and dash-strokeoffset properties for a path of a given length.
3
+ * @param length The length of the path.
4
+ * @param strokeWidth The shape's stroke-width property.
5
+ * @param style The stroke's style: "dashed" or "dotted" (default "dashed").
6
+ * @param snap An interval for dashes (e.g. 4 will produce arrays with 4, 8, 16, etc dashes).
7
+ */
8
+export function getPerfectDashProps(
9
+  length: number,
10
+  strokeWidth: number,
11
+  style: 'dashed' | 'dotted' = 'dashed',
12
+  snap = 1
13
+): {
14
+  strokeDasharray: string
15
+  strokeDashoffset: string
16
+} {
17
+  let dashLength: number
18
+  let strokeDashoffset: string
19
+  let ratio: number
20
+
21
+  if (style === 'dashed') {
22
+    dashLength = strokeWidth * 2
23
+    ratio = 1
24
+    strokeDashoffset = (dashLength / 2).toString()
25
+  } else {
26
+    dashLength = strokeWidth / 4
27
+    ratio = 4
28
+    strokeDashoffset = '0'
29
+  }
30
+
31
+  let dashes = Math.floor(length / dashLength / (2 * ratio))
32
+  dashes -= dashes % snap
33
+  if (dashes === 0) dashes = 1
34
+
35
+  const gapLength = (length - dashes * dashLength) / dashes
36
+
37
+  return {
38
+    strokeDasharray: [dashLength, gapLength].join(' '),
39
+    strokeDashoffset,
40
+  }
41
+}

+ 0
- 46
utils/utils.ts Переглянути файл

1797
   const p = Math.PI * (rx + ry) * (1 + (3 * h) / (10 + Math.sqrt(4 - 3 * h)))
1797
   const p = Math.PI * (rx + ry) * (1 + (3 * h) / (10 + Math.sqrt(4 - 3 * h)))
1798
   return p
1798
   return p
1799
 }
1799
 }
1800
-
1801
-/**
1802
- * Get the stroke-dasharray and stroke-dashoffset properties for a dashed or dotted ellipse.
1803
- * @param rx The radius of the ellipse on the x axis.
1804
- * @param ry The radius of the ellipse on the y axis.
1805
- * @param strokeWidth The shape's stroke-width property.
1806
- * @param style "dashed" or "dotted" (default "dashed")
1807
- */
1808
-export function getPerfectEllipseDashProps(
1809
-  rx: number,
1810
-  ry: number,
1811
-  strokeWidth: number,
1812
-  style: 'dashed' | 'dotted' = 'dashed'
1813
-) {
1814
-  let dashLength: number
1815
-  let strokeDashoffset: number
1816
-  let ratio: number
1817
-
1818
-  if (style === 'dashed') {
1819
-    dashLength = strokeWidth * 2
1820
-    ratio = 1
1821
-    strokeDashoffset = dashLength / 2
1822
-  } else {
1823
-    dashLength = strokeWidth / 4
1824
-    ratio = 4
1825
-    strokeDashoffset = 0
1826
-  }
1827
-
1828
-  // Find perimeter of the ellipse
1829
-  const h = Math.pow(rx - ry, 2) / Math.pow(rx + ry, 2)
1830
-  const perimeter =
1831
-    Math.PI * (rx + ry) * (1 + (3 * h) / (10 + Math.sqrt(4 - 3 * h)))
1832
-
1833
-  // Find the number of dashes (with one more for good measure)
1834
-  let dashes = perimeter / dashLength / (2 * ratio)
1835
-  dashes = dashes - (dashes % 4)
1836
-  // dashes++
1837
-
1838
-  // Find the gap length
1839
-  const gapLength = (perimeter - dashes * dashLength) / dashes
1840
-
1841
-  return {
1842
-    strokeDasharray: [dashLength, gapLength].join(' '),
1843
-    strokeDashoffset,
1844
-  }
1845
-}

+ 201
- 201
yarn.lock Переглянути файл

16
   dependencies:
16
   dependencies:
17
     "@babel/highlight" "^7.14.5"
17
     "@babel/highlight" "^7.14.5"
18
 
18
 
19
-"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5":
20
-  version "7.14.5"
21
-  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.5.tgz#8ef4c18e58e801c5c95d3c1c0f2874a2680fadea"
22
-  integrity sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==
19
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7":
20
+  version "7.14.7"
21
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08"
22
+  integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==
23
 
23
 
24
 "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.7.2", "@babel/core@^7.7.5":
24
 "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.7.2", "@babel/core@^7.7.5":
25
   version "7.14.6"
25
   version "7.14.6"
141
     "@babel/types" "^7.14.5"
141
     "@babel/types" "^7.14.5"
142
 
142
 
143
 "@babel/helper-member-expression-to-functions@^7.14.5":
143
 "@babel/helper-member-expression-to-functions@^7.14.5":
144
-  version "7.14.5"
145
-  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz#d5c70e4ad13b402c95156c7a53568f504e2fb7b8"
146
-  integrity sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ==
144
+  version "7.14.7"
145
+  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970"
146
+  integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==
147
   dependencies:
147
   dependencies:
148
     "@babel/types" "^7.14.5"
148
     "@babel/types" "^7.14.5"
149
 
149
 
258
     chalk "^2.0.0"
258
     chalk "^2.0.0"
259
     js-tokens "^4.0.0"
259
     js-tokens "^4.0.0"
260
 
260
 
261
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.7.2":
262
-  version "7.14.6"
263
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.6.tgz#d85cc68ca3cac84eae384c06f032921f5227f4b2"
264
-  integrity sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==
261
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.14.6", "@babel/parser@^7.14.7", "@babel/parser@^7.7.2":
262
+  version "7.14.7"
263
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595"
264
+  integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==
265
 
265
 
266
 "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5":
266
 "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5":
267
   version "7.14.5"
267
   version "7.14.5"
272
     "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
272
     "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
273
     "@babel/plugin-proposal-optional-chaining" "^7.14.5"
273
     "@babel/plugin-proposal-optional-chaining" "^7.14.5"
274
 
274
 
275
-"@babel/plugin-proposal-async-generator-functions@^7.14.5":
276
-  version "7.14.5"
277
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.5.tgz#4024990e3dd74181f4f426ea657769ff49a2df39"
278
-  integrity sha512-tbD/CG3l43FIXxmu4a7RBe4zH7MLJ+S/lFowPFO7HetS2hyOZ/0nnnznegDuzFzfkyQYTxqdTH/hKmuBngaDAA==
275
+"@babel/plugin-proposal-async-generator-functions@^7.14.7":
276
+  version "7.14.7"
277
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace"
278
+  integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==
279
   dependencies:
279
   dependencies:
280
     "@babel/helper-plugin-utils" "^7.14.5"
280
     "@babel/helper-plugin-utils" "^7.14.5"
281
     "@babel/helper-remap-async-to-generator" "^7.14.5"
281
     "@babel/helper-remap-async-to-generator" "^7.14.5"
346
     "@babel/helper-plugin-utils" "^7.14.5"
346
     "@babel/helper-plugin-utils" "^7.14.5"
347
     "@babel/plugin-syntax-numeric-separator" "^7.10.4"
347
     "@babel/plugin-syntax-numeric-separator" "^7.10.4"
348
 
348
 
349
-"@babel/plugin-proposal-object-rest-spread@^7.14.5":
350
-  version "7.14.5"
351
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.5.tgz#e581d5ccdfa187ea6ed73f56c6a21c1580b90fbf"
352
-  integrity sha512-VzMyY6PWNPPT3pxc5hi9LloKNr4SSrVCg7Yr6aZpW4Ym07r7KqSU/QXYwjXLVxqwSv0t/XSXkFoKBPUkZ8vb2A==
349
+"@babel/plugin-proposal-object-rest-spread@^7.14.7":
350
+  version "7.14.7"
351
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363"
352
+  integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==
353
   dependencies:
353
   dependencies:
354
-    "@babel/compat-data" "^7.14.5"
354
+    "@babel/compat-data" "^7.14.7"
355
     "@babel/helper-compilation-targets" "^7.14.5"
355
     "@babel/helper-compilation-targets" "^7.14.5"
356
     "@babel/helper-plugin-utils" "^7.14.5"
356
     "@babel/helper-plugin-utils" "^7.14.5"
357
     "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
357
     "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
569
   dependencies:
569
   dependencies:
570
     "@babel/helper-plugin-utils" "^7.14.5"
570
     "@babel/helper-plugin-utils" "^7.14.5"
571
 
571
 
572
-"@babel/plugin-transform-destructuring@^7.14.5":
573
-  version "7.14.5"
574
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.5.tgz#d32ad19ff1a6da1e861dc62720d80d9776e3bf35"
575
-  integrity sha512-wU9tYisEbRMxqDezKUqC9GleLycCRoUsai9ddlsq54r8QRLaeEhc+d+9DqCG+kV9W2GgQjTZESPTpn5bAFMDww==
572
+"@babel/plugin-transform-destructuring@^7.14.7":
573
+  version "7.14.7"
574
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576"
575
+  integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==
576
   dependencies:
576
   dependencies:
577
     "@babel/helper-plugin-utils" "^7.14.5"
577
     "@babel/helper-plugin-utils" "^7.14.5"
578
 
578
 
666
     "@babel/helper-module-transforms" "^7.14.5"
666
     "@babel/helper-module-transforms" "^7.14.5"
667
     "@babel/helper-plugin-utils" "^7.14.5"
667
     "@babel/helper-plugin-utils" "^7.14.5"
668
 
668
 
669
-"@babel/plugin-transform-named-capturing-groups-regex@^7.14.5":
670
-  version "7.14.5"
671
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.5.tgz#d537e8ee083ee6f6aa4f4eef9d2081d555746e4c"
672
-  integrity sha512-+Xe5+6MWFo311U8SchgeX5c1+lJM+eZDBZgD+tvXu9VVQPXwwVzeManMMjYX6xw2HczngfOSZjoFYKwdeB/Jvw==
669
+"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7":
670
+  version "7.14.7"
671
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e"
672
+  integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==
673
   dependencies:
673
   dependencies:
674
     "@babel/helper-create-regexp-features-plugin" "^7.14.5"
674
     "@babel/helper-create-regexp-features-plugin" "^7.14.5"
675
 
675
 
723
   dependencies:
723
   dependencies:
724
     "@babel/helper-plugin-utils" "^7.14.5"
724
     "@babel/helper-plugin-utils" "^7.14.5"
725
 
725
 
726
-"@babel/plugin-transform-spread@^7.14.5":
726
+"@babel/plugin-transform-spread@^7.14.6":
727
   version "7.14.6"
727
   version "7.14.6"
728
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144"
728
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144"
729
   integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==
729
   integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==
768
     "@babel/helper-plugin-utils" "^7.14.5"
768
     "@babel/helper-plugin-utils" "^7.14.5"
769
 
769
 
770
 "@babel/preset-env@^7.11.0":
770
 "@babel/preset-env@^7.11.0":
771
-  version "7.14.5"
772
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.5.tgz#c0c84e763661fd0e74292c3d511cb33b0c668997"
773
-  integrity sha512-ci6TsS0bjrdPpWGnQ+m4f+JSSzDKlckqKIJJt9UZ/+g7Zz9k0N8lYU8IeLg/01o2h8LyNZDMLGgRLDTxpudLsA==
771
+  version "7.14.7"
772
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.7.tgz#5c70b22d4c2d893b03d8c886a5c17422502b932a"
773
+  integrity sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==
774
   dependencies:
774
   dependencies:
775
-    "@babel/compat-data" "^7.14.5"
775
+    "@babel/compat-data" "^7.14.7"
776
     "@babel/helper-compilation-targets" "^7.14.5"
776
     "@babel/helper-compilation-targets" "^7.14.5"
777
     "@babel/helper-plugin-utils" "^7.14.5"
777
     "@babel/helper-plugin-utils" "^7.14.5"
778
     "@babel/helper-validator-option" "^7.14.5"
778
     "@babel/helper-validator-option" "^7.14.5"
779
     "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5"
779
     "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5"
780
-    "@babel/plugin-proposal-async-generator-functions" "^7.14.5"
780
+    "@babel/plugin-proposal-async-generator-functions" "^7.14.7"
781
     "@babel/plugin-proposal-class-properties" "^7.14.5"
781
     "@babel/plugin-proposal-class-properties" "^7.14.5"
782
     "@babel/plugin-proposal-class-static-block" "^7.14.5"
782
     "@babel/plugin-proposal-class-static-block" "^7.14.5"
783
     "@babel/plugin-proposal-dynamic-import" "^7.14.5"
783
     "@babel/plugin-proposal-dynamic-import" "^7.14.5"
786
     "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5"
786
     "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5"
787
     "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5"
787
     "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5"
788
     "@babel/plugin-proposal-numeric-separator" "^7.14.5"
788
     "@babel/plugin-proposal-numeric-separator" "^7.14.5"
789
-    "@babel/plugin-proposal-object-rest-spread" "^7.14.5"
789
+    "@babel/plugin-proposal-object-rest-spread" "^7.14.7"
790
     "@babel/plugin-proposal-optional-catch-binding" "^7.14.5"
790
     "@babel/plugin-proposal-optional-catch-binding" "^7.14.5"
791
     "@babel/plugin-proposal-optional-chaining" "^7.14.5"
791
     "@babel/plugin-proposal-optional-chaining" "^7.14.5"
792
     "@babel/plugin-proposal-private-methods" "^7.14.5"
792
     "@babel/plugin-proposal-private-methods" "^7.14.5"
812
     "@babel/plugin-transform-block-scoping" "^7.14.5"
812
     "@babel/plugin-transform-block-scoping" "^7.14.5"
813
     "@babel/plugin-transform-classes" "^7.14.5"
813
     "@babel/plugin-transform-classes" "^7.14.5"
814
     "@babel/plugin-transform-computed-properties" "^7.14.5"
814
     "@babel/plugin-transform-computed-properties" "^7.14.5"
815
-    "@babel/plugin-transform-destructuring" "^7.14.5"
815
+    "@babel/plugin-transform-destructuring" "^7.14.7"
816
     "@babel/plugin-transform-dotall-regex" "^7.14.5"
816
     "@babel/plugin-transform-dotall-regex" "^7.14.5"
817
     "@babel/plugin-transform-duplicate-keys" "^7.14.5"
817
     "@babel/plugin-transform-duplicate-keys" "^7.14.5"
818
     "@babel/plugin-transform-exponentiation-operator" "^7.14.5"
818
     "@babel/plugin-transform-exponentiation-operator" "^7.14.5"
824
     "@babel/plugin-transform-modules-commonjs" "^7.14.5"
824
     "@babel/plugin-transform-modules-commonjs" "^7.14.5"
825
     "@babel/plugin-transform-modules-systemjs" "^7.14.5"
825
     "@babel/plugin-transform-modules-systemjs" "^7.14.5"
826
     "@babel/plugin-transform-modules-umd" "^7.14.5"
826
     "@babel/plugin-transform-modules-umd" "^7.14.5"
827
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.5"
827
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7"
828
     "@babel/plugin-transform-new-target" "^7.14.5"
828
     "@babel/plugin-transform-new-target" "^7.14.5"
829
     "@babel/plugin-transform-object-super" "^7.14.5"
829
     "@babel/plugin-transform-object-super" "^7.14.5"
830
     "@babel/plugin-transform-parameters" "^7.14.5"
830
     "@babel/plugin-transform-parameters" "^7.14.5"
832
     "@babel/plugin-transform-regenerator" "^7.14.5"
832
     "@babel/plugin-transform-regenerator" "^7.14.5"
833
     "@babel/plugin-transform-reserved-words" "^7.14.5"
833
     "@babel/plugin-transform-reserved-words" "^7.14.5"
834
     "@babel/plugin-transform-shorthand-properties" "^7.14.5"
834
     "@babel/plugin-transform-shorthand-properties" "^7.14.5"
835
-    "@babel/plugin-transform-spread" "^7.14.5"
835
+    "@babel/plugin-transform-spread" "^7.14.6"
836
     "@babel/plugin-transform-sticky-regex" "^7.14.5"
836
     "@babel/plugin-transform-sticky-regex" "^7.14.5"
837
     "@babel/plugin-transform-template-literals" "^7.14.5"
837
     "@babel/plugin-transform-template-literals" "^7.14.5"
838
     "@babel/plugin-transform-typeof-symbol" "^7.14.5"
838
     "@babel/plugin-transform-typeof-symbol" "^7.14.5"
843
     babel-plugin-polyfill-corejs2 "^0.2.2"
843
     babel-plugin-polyfill-corejs2 "^0.2.2"
844
     babel-plugin-polyfill-corejs3 "^0.2.2"
844
     babel-plugin-polyfill-corejs3 "^0.2.2"
845
     babel-plugin-polyfill-regenerator "^0.2.2"
845
     babel-plugin-polyfill-regenerator "^0.2.2"
846
-    core-js-compat "^3.14.0"
846
+    core-js-compat "^3.15.0"
847
     semver "^6.3.0"
847
     semver "^6.3.0"
848
 
848
 
849
 "@babel/preset-modules@^0.1.4":
849
 "@babel/preset-modules@^0.1.4":
858
     esutils "^2.0.2"
858
     esutils "^2.0.2"
859
 
859
 
860
 "@babel/runtime-corejs3@^7.10.2":
860
 "@babel/runtime-corejs3@^7.10.2":
861
-  version "7.14.6"
862
-  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.14.6.tgz#066b966eda40481740180cb3caab861a3f208cd3"
863
-  integrity sha512-Xl8SPYtdjcMoCsIM4teyVRg7jIcgl8F2kRtoCcXuHzXswt9UxZCS6BzRo8fcnCuP6u2XtPgvyonmEPF57Kxo9Q==
861
+  version "7.14.7"
862
+  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz#0ef292bbce40ca00f874c9724ef175a12476465c"
863
+  integrity sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==
864
   dependencies:
864
   dependencies:
865
-    core-js-pure "^3.14.0"
865
+    core-js-pure "^3.15.0"
866
     regenerator-runtime "^0.13.4"
866
     regenerator-runtime "^0.13.4"
867
 
867
 
868
 "@babel/runtime@7.12.5":
868
 "@babel/runtime@7.12.5":
889
     "@babel/types" "^7.14.5"
889
     "@babel/types" "^7.14.5"
890
 
890
 
891
 "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.7.2":
891
 "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.7.2":
892
-  version "7.14.5"
893
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.5.tgz#c111b0f58afab4fea3d3385a406f692748c59870"
894
-  integrity sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==
892
+  version "7.14.7"
893
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753"
894
+  integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==
895
   dependencies:
895
   dependencies:
896
     "@babel/code-frame" "^7.14.5"
896
     "@babel/code-frame" "^7.14.5"
897
     "@babel/generator" "^7.14.5"
897
     "@babel/generator" "^7.14.5"
898
     "@babel/helper-function-name" "^7.14.5"
898
     "@babel/helper-function-name" "^7.14.5"
899
     "@babel/helper-hoist-variables" "^7.14.5"
899
     "@babel/helper-hoist-variables" "^7.14.5"
900
     "@babel/helper-split-export-declaration" "^7.14.5"
900
     "@babel/helper-split-export-declaration" "^7.14.5"
901
-    "@babel/parser" "^7.14.5"
901
+    "@babel/parser" "^7.14.7"
902
     "@babel/types" "^7.14.5"
902
     "@babel/types" "^7.14.5"
903
     debug "^4.1.0"
903
     debug "^4.1.0"
904
     globals "^11.1.0"
904
     globals "^11.1.0"
1038
     jest-util "^27.0.2"
1038
     jest-util "^27.0.2"
1039
     slash "^3.0.0"
1039
     slash "^3.0.0"
1040
 
1040
 
1041
-"@jest/core@^27.0.4":
1042
-  version "27.0.4"
1043
-  resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.0.4.tgz#679bf9ac07900da2ddbb9667bb1afa8029038f53"
1044
-  integrity sha512-+dsmV8VUs1h/Szb+rEWk8xBM1fp1I///uFy9nk3wXGvRsF2lBp8EVPmtWc+QFRb3MY2b7u2HbkGF1fzoDzQTLA==
1041
+"@jest/core@^27.0.5":
1042
+  version "27.0.5"
1043
+  resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.0.5.tgz#59e9e69e7374d65dbb22e3fc1bd52e80991eae72"
1044
+  integrity sha512-g73//jF0VwsOIrWUC9Cqg03lU3QoAMFxVjsm6n6yNmwZcQPN/o8w+gLWODw5VfKNFZT38otXHWxc6b8eGDUpEA==
1045
   dependencies:
1045
   dependencies:
1046
     "@jest/console" "^27.0.2"
1046
     "@jest/console" "^27.0.2"
1047
-    "@jest/reporters" "^27.0.4"
1047
+    "@jest/reporters" "^27.0.5"
1048
     "@jest/test-result" "^27.0.2"
1048
     "@jest/test-result" "^27.0.2"
1049
-    "@jest/transform" "^27.0.2"
1049
+    "@jest/transform" "^27.0.5"
1050
     "@jest/types" "^27.0.2"
1050
     "@jest/types" "^27.0.2"
1051
     "@types/node" "*"
1051
     "@types/node" "*"
1052
     ansi-escapes "^4.2.1"
1052
     ansi-escapes "^4.2.1"
1055
     exit "^0.1.2"
1055
     exit "^0.1.2"
1056
     graceful-fs "^4.2.4"
1056
     graceful-fs "^4.2.4"
1057
     jest-changed-files "^27.0.2"
1057
     jest-changed-files "^27.0.2"
1058
-    jest-config "^27.0.4"
1059
-    jest-haste-map "^27.0.2"
1058
+    jest-config "^27.0.5"
1059
+    jest-haste-map "^27.0.5"
1060
     jest-message-util "^27.0.2"
1060
     jest-message-util "^27.0.2"
1061
     jest-regex-util "^27.0.1"
1061
     jest-regex-util "^27.0.1"
1062
-    jest-resolve "^27.0.4"
1063
-    jest-resolve-dependencies "^27.0.4"
1064
-    jest-runner "^27.0.4"
1065
-    jest-runtime "^27.0.4"
1066
-    jest-snapshot "^27.0.4"
1062
+    jest-resolve "^27.0.5"
1063
+    jest-resolve-dependencies "^27.0.5"
1064
+    jest-runner "^27.0.5"
1065
+    jest-runtime "^27.0.5"
1066
+    jest-snapshot "^27.0.5"
1067
     jest-util "^27.0.2"
1067
     jest-util "^27.0.2"
1068
     jest-validate "^27.0.2"
1068
     jest-validate "^27.0.2"
1069
     jest-watcher "^27.0.2"
1069
     jest-watcher "^27.0.2"
1073
     slash "^3.0.0"
1073
     slash "^3.0.0"
1074
     strip-ansi "^6.0.0"
1074
     strip-ansi "^6.0.0"
1075
 
1075
 
1076
-"@jest/environment@^27.0.3":
1077
-  version "27.0.3"
1078
-  resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.0.3.tgz#68769b1dfdd213e3456169d64fbe9bd63a5fda92"
1079
-  integrity sha512-pN9m7fbKsop5vc3FOfH8NF7CKKdRbEZzcxfIo1n2TT6ucKWLFq0P6gCJH0GpnQp036++yY9utHOxpeT1WnkWTA==
1076
+"@jest/environment@^27.0.5":
1077
+  version "27.0.5"
1078
+  resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.0.5.tgz#a294ad4acda2e250f789fb98dc667aad33d3adc9"
1079
+  integrity sha512-IAkJPOT7bqn0GiX5LPio6/e1YpcmLbrd8O5EFYpAOZ6V+9xJDsXjdgN2vgv9WOKIs/uA1kf5WeD96HhlBYO+FA==
1080
   dependencies:
1080
   dependencies:
1081
-    "@jest/fake-timers" "^27.0.3"
1081
+    "@jest/fake-timers" "^27.0.5"
1082
     "@jest/types" "^27.0.2"
1082
     "@jest/types" "^27.0.2"
1083
     "@types/node" "*"
1083
     "@types/node" "*"
1084
     jest-mock "^27.0.3"
1084
     jest-mock "^27.0.3"
1085
 
1085
 
1086
-"@jest/fake-timers@^27.0.3":
1087
-  version "27.0.3"
1088
-  resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.0.3.tgz#9899ba6304cc636734c74478df502e18136461dd"
1089
-  integrity sha512-fQ+UCKRIYKvTCEOyKPnaPnomLATIhMnHC/xPZ7yT1Uldp7yMgMxoYIFidDbpSTgB79+/U+FgfoD30c6wg3IUjA==
1086
+"@jest/fake-timers@^27.0.5":
1087
+  version "27.0.5"
1088
+  resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.0.5.tgz#304d5aedadf4c75cff3696995460b39d6c6e72f6"
1089
+  integrity sha512-d6Tyf7iDoKqeUdwUKrOBV/GvEZRF67m7lpuWI0+SCD9D3aaejiOQZxAOxwH2EH/W18gnfYaBPLi0VeTGBHtQBg==
1090
   dependencies:
1090
   dependencies:
1091
     "@jest/types" "^27.0.2"
1091
     "@jest/types" "^27.0.2"
1092
     "@sinonjs/fake-timers" "^7.0.2"
1092
     "@sinonjs/fake-timers" "^7.0.2"
1095
     jest-mock "^27.0.3"
1095
     jest-mock "^27.0.3"
1096
     jest-util "^27.0.2"
1096
     jest-util "^27.0.2"
1097
 
1097
 
1098
-"@jest/globals@^27.0.3":
1099
-  version "27.0.3"
1100
-  resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.0.3.tgz#1cf8933b7791bba0b99305cbf39fd4d2e3fe4060"
1101
-  integrity sha512-OzsIuf7uf+QalqAGbjClyezzEcLQkdZ+7PejUrZgDs+okdAK8GwRCGcYCirHvhMBBQh60Jr3NlIGbn/KBPQLEQ==
1098
+"@jest/globals@^27.0.5":
1099
+  version "27.0.5"
1100
+  resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.0.5.tgz#f63b8bfa6ea3716f8df50f6a604b5c15b36ffd20"
1101
+  integrity sha512-qqKyjDXUaZwDuccpbMMKCCMBftvrbXzigtIsikAH/9ca+kaae8InP2MDf+Y/PdCSMuAsSpHS6q6M25irBBUh+Q==
1102
   dependencies:
1102
   dependencies:
1103
-    "@jest/environment" "^27.0.3"
1103
+    "@jest/environment" "^27.0.5"
1104
     "@jest/types" "^27.0.2"
1104
     "@jest/types" "^27.0.2"
1105
     expect "^27.0.2"
1105
     expect "^27.0.2"
1106
 
1106
 
1107
-"@jest/reporters@^27.0.4":
1108
-  version "27.0.4"
1109
-  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.0.4.tgz#95609b1be97afb80d55d8aa3d7c3179c15810e65"
1110
-  integrity sha512-Xa90Nm3JnV0xCe4M6A10M9WuN9krb+WFKxV1A98Y4ePCw40n++r7uxFUNU7DT1i9Behj7fjrAIju9oU0t1QtCg==
1107
+"@jest/reporters@^27.0.5":
1108
+  version "27.0.5"
1109
+  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.0.5.tgz#cd730b77d9667b8ff700ad66d4edc293bb09716a"
1110
+  integrity sha512-4uNg5+0eIfRafnpgu3jCZws3NNcFzhu5JdRd1mKQ4/53+vkIqwB6vfZ4gn5BdGqOaLtYhlOsPaL5ATkKzyBrJw==
1111
   dependencies:
1111
   dependencies:
1112
     "@bcoe/v8-coverage" "^0.2.3"
1112
     "@bcoe/v8-coverage" "^0.2.3"
1113
     "@jest/console" "^27.0.2"
1113
     "@jest/console" "^27.0.2"
1114
     "@jest/test-result" "^27.0.2"
1114
     "@jest/test-result" "^27.0.2"
1115
-    "@jest/transform" "^27.0.2"
1115
+    "@jest/transform" "^27.0.5"
1116
     "@jest/types" "^27.0.2"
1116
     "@jest/types" "^27.0.2"
1117
     chalk "^4.0.0"
1117
     chalk "^4.0.0"
1118
     collect-v8-coverage "^1.0.0"
1118
     collect-v8-coverage "^1.0.0"
1124
     istanbul-lib-report "^3.0.0"
1124
     istanbul-lib-report "^3.0.0"
1125
     istanbul-lib-source-maps "^4.0.0"
1125
     istanbul-lib-source-maps "^4.0.0"
1126
     istanbul-reports "^3.0.2"
1126
     istanbul-reports "^3.0.2"
1127
-    jest-haste-map "^27.0.2"
1128
-    jest-resolve "^27.0.4"
1127
+    jest-haste-map "^27.0.5"
1128
+    jest-resolve "^27.0.5"
1129
     jest-util "^27.0.2"
1129
     jest-util "^27.0.2"
1130
     jest-worker "^27.0.2"
1130
     jest-worker "^27.0.2"
1131
     slash "^3.0.0"
1131
     slash "^3.0.0"
1132
     source-map "^0.6.0"
1132
     source-map "^0.6.0"
1133
     string-length "^4.0.1"
1133
     string-length "^4.0.1"
1134
     terminal-link "^2.0.0"
1134
     terminal-link "^2.0.0"
1135
-    v8-to-istanbul "^7.0.0"
1135
+    v8-to-istanbul "^8.0.0"
1136
 
1136
 
1137
 "@jest/source-map@^27.0.1":
1137
 "@jest/source-map@^27.0.1":
1138
   version "27.0.1"
1138
   version "27.0.1"
1153
     "@types/istanbul-lib-coverage" "^2.0.0"
1153
     "@types/istanbul-lib-coverage" "^2.0.0"
1154
     collect-v8-coverage "^1.0.0"
1154
     collect-v8-coverage "^1.0.0"
1155
 
1155
 
1156
-"@jest/test-sequencer@^27.0.4":
1157
-  version "27.0.4"
1158
-  resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.0.4.tgz#976493b277594d81e589896f0ed21f198308928a"
1159
-  integrity sha512-6UFEVwdmxYdyNffBxVVZxmXEdBE4riSddXYSnFNH0ELFQFk/bvagizim8WfgJTqF4EKd+j1yFxvhb8BMHfOjSQ==
1156
+"@jest/test-sequencer@^27.0.5":
1157
+  version "27.0.5"
1158
+  resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.0.5.tgz#c58b21db49afc36c0e3921d7ddf1fb7954abfded"
1159
+  integrity sha512-opztnGs+cXzZ5txFG2+omBaV5ge/0yuJNKbhE3DREMiXE0YxBuzyEa6pNv3kk2JuucIlH2Xvgmn9kEEHSNt/SA==
1160
   dependencies:
1160
   dependencies:
1161
     "@jest/test-result" "^27.0.2"
1161
     "@jest/test-result" "^27.0.2"
1162
     graceful-fs "^4.2.4"
1162
     graceful-fs "^4.2.4"
1163
-    jest-haste-map "^27.0.2"
1164
-    jest-runtime "^27.0.4"
1163
+    jest-haste-map "^27.0.5"
1164
+    jest-runtime "^27.0.5"
1165
 
1165
 
1166
-"@jest/transform@^27.0.2":
1167
-  version "27.0.2"
1168
-  resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.0.2.tgz#b073b7c589e3f4b842102468875def2bb722d6b5"
1169
-  integrity sha512-H8sqKlgtDfVog/s9I4GG2XMbi4Ar7RBxjsKQDUhn2XHAi3NG+GoQwWMER+YfantzExbjNqQvqBHzo/G2pfTiPw==
1166
+"@jest/transform@^27.0.5":
1167
+  version "27.0.5"
1168
+  resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.0.5.tgz#2dcb78953708af713941ac845b06078bc74ed873"
1169
+  integrity sha512-lBD6OwKXSc6JJECBNk4mVxtSVuJSBsQrJ9WCBisfJs7EZuYq4K6vM9HmoB7hmPiLIDGeyaerw3feBV/bC4z8tg==
1170
   dependencies:
1170
   dependencies:
1171
     "@babel/core" "^7.1.0"
1171
     "@babel/core" "^7.1.0"
1172
     "@jest/types" "^27.0.2"
1172
     "@jest/types" "^27.0.2"
1175
     convert-source-map "^1.4.0"
1175
     convert-source-map "^1.4.0"
1176
     fast-json-stable-stringify "^2.0.0"
1176
     fast-json-stable-stringify "^2.0.0"
1177
     graceful-fs "^4.2.4"
1177
     graceful-fs "^4.2.4"
1178
-    jest-haste-map "^27.0.2"
1178
+    jest-haste-map "^27.0.5"
1179
     jest-regex-util "^27.0.1"
1179
     jest-regex-util "^27.0.1"
1180
     jest-util "^27.0.2"
1180
     jest-util "^27.0.2"
1181
     micromatch "^4.0.4"
1181
     micromatch "^4.0.4"
2539
   integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==
2539
   integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==
2540
 
2540
 
2541
 axe-core@^4.0.2:
2541
 axe-core@^4.0.2:
2542
-  version "4.2.2"
2543
-  resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.2.2.tgz#0c987d82c8b82b4b9b7a945f1b5ef0d8fed586ed"
2544
-  integrity sha512-OKRkKM4ojMEZRJ5UNJHmq9tht7cEnRnqKG6KyB/trYws00Xtkv12mHtlJ0SK7cmuNbrU8dPUova3ELTuilfBbw==
2542
+  version "4.2.3"
2543
+  resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.2.3.tgz#2a3afc332f0031b42f602f4a3de03c211ca98f72"
2544
+  integrity sha512-pXnVMfJKSIWU2Ml4JHP7pZEPIrgBO1Fd3WGx+fPBsS+KRGhE4vxooD8XBGWbQOIVSZsVK7pUDBBkCicNu80yzQ==
2545
 
2545
 
2546
 axobject-query@^2.2.0:
2546
 axobject-query@^2.2.0:
2547
   version "2.2.0"
2547
   version "2.2.0"
2548
   resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
2548
   resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
2549
   integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==
2549
   integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==
2550
 
2550
 
2551
-babel-jest@^27.0.2:
2552
-  version "27.0.2"
2553
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.0.2.tgz#7dc18adb01322acce62c2af76ea2c7cd186ade37"
2554
-  integrity sha512-9OThPl3/IQbo4Yul2vMz4FYwILPQak8XelX4YGowygfHaOl5R5gfjm4iVx4d8aUugkW683t8aq0A74E7b5DU1Q==
2551
+babel-jest@^27.0.2, babel-jest@^27.0.5:
2552
+  version "27.0.5"
2553
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.0.5.tgz#cd34c033ada05d1362211e5152391fd7a88080c8"
2554
+  integrity sha512-bTMAbpCX7ldtfbca2llYLeSFsDM257aspyAOpsdrdSrBqoLkWCy4HPYTXtXWaSLgFPjrJGACL65rzzr4RFGadw==
2555
   dependencies:
2555
   dependencies:
2556
-    "@jest/transform" "^27.0.2"
2556
+    "@jest/transform" "^27.0.5"
2557
     "@jest/types" "^27.0.2"
2557
     "@jest/types" "^27.0.2"
2558
     "@types/babel__core" "^7.1.14"
2558
     "@types/babel__core" "^7.1.14"
2559
     babel-plugin-istanbul "^6.0.0"
2559
     babel-plugin-istanbul "^6.0.0"
3125
   resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
3125
   resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
3126
   integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
3126
   integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
3127
 
3127
 
3128
-core-js-compat@^3.14.0:
3128
+core-js-compat@^3.14.0, core-js-compat@^3.15.0:
3129
   version "3.15.0"
3129
   version "3.15.0"
3130
   resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.0.tgz#e14a371123db9d1c5b41206d3f420643d238b8fa"
3130
   resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.0.tgz#e14a371123db9d1c5b41206d3f420643d238b8fa"
3131
   integrity sha512-8X6lWsG+s7IfOKzV93a7fRYfWRZobOfjw5V5rrq43Vh/W+V6qYxl7Akalsvgab4PFT/4L/pjQbdBUEM36NXKrw==
3131
   integrity sha512-8X6lWsG+s7IfOKzV93a7fRYfWRZobOfjw5V5rrq43Vh/W+V6qYxl7Akalsvgab4PFT/4L/pjQbdBUEM36NXKrw==
3133
     browserslist "^4.16.6"
3133
     browserslist "^4.16.6"
3134
     semver "7.0.0"
3134
     semver "7.0.0"
3135
 
3135
 
3136
-core-js-pure@^3.14.0:
3136
+core-js-pure@^3.15.0:
3137
   version "3.15.0"
3137
   version "3.15.0"
3138
   resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.0.tgz#c19349ae0be197b8bcf304acf4d91c5e29ae2091"
3138
   resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.0.tgz#c19349ae0be197b8bcf304acf4d91c5e29ae2091"
3139
   integrity sha512-RO+LFAso8DB6OeBX9BAcEGvyth36QtxYon1OyVsITNVtSKr/Hos0BXZwnsOJ7o+O6KHtK+O+cJIEj9NGg6VwFA==
3139
   integrity sha512-RO+LFAso8DB6OeBX9BAcEGvyth36QtxYon1OyVsITNVtSKr/Hos0BXZwnsOJ7o+O6KHtK+O+cJIEj9NGg6VwFA==
3450
   integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
3450
   integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
3451
 
3451
 
3452
 electron-to-chromium@^1.3.723:
3452
 electron-to-chromium@^1.3.723:
3453
-  version "1.3.752"
3454
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz#0728587f1b9b970ec9ffad932496429aef750d09"
3455
-  integrity sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==
3453
+  version "1.3.754"
3454
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.754.tgz#afbe69177ad7aae968c3bbeba129dc70dcc37cf4"
3455
+  integrity sha512-Q50dJbfYYRtwK3G9mFP/EsJVzlgcYwKxFjbXmvVa1lDAbdviPcT9QOpFoufDApub4j0hBfDRL6v3lWNLEdEDXQ==
3456
 
3456
 
3457
 elliptic@^6.5.3:
3457
 elliptic@^6.5.3:
3458
   version "6.5.4"
3458
   version "6.5.4"
4749
     execa "^5.0.0"
4749
     execa "^5.0.0"
4750
     throat "^6.0.1"
4750
     throat "^6.0.1"
4751
 
4751
 
4752
-jest-circus@^27.0.4:
4753
-  version "27.0.4"
4754
-  resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.0.4.tgz#3b261514ee3b3da33def736a6352c98ff56bb6e6"
4755
-  integrity sha512-QD+eblDiRphta630WRKewuASLs/oY1Zki2G4bccntRvrTHQ63ljwFR5TLduuK4Zg0ZPzW0+8o6AP7KRd1yKOjw==
4752
+jest-circus@^27.0.5:
4753
+  version "27.0.5"
4754
+  resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.0.5.tgz#b5e327f1d6857c8485126f8e364aefa4378debaa"
4755
+  integrity sha512-p5rO90o1RTh8LPOG6l0Fc9qgp5YGv+8M5CFixhMh7gGHtGSobD1AxX9cjFZujILgY8t30QZ7WVvxlnuG31r8TA==
4756
   dependencies:
4756
   dependencies:
4757
-    "@jest/environment" "^27.0.3"
4757
+    "@jest/environment" "^27.0.5"
4758
     "@jest/test-result" "^27.0.2"
4758
     "@jest/test-result" "^27.0.2"
4759
     "@jest/types" "^27.0.2"
4759
     "@jest/types" "^27.0.2"
4760
     "@types/node" "*"
4760
     "@types/node" "*"
4766
     jest-each "^27.0.2"
4766
     jest-each "^27.0.2"
4767
     jest-matcher-utils "^27.0.2"
4767
     jest-matcher-utils "^27.0.2"
4768
     jest-message-util "^27.0.2"
4768
     jest-message-util "^27.0.2"
4769
-    jest-runtime "^27.0.4"
4770
-    jest-snapshot "^27.0.4"
4769
+    jest-runtime "^27.0.5"
4770
+    jest-snapshot "^27.0.5"
4771
     jest-util "^27.0.2"
4771
     jest-util "^27.0.2"
4772
     pretty-format "^27.0.2"
4772
     pretty-format "^27.0.2"
4773
     slash "^3.0.0"
4773
     slash "^3.0.0"
4774
     stack-utils "^2.0.3"
4774
     stack-utils "^2.0.3"
4775
     throat "^6.0.1"
4775
     throat "^6.0.1"
4776
 
4776
 
4777
-jest-cli@^27.0.4:
4778
-  version "27.0.4"
4779
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.0.4.tgz#491b12c754c0d7c6873b13a66f26b3a80a852910"
4780
-  integrity sha512-E0T+/i2lxsWAzV7LKYd0SB7HUAvePqaeIh5vX43/G5jXLhv1VzjYzJAGEkTfvxV774ll9cyE2ljcL73PVMEOXQ==
4777
+jest-cli@^27.0.5:
4778
+  version "27.0.5"
4779
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.0.5.tgz#f359ba042624cffb96b713010a94bffb7498a37c"
4780
+  integrity sha512-kZqY020QFOFQKVE2knFHirTBElw3/Q0kUbDc3nMfy/x+RQ7zUY89SUuzpHHJoSX1kX7Lq569ncvjNqU3Td/FCA==
4781
   dependencies:
4781
   dependencies:
4782
-    "@jest/core" "^27.0.4"
4782
+    "@jest/core" "^27.0.5"
4783
     "@jest/test-result" "^27.0.2"
4783
     "@jest/test-result" "^27.0.2"
4784
     "@jest/types" "^27.0.2"
4784
     "@jest/types" "^27.0.2"
4785
     chalk "^4.0.0"
4785
     chalk "^4.0.0"
4786
     exit "^0.1.2"
4786
     exit "^0.1.2"
4787
     graceful-fs "^4.2.4"
4787
     graceful-fs "^4.2.4"
4788
     import-local "^3.0.2"
4788
     import-local "^3.0.2"
4789
-    jest-config "^27.0.4"
4789
+    jest-config "^27.0.5"
4790
     jest-util "^27.0.2"
4790
     jest-util "^27.0.2"
4791
     jest-validate "^27.0.2"
4791
     jest-validate "^27.0.2"
4792
     prompts "^2.0.1"
4792
     prompts "^2.0.1"
4793
     yargs "^16.0.3"
4793
     yargs "^16.0.3"
4794
 
4794
 
4795
-jest-config@^27.0.4:
4796
-  version "27.0.4"
4797
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.0.4.tgz#c4f41378acf40ca77860fb4e213b12109d87b8cf"
4798
-  integrity sha512-VkQFAHWnPQefdvHU9A+G3H/Z3NrrTKqWpvxgQz3nkUdkDTWeKJE6e//BL+R7z79dXOMVksYgM/z6ndtN0hfChg==
4795
+jest-config@^27.0.5:
4796
+  version "27.0.5"
4797
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.0.5.tgz#683da3b0d8237675c29c817f6e3aba1481028e19"
4798
+  integrity sha512-zCUIXag7QIXKEVN4kUKbDBDi9Q53dV5o3eNhGqe+5zAbt1vLs4VE3ceWaYrOub0L4Y7E9pGfM84TX/0ARcE+Qw==
4799
   dependencies:
4799
   dependencies:
4800
     "@babel/core" "^7.1.0"
4800
     "@babel/core" "^7.1.0"
4801
-    "@jest/test-sequencer" "^27.0.4"
4801
+    "@jest/test-sequencer" "^27.0.5"
4802
     "@jest/types" "^27.0.2"
4802
     "@jest/types" "^27.0.2"
4803
-    babel-jest "^27.0.2"
4803
+    babel-jest "^27.0.5"
4804
     chalk "^4.0.0"
4804
     chalk "^4.0.0"
4805
     deepmerge "^4.2.2"
4805
     deepmerge "^4.2.2"
4806
     glob "^7.1.1"
4806
     glob "^7.1.1"
4807
     graceful-fs "^4.2.4"
4807
     graceful-fs "^4.2.4"
4808
     is-ci "^3.0.0"
4808
     is-ci "^3.0.0"
4809
-    jest-circus "^27.0.4"
4810
-    jest-environment-jsdom "^27.0.3"
4811
-    jest-environment-node "^27.0.3"
4809
+    jest-circus "^27.0.5"
4810
+    jest-environment-jsdom "^27.0.5"
4811
+    jest-environment-node "^27.0.5"
4812
     jest-get-type "^27.0.1"
4812
     jest-get-type "^27.0.1"
4813
-    jest-jasmine2 "^27.0.4"
4813
+    jest-jasmine2 "^27.0.5"
4814
     jest-regex-util "^27.0.1"
4814
     jest-regex-util "^27.0.1"
4815
-    jest-resolve "^27.0.4"
4816
-    jest-runner "^27.0.4"
4815
+    jest-resolve "^27.0.5"
4816
+    jest-runner "^27.0.5"
4817
     jest-util "^27.0.2"
4817
     jest-util "^27.0.2"
4818
     jest-validate "^27.0.2"
4818
     jest-validate "^27.0.2"
4819
     micromatch "^4.0.4"
4819
     micromatch "^4.0.4"
4857
     jest-util "^27.0.2"
4857
     jest-util "^27.0.2"
4858
     pretty-format "^27.0.2"
4858
     pretty-format "^27.0.2"
4859
 
4859
 
4860
-jest-environment-jsdom@^27.0.3:
4861
-  version "27.0.3"
4862
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.0.3.tgz#ed73e913ddc03864eb9f934b5cbabf1b63504e2e"
4863
-  integrity sha512-5KLmgv1bhiimpSA8oGTnZYk6g4fsNyZiA/6gI2tAZUgrufd7heRUSVh4gRokzZVEj8zlwAQYT0Zs6tuJSW/ECA==
4860
+jest-environment-jsdom@^27.0.5:
4861
+  version "27.0.5"
4862
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.0.5.tgz#c36771977cf4490a9216a70473b39161d193c212"
4863
+  integrity sha512-ToWhViIoTl5738oRaajTMgYhdQL73UWPoV4GqHGk2DPhs+olv8OLq5KoQW8Yf+HtRao52XLqPWvl46dPI88PdA==
4864
   dependencies:
4864
   dependencies:
4865
-    "@jest/environment" "^27.0.3"
4866
-    "@jest/fake-timers" "^27.0.3"
4865
+    "@jest/environment" "^27.0.5"
4866
+    "@jest/fake-timers" "^27.0.5"
4867
     "@jest/types" "^27.0.2"
4867
     "@jest/types" "^27.0.2"
4868
     "@types/node" "*"
4868
     "@types/node" "*"
4869
     jest-mock "^27.0.3"
4869
     jest-mock "^27.0.3"
4870
     jest-util "^27.0.2"
4870
     jest-util "^27.0.2"
4871
     jsdom "^16.6.0"
4871
     jsdom "^16.6.0"
4872
 
4872
 
4873
-jest-environment-node@^27.0.3:
4874
-  version "27.0.3"
4875
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.0.3.tgz#b4acb3679d2552a4215732cab8b0ca7ec4398ee0"
4876
-  integrity sha512-co2/IVnIFL3cItpFULCvXFg9us4gvWXgs7mutAMPCbFhcqh56QAOdKhNzC2+RycsC/k4mbMj1VF+9F/NzA0ROg==
4873
+jest-environment-node@^27.0.5:
4874
+  version "27.0.5"
4875
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.0.5.tgz#b7238fc2b61ef2fb9563a3b7653a95fa009a6a54"
4876
+  integrity sha512-47qqScV/WMVz5OKF5TWpAeQ1neZKqM3ySwNveEnLyd+yaE/KT6lSMx/0SOx60+ZUcVxPiESYS+Kt2JS9y4PpkQ==
4877
   dependencies:
4877
   dependencies:
4878
-    "@jest/environment" "^27.0.3"
4879
-    "@jest/fake-timers" "^27.0.3"
4878
+    "@jest/environment" "^27.0.5"
4879
+    "@jest/fake-timers" "^27.0.5"
4880
     "@jest/types" "^27.0.2"
4880
     "@jest/types" "^27.0.2"
4881
     "@types/node" "*"
4881
     "@types/node" "*"
4882
     jest-mock "^27.0.3"
4882
     jest-mock "^27.0.3"
4892
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.1.tgz#34951e2b08c8801eb28559d7eb732b04bbcf7815"
4892
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.1.tgz#34951e2b08c8801eb28559d7eb732b04bbcf7815"
4893
   integrity sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg==
4893
   integrity sha512-9Tggo9zZbu0sHKebiAijyt1NM77Z0uO4tuWOxUCujAiSeXv30Vb5D4xVF4UR4YWNapcftj+PbByU54lKD7/xMg==
4894
 
4894
 
4895
-jest-haste-map@^27.0.2:
4896
-  version "27.0.2"
4897
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.0.2.tgz#3f1819400c671237e48b4d4b76a80a0dbed7577f"
4898
-  integrity sha512-37gYfrYjjhEfk37C4bCMWAC0oPBxDpG0qpl8lYg8BT//wf353YT/fzgA7+Dq0EtM7rPFS3JEcMsxdtDwNMi2cA==
4895
+jest-haste-map@^27.0.5:
4896
+  version "27.0.5"
4897
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.0.5.tgz#2e1e55073b5328410a2c0d74b334e513d71f3470"
4898
+  integrity sha512-3LFryGSHxwPFHzKIs6W0BGA2xr6g1MvzSjR3h3D8K8Uqy4vbRm/grpGHzbPtIbOPLC6wFoViRrNEmd116QWSkw==
4899
   dependencies:
4899
   dependencies:
4900
     "@jest/types" "^27.0.2"
4900
     "@jest/types" "^27.0.2"
4901
     "@types/graceful-fs" "^4.1.2"
4901
     "@types/graceful-fs" "^4.1.2"
4912
   optionalDependencies:
4912
   optionalDependencies:
4913
     fsevents "^2.3.2"
4913
     fsevents "^2.3.2"
4914
 
4914
 
4915
-jest-jasmine2@^27.0.4:
4916
-  version "27.0.4"
4917
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.0.4.tgz#c669519ccf4904a485338555e1e66cad36bb0670"
4918
-  integrity sha512-yj3WrjjquZwkJw+eA4c9yucHw4/+EHndHWSqgHbHGQfT94ihaaQsa009j1a0puU8CNxPDk0c1oAPeOpdJUElwA==
4915
+jest-jasmine2@^27.0.5:
4916
+  version "27.0.5"
4917
+  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.0.5.tgz#8a6eb2a685cdec3af13881145c77553e4e197776"
4918
+  integrity sha512-m3TojR19sFmTn79QoaGy1nOHBcLvtLso6Zh7u+gYxZWGcza4rRPVqwk1hciA5ZOWWZIJOukAcore8JRX992FaA==
4919
   dependencies:
4919
   dependencies:
4920
     "@babel/traverse" "^7.1.0"
4920
     "@babel/traverse" "^7.1.0"
4921
-    "@jest/environment" "^27.0.3"
4921
+    "@jest/environment" "^27.0.5"
4922
     "@jest/source-map" "^27.0.1"
4922
     "@jest/source-map" "^27.0.1"
4923
     "@jest/test-result" "^27.0.2"
4923
     "@jest/test-result" "^27.0.2"
4924
     "@jest/types" "^27.0.2"
4924
     "@jest/types" "^27.0.2"
4930
     jest-each "^27.0.2"
4930
     jest-each "^27.0.2"
4931
     jest-matcher-utils "^27.0.2"
4931
     jest-matcher-utils "^27.0.2"
4932
     jest-message-util "^27.0.2"
4932
     jest-message-util "^27.0.2"
4933
-    jest-runtime "^27.0.4"
4934
-    jest-snapshot "^27.0.4"
4933
+    jest-runtime "^27.0.5"
4934
+    jest-snapshot "^27.0.5"
4935
     jest-util "^27.0.2"
4935
     jest-util "^27.0.2"
4936
     pretty-format "^27.0.2"
4936
     pretty-format "^27.0.2"
4937
     throat "^6.0.1"
4937
     throat "^6.0.1"
4987
   resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.1.tgz#69d4b1bf5b690faa3490113c47486ed85dd45b68"
4987
   resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.1.tgz#69d4b1bf5b690faa3490113c47486ed85dd45b68"
4988
   integrity sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ==
4988
   integrity sha512-6nY6QVcpTgEKQy1L41P4pr3aOddneK17kn3HJw6SdwGiKfgCGTvH02hVXL0GU8GEKtPH83eD2DIDgxHXOxVohQ==
4989
 
4989
 
4990
-jest-resolve-dependencies@^27.0.4:
4991
-  version "27.0.4"
4992
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.4.tgz#a07a242d70d668afd3fcf7f4270755eebb1fe579"
4993
-  integrity sha512-F33UPfw1YGWCV2uxJl7wD6TvcQn5IC0LtguwY3r4L7R6H4twpLkp5Q2ZfzRx9A2I3G8feiy0O0sqcn/Qoym71A==
4990
+jest-resolve-dependencies@^27.0.5:
4991
+  version "27.0.5"
4992
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.5.tgz#819ccdddd909c65acddb063aac3a49e4ba1ed569"
4993
+  integrity sha512-xUj2dPoEEd59P+nuih4XwNa4nJ/zRd/g4rMvjHrZPEBWeWRq/aJnnM6mug+B+Nx+ILXGtfWHzQvh7TqNV/WbuA==
4994
   dependencies:
4994
   dependencies:
4995
     "@jest/types" "^27.0.2"
4995
     "@jest/types" "^27.0.2"
4996
     jest-regex-util "^27.0.1"
4996
     jest-regex-util "^27.0.1"
4997
-    jest-snapshot "^27.0.4"
4997
+    jest-snapshot "^27.0.5"
4998
 
4998
 
4999
-jest-resolve@^27.0.4:
5000
-  version "27.0.4"
5001
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.0.4.tgz#8a27bc3f2f00c8ea28f3bc99bbf6f468300a703d"
5002
-  integrity sha512-BcfyK2i3cG79PDb/6gB6zFeFQlcqLsQjGBqznFCpA0L/3l1L/oOsltdUjs5eISAWA9HS9qtj8v2PSZr/yWxONQ==
4999
+jest-resolve@^27.0.5:
5000
+  version "27.0.5"
5001
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.0.5.tgz#937535a5b481ad58e7121eaea46d1424a1e0c507"
5002
+  integrity sha512-Md65pngRh8cRuWVdWznXBB5eDt391OJpdBaJMxfjfuXCvOhM3qQBtLMCMTykhuUKiBMmy5BhqCW7AVOKmPrW+Q==
5003
   dependencies:
5003
   dependencies:
5004
     "@jest/types" "^27.0.2"
5004
     "@jest/types" "^27.0.2"
5005
     chalk "^4.0.0"
5005
     chalk "^4.0.0"
5011
     resolve "^1.20.0"
5011
     resolve "^1.20.0"
5012
     slash "^3.0.0"
5012
     slash "^3.0.0"
5013
 
5013
 
5014
-jest-runner@^27.0.4:
5015
-  version "27.0.4"
5016
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.0.4.tgz#2787170a9509b792ae129794f6944d27d5d12a4f"
5017
-  integrity sha512-NfmvSYLCsCJk2AG8Ar2NAh4PhsJJpO+/r+g4bKR5L/5jFzx/indUpnVBdrfDvuqhGLLAvrKJ9FM/Nt8o1dsqxg==
5014
+jest-runner@^27.0.5:
5015
+  version "27.0.5"
5016
+  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.0.5.tgz#b6fdc587e1a5056339205914294555c554efc08a"
5017
+  integrity sha512-HNhOtrhfKPArcECgBTcWOc+8OSL8GoFoa7RsHGnfZR1C1dFohxy9eLtpYBS+koybAHlJLZzNCx2Y/Ic3iEtJpQ==
5018
   dependencies:
5018
   dependencies:
5019
     "@jest/console" "^27.0.2"
5019
     "@jest/console" "^27.0.2"
5020
-    "@jest/environment" "^27.0.3"
5020
+    "@jest/environment" "^27.0.5"
5021
     "@jest/test-result" "^27.0.2"
5021
     "@jest/test-result" "^27.0.2"
5022
-    "@jest/transform" "^27.0.2"
5022
+    "@jest/transform" "^27.0.5"
5023
     "@jest/types" "^27.0.2"
5023
     "@jest/types" "^27.0.2"
5024
     "@types/node" "*"
5024
     "@types/node" "*"
5025
     chalk "^4.0.0"
5025
     chalk "^4.0.0"
5027
     exit "^0.1.2"
5027
     exit "^0.1.2"
5028
     graceful-fs "^4.2.4"
5028
     graceful-fs "^4.2.4"
5029
     jest-docblock "^27.0.1"
5029
     jest-docblock "^27.0.1"
5030
-    jest-environment-jsdom "^27.0.3"
5031
-    jest-environment-node "^27.0.3"
5032
-    jest-haste-map "^27.0.2"
5030
+    jest-environment-jsdom "^27.0.5"
5031
+    jest-environment-node "^27.0.5"
5032
+    jest-haste-map "^27.0.5"
5033
     jest-leak-detector "^27.0.2"
5033
     jest-leak-detector "^27.0.2"
5034
     jest-message-util "^27.0.2"
5034
     jest-message-util "^27.0.2"
5035
-    jest-resolve "^27.0.4"
5036
-    jest-runtime "^27.0.4"
5035
+    jest-resolve "^27.0.5"
5036
+    jest-runtime "^27.0.5"
5037
     jest-util "^27.0.2"
5037
     jest-util "^27.0.2"
5038
     jest-worker "^27.0.2"
5038
     jest-worker "^27.0.2"
5039
     source-map-support "^0.5.6"
5039
     source-map-support "^0.5.6"
5040
     throat "^6.0.1"
5040
     throat "^6.0.1"
5041
 
5041
 
5042
-jest-runtime@^27.0.4:
5043
-  version "27.0.4"
5044
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.0.4.tgz#2e4a6aa77cac32ac612dfe12768387a8aa15c2f0"
5045
-  integrity sha512-voJB4xbAjS/qYPboV+e+gmg3jfvHJJY4CagFWBOM9dQKtlaiTjcpD2tWwla84Z7PtXSQPeIpXY0qksA9Dum29A==
5042
+jest-runtime@^27.0.5:
5043
+  version "27.0.5"
5044
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.0.5.tgz#cd5d1aa9754d30ddf9f13038b3cb7b95b46f552d"
5045
+  integrity sha512-V/w/+VasowPESbmhXn5AsBGPfb35T7jZPGZybYTHxZdP7Gwaa+A0EXE6rx30DshHKA98lVCODbCO8KZpEW3hiQ==
5046
   dependencies:
5046
   dependencies:
5047
     "@jest/console" "^27.0.2"
5047
     "@jest/console" "^27.0.2"
5048
-    "@jest/environment" "^27.0.3"
5049
-    "@jest/fake-timers" "^27.0.3"
5050
-    "@jest/globals" "^27.0.3"
5048
+    "@jest/environment" "^27.0.5"
5049
+    "@jest/fake-timers" "^27.0.5"
5050
+    "@jest/globals" "^27.0.5"
5051
     "@jest/source-map" "^27.0.1"
5051
     "@jest/source-map" "^27.0.1"
5052
     "@jest/test-result" "^27.0.2"
5052
     "@jest/test-result" "^27.0.2"
5053
-    "@jest/transform" "^27.0.2"
5053
+    "@jest/transform" "^27.0.5"
5054
     "@jest/types" "^27.0.2"
5054
     "@jest/types" "^27.0.2"
5055
     "@types/yargs" "^16.0.0"
5055
     "@types/yargs" "^16.0.0"
5056
     chalk "^4.0.0"
5056
     chalk "^4.0.0"
5059
     exit "^0.1.2"
5059
     exit "^0.1.2"
5060
     glob "^7.1.3"
5060
     glob "^7.1.3"
5061
     graceful-fs "^4.2.4"
5061
     graceful-fs "^4.2.4"
5062
-    jest-haste-map "^27.0.2"
5062
+    jest-haste-map "^27.0.5"
5063
     jest-message-util "^27.0.2"
5063
     jest-message-util "^27.0.2"
5064
     jest-mock "^27.0.3"
5064
     jest-mock "^27.0.3"
5065
     jest-regex-util "^27.0.1"
5065
     jest-regex-util "^27.0.1"
5066
-    jest-resolve "^27.0.4"
5067
-    jest-snapshot "^27.0.4"
5066
+    jest-resolve "^27.0.5"
5067
+    jest-snapshot "^27.0.5"
5068
     jest-util "^27.0.2"
5068
     jest-util "^27.0.2"
5069
     jest-validate "^27.0.2"
5069
     jest-validate "^27.0.2"
5070
     slash "^3.0.0"
5070
     slash "^3.0.0"
5079
     "@types/node" "*"
5079
     "@types/node" "*"
5080
     graceful-fs "^4.2.4"
5080
     graceful-fs "^4.2.4"
5081
 
5081
 
5082
-jest-snapshot@^27.0.4:
5083
-  version "27.0.4"
5084
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.0.4.tgz#2b96e22ca90382b3e93bd0aae2ce4c78bf51fb5b"
5085
-  integrity sha512-hnjrvpKGdSMvKfbHyaG5Kul7pDJGZvjVy0CKpzhu28MmAssDXS6GpynhXzgst1wBQoKD8c9b2VS2a5yhDLQRCA==
5082
+jest-snapshot@^27.0.5:
5083
+  version "27.0.5"
5084
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.0.5.tgz#6e3b9e8e193685372baff771ba34af631fe4d4d5"
5085
+  integrity sha512-H1yFYdgnL1vXvDqMrnDStH6yHFdMEuzYQYc71SnC/IJnuuhW6J16w8GWG1P+qGd3Ag3sQHjbRr0TcwEo/vGS+g==
5086
   dependencies:
5086
   dependencies:
5087
     "@babel/core" "^7.7.2"
5087
     "@babel/core" "^7.7.2"
5088
     "@babel/generator" "^7.7.2"
5088
     "@babel/generator" "^7.7.2"
5090
     "@babel/plugin-syntax-typescript" "^7.7.2"
5090
     "@babel/plugin-syntax-typescript" "^7.7.2"
5091
     "@babel/traverse" "^7.7.2"
5091
     "@babel/traverse" "^7.7.2"
5092
     "@babel/types" "^7.0.0"
5092
     "@babel/types" "^7.0.0"
5093
-    "@jest/transform" "^27.0.2"
5093
+    "@jest/transform" "^27.0.5"
5094
     "@jest/types" "^27.0.2"
5094
     "@jest/types" "^27.0.2"
5095
     "@types/babel__traverse" "^7.0.4"
5095
     "@types/babel__traverse" "^7.0.4"
5096
     "@types/prettier" "^2.1.5"
5096
     "@types/prettier" "^2.1.5"
5100
     graceful-fs "^4.2.4"
5100
     graceful-fs "^4.2.4"
5101
     jest-diff "^27.0.2"
5101
     jest-diff "^27.0.2"
5102
     jest-get-type "^27.0.1"
5102
     jest-get-type "^27.0.1"
5103
-    jest-haste-map "^27.0.2"
5103
+    jest-haste-map "^27.0.5"
5104
     jest-matcher-utils "^27.0.2"
5104
     jest-matcher-utils "^27.0.2"
5105
     jest-message-util "^27.0.2"
5105
     jest-message-util "^27.0.2"
5106
-    jest-resolve "^27.0.4"
5106
+    jest-resolve "^27.0.5"
5107
     jest-util "^27.0.2"
5107
     jest-util "^27.0.2"
5108
     natural-compare "^1.4.0"
5108
     natural-compare "^1.4.0"
5109
     pretty-format "^27.0.2"
5109
     pretty-format "^27.0.2"
5187
     supports-color "^8.0.0"
5187
     supports-color "^8.0.0"
5188
 
5188
 
5189
 jest@^27.0.4:
5189
 jest@^27.0.4:
5190
-  version "27.0.4"
5191
-  resolved "https://registry.yarnpkg.com/jest/-/jest-27.0.4.tgz#91d4d564b36bcf93b98dac1ab19f07089e670f53"
5192
-  integrity sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==
5190
+  version "27.0.5"
5191
+  resolved "https://registry.yarnpkg.com/jest/-/jest-27.0.5.tgz#141825e105514a834cc8d6e44670509e8d74c5f2"
5192
+  integrity sha512-4NlVMS29gE+JOZvgmSAsz3eOjkSsHqjTajlIsah/4MVSmKvf3zFP/TvgcLoWe2UVHiE9KF741sReqhF0p4mqbQ==
5193
   dependencies:
5193
   dependencies:
5194
-    "@jest/core" "^27.0.4"
5194
+    "@jest/core" "^27.0.5"
5195
     import-local "^3.0.2"
5195
     import-local "^3.0.2"
5196
-    jest-cli "^27.0.4"
5196
+    jest-cli "^27.0.5"
5197
 
5197
 
5198
 jose@^1.27.2:
5198
 jose@^1.27.2:
5199
   version "1.28.1"
5199
   version "1.28.1"
7819
   resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
7819
   resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
7820
   integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
7820
   integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
7821
 
7821
 
7822
-v8-to-istanbul@^7.0.0:
7823
-  version "7.1.2"
7824
-  resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1"
7825
-  integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==
7822
+v8-to-istanbul@^8.0.0:
7823
+  version "8.0.0"
7824
+  resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz#4229f2a99e367f3f018fa1d5c2b8ec684667c69c"
7825
+  integrity sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==
7826
   dependencies:
7826
   dependencies:
7827
     "@types/istanbul-lib-coverage" "^2.0.1"
7827
     "@types/istanbul-lib-coverage" "^2.0.1"
7828
     convert-source-map "^1.6.0"
7828
     convert-source-map "^1.6.0"

Завантаження…
Відмінити
Зберегти