김재형

Merge branch 'feature/frontend'

Showing 48 changed files with 2375 additions and 398 deletions
1 +/env
2 +/docker
3 +/.vscode
4 +.DS_Store
5 +__pycache__
...\ No newline at end of file ...\ No newline at end of file
...@@ -22,7 +22,7 @@ from django.conf import settings ...@@ -22,7 +22,7 @@ from django.conf import settings
22 import jwt 22 import jwt
23 from django.http import HttpResponse, JsonResponse 23 from django.http import HttpResponse, JsonResponse
24 from khudrive.settings import AWS_SESSION_TOKEN, AWS_SECRET_ACCESS_KEY, AWS_ACCESS_KEY_ID, AWS_REGION, \ 24 from khudrive.settings import AWS_SESSION_TOKEN, AWS_SECRET_ACCESS_KEY, AWS_ACCESS_KEY_ID, AWS_REGION, \
25 - AWS_STORAGE_BUCKET_NAME 25 + AWS_STORAGE_BUCKET_NAME, AWS_ENDPOINT_URL
26 26
27 27
28 class UserViewSet(viewsets.ModelViewSet): 28 class UserViewSet(viewsets.ModelViewSet):
...@@ -51,6 +51,8 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -51,6 +51,8 @@ class UserViewSet(viewsets.ModelViewSet):
51 root = Item(is_folder=True, name="root", file_type="folder", path="", user_id=user.int_id, size=0, 51 root = Item(is_folder=True, name="root", file_type="folder", path="", user_id=user.int_id, size=0,
52 status=True) 52 status=True)
53 root.save() 53 root.save()
54 + user.root_folder = root.item_id
55 + user.save()
54 return Response({ 56 return Response({
55 'message': 'user created', 57 'message': 'user created',
56 'int_id': user.int_id, 58 'int_id': user.int_id,
...@@ -94,7 +96,15 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -94,7 +96,15 @@ class UserViewSet(viewsets.ModelViewSet):
94 exp = jwt.decode(access, settings.SECRET_KEY, algorithm='HS256')['exp'] 96 exp = jwt.decode(access, settings.SECRET_KEY, algorithm='HS256')['exp']
95 token = {'access': access, 97 token = {'access': access,
96 'refresh': refresh, 98 'refresh': refresh,
97 - 'exp': exp} 99 + 'exp': exp,
100 + 'user': {
101 + 'int_id': user.int_id,
102 + 'user_id': user.user_id,
103 + 'name': user.name,
104 + 'total_size': user.total_size,
105 + 'current_size': user.current_size,
106 + 'root_folder': user.root_folder
107 + }}
98 return JsonResponse( 108 return JsonResponse(
99 token, 109 token,
100 status=status.HTTP_200_OK, 110 status=status.HTTP_200_OK,
...@@ -173,11 +183,15 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -173,11 +183,15 @@ class ItemViewSet(viewsets.ViewSet):
173 # url: items/11/ 183 # url: items/11/
174 # 마지막 slash도 써주어야함 184 # 마지막 slash도 써주어야함
175 def get(self, request, pk): 185 def get(self, request, pk):
176 - s3 = boto3.client('s3', 186 + s3 = boto3.client(
177 - aws_access_key_id=AWS_ACCESS_KEY_ID, 187 + 's3',
178 - aws_secret_access_key=AWS_SECRET_ACCESS_KEY, 188 + region_name=AWS_REGION,
179 - aws_session_token=AWS_SESSION_TOKEN, 189 + aws_access_key_id=AWS_ACCESS_KEY_ID,
180 - config=Config(signature_version='s3v4')) 190 + aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
191 + aws_session_token=AWS_SESSION_TOKEN,
192 + endpoint_url=AWS_ENDPOINT_URL or None,
193 + config=Config(s3={'addressing_style': 'path'})
194 + )
181 s3_bucket = AWS_STORAGE_BUCKET_NAME 195 s3_bucket = AWS_STORAGE_BUCKET_NAME
182 196
183 item = Item.objects.filter(item_id=pk) 197 item = Item.objects.filter(item_id=pk)
...@@ -239,29 +253,40 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -239,29 +253,40 @@ class ItemViewSet(viewsets.ViewSet):
239 def move(self, request, pk): 253 def move(self, request, pk):
240 if request.method == 'POST': 254 if request.method == 'POST':
241 parent_id = request.POST.get('parent', '') 255 parent_id = request.POST.get('parent', '')
242 - name = request.POST.get('name', '') 256 + name = request.POST.get('name','')
243 - parent = get_object_or_None(Item, item_id=parent_id) 257 + child = get_object_or_None(Item, item_id=pk)
244 - if parent != None and parent.is_folder == True: 258 +
245 - child = get_object_or_None(Item, item_id=pk) 259 + if child == None:
246 - if child == None: 260 + return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT)
247 - return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT) 261 +
248 - child.parent = parent_id 262 + if parent_id != '':
249 - child.save() 263 + parent = get_object_or_None(Item, item_id=parent_id)
250 - child = Item.objects.filter(item_id=pk) 264 +
251 - child_data = serializers.serialize("json", child) 265 + if parent == None:
252 - json_child = json.loads(child_data) 266 + return Response({'message': 'parent is not existed.'}, status=status.HTTP_200_OK)
253 - res = json_child[0]['fields'] 267 + if parent.is_folder == False:
254 - res['id'] = pk 268 + return Response({'message': 'parent is not folder.'}, status=status.HTTP_200_OK)
255 - parent = Item.objects.filter(item_id=parent_id) 269 +
256 - parent_data = serializers.serialize("json", parent) 270 + if parent != None and parent.is_folder == True:
257 - json_parent = json.loads(parent_data)[0]['fields'] 271 + child.parent = parent_id
258 - res['parentInfo'] = json_parent 272 + else:
259 - return Response({'data': res}, status=status.HTTP_200_OK) 273 + parent_id = child.parent
260 - if parent == None: 274 +
261 - return Response({'message': 'parent is not existed.'}, status=status.HTTP_200_OK) 275 + if name != '':
262 - if parent.is_folder == False: 276 + child.name = name;
263 - return Response({'message': 'parent is not folder.'}, status=status.HTTP_200_OK) 277 +
264 - return Response({'message': 'item is not existed.'}, status=status.HTTP_204_NO_CONTENT) 278 + child.save()
279 + child = Item.objects.filter(item_id = pk)
280 + child_data = serializers.serialize("json", child)
281 + json_child = json.loads(child_data)
282 + res = json_child[0]['fields']
283 + res['id'] = pk
284 + parent = Item.objects.filter(item_id = parent_id)
285 + parent_data = serializers.serialize("json", parent)
286 + json_parent = json.loads(parent_data)[0]['fields']
287 + res['parentInfo'] = json_parent
288 +
289 + return Response({'data': res}, status=status.HTTP_200_OK)
265 290
266 @action(methods=['POST'], detail=True, permission_classes=[AllowAny], url_path='copy', url_name='copy') 291 @action(methods=['POST'], detail=True, permission_classes=[AllowAny], url_path='copy', url_name='copy')
267 def copy(self, request, pk): 292 def copy(self, request, pk):
...@@ -308,7 +333,7 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -308,7 +333,7 @@ class ItemViewSet(viewsets.ViewSet):
308 url_path='children', url_name='children') 333 url_path='children', url_name='children')
309 def children(self, request, pk): 334 def children(self, request, pk):
310 if request.method == 'GET': 335 if request.method == 'GET':
311 - children = Item.objects.filter(parent=pk, is_deleted=False) 336 + children = Item.objects.filter(parent=pk, is_deleted=False, status=True)
312 children_data = serializers.serialize("json", children) 337 children_data = serializers.serialize("json", children)
313 json_children = json.loads(children_data) 338 json_children = json.loads(children_data)
314 parent = Item.objects.filter(item_id=pk) # item 339 parent = Item.objects.filter(item_id=pk) # item
...@@ -359,7 +384,15 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -359,7 +384,15 @@ class ItemViewSet(viewsets.ViewSet):
359 url_path='upload', url_name='upload') 384 url_path='upload', url_name='upload')
360 def upload(self, request, pk): 385 def upload(self, request, pk):
361 if request.method == 'POST': 386 if request.method == 'POST':
362 - s3 = boto3.client('s3') 387 + s3 = boto3.client(
388 + 's3',
389 + region_name=AWS_REGION,
390 + aws_access_key_id=AWS_ACCESS_KEY_ID,
391 + aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
392 + aws_session_token=AWS_SESSION_TOKEN,
393 + endpoint_url=AWS_ENDPOINT_URL or None,
394 + config=Config(s3={'addressing_style': 'path'})
395 + )
363 s3_bucket = AWS_STORAGE_BUCKET_NAME 396 s3_bucket = AWS_STORAGE_BUCKET_NAME
364 397
365 # 파일 객체 생성 398 # 파일 객체 생성
...@@ -378,6 +411,7 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -378,6 +411,7 @@ class ItemViewSet(viewsets.ViewSet):
378 { 411 {
379 "acl": "private", 412 "acl": "private",
380 "Content-Type": file_type, 413 "Content-Type": file_type,
414 + "Content-Disposition": "attachment",
381 'region': AWS_REGION, 415 'region': AWS_REGION,
382 'x-amz-algorithm': 'AWS4-HMAC-SHA256', 416 'x-amz-algorithm': 'AWS4-HMAC-SHA256',
383 'x-amz-date': date_long 417 'x-amz-date': date_long
...@@ -385,18 +419,26 @@ class ItemViewSet(viewsets.ViewSet): ...@@ -385,18 +419,26 @@ class ItemViewSet(viewsets.ViewSet):
385 [ 419 [
386 {"acl": "private"}, 420 {"acl": "private"},
387 {"Content-Type": file_type}, 421 {"Content-Type": file_type},
422 + {"Content-Disposition": "attachment"},
388 {'x-amz-algorithm': 'AWS4-HMAC-SHA256'}, 423 {'x-amz-algorithm': 'AWS4-HMAC-SHA256'},
389 {'x-amz-date': date_long} 424 {'x-amz-date': date_long}
390 ], 425 ],
391 3600 426 3600
392 ) 427 )
393 428
429 + item = Item.objects.filter(item_id=upload_item.item_id)
430 + item_data = serializers.serialize("json", item)
431 + json_item = json.loads(item_data)
432 + res = json_item[0]['fields']
433 + res['id'] = json_item[0]['pk']
434 +
394 data = { 435 data = {
395 "signed_url": presigned_post, 436 "signed_url": presigned_post,
396 - 'url': 'https://%s.s3.amazonaws.com/%s' % (s3_bucket, file_name) 437 + 'url': '%s/%s' % (presigned_post["url"], file_name),
438 + 'item': res
397 } 439 }
398 440
399 - return Response({'presigned_post': presigned_post, 'proc_data': data}, status=status.HTTP_200_OK) 441 + return Response(data, status=status.HTTP_200_OK)
400 442
401 # url: /status/ 443 # url: /status/
402 @action(methods=['POST'], detail=True, permission_classes=[AllowAny], 444 @action(methods=['POST'], detail=True, permission_classes=[AllowAny],
......
1 +version: "3"
2 +services:
3 + postgres:
4 + image: "postgres:alpine"
5 + environment:
6 + - POSTGRES_USER=khudrive
7 + - POSTGRES_PASSWORD=4REPwb7y4CLtQaTv4PNeWRJeGLbHXn
8 + - POSTGRES_DB=khudrive
9 + ports:
10 + - "35432:5432"
11 + volumes:
12 + - ./docker/postgres:/var/lib/postgresql/data/
13 + minio:
14 + image: "minio/minio"
15 + entrypoint: sh
16 + command: -c "mkdir -p /data/bucket && /usr/bin/minio server /data"
17 + environment:
18 + - MINIO_ACCESS_KEY=access_key
19 + - MINIO_SECRET_KEY=secret_key
20 + ports:
21 + - "39000:9000"
22 + volumes:
23 + - ./docker/minio:/data
...\ No newline at end of file ...\ No newline at end of file
...@@ -88,11 +88,11 @@ DATABASES = { ...@@ -88,11 +88,11 @@ DATABASES = {
88 # } 88 # }
89 'default': { 89 'default': {
90 'ENGINE': 'django.db.backends.postgresql', 90 'ENGINE': 'django.db.backends.postgresql',
91 - 'NAME': 'drive', 91 + 'NAME': 'khudrive',
92 - 'USER': 'jooheekwon', 92 + 'USER': 'khudrive',
93 - 'PASSWORD': 'victoriawngml77', 93 + 'PASSWORD': '4REPwb7y4CLtQaTv4PNeWRJeGLbHXn',
94 'HOST': 'localhost', 94 'HOST': 'localhost',
95 - 'PORT': '', 95 + 'PORT': '35432',
96 } 96 }
97 } 97 }
98 98
......
1 asgiref==3.2.7 1 asgiref==3.2.7
2 +boto3==1.14.2
3 +botocore==1.17.2
4 +cffi==1.14.0
5 +cryptography==2.9.2
2 Django==3.0.6 6 Django==3.0.6
7 +django-annoying==0.10.6
3 djangorestframework==3.11.0 8 djangorestframework==3.11.0
9 +docutils==0.15.2
10 +jmespath==0.10.0
11 +psycopg2==2.8.5
12 +pycparser==2.20
13 +PyJWT==1.7.1
14 +python-dateutil==2.8.1
4 pytz==2020.1 15 pytz==2020.1
16 +s3transfer==0.3.3
17 +six==1.15.0
5 sqlparse==0.3.1 18 sqlparse==0.3.1
19 +urllib3==1.25.9
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
21 "react/display-name": "off", 21 "react/display-name": "off",
22 "react/prop-types": "off", 22 "react/prop-types": "off",
23 "no-empty": ["warn", { "allowEmptyCatch": true }], 23 "no-empty": ["warn", { "allowEmptyCatch": true }],
24 + "@typescript-eslint/camelcase": "off",
24 "@typescript-eslint/explicit-function-return-type": "off", 25 "@typescript-eslint/explicit-function-return-type": "off",
25 "@typescript-eslint/explicit-member-accessibility": "off", 26 "@typescript-eslint/explicit-member-accessibility": "off",
26 "@typescript-eslint/interface-name-prefix": "off", 27 "@typescript-eslint/interface-name-prefix": "off",
......
1 # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 1 # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 2
3 # dependencies 3 # dependencies
4 -/backend/env 4 +/node_modules
5 -/frontend/node_modules 5 +/.pnp
6 -/frontend/.pnp
7 .pnp.js 6 .pnp.js
8 7
9 # testing 8 # testing
10 -/frontend/coverage 9 +/coverage
11 10
12 # production 11 # production
13 -/frontend/build 12 +/build
14 -
15 -# database
16 -/backend/db.sqlite3
17 13
18 # misc 14 # misc
19 .DS_Store 15 .DS_Store
...@@ -21,7 +17,6 @@ ...@@ -21,7 +17,6 @@
21 .env.development.local 17 .env.development.local
22 .env.test.local 18 .env.test.local
23 .env.production.local 19 .env.production.local
24 -__pycache__
25 20
26 npm-debug.log* 21 npm-debug.log*
27 yarn-debug.log* 22 yarn-debug.log*
......
...@@ -4,6 +4,58 @@ ...@@ -4,6 +4,58 @@
4 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
6 "dependencies": { 6 "dependencies": {
7 + "@ant-design/colors": {
8 + "version": "3.2.2",
9 + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-3.2.2.tgz",
10 + "integrity": "sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==",
11 + "requires": {
12 + "tinycolor2": "^1.4.1"
13 + }
14 + },
15 + "@ant-design/css-animation": {
16 + "version": "1.7.2",
17 + "resolved": "https://registry.npmjs.org/@ant-design/css-animation/-/css-animation-1.7.2.tgz",
18 + "integrity": "sha512-bvVOe7A+r7lws58B7r+fgnQDK90cV45AXuvGx6i5CCSX1W/M3AJnHsNggDANBxEtWdNdFWcDd5LorB+RdSIlBw=="
19 + },
20 + "@ant-design/icons": {
21 + "version": "4.2.1",
22 + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.2.1.tgz",
23 + "integrity": "sha512-245ZI40MOr5GGws+sNSiJIRRoEf/J2xvPSMgwRYf3bv8mVGQZ6XTQI/OMeV16KtiSZ3D+mBKXVYSBz2fhigOXQ==",
24 + "requires": {
25 + "@ant-design/colors": "^3.1.0",
26 + "@ant-design/icons-svg": "^4.0.0",
27 + "@babel/runtime": "^7.10.1",
28 + "classnames": "^2.2.6",
29 + "insert-css": "^2.0.0",
30 + "rc-util": "^5.0.1"
31 + },
32 + "dependencies": {
33 + "@babel/runtime": {
34 + "version": "7.10.2",
35 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
36 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
37 + "requires": {
38 + "regenerator-runtime": "^0.13.4"
39 + }
40 + }
41 + }
42 + },
43 + "@ant-design/icons-svg": {
44 + "version": "4.1.0",
45 + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz",
46 + "integrity": "sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ=="
47 + },
48 + "@ant-design/react-slick": {
49 + "version": "0.26.1",
50 + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.26.1.tgz",
51 + "integrity": "sha512-1CR3vNFxAMmMb9btF6w9yT1xlrhZr6f/K+OkqoCLfWxN7h7jC16UCr1RsGBoFUdSq8bYfTr3pe6AiiCEDsALvA==",
52 + "requires": {
53 + "classnames": "^2.2.5",
54 + "json2mq": "^0.2.0",
55 + "lodash": "^4.17.15",
56 + "resize-observer-polyfill": "^1.5.0"
57 + }
58 + },
7 "@babel/code-frame": { 59 "@babel/code-frame": {
8 "version": "7.8.3", 60 "version": "7.8.3",
9 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 61 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
...@@ -2072,6 +2124,11 @@ ...@@ -2072,6 +2124,11 @@
2072 "chalk": "^3.0.0" 2124 "chalk": "^3.0.0"
2073 } 2125 }
2074 }, 2126 },
2127 + "@miragejs/pretender-node-polyfill": {
2128 + "version": "0.1.2",
2129 + "resolved": "https://registry.npmjs.org/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz",
2130 + "integrity": "sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g=="
2131 + },
2075 "@mrmlnc/readdir-enhanced": { 2132 "@mrmlnc/readdir-enhanced": {
2076 "version": "2.2.1", 2133 "version": "2.2.1",
2077 "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", 2134 "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
...@@ -2088,15 +2145,6 @@ ...@@ -2088,15 +2145,6 @@
2088 "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", 2145 "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
2089 "dev": true 2146 "dev": true
2090 }, 2147 },
2091 - "@samverschueren/stream-to-observable": {
2092 - "version": "0.3.0",
2093 - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz",
2094 - "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==",
2095 - "dev": true,
2096 - "requires": {
2097 - "any-observable": "^0.3.0"
2098 - }
2099 - },
2100 "@svgr/babel-plugin-add-jsx-attribute": { 2148 "@svgr/babel-plugin-add-jsx-attribute": {
2101 "version": "4.2.0", 2149 "version": "4.2.0",
2102 "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", 2150 "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz",
...@@ -2301,57 +2349,32 @@ ...@@ -2301,57 +2349,32 @@
2301 } 2349 }
2302 }, 2350 },
2303 "@testing-library/dom": { 2351 "@testing-library/dom": {
2304 - "version": "7.5.1", 2352 + "version": "7.10.0",
2305 - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.5.1.tgz", 2353 + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.10.0.tgz",
2306 - "integrity": "sha512-c9iQWyFtdsqaVScIlOdgdG3HXWkYvGzin02nJ4LUnzNXKyxqeqq9KPIAAjnmfrSApbRc8mK1l6esiCeEredfRw==", 2354 + "integrity": "sha512-nCCutwtbChYPnWFvmxCIRINeA0mlT0B3dAeCb2RxX65nZZVbf3jHfd6+v//TYnWo5O6nL5j6x6mJE5JUU3zNSw==",
2307 "dev": true, 2355 "dev": true,
2308 "requires": { 2356 "requires": {
2309 - "@babel/runtime": "^7.9.6", 2357 + "@babel/runtime": "^7.10.2",
2310 "aria-query": "^4.0.2", 2358 "aria-query": "^4.0.2",
2311 - "dom-accessibility-api": "^0.4.3", 2359 + "dom-accessibility-api": "^0.4.4",
2312 - "pretty-format": "^26.0.1" 2360 + "pretty-format": "^25.5.0"
2313 }, 2361 },
2314 "dependencies": { 2362 "dependencies": {
2315 - "@jest/types": { 2363 + "@babel/runtime": {
2316 - "version": "26.0.1", 2364 + "version": "7.10.2",
2317 - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.0.1.tgz", 2365 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
2318 - "integrity": "sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA==", 2366 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
2319 - "dev": true,
2320 - "requires": {
2321 - "@types/istanbul-lib-coverage": "^2.0.0",
2322 - "@types/istanbul-reports": "^1.1.1",
2323 - "@types/yargs": "^15.0.0",
2324 - "chalk": "^4.0.0"
2325 - }
2326 - },
2327 - "chalk": {
2328 - "version": "4.0.0",
2329 - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
2330 - "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
2331 - "dev": true,
2332 - "requires": {
2333 - "ansi-styles": "^4.1.0",
2334 - "supports-color": "^7.1.0"
2335 - }
2336 - },
2337 - "pretty-format": {
2338 - "version": "26.0.1",
2339 - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.0.1.tgz",
2340 - "integrity": "sha512-SWxz6MbupT3ZSlL0Po4WF/KujhQaVehijR2blyRDCzk9e45EaYMVhMBn49fnRuHxtkSpXTes1GxNpVmH86Bxfw==",
2341 "dev": true, 2367 "dev": true,
2342 "requires": { 2368 "requires": {
2343 - "@jest/types": "^26.0.1", 2369 + "regenerator-runtime": "^0.13.4"
2344 - "ansi-regex": "^5.0.0",
2345 - "ansi-styles": "^4.0.0",
2346 - "react-is": "^16.12.0"
2347 } 2370 }
2348 } 2371 }
2349 } 2372 }
2350 }, 2373 },
2351 "@testing-library/jest-dom": { 2374 "@testing-library/jest-dom": {
2352 - "version": "5.7.0", 2375 + "version": "5.9.0",
2353 - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.7.0.tgz", 2376 + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.9.0.tgz",
2354 - "integrity": "sha512-ZV0OtBXmTDEDxrIbqJXiOcXCZ6aIMpmDlmfHj0hGNsSuQ/nX0qPAs9HWmCzXvPfTrhufTiH2nJLvDJu/LgHzwQ==", 2377 + "integrity": "sha512-uZ68dyILuM2VL13lGz4ehFEAgxzvLKRu8wQxyAZfejWnyMhmipJ60w4eG81NQikJHBfaYXx+Or8EaPQTDwGfPA==",
2355 "dev": true, 2378 "dev": true,
2356 "requires": { 2379 "requires": {
2357 "@babel/runtime": "^7.9.2", 2380 "@babel/runtime": "^7.9.2",
...@@ -2366,21 +2389,45 @@ ...@@ -2366,21 +2389,45 @@
2366 } 2389 }
2367 }, 2390 },
2368 "@testing-library/react": { 2391 "@testing-library/react": {
2369 - "version": "10.0.4", 2392 + "version": "10.2.0",
2370 - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-10.0.4.tgz", 2393 + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-10.2.0.tgz",
2371 - "integrity": "sha512-2e1B5debfuiIGbvUuiSXybskuh7ZTVJDDvG/IxlzLOY9Co/mKFj9hIklAe2nGZYcOUxFaiqWrRZ9vCVGzJfRlQ==", 2394 + "integrity": "sha512-TYQZ4vz0lGCGRgFqQivrtUGQhAlRSxHlYB0sDFJ6h2BZ0IrgRMF3EDQixn5UJk8oMsZJuE1HNnOA0yP4Ci2kyA==",
2372 "dev": true, 2395 "dev": true,
2373 "requires": { 2396 "requires": {
2374 - "@babel/runtime": "^7.9.6", 2397 + "@babel/runtime": "^7.10.2",
2375 - "@testing-library/dom": "^7.2.2", 2398 + "@testing-library/dom": "^7.9.0"
2376 - "@types/testing-library__react": "^10.0.1" 2399 + },
2400 + "dependencies": {
2401 + "@babel/runtime": {
2402 + "version": "7.10.2",
2403 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
2404 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
2405 + "dev": true,
2406 + "requires": {
2407 + "regenerator-runtime": "^0.13.4"
2408 + }
2409 + }
2377 } 2410 }
2378 }, 2411 },
2379 "@testing-library/user-event": { 2412 "@testing-library/user-event": {
2380 - "version": "10.1.2", 2413 + "version": "11.2.0",
2381 - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-10.1.2.tgz", 2414 + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-11.2.0.tgz",
2382 - "integrity": "sha512-77pydoNNMfcCgE6RasuYB+Dm61mWtzO1l4JBWHbFyUXXf9FA+9XrpLWWB/vA/FfTsjj4vrV7kHNorj3UKLtcig==", 2415 + "integrity": "sha512-kFaPsjQRte/t6rIYJPRyuzg8nraE1JVnjQOtEjSIfxU5dIc+lSH9sJmCTUNF87IpLHlYzHlWL70EjuhIwGbXjg==",
2383 - "dev": true 2416 + "dev": true,
2417 + "requires": {
2418 + "@babel/runtime": "^7.10.2"
2419 + },
2420 + "dependencies": {
2421 + "@babel/runtime": {
2422 + "version": "7.10.2",
2423 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
2424 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
2425 + "dev": true,
2426 + "requires": {
2427 + "regenerator-runtime": "^0.13.4"
2428 + }
2429 + }
2430 + }
2384 }, 2431 },
2385 "@types/babel__core": { 2432 "@types/babel__core": {
2386 "version": "7.1.7", 2433 "version": "7.1.7",
...@@ -2490,9 +2537,9 @@ ...@@ -2490,9 +2537,9 @@
2490 } 2537 }
2491 }, 2538 },
2492 "@types/jest": { 2539 "@types/jest": {
2493 - "version": "25.2.1", 2540 + "version": "25.2.3",
2494 - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.2.1.tgz", 2541 + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.2.3.tgz",
2495 - "integrity": "sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA==", 2542 + "integrity": "sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw==",
2496 "dev": true, 2543 "dev": true,
2497 "requires": { 2544 "requires": {
2498 "jest-diff": "^25.2.1", 2545 "jest-diff": "^25.2.1",
...@@ -2581,39 +2628,19 @@ ...@@ -2581,39 +2628,19 @@
2581 "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", 2628 "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==",
2582 "dev": true 2629 "dev": true
2583 }, 2630 },
2584 - "@types/testing-library__dom": {
2585 - "version": "7.0.2",
2586 - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-7.0.2.tgz",
2587 - "integrity": "sha512-8yu1gSwUEAwzg2OlPNbGq+ixhmSviGurBu1+ivxRKq1eRcwdjkmlwtPvr9VhuxTq2fNHBWN2po6Iem3Xt5A6rg==",
2588 - "dev": true,
2589 - "requires": {
2590 - "pretty-format": "^25.1.0"
2591 - }
2592 - },
2593 "@types/testing-library__jest-dom": { 2631 "@types/testing-library__jest-dom": {
2594 - "version": "5.0.4", 2632 + "version": "5.9.1",
2595 - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.4.tgz", 2633 + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.9.1.tgz",
2596 - "integrity": "sha512-Ns69aaNvlxvXkPxIwsqeaWH5vJpwa/pdBIlf8LGkRnbV3tiqUgifs13moLXg1NQ2AM23qRR5CtHarNshvRyEdA==", 2634 + "integrity": "sha512-yYn5EKHO3MPEMSOrcAb1dLWY+68CG29LiXKsWmmpVHqoP5+ZRiAVLyUHvPNrO2dABDdUGZvavMsaGpWNjM6N2g==",
2597 "dev": true, 2635 "dev": true,
2598 "requires": { 2636 "requires": {
2599 "@types/jest": "*" 2637 "@types/jest": "*"
2600 } 2638 }
2601 }, 2639 },
2602 - "@types/testing-library__react": {
2603 - "version": "10.0.1",
2604 - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-10.0.1.tgz",
2605 - "integrity": "sha512-RbDwmActAckbujLZeVO/daSfdL1pnjVqas25UueOkAY5r7vriavWf0Zqg7ghXMHa8ycD/kLkv8QOj31LmSYwww==",
2606 - "dev": true,
2607 - "requires": {
2608 - "@types/react-dom": "*",
2609 - "@types/testing-library__dom": "*",
2610 - "pretty-format": "^25.1.0"
2611 - }
2612 - },
2613 "@types/yargs": { 2640 "@types/yargs": {
2614 - "version": "15.0.4", 2641 + "version": "15.0.5",
2615 - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", 2642 + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz",
2616 - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", 2643 + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==",
2617 "dev": true, 2644 "dev": true,
2618 "requires": { 2645 "requires": {
2619 "@types/yargs-parser": "*" 2646 "@types/yargs-parser": "*"
...@@ -2626,45 +2653,45 @@ ...@@ -2626,45 +2653,45 @@
2626 "dev": true 2653 "dev": true
2627 }, 2654 },
2628 "@typescript-eslint/eslint-plugin": { 2655 "@typescript-eslint/eslint-plugin": {
2629 - "version": "2.31.0", 2656 + "version": "2.34.0",
2630 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.31.0.tgz", 2657 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz",
2631 - "integrity": "sha512-iIC0Pb8qDaoit+m80Ln/aaeu9zKQdOLF4SHcGLarSeY1gurW6aU4JsOPMjKQwXlw70MvWKZQc6S2NamA8SJ/gg==", 2658 + "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==",
2632 "dev": true, 2659 "dev": true,
2633 "requires": { 2660 "requires": {
2634 - "@typescript-eslint/experimental-utils": "2.31.0", 2661 + "@typescript-eslint/experimental-utils": "2.34.0",
2635 "functional-red-black-tree": "^1.0.1", 2662 "functional-red-black-tree": "^1.0.1",
2636 "regexpp": "^3.0.0", 2663 "regexpp": "^3.0.0",
2637 "tsutils": "^3.17.1" 2664 "tsutils": "^3.17.1"
2638 } 2665 }
2639 }, 2666 },
2640 "@typescript-eslint/experimental-utils": { 2667 "@typescript-eslint/experimental-utils": {
2641 - "version": "2.31.0", 2668 + "version": "2.34.0",
2642 - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.31.0.tgz", 2669 + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz",
2643 - "integrity": "sha512-MI6IWkutLYQYTQgZ48IVnRXmLR/0Q6oAyJgiOror74arUMh7EWjJkADfirZhRsUMHeLJ85U2iySDwHTSnNi9vA==", 2670 + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==",
2644 "dev": true, 2671 "dev": true,
2645 "requires": { 2672 "requires": {
2646 "@types/json-schema": "^7.0.3", 2673 "@types/json-schema": "^7.0.3",
2647 - "@typescript-eslint/typescript-estree": "2.31.0", 2674 + "@typescript-eslint/typescript-estree": "2.34.0",
2648 "eslint-scope": "^5.0.0", 2675 "eslint-scope": "^5.0.0",
2649 "eslint-utils": "^2.0.0" 2676 "eslint-utils": "^2.0.0"
2650 } 2677 }
2651 }, 2678 },
2652 "@typescript-eslint/parser": { 2679 "@typescript-eslint/parser": {
2653 - "version": "2.31.0", 2680 + "version": "2.34.0",
2654 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.31.0.tgz", 2681 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz",
2655 - "integrity": "sha512-uph+w6xUOlyV2DLSC6o+fBDzZ5i7+3/TxAsH4h3eC64tlga57oMb96vVlXoMwjR/nN+xyWlsnxtbDkB46M2EPQ==", 2682 + "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==",
2656 "dev": true, 2683 "dev": true,
2657 "requires": { 2684 "requires": {
2658 "@types/eslint-visitor-keys": "^1.0.0", 2685 "@types/eslint-visitor-keys": "^1.0.0",
2659 - "@typescript-eslint/experimental-utils": "2.31.0", 2686 + "@typescript-eslint/experimental-utils": "2.34.0",
2660 - "@typescript-eslint/typescript-estree": "2.31.0", 2687 + "@typescript-eslint/typescript-estree": "2.34.0",
2661 "eslint-visitor-keys": "^1.1.0" 2688 "eslint-visitor-keys": "^1.1.0"
2662 } 2689 }
2663 }, 2690 },
2664 "@typescript-eslint/typescript-estree": { 2691 "@typescript-eslint/typescript-estree": {
2665 - "version": "2.31.0", 2692 + "version": "2.34.0",
2666 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.31.0.tgz", 2693 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz",
2667 - "integrity": "sha512-vxW149bXFXXuBrAak0eKHOzbcu9cvi6iNcJDzEtOkRwGHxJG15chiAQAwhLOsk+86p9GTr/TziYvw+H9kMaIgA==", 2694 + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==",
2668 "dev": true, 2695 "dev": true,
2669 "requires": { 2696 "requires": {
2670 "debug": "^4.1.1", 2697 "debug": "^4.1.1",
...@@ -2672,8 +2699,16 @@ ...@@ -2672,8 +2699,16 @@
2672 "glob": "^7.1.6", 2699 "glob": "^7.1.6",
2673 "is-glob": "^4.0.1", 2700 "is-glob": "^4.0.1",
2674 "lodash": "^4.17.15", 2701 "lodash": "^4.17.15",
2675 - "semver": "^6.3.0", 2702 + "semver": "^7.3.2",
2676 "tsutils": "^3.17.1" 2703 "tsutils": "^3.17.1"
2704 + },
2705 + "dependencies": {
2706 + "semver": {
2707 + "version": "7.3.2",
2708 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
2709 + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
2710 + "dev": true
2711 + }
2677 } 2712 }
2678 }, 2713 },
2679 "@webassemblyjs/ast": { 2714 "@webassemblyjs/ast": {
...@@ -3058,11 +3093,53 @@ ...@@ -3058,11 +3093,53 @@
3058 "color-convert": "^2.0.1" 3093 "color-convert": "^2.0.1"
3059 } 3094 }
3060 }, 3095 },
3061 - "any-observable": { 3096 + "antd": {
3062 - "version": "0.3.0", 3097 + "version": "4.3.3",
3063 - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", 3098 + "resolved": "https://registry.npmjs.org/antd/-/antd-4.3.3.tgz",
3064 - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", 3099 + "integrity": "sha512-psDb3krf0nK0gkZSfxOGfJdqKbi0hzQJif7R2Cg3T6OV1nrNfc6waL4Th8mV72qq/+Ushuk0afRDaARkx9EzEg==",
3065 - "dev": true 3100 + "requires": {
3101 + "@ant-design/css-animation": "^1.7.2",
3102 + "@ant-design/icons": "^4.2.1",
3103 + "@ant-design/react-slick": "~0.26.1",
3104 + "array-tree-filter": "^2.1.0",
3105 + "classnames": "^2.2.6",
3106 + "copy-to-clipboard": "^3.2.0",
3107 + "lodash": "^4.17.13",
3108 + "moment": "^2.25.3",
3109 + "omit.js": "^1.0.2",
3110 + "raf": "^3.4.1",
3111 + "rc-animate": "~3.1.0",
3112 + "rc-cascader": "~1.2.0",
3113 + "rc-checkbox": "~2.2.0",
3114 + "rc-collapse": "~2.0.0",
3115 + "rc-dialog": "~8.0.0",
3116 + "rc-drawer": "~4.0.0",
3117 + "rc-dropdown": "~3.1.2",
3118 + "rc-field-form": "~1.4.1",
3119 + "rc-input-number": "~5.0.0",
3120 + "rc-mentions": "~1.2.0",
3121 + "rc-menu": "~8.3.0",
3122 + "rc-notification": "~4.4.0",
3123 + "rc-pagination": "~2.2.5",
3124 + "rc-picker": "~1.6.1",
3125 + "rc-progress": "~3.0.0",
3126 + "rc-rate": "~2.7.0",
3127 + "rc-resize-observer": "^0.2.3",
3128 + "rc-select": "~11.0.0",
3129 + "rc-slider": "~9.3.0",
3130 + "rc-steps": "~4.0.0",
3131 + "rc-switch": "~3.2.0",
3132 + "rc-table": "~7.7.2",
3133 + "rc-tabs": "~11.3.1",
3134 + "rc-tooltip": "~4.2.0",
3135 + "rc-tree": "~3.3.0",
3136 + "rc-tree-select": "~4.0.0",
3137 + "rc-trigger": "~4.3.0",
3138 + "rc-upload": "~3.1.0",
3139 + "rc-util": "^5.0.1",
3140 + "scroll-into-view-if-needed": "^2.2.25",
3141 + "warning": "^4.0.3"
3142 + }
3066 }, 3143 },
3067 "anymatch": { 3144 "anymatch": {
3068 "version": "2.0.0", 3145 "version": "2.0.0",
...@@ -3308,6 +3385,11 @@ ...@@ -3308,6 +3385,11 @@
3308 "is-string": "^1.0.5" 3385 "is-string": "^1.0.5"
3309 } 3386 }
3310 }, 3387 },
3388 + "array-tree-filter": {
3389 + "version": "2.1.0",
3390 + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz",
3391 + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw=="
3392 + },
3311 "array-union": { 3393 "array-union": {
3312 "version": "1.0.2", 3394 "version": "1.0.2",
3313 "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 3395 "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
...@@ -3439,6 +3521,11 @@ ...@@ -3439,6 +3521,11 @@
3439 "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", 3521 "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
3440 "dev": true 3522 "dev": true
3441 }, 3523 },
3524 + "async-validator": {
3525 + "version": "3.3.0",
3526 + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.3.0.tgz",
3527 + "integrity": "sha512-cAHGD9EL8aCqWXjnb44q94MWiDFzUo1tMhvLb2WzcpWqGiKugsjWG9cvl+jPgkPca7asNbsBU3fa0cwkI/P+Xg=="
3528 + },
3442 "asynckit": { 3529 "asynckit": {
3443 "version": "0.4.0", 3530 "version": "0.4.0",
3444 "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 3531 "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
...@@ -3973,7 +4060,6 @@ ...@@ -3973,7 +4060,6 @@
3973 "version": "6.26.0", 4060 "version": "6.26.0",
3974 "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 4061 "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
3975 "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 4062 "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
3976 - "dev": true,
3977 "requires": { 4063 "requires": {
3978 "core-js": "^2.4.0", 4064 "core-js": "^2.4.0",
3979 "regenerator-runtime": "^0.11.0" 4065 "regenerator-runtime": "^0.11.0"
...@@ -3982,14 +4068,12 @@ ...@@ -3982,14 +4068,12 @@
3982 "core-js": { 4068 "core-js": {
3983 "version": "2.6.11", 4069 "version": "2.6.11",
3984 "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", 4070 "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
3985 - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", 4071 + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
3986 - "dev": true
3987 }, 4072 },
3988 "regenerator-runtime": { 4073 "regenerator-runtime": {
3989 "version": "0.11.1", 4074 "version": "0.11.1",
3990 "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 4075 "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
3991 - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", 4076 + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
3992 - "dev": true
3993 } 4077 }
3994 } 4078 }
3995 }, 4079 },
...@@ -4808,12 +4892,6 @@ ...@@ -4808,12 +4892,6 @@
4808 } 4892 }
4809 } 4893 }
4810 }, 4894 },
4811 - "clone": {
4812 - "version": "1.0.4",
4813 - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
4814 - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
4815 - "dev": true
4816 - },
4817 "clone-deep": { 4895 "clone-deep": {
4818 "version": "0.2.4", 4896 "version": "0.2.4",
4819 "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", 4897 "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
...@@ -5053,6 +5131,11 @@ ...@@ -5053,6 +5131,11 @@
5053 } 5131 }
5054 } 5132 }
5055 }, 5133 },
5134 + "compute-scroll-into-view": {
5135 + "version": "1.0.14",
5136 + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz",
5137 + "integrity": "sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ=="
5138 + },
5056 "concat-map": { 5139 "concat-map": {
5057 "version": "0.0.1", 5140 "version": "0.0.1",
5058 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 5141 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
...@@ -5189,6 +5272,14 @@ ...@@ -5189,6 +5272,14 @@
5189 "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", 5272 "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
5190 "dev": true 5273 "dev": true
5191 }, 5274 },
5275 + "copy-to-clipboard": {
5276 + "version": "3.3.1",
5277 + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz",
5278 + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==",
5279 + "requires": {
5280 + "toggle-selection": "^1.0.6"
5281 + }
5282 + },
5192 "core-js": { 5283 "core-js": {
5193 "version": "3.6.5", 5284 "version": "3.6.5",
5194 "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", 5285 "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
...@@ -5284,9 +5375,9 @@ ...@@ -5284,9 +5375,9 @@
5284 } 5375 }
5285 }, 5376 },
5286 "cross-spawn": { 5377 "cross-spawn": {
5287 - "version": "7.0.2", 5378 + "version": "7.0.3",
5288 - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", 5379 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
5289 - "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", 5380 + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
5290 "dev": true, 5381 "dev": true,
5291 "requires": { 5382 "requires": {
5292 "path-key": "^3.1.0", 5383 "path-key": "^3.1.0",
...@@ -5635,9 +5726,9 @@ ...@@ -5635,9 +5726,9 @@
5635 } 5726 }
5636 }, 5727 },
5637 "customize-cra": { 5728 "customize-cra": {
5638 - "version": "0.9.1", 5729 + "version": "1.0.0",
5639 - "resolved": "https://registry.npmjs.org/customize-cra/-/customize-cra-0.9.1.tgz", 5730 + "resolved": "https://registry.npmjs.org/customize-cra/-/customize-cra-1.0.0.tgz",
5640 - "integrity": "sha512-LISruJ6ak6u+HVQ2vPI+HE4inpPugB73KB9YIpE2J1TW5L1Vrjzm3l2Yupyy+1alJGwAd5GAb5Hfc9qmSUuHow==", 5731 + "integrity": "sha512-DbtaLuy59224U+xCiukkxSq8clq++MOtJ1Et7LED1fLszWe88EoblEYFBJ895sB1mC6B4uu3xPT/IjClELhMbA==",
5641 "dev": true, 5732 "dev": true,
5642 "requires": { 5733 "requires": {
5643 "lodash.flow": "^3.5.0" 5734 "lodash.flow": "^3.5.0"
...@@ -5845,15 +5936,6 @@ ...@@ -5845,15 +5936,6 @@
5845 } 5936 }
5846 } 5937 }
5847 }, 5938 },
5848 - "defaults": {
5849 - "version": "1.0.3",
5850 - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
5851 - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
5852 - "dev": true,
5853 - "requires": {
5854 - "clone": "^1.0.2"
5855 - }
5856 - },
5857 "define-properties": { 5939 "define-properties": {
5858 "version": "1.1.3", 5940 "version": "1.1.3",
5859 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 5941 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
...@@ -6114,11 +6196,16 @@ ...@@ -6114,11 +6196,16 @@
6114 } 6196 }
6115 }, 6197 },
6116 "dom-accessibility-api": { 6198 "dom-accessibility-api": {
6117 - "version": "0.4.3", 6199 + "version": "0.4.4",
6118 - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.4.3.tgz", 6200 + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.4.4.tgz",
6119 - "integrity": "sha512-JZ8iPuEHDQzq6q0k7PKMGbrIdsgBB7TRrtVOUm4nSMCExlg5qQG4KXWTH2k90yggjM4tTumRGwTKJSldMzKyLA==", 6201 + "integrity": "sha512-XBM62jdDc06IXSujkqw6BugEWiDkp6jphtzVJf1kgPQGvfzaU7/jRtRSF/mxc8DBCIm2LS3bN1dCa5Sfxx982A==",
6120 "dev": true 6202 "dev": true
6121 }, 6203 },
6204 + "dom-align": {
6205 + "version": "1.12.0",
6206 + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz",
6207 + "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA=="
6208 + },
6122 "dom-converter": { 6209 "dom-converter": {
6123 "version": "0.2.0", 6210 "version": "0.2.0",
6124 "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", 6211 "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
...@@ -6303,12 +6390,6 @@ ...@@ -6303,12 +6390,6 @@
6303 "integrity": "sha512-/GdNhXyLP5Yl2322CUX/+Xi8NhdHBqL6lD9VJVKjH6CjoPGakvwZ5CpKgj/oOlbzuWWjOvMjDw1bBuAIRCNTlw==", 6390 "integrity": "sha512-/GdNhXyLP5Yl2322CUX/+Xi8NhdHBqL6lD9VJVKjH6CjoPGakvwZ5CpKgj/oOlbzuWWjOvMjDw1bBuAIRCNTlw==",
6304 "dev": true 6391 "dev": true
6305 }, 6392 },
6306 - "elegant-spinner": {
6307 - "version": "2.0.0",
6308 - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-2.0.0.tgz",
6309 - "integrity": "sha512-5YRYHhvhYzV/FC4AiMdeSIg3jAYGq9xFvbhZMpPlJoBsfYgrw2DSCYeXfat6tYBu45PWiyRr3+flaCPPmviPaA==",
6310 - "dev": true
6311 - },
6312 "elliptic": { 6393 "elliptic": {
6313 "version": "6.5.2", 6394 "version": "6.5.2",
6314 "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", 6395 "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz",
...@@ -7025,9 +7106,9 @@ ...@@ -7025,9 +7106,9 @@
7025 } 7106 }
7026 }, 7107 },
7027 "eslint-plugin-jest": { 7108 "eslint-plugin-jest": {
7028 - "version": "23.10.0", 7109 + "version": "23.13.2",
7029 - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.10.0.tgz", 7110 + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.13.2.tgz",
7030 - "integrity": "sha512-cHC//nesojSO1MLxVmFJR/bUaQQG7xvMHQD8YLbsQzevR41WKm8paKDUv2wMHlUy5XLZUmNcWuflOi4apS8D+Q==", 7111 + "integrity": "sha512-qZit+moTXTyZFNDqSIR88/L3rdBlTU7CuW6XmyErD2FfHEkdoLgThkRbiQjzgYnX6rfgLx3Ci4eJmF4Ui5v1Cw==",
7031 "dev": true, 7112 "dev": true,
7032 "requires": { 7113 "requires": {
7033 "@typescript-eslint/experimental-utils": "^2.5.0" 7114 "@typescript-eslint/experimental-utils": "^2.5.0"
...@@ -7207,9 +7288,9 @@ ...@@ -7207,9 +7288,9 @@
7207 "dev": true 7288 "dev": true
7208 }, 7289 },
7209 "eventemitter3": { 7290 "eventemitter3": {
7210 - "version": "4.0.1", 7291 + "version": "4.0.4",
7211 - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.1.tgz", 7292 + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
7212 - "integrity": "sha512-MnI0l35oYL2C/c80rjJN7qu50MDx39yYE7y7oYck2YA3v+y7EaAenY8IU8AP4d1RWqE8VAKWFGSh3rfP87ll3g==", 7293 + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
7213 "dev": true 7294 "dev": true
7214 }, 7295 },
7215 "events": { 7296 "events": {
...@@ -7244,9 +7325,9 @@ ...@@ -7244,9 +7325,9 @@
7244 "dev": true 7325 "dev": true
7245 }, 7326 },
7246 "execa": { 7327 "execa": {
7247 - "version": "4.0.1", 7328 + "version": "4.0.2",
7248 - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.1.tgz", 7329 + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz",
7249 - "integrity": "sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw==", 7330 + "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==",
7250 "dev": true, 7331 "dev": true,
7251 "requires": { 7332 "requires": {
7252 "cross-spawn": "^7.0.0", 7333 "cross-spawn": "^7.0.0",
...@@ -7655,6 +7736,11 @@ ...@@ -7655,6 +7736,11 @@
7655 "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 7736 "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
7656 "dev": true 7737 "dev": true
7657 }, 7738 },
7739 + "fake-xml-http-request": {
7740 + "version": "2.1.1",
7741 + "resolved": "https://registry.npmjs.org/fake-xml-http-request/-/fake-xml-http-request-2.1.1.tgz",
7742 + "integrity": "sha512-Kn2WYYS6cDBS5jq/voOfSGCA0TafOYAUPbEp8mUVpD/DVV5bQIDjlq+MLLvNUokkbTpjBVlLDaM5PnX+PwZMlw=="
7743 + },
7658 "fast-deep-equal": { 7744 "fast-deep-equal": {
7659 "version": "3.1.1", 7745 "version": "3.1.1",
7660 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 7746 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
...@@ -7879,10 +7965,9 @@ ...@@ -7879,10 +7965,9 @@
7879 "optional": true 7965 "optional": true
7880 }, 7966 },
7881 "filesize": { 7967 "filesize": {
7882 - "version": "6.0.1", 7968 + "version": "6.1.0",
7883 - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", 7969 + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz",
7884 - "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==", 7970 + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg=="
7885 - "dev": true
7886 }, 7971 },
7887 "fill-range": { 7972 "fill-range": {
7888 "version": "7.0.1", 7973 "version": "7.0.1",
...@@ -8690,11 +8775,6 @@ ...@@ -8690,11 +8775,6 @@
8690 "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", 8775 "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
8691 "dev": true 8776 "dev": true
8692 }, 8777 },
8693 - "gud": {
8694 - "version": "1.0.0",
8695 - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz",
8696 - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw=="
8697 - },
8698 "gzip-size": { 8778 "gzip-size": {
8699 "version": "5.1.1", 8779 "version": "5.1.1",
8700 "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", 8780 "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
...@@ -9104,9 +9184,9 @@ ...@@ -9104,9 +9184,9 @@
9104 "dev": true 9184 "dev": true
9105 }, 9185 },
9106 "http-proxy": { 9186 "http-proxy": {
9107 - "version": "1.18.0", 9187 + "version": "1.18.1",
9108 - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", 9188 + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
9109 - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", 9189 + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
9110 "dev": true, 9190 "dev": true,
9111 "requires": { 9191 "requires": {
9112 "eventemitter3": "^4.0.0", 9192 "eventemitter3": "^4.0.0",
...@@ -9462,6 +9542,11 @@ ...@@ -9462,6 +9542,11 @@
9462 "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", 9542 "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
9463 "dev": true 9543 "dev": true
9464 }, 9544 },
9545 + "inflected": {
9546 + "version": "2.0.4",
9547 + "resolved": "https://registry.npmjs.org/inflected/-/inflected-2.0.4.tgz",
9548 + "integrity": "sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA=="
9549 + },
9465 "inflight": { 9550 "inflight": {
9466 "version": "1.0.6", 9551 "version": "1.0.6",
9467 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 9552 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
...@@ -9505,6 +9590,11 @@ ...@@ -9505,6 +9590,11 @@
9505 "through": "^2.3.6" 9590 "through": "^2.3.6"
9506 } 9591 }
9507 }, 9592 },
9593 + "insert-css": {
9594 + "version": "2.0.0",
9595 + "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz",
9596 + "integrity": "sha1-610Ql7dUL0x56jBg067gfQU4gPQ="
9597 + },
9508 "internal-ip": { 9598 "internal-ip": {
9509 "version": "4.3.0", 9599 "version": "4.3.0",
9510 "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", 9600 "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
...@@ -12374,6 +12464,14 @@ ...@@ -12374,6 +12464,14 @@
12374 "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 12464 "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
12375 "dev": true 12465 "dev": true
12376 }, 12466 },
12467 + "json2mq": {
12468 + "version": "0.2.0",
12469 + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
12470 + "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=",
12471 + "requires": {
12472 + "string-convert": "^0.2.0"
12473 + }
12474 + },
12377 "json3": { 12475 "json3": {
12378 "version": "3.3.3", 12476 "version": "3.3.3",
12379 "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", 12477 "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
...@@ -12448,9 +12546,9 @@ ...@@ -12448,9 +12546,9 @@
12448 "dev": true 12546 "dev": true
12449 }, 12547 },
12450 "ky": { 12548 "ky": {
12451 - "version": "0.19.1", 12549 + "version": "0.20.0",
12452 - "resolved": "https://registry.npmjs.org/ky/-/ky-0.19.1.tgz", 12550 + "resolved": "https://registry.npmjs.org/ky/-/ky-0.20.0.tgz",
12453 - "integrity": "sha512-ZwciYrfaWpDI72U2HAruuGYGFW3PCfGNdWWSANGGssg9BGm4rRJ9s/sApiiRpj+8Y245/hlZW9c60zudLr6iwA==" 12551 + "integrity": "sha512-JAfwtwj+t7WqRus88PfBj25aAjRQUgMhk7aB2ufjQ6v8faoNwMy02mfSQ0iNXWCbJGcSl2JZ5ckaiywRjbq0Uw=="
12454 }, 12552 },
12455 "last-call-webpack-plugin": { 12553 "last-call-webpack-plugin": {
12456 "version": "3.0.0", 12554 "version": "3.0.0",
...@@ -12515,19 +12613,21 @@ ...@@ -12515,19 +12613,21 @@
12515 "dev": true 12613 "dev": true
12516 }, 12614 },
12517 "lint-staged": { 12615 "lint-staged": {
12518 - "version": "10.2.2", 12616 + "version": "10.2.9",
12519 - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.2.tgz", 12617 + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.9.tgz",
12520 - "integrity": "sha512-78kNqNdDeKrnqWsexAmkOU3Z5wi+1CsQmUmfCuYgMTE8E4rAIX8RHW7xgxwAZ+LAayb7Cca4uYX4P3LlevzjVg==", 12618 + "integrity": "sha512-ziRAuXEqvJLSXg43ezBpHxRW8FOJCXISaXU//BWrxRrp5cBdRkIx7g5IsB3OI45xYGE0S6cOacfekSjDyDKF2g==",
12521 "dev": true, 12619 "dev": true,
12522 "requires": { 12620 "requires": {
12523 "chalk": "^4.0.0", 12621 "chalk": "^4.0.0",
12524 - "commander": "^5.0.0", 12622 + "cli-truncate": "2.1.0",
12623 + "commander": "^5.1.0",
12525 "cosmiconfig": "^6.0.0", 12624 "cosmiconfig": "^6.0.0",
12526 "debug": "^4.1.1", 12625 "debug": "^4.1.1",
12527 "dedent": "^0.7.0", 12626 "dedent": "^0.7.0",
12528 - "execa": "^4.0.0", 12627 + "enquirer": "^2.3.5",
12529 - "listr2": "1.3.8", 12628 + "execa": "^4.0.1",
12530 - "log-symbols": "^3.0.0", 12629 + "listr2": "^2.1.0",
12630 + "log-symbols": "^4.0.0",
12531 "micromatch": "^4.0.2", 12631 "micromatch": "^4.0.2",
12532 "normalize-path": "^3.0.0", 12632 "normalize-path": "^3.0.0",
12533 "please-upgrade-node": "^3.2.0", 12633 "please-upgrade-node": "^3.2.0",
...@@ -12548,25 +12648,31 @@ ...@@ -12548,25 +12648,31 @@
12548 } 12648 }
12549 }, 12649 },
12550 "listr2": { 12650 "listr2": {
12551 - "version": "1.3.8", 12651 + "version": "2.1.3",
12552 - "resolved": "https://registry.npmjs.org/listr2/-/listr2-1.3.8.tgz", 12652 + "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.1.3.tgz",
12553 - "integrity": "sha512-iRDRVTgSDz44tBeBBg/35TQz4W+EZBWsDUq7hPpqeUHm7yLPNll0rkwW3lIX9cPAK7l+x95mGWLpxjqxftNfZA==", 12653 + "integrity": "sha512-6oy3QhrZAlJGrG8oPcRp1hix1zUpb5AvyvZ5je979HCyf48tIj3Hn1TG5+rfyhz30t7HfySH/OIaVbwrI2kruA==",
12554 "dev": true, 12654 "dev": true,
12555 "requires": { 12655 "requires": {
12556 - "@samverschueren/stream-to-observable": "^0.3.0", 12656 + "chalk": "^4.0.0",
12557 - "chalk": "^3.0.0",
12558 - "cli-cursor": "^3.1.0",
12559 "cli-truncate": "^2.1.0", 12657 "cli-truncate": "^2.1.0",
12560 - "elegant-spinner": "^2.0.0",
12561 - "enquirer": "^2.3.4",
12562 "figures": "^3.2.0", 12658 "figures": "^3.2.0",
12563 "indent-string": "^4.0.0", 12659 "indent-string": "^4.0.0",
12564 "log-update": "^4.0.0", 12660 "log-update": "^4.0.0",
12565 "p-map": "^4.0.0", 12661 "p-map": "^4.0.0",
12566 - "pad": "^3.2.0", 12662 + "rxjs": "^6.5.5",
12567 - "rxjs": "^6.3.3", 12663 + "through": "^2.3.8"
12568 - "through": "^2.3.8", 12664 + },
12569 - "uuid": "^7.0.2" 12665 + "dependencies": {
12666 + "chalk": {
12667 + "version": "4.0.0",
12668 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
12669 + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
12670 + "dev": true,
12671 + "requires": {
12672 + "ansi-styles": "^4.1.0",
12673 + "supports-color": "^7.1.0"
12674 + }
12675 + }
12570 } 12676 }
12571 }, 12677 },
12572 "load-json-file": { 12678 "load-json-file": {
...@@ -12684,8 +12790,7 @@ ...@@ -12684,8 +12790,7 @@
12684 "lodash": { 12790 "lodash": {
12685 "version": "4.17.15", 12791 "version": "4.17.15",
12686 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 12792 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
12687 - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 12793 + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
12688 - "dev": true
12689 }, 12794 },
12690 "lodash._reinterpolate": { 12795 "lodash._reinterpolate": {
12691 "version": "3.0.0", 12796 "version": "3.0.0",
...@@ -12693,18 +12798,118 @@ ...@@ -12693,18 +12798,118 @@
12693 "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", 12798 "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
12694 "dev": true 12799 "dev": true
12695 }, 12800 },
12801 + "lodash.assign": {
12802 + "version": "4.2.0",
12803 + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
12804 + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
12805 + },
12806 + "lodash.camelcase": {
12807 + "version": "4.3.0",
12808 + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
12809 + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
12810 + },
12811 + "lodash.clonedeep": {
12812 + "version": "4.5.0",
12813 + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
12814 + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
12815 + },
12816 + "lodash.compact": {
12817 + "version": "3.0.1",
12818 + "resolved": "https://registry.npmjs.org/lodash.compact/-/lodash.compact-3.0.1.tgz",
12819 + "integrity": "sha1-VAzjg3dFl1gHRx4WtKK6IeclbKU="
12820 + },
12821 + "lodash.find": {
12822 + "version": "4.6.0",
12823 + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz",
12824 + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E="
12825 + },
12826 + "lodash.flatten": {
12827 + "version": "4.4.0",
12828 + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
12829 + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
12830 + },
12696 "lodash.flow": { 12831 "lodash.flow": {
12697 "version": "3.5.0", 12832 "version": "3.5.0",
12698 "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", 12833 "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz",
12699 "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=", 12834 "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=",
12700 "dev": true 12835 "dev": true
12701 }, 12836 },
12837 + "lodash.forin": {
12838 + "version": "4.4.0",
12839 + "resolved": "https://registry.npmjs.org/lodash.forin/-/lodash.forin-4.4.0.tgz",
12840 + "integrity": "sha1-XT8grlZAEfvog4H32YlJyclRlzE="
12841 + },
12842 + "lodash.get": {
12843 + "version": "4.4.2",
12844 + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
12845 + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
12846 + },
12847 + "lodash.has": {
12848 + "version": "4.5.2",
12849 + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz",
12850 + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI="
12851 + },
12852 + "lodash.invokemap": {
12853 + "version": "4.6.0",
12854 + "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz",
12855 + "integrity": "sha1-F0jNpdiw74NpxOs+xUwh/rofLWI="
12856 + },
12857 + "lodash.isempty": {
12858 + "version": "4.4.0",
12859 + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
12860 + "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4="
12861 + },
12862 + "lodash.isequal": {
12863 + "version": "4.5.0",
12864 + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
12865 + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
12866 + },
12867 + "lodash.isfunction": {
12868 + "version": "3.0.9",
12869 + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
12870 + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw=="
12871 + },
12872 + "lodash.isinteger": {
12873 + "version": "4.0.4",
12874 + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
12875 + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
12876 + },
12877 + "lodash.isplainobject": {
12878 + "version": "4.0.6",
12879 + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
12880 + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
12881 + },
12882 + "lodash.lowerfirst": {
12883 + "version": "4.3.1",
12884 + "resolved": "https://registry.npmjs.org/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz",
12885 + "integrity": "sha1-3jx7EuAsZSSgBZwvbLfFxSZVoT0="
12886 + },
12887 + "lodash.map": {
12888 + "version": "4.6.0",
12889 + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
12890 + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM="
12891 + },
12892 + "lodash.mapvalues": {
12893 + "version": "4.6.0",
12894 + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz",
12895 + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw="
12896 + },
12702 "lodash.memoize": { 12897 "lodash.memoize": {
12703 "version": "4.1.2", 12898 "version": "4.1.2",
12704 "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", 12899 "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
12705 "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", 12900 "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
12706 "dev": true 12901 "dev": true
12707 }, 12902 },
12903 + "lodash.pick": {
12904 + "version": "4.4.0",
12905 + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
12906 + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM="
12907 + },
12908 + "lodash.snakecase": {
12909 + "version": "4.1.1",
12910 + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
12911 + "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40="
12912 + },
12708 "lodash.sortby": { 12913 "lodash.sortby": {
12709 "version": "4.7.0", 12914 "version": "4.7.0",
12710 "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 12915 "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
...@@ -12733,66 +12938,35 @@ ...@@ -12733,66 +12938,35 @@
12733 "lodash.uniq": { 12938 "lodash.uniq": {
12734 "version": "4.5.0", 12939 "version": "4.5.0",
12735 "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", 12940 "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
12736 - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", 12941 + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
12737 - "dev": true 12942 + },
12943 + "lodash.uniqby": {
12944 + "version": "4.7.0",
12945 + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz",
12946 + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI="
12947 + },
12948 + "lodash.values": {
12949 + "version": "4.3.0",
12950 + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz",
12951 + "integrity": "sha1-o6bCsOvsxcLLocF+bmIP6BtT00c="
12738 }, 12952 },
12739 "log-symbols": { 12953 "log-symbols": {
12740 - "version": "3.0.0", 12954 + "version": "4.0.0",
12741 - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 12955 + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
12742 - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 12956 + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
12743 "dev": true, 12957 "dev": true,
12744 "requires": { 12958 "requires": {
12745 - "chalk": "^2.4.2" 12959 + "chalk": "^4.0.0"
12746 }, 12960 },
12747 "dependencies": { 12961 "dependencies": {
12748 - "ansi-styles": {
12749 - "version": "3.2.1",
12750 - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
12751 - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
12752 - "dev": true,
12753 - "requires": {
12754 - "color-convert": "^1.9.0"
12755 - }
12756 - },
12757 "chalk": { 12962 "chalk": {
12758 - "version": "2.4.2", 12963 + "version": "4.0.0",
12759 - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 12964 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
12760 - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 12965 + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
12761 - "dev": true,
12762 - "requires": {
12763 - "ansi-styles": "^3.2.1",
12764 - "escape-string-regexp": "^1.0.5",
12765 - "supports-color": "^5.3.0"
12766 - }
12767 - },
12768 - "color-convert": {
12769 - "version": "1.9.3",
12770 - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
12771 - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
12772 - "dev": true,
12773 - "requires": {
12774 - "color-name": "1.1.3"
12775 - }
12776 - },
12777 - "color-name": {
12778 - "version": "1.1.3",
12779 - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
12780 - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
12781 - "dev": true
12782 - },
12783 - "has-flag": {
12784 - "version": "3.0.0",
12785 - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
12786 - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
12787 - "dev": true
12788 - },
12789 - "supports-color": {
12790 - "version": "5.5.0",
12791 - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
12792 - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
12793 "dev": true, 12966 "dev": true,
12794 "requires": { 12967 "requires": {
12795 - "has-flag": "^3.0.0" 12968 + "ansi-styles": "^4.1.0",
12969 + "supports-color": "^7.1.0"
12796 } 12970 }
12797 } 12971 }
12798 } 12972 }
...@@ -13259,19 +13433,18 @@ ...@@ -13259,19 +13433,18 @@
13259 } 13433 }
13260 }, 13434 },
13261 "min-indent": { 13435 "min-indent": {
13262 - "version": "1.0.0", 13436 + "version": "1.0.1",
13263 - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", 13437 + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
13264 - "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=", 13438 + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
13265 "dev": true 13439 "dev": true
13266 }, 13440 },
13267 "mini-create-react-context": { 13441 "mini-create-react-context": {
13268 - "version": "0.3.2", 13442 + "version": "0.4.0",
13269 - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", 13443 + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz",
13270 - "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", 13444 + "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==",
13271 "requires": { 13445 "requires": {
13272 - "@babel/runtime": "^7.4.0", 13446 + "@babel/runtime": "^7.5.5",
13273 - "gud": "^1.0.0", 13447 + "tiny-warning": "^1.0.3"
13274 - "tiny-warning": "^1.0.2"
13275 } 13448 }
13276 }, 13449 },
13277 "mini-css-extract-plugin": { 13450 "mini-css-extract-plugin": {
...@@ -13299,6 +13472,15 @@ ...@@ -13299,6 +13472,15 @@
13299 } 13472 }
13300 } 13473 }
13301 }, 13474 },
13475 + "mini-store": {
13476 + "version": "3.0.5",
13477 + "resolved": "https://registry.npmjs.org/mini-store/-/mini-store-3.0.5.tgz",
13478 + "integrity": "sha512-A7f0+d7TEvjJNY2K+splh2OG3AhmoPoiF3VntlAcJuBzryMumOF9LAVzg8mRJPPbCkz7mlWQg9MCMQPR2auftA==",
13479 + "requires": {
13480 + "hoist-non-react-statics": "^3.3.2",
13481 + "shallowequal": "^1.0.2"
13482 + }
13483 + },
13302 "minimalistic-assert": { 13484 "minimalistic-assert": {
13303 "version": "1.0.1", 13485 "version": "1.0.1",
13304 "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 13486 "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
...@@ -13362,6 +13544,39 @@ ...@@ -13362,6 +13544,39 @@
13362 "minipass": "^3.0.0" 13544 "minipass": "^3.0.0"
13363 } 13545 }
13364 }, 13546 },
13547 + "miragejs": {
13548 + "version": "0.1.40",
13549 + "resolved": "https://registry.npmjs.org/miragejs/-/miragejs-0.1.40.tgz",
13550 + "integrity": "sha512-7zxIcynzdS6425KZ2+TWD6F6DqESorulSDW2QBXf4iKyVn/J5vSielcubAK8sTKUefTPCrSRi7PwgNOb0JlmIg==",
13551 + "requires": {
13552 + "@miragejs/pretender-node-polyfill": "^0.1.0",
13553 + "inflected": "^2.0.4",
13554 + "lodash.assign": "^4.2.0",
13555 + "lodash.camelcase": "^4.3.0",
13556 + "lodash.clonedeep": "^4.5.0",
13557 + "lodash.compact": "^3.0.1",
13558 + "lodash.find": "^4.6.0",
13559 + "lodash.flatten": "^4.4.0",
13560 + "lodash.forin": "^4.4.0",
13561 + "lodash.get": "^4.4.2",
13562 + "lodash.has": "^4.5.2",
13563 + "lodash.invokemap": "^4.6.0",
13564 + "lodash.isempty": "^4.4.0",
13565 + "lodash.isequal": "^4.5.0",
13566 + "lodash.isfunction": "^3.0.9",
13567 + "lodash.isinteger": "^4.0.4",
13568 + "lodash.isplainobject": "^4.0.6",
13569 + "lodash.lowerfirst": "^4.3.1",
13570 + "lodash.map": "^4.6.0",
13571 + "lodash.mapvalues": "^4.6.0",
13572 + "lodash.pick": "^4.4.0",
13573 + "lodash.snakecase": "^4.1.1",
13574 + "lodash.uniq": "^4.5.0",
13575 + "lodash.uniqby": "^4.7.0",
13576 + "lodash.values": "^4.3.0",
13577 + "pretender": "^3.4.3"
13578 + }
13579 + },
13365 "mississippi": { 13580 "mississippi": {
13366 "version": "3.0.0", 13581 "version": "3.0.0",
13367 "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", 13582 "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
...@@ -13428,6 +13643,11 @@ ...@@ -13428,6 +13643,11 @@
13428 "minimist": "^1.2.5" 13643 "minimist": "^1.2.5"
13429 } 13644 }
13430 }, 13645 },
13646 + "moment": {
13647 + "version": "2.26.0",
13648 + "resolved": "https://registry.npmjs.org/moment/-/moment-2.26.0.tgz",
13649 + "integrity": "sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw=="
13650 + },
13431 "move-concurrently": { 13651 "move-concurrently": {
13432 "version": "1.0.1", 13652 "version": "1.0.1",
13433 "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", 13653 "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
...@@ -14074,6 +14294,14 @@ ...@@ -14074,6 +14294,14 @@
14074 "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", 14294 "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
14075 "dev": true 14295 "dev": true
14076 }, 14296 },
14297 + "omit.js": {
14298 + "version": "1.0.2",
14299 + "resolved": "https://registry.npmjs.org/omit.js/-/omit.js-1.0.2.tgz",
14300 + "integrity": "sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==",
14301 + "requires": {
14302 + "babel-runtime": "^6.23.0"
14303 + }
14304 + },
14077 "on-finished": { 14305 "on-finished": {
14078 "version": "2.3.0", 14306 "version": "2.3.0",
14079 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 14307 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
...@@ -14386,15 +14614,6 @@ ...@@ -14386,15 +14614,6 @@
14386 "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 14614 "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
14387 "dev": true 14615 "dev": true
14388 }, 14616 },
14389 - "pad": {
14390 - "version": "3.2.0",
14391 - "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz",
14392 - "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==",
14393 - "dev": true,
14394 - "requires": {
14395 - "wcwidth": "^1.0.1"
14396 - }
14397 - },
14398 "pako": { 14617 "pako": {
14399 "version": "1.0.11", 14618 "version": "1.0.11",
14400 "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 14619 "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
...@@ -14581,8 +14800,7 @@ ...@@ -14581,8 +14800,7 @@
14581 "performance-now": { 14800 "performance-now": {
14582 "version": "2.1.0", 14801 "version": "2.1.0",
14583 "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 14802 "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
14584 - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 14803 + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
14585 - "dev": true
14586 }, 14804 },
14587 "picomatch": { 14805 "picomatch": {
14588 "version": "2.2.2", 14806 "version": "2.2.2",
...@@ -15864,6 +16082,15 @@ ...@@ -15864,6 +16082,15 @@
15864 "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", 16082 "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
15865 "dev": true 16083 "dev": true
15866 }, 16084 },
16085 + "pretender": {
16086 + "version": "3.4.3",
16087 + "resolved": "https://registry.npmjs.org/pretender/-/pretender-3.4.3.tgz",
16088 + "integrity": "sha512-AlbkBly9R8KR+R0sTCJ/ToOeEoUMtt52QVCetui5zoSmeLOU3S8oobFsyPLm1O2txR6t58qDNysqPnA1vVi8Hg==",
16089 + "requires": {
16090 + "fake-xml-http-request": "^2.1.1",
16091 + "route-recognizer": "^0.3.3"
16092 + }
16093 + },
15867 "prettier": { 16094 "prettier": {
15868 "version": "2.0.5", 16095 "version": "2.0.5",
15869 "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", 16096 "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz",
...@@ -16090,7 +16317,6 @@ ...@@ -16090,7 +16317,6 @@
16090 "version": "3.4.1", 16317 "version": "3.4.1",
16091 "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", 16318 "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
16092 "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", 16319 "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
16093 - "dev": true,
16094 "requires": { 16320 "requires": {
16095 "performance-now": "^2.1.0" 16321 "performance-now": "^2.1.0"
16096 } 16322 }
...@@ -16140,6 +16366,535 @@ ...@@ -16140,6 +16366,535 @@
16140 } 16366 }
16141 } 16367 }
16142 }, 16368 },
16369 + "rc-align": {
16370 + "version": "4.0.0",
16371 + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.0.tgz",
16372 + "integrity": "sha512-0mKKfiZGo7VNiRCmnI4MTOG72pBFF0H08zebqcJyXcAm2hgAqTUtvt4I0pjMHh1WdYg+iQDjowpB5X8mZTN2vw==",
16373 + "requires": {
16374 + "@babel/runtime": "^7.10.1",
16375 + "classnames": "2.x",
16376 + "dom-align": "^1.7.0",
16377 + "rc-util": "^5.0.1",
16378 + "resize-observer-polyfill": "^1.5.1"
16379 + },
16380 + "dependencies": {
16381 + "@babel/runtime": {
16382 + "version": "7.10.2",
16383 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16384 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16385 + "requires": {
16386 + "regenerator-runtime": "^0.13.4"
16387 + }
16388 + }
16389 + }
16390 + },
16391 + "rc-animate": {
16392 + "version": "3.1.0",
16393 + "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-3.1.0.tgz",
16394 + "integrity": "sha512-8FsM+3B1H+0AyTyGggY6JyVldHTs1CyYT8CfTmG/nGHHXlecvSLeICJhcKgRLjUiQlctNnRtB1rwz79cvBVmrw==",
16395 + "requires": {
16396 + "@ant-design/css-animation": "^1.7.2",
16397 + "classnames": "^2.2.6",
16398 + "raf": "^3.4.0",
16399 + "rc-util": "^5.0.1"
16400 + }
16401 + },
16402 + "rc-cascader": {
16403 + "version": "1.2.0",
16404 + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-1.2.0.tgz",
16405 + "integrity": "sha512-exJ6qvaZddARXOjxYQzD0oYrOhNS/WC3E0+xUtAA6yP3RA6PRtzTBWCI4Il4y58X3C+wTjkQq5q1vKxHD76QOA==",
16406 + "requires": {
16407 + "array-tree-filter": "^2.1.0",
16408 + "rc-trigger": "^4.0.0",
16409 + "rc-util": "^5.0.1",
16410 + "warning": "^4.0.1"
16411 + }
16412 + },
16413 + "rc-checkbox": {
16414 + "version": "2.2.0",
16415 + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.2.0.tgz",
16416 + "integrity": "sha512-Wjh/nutLA8iIPTT1P9I9KOqlUblVe+CWa3SxMibFySnLyYbMxKNtPhwNcbADPOqzNU0AsCntTduNeJg1n0B5fg==",
16417 + "requires": {
16418 + "babel-runtime": "^6.23.0",
16419 + "classnames": "2.x"
16420 + }
16421 + },
16422 + "rc-collapse": {
16423 + "version": "2.0.0",
16424 + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-2.0.0.tgz",
16425 + "integrity": "sha512-R5+Ge1uzwK9G1wZPRPhqQsed4FXTDmU0BKzsqfNBtZdk/wd+yey8ZutmJmSozYc5hQwjPkCvJHV7gOIRZKIlJg==",
16426 + "requires": {
16427 + "@ant-design/css-animation": "^1.7.2",
16428 + "classnames": "2.x",
16429 + "rc-animate": "3.x",
16430 + "react-is": "^16.7.0",
16431 + "shallowequal": "^1.1.0"
16432 + }
16433 + },
16434 + "rc-dialog": {
16435 + "version": "8.0.1",
16436 + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.0.1.tgz",
16437 + "integrity": "sha512-ZOO2F8KHN4Dkpf1KiXNPKFWaLZutIuAhQw+YCafcFrigDv50AxGivoMSC//k4yjcJr3XRQTQMlMsmdAff4dEhw==",
16438 + "requires": {
16439 + "babel-runtime": "6.x",
16440 + "rc-animate": "3.x",
16441 + "rc-util": "^5.0.1"
16442 + }
16443 + },
16444 + "rc-drawer": {
16445 + "version": "4.0.1",
16446 + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-4.0.1.tgz",
16447 + "integrity": "sha512-sQCMV7W5hBjptdHXXKC+YOvZ6sNChDN9Nudd9dA5kJ2ld83yLa54IkEYs4FIb3Ana7yl4kkrgU0B1k2baSsnzw==",
16448 + "requires": {
16449 + "@babel/runtime": "^7.10.1",
16450 + "classnames": "^2.2.6",
16451 + "rc-util": "^5.0.1"
16452 + },
16453 + "dependencies": {
16454 + "@babel/runtime": {
16455 + "version": "7.10.2",
16456 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16457 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16458 + "requires": {
16459 + "regenerator-runtime": "^0.13.4"
16460 + }
16461 + }
16462 + }
16463 + },
16464 + "rc-dropdown": {
16465 + "version": "3.1.2",
16466 + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.1.2.tgz",
16467 + "integrity": "sha512-s2W5jqvjTid5DxotGO5FlTBaQWeB+Bu7McQgjB8Ot3Wbl72AIKwLf11+lgbV4mA2vWC1H8DKyn6SW9TKLTi0xg==",
16468 + "requires": {
16469 + "@babel/runtime": "^7.10.1",
16470 + "classnames": "^2.2.6",
16471 + "rc-trigger": "^4.0.0"
16472 + },
16473 + "dependencies": {
16474 + "@babel/runtime": {
16475 + "version": "7.10.2",
16476 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16477 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16478 + "requires": {
16479 + "regenerator-runtime": "^0.13.4"
16480 + }
16481 + }
16482 + }
16483 + },
16484 + "rc-field-form": {
16485 + "version": "1.4.4",
16486 + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.4.4.tgz",
16487 + "integrity": "sha512-1LwZ/I3fRUDzj2JGyfwur4nZqgwybrHy3kf6aKbGeWfYkpNbZaUNkIPfjBBmCdpN6lVPKI7ftRnYtjdBaXzyaw==",
16488 + "requires": {
16489 + "@babel/runtime": "^7.8.4",
16490 + "async-validator": "^3.0.3",
16491 + "rc-util": "^5.0.0"
16492 + }
16493 + },
16494 + "rc-input-number": {
16495 + "version": "5.0.1",
16496 + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-5.0.1.tgz",
16497 + "integrity": "sha512-4GgnJCjllAVNsZ9fPA+3LnoIgwUqM8QAWpyoKiTkPDN1UWapXYsPiKJCXOhnmiR0X8xpEoYHiobUaiquMliWiQ==",
16498 + "requires": {
16499 + "classnames": "^2.2.0",
16500 + "rc-util": "^5.0.1"
16501 + }
16502 + },
16503 + "rc-mentions": {
16504 + "version": "1.2.0",
16505 + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.2.0.tgz",
16506 + "integrity": "sha512-9d4AYMuKN4o/ND5r/82rJHMp+R+rn1b+f8ZmWsI/1NlWtMqVn9Q7yxofqbX78zgV6+nppsMvMqtduJhgQkVl0Q==",
16507 + "requires": {
16508 + "@babel/runtime": "^7.10.1",
16509 + "classnames": "^2.2.6",
16510 + "rc-menu": "^8.0.1",
16511 + "rc-trigger": "^4.3.0",
16512 + "rc-util": "^5.0.1"
16513 + },
16514 + "dependencies": {
16515 + "@babel/runtime": {
16516 + "version": "7.10.2",
16517 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16518 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16519 + "requires": {
16520 + "regenerator-runtime": "^0.13.4"
16521 + }
16522 + }
16523 + }
16524 + },
16525 + "rc-menu": {
16526 + "version": "8.3.1",
16527 + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-8.3.1.tgz",
16528 + "integrity": "sha512-4LNQ0zIL27yayQu9Xi3QOUB2yEqm5qSFwD9MzB1XnTo1JeLTLy3+D8Bm94rykvnhV6z5MYtalUTnM7ETfjExXQ==",
16529 + "requires": {
16530 + "@babel/runtime": "^7.10.1",
16531 + "classnames": "2.x",
16532 + "mini-store": "^3.0.1",
16533 + "rc-animate": "^3.1.0",
16534 + "rc-trigger": "^4.2.0",
16535 + "rc-util": "^5.0.1",
16536 + "resize-observer-polyfill": "^1.5.0",
16537 + "shallowequal": "^1.1.0"
16538 + },
16539 + "dependencies": {
16540 + "@babel/runtime": {
16541 + "version": "7.10.2",
16542 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16543 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16544 + "requires": {
16545 + "regenerator-runtime": "^0.13.4"
16546 + }
16547 + }
16548 + }
16549 + },
16550 + "rc-notification": {
16551 + "version": "4.4.0",
16552 + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.4.0.tgz",
16553 + "integrity": "sha512-IDeNAFGVeOsy1tv4zNVqMAXB9tianR80ewQbtObaAQfjwAjWfONdqdyjFkEU6nc6UQhSUYA5OcTGb7kwwbnh0g==",
16554 + "requires": {
16555 + "@babel/runtime": "^7.10.1",
16556 + "classnames": "2.x",
16557 + "rc-animate": "3.x",
16558 + "rc-util": "^5.0.1"
16559 + },
16560 + "dependencies": {
16561 + "@babel/runtime": {
16562 + "version": "7.10.2",
16563 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16564 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16565 + "requires": {
16566 + "regenerator-runtime": "^0.13.4"
16567 + }
16568 + }
16569 + }
16570 + },
16571 + "rc-pagination": {
16572 + "version": "2.2.5",
16573 + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-2.2.5.tgz",
16574 + "integrity": "sha512-7hMFNi8R7C/4cLKgmSpUb3BfMFdt4DLrjTixSRMpMBR5jwGfwRyoV9g9Tm6gCuCaAlVAX1QNtlM1T2UqEOW5lw==",
16575 + "requires": {
16576 + "@babel/runtime": "^7.10.1",
16577 + "classnames": "^2.2.1"
16578 + },
16579 + "dependencies": {
16580 + "@babel/runtime": {
16581 + "version": "7.10.2",
16582 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16583 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16584 + "requires": {
16585 + "regenerator-runtime": "^0.13.4"
16586 + }
16587 + }
16588 + }
16589 + },
16590 + "rc-picker": {
16591 + "version": "1.6.3",
16592 + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-1.6.3.tgz",
16593 + "integrity": "sha512-SBaTUZDr+q89s21dF4wi8Ag+Kecv2x7QfufopV4eASm/WXWnvxIP4pCbedqP02jJQMGt290KNlIiffVNqscs5A==",
16594 + "requires": {
16595 + "@babel/runtime": "^7.10.1",
16596 + "classnames": "^2.2.1",
16597 + "moment": "^2.24.0",
16598 + "rc-trigger": "^4.0.0",
16599 + "rc-util": "^5.0.1",
16600 + "shallowequal": "^1.1.0"
16601 + },
16602 + "dependencies": {
16603 + "@babel/runtime": {
16604 + "version": "7.10.2",
16605 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16606 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16607 + "requires": {
16608 + "regenerator-runtime": "^0.13.4"
16609 + }
16610 + }
16611 + }
16612 + },
16613 + "rc-progress": {
16614 + "version": "3.0.0",
16615 + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.0.0.tgz",
16616 + "integrity": "sha512-dQv1KU3o6Vay604FMYMF4S0x4GNXAgXf1tbQ1QoxeIeQt4d5fUeB7Ri82YPu+G+aRvH/AtxYAlEcnxyVZ1/4Hw==",
16617 + "requires": {
16618 + "classnames": "^2.2.6"
16619 + }
16620 + },
16621 + "rc-rate": {
16622 + "version": "2.7.0",
16623 + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.7.0.tgz",
16624 + "integrity": "sha512-XD+1tnmKa3Ykm6jVX2ZiwIWdv+DG1t7LDK3dojeFoS8GgA7W3oqW5R/UpJ66qrLYpPHw9N4pYJKWySiPKtPsLQ==",
16625 + "requires": {
16626 + "@babel/runtime": "^7.10.1",
16627 + "classnames": "^2.2.5",
16628 + "rc-util": "^5.0.1"
16629 + },
16630 + "dependencies": {
16631 + "@babel/runtime": {
16632 + "version": "7.10.2",
16633 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16634 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16635 + "requires": {
16636 + "regenerator-runtime": "^0.13.4"
16637 + }
16638 + }
16639 + }
16640 + },
16641 + "rc-resize-observer": {
16642 + "version": "0.2.3",
16643 + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-0.2.3.tgz",
16644 + "integrity": "sha512-dEPCGX15eRRnu+TNBIGyEghpzE24fTDW8pHdJPJS/kCR3lafFqBLqKzBgZW6pMUuM70/ZDyFQ0Kynx9kWsXRNw==",
16645 + "requires": {
16646 + "@babel/runtime": "^7.10.1",
16647 + "classnames": "^2.2.1",
16648 + "rc-util": "^5.0.0",
16649 + "resize-observer-polyfill": "^1.5.1"
16650 + },
16651 + "dependencies": {
16652 + "@babel/runtime": {
16653 + "version": "7.10.2",
16654 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16655 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16656 + "requires": {
16657 + "regenerator-runtime": "^0.13.4"
16658 + }
16659 + }
16660 + }
16661 + },
16662 + "rc-select": {
16663 + "version": "11.0.0",
16664 + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-11.0.0.tgz",
16665 + "integrity": "sha512-TG3I5RkTFNkDo1cNgQHccRdrL29+o61yx6UmfZ8kZ8MCKn7f7FYld3Tey0PGcQOJ4RnzBOCySp+tGakYl94NKQ==",
16666 + "requires": {
16667 + "@babel/runtime": "^7.10.1",
16668 + "classnames": "2.x",
16669 + "rc-animate": "^3.0.0",
16670 + "rc-trigger": "^4.3.0",
16671 + "rc-util": "^5.0.1",
16672 + "rc-virtual-list": "^1.1.2",
16673 + "warning": "^4.0.3"
16674 + },
16675 + "dependencies": {
16676 + "@babel/runtime": {
16677 + "version": "7.10.2",
16678 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16679 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16680 + "requires": {
16681 + "regenerator-runtime": "^0.13.4"
16682 + }
16683 + }
16684 + }
16685 + },
16686 + "rc-slider": {
16687 + "version": "9.3.0",
16688 + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.3.0.tgz",
16689 + "integrity": "sha512-9QPRjK8qFYO8L/Cn//O/K4g4dSU1glgvAdeT9qBLmjXtdYSiJ9u3YulcdbHWHo9Y3IE1dyaVm4m4ll2FWdDyqg==",
16690 + "requires": {
16691 + "@babel/runtime": "^7.10.1",
16692 + "classnames": "^2.2.5",
16693 + "rc-tooltip": "^4.0.0",
16694 + "rc-util": "^5.0.0",
16695 + "shallowequal": "^1.1.0"
16696 + },
16697 + "dependencies": {
16698 + "@babel/runtime": {
16699 + "version": "7.10.2",
16700 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16701 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16702 + "requires": {
16703 + "regenerator-runtime": "^0.13.4"
16704 + }
16705 + }
16706 + }
16707 + },
16708 + "rc-steps": {
16709 + "version": "4.0.0",
16710 + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-4.0.0.tgz",
16711 + "integrity": "sha512-Vy0T2sC+1ElpovEB97mYNVR5GYNYSzMiRJFumera5gZL2bH6FcxYioXcq/HYCPN//YC+b/Fs37x4G/WpGMuaVw==",
16712 + "requires": {
16713 + "@babel/runtime": "^7.10.2",
16714 + "classnames": "^2.2.3",
16715 + "rc-util": "^5.0.1"
16716 + },
16717 + "dependencies": {
16718 + "@babel/runtime": {
16719 + "version": "7.10.2",
16720 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16721 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16722 + "requires": {
16723 + "regenerator-runtime": "^0.13.4"
16724 + }
16725 + }
16726 + }
16727 + },
16728 + "rc-switch": {
16729 + "version": "3.2.0",
16730 + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.0.tgz",
16731 + "integrity": "sha512-WQZnRrWZ+KGh4Cd98FpP1ZgvMmebctoHzKAO2n1Xsry1FQBSGgIw4rQJRxET31VS/dR1LIKb5md/k0UzcXXc0g==",
16732 + "requires": {
16733 + "@babel/runtime": "^7.10.1",
16734 + "classnames": "^2.2.1",
16735 + "rc-util": "^5.0.1"
16736 + },
16737 + "dependencies": {
16738 + "@babel/runtime": {
16739 + "version": "7.10.2",
16740 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16741 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16742 + "requires": {
16743 + "regenerator-runtime": "^0.13.4"
16744 + }
16745 + }
16746 + }
16747 + },
16748 + "rc-table": {
16749 + "version": "7.7.2",
16750 + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.7.2.tgz",
16751 + "integrity": "sha512-LcCOYmnIKFPNFDbJpD6yUpTyQytoQL0nXoyuG4FWJROMJzmhVhpVQZ83YjFOAlZjwx0Ixz04yPkMvRq6xr9vXQ==",
16752 + "requires": {
16753 + "@babel/runtime": "^7.10.1",
16754 + "classnames": "^2.2.5",
16755 + "raf": "^3.4.1",
16756 + "rc-resize-observer": "^0.2.0",
16757 + "rc-util": "^5.0.0",
16758 + "shallowequal": "^1.1.0"
16759 + },
16760 + "dependencies": {
16761 + "@babel/runtime": {
16762 + "version": "7.10.2",
16763 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16764 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16765 + "requires": {
16766 + "regenerator-runtime": "^0.13.4"
16767 + }
16768 + }
16769 + }
16770 + },
16771 + "rc-tabs": {
16772 + "version": "11.3.2",
16773 + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.3.2.tgz",
16774 + "integrity": "sha512-UQQrVmBZm/LrgS5GHPZNpzedTV5ppU1f8dvTV2TX/zmV8byaOVd2uJ9F/f4zkXTvsTLxGzFfCrb6nAn1cwSBLw==",
16775 + "requires": {
16776 + "@babel/runtime": "^7.10.1",
16777 + "classnames": "2.x",
16778 + "raf": "^3.4.1",
16779 + "rc-dropdown": "^3.1.0",
16780 + "rc-menu": "^8.2.1",
16781 + "rc-resize-observer": "^0.2.1",
16782 + "rc-trigger": "^4.2.1",
16783 + "rc-util": "^5.0.0"
16784 + },
16785 + "dependencies": {
16786 + "@babel/runtime": {
16787 + "version": "7.10.2",
16788 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16789 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16790 + "requires": {
16791 + "regenerator-runtime": "^0.13.4"
16792 + }
16793 + }
16794 + }
16795 + },
16796 + "rc-tooltip": {
16797 + "version": "4.2.1",
16798 + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-4.2.1.tgz",
16799 + "integrity": "sha512-oykuaGsHg7RFvPUaxUpxo7ScEqtH61C66x4JUmjlFlSS8gSx2L8JFtfwM1D68SLBxUqGqJObtxj4TED75gQTiA==",
16800 + "requires": {
16801 + "rc-trigger": "^4.2.1"
16802 + }
16803 + },
16804 + "rc-tree": {
16805 + "version": "3.3.1",
16806 + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-3.3.1.tgz",
16807 + "integrity": "sha512-DGyVZN4HRSrmFErn68KOISIl3z0R9EjeNyZE0sgAaa5oqpQDAEK78/lYf5k3rot1N/iFAEJKaTRJfM7eIdWGwg==",
16808 + "requires": {
16809 + "@babel/runtime": "^7.10.1",
16810 + "classnames": "2.x",
16811 + "rc-animate": "^3.1.0",
16812 + "rc-util": "^5.0.0",
16813 + "rc-virtual-list": "^1.1.0"
16814 + },
16815 + "dependencies": {
16816 + "@babel/runtime": {
16817 + "version": "7.10.2",
16818 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16819 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16820 + "requires": {
16821 + "regenerator-runtime": "^0.13.4"
16822 + }
16823 + }
16824 + }
16825 + },
16826 + "rc-tree-select": {
16827 + "version": "4.0.1",
16828 + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-4.0.1.tgz",
16829 + "integrity": "sha512-VehfIZgu6Xmko7YfJgshmuIdeI7u7Ar1iLkmlb69/w1HjaDnSHbV3N3xopLABAq8lTlTAnSFU2JCPcYifvTmAA==",
16830 + "requires": {
16831 + "@babel/runtime": "^7.10.1",
16832 + "classnames": "2.x",
16833 + "rc-select": "^11.0.0",
16834 + "rc-tree": "^3.1.0",
16835 + "rc-util": "^5.0.1"
16836 + },
16837 + "dependencies": {
16838 + "@babel/runtime": {
16839 + "version": "7.10.2",
16840 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16841 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16842 + "requires": {
16843 + "regenerator-runtime": "^0.13.4"
16844 + }
16845 + }
16846 + }
16847 + },
16848 + "rc-trigger": {
16849 + "version": "4.3.0",
16850 + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-4.3.0.tgz",
16851 + "integrity": "sha512-jnGNzosXmDdivMBjPCYe/AfOXTpJU2/xQ9XukgoXDQEoZq/9lcI1r7eUIfq70WlWpLxlUEqQktiV3hwyy6Nw9g==",
16852 + "requires": {
16853 + "@babel/runtime": "^7.10.1",
16854 + "classnames": "^2.2.6",
16855 + "raf": "^3.4.1",
16856 + "rc-align": "^4.0.0",
16857 + "rc-animate": "^3.0.0",
16858 + "rc-util": "^5.0.1"
16859 + },
16860 + "dependencies": {
16861 + "@babel/runtime": {
16862 + "version": "7.10.2",
16863 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz",
16864 + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==",
16865 + "requires": {
16866 + "regenerator-runtime": "^0.13.4"
16867 + }
16868 + }
16869 + }
16870 + },
16871 + "rc-upload": {
16872 + "version": "3.1.4",
16873 + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-3.1.4.tgz",
16874 + "integrity": "sha512-G6nqT4HMrT+mDd32ZHfcFs2eCFilMdIdteylNCHPcfoBBOKkBW4iVo7O6uFhz/8jIGNLJfR3+6S2x/lnXYYrCQ==",
16875 + "requires": {
16876 + "classnames": "^2.2.5"
16877 + }
16878 + },
16879 + "rc-util": {
16880 + "version": "5.0.4",
16881 + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.0.4.tgz",
16882 + "integrity": "sha512-cd19RCrE0DJH6UcJ9+V3eaXA/5sNWyVKOKkWl8ZM2OqgNzVb8fv0obf/TkuvSN43tmTsgqY8k7OqpFYHhmef8g==",
16883 + "requires": {
16884 + "react-is": "^16.12.0",
16885 + "shallowequal": "^1.1.0"
16886 + }
16887 + },
16888 + "rc-virtual-list": {
16889 + "version": "1.1.5",
16890 + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-1.1.5.tgz",
16891 + "integrity": "sha512-roZ6HE5MNKaiop+Ic7jZS7xlMnXBLp0XBElsMbE4eEL3GnnnJAet2iXoT5wjKcKMXEVyVCD0L4yQozmH7+Kgxg==",
16892 + "requires": {
16893 + "classnames": "^2.2.6",
16894 + "raf": "^3.4.1",
16895 + "rc-util": "^5.0.0"
16896 + }
16897 + },
16143 "react": { 16898 "react": {
16144 "version": "16.13.1", 16899 "version": "16.13.1",
16145 "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", 16900 "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz",
...@@ -16297,6 +17052,12 @@ ...@@ -16297,6 +17052,12 @@
16297 "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 17052 "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
16298 "dev": true 17053 "dev": true
16299 }, 17054 },
17055 + "filesize": {
17056 + "version": "6.0.1",
17057 + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz",
17058 + "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==",
17059 + "dev": true
17060 + },
16300 "has-flag": { 17061 "has-flag": {
16301 "version": "3.0.0", 17062 "version": "3.0.0",
16302 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 17063 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
...@@ -16464,15 +17225,15 @@ ...@@ -16464,15 +17225,15 @@
16464 "dev": true 17225 "dev": true
16465 }, 17226 },
16466 "react-router": { 17227 "react-router": {
16467 - "version": "5.1.2", 17228 + "version": "5.2.0",
16468 - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", 17229 + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz",
16469 - "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", 17230 + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==",
16470 "requires": { 17231 "requires": {
16471 "@babel/runtime": "^7.1.2", 17232 "@babel/runtime": "^7.1.2",
16472 "history": "^4.9.0", 17233 "history": "^4.9.0",
16473 "hoist-non-react-statics": "^3.1.0", 17234 "hoist-non-react-statics": "^3.1.0",
16474 "loose-envify": "^1.3.1", 17235 "loose-envify": "^1.3.1",
16475 - "mini-create-react-context": "^0.3.0", 17236 + "mini-create-react-context": "^0.4.0",
16476 "path-to-regexp": "^1.7.0", 17237 "path-to-regexp": "^1.7.0",
16477 "prop-types": "^15.6.2", 17238 "prop-types": "^15.6.2",
16478 "react-is": "^16.6.0", 17239 "react-is": "^16.6.0",
...@@ -16496,15 +17257,15 @@ ...@@ -16496,15 +17257,15 @@
16496 } 17257 }
16497 }, 17258 },
16498 "react-router-dom": { 17259 "react-router-dom": {
16499 - "version": "5.1.2", 17260 + "version": "5.2.0",
16500 - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.2.tgz", 17261 + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz",
16501 - "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==", 17262 + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==",
16502 "requires": { 17263 "requires": {
16503 "@babel/runtime": "^7.1.2", 17264 "@babel/runtime": "^7.1.2",
16504 "history": "^4.9.0", 17265 "history": "^4.9.0",
16505 "loose-envify": "^1.3.1", 17266 "loose-envify": "^1.3.1",
16506 "prop-types": "^15.6.2", 17267 "prop-types": "^15.6.2",
16507 - "react-router": "5.1.2", 17268 + "react-router": "5.2.0",
16508 "tiny-invariant": "^1.0.2", 17269 "tiny-invariant": "^1.0.2",
16509 "tiny-warning": "^1.0.0" 17270 "tiny-warning": "^1.0.0"
16510 } 17271 }
...@@ -16950,6 +17711,11 @@ ...@@ -16950,6 +17711,11 @@
16950 "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 17711 "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
16951 "dev": true 17712 "dev": true
16952 }, 17713 },
17714 + "resize-observer-polyfill": {
17715 + "version": "1.5.1",
17716 + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
17717 + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
17718 + },
16953 "resolve": { 17719 "resolve": {
16954 "version": "1.15.0", 17720 "version": "1.15.0",
16955 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", 17721 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz",
...@@ -17188,6 +17954,11 @@ ...@@ -17188,6 +17954,11 @@
17188 "inherits": "^2.0.1" 17954 "inherits": "^2.0.1"
17189 } 17955 }
17190 }, 17956 },
17957 + "route-recognizer": {
17958 + "version": "0.3.4",
17959 + "resolved": "https://registry.npmjs.org/route-recognizer/-/route-recognizer-0.3.4.tgz",
17960 + "integrity": "sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g=="
17961 + },
17191 "rsvp": { 17962 "rsvp": {
17192 "version": "4.8.5", 17963 "version": "4.8.5",
17193 "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", 17964 "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
...@@ -17548,6 +18319,14 @@ ...@@ -17548,6 +18319,14 @@
17548 "ajv-keywords": "^3.4.1" 18319 "ajv-keywords": "^3.4.1"
17549 } 18320 }
17550 }, 18321 },
18322 + "scroll-into-view-if-needed": {
18323 + "version": "2.2.25",
18324 + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.25.tgz",
18325 + "integrity": "sha512-C8RKJPq9lK7eubwGpLbUkw3lklcG3Ndjmea2PyauzrA0i4DPlzAmVMGxaZrBFqCrVLfvJmP80IyHnv4jxvg1OQ==",
18326 + "requires": {
18327 + "compute-scroll-into-view": "^1.0.14"
18328 + }
18329 + },
17551 "scss-tokenizer": { 18330 "scss-tokenizer": {
17552 "version": "0.2.3", 18331 "version": "0.2.3",
17553 "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", 18332 "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
...@@ -17811,8 +18590,7 @@ ...@@ -17811,8 +18590,7 @@
17811 "shallowequal": { 18590 "shallowequal": {
17812 "version": "1.1.0", 18591 "version": "1.1.0",
17813 "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", 18592 "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
17814 - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", 18593 + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
17815 - "dev": true
17816 }, 18594 },
17817 "shebang-command": { 18595 "shebang-command": {
17818 "version": "2.0.0", 18596 "version": "2.0.0",
...@@ -18406,6 +19184,11 @@ ...@@ -18406,6 +19184,11 @@
18406 "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", 19184 "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
18407 "dev": true 19185 "dev": true
18408 }, 19186 },
19187 + "string-convert": {
19188 + "version": "0.2.1",
19189 + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
19190 + "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c="
19191 + },
18409 "string-length": { 19192 "string-length": {
18410 "version": "2.0.0", 19193 "version": "2.0.0",
18411 "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", 19194 "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz",
...@@ -19002,6 +19785,11 @@ ...@@ -19002,6 +19785,11 @@
19002 "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", 19785 "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
19003 "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" 19786 "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
19004 }, 19787 },
19788 + "tinycolor2": {
19789 + "version": "1.4.1",
19790 + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz",
19791 + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g="
19792 + },
19005 "tmp": { 19793 "tmp": {
19006 "version": "0.0.33", 19794 "version": "0.0.33",
19007 "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 19795 "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
...@@ -19059,6 +19847,11 @@ ...@@ -19059,6 +19847,11 @@
19059 "is-number": "^7.0.0" 19847 "is-number": "^7.0.0"
19060 } 19848 }
19061 }, 19849 },
19850 + "toggle-selection": {
19851 + "version": "1.0.6",
19852 + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
19853 + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
19854 + },
19062 "toidentifier": { 19855 "toidentifier": {
19063 "version": "1.0.0", 19856 "version": "1.0.0",
19064 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 19857 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
...@@ -19185,9 +19978,9 @@ ...@@ -19185,9 +19978,9 @@
19185 "dev": true 19978 "dev": true
19186 }, 19979 },
19187 "typescript": { 19980 "typescript": {
19188 - "version": "3.8.3", 19981 + "version": "3.9.5",
19189 - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", 19982 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz",
19190 - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", 19983 + "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==",
19191 "dev": true 19984 "dev": true
19192 }, 19985 },
19193 "unicode-canonical-property-names-ecmascript": { 19986 "unicode-canonical-property-names-ecmascript": {
...@@ -19431,12 +20224,6 @@ ...@@ -19431,12 +20224,6 @@
19431 "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 20224 "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
19432 "dev": true 20225 "dev": true
19433 }, 20226 },
19434 - "uuid": {
19435 - "version": "7.0.3",
19436 - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
19437 - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
19438 - "dev": true
19439 - },
19440 "v8-compile-cache": { 20227 "v8-compile-cache": {
19441 "version": "2.1.0", 20228 "version": "2.1.0",
19442 "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 20229 "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
...@@ -19516,6 +20303,14 @@ ...@@ -19516,6 +20303,14 @@
19516 "makeerror": "1.0.x" 20303 "makeerror": "1.0.x"
19517 } 20304 }
19518 }, 20305 },
20306 + "warning": {
20307 + "version": "4.0.3",
20308 + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
20309 + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
20310 + "requires": {
20311 + "loose-envify": "^1.0.0"
20312 + }
20313 + },
19519 "watchpack": { 20314 "watchpack": {
19520 "version": "1.6.1", 20315 "version": "1.6.1",
19521 "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", 20316 "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz",
...@@ -19746,15 +20541,6 @@ ...@@ -19746,15 +20541,6 @@
19746 "minimalistic-assert": "^1.0.0" 20541 "minimalistic-assert": "^1.0.0"
19747 } 20542 }
19748 }, 20543 },
19749 - "wcwidth": {
19750 - "version": "1.0.1",
19751 - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
19752 - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
19753 - "dev": true,
19754 - "requires": {
19755 - "defaults": "^1.0.3"
19756 - }
19757 - },
19758 "webidl-conversions": { 20544 "webidl-conversions": {
19759 "version": "4.0.2", 20545 "version": "4.0.2",
19760 "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 20546 "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
...@@ -19980,9 +20766,9 @@ ...@@ -19980,9 +20766,9 @@
19980 } 20766 }
19981 }, 20767 },
19982 "webpack-bundle-analyzer": { 20768 "webpack-bundle-analyzer": {
19983 - "version": "3.7.0", 20769 + "version": "3.8.0",
19984 - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.7.0.tgz", 20770 + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz",
19985 - "integrity": "sha512-mETdjZ30a3Yf+NTB/wqTgACK7rAYQl5uxKK0WVTNmF0sM3Uv8s3R58YZMW7Rhu0Lk2Rmuhdj5dcH5Q76zCDVdA==", 20771 + "integrity": "sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==",
19986 "dev": true, 20772 "dev": true,
19987 "requires": { 20773 "requires": {
19988 "acorn": "^7.1.1", 20774 "acorn": "^7.1.1",
......
...@@ -4,37 +4,41 @@ ...@@ -4,37 +4,41 @@
4 "description": "Dropbox alternative cloud file service", 4 "description": "Dropbox alternative cloud file service",
5 "private": true, 5 "private": true,
6 "dependencies": { 6 "dependencies": {
7 + "@ant-design/icons": "^4.2.1",
8 + "antd": "^4.3.3",
7 "classnames": "^2.2.6", 9 "classnames": "^2.2.6",
8 - "ky": "^0.19.1", 10 + "filesize": "^6.1.0",
11 + "ky": "^0.20.0",
12 + "miragejs": "^0.1.40",
9 "react": "^16.13.1", 13 "react": "^16.13.1",
10 "react-dom": "^16.13.1", 14 "react-dom": "^16.13.1",
11 - "react-router-dom": "^5.1.2" 15 + "react-router-dom": "^5.2.0"
12 }, 16 },
13 "devDependencies": { 17 "devDependencies": {
14 "@hot-loader/react-dom": "^16.13.0", 18 "@hot-loader/react-dom": "^16.13.0",
15 - "@testing-library/jest-dom": "^5.7.0", 19 + "@testing-library/jest-dom": "^5.9.0",
16 - "@testing-library/react": "^10.0.4", 20 + "@testing-library/react": "^10.2.0",
17 - "@testing-library/user-event": "^10.1.2", 21 + "@testing-library/user-event": "^11.2.0",
18 "@types/classnames": "^2.2.10", 22 "@types/classnames": "^2.2.10",
19 - "@types/jest": "^25.2.1", 23 + "@types/jest": "^25.2.3",
20 "@types/node": "12", 24 "@types/node": "12",
21 "@types/react": "^16.9.35", 25 "@types/react": "^16.9.35",
22 "@types/react-dom": "^16.9.8", 26 "@types/react-dom": "^16.9.8",
23 "@types/react-router-dom": "^5.1.5", 27 "@types/react-router-dom": "^5.1.5",
24 - "@typescript-eslint/eslint-plugin": "^2.31.0", 28 + "@typescript-eslint/eslint-plugin": "^2.34.0",
25 - "@typescript-eslint/parser": "^2.31.0", 29 + "@typescript-eslint/parser": "^2.34.0",
26 - "customize-cra": "0.9.1", 30 + "customize-cra": "1.0.0",
27 "eslint-config-prettier": "^6.11.0", 31 "eslint-config-prettier": "^6.11.0",
28 - "eslint-plugin-jest": "^23.10.0", 32 + "eslint-plugin-jest": "^23.13.2",
29 "husky": "^4.2.5", 33 "husky": "^4.2.5",
30 - "lint-staged": "^10.2.2", 34 + "lint-staged": "^10.2.9",
31 "node-sass": "^4.14.1", 35 "node-sass": "^4.14.1",
32 "prettier": "^2.0.5", 36 "prettier": "^2.0.5",
33 "react-app-rewired": "^2.1.6", 37 "react-app-rewired": "^2.1.6",
34 "react-hot-loader": "^4.12.21", 38 "react-hot-loader": "^4.12.21",
35 "react-scripts": "3.4.1", 39 "react-scripts": "3.4.1",
36 - "typescript": "^3.8.3", 40 + "typescript": "^3.9.5",
37 - "webpack-bundle-analyzer": "^3.7.0" 41 + "webpack-bundle-analyzer": "^3.8.0"
38 }, 42 },
39 "scripts": { 43 "scripts": {
40 "start": "react-app-rewired start", 44 "start": "react-app-rewired start",
...@@ -63,5 +67,6 @@ ...@@ -63,5 +67,6 @@
63 }, 67 },
64 "lint-staged": { 68 "lint-staged": {
65 "*.{js,ts,tsx,json,css,scss}": "prettier --write" 69 "*.{js,ts,tsx,json,css,scss}": "prettier --write"
66 - } 70 + },
71 + "proxy": "http://localhost:8000"
67 } 72 }
......
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<browserconfig>
3 + <msapplication>
4 + <tile>
5 + <square150x150logo src="/mstile-150x150.png"/>
6 + <TileColor>#da532c</TileColor>
7 + </tile>
8 + </msapplication>
9 +</browserconfig>
...@@ -2,42 +2,21 @@ ...@@ -2,42 +2,21 @@
2 <html lang="en"> 2 <html lang="en">
3 <head> 3 <head>
4 <meta charset="utf-8" /> 4 <meta charset="utf-8" />
5 - <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
6 <meta name="viewport" content="width=device-width, initial-scale=1" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1" />
7 <meta name="theme-color" content="#000000" /> 6 <meta name="theme-color" content="#000000" />
8 - <meta 7 + <meta name="description" content="KHUDrive" />
9 - name="description" 8 + <link rel="apple-touch-icon" sizes="180x180" href="%PUBLIC_URL%/apple-touch-icon.png">
10 - content="Web site created using create-react-app" 9 + <link rel="icon" type="image/png" sizes="32x32" href="%PUBLIC_URL%/favicon-32x32.png">
11 - /> 10 + <link rel="icon" type="image/png" sizes="16x16" href="%PUBLIC_URL%/favicon-16x16.png">
12 - <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> 11 + <link rel="manifest" href="%PUBLIC_URL%/site.webmanifest">
13 - <!-- 12 + <link rel="mask-icon" href="%PUBLIC_URL%/safari-pinned-tab.svg" color="#5bbad5">
14 - manifest.json provides metadata used when your web app is installed on a 13 + <meta name="msapplication-TileColor" content="#da532c">
15 - user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ 14 + <meta name="theme-color" content="#ffffff">
16 - -->
17 <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> 15 <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
18 - <!-- 16 + <title>KHUDrive</title>
19 - Notice the use of %PUBLIC_URL% in the tags above.
20 - It will be replaced with the URL of the `public` folder during the build.
21 - Only files inside the `public` folder can be referenced from the HTML.
22 -
23 - Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
24 - work correctly both with client-side routing and a non-root public URL.
25 - Learn how to configure a non-root public URL by running `npm run build`.
26 - -->
27 - <title>React App</title>
28 </head> 17 </head>
29 <body> 18 <body>
30 <noscript>You need to enable JavaScript to run this app.</noscript> 19 <noscript>You need to enable JavaScript to run this app.</noscript>
31 <div id="root"></div> 20 <div id="root"></div>
32 - <!--
33 - This HTML file is a template.
34 - If you open it directly in the browser, you will see an empty page.
35 -
36 - You can add webfonts, meta tags, or analytics to this file.
37 - The build step will place the bundled scripts into the <body> tag.
38 -
39 - To begin the development, run `npm start` or `yarn start`.
40 - To create a production bundle, use `npm run build` or `yarn build`.
41 - -->
42 </body> 21 </body>
43 </html> 22 </html>
......
1 +<?xml version="1.0" standalone="no"?>
2 +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3 + "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4 +<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5 + width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
6 + preserveAspectRatio="xMidYMid meet">
7 +<metadata>
8 +Created by potrace 1.11, written by Peter Selinger 2001-2013
9 +</metadata>
10 +<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
11 +fill="#000000" stroke="none">
12 +<path d="M300 6180 c-105 -20 -218 -112 -268 -218 l-27 -57 0 -2410 0 -2410
13 +29 -58 c50 -98 123 -163 223 -196 l63 -21 3197 2 3198 3 65 31 c80 38 149 105
14 +187 182 l28 57 0 2040 0 2040 -33 67 c-48 99 -134 169 -242 198 -34 9 -494 12
15 +-1930 14 l-1885 1 -65 31 c-96 46 -150 109 -240 279 -70 132 -165 287 -194
16 +317 -46 47 -112 86 -175 103 -38 10 -247 13 -972 12 -508 0 -940 -3 -959 -7z"/>
17 +</g>
18 +</svg>
1 +{
2 + "name": "",
3 + "short_name": "",
4 + "icons": [
5 + {
6 + "src": "/android-chrome-192x192.png",
7 + "sizes": "192x192",
8 + "type": "image/png"
9 + },
10 + {
11 + "src": "/android-chrome-512x512.png",
12 + "sizes": "512x512",
13 + "type": "image/png"
14 + }
15 + ],
16 + "theme_color": "#ffffff",
17 + "background_color": "#ffffff",
18 + "display": "standalone"
19 +}
1 import React from "react"; 1 import React from "react";
2 +import { Switch, Route, Redirect } from "react-router-dom";
3 +
4 +import { Login } from "auth/Login";
5 +import { Signup } from "auth/Signup";
6 +import { useAuth, TokenContext } from "auth/useAuth";
7 +
8 +import { Page } from "layout/Page";
9 +import { FileList } from "file/FileList";
2 10
3 export function App() { 11 export function App() {
4 - return <div>Hello World!</div>; 12 + const token = useAuth();
13 + const root = token?.token?.user.rootFolder;
14 +
15 + return (
16 + <Switch>
17 + <Route path="/login">
18 + <Login login={token.login} />
19 + </Route>
20 + <Route path="/signup">
21 + <Signup />
22 + </Route>
23 + <Route>
24 + {token.token !== null ? (
25 + <TokenContext.Provider value={token}>
26 + <Page>
27 + <Switch>
28 + <Route path="/folder/:id">
29 + <FileList />
30 + </Route>
31 + <Route>
32 + <Redirect to={`/folder/${root}`} />
33 + </Route>
34 + </Switch>
35 + </Page>
36 + </TokenContext.Provider>
37 + ) : (
38 + <Redirect to="/login" />
39 + )}
40 + </Route>
41 + </Switch>
42 + );
5 } 43 }
......
1 +.layout {
2 + height: 100%;
3 + align-items: center;
4 + justify-content: center;
5 +}
6 +
7 +.content {
8 + width: 640px;
9 + flex-grow: 0;
10 + background: #fff;
11 + padding: 80px 50px 50px;
12 +}
13 +
14 +#components-form-demo-normal-login .login-form-forgot {
15 + float: right;
16 +}
17 +
18 +#components-form-demo-normal-login .ant-col-rtl .login-form-forgot {
19 + float: left;
20 +}
21 +
22 +#components-form-demo-normal-login .login-form-button {
23 + width: 100%;
24 +}
1 +import React, { useCallback, useState } from "react";
2 +import { Form, Input, Button, Checkbox, Layout } from "antd";
3 +import { UserOutlined, LockOutlined } from "@ant-design/icons";
4 +import { useHistory, Link } from "react-router-dom";
5 +
6 +import styles from "./Login.module.scss";
7 +
8 +export type LoginProps = {
9 + login: (
10 + username: string,
11 + password: string,
12 + remember: boolean
13 + ) => Promise<void>;
14 +};
15 +
16 +export function Login({ login }: LoginProps) {
17 + const [error, setError] = useState<boolean>(false);
18 + const history = useHistory();
19 +
20 + const handleLogin = useCallback(
21 + async ({ username, password, remember }) => {
22 + setError(false);
23 + try {
24 + await login(username, password, remember);
25 + history.push("/");
26 + } catch {
27 + setError(true);
28 + }
29 + },
30 + [login, history]
31 + );
32 +
33 + return (
34 + <Layout className={styles.layout}>
35 + <Layout.Content className={styles.content}>
36 + <Form
37 + name="login"
38 + initialValues={{ remember: true }}
39 + onFinish={handleLogin}
40 + >
41 + <Form.Item
42 + name="username"
43 + rules={[{ required: true, message: "아이디를 입력하세요" }]}
44 + {...(error && {
45 + validateStatus: "error",
46 + })}
47 + >
48 + <Input prefix={<UserOutlined />} placeholder="아이디" />
49 + </Form.Item>
50 + <Form.Item
51 + name="password"
52 + rules={[{ required: true, message: "비밀번호를 입력하세요" }]}
53 + {...(error && {
54 + validateStatus: "error",
55 + help: "로그인에 실패했습니다",
56 + })}
57 + >
58 + <Input
59 + prefix={<LockOutlined />}
60 + type="password"
61 + placeholder="비밀번호"
62 + />
63 + </Form.Item>
64 + <Form.Item>
65 + <Form.Item name="remember" valuePropName="checked" noStyle>
66 + <Checkbox>자동 로그인</Checkbox>
67 + </Form.Item>
68 + </Form.Item>
69 +
70 + <Form.Item>
71 + <Button type="primary" htmlType="submit">
72 + 로그인
73 + </Button>
74 + <Link to="/signup" style={{ marginLeft: 24 }}>
75 + 회원가입
76 + </Link>
77 + </Form.Item>
78 + </Form>
79 + </Layout.Content>
80 + </Layout>
81 + );
82 +}
1 +import React, { useCallback, useState } from "react";
2 +import { Form, Input, Button, Layout, message } from "antd";
3 +import { UserOutlined, LockOutlined, TagOutlined } from "@ant-design/icons";
4 +import { useHistory } from "react-router-dom";
5 +
6 +import styles from "./Login.module.scss";
7 +import ky from "ky";
8 +
9 +export function Signup() {
10 + const [error, setError] = useState<boolean>(false);
11 + const [check, setCheck] = useState<boolean>(false);
12 + const history = useHistory();
13 +
14 + const handleSignup = useCallback(
15 + async ({ user_id, password, password_check, name }) => {
16 + if (password !== password_check) {
17 + return setCheck(true);
18 + } else {
19 + setCheck(false);
20 + }
21 +
22 + setError(false);
23 + try {
24 + const body = new URLSearchParams();
25 + body.set("user_id", user_id);
26 + body.set("password", password);
27 + body.set("name", name);
28 +
29 + await ky.post("/users/signup/", { body });
30 +
31 + message.success("회원가입이 완료되었습니다");
32 + history.push("/login");
33 + } catch {
34 + setError(true);
35 + }
36 + },
37 + [history]
38 + );
39 +
40 + return (
41 + <Layout className={styles.layout}>
42 + <Layout.Content className={styles.content}>
43 + <Form name="signup" onFinish={handleSignup}>
44 + <Form.Item
45 + name="user_id"
46 + rules={[{ required: true, message: "아이디를 입력하세요" }]}
47 + {...(error && {
48 + validateStatus: "error",
49 + })}
50 + >
51 + <Input prefix={<UserOutlined />} placeholder="아이디" />
52 + </Form.Item>
53 + <Form.Item
54 + name="password"
55 + rules={[{ required: true, message: "비밀번호를 입력하세요" }]}
56 + {...(error && {
57 + validateStatus: "error",
58 + help: "로그인에 실패했습니다",
59 + })}
60 + >
61 + <Input
62 + prefix={<LockOutlined />}
63 + type="password"
64 + placeholder="비밀번호"
65 + />
66 + </Form.Item>
67 + <Form.Item
68 + name="password_check"
69 + rules={[
70 + { required: true, message: "비밀번호를 한번 더 입력하세요" },
71 + ]}
72 + {...(error && {
73 + validateStatus: "error",
74 + help: "로그인에 실패했습니다",
75 + })}
76 + {...(check && {
77 + validateStatus: "error",
78 + help: "비밀번호가 일치하지 않습니다",
79 + })}
80 + >
81 + <Input
82 + prefix={<LockOutlined />}
83 + type="password"
84 + placeholder="비밀번호 확인"
85 + />
86 + </Form.Item>
87 + <Form.Item
88 + name="name"
89 + rules={[{ required: true, message: "이름을 입력하세요" }]}
90 + {...(error && {
91 + validateStatus: "error",
92 + })}
93 + >
94 + <Input prefix={<TagOutlined />} placeholder="이름" />
95 + </Form.Item>
96 +
97 + <Form.Item>
98 + <Button type="primary" htmlType="submit">
99 + 회원 가입
100 + </Button>
101 + </Form.Item>
102 + </Form>
103 + </Layout.Content>
104 + </Layout>
105 + );
106 +}
1 +import React, { useState, useCallback } from "react";
2 +import ky from "ky";
3 +
4 +interface LoginResponse {
5 + access: string;
6 + refresh: string;
7 + exp: number;
8 + user: {
9 + int_id: number;
10 + user_id: string;
11 + name: string;
12 + total_size: number;
13 + current_size: number;
14 + root_folder: number;
15 + };
16 +}
17 +
18 +interface Token {
19 + accessToken: string;
20 + refreshToken: string;
21 + expiration: Date;
22 + user: {
23 + id: number;
24 + username: string;
25 + name: string;
26 + totalSize: number;
27 + currentSize: number;
28 + rootFolder: number;
29 + };
30 +}
31 +
32 +export const TokenContext = React.createContext<ReturnType<typeof useAuth>>(
33 + {} as any
34 +);
35 +
36 +export function useAuth() {
37 + const [token, setToken] = useState<Token | null>(() => {
38 + const item = localStorage.getItem("token");
39 + if (item) {
40 + const token = JSON.parse(item);
41 + token.expiration = new Date(token.expiration);
42 + return token;
43 + }
44 + return null;
45 + });
46 +
47 + const login = useCallback(
48 + async (username: string, password: string, remember: boolean) => {
49 + const body = new URLSearchParams();
50 + body.set("user_id", username);
51 + body.set("password", password);
52 +
53 + const response = await ky
54 + .post("/users/login/", { body })
55 + .json<LoginResponse>();
56 +
57 + const token = {
58 + accessToken: response.access,
59 + refreshToken: response.refresh,
60 + expiration: new Date(response.exp * 1000),
61 + user: {
62 + id: response.user.int_id,
63 + username: response.user.user_id,
64 + name: response.user.name,
65 + totalSize: response.user.total_size,
66 + currentSize: response.user.current_size,
67 + rootFolder: response.user.root_folder,
68 + },
69 + };
70 +
71 + setToken(token);
72 +
73 + if (remember) {
74 + localStorage.setItem("token", JSON.stringify(token));
75 + }
76 + },
77 + []
78 + );
79 +
80 + const logout = useCallback(() => setToken(null), []);
81 +
82 + return { token, login, logout };
83 +}
1 +import React, { useState } from "react";
2 +import { Button, Input } from "antd";
3 +
4 +export type CreateFolderPopoverProps = {
5 + onCreate: (name: string) => void;
6 + onCancel?: () => void;
7 +};
8 +
9 +export function CreateFolderPopover({
10 + onCreate,
11 + onCancel,
12 +}: CreateFolderPopoverProps) {
13 + const [name, setName] = useState<string>("");
14 + return (
15 + <div>
16 + <Input
17 + value={name}
18 + onChange={(event) => setName(event.target.value)}
19 + placeholder="이름"
20 + style={{ marginBottom: 10 }}
21 + />
22 + <div className="ant-popover-buttons">
23 + <Button size="small" onClick={onCancel}>
24 + 취소
25 + </Button>
26 + <Button type="primary" size="small" onClick={() => onCreate(name)}>
27 + 생성
28 + </Button>
29 + </div>
30 + </div>
31 + );
32 +}
1 +import React, { useState, Fragment } from "react";
2 +import { Popconfirm, Popover, Button, message } from "antd";
3 +import { FileItem } from "./useFileList";
4 +import styles from "./FileItemActions.module.scss";
5 +import { FileListPopover } from "./FileListPopover";
6 +import { FileRenamePopover } from "./FileRenamePopover";
7 +
8 +export type FileItemActionsProps = {
9 + item: FileItem;
10 + onRename: (id: number, name: string) => void;
11 + onMove: (id: number, to: number) => void;
12 + onCopy: (id: number, to: number) => void;
13 + onDelete: (id: number) => void;
14 +};
15 +
16 +export function FileItemActions({
17 + item,
18 + onRename,
19 + onMove,
20 + onCopy,
21 + onDelete,
22 +}: FileItemActionsProps) {
23 + const [rename, setRename] = useState<boolean>(false);
24 + const [move, setMove] = useState<boolean>(false);
25 + const [copy, setCopy] = useState<boolean>(false);
26 +
27 + return (
28 + <div className={styles.actions}>
29 + <Popover
30 + title="변경할 이름을 입력하세요"
31 + content={
32 + <FileRenamePopover
33 + name={item.name}
34 + onRename={(name: string) => {
35 + if (name === item.name) {
36 + return message.error("동일한 이름으로는 변경할 수 없습니다");
37 + }
38 + if (!name) {
39 + return message.error("변경할 이름을 입력하세요");
40 + }
41 + onRename(item.id, name);
42 + setRename(false);
43 + }}
44 + onCancel={() => setRename(false)}
45 + />
46 + }
47 + trigger="click"
48 + visible={rename}
49 + onVisibleChange={setRename}
50 + >
51 + <Button type="link" size="small">
52 + 이름 변경
53 + </Button>
54 + </Popover>
55 + {!item.is_folder && (
56 + <Button type="link" size="small">
57 + 공유
58 + </Button>
59 + )}
60 + <Popover
61 + title="이동할 폴더를 선택하세요"
62 + content={
63 + <FileListPopover
64 + root={item.parent}
65 + onSelect={(to: number) => {
66 + if (to === item.parent) {
67 + return message.error("같은 폴더로는 이동할 수 없습니다");
68 + }
69 + onMove(item.id, to);
70 + setMove(false);
71 + }}
72 + onCancel={() => setMove(false)}
73 + />
74 + }
75 + trigger="click"
76 + visible={move}
77 + onVisibleChange={setMove}
78 + >
79 + <Button type="link" size="small">
80 + 이동
81 + </Button>
82 + </Popover>
83 + {!item.is_folder && (
84 + <Popover
85 + title="복사할 폴더를 선택하세요"
86 + content={
87 + <FileListPopover
88 + root={item.parent}
89 + onSelect={(to: number) => {
90 + onCopy(item.id, to);
91 + setCopy(false);
92 + }}
93 + onCancel={() => setCopy(false)}
94 + />
95 + }
96 + trigger="click"
97 + visible={copy}
98 + onVisibleChange={setCopy}
99 + >
100 + <Button type="link" size="small">
101 + 복사
102 + </Button>
103 + </Popover>
104 + )}
105 + {!item.is_folder && (
106 + <Popconfirm
107 + title="정말로 삭제하시겠습니까?"
108 + onConfirm={() => onDelete(item.id)}
109 + okText="삭제"
110 + cancelText="취소"
111 + >
112 + <Button type="link" size="small">
113 + 삭제
114 + </Button>
115 + </Popconfirm>
116 + )}
117 + </div>
118 + );
119 +}
1 +.header {
2 + display: flex;
3 + justify-content: space-between;
4 + margin-bottom: 20px;
5 +}
1 +import React, { useCallback, useState, useContext } from "react";
2 +import { Table, message, Button, Popover } from "antd";
3 +import { ColumnsType } from "antd/lib/table";
4 +import filesize from "filesize";
5 +
6 +import { useParams } from "react-router-dom";
7 +import { useFileList, FileItem } from "./useFileList";
8 +import { useApi } from "util/useApi";
9 +import { FileListItem } from "./FileListItem";
10 +import { FileItemActions } from "./FileItemActions";
11 +
12 +import styles from "./FileList.module.scss";
13 +import { FileUploadPopover } from "./FileUploadPopover";
14 +import { CreateFolderPopover } from "./CreateFolderPopover";
15 +import { TokenContext } from "auth/useAuth";
16 +
17 +export function FileList() {
18 + const id = useParams<{ id: string }>().id;
19 + const { data, reload } = useFileList(id);
20 +
21 + const [upload, setUpload] = useState<boolean>(false);
22 + const [createFolder, setCreateFolder] = useState<boolean>(false);
23 +
24 + const { token } = useContext(TokenContext);
25 + const userId = token?.user.id || "";
26 +
27 + const api = useApi();
28 +
29 + const handleCreateFolder = useCallback(
30 + async (id: number, name: string) => {
31 + try {
32 + const body = new URLSearchParams();
33 + body.set("name", name);
34 +
35 + await api.post(`/items/${id}/children/`, {
36 + searchParams: {
37 + user_id: userId,
38 + },
39 + body,
40 + });
41 + await reload();
42 +
43 + message.info("폴더가 생성되었습니다");
44 + } catch {
45 + message.error("폴더 생성에 실패했습니다");
46 + }
47 + },
48 + [api, reload, userId]
49 + );
50 +
51 + const handleRename = useCallback(
52 + async (id: number, name: string) => {
53 + try {
54 + const body = new URLSearchParams();
55 + body.set("name", name);
56 +
57 + await api.post(`/items/${id}/move/`, { body });
58 + await reload();
59 +
60 + message.info("이름이 변경되었습니다");
61 + } catch {
62 + message.error("이름 변경에 실패했습니다");
63 + }
64 + },
65 + [api, reload]
66 + );
67 +
68 + const handleMove = useCallback(
69 + async (id: number, to: number) => {
70 + try {
71 + const body = new URLSearchParams();
72 + body.set("parent", to.toString(10));
73 +
74 + await api.post(`/items/${id}/move/`, { body });
75 + await reload();
76 +
77 + message.info("이동되었습니다");
78 + } catch {
79 + message.error("파일 이동에 실패했습니다");
80 + }
81 + },
82 + [api, reload]
83 + );
84 +
85 + const handleCopy = useCallback(
86 + async (id: number, to: number) => {
87 + try {
88 + const body = new URLSearchParams();
89 + body.set("parent", to.toString(10));
90 +
91 + await api.post(`/items/${id}/copy/`, { body });
92 + await reload();
93 +
94 + message.info("복사되었습니다");
95 + } catch {
96 + message.error("파일 복사에 실패했습니다");
97 + }
98 + },
99 + [api, reload]
100 + );
101 +
102 + const handleDelete = useCallback(
103 + async (id: number) => {
104 + try {
105 + await api.delete(`/items/${id}/`);
106 + await reload();
107 + message.info("삭제되었습니다");
108 + } catch {
109 + message.error("파일 삭제에 실패했습니다");
110 + }
111 + },
112 + [api, reload]
113 + );
114 +
115 + if (!data) {
116 + return null;
117 + }
118 +
119 + const list = [...data.list].sort((itemA, itemB) =>
120 + itemA.is_folder === itemB.is_folder ? 0 : itemA.is_folder ? -1 : 1
121 + );
122 +
123 + if (data.parent !== null) {
124 + list.unshift(({
125 + id: data.parent,
126 + is_folder: true,
127 + name: "..",
128 + file_type: "folder",
129 + } as unknown) as FileItem);
130 + }
131 +
132 + return (
133 + <div>
134 + <div className={styles.header}>
135 + <div>{data.parent !== null && <h3>{data.name}</h3>}</div>
136 + <div>
137 + <Popover
138 + content={<FileUploadPopover root={data.id} reload={reload} />}
139 + trigger="click"
140 + visible={upload}
141 + onVisibleChange={setUpload}
142 + >
143 + <Button type="link" size="small">
144 + 파일 업로드
145 + </Button>
146 + </Popover>
147 + <Popover
148 + title="폴더 이름을 입력하세요"
149 + content={
150 + <CreateFolderPopover
151 + onCreate={(name: string) => {
152 + if (!name) {
153 + return message.error("폴더 이름을 입력하세요");
154 + }
155 + handleCreateFolder(data.id, name);
156 + setCreateFolder(false);
157 + }}
158 + onCancel={() => setCreateFolder(false)}
159 + />
160 + }
161 + trigger="click"
162 + visible={createFolder}
163 + onVisibleChange={setCreateFolder}
164 + >
165 + <Button type="link" size="small">
166 + 새 폴더
167 + </Button>
168 + </Popover>
169 + </div>
170 + </div>
171 + <Table
172 + rowKey="id"
173 + columns={getColumns({
174 + handleRename,
175 + handleMove,
176 + handleCopy,
177 + handleDelete,
178 + })}
179 + dataSource={list}
180 + pagination={false}
181 + locale={{
182 + emptyText: "파일이 없습니다",
183 + }}
184 + />
185 + </div>
186 + );
187 +}
188 +
189 +type GetColumnsParams = {
190 + handleRename: (id: number, name: string) => void;
191 + handleMove: (id: number, to: number) => void;
192 + handleCopy: (id: number, to: number) => void;
193 + handleDelete: (id: number) => void;
194 +};
195 +
196 +function getColumns({
197 + handleRename,
198 + handleMove,
199 + handleCopy,
200 + handleDelete,
201 +}: GetColumnsParams): ColumnsType<FileItem> {
202 + return [
203 + {
204 + title: "이름",
205 + key: "name",
206 + dataIndex: "name",
207 + render: (_name: string, item) => <FileListItem item={item} />,
208 + },
209 + {
210 + title: "크기",
211 + key: "size",
212 + dataIndex: "size",
213 + width: 120,
214 + render: (bytes: number, item) =>
215 + item.is_folder ? "-" : filesize(bytes, { round: 0 }),
216 + },
217 + {
218 + title: "",
219 + key: "action",
220 + dataIndex: "",
221 + width: 300,
222 + render: (__: any, item) => (
223 + <FileItemActions
224 + item={item}
225 + onRename={handleRename}
226 + onMove={handleMove}
227 + onCopy={handleCopy}
228 + onDelete={handleDelete}
229 + />
230 + ),
231 + },
232 + ];
233 +}
1 +import React from "react";
2 +import { FileItem } from "./useFileList";
3 +import { Link } from "react-router-dom";
4 +import { Button } from "antd";
5 +
6 +import { FolderFilled, FileFilled } from "@ant-design/icons";
7 +import { useDownload } from "./useDownload";
8 +
9 +export function FileListItem({ item }: { item: FileItem }) {
10 + const download = useDownload();
11 + return item.is_folder ? (
12 + <Link
13 + className="ant-btn ant-btn-link ant-btn-sm"
14 + to={`/folder/${item.id}`}
15 + style={{ padding: 0, color: "#001529" }}
16 + >
17 + <FolderFilled /> <span>{item.name}</span>
18 + </Link>
19 + ) : (
20 + <Button
21 + type="link"
22 + size="small"
23 + onClick={() => download(item.id)}
24 + style={{ padding: 0, color: "#001529" }}
25 + >
26 + <FileFilled /> {item.name}
27 + </Button>
28 + );
29 +}
1 +.list {
2 + list-style: none;
3 + padding-left: 0;
4 +}
1 +import React, { useState } from "react";
2 +import { useFileList } from "./useFileList";
3 +import { Button } from "antd";
4 +
5 +import styles from "./FileListPopover.module.scss";
6 +
7 +export type FileListPopoverProps = {
8 + root: number;
9 + onSelect: (id: number) => void;
10 + onCancel?: () => void;
11 +};
12 +
13 +export function FileListPopover({
14 + root,
15 + onSelect,
16 + onCancel,
17 +}: FileListPopoverProps) {
18 + const [id, setId] = useState<number>(root);
19 + const { data } = useFileList(id);
20 +
21 + if (!data) {
22 + return null;
23 + }
24 +
25 + const list = data.list
26 + .filter((item) => item.is_folder)
27 + .map((item) => ({ id: item.id, name: item.name }));
28 +
29 + if (data.parent !== null) {
30 + list.unshift({ id: data.parent, name: ".." });
31 + }
32 +
33 + return (
34 + <div>
35 + <div>{data.name}</div>
36 + <ul className={styles.list}>
37 + {list.map((item) => (
38 + <li key={item.id}>
39 + <Button type="link" size="small" onClick={() => setId(item.id)}>
40 + {item.name}
41 + </Button>
42 + </li>
43 + ))}
44 + </ul>
45 + <div className="ant-popover-buttons">
46 + <Button size="small" onClick={onCancel}>
47 + 취소
48 + </Button>
49 + <Button type="primary" size="small" onClick={() => onSelect(id)}>
50 + 선택
51 + </Button>
52 + </div>
53 + </div>
54 + );
55 +}
1 +import React, { useState } from "react";
2 +import { Button, Input } from "antd";
3 +
4 +export type FileRenamePopoverProps = {
5 + name: string;
6 + onRename: (name: string) => void;
7 + onCancel?: () => void;
8 +};
9 +
10 +export function FileRenamePopover({
11 + name: oldName,
12 + onRename,
13 + onCancel,
14 +}: FileRenamePopoverProps) {
15 + const [name, setName] = useState<string>(oldName);
16 + return (
17 + <div>
18 + <Input
19 + value={name}
20 + onChange={(event) => setName(event.target.value)}
21 + placeholder="이름"
22 + style={{ marginBottom: 10 }}
23 + />
24 + <div className="ant-popover-buttons">
25 + <Button size="small" onClick={onCancel}>
26 + 취소
27 + </Button>
28 + <Button type="primary" size="small" onClick={() => onRename(name)}>
29 + 변경
30 + </Button>
31 + </div>
32 + </div>
33 + );
34 +}
1 +import React, { useCallback, useRef } from "react";
2 +import Dragger from "antd/lib/upload/Dragger";
3 +import { InboxOutlined } from "@ant-design/icons";
4 +import { useApi } from "util/useApi";
5 +
6 +export type FileUploadPopoverProps = {
7 + root: number;
8 + reload: () => void;
9 +};
10 +
11 +export function FileUploadPopover({ root, reload }: FileUploadPopoverProps) {
12 + const api = useApi();
13 + const fields = useRef<any>();
14 + const stateMap = useRef<Record<string, number>>({});
15 +
16 + const getS3Object = useCallback(
17 + async (file: File) => {
18 + const body = new URLSearchParams();
19 + body.set("name", file.name);
20 + body.set("size", file.size.toString());
21 +
22 + const response = await api
23 + .post(`/items/${root}/upload/`, { body })
24 + .json<any>();
25 +
26 + stateMap.current[file.name] = response.item.id;
27 + fields.current = response.signed_url.fields;
28 + return response.signed_url.url;
29 + },
30 + [api, root]
31 + );
32 +
33 + const setObjectStatus = useCallback(
34 + async (info) => {
35 + if (info.file.status === "done") {
36 + const id = stateMap.current[info.file.name];
37 + if (typeof id !== "undefined") {
38 + const body = new URLSearchParams();
39 + body.set("item_id", id.toString());
40 + await api.post(`/items/${id}/status/`, { body });
41 + reload();
42 + }
43 + }
44 + },
45 + [api, reload]
46 + );
47 +
48 + return (
49 + <Dragger
50 + name="file"
51 + multiple={true}
52 + action={getS3Object}
53 + data={() => fields.current}
54 + onChange={setObjectStatus}
55 + style={{ padding: 40 }}
56 + >
57 + <p className="ant-upload-drag-icon">
58 + <InboxOutlined />
59 + </p>
60 + <p className="ant-upload-text">
61 + 업로드할 파일을 선택하거나 드래그 하세요
62 + </p>
63 + <p className="ant-upload-hint"></p>
64 + </Dragger>
65 + );
66 +}
1 +import { useApi } from "util/useApi";
2 +import { useCallback } from "react";
3 +
4 +function downloadURL(url: string, name: string) {
5 + const link = document.createElement("a");
6 + link.setAttribute("download", name);
7 + link.href = url;
8 + link.click();
9 +}
10 +
11 +export function useDownload() {
12 + const api = useApi();
13 + const download = useCallback(
14 + async (id: number) => {
15 + const response = await api.get(`/items/${id}/`).json<any>();
16 + const { signed_url, name } = response.data;
17 + downloadURL(signed_url, name);
18 + },
19 + [api]
20 + );
21 + return download;
22 +}
1 +import { useState, useCallback, useEffect } from "react";
2 +import ky from "ky";
3 +
4 +interface FileListData extends FileItem {
5 + list: FileItem[];
6 +}
7 +
8 +interface FileListResponse {
9 + data: FileListData;
10 +}
11 +
12 +export interface FileItem {
13 + is_folder: boolean;
14 + name: string;
15 + file_type: "folder" | "file";
16 + path: string;
17 + parent: number;
18 + user_id: number;
19 + size: number;
20 + is_deleted: boolean;
21 + created_time: string | null;
22 + updated_time: string;
23 + status: boolean;
24 + id: number;
25 +}
26 +
27 +export function useFileList(id: string | number) {
28 + const [data, setData] = useState<FileListData | null>(null);
29 +
30 + const reload = useCallback(async () => {
31 + const response = await ky
32 + .get(`/items/${id}/children/`)
33 + .json<FileListResponse>();
34 +
35 + setData(response.data);
36 + }, [id]);
37 +
38 + useEffect(() => {
39 + reload();
40 + }, [reload]);
41 +
42 + return { data, reload };
43 +}
1 -body { 1 +#root {
2 - margin: 0; 2 + height: 100%;
3 - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
4 - "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
5 - sans-serif;
6 - -webkit-font-smoothing: antialiased;
7 - -moz-osx-font-smoothing: grayscale;
8 -}
9 -
10 -code {
11 - font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
12 - monospace;
13 } 3 }
......
1 import React from "react"; 1 import React from "react";
2 import ReactDOM from "react-dom"; 2 import ReactDOM from "react-dom";
3 +import { BrowserRouter } from "react-router-dom";
3 4
5 +import "antd/dist/antd.css";
4 import "./index.css"; 6 import "./index.css";
5 7
6 import { App } from "./App"; 8 import { App } from "./App";
...@@ -8,9 +10,9 @@ import { App } from "./App"; ...@@ -8,9 +10,9 @@ import { App } from "./App";
8 import * as serviceWorker from "./serviceWorker"; 10 import * as serviceWorker from "./serviceWorker";
9 11
10 ReactDOM.render( 12 ReactDOM.render(
11 - <React.StrictMode> 13 + <BrowserRouter>
12 <App /> 14 <App />
13 - </React.StrictMode>, 15 + </BrowserRouter>,
14 document.getElementById("root") 16 document.getElementById("root")
15 ); 17 );
16 18
......
1 +.layout {
2 + height: 100%;
3 +}
4 +
5 +.header {
6 + display: flex;
7 + align-items: center;
8 + justify-content: space-between;
9 +}
10 +
11 +.content {
12 + background: #fff;
13 + padding: 25px 50px;
14 +}
15 +
16 +.logo {
17 + width: 120px;
18 + height: 31px;
19 + margin: 16px 24px 16px 0;
20 + float: left;
21 + display: flex;
22 + align-items: center;
23 + justify-content: center;
24 + color: white;
25 + font-size: 24px;
26 + font-weight: bold;
27 +}
28 +
29 +.user {
30 + display: flex;
31 + align-items: center;
32 + color: white;
33 +
34 + svg {
35 + width: 28px;
36 + height: 28px;
37 + }
38 +
39 + &:hover,
40 + &:active,
41 + &:focus {
42 + color: rgba(255, 255, 255, 0.65);
43 + }
44 +}
45 +
46 +.footer {
47 + text-align: center;
48 +}
1 +import React, { useContext } from "react";
2 +import { Layout, Popover, Button } from "antd";
3 +import { UserOutlined } from "@ant-design/icons";
4 +import { TokenContext } from "auth/useAuth";
5 +
6 +import styles from "./Page.module.scss";
7 +
8 +export function Page({ children }: { children: React.ReactNode }) {
9 + const { token, logout } = useContext(TokenContext);
10 + return (
11 + <Layout className={styles.layout}>
12 + <Layout.Header className={styles.header}>
13 + <div className={styles.logo}>KHUDrive</div>
14 + <Popover
15 + content={
16 + <div>
17 + {token?.user.name}
18 + <Button type="link" onClick={logout}>
19 + 로그아웃
20 + </Button>
21 + </div>
22 + }
23 + trigger="click"
24 + >
25 + <Button type="text" className={styles.user}>
26 + <UserOutlined />
27 + </Button>
28 + </Popover>
29 + </Layout.Header>
30 + <Layout.Content className={styles.content}>{children}</Layout.Content>
31 + <Layout.Footer className={styles.footer}>
32 + © 2020 Cloud Computing Team C
33 + </Layout.Footer>
34 + </Layout>
35 + );
36 +}
1 +import { useMemo } from "react";
2 +import ky from "ky";
3 +
4 +// TODO: Implement Auth
5 +export function useApi() {
6 + return useMemo(() => {
7 + return ky.extend({
8 + hooks: {
9 + beforeRequest: [],
10 + },
11 + });
12 + }, []);
13 +}
1 +import { useRef, useEffect } from "react";
2 +
3 +export function usePrevious<T>(value: T) {
4 + const ref = useRef<T>();
5 + useEffect(() => {
6 + ref.current = value;
7 + });
8 + return ref.current as T;
9 +}
1 +{
2 + "AWS_SESSION_TOKEN": "",
3 + "AWS_SECRET_ACCESS_KEY": "secret_key",
4 + "AWS_ACCESS_KEY_ID": "access_key",
5 + "AWS_REGION": "us-west-2",
6 + "AWS_STORAGE_BUCKET_NAME": "bucket",
7 + "AWS_ENDPOINT_URL": "http://localhost:39000"
8 +}
...\ No newline at end of file ...\ No newline at end of file