diff --git a/.husky/pre-push b/.husky/pre-push
index 36b971da..9c96ce93 100755
--- a/.husky/pre-push
+++ b/.husky/pre-push
@@ -1,5 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
-pnpm lint
pnpm build
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 44a73ec3..ef29f04d 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -3,5 +3,8 @@
{
"mode": "auto"
}
- ]
+ ],
+ "editor.codeActionsOnSave": {
+ "source.fixAll": true
+ }
}
diff --git a/apps/shelter/package.json b/apps/shelter/package.json
index 35d9b8ac..245d34dc 100644
--- a/apps/shelter/package.json
+++ b/apps/shelter/package.json
@@ -34,8 +34,12 @@
"@vitejs/plugin-react-swc": "^3.4.0",
"eslint": "^8.45.0",
"eslint-config-custom": "workspace:*",
+ "msw": "^2.0.1",
"tsconfig": "workspace:*",
"typescript": "^5.0.2",
"vite": "^4.4.5"
+ },
+ "msw": {
+ "workerDirectory": "public"
}
-}
+}
\ No newline at end of file
diff --git a/apps/shelter/public/mockServiceWorker.js b/apps/shelter/public/mockServiceWorker.js
new file mode 100644
index 00000000..33a657b7
--- /dev/null
+++ b/apps/shelter/public/mockServiceWorker.js
@@ -0,0 +1,292 @@
+/* eslint-disable */
+/* tslint:disable */
+
+/**
+ * Mock Service Worker (2.0.1).
+ * @see https://github.com/mswjs/msw
+ * - Please do NOT modify this file.
+ * - Please do NOT serve this file on production.
+ */
+
+const INTEGRITY_CHECKSUM = '0877fcdc026242810f5bfde0d7178db4'
+const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
+const activeClientIds = new Set()
+
+self.addEventListener('install', function () {
+ self.skipWaiting()
+})
+
+self.addEventListener('activate', function (event) {
+ event.waitUntil(self.clients.claim())
+})
+
+self.addEventListener('message', async function (event) {
+ const clientId = event.source.id
+
+ if (!clientId || !self.clients) {
+ return
+ }
+
+ const client = await self.clients.get(clientId)
+
+ if (!client) {
+ return
+ }
+
+ const allClients = await self.clients.matchAll({
+ type: 'window',
+ })
+
+ switch (event.data) {
+ case 'KEEPALIVE_REQUEST': {
+ sendToClient(client, {
+ type: 'KEEPALIVE_RESPONSE',
+ })
+ break
+ }
+
+ case 'INTEGRITY_CHECK_REQUEST': {
+ sendToClient(client, {
+ type: 'INTEGRITY_CHECK_RESPONSE',
+ payload: INTEGRITY_CHECKSUM,
+ })
+ break
+ }
+
+ case 'MOCK_ACTIVATE': {
+ activeClientIds.add(clientId)
+
+ sendToClient(client, {
+ type: 'MOCKING_ENABLED',
+ payload: true,
+ })
+ break
+ }
+
+ case 'MOCK_DEACTIVATE': {
+ activeClientIds.delete(clientId)
+ break
+ }
+
+ case 'CLIENT_CLOSED': {
+ activeClientIds.delete(clientId)
+
+ const remainingClients = allClients.filter((client) => {
+ return client.id !== clientId
+ })
+
+ // Unregister itself when there are no more clients
+ if (remainingClients.length === 0) {
+ self.registration.unregister()
+ }
+
+ break
+ }
+ }
+})
+
+self.addEventListener('fetch', function (event) {
+ const { request } = event
+
+ // Bypass navigation requests.
+ if (request.mode === 'navigate') {
+ return
+ }
+
+ // Opening the DevTools triggers the "only-if-cached" request
+ // that cannot be handled by the worker. Bypass such requests.
+ if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {
+ return
+ }
+
+ // Bypass all requests when there are no active clients.
+ // Prevents the self-unregistered worked from handling requests
+ // after it's been deleted (still remains active until the next reload).
+ if (activeClientIds.size === 0) {
+ return
+ }
+
+ // Generate unique request ID.
+ const requestId = crypto.randomUUID()
+ event.respondWith(handleRequest(event, requestId))
+})
+
+async function handleRequest(event, requestId) {
+ const client = await resolveMainClient(event)
+ const response = await getResponse(event, client, requestId)
+
+ // Send back the response clone for the "response:*" life-cycle events.
+ // Ensure MSW is active and ready to handle the message, otherwise
+ // this message will pend indefinitely.
+ if (client && activeClientIds.has(client.id)) {
+ ;(async function () {
+ const responseClone = response.clone()
+ // When performing original requests, response body will
+ // always be a ReadableStream, even for 204 responses.
+ // But when creating a new Response instance on the client,
+ // the body for a 204 response must be null.
+ const responseBody = response.status === 204 ? null : responseClone.body
+
+ sendToClient(
+ client,
+ {
+ type: 'RESPONSE',
+ payload: {
+ requestId,
+ isMockedResponse: IS_MOCKED_RESPONSE in response,
+ type: responseClone.type,
+ status: responseClone.status,
+ statusText: responseClone.statusText,
+ body: responseBody,
+ headers: Object.fromEntries(responseClone.headers.entries()),
+ },
+ },
+ [responseBody],
+ )
+ })()
+ }
+
+ return response
+}
+
+// Resolve the main client for the given event.
+// Client that issues a request doesn't necessarily equal the client
+// that registered the worker. It's with the latter the worker should
+// communicate with during the response resolving phase.
+async function resolveMainClient(event) {
+ const client = await self.clients.get(event.clientId)
+
+ if (client?.frameType === 'top-level') {
+ return client
+ }
+
+ const allClients = await self.clients.matchAll({
+ type: 'window',
+ })
+
+ return allClients
+ .filter((client) => {
+ // Get only those clients that are currently visible.
+ return client.visibilityState === 'visible'
+ })
+ .find((client) => {
+ // Find the client ID that's recorded in the
+ // set of clients that have registered the worker.
+ return activeClientIds.has(client.id)
+ })
+}
+
+async function getResponse(event, client, requestId) {
+ const { request } = event
+
+ // Clone the request because it might've been already used
+ // (i.e. its body has been read and sent to the client).
+ const requestClone = request.clone()
+
+ function passthrough() {
+ const headers = Object.fromEntries(requestClone.headers.entries())
+
+ // Remove internal MSW request header so the passthrough request
+ // complies with any potential CORS preflight checks on the server.
+ // Some servers forbid unknown request headers.
+ delete headers['x-msw-intention']
+
+ return fetch(requestClone, { headers })
+ }
+
+ // Bypass mocking when the client is not active.
+ if (!client) {
+ return passthrough()
+ }
+
+ // Bypass initial page load requests (i.e. static assets).
+ // The absence of the immediate/parent client in the map of the active clients
+ // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet
+ // and is not ready to handle requests.
+ if (!activeClientIds.has(client.id)) {
+ return passthrough()
+ }
+
+ // Bypass requests with the explicit bypass header.
+ // Such requests can be issued by "ctx.fetch()".
+ const mswIntention = request.headers.get('x-msw-intention')
+ if (['bypass', 'passthrough'].includes(mswIntention)) {
+ return passthrough()
+ }
+
+ // Notify the client that a request has been intercepted.
+ const requestBuffer = await request.arrayBuffer()
+ const clientMessage = await sendToClient(
+ client,
+ {
+ type: 'REQUEST',
+ payload: {
+ id: requestId,
+ url: request.url,
+ mode: request.mode,
+ method: request.method,
+ headers: Object.fromEntries(request.headers.entries()),
+ cache: request.cache,
+ credentials: request.credentials,
+ destination: request.destination,
+ integrity: request.integrity,
+ redirect: request.redirect,
+ referrer: request.referrer,
+ referrerPolicy: request.referrerPolicy,
+ body: requestBuffer,
+ keepalive: request.keepalive,
+ },
+ },
+ [requestBuffer],
+ )
+
+ switch (clientMessage.type) {
+ case 'MOCK_RESPONSE': {
+ return respondWithMock(clientMessage.data)
+ }
+
+ case 'MOCK_NOT_FOUND': {
+ return passthrough()
+ }
+ }
+
+ return passthrough()
+}
+
+function sendToClient(client, message, transferrables = []) {
+ return new Promise((resolve, reject) => {
+ const channel = new MessageChannel()
+
+ channel.port1.onmessage = (event) => {
+ if (event.data && event.data.error) {
+ return reject(event.data.error)
+ }
+
+ resolve(event.data)
+ }
+
+ client.postMessage(
+ message,
+ [channel.port2].concat(transferrables.filter(Boolean)),
+ )
+ })
+}
+
+async function respondWithMock(response) {
+ // Setting response status code to 0 is a no-op.
+ // However, when responding with a "Response.error()", the produced Response
+ // instance will have status code set to 0. Since it's not possible to create
+ // a Response instance with status code 0, handle that use-case separately.
+ if (response.status === 0) {
+ return Response.error()
+ }
+
+ const mockedResponse = new Response(response.body, response)
+
+ Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, {
+ value: true,
+ enumerable: true,
+ })
+
+ return mockedResponse
+}
diff --git a/apps/shelter/src/main.tsx b/apps/shelter/src/main.tsx
index b2677542..23ceb8cf 100644
--- a/apps/shelter/src/main.tsx
+++ b/apps/shelter/src/main.tsx
@@ -1,10 +1,31 @@
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App.tsx';
-ReactDOM.createRoot(document.getElementById('root')!).render(
-
-
- ,
-);
+async function deferRender() {
+ if (import.meta.env.MODE !== 'development') {
+ return;
+ }
+
+ const { worker } = await import('./mocks/browser.ts');
+
+ // `worker.start()` returns a Promise that resolves
+ // once the Service Worker is up and ready to intercept requests.
+ return worker.start();
+}
+
+const queryClient = new QueryClient();
+
+deferRender().then(() => {
+ ReactDOM.createRoot(document.getElementById('root')!).render(
+
+
+
+
+
+ ,
+ );
+});
diff --git a/apps/shelter/src/mocks/browser.ts b/apps/shelter/src/mocks/browser.ts
new file mode 100644
index 00000000..c95883bc
--- /dev/null
+++ b/apps/shelter/src/mocks/browser.ts
@@ -0,0 +1,5 @@
+import { setupWorker } from 'msw/browser';
+
+import { handlers } from './handlers';
+
+export const worker = setupWorker(...handlers);
diff --git a/apps/shelter/src/mocks/handlers.ts b/apps/shelter/src/mocks/handlers.ts
new file mode 100644
index 00000000..b091270d
--- /dev/null
+++ b/apps/shelter/src/mocks/handlers.ts
@@ -0,0 +1,41 @@
+import { delay, http, HttpResponse } from 'msw';
+
+const ALL_POST = [
+ {
+ userId: 1,
+ id: 1,
+ title: '모킹 포스트 1',
+ body: '모킹된 포스트에요. MSW를 이용했어요.',
+ },
+ {
+ userId: 1,
+ id: 2,
+ title: '모킹 포스트 2',
+ body: '모킹된 포스트에요. MSW를 이용했어요.',
+ },
+ {
+ userId: 1,
+ id: 3,
+ title: '모킹 포스트 3',
+ body: '모킹된 포스트에요. MSW를 이용했어요.',
+ },
+ {
+ userId: 1,
+ id: 4,
+ title: '모킹 포스트 4',
+ body: '모킹된 포스트에요. MSW를 이용했어요.',
+ },
+ {
+ userId: 1,
+ id: 5,
+ title: '모킹 포스트 5',
+ body: '모킹된 포스트에요. MSW를 이용했어요.',
+ },
+];
+
+export const handlers = [
+ http.get('/example/posts', async () => {
+ await delay(200);
+ return HttpResponse.json(ALL_POST);
+ }),
+];
diff --git a/packages/eslint-config-custom/index.js b/packages/eslint-config-custom/index.js
index c489c427..17e95350 100644
--- a/packages/eslint-config-custom/index.js
+++ b/packages/eslint-config-custom/index.js
@@ -9,15 +9,9 @@ module.exports = {
'plugin:prettier/recommended',
'plugin:react-hooks/recommended',
'plugin:react/recommended',
+ 'plugin:react/jsx-runtime',
],
- plugins: [
- '@typescript-eslint',
- 'simple-import-sort',
- 'import',
- 'unused-imports',
- 'react-refresh',
- 'react',
- ],
+ plugins: ['simple-import-sort', 'import', 'unused-imports', 'react-refresh'],
parserOptions: {
sourceType: 'module',
ecmaVersion: 2020,
@@ -51,18 +45,18 @@ module.exports = {
],
'no-console': ['warn', { allow: ['warn', 'error'] }], // console.log 금지
- 'react/self-closing-comp': 'warn',
- curly: 'warn',
- 'react-refresh/only-export-components': ['warn'], // jsx에서 export default 하나만 가능
- eqeqeq: 'warn', // 일치 연산자 사용 필수
- 'dot-notation': 'warn', // 가능하다면 dot notation 사용
- 'react/destructuring-assignment': 'warn', //state, prop 등에 구조분해 할당 적용
- 'react/jsx-pascal-case': 'warn', // 컴포넌트 이름은 PascalCase로
- 'react/no-direct-mutation-state': 'warn', // state 직접 수정 금지
- 'react/jsx-no-useless-fragment': 'warn', // 불필요한 fragment 금지
- 'react/no-unused-state': 'warn', // 사용되지 않는 state
- 'react/jsx-key': 'warn', // 반복문으로 생성하는 요소에 key 강제
- 'react/jsx-curly-brace-presence': 'warn', // jsx 내 불필요한 중괄호 금지
+ 'react/self-closing-comp': 'error',
+ curly: 'error',
+ 'react-refresh/only-export-components': ['error'], // jsx에서 export default 하나만 가능
+ eqeqeq: 'error', // 일치 연산자 사용 필수
+ 'dot-notation': 'error', // 가능하다면 dot notation 사용
+ 'react/destructuring-assignment': 'error', //state, prop 등에 구조분해 할당 적용
+ 'react/jsx-pascal-case': 'error', // 컴포넌트 이름은 PascalCase로
+ 'react/no-direct-mutation-state': 'error', // state 직접 수정 금지
+ 'react/jsx-no-useless-fragment': 'error', // 불필요한 fragment 금지
+ 'react/no-unused-state': 'error', // 사용되지 않는 state
+ 'react/jsx-key': 'error', // 반복문으로 생성하는 요소에 key 강제
+ 'react/jsx-curly-brace-presence': 'error', // jsx 내 불필요한 중괄호 금지
'react/no-unescaped-entities': 'off', //특수문자 허용
'react/react-in-jsx-scope': 'off', //import React 검사 끄기
'react/prop-types': 'off',
diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json
index ec0d2333..2b318de2 100644
--- a/packages/eslint-config-custom/package.json
+++ b/packages/eslint-config-custom/package.json
@@ -15,10 +15,10 @@
"eslint-plugin-simple-import-sort": "^10.0.0",
"eslint-plugin-unused-imports": "^3.0.0"
},
- "publishConfig": {
- "access": "public"
- },
"devDependencies": {
"@vitejs/plugin-react-swc": "^3.4.0"
+ },
+ "publishConfig": {
+ "access": "public"
}
}
diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json
index 470a9b73..d7c919d0 100644
--- a/packages/tsconfig/package.json
+++ b/packages/tsconfig/package.json
@@ -3,10 +3,10 @@
"version": "0.0.0",
"private": true,
"license": "MIT",
- "publishConfig": {
- "access": "public"
- },
"devDependencies": {
"@vitejs/plugin-react-swc": "^3.4.0"
+ },
+ "publishConfig": {
+ "access": "public"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4177f0c3..a97d301f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -111,6 +111,9 @@ importers:
eslint-config-custom:
specifier: workspace:*
version: link:../../packages/eslint-config-custom
+ msw:
+ specifier: ^2.0.1
+ version: 2.0.1(typescript@5.0.2)
tsconfig:
specifier: workspace:*
version: link:../../packages/tsconfig
@@ -119,7 +122,7 @@ importers:
version: 5.0.2
vite:
specifier: ^4.4.5
- version: 4.4.5
+ version: 4.4.5(@types/node@18.18.7)
apps/volunteer:
dependencies:
@@ -354,6 +357,24 @@ packages:
to-fast-properties: 2.0.0
dev: false
+ /@bundled-es-modules/cookie@2.0.0:
+ resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==}
+ dependencies:
+ cookie: 0.5.0
+ dev: true
+
+ /@bundled-es-modules/js-levenshtein@2.0.1:
+ resolution: {integrity: sha512-DERMS3yfbAljKsQc0U2wcqGKUWpdFjwqWuoMugEJlqBnKO180/n+4SR/J8MRDt1AN48X1ovgoD9KrdVXcaa3Rg==}
+ dependencies:
+ js-levenshtein: 1.1.6
+ dev: true
+
+ /@bundled-es-modules/statuses@1.0.1:
+ resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==}
+ dependencies:
+ statuses: 2.0.1
+ dev: true
+
/@chakra-ui/accordion@2.3.1(@chakra-ui/system@2.6.1)(framer-motion@10.16.4)(react@18.2.0):
resolution: {integrity: sha512-FSXRm8iClFyU+gVaXisOSEw0/4Q+qZbFRiuhIAkVU6Boj0FxAMrlo9a8AV5TuF77rgaHytCdHk0Ng+cyUijrag==}
peerDependencies:
@@ -2034,6 +2055,23 @@ packages:
'@tanstack/react-query': 5.4.3(react-dom@18.2.0)(react@18.2.0)
dev: false
+ /@mswjs/cookies@1.0.0:
+ resolution: {integrity: sha512-TdXoBdI+h/EDTsVLCX/34s4+9U0sWi92qFnIGUEikpMCSKLhBeujovyYVSoORNbYgsBH5ga7/tfxyWcEZAxiYA==}
+ engines: {node: '>=14'}
+ dev: true
+
+ /@mswjs/interceptors@0.25.7:
+ resolution: {integrity: sha512-U7iFYs/qU/5jfz1VDpoYz3xqX9nzhsBXw7q923dv6GiGTy+m2ZLhD33L80R/shHOW/YWjeH6k16GbIHGw+bAng==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@open-draft/deferred-promise': 2.2.0
+ '@open-draft/logger': 0.3.0
+ '@open-draft/until': 2.1.0
+ is-node-process: 1.2.0
+ outvariant: 1.4.0
+ strict-event-emitter: 0.5.1
+ dev: true
+
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -2052,6 +2090,21 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.13.0
+ /@open-draft/deferred-promise@2.2.0:
+ resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==}
+ dev: true
+
+ /@open-draft/logger@0.3.0:
+ resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==}
+ dependencies:
+ is-node-process: 1.2.0
+ outvariant: 1.4.0
+ dev: true
+
+ /@open-draft/until@2.1.0:
+ resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==}
+ dev: true
+
/@packlint/command@0.2.0(typanion@3.14.0):
resolution: {integrity: sha512-pvz6LKyH+Az5Y4ukZ7l6ioWna64/aE3ScUxuewQLLQ2L7RcF5WcRD2lq7j7lm4faVLlwPL+zQjKWRkk9yloqFw==}
dependencies:
@@ -2269,6 +2322,14 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
+ /@types/cookie@0.4.1:
+ resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==}
+ dev: true
+
+ /@types/js-levenshtein@1.1.2:
+ resolution: {integrity: sha512-/NCbMABw2uacuyE16Iwka1EzREDD50/W2ggRBad0y1WHBvAkvR9OEINxModVY7D428gXBe0igeVX7bUc9GaslQ==}
+ dev: true
+
/@types/json-schema@7.0.11:
resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
dev: false
@@ -2333,6 +2394,10 @@ packages:
resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==}
dev: false
+ /@types/statuses@2.0.3:
+ resolution: {integrity: sha512-NwCYScf83RIwCyi5/9cXocrJB//xrqMh5PMw3mYTSFGaI3DuVjBLfO/PCk7QVAC3Da8b9NjxNmTO9Aj9T3rl/Q==}
+ dev: true
+
/@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.45.0)(typescript@5.0.2):
resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -2468,7 +2533,7 @@ packages:
vite: ^4
dependencies:
'@swc/core': 1.3.95
- vite: 4.4.5
+ vite: 4.4.5(@types/node@18.18.7)
transitivePeerDependencies:
- '@swc/helpers'
dev: true
@@ -2598,6 +2663,14 @@ packages:
engines: {node: '>=12'}
dev: true
+ /anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
/argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
dependencies:
@@ -2756,6 +2829,11 @@ packages:
engines: {node: '>=0.6'}
dev: false
+ /binary-extensions@2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+ dev: true
+
/bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
dependencies:
@@ -2852,6 +2930,21 @@ packages:
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
dev: true
+ /chokidar@3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
/cli-cursor@2.1.0:
resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==}
engines: {node: '>=4'}
@@ -3024,6 +3117,11 @@ packages:
resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
dev: false
+ /cookie@0.5.0:
+ resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
+ engines: {node: '>= 0.6'}
+ dev: true
+
/copy-to-clipboard@3.3.3:
resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
dependencies:
@@ -3988,6 +4086,14 @@ packages:
mime-types: 2.1.35
dev: false
+ /formdata-node@4.4.1:
+ resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==}
+ engines: {node: '>= 12.20'}
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 4.0.0-beta.3
+ dev: true
+
/framer-motion@10.16.4(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==}
peerDependencies:
@@ -4218,6 +4324,11 @@ packages:
/graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ /graphql@16.8.1:
+ resolution: {integrity: sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==}
+ engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+ dev: true
+
/hard-rejection@2.1.0:
resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
engines: {node: '>=6'}
@@ -4264,6 +4375,10 @@ packages:
dependencies:
function-bind: 1.1.2
+ /headers-polyfill@4.0.2:
+ resolution: {integrity: sha512-EWGTfnTqAO2L/j5HZgoM/3z82L7necsJ0pO9Tp0X1wil3PDLrkypTBRgVO2ExehEEvUycejZD3FuRaXpZZc3kw==}
+ dev: true
+
/hoist-non-react-statics@3.3.2:
resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
dependencies:
@@ -4436,6 +4551,13 @@ packages:
has-bigints: 1.0.2
dev: false
+ /is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.2.0
+ dev: true
+
/is-boolean-object@1.1.2:
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
engines: {node: '>= 0.4'}
@@ -4533,6 +4655,10 @@ packages:
engines: {node: '>= 0.4'}
dev: false
+ /is-node-process@1.2.0:
+ resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==}
+ dev: true
+
/is-number-object@1.0.7:
resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
engines: {node: '>= 0.4'}
@@ -4672,6 +4798,11 @@ packages:
hasBin: true
dev: true
+ /js-levenshtein@1.1.6:
+ resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -5000,6 +5131,45 @@ packages:
/ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ /msw@2.0.1(typescript@5.0.2):
+ resolution: {integrity: sha512-eGcoo5anJmorEkGMQ48dLFx53EJlDL00GjeJtl2dRGm6WwPpzt2fYDZ9ueJ53zMNTtrNtjH9RqbDa+nz7e9Dew==}
+ engines: {node: '>=18'}
+ hasBin: true
+ requiresBuild: true
+ peerDependencies:
+ typescript: '>= 4.7.x <= 5.2.x'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@bundled-es-modules/cookie': 2.0.0
+ '@bundled-es-modules/js-levenshtein': 2.0.1
+ '@bundled-es-modules/statuses': 1.0.1
+ '@mswjs/cookies': 1.0.0
+ '@mswjs/interceptors': 0.25.7
+ '@open-draft/until': 2.1.0
+ '@types/cookie': 0.4.1
+ '@types/js-levenshtein': 1.1.2
+ '@types/statuses': 2.0.3
+ chalk: 4.1.2
+ chokidar: 3.5.3
+ formdata-node: 4.4.1
+ graphql: 16.8.1
+ headers-polyfill: 4.0.2
+ inquirer: 8.2.5
+ is-node-process: 1.2.0
+ js-levenshtein: 1.1.6
+ node-fetch: 2.7.0
+ outvariant: 1.4.0
+ path-to-regexp: 6.2.1
+ strict-event-emitter: 0.5.1
+ type-fest: 2.19.0
+ typescript: 5.0.2
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
/mute-stream@0.0.7:
resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==}
dev: true
@@ -5021,6 +5191,23 @@ packages:
/natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ /node-domexception@1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+ dev: true
+
+ /node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+ dependencies:
+ whatwg-url: 5.0.0
+ dev: true
+
/normalize-package-data@2.5.0:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
dependencies:
@@ -5040,6 +5227,11 @@ packages:
validate-npm-package-license: 3.0.4
dev: true
+ /normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/npm-run-path@4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
@@ -5201,6 +5393,10 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /outvariant@1.4.0:
+ resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==}
+ dev: true
+
/p-limit@2.3.0:
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
engines: {node: '>=6'}
@@ -5303,6 +5499,10 @@ packages:
/path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ /path-to-regexp@6.2.1:
+ resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==}
+ dev: true
+
/path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
@@ -5558,6 +5758,13 @@ packages:
util-deprecate: 1.0.2
dev: true
+ /readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: true
+
/redent@3.0.0:
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
engines: {node: '>=8'}
@@ -5898,6 +6105,15 @@ packages:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
dev: true
+ /statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+ dev: true
+
+ /strict-event-emitter@0.5.1:
+ resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==}
+ dev: true
+
/string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
@@ -6126,6 +6342,10 @@ packages:
resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
dev: false
+ /tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+ dev: true
+
/trim-newlines@3.0.1:
resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
engines: {node: '>=8'}
@@ -6263,6 +6483,11 @@ packages:
engines: {node: '>=10'}
dev: true
+ /type-fest@2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+ dev: true
+
/typed-array-buffer@1.0.0:
resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
engines: {node: '>= 0.4'}
@@ -6395,41 +6620,6 @@ packages:
spdx-expression-parse: 3.0.1
dev: true
- /vite@4.4.5:
- resolution: {integrity: sha512-4m5kEtAWHYr0O1Fu7rZp64CfO1PsRGZlD3TAB32UmQlpd7qg15VF7ROqGN5CyqN7HFuwr7ICNM2+fDWRqFEKaA==}
- engines: {node: ^14.18.0 || >=16.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': '>= 14'
- less: '*'
- lightningcss: ^1.21.0
- sass: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- '@types/node':
- optional: true
- less:
- optional: true
- lightningcss:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
- dependencies:
- esbuild: 0.18.20
- postcss: 8.4.31
- rollup: 3.29.4
- optionalDependencies:
- fsevents: 2.3.2
- dev: true
-
/vite@4.4.5(@types/node@18.18.7):
resolution: {integrity: sha512-4m5kEtAWHYr0O1Fu7rZp64CfO1PsRGZlD3TAB32UmQlpd7qg15VF7ROqGN5CyqN7HFuwr7ICNM2+fDWRqFEKaA==}
engines: {node: ^14.18.0 || >=16.0.0}
@@ -6472,6 +6662,22 @@ packages:
defaults: 1.0.4
dev: true
+ /web-streams-polyfill@4.0.0-beta.3:
+ resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==}
+ engines: {node: '>= 14'}
+ dev: true
+
+ /webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+ dev: true
+
+ /whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+ dev: true
+
/which-boxed-primitive@1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies: