Procházet zdrojové kódy

Generalize dash helper.

main
Steve Ruiz před 4 roky
rodič
revize
9e2938c3d5

+ 57
- 0
__tests__/__snapshots__/dashes.ts.snap Zobrazit soubor

@@ -0,0 +1,57 @@
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 Zobrazit soubor

@@ -0,0 +1,33 @@
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 Zobrazit soubor

@@ -1,13 +1,16 @@
1 1
 module.exports = {
2 2
   roots: ['<rootDir>'],
3 3
   testEnvironment: 'jsdom',
4
-  moduleFileExtensions: ['ts', 'tsx', 'js', 'json', 'jsx'],
4
+  moduleFileExtensions: ['ts', 'tsx', 'mjs', 'js', 'json', 'jsx'],
5 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 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 14
   watchPlugins: [
12 15
     'jest-watch-typeahead/filename',
13 16
     'jest-watch-typeahead/testname',

+ 6
- 0
package.json Zobrazit soubor

@@ -81,5 +81,11 @@
81 81
     "lint-staged": "^10.0.10",
82 82
     "prettier": "^2.3.1",
83 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 Zobrazit soubor

@@ -1,18 +1,32 @@
1 1
 import Command from './command'
2 2
 import history from '../history'
3 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 10
 import { getShapeUtils } from 'state/shape-utils'
6
-import { current } from 'immer'
7 11
 
8 12
 export default function stretchCommand(data: Data, type: StretchType): void {
9 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 31
   history.execute(
18 32
     data,
@@ -24,60 +38,52 @@ export default function stretchCommand(data: Data, type: StretchType): void {
24 38
 
25 39
         switch (type) {
26 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 60
             break
45 61
           }
46 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 84
       undo(data) {
68 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 Zobrazit soubor

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

+ 41
- 46
state/shape-utils/arrow.tsx Zobrazit soubor

@@ -19,6 +19,7 @@ import { defaultStyle, getShapeStyle } from 'state/shape-styles'
19 19
 import getStroke from 'perfect-freehand'
20 20
 import React from 'react'
21 21
 import { registerShapeUtils } from './register'
22
+import { getPerfectDashProps } from 'utils/dashes'
22 23
 
23 24
 const pathCache = new WeakMap<ArrowShape, string>([])
24 25
 
@@ -95,16 +96,29 @@ const arrow = registerShapeUtils<ArrowShape>({
95 96
 
96 97
     const strokeWidth = +styles.strokeWidth
97 98
 
99
+    const arrowDist = vec.dist(start.point, end.point)
100
+
98 101
     if (isStraightLine) {
99 102
       // Render a straight arrow as a freehand path.
100 103
       if (!pathCache.has(shape)) {
101 104
         renderPath(shape)
102 105
       }
103 106
 
104
-      const offset = -vec.dist(start.point, end.point) + strokeWidth
105
-
106 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 122
       return (
109 123
         <g id={id}>
110 124
           {/* Improves hit testing */}
@@ -113,24 +127,19 @@ const arrow = registerShapeUtils<ArrowShape>({
113 127
             stroke="transparent"
114 128
             fill="none"
115 129
             strokeWidth={Math.max(8, strokeWidth * 2)}
116
-            strokeLinecap="round"
117 130
             strokeDasharray="none"
131
+            strokeDashoffset="none"
132
+            strokeLinecap="round"
118 133
           />
119 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 135
           <path
128 136
             d={path}
129 137
             fill="none"
130 138
             strokeWidth={
131 139
               strokeWidth * (style.dash === DashStyle.Solid ? 1 : 1.618)
132 140
             }
133
-            strokeDashoffset={offset}
141
+            strokeDasharray={strokeDasharray}
142
+            strokeDashoffset={strokeDashoffset}
134 143
             strokeLinecap="round"
135 144
           />
136 145
           {/* Arrowhead */}
@@ -138,8 +147,9 @@ const arrow = registerShapeUtils<ArrowShape>({
138 147
             <path
139 148
               d={getArrowHeadPath(shape, 0)}
140 149
               strokeWidth={strokeWidth * 1.618}
141
-              strokeDasharray="none"
142 150
               fill="none"
151
+              strokeDashoffset="none"
152
+              strokeDasharray="none"
143 153
             />
144 154
           )}
145 155
         </g>
@@ -159,11 +169,23 @@ const arrow = registerShapeUtils<ArrowShape>({
159 169
 
160 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 190
     return (
169 191
       <g id={id}>
@@ -177,19 +199,13 @@ const arrow = registerShapeUtils<ArrowShape>({
177 199
           strokeDasharray="none"
178 200
         />
179 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 202
         <path
188 203
           d={path}
189 204
           fill="none"
190 205
           strokeWidth={strokeWidth * 1.618}
191 206
           strokeLinecap="round"
192
-          strokeDashoffset={strokeDashOffset}
207
+          strokeDasharray={strokeDasharray}
208
+          strokeDashoffset={strokeDashoffset}
193 209
         />
194 210
         {/* Arrowhead */}
195 211
         <path
@@ -537,24 +553,3 @@ function getArrowHeadPoints(shape: ArrowShape, endAngle = 0) {
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 Zobrazit soubor

@@ -1,11 +1,17 @@
1
-import { uniqueId, getPerfectEllipseDashProps } from 'utils/utils'
1
+import { getPerfectDashProps } from 'utils/dashes'
2 2
 import vec from 'utils/vec'
3 3
 import { DashStyle, EllipseShape, ShapeType } from 'types'
4 4
 import { getShapeUtils } from './index'
5 5
 import { boundsContained, getRotatedEllipseBounds } from 'utils/bounds'
6 6
 import { intersectEllipseBounds } from 'utils/intersections'
7 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 15
 import { defaultStyle, getShapeStyle } from 'state/shape-styles'
10 16
 import getStroke from 'perfect-freehand'
11 17
 import { registerShapeUtils } from './register'
@@ -41,6 +47,9 @@ const ellipse = registerShapeUtils<EllipseShape>({
41 47
     const styles = getShapeStyle(style)
42 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 53
     if (style.dash === DashStyle.Solid) {
45 54
       if (!pathCache.has(shape)) {
46 55
         renderPath(shape)
@@ -54,8 +63,8 @@ const ellipse = registerShapeUtils<EllipseShape>({
54 63
             id={id}
55 64
             cx={radiusX}
56 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 68
             stroke="none"
60 69
           />
61 70
           <path d={path} fill={styles.stroke} />
@@ -63,14 +72,15 @@ const ellipse = registerShapeUtils<EllipseShape>({
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 86
     return (
@@ -83,6 +93,7 @@ const ellipse = registerShapeUtils<EllipseShape>({
83 93
           ry={ry}
84 94
           fill={styles.fill}
85 95
           stroke={styles.stroke}
96
+          strokeWidth={strokeWidth * 1.618}
86 97
           strokeDasharray={strokeDasharray}
87 98
           strokeDashoffset={strokeDashoffset}
88 99
         />

+ 51
- 20
state/shape-utils/rectangle.tsx Zobrazit soubor

@@ -8,13 +8,10 @@ import {
8 8
   shuffleArr,
9 9
   pointsBetween,
10 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 12
 import getStroke from 'perfect-freehand'
17 13
 import { registerShapeUtils } from './register'
14
+import { getPerfectDashProps } from 'utils/dashes'
18 15
 
19 16
 const pathCache = new WeakMap<number[], string>([])
20 17
 
@@ -44,8 +41,8 @@ const rectangle = registerShapeUtils<RectangleShape>({
44 41
 
45 42
   render(shape) {
46 43
     const { id, size, radius, style } = shape
47
-
48 44
     const styles = getShapeStyle(style)
45
+    const strokeWidth = +styles.strokeWidth
49 46
 
50 47
     if (style.dash === DashStyle.Solid) {
51 48
       if (!pathCache.has(shape.size)) {
@@ -61,8 +58,8 @@ const rectangle = registerShapeUtils<RectangleShape>({
61 58
             ry={radius}
62 59
             x={+styles.strokeWidth / 2}
63 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 63
             strokeWidth={0}
67 64
             fill={styles.fill}
68 65
           />
@@ -71,19 +68,53 @@ const rectangle = registerShapeUtils<RectangleShape>({
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 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 Zobrazit soubor

@@ -1 +0,0 @@
1
-module.exports = 'test-file-stub'

+ 0
- 11
test/pages/__snapshots__/index.test.tsx.snap Zobrazit soubor

@@ -1,11 +0,0 @@
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 Zobrazit soubor

@@ -1,9 +0,0 @@
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 Zobrazit soubor

@@ -1,26 +0,0 @@
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 Zobrazit soubor

@@ -0,0 +1,41 @@
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 Zobrazit soubor

@@ -1797,49 +1797,3 @@ export function perimeterOfEllipse(rx: number, ry: number): number {
1797 1797
   const p = Math.PI * (rx + ry) * (1 + (3 * h) / (10 + Math.sqrt(4 - 3 * h)))
1798 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 Zobrazit soubor

@@ -16,10 +16,10 @@
16 16
   dependencies:
17 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 24
 "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.7.2", "@babel/core@^7.7.5":
25 25
   version "7.14.6"
@@ -141,9 +141,9 @@
141 141
     "@babel/types" "^7.14.5"
142 142
 
143 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 147
   dependencies:
148 148
     "@babel/types" "^7.14.5"
149 149
 
@@ -258,10 +258,10 @@
258 258
     chalk "^2.0.0"
259 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 266
 "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5":
267 267
   version "7.14.5"
@@ -272,10 +272,10 @@
272 272
     "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
273 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 279
   dependencies:
280 280
     "@babel/helper-plugin-utils" "^7.14.5"
281 281
     "@babel/helper-remap-async-to-generator" "^7.14.5"
@@ -346,12 +346,12 @@
346 346
     "@babel/helper-plugin-utils" "^7.14.5"
347 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 353
   dependencies:
354
-    "@babel/compat-data" "^7.14.5"
354
+    "@babel/compat-data" "^7.14.7"
355 355
     "@babel/helper-compilation-targets" "^7.14.5"
356 356
     "@babel/helper-plugin-utils" "^7.14.5"
357 357
     "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
@@ -569,10 +569,10 @@
569 569
   dependencies:
570 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 576
   dependencies:
577 577
     "@babel/helper-plugin-utils" "^7.14.5"
578 578
 
@@ -666,10 +666,10 @@
666 666
     "@babel/helper-module-transforms" "^7.14.5"
667 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 673
   dependencies:
674 674
     "@babel/helper-create-regexp-features-plugin" "^7.14.5"
675 675
 
@@ -723,7 +723,7 @@
723 723
   dependencies:
724 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 727
   version "7.14.6"
728 728
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144"
729 729
   integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==
@@ -768,16 +768,16 @@
768 768
     "@babel/helper-plugin-utils" "^7.14.5"
769 769
 
770 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 774
   dependencies:
775
-    "@babel/compat-data" "^7.14.5"
775
+    "@babel/compat-data" "^7.14.7"
776 776
     "@babel/helper-compilation-targets" "^7.14.5"
777 777
     "@babel/helper-plugin-utils" "^7.14.5"
778 778
     "@babel/helper-validator-option" "^7.14.5"
779 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 781
     "@babel/plugin-proposal-class-properties" "^7.14.5"
782 782
     "@babel/plugin-proposal-class-static-block" "^7.14.5"
783 783
     "@babel/plugin-proposal-dynamic-import" "^7.14.5"
@@ -786,7 +786,7 @@
786 786
     "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5"
787 787
     "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5"
788 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 790
     "@babel/plugin-proposal-optional-catch-binding" "^7.14.5"
791 791
     "@babel/plugin-proposal-optional-chaining" "^7.14.5"
792 792
     "@babel/plugin-proposal-private-methods" "^7.14.5"
@@ -812,7 +812,7 @@
812 812
     "@babel/plugin-transform-block-scoping" "^7.14.5"
813 813
     "@babel/plugin-transform-classes" "^7.14.5"
814 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 816
     "@babel/plugin-transform-dotall-regex" "^7.14.5"
817 817
     "@babel/plugin-transform-duplicate-keys" "^7.14.5"
818 818
     "@babel/plugin-transform-exponentiation-operator" "^7.14.5"
@@ -824,7 +824,7 @@
824 824
     "@babel/plugin-transform-modules-commonjs" "^7.14.5"
825 825
     "@babel/plugin-transform-modules-systemjs" "^7.14.5"
826 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 828
     "@babel/plugin-transform-new-target" "^7.14.5"
829 829
     "@babel/plugin-transform-object-super" "^7.14.5"
830 830
     "@babel/plugin-transform-parameters" "^7.14.5"
@@ -832,7 +832,7 @@
832 832
     "@babel/plugin-transform-regenerator" "^7.14.5"
833 833
     "@babel/plugin-transform-reserved-words" "^7.14.5"
834 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 836
     "@babel/plugin-transform-sticky-regex" "^7.14.5"
837 837
     "@babel/plugin-transform-template-literals" "^7.14.5"
838 838
     "@babel/plugin-transform-typeof-symbol" "^7.14.5"
@@ -843,7 +843,7 @@
843 843
     babel-plugin-polyfill-corejs2 "^0.2.2"
844 844
     babel-plugin-polyfill-corejs3 "^0.2.2"
845 845
     babel-plugin-polyfill-regenerator "^0.2.2"
846
-    core-js-compat "^3.14.0"
846
+    core-js-compat "^3.15.0"
847 847
     semver "^6.3.0"
848 848
 
849 849
 "@babel/preset-modules@^0.1.4":
@@ -858,11 +858,11 @@
858 858
     esutils "^2.0.2"
859 859
 
860 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 864
   dependencies:
865
-    core-js-pure "^3.14.0"
865
+    core-js-pure "^3.15.0"
866 866
     regenerator-runtime "^0.13.4"
867 867
 
868 868
 "@babel/runtime@7.12.5":
@@ -889,16 +889,16 @@
889 889
     "@babel/types" "^7.14.5"
890 890
 
891 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 895
   dependencies:
896 896
     "@babel/code-frame" "^7.14.5"
897 897
     "@babel/generator" "^7.14.5"
898 898
     "@babel/helper-function-name" "^7.14.5"
899 899
     "@babel/helper-hoist-variables" "^7.14.5"
900 900
     "@babel/helper-split-export-declaration" "^7.14.5"
901
-    "@babel/parser" "^7.14.5"
901
+    "@babel/parser" "^7.14.7"
902 902
     "@babel/types" "^7.14.5"
903 903
     debug "^4.1.0"
904 904
     globals "^11.1.0"
@@ -1038,15 +1038,15 @@
1038 1038
     jest-util "^27.0.2"
1039 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 1045
   dependencies:
1046 1046
     "@jest/console" "^27.0.2"
1047
-    "@jest/reporters" "^27.0.4"
1047
+    "@jest/reporters" "^27.0.5"
1048 1048
     "@jest/test-result" "^27.0.2"
1049
-    "@jest/transform" "^27.0.2"
1049
+    "@jest/transform" "^27.0.5"
1050 1050
     "@jest/types" "^27.0.2"
1051 1051
     "@types/node" "*"
1052 1052
     ansi-escapes "^4.2.1"
@@ -1055,15 +1055,15 @@
1055 1055
     exit "^0.1.2"
1056 1056
     graceful-fs "^4.2.4"
1057 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 1060
     jest-message-util "^27.0.2"
1061 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 1067
     jest-util "^27.0.2"
1068 1068
     jest-validate "^27.0.2"
1069 1069
     jest-watcher "^27.0.2"
@@ -1073,20 +1073,20 @@
1073 1073
     slash "^3.0.0"
1074 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 1080
   dependencies:
1081
-    "@jest/fake-timers" "^27.0.3"
1081
+    "@jest/fake-timers" "^27.0.5"
1082 1082
     "@jest/types" "^27.0.2"
1083 1083
     "@types/node" "*"
1084 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 1090
   dependencies:
1091 1091
     "@jest/types" "^27.0.2"
1092 1092
     "@sinonjs/fake-timers" "^7.0.2"
@@ -1095,24 +1095,24 @@
1095 1095
     jest-mock "^27.0.3"
1096 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 1102
   dependencies:
1103
-    "@jest/environment" "^27.0.3"
1103
+    "@jest/environment" "^27.0.5"
1104 1104
     "@jest/types" "^27.0.2"
1105 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 1111
   dependencies:
1112 1112
     "@bcoe/v8-coverage" "^0.2.3"
1113 1113
     "@jest/console" "^27.0.2"
1114 1114
     "@jest/test-result" "^27.0.2"
1115
-    "@jest/transform" "^27.0.2"
1115
+    "@jest/transform" "^27.0.5"
1116 1116
     "@jest/types" "^27.0.2"
1117 1117
     chalk "^4.0.0"
1118 1118
     collect-v8-coverage "^1.0.0"
@@ -1124,15 +1124,15 @@
1124 1124
     istanbul-lib-report "^3.0.0"
1125 1125
     istanbul-lib-source-maps "^4.0.0"
1126 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 1129
     jest-util "^27.0.2"
1130 1130
     jest-worker "^27.0.2"
1131 1131
     slash "^3.0.0"
1132 1132
     source-map "^0.6.0"
1133 1133
     string-length "^4.0.1"
1134 1134
     terminal-link "^2.0.0"
1135
-    v8-to-istanbul "^7.0.0"
1135
+    v8-to-istanbul "^8.0.0"
1136 1136
 
1137 1137
 "@jest/source-map@^27.0.1":
1138 1138
   version "27.0.1"
@@ -1153,20 +1153,20 @@
1153 1153
     "@types/istanbul-lib-coverage" "^2.0.0"
1154 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 1160
   dependencies:
1161 1161
     "@jest/test-result" "^27.0.2"
1162 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 1170
   dependencies:
1171 1171
     "@babel/core" "^7.1.0"
1172 1172
     "@jest/types" "^27.0.2"
@@ -1175,7 +1175,7 @@
1175 1175
     convert-source-map "^1.4.0"
1176 1176
     fast-json-stable-stringify "^2.0.0"
1177 1177
     graceful-fs "^4.2.4"
1178
-    jest-haste-map "^27.0.2"
1178
+    jest-haste-map "^27.0.5"
1179 1179
     jest-regex-util "^27.0.1"
1180 1180
     jest-util "^27.0.2"
1181 1181
     micromatch "^4.0.4"
@@ -2539,21 +2539,21 @@ available-typed-arrays@^1.0.2:
2539 2539
   integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==
2540 2540
 
2541 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 2546
 axobject-query@^2.2.0:
2547 2547
   version "2.2.0"
2548 2548
   resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
2549 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 2555
   dependencies:
2556
-    "@jest/transform" "^27.0.2"
2556
+    "@jest/transform" "^27.0.5"
2557 2557
     "@jest/types" "^27.0.2"
2558 2558
     "@types/babel__core" "^7.1.14"
2559 2559
     babel-plugin-istanbul "^6.0.0"
@@ -3125,7 +3125,7 @@ cookie@^0.4.1:
3125 3125
   resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
3126 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 3129
   version "3.15.0"
3130 3130
   resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.0.tgz#e14a371123db9d1c5b41206d3f420643d238b8fa"
3131 3131
   integrity sha512-8X6lWsG+s7IfOKzV93a7fRYfWRZobOfjw5V5rrq43Vh/W+V6qYxl7Akalsvgab4PFT/4L/pjQbdBUEM36NXKrw==
@@ -3133,7 +3133,7 @@ core-js-compat@^3.14.0:
3133 3133
     browserslist "^4.16.6"
3134 3134
     semver "7.0.0"
3135 3135
 
3136
-core-js-pure@^3.14.0:
3136
+core-js-pure@^3.15.0:
3137 3137
   version "3.15.0"
3138 3138
   resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.0.tgz#c19349ae0be197b8bcf304acf4d91c5e29ae2091"
3139 3139
   integrity sha512-RO+LFAso8DB6OeBX9BAcEGvyth36QtxYon1OyVsITNVtSKr/Hos0BXZwnsOJ7o+O6KHtK+O+cJIEj9NGg6VwFA==
@@ -3450,9 +3450,9 @@ ejs@^2.6.1:
3450 3450
   integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
3451 3451
 
3452 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 3457
 elliptic@^6.5.3:
3458 3458
   version "6.5.4"
@@ -4749,12 +4749,12 @@ jest-changed-files@^27.0.2:
4749 4749
     execa "^5.0.0"
4750 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 4756
   dependencies:
4757
-    "@jest/environment" "^27.0.3"
4757
+    "@jest/environment" "^27.0.5"
4758 4758
     "@jest/test-result" "^27.0.2"
4759 4759
     "@jest/types" "^27.0.2"
4760 4760
     "@types/node" "*"
@@ -4766,54 +4766,54 @@ jest-circus@^27.0.4:
4766 4766
     jest-each "^27.0.2"
4767 4767
     jest-matcher-utils "^27.0.2"
4768 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 4771
     jest-util "^27.0.2"
4772 4772
     pretty-format "^27.0.2"
4773 4773
     slash "^3.0.0"
4774 4774
     stack-utils "^2.0.3"
4775 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 4781
   dependencies:
4782
-    "@jest/core" "^27.0.4"
4782
+    "@jest/core" "^27.0.5"
4783 4783
     "@jest/test-result" "^27.0.2"
4784 4784
     "@jest/types" "^27.0.2"
4785 4785
     chalk "^4.0.0"
4786 4786
     exit "^0.1.2"
4787 4787
     graceful-fs "^4.2.4"
4788 4788
     import-local "^3.0.2"
4789
-    jest-config "^27.0.4"
4789
+    jest-config "^27.0.5"
4790 4790
     jest-util "^27.0.2"
4791 4791
     jest-validate "^27.0.2"
4792 4792
     prompts "^2.0.1"
4793 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 4799
   dependencies:
4800 4800
     "@babel/core" "^7.1.0"
4801
-    "@jest/test-sequencer" "^27.0.4"
4801
+    "@jest/test-sequencer" "^27.0.5"
4802 4802
     "@jest/types" "^27.0.2"
4803
-    babel-jest "^27.0.2"
4803
+    babel-jest "^27.0.5"
4804 4804
     chalk "^4.0.0"
4805 4805
     deepmerge "^4.2.2"
4806 4806
     glob "^7.1.1"
4807 4807
     graceful-fs "^4.2.4"
4808 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 4812
     jest-get-type "^27.0.1"
4813
-    jest-jasmine2 "^27.0.4"
4813
+    jest-jasmine2 "^27.0.5"
4814 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 4817
     jest-util "^27.0.2"
4818 4818
     jest-validate "^27.0.2"
4819 4819
     micromatch "^4.0.4"
@@ -4857,26 +4857,26 @@ jest-each@^27.0.2:
4857 4857
     jest-util "^27.0.2"
4858 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 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 4867
     "@jest/types" "^27.0.2"
4868 4868
     "@types/node" "*"
4869 4869
     jest-mock "^27.0.3"
4870 4870
     jest-util "^27.0.2"
4871 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 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 4880
     "@jest/types" "^27.0.2"
4881 4881
     "@types/node" "*"
4882 4882
     jest-mock "^27.0.3"
@@ -4892,10 +4892,10 @@ jest-get-type@^27.0.1:
4892 4892
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.1.tgz#34951e2b08c8801eb28559d7eb732b04bbcf7815"
4893 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 4899
   dependencies:
4900 4900
     "@jest/types" "^27.0.2"
4901 4901
     "@types/graceful-fs" "^4.1.2"
@@ -4912,13 +4912,13 @@ jest-haste-map@^27.0.2:
4912 4912
   optionalDependencies:
4913 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 4919
   dependencies:
4920 4920
     "@babel/traverse" "^7.1.0"
4921
-    "@jest/environment" "^27.0.3"
4921
+    "@jest/environment" "^27.0.5"
4922 4922
     "@jest/source-map" "^27.0.1"
4923 4923
     "@jest/test-result" "^27.0.2"
4924 4924
     "@jest/types" "^27.0.2"
@@ -4930,8 +4930,8 @@ jest-jasmine2@^27.0.4:
4930 4930
     jest-each "^27.0.2"
4931 4931
     jest-matcher-utils "^27.0.2"
4932 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 4935
     jest-util "^27.0.2"
4936 4936
     pretty-format "^27.0.2"
4937 4937
     throat "^6.0.1"
@@ -4987,19 +4987,19 @@ jest-regex-util@^27.0.0, jest-regex-util@^27.0.1:
4987 4987
   resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.1.tgz#69d4b1bf5b690faa3490113c47486ed85dd45b68"
4988 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 4994
   dependencies:
4995 4995
     "@jest/types" "^27.0.2"
4996 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 5003
   dependencies:
5004 5004
     "@jest/types" "^27.0.2"
5005 5005
     chalk "^4.0.0"
@@ -5011,15 +5011,15 @@ jest-resolve@^27.0.4:
5011 5011
     resolve "^1.20.0"
5012 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 5018
   dependencies:
5019 5019
     "@jest/console" "^27.0.2"
5020
-    "@jest/environment" "^27.0.3"
5020
+    "@jest/environment" "^27.0.5"
5021 5021
     "@jest/test-result" "^27.0.2"
5022
-    "@jest/transform" "^27.0.2"
5022
+    "@jest/transform" "^27.0.5"
5023 5023
     "@jest/types" "^27.0.2"
5024 5024
     "@types/node" "*"
5025 5025
     chalk "^4.0.0"
@@ -5027,30 +5027,30 @@ jest-runner@^27.0.4:
5027 5027
     exit "^0.1.2"
5028 5028
     graceful-fs "^4.2.4"
5029 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 5033
     jest-leak-detector "^27.0.2"
5034 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 5037
     jest-util "^27.0.2"
5038 5038
     jest-worker "^27.0.2"
5039 5039
     source-map-support "^0.5.6"
5040 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 5046
   dependencies:
5047 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 5051
     "@jest/source-map" "^27.0.1"
5052 5052
     "@jest/test-result" "^27.0.2"
5053
-    "@jest/transform" "^27.0.2"
5053
+    "@jest/transform" "^27.0.5"
5054 5054
     "@jest/types" "^27.0.2"
5055 5055
     "@types/yargs" "^16.0.0"
5056 5056
     chalk "^4.0.0"
@@ -5059,12 +5059,12 @@ jest-runtime@^27.0.4:
5059 5059
     exit "^0.1.2"
5060 5060
     glob "^7.1.3"
5061 5061
     graceful-fs "^4.2.4"
5062
-    jest-haste-map "^27.0.2"
5062
+    jest-haste-map "^27.0.5"
5063 5063
     jest-message-util "^27.0.2"
5064 5064
     jest-mock "^27.0.3"
5065 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 5068
     jest-util "^27.0.2"
5069 5069
     jest-validate "^27.0.2"
5070 5070
     slash "^3.0.0"
@@ -5079,10 +5079,10 @@ jest-serializer@^27.0.1:
5079 5079
     "@types/node" "*"
5080 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 5086
   dependencies:
5087 5087
     "@babel/core" "^7.7.2"
5088 5088
     "@babel/generator" "^7.7.2"
@@ -5090,7 +5090,7 @@ jest-snapshot@^27.0.4:
5090 5090
     "@babel/plugin-syntax-typescript" "^7.7.2"
5091 5091
     "@babel/traverse" "^7.7.2"
5092 5092
     "@babel/types" "^7.0.0"
5093
-    "@jest/transform" "^27.0.2"
5093
+    "@jest/transform" "^27.0.5"
5094 5094
     "@jest/types" "^27.0.2"
5095 5095
     "@types/babel__traverse" "^7.0.4"
5096 5096
     "@types/prettier" "^2.1.5"
@@ -5100,10 +5100,10 @@ jest-snapshot@^27.0.4:
5100 5100
     graceful-fs "^4.2.4"
5101 5101
     jest-diff "^27.0.2"
5102 5102
     jest-get-type "^27.0.1"
5103
-    jest-haste-map "^27.0.2"
5103
+    jest-haste-map "^27.0.5"
5104 5104
     jest-matcher-utils "^27.0.2"
5105 5105
     jest-message-util "^27.0.2"
5106
-    jest-resolve "^27.0.4"
5106
+    jest-resolve "^27.0.5"
5107 5107
     jest-util "^27.0.2"
5108 5108
     natural-compare "^1.4.0"
5109 5109
     pretty-format "^27.0.2"
@@ -5187,13 +5187,13 @@ jest-worker@^27.0.2:
5187 5187
     supports-color "^8.0.0"
5188 5188
 
5189 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 5193
   dependencies:
5194
-    "@jest/core" "^27.0.4"
5194
+    "@jest/core" "^27.0.5"
5195 5195
     import-local "^3.0.2"
5196
-    jest-cli "^27.0.4"
5196
+    jest-cli "^27.0.5"
5197 5197
 
5198 5198
 jose@^1.27.2:
5199 5199
   version "1.28.1"
@@ -7819,10 +7819,10 @@ v8-compile-cache@^2.0.3:
7819 7819
   resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
7820 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 7826
   dependencies:
7827 7827
     "@types/istanbul-lib-coverage" "^2.0.1"
7828 7828
     convert-source-map "^1.6.0"

Načítá se…
Zrušit
Uložit