diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 8170cfc6..460c15c3 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -11,6 +11,9 @@ module.exports = { 'plugin:prettier/recommended', 'plugin:import/recommended', 'plugin:import/typescript', + 'plugin:testing-library/react', + 'plugin:vitest/recommended', + 'plugin:jest-dom/recommended', ], rules: { 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..3654ba1b --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +/src/__generated__/* linguist-generated=true \ No newline at end of file diff --git a/.github/auto_assign.yml b/.github/auto_assign.yml index 4b62aa7f..ca8674c5 100644 --- a/.github/auto_assign.yml +++ b/.github/auto_assign.yml @@ -8,6 +8,7 @@ addAssignees: author reviewers: - eonseok-jeon - lydiacho + - wuzoo # A number of reviewers added to the pull request # Set 0 to add all the reviewers (default: 0) diff --git a/.gitignore b/.gitignore index 3b0b4037..2bc8d36d 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ lerna-debug.log* node_modules dist dist-ssr +public/unsupported.html *.local # Editor directories and files @@ -23,4 +24,6 @@ dist-ssr *.sln *.sw? -.env \ No newline at end of file +.env +.env.makers +.env.sopt diff --git a/README.md b/README.md index 882ab7b6..a41c7fa9 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,12 @@ Tanstack Query Badge React-hook-form Badge Date-fns Badge -Lottie-react Badge +Lottie-react Badge Cloudflare Badge Firebase Badge Amplitude Badge +Testing Library Badge +Vitest Badge ## 만든 사람들 @@ -39,7 +41,7 @@ - 24.02 ~ 24.07 + 24.02 ~ 현재 전언석
diff --git a/index.html b/index.html index b53c56a2..c73aa9c8 100644 --- a/index.html +++ b/index.html @@ -12,38 +12,13 @@ gtag('config', 'G-DNPBGP8WDE'); + - - - - - - - - - - - - - - - - - - - - - - - - SOPT makers 모집 지원하기 - - diff --git a/package.json b/package.json index fdf0c7ac..ecfd68e0 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,34 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", - "build": "tsc && vite build", + "dev": "NODE_ENV=makers vite --mode makers", + "dev:sopt": "NODE_ENV=sopt vite --mode sopt", + "dev:dev": "vite --mode development", + "build:ssg": "tsc && vite build --mode makers --ssr src/views/UnsupportedPage/pre-render.tsx && node dist/pre-render.js", + "build:ssg:sopt": "tsc && vite build --mode sopt --ssr src/views/UnsupportedPage/pre-render.tsx && node dist/pre-render.js", + "build": "yarn build:ssg && tsc && NODE_ENV=makers vite build --mode makers", + "build:sopt": "yarn build:ssg:sopt && tsc && NODE_ENV=sopt vite build --mode sopt", + "build:dev": "tsc && vite build --mode development", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" + "preview": "vite preview", + "test": "vitest", + "supportedBrowsers": "echo \"export default $(browserslist-useragent-regexp --allowHigherVersions);\" > ./src/views/UnsupportedPage/supportedBrowsers.ts", + "postinstall": "patch-package", + "openapi-typescript": "npx openapi-typescript ./src/__generated__/api-spec.yml -o ./src/__generated__/api.d.ts", + "swagger-typescript-api": "swagger-typescript-api -p ./src/__generated__/api-spec.yml -r -o ./src/__generated__/api-types --modular -d --extract-request-body --extract-response-body --extract-response-error", + "api-spec": "yarn openapi-typescript && yarn swagger-typescript-api" }, + "browserslist": [ + "> 0.3%", + "chrome >0 and last 2.5 years", + "edge >0 and last 2.5 years", + "safari >0 and last 2.5 years", + "firefox >0 and last 2.5 years", + "and_chr >0 and last 2.5 years", + "and_ff >0 and last 2.5 years", + "ios >0 and last 2.5 years", + "not dead" + ], "dependencies": { "@amplitude/analytics-browser": "^2.9.3", "@amplitude/plugin-session-replay-browser": "^1.6.13", @@ -20,36 +43,58 @@ "@vanilla-extract/css": "^1.15.1", "@vanilla-extract/css-utils": "^0.1.4", "axios": "^1.6.8", - "date-fns": "^3.6.0", "firebase": "^10.12.4", "lottie-react": "^2.4.0", "nanoid": "^5.0.7", + "openapi-fetch": "^0.13.0", + "patch-package": "^8.0.0", + "postinstall-postinstall": "^2.1.0", "react": "^18.2.0", "react-daum-postcode": "^3.1.3", "react-dom": "^18.2.0", + "react-helmet-async": "^2.0.5", "react-hook-form": "^7.51.5", "react-responsive": "^10.0.0", - "react-router-dom": "^6.23.1" + "react-router-dom": "^6.23.1", + "swagger-typescript-api": "^13.0.23" }, "devDependencies": { "@hookform/devtools": "^4.3.1", "@tanstack/eslint-plugin-query": "^5.35.6", - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.5.0", + "@testing-library/react": "^16.0.1", + "@testing-library/user-event": "^14.5.2", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", "@vanilla-extract/vite-plugin": "^4.0.9", "@vitejs/plugin-react": "^4.2.1", + "browserslist-useragent-regexp": "^4.1.3", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jest-dom": "^5.4.0", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", + "eslint-plugin-testing-library": "^6.3.0", + "eslint-plugin-vitest": "^0.5.4", + "jsdom": "^25.0.0", + "msw": "^2.4.9", + "openapi-typescript": "^7.4.3", "prettier": "^3.2.5", + "rollup-plugin-visualizer": "^5.12.0", "typescript": "^5.2.2", - "vite": "^5.2.0" + "vite": "^5.2.0", + "vitest": "^2.0.5" + }, + "msw": { + "workerDirectory": [ + "public" + ] } } diff --git a/patches/lottie-react+2.4.0.patch b/patches/lottie-react+2.4.0.patch new file mode 100644 index 00000000..0acc1d14 --- /dev/null +++ b/patches/lottie-react+2.4.0.patch @@ -0,0 +1,12 @@ +diff --git a/node_modules/lottie-react/build/index.es.js b/node_modules/lottie-react/build/index.es.js +index a2d9d48..1f08a0b 100644 +--- a/node_modules/lottie-react/build/index.es.js ++++ b/node_modules/lottie-react/build/index.es.js +@@ -1,5 +1,5 @@ +-import lottie from 'lottie-web'; +-export { default as LottiePlayer } from 'lottie-web'; ++import lottie from "lottie-web/build/player/lottie_light"; ++export { default as LottiePlayer } from 'lottie-web/build/player/lottie_light'; + import React, { useState, useRef, useEffect } from 'react'; + + function _iterableToArrayLimit(arr, i) { diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js new file mode 100644 index 00000000..a8262f09 --- /dev/null +++ b/public/mockServiceWorker.js @@ -0,0 +1,284 @@ +/* eslint-disable */ +/* tslint:disable */ + +/** + * Mock Service Worker. + * @see https://github.com/mswjs/msw + * - Please do NOT modify this file. + * - Please do NOT serve this file on production. + */ + +const PACKAGE_VERSION = '2.4.9' +const INTEGRITY_CHECKSUM = '26357c79639bfa20d64c0efca2a87423' +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: { + packageVersion: PACKAGE_VERSION, + checksum: 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() + + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + requestId, + isMockedResponse: IS_MOCKED_RESPONSE in response, + type: responseClone.type, + status: responseClone.status, + statusText: responseClone.statusText, + body: responseClone.body, + headers: Object.fromEntries(responseClone.headers.entries()), + }, + }, + [responseClone.body], + ) + })() + } + + 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() + } + + // 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 'PASSTHROUGH': { + 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/public/unsupported.css b/public/unsupported.css new file mode 100644 index 00000000..0b20bd5f --- /dev/null +++ b/public/unsupported.css @@ -0,0 +1,448 @@ +:root { + --primary__hj6ls40: #3f3f47; + --primaryLight__hj6ls41: #f0f0f0; + --primaryDark__hj6ls42: #0f1012; + --primaryLinear__hj6ls43: linear-gradient( + rgba(63, 63, 71, 0.3) 0%, + rgba(63, 63, 71, 1) 45%, + rgba(63, 63, 71, 0.3) 100% + ); + --error__hj6ls44: #f04251; + --background__hj6ls45: #ffffff; + --backgroundDimmed__hj6ls46: rgba(15, 15, 18, 0.5); + --subBackground__hj6ls47: #f5f5f5; + --baseText__hj6ls48: #0f1012; + --lighterText__hj6ls49: #808087; + --lightestText__hj6ls4a: #9d9da4; + --placeholder__hj6ls4b: #c3c3c6; + --buttonDisable__hj6ls4c: #e4e4e5; + --border__hj6ls4d: #e4e4e5; + --blackBackground__hj6ls4e: #0f1012; + --buttonText__hj6ls4f: #66666d; + --errorButtonBackground__hj6ls4g: #f0f0f0; + --stickyButtonText__hj6ls4h: #c3c3c6; + --fileUploadButton__hj6ls4i: #66666d; + --fileUploadButtonHover__hj6ls4j: #17181c; + --whiteButtonFill__hj6ls4k: #fcfcfc; + --grayButtonFill__hj6ls4l: #808087; + --white__hj6ls4m: #ffffff; + --black__hj6ls4n: #000000; +} + +.style_container__1bagjsy0 { + display: flex; + justify-content: space-between; + align-items: center; + position: fixed; + top: 0; + max-width: 1440px; + width: 100%; + margin: 0 auto; + z-index: 99; + transition: background-color 0.3s ease; +} +.style_containerVar_default__1bagjsy1 { + background-color: var(--background__hj6ls45); +} +.style_containerVar_open__1bagjsy2 { + background-color: var(--blackBackground__hj6ls4e); + color: var(--whiteButtonFill__hj6ls4k); +} +.style_containerSizeVer_DESK__1bagjsy3 { + padding: 22px 100px; +} + +@media (max-width: 768px) { + .style_containerSizeVer_DESK__1bagjsy3 { + padding: 22px 40px; + } +} + +@media (max-width: 430px) { + .style_containerSizeVer_DESK__1bagjsy3 { + padding: 22px 20px; + } +} + +.style_logoVar_DESK__1bagjsy6 { + height: 30px; +} +@media (max-width: 768px) { + .style_logoVar_DESK__1bagjsy6 { + height: 24px; + } +} +.style_container__1qr62uo0 { + display: flex; + flex-direction: column; + align-items: center; + padding-top: 80px; + background-color: var(--background__hj6ls45); +} +.style_mainWrapper__1qr62uo1 { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; +} +*:where(:not(html, iframe, canvas, img, svg, video, audio):not(svg *, symbol *)) { + all: unset; + display: revert; +} +*, +*:before, +*:after { + box-sizing: border-box; +} +html { + -moz-text-size-adjust: none; + -webkit-text-size-adjust: none; + text-size-adjust: none; +} +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-smooth: never; +} +a, +button { + cursor: pointer; +} +ol, +ul, +menu, +summary { + list-style: none; +} +img { + max-inline-size: 100%; + max-block-size: 100%; +} +table { + border-collapse: collapse; +} +input, +textarea { + -webkit-user-select: auto; +} +textarea { + white-space: revert; +} +meter { + -webkit-appearance: revert; + -moz-appearance: revert; + appearance: revert; +} +:where(pre) { + all: revert; + box-sizing: border-box; +} +::placeholder { + color: unset; +} +::marker { + content: initial; +} +:where([hidden]) { + display: none; +} +:where([contenteditable]:not([contenteditable='false'])) { + -moz-user-modify: read-write; + -webkit-user-modify: read-write; + overflow-wrap: break-word; + -webkit-line-break: after-white-space; + -webkit-user-select: auto; +} +:where([draggable='true']) { + -webkit-user-drag: element; +} +:where(dialog:modal) { + all: revert; + box-sizing: border-box; +} +.style_containerBase__17kehhl0 { + display: flex; + flex-direction: column; + padding: 28px; + border-radius: 15px; + background-color: var(--subBackground__hj6ls47); + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 700; + font-size: 18px; + line-height: 28px; + letter-spacing: -0.36px; +} +.style_container_sm__17kehhl1 { + width: 466px; +} +@media (max-width: 768px) { + .style_container_sm__17kehhl1 { + width: 367px; + padding: 28px 16px; + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 700; + font-size: 16px; + line-height: 24px; + letter-spacing: -0.24px; + } +} +@media (max-width: 430px) { + .style_container_sm__17kehhl1 { + width: 312px; + padding: 28px 16px; + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 600; + font-size: 14px; + line-height: 20px; + letter-spacing: -0.21px; + } +} +.style_warningWrapper__17kehhl5 { + display: flex; + gap: 22px; + align-items: center; +} +@media (max-width: 768px) { + .style_warningWrapper__17kehhl5 { + gap: 12px; + } +} +@media (max-width: 430px) { + .style_warningWrapper__17kehhl5 { + gap: 8px; + } +} +.style_wrapper__m9qike0 { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: calc(100vh - 160px); + min-height: 753px; +} +.style_headingVar_DESK__m9qike1 { + margin-bottom: 38px; + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 700; + font-size: 28px; + line-height: 42px; + letter-spacing: -2%; +} +@media (max-width: 768px) { + .style_headingVar_DESK__m9qike1 { + margin-bottom: 32px; + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 700; + font-size: 28px; + line-height: 42px; + letter-spacing: -2%; + } +} +@media (max-width: 430px) { + .style_headingVar_DESK__m9qike1 { + margin-bottom: 26px; + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 700; + font-size: 24px; + line-height: 36px; + letter-spacing: -2%; + } +} +.style_infoTitle__m9qike4 { + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 700; + font-size: 16px; + line-height: 24px; + letter-spacing: -2%; +} +.style_infoText__m9qike5 { + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: 26px; + letter-spacing: -1.5%; +} +.style_updateInfoWrapper__m9qike6 { + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 90px; +} +.style_updateInfoWrapperVar_DESK__m9qike7 { + gap: 16px; + margin-top: 60px; +} +@media (max-width: 768px) { + .style_updateInfoWrapperVar_DESK__m9qike7 { + gap: 16px; + margin-top: 50px; + } +} +@media (max-width: 430px) { + .style_updateInfoWrapperVar_DESK__m9qike7 { + gap: 14px; + margin-top: 50px; + } +} +.style_updateInfoTitle__m9qikea { + color: var(--lighterText__hj6ls49); + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; + letter-spacing: -1.5%; +} +.style_browsersWrapper__m9qikeb { + display: flex; + gap: 9px; + align-items: center; +} +.style_browserButton__m9qikec { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + border: 1px solid var(--border__hj6ls4d); + border-radius: 15px; + color: var(--lighterText__hj6ls49); +} +.style_browserButtonVar_DESK__m9qiked { + gap: 9px; + width: 109px; + height: 120px; + padding: 22px 22px 10px; + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 22px; + letter-spacing: -1.5%; +} +@media (max-width: 768px) { + .style_browserButtonVar_DESK__m9qiked { + gap: 9px; + width: 90px; + height: 99px; + padding: 18px 18px 10px; + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 22px; + letter-spacing: -1.5%; + } +} +@media (max-width: 430px) { + .style_browserButtonVar_DESK__m9qiked { + gap: 6px; + width: 72px; + height: 80px; + padding: 14px 13px 8px 12px; + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 500; + font-size: 13px; + line-height: 20px; + letter-spacing: -1.5%; + } +} +.style_browserIconVar_DESK__m9qikeg { + width: 48px; + height: 48px; +} +@media (max-width: 768px) { + .style_browserIconVar_DESK__m9qikeg { + width: 40px; + height: 40px; + } +} +@media (max-width: 430px) { + .style_browserIconVar_DESK__m9qikeg { + width: 32px; + height: 32px; + } +} +.style_instruction__m9qikej { + color: var(--lightestText__hj6ls4a); + text-align: center; + white-space: pre-line; +} +.style_instructionVar_DESK__m9qikek { + margin-bottom: 20px; + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 500; + font-size: 18px; + line-height: 30px; + letter-spacing: -1.5%; +} +@media (max-width: 768px) { + .style_instructionVar_DESK__m9qikek { + margin-bottom: 24px; + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 500; + font-size: 16px; + line-height: 26px; + letter-spacing: -1.5%; + } +} +@media (max-width: 430px) { + .style_instructionVar_DESK__m9qikek { + margin-bottom: 24px; + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 22px; + letter-spacing: -1.5%; + } +} +.style_contactButton__m9qiken { + display: block; + text-decoration-line: underline; + margin: 0 auto; + color: var(--buttonText__hj6ls4f); +} +.style_contactButtonVar_DESK__m9qikeo { + font-size: 24px; + font-weight: 600; + line-height: 150%; + letter-spacing: -0.48px; +} +@media (max-width: 768px) { + .style_contactButtonVar_DESK__m9qikeo { + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 700; + font-size: 20px; + line-height: 30px; + letter-spacing: -2%; + } +} +@media (max-width: 430px) { + .style_contactButtonVar_DESK__m9qikeo { + font-family: SUIT, sans-serif; + font-style: normal; + font-weight: 600; + font-size: 18px; + line-height: 28px; + letter-spacing: -2%; + } +} +.style_container__rwkwcz0 { + display: flex; + justify-content: space-between; + width: 100%; + background-color: var(--subBackground__hj6ls47); +} diff --git a/src/App.tsx b/src/App.tsx index e164e54c..50997432 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,27 +1,32 @@ import { add, init } from '@amplitude/analytics-browser'; import { sessionReplayPlugin } from '@amplitude/plugin-session-replay-browser'; -import { colors } from '@sopt-makers/colors'; import { MutationCache, QueryCache, QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { AxiosError } from 'axios'; -import { useCallback, useEffect, useRef, useState } from 'react'; +import { lazy, Suspense, useEffect, useState } from 'react'; import { RouterProvider, createBrowserRouter } from 'react-router-dom'; import Layout from '@components/Layout'; -import { useDevice } from '@hooks/useDevice'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; -import { RecruitingInfoContext, RecruitingInfoType } from '@store/recruitingInfoContext'; -import { ModeType, ThemeContext } from '@store/themeContext'; +import DeviceTypeProvider from 'contexts/DeviceTypeProvider'; +import RecruitingInfoProvider from 'contexts/RecruitingInfoProvider'; +import ThemeProvider, { useTheme } from 'contexts/ThemeProvider'; import { dark, light } from 'styles/theme.css'; -import { SessionExpiredDialog } from 'views/dialogs'; -import ErrorPage from 'views/ErrorPage'; -import MainPage from 'views/MainPage'; -import PasswordPage from 'views/PasswordPage'; -import ResultPage from 'views/ResultPage'; -import ReviewPage from 'views/ReviewPage'; -import SignupPage from 'views/SignupPage'; + +import BigLoading from 'views/loadings/BigLoding'; import 'styles/reset.css'; +import useDialog from '@hooks/useDialog'; +import { HelmetProvider } from 'react-helmet-async'; + +const SessionExpiredDialog = lazy(() => + import('views/dialogs').then(({ SessionExpiredDialog }) => ({ default: SessionExpiredDialog })), +); +const MainPage = lazy(() => import('views/MainPage')); +const PasswordPage = lazy(() => import('views/PasswordPage')); +const ResultPage = lazy(() => import('views/ResultPage')); +const ReviewPage = lazy(() => import('views/ReviewPage')); +const SignupPage = lazy(() => import('views/SignupPage')); +const ErrorPage = lazy(() => import('views/ErrorPage')); const router = createBrowserRouter([ { @@ -53,11 +58,9 @@ const App = () => { // } // }, []); - const sessionRef = useRef(null); - - const [isLight, setIsLight] = useState(true); - const [recruitingInfo, setRecruitingInfo] = useState({}); + const { ref: sessionExpiredDialogRef, handleShowDialog: handleShowSessionExpiredDialog } = useDialog(); const [isAmplitudeInitialized, setIsAmplitudeInitialized] = useState(false); + const { isLight } = useTheme(); const queryClient = new QueryClient({ defaultOptions: { @@ -74,7 +77,7 @@ const App = () => { const axiosError = error as AxiosError; if (axiosError.response?.status === 401) { - sessionRef.current?.showModal(); + handleShowSessionExpiredDialog(); } else if (axiosError.response?.status === 500) { window.location.href = '/error'; } @@ -85,7 +88,7 @@ const App = () => { const axiosError = error as AxiosError; if (axiosError.response?.status === 401) { - sessionRef.current?.showModal(); + handleShowSessionExpiredDialog(); } else if (axiosError.response?.status === 500) { window.location.href = '/error'; } @@ -93,25 +96,6 @@ const App = () => { }), }); - const themeContextValue = { - isLight, - handleChangeMode: (mode: ModeType) => { - setIsLight(mode === 'light' ? true : false); - const body = document.body; - const bodyColor = mode === 'light' ? colors.white : colors.gray950; // theme.color.background - body.style.backgroundColor = bodyColor; - }, - }; - - const recruitingInfoContextValue = { - recruitingInfo, - handleSaveRecruitingInfo: useCallback((obj: RecruitingInfoType) => { - setRecruitingInfo((prev) => ({ ...prev, ...obj })); - }, []), - }; - - const deviceType = useDevice(); - useEffect(() => { if (!isAmplitudeInitialized) { init(import.meta.env.VITE_AMPLITUDE_API_KEY); @@ -129,19 +113,23 @@ const App = () => { return ( <> - - - - - - -
- -
-
-
-
-
+ + + + + + + +
+ }> + + +
+
+
+
+
+
); }; diff --git a/src/__generated__/api-schema.d.ts b/src/__generated__/api-schema.d.ts new file mode 100644 index 00000000..6a70ebcb --- /dev/null +++ b/src/__generated__/api-schema.d.ts @@ -0,0 +1,1147 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/auth/sign-up/email": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Admin Signup */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-season/latest": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 최신 기수 정보 조회 (From Admin) */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/verify/send": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 이메일 인증 코드 전송 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/verify/email": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 이메일 인증 코드 확인 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/signup": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 지원자 회원가입 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/check/user": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 유저 확인 (비밀번호 변경) */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/change/password": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 비밀번호 변경 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/login": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 로그인 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-question/list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 질문 리스트 조회 (From Admin) */ + get: { + parameters: { + query?: { + /** @example 52 */ + season?: number; + /** @example OB */ + group?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-answer/store": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 임시저장 지원서 조회 */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + /** 지원서 임시저장 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "multipart/form-data": { + /** Format: binary */ + picture?: string; + /** + * @description string + * @example 서버 + */ + part?: string; + /** + * @description string + * @example home1 + */ + address?: string; + /** + * @description string + * @example 2001.01.23 + */ + birthday?: number; + /** + * @description string + * @example 대학 + */ + college?: string; + /** + * @description string + * @example male + */ + gender?: string; + /** + * @description string + * @example 지인 추천 + */ + knownPath?: string; + /** + * @description bool + * @example false + */ + leaveAbsence?: boolean; + /** + * @description string + * @example 통계 + */ + major?: string; + /** + * @description int + * @example 0 + */ + mostRecentSeason?: number; + /** + * @description int + * @example 4 + */ + univYear?: number; + /** + * @description string + * @example 사당역 + */ + nearestStation?: string; + /** + * @description json + * @example [ + * { + * "recruitingQuestionId": 1, + * "answer": "5그릇" + * }, + * { + * "recruitingQuestionId": 2, + * "answer": "4그릇" + * } + * ] + */ + answers?: string; + /** + * @description bool + * @example false + */ + willAppjam?: boolean; + /** Format: binary */ + file_28?: string; + /** Format: binary */ + file_29?: string; + }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-answer": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 지원서 제출 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "multipart/form-data": { + /** Format: binary */ + picture?: string; + /** + * @description string + * @example 서버 + */ + part?: string; + /** + * @description string + * @example home1 + */ + address?: string; + /** + * @description string + * @example 2001.01.23 + */ + birthday?: number; + /** + * @description string + * @example 대학 + */ + college?: string; + /** + * @description string + * @example male + */ + gender?: string; + /** + * @description string + * @example 지인 추천 + */ + knownPath?: string; + /** + * @description bool + * @example false + */ + leaveAbsence?: boolean; + /** + * @description string + * @example 통계 + */ + major?: string; + /** + * @description string + * @example 0 + */ + mostRecentSeason?: number; + /** + * @description int + * @example 4 + */ + univYear?: number; + /** + * @description string + * @example 사당역 + */ + nearestStation?: string; + /** + * @description json + * @example [ + * { + * "recruitingQuestionId": 1, + * "answer": "5그릇" + * }, + * { + * "recruitingQuestionId": 2, + * "answer": "4그릇" + * } + * ] + */ + answers?: string; + /** + * @description bool + * @example false + */ + willAppjam?: boolean; + /** @example 1 */ + season?: number; + /** @example OB */ + group?: string; + pictureUrl?: string; + }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-applicant/satisfaction": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 만족도 점수 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/my": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 마이페이지 */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-applicant/result/application": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 마이페이지 서류 합격 확인 */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-applicant/result/final": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 마이페이지 최종 합격 확인 */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export type operations = Record; diff --git a/src/__generated__/api-spec.yml b/src/__generated__/api-spec.yml new file mode 100644 index 00000000..7811ff76 --- /dev/null +++ b/src/__generated__/api-spec.yml @@ -0,0 +1,3083 @@ +openapi: 3.0.0 +info: + title: Sopt Recruting + version: 1.0.0 +servers: + - url: http://{{host}} +components: + securitySchemes: + noauthAuth: + type: http + scheme: noauth + bearerAuth: + type: http + scheme: bearer +paths: + /auth/sign-up/email: + post: + tags: + - default + summary: Admin Signup + requestBody: + content: + application/json: + schema: + type: object + example: + email: 35th_makers_recruiting@sopt.org + password: makers!35 + responses: + '200': + description: OK + headers: + X-Powered-By: + schema: + type: string + example: Express + Access-Control-Allow-Origin: + schema: + type: string + example: '*' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Etag: + schema: + type: string + example: W/"573-CTZy6UUHUhSnLVhVYTU7RRE1UKQ" + Function-Execution-Id: + schema: + type: string + example: o8siwlsjt53y + X-Cloud-Trace-Context: + schema: + type: string + example: df8b0658817c64b2f432308c6703eaa5;o=1 + Date: + schema: + type: string + example: Thu, 04 Jul 2024 05:36:55 GMT + Server: + schema: + type: string + example: Google Frontend + Content-Length: + schema: + type: integer + example: '1395' + Alt-Svc: + schema: + type: string + example: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content: + application/json: + schema: + type: object + example: + err: false + user: + id: 2 + email: makers_test1@sopt.org + isAdmin: true + isDeleted: false + idFirebase: cgAknoZQKwaRh0IBZCJsfZgSADC3 + createdAt: '2024-07-04T05:36:55.637Z' + updatedAt: '2024-07-04T05:36:55.637Z' + idFirebase: cgAknoZQKwaRh0IBZCJsfZgSADC3 + firebaseToken: >- + eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJodHRwczovL2lkZW50aXR5dG9vbGtpdC5nb29nbGVhcGlzLmNvbS9nb29nbGUuaWRlbnRpdHkuaWRlbnRpdHl0b29sa2l0LnYxLklkZW50aXR5VG9vbGtpdCIsImlhdCI6MTcyMDA3MTQxNSwiZXhwIjoxNzIwMDc1MDE1LCJpc3MiOiJmaXJlYmFzZS1hZG1pbnNkay13dGJpNkBzb3B0LXJlY3J1aXRpbmctZGV2LmlhbS5nc2VydmljZWFjY291bnQuY29tIiwic3ViIjoiZmlyZWJhc2UtYWRtaW5zZGstd3RiaTZAc29wdC1yZWNydWl0aW5nLWRldi5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInVpZCI6ImNnQWtub1pRS3dhUmgwSUJaQ0pzZlpnU0FEQzMiLCJjbGFpbXMiOnsic3RhdHVzIjoiRU1BSUxfU0lHTl9VUCJ9fQ.R3_PScP1h6tmJbO-qclvtAmId90L0VAd91VrVEto5R2DPOr6Rqb5t1tZ123-3kI6svPTJlWP2sfK0R71XwHeDfbjSRJ1hAtYeXdsA1hgipWEMy9ArPyvEzKiX01HWTYOGrSy2NjEU0ED4UFtCUYi8UjKeAmZKWxIsTewm3Drx7d-lPig1gYlAWw3hEp-YRnDSVc8BYwrWJGYhs4gCViSMfBCMVNbRBXLOGUMPV1jKVX6PMUiWMZjOB9Xe4bXA6L5FTjAcb1mS0eODRF4yIEmG63t-Me88rzJLW_m-oxNRJQxqix1Mw8iA9cve7Z6COkt2ikImXqJXnXlNTm4Nrg34g + accesstoken: >- + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZW1haWwiOiJtYWtlcnNfdGVzdDFAc29wdC5vcmciLCJmaXJzdE5hbWUiOm51bGwsImxhc3ROYW1lIjpudWxsLCJpYXQiOjE3MjAwNzE0MTUsImV4cCI6MTcyMjY2MzQxNSwiaXNzIjoic29wdCJ9.sPgelg1Z91Ukow6Gq-MliYzpeQnw2uGCdptkYqKWM58 + /recruiting-season/latest: + get: + tags: + - default + summary: 최신 기수 정보 조회 (From Admin) + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '1196' + etag: + schema: + type: string + example: W/"4ac-S9MX7STKm3GGV7FEsI1d5bF2qRk" + date: + schema: + type: string + example: Mon, 15 Jul 2024 01:33:02 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + season: + id: 1 + season: 1 + ybApplicationStart: '2024-06-20T15:27:45.000Z' + ybApplicationEnd: '2024-06-20T15:27:45.000Z' + ybApplicationConfirmStart: '2024-06-20T15:27:45.000Z' + ybApplicationConfirmEnd: '2024-06-20T15:27:45.000Z' + ybApplicationPassConfirmStart: '2024-06-20T15:27:45.000Z' + ybApplicationPassConfirmEnd: '2024-06-20T15:27:45.000Z' + ybFinalPassConfirmStart: '2024-06-20T15:27:45.000Z' + ybFinalPassConfirmEnd: '2024-06-20T15:27:45.000Z' + obApplicationStart: '2024-06-20T15:27:45.000Z' + obApplicationEnd: '2024-06-20T15:27:45.000Z' + obApplicationConfirmStart: '2024-06-20T15:27:45.000Z' + obApplicationConfirmEnd: '2024-06-20T15:27:45.000Z' + obApplicationPassConfirmStart: '2024-06-20T15:27:45.000Z' + obApplicationPassConfirmEnd: '2024-06-20T15:27:45.000Z' + obFinalPassConfirmStart: '2024-06-20T15:27:45.000Z' + obFinalPassConfirmEnd: '2024-06-20T15:27:45.000Z' + name: MAKERS Test + obInterviewStart: '2024-06-20T15:27:45.000Z' + obInterviewEnd: '2024-06-20T15:27:45.000Z' + ybInterviewStart: '2024-06-20T15:27:45.000Z' + ybInterviewEnd: '2024-06-20T15:27:45.000Z' + isDeleted: false + createdAt: '2024-06-21T00:27:45.564Z' + updatedAt: '2024-06-21T00:27:45.564Z' + group: null + /recruiting-auth/verify/send: + post: + tags: + - default + summary: "\b이메일 인증 코드 전송" + requestBody: + content: + application/json: + schema: + type: object + example: + email: limchangi@naver.com + season: 44 + group: OB + isSignup: true + responses: + '200': + description: OK + headers: + X-Powered-By: + schema: + type: string + example: Express + Access-Control-Allow-Origin: + schema: + type: string + example: '*' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Etag: + schema: + type: string + example: W/"50-6ANWR4XcvY1IAQgNtZ7cm+pHeOU" + Function-Execution-Id: + schema: + type: string + example: 83qon3zaxsob + X-Cloud-Trace-Context: + schema: + type: string + example: c2d32f36afc8c119f93ef8b3399b9518;o=1 + Date: + schema: + type: string + example: Thu, 04 Jul 2024 07:56:06 GMT + Server: + schema: + type: string + example: Google Frontend + Content-Length: + schema: + type: integer + example: '80' + Alt-Svc: + schema: + type: string + example: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content: + application/json: + schema: + type: object + example: + err: false + message: 성공적으로 인증코드를 전송하였습니다. + /recruiting-auth/verify/email: + post: + tags: + - default + summary: 이메일 인증 코드 확인 + requestBody: + content: + application/json: + schema: + type: object + example: + email: limchangi@naver.com + code: WJPQIX + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '58' + etag: + schema: + type: string + example: W/"3a-wW2EjdoQVpgJKV0pc6SYA1mK0dM" + date: + schema: + type: string + example: Tue, 02 Jul 2024 05:35:37 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + message: 인증에 성공하였습니다. + '400': + description: Bad Request + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '57' + etag: + schema: + type: string + example: W/"39-64gz37xnsWcNrWL6+eyQZoTN8pQ" + date: + schema: + type: string + example: Tue, 02 Jul 2024 06:58:24 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: true + message: 인증에 실패하였습니다. + /recruiting-auth/signup: + post: + tags: + - default + summary: 지원자 회원가입 + requestBody: + content: + application/json: + schema: + type: object + example: + email: limchangi@naver.com + password: '1234' + passwordCheck: '1234' + name: 홍길동 + phone: 010-1234-1234 + season: 6 + group: OB + security: + - noauthAuth: [] + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '274' + etag: + schema: + type: string + example: W/"112-BHf2kWRUqi8pvrpCrOe7Sag4Kmk" + date: + schema: + type: string + example: Tue, 02 Jul 2024 06:02:35 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + email: limchangi@naver.com + token: >- + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiZW1haWwiOiJsaW1jaGFuZ2lAbmF2ZXIuY29tIiwibmFtZSI6Iu2Zjeq4uOuPmSIsImlhdCI6MTcxOTkwMDE1NSwiZXhwIjoxNzE5OTg2NTU1LCJpc3MiOiJzb3B0In0.ymIzjsSXa7CKYUsZsDIYXf1rD6PnRKnhnP629EGJep8 + '400': + description: Bad Request + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '61' + etag: + schema: + type: string + example: W/"3d-2yz+4HbRTctrEwSyULZt+RKp6DM" + date: + schema: + type: string + example: Tue, 02 Jul 2024 05:59:26 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: true + message: 이미 존재하는 계정입니다. + '403': + description: Forbidden + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '74' + etag: + schema: + type: string + example: W/"4a-2Zbb/qhjPO84EHOVVAiYznUXXQQ" + date: + schema: + type: string + example: Tue, 02 Jul 2024 06:01:31 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: true + message: 비밀번호 확인이 일치하지 않습니다. + /recruiting-auth/check/user: + post: + tags: + - default + summary: 유저 확인 (비밀번호 변경) + requestBody: + content: + application/json: + schema: + type: object + example: + email: limchangi@naver.com + name: 홍길동 + season: 1 + group: OB + security: + - noauthAuth: [] + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '65' + etag: + schema: + type: string + example: W/"41-y8H1S6dfGUiDNMMOZV3F112tEHQ" + date: + schema: + type: string + example: Tue, 02 Jul 2024 07:11:09 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + message: 계정 조회에 성공하였습니다. + '400': + description: Bad Request + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '62' + etag: + schema: + type: string + example: W/"3e-fSGP6HsD4fqVRLlKUy6XO897i24" + date: + schema: + type: string + example: Tue, 02 Jul 2024 07:12:00 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + message: 존재하지 않는 계정입니다. + /recruiting-auth/change/password: + post: + tags: + - default + summary: 비밀번호 변경 + requestBody: + content: + application/json: + schema: + type: object + example: + email: limchangi@naver.com + season: 35 + group: OB + password: '1234' + passwordCheck: '1234' + security: + - noauthAuth: [] + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '100' + etag: + schema: + type: string + example: W/"64-u3s+yoqwSyXklp7imkD8TDxkyGk" + date: + schema: + type: string + example: Tue, 02 Jul 2024 07:32:57 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + email: limchangi@naver.com + message: 비밀번호 변경에 성공하였습니다 + '403': + description: Forbidden + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '74' + etag: + schema: + type: string + example: W/"4a-2Zbb/qhjPO84EHOVVAiYznUXXQQ" + date: + schema: + type: string + example: Tue, 02 Jul 2024 07:27:24 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: true + message: 비밀번호 확인이 일치하지 않습니다. + /recruiting-auth/login: + post: + tags: + - default + summary: 로그인 + requestBody: + content: + application/json: + schema: + type: object + example: + email: limchangi@naver.com + season: 6 + group: OB + password: '1234' + security: + - noauthAuth: [] + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '244' + etag: + schema: + type: string + example: W/"f4-HAXOkpBDA51LQDqj+1W87xCzIgQ" + date: + schema: + type: string + example: Tue, 02 Jul 2024 07:43:22 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + token: >- + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiZW1haWwiOiJsaW1jaGFuZ2lAbmF2ZXIuY29tIiwibmFtZSI6Iu2Zjeq4uOuPmSIsImlhdCI6MTcxOTkwNjIwMiwiZXhwIjoxNzE5OTkyNjAyLCJpc3MiOiJzb3B0In0._jBgV61sjPfCMsjt2X78CuWHzTx2BBjD85pbxhKivvQ + '403': + description: Forbidden + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '76' + etag: + schema: + type: string + example: W/"4c-6x9C3SYn3bWd8SzDyyLnbbs/s8U" + date: + schema: + type: string + example: Tue, 02 Jul 2024 07:46:09 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + message: 잘못된 이메일 혹은 비밀번호 입니다. + /recruiting-question/list: + get: + tags: + - default + summary: 질문 리스트 조회 (From Admin) + parameters: + - name: season + in: query + schema: + type: integer + example: '52' + - name: group + in: query + schema: + type: string + example: OB + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '26811' + etag: + schema: + type: string + example: W/"68bb-LjDDib1yWRoehxzbYpKkaYShgEE" + date: + schema: + type: string + example: Wed, 25 Sep 2024 15:51:24 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + commonQuestions: + part: 공통 + recruitingQuestionTypeId: 1 + questions: + - id: 310 + question: |- + 1. SOPT에서 어떤 활동을 하셨는지 작성해주세요. + <플레이스홀더>여러 활동을 하신 경우 다 적어주시면 좋아요 :) + - 33기 : 기획파트, 앱잼 OOO Team Leader + - 32기 : iOS파트, 운영팀 + value: 1. SOPT에서 어떤 활동을 하셨는지 작성해주세요. + order: 1 + urls: null + isFile: null + optional: false + placeholder: |- + 여러 활동을 하신 경우 다 적어주시면 좋아요 :) + - 33기 : 기획파트, 앱잼 OOO Team Leader + - 32기 : iOS파트, 운영팀 + charLimit: 100 + - id: 311 + question: 2. makers에 지원하신 동기는 무엇인가요? + value: 2. makers에 지원하신 동기는 무엇인가요? + order: 2 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 500 + - id: 312 + question: 3. makers에서 본인의 역량을 어떻게 활용해서 기여하고 싶은지 간단하게 서술해주세요. + value: 3. makers에서 본인의 역량을 어떻게 활용해서 기여하고 싶은지 간단하게 서술해주세요. + order: 3 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 300 + partQuestions: + - part: PM + recruitingQuestionTypeId: 2 + questions: + - id: 313 + question: >- + PM 포지션에 지원해 주셔서 감사해요🙂 + + PM 포지션은 해당 본문에 적힌 한 가지의 과제성 질문과 자유 형식의 포트폴리오를 받고 있어요. + 해당 질문에 대한 답변을 템플릿 양식에 의거하여 첨부해 주세요. + + + SOPT Playground, SOPT 모임 서비스, 공식 홈페이지, SOPT App, + makers Platform 팀의 PM으로 함께하게 되면, 현재 제품에서 개선을 진행하거나 신규 + 기능을 제안하여 제품을 성장시키게 되실 거예요. + + + 각 팀의 PM으로 제품을 성장시킨다고 생각하며, 한 가지 프로덕트를 선택하여 아래 양식에 맞춰서 + 작성해 주세요. + value: >- + PM 포지션에 지원해 주셔서 감사해요🙂 + + PM 포지션은 해당 본문에 적힌 한 가지의 과제성 질문과 자유 형식의 포트폴리오를 받고 있어요. + 해당 질문에 대한 답변을 템플릿 양식에 의거하여 첨부해 주세요. + + + SOPT Playground, SOPT 모임 서비스, 공식 홈페이지, SOPT App, + makers Platform 팀의 PM으로 함께하게 되면, 현재 제품에서 개선을 진행하거나 신규 + 기능을 제안하여 제품을 성장시키게 되실 거예요. + + + 각 팀의 PM으로 제품을 성장시킨다고 생각하며, 한 가지 프로덕트를 선택하여 아래 양식에 맞춰서 + 작성해 주세요. + order: 1 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: null + - id: 314 + question: "1. 프로덕트에 대한 고민이 담긴 각 팀의 과제 3개와 자유 주제 과제 1개를 준비했어요. 4가지 과제 중 1가지를 선택하여 One Pager를 작성해 주세요. 본인이 작성한 과제를 ‘왜’ 해야 하는지가 설득되어야 해요.\n\n[SOPT Playground]\n4기 Playground는 커뮤니티 활성화를 목표로 설정하여 ‘랜덤 프로필, 인기 게시물 알림’ 등 다양한 기능들을 시도했어요. 커뮤니티를 활성화하기 위한 방법에 대해 자유롭게 제안해 주세요. \n\n[SOPT App]\nSOPT App 홈 화면은 많은 시도를 해볼 수 있는 곳으로, 4기에는 ‘HOT 게시글’을 확인할 수 있는 기능을 시도했어요. SOPT의 특수성을 고려하면서, 유저 리텐션을 높이기 위해 어떤 식으로 홈 화면을 개편하면 좋을지 자유롭게 제안해 주세요.\n\n[makers Platform]\n4기 Platform 팀은 makers 제품들의 인증 체계에 대한 부채 해결, 알림 기능의 개선, 디자인 시스템 구축 등 다양한 영역에서의 제품 팀을 위한 프로젝트들을 진행하거나 출석 및 알림 어드민 제품을 개선했어요. 이런 맥락 속 5기 makers 팀이 제품을 보다 빠르게 만들기 위해 Platform 팀에서 진행해 볼 수 있는 프로젝트를 제안해 주세요.\n\n[자유 주제]\nSOPT 활동을 하며 느꼈던 제품의 개선 사항에 대해 자유롭게 제안해 주세요.\n\n[One Pager Template]\n1) 프로젝트의 목표(Objective)\n2) 제안 배경(무엇이 문제이며, 해결책은 무엇이고, 왜 우리가 리소스를 투입하여 이것을 해야하는지)\n3) 가설과 검증 전략(어떤 타겟 유저에게, 어떤 해결책을 제안할 것인지)\n4) 문제를 해결하기 위한 주요 기능 및 액션(해결책을 어떤 기능으로 풀어내고, 각 기능을 어떻게 단계적으로 구현할 것인지에 대한 플랜)\n5) 성공 지표(성공을 측정할 수 있는 지표는 무엇으로 가져갈 것인지, 어떻게 측정할 것인지)\n6) 배포 후 운영 계획(의도한 대로 문제가 잘 해결될 수 있도록 어떻게 운영해볼 것인지)\n\n[템플릿 양식 및 제출 방식]\n- One Pager 내 사진 및 이미지 첨부\_절대 불가\n- WORD 혹은 HWP에 텍스트로 작성 후, PDF로 변환하여 제출\n- 분량 제한 없음<파일>\n<플레이스홀더>파일을 첨부하셨다면, '파일 제출'이라고 기재 후 제출해주세요" + value: "1. 프로덕트에 대한 고민이 담긴 각 팀의 과제 3개와 자유 주제 과제 1개를 준비했어요. 4가지 과제 중 1가지를 선택하여 One Pager를 작성해 주세요. 본인이 작성한 과제를 ‘왜’ 해야 하는지가 설득되어야 해요.\n\n[SOPT Playground]\n4기 Playground는 커뮤니티 활성화를 목표로 설정하여 ‘랜덤 프로필, 인기 게시물 알림’ 등 다양한 기능들을 시도했어요. 커뮤니티를 활성화하기 위한 방법에 대해 자유롭게 제안해 주세요. \n\n[SOPT App]\nSOPT App 홈 화면은 많은 시도를 해볼 수 있는 곳으로, 4기에는 ‘HOT 게시글’을 확인할 수 있는 기능을 시도했어요. SOPT의 특수성을 고려하면서, 유저 리텐션을 높이기 위해 어떤 식으로 홈 화면을 개편하면 좋을지 자유롭게 제안해 주세요.\n\n[makers Platform]\n4기 Platform 팀은 makers 제품들의 인증 체계에 대한 부채 해결, 알림 기능의 개선, 디자인 시스템 구축 등 다양한 영역에서의 제품 팀을 위한 프로젝트들을 진행하거나 출석 및 알림 어드민 제품을 개선했어요. 이런 맥락 속 5기 makers 팀이 제품을 보다 빠르게 만들기 위해 Platform 팀에서 진행해 볼 수 있는 프로젝트를 제안해 주세요.\n\n[자유 주제]\nSOPT 활동을 하며 느꼈던 제품의 개선 사항에 대해 자유롭게 제안해 주세요.\n\n[One Pager Template]\n1) 프로젝트의 목표(Objective)\n2) 제안 배경(무엇이 문제이며, 해결책은 무엇이고, 왜 우리가 리소스를 투입하여 이것을 해야하는지)\n3) 가설과 검증 전략(어떤 타겟 유저에게, 어떤 해결책을 제안할 것인지)\n4) 문제를 해결하기 위한 주요 기능 및 액션(해결책을 어떤 기능으로 풀어내고, 각 기능을 어떻게 단계적으로 구현할 것인지에 대한 플랜)\n5) 성공 지표(성공을 측정할 수 있는 지표는 무엇으로 가져갈 것인지, 어떻게 측정할 것인지)\n6) 배포 후 운영 계획(의도한 대로 문제가 잘 해결될 수 있도록 어떻게 운영해볼 것인지)\n\n[템플릿 양식 및 제출 방식]\n- One Pager 내 사진 및 이미지 첨부\_절대 불가\n- WORD 혹은 HWP에 텍스트로 작성 후, PDF로 변환하여 제출\n- 분량 제한 없음" + order: 2 + urls: null + isFile: true + optional: false + placeholder: 파일을 첨부하셨다면, '파일 제출'이라고 기재 후 제출해주세요 + charLimit: 5 + - id: 315 + question: >- + 2. 자신을 드러낼 수 있는 개인 블로그나 노션 링크, 포트폴리오 등을 자유롭게 + 입력해주세요.<파일> + value: 2. 자신을 드러낼 수 있는 개인 블로그나 노션 링크, 포트폴리오 등을 자유롭게 입력해주세요. + order: 3 + urls: null + isFile: true + optional: false + placeholder: null + charLimit: 500 + - id: 316 + question: >- + 3. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -Playground팀 + -APP팀 + -공식홈페이지팀 + -Crew팀 + -플랫폼팀 + + <플레이스홀더>ex. 1순위 000팀, 2순위 000팀, 3순위 000팀, 4순위 000팀, + 5순위 000팀 + value: >- + 3. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -Playground팀 + -APP팀 + -공식홈페이지팀 + -Crew팀 + -플랫폼팀 + order: 4 + urls: null + isFile: null + optional: false + placeholder: ex. 1순위 000팀, 2순위 000팀, 3순위 000팀, 4순위 000팀, 5순위 000팀 + charLimit: 100 + - part: 디자인 + recruitingQuestionTypeId: 3 + questions: + - id: 317 + question: >- + Product & Platform Designer 포지션에 지원해주셔서 감사해요 😊 + + Product & Platform Designer 포지션은 해당 본문에 적힌 세 가지의 질문과 + 자유 형식의 포트폴리오를 받고 있어요. + value: >- + Product & Platform Designer 포지션에 지원해주셔서 감사해요 😊 + + Product & Platform Designer 포지션은 해당 본문에 적힌 세 가지의 질문과 + 자유 형식의 포트폴리오를 받고 있어요. + order: 1 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: null + - id: 318 + question: >- + 1. 프로덕트 디자인으로 문제를 해결한 사례 1가지를 선택하고, 어떤 고민을 했는지 알려주세요. + + <플레이스홀더>프로덕트에 대한 설명, 프로덕트의 사용자, 문제라고 생각한 이유, 해결책 등을 + 포함해서 서술해 주세요. + value: 1. 프로덕트 디자인으로 문제를 해결한 사례 1가지를 선택하고, 어떤 고민을 했는지 알려주세요. + order: 2 + urls: null + isFile: null + optional: false + placeholder: >- + 프로덕트에 대한 설명, 프로덕트의 사용자, 문제라고 생각한 이유, 해결책 등을 포함해서 서술해 + 주세요. + charLimit: 700 + - id: 319 + question: 2. 프로덕트 또는 플랫폼 디자이너로서 본인의 어떤 점이 가장 강점이라고 생각하시나요? + value: 2. 프로덕트 또는 플랫폼 디자이너로서 본인의 어떤 점이 가장 강점이라고 생각하시나요? + order: 3 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 500 + - id: 320 + question: |- + 3. 자신을 드러낼 수 있는 노션, 포트폴리오 파일 또는 링크를 제출해주세요.<파일> + <플레이스홀더>포트폴리오 구성 TIP + - 사용자 관점에서 문제를 해결한 과정을 담아주세요. + - 문제 해결 과정에 집중해서 포트폴리오를 구성해주세요. + value: 3. 자신을 드러낼 수 있는 노션, 포트폴리오 파일 또는 링크를 제출해주세요. + order: 4 + urls: null + isFile: true + optional: false + placeholder: |- + 포트폴리오 구성 TIP + - 사용자 관점에서 문제를 해결한 과정을 담아주세요. + - 문제 해결 과정에 집중해서 포트폴리오를 구성해주세요. + charLimit: 500 + - id: 321 + question: >- + 4. 포트폴리오를 제출했다면, 프로젝트 순서대로 본인이 했던 역할과 함께 기여 정도를 + 작성해주세요. (포트폴리오 내부에도 함께 작성해주시면 더 좋아요)<선택> + + <플레이스홀더>ex) + + 1번 프로젝트 : 유저 리서치 진행, 30% + + 2번 프로젝트 : UX 개선, 100% + value: >- + 4. 포트폴리오를 제출했다면, 프로젝트 순서대로 본인이 했던 역할과 함께 기여 정도를 + 작성해주세요. (포트폴리오 내부에도 함께 작성해주시면 더 좋아요) + order: 5 + urls: null + isFile: null + optional: true + placeholder: |- + ex) + 1번 프로젝트 : 유저 리서치 진행, 30% + 2번 프로젝트 : UX 개선, 100% + charLimit: 100 + - id: 322 + question: >- + 5. makers 5기 디자인 챕터에 속하게 된다면 어떤 챕터원이 되고싶은지 간단히 작성해 + 주세요. + value: >- + 5. makers 5기 디자인 챕터에 속하게 된다면 어떤 챕터원이 되고싶은지 간단히 작성해 + 주세요. + order: 6 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 300 + - id: 323 + question: >- + 6. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -Playground팀 + -APP팀 + -공식홈페이지팀 + -Crew팀 + -플랫폼팀 + + <플레이스홀더>ex. 1순위 000팀, 2순위 000팀, 3순위 000팀, 4순위 000팀, + 5순위 000팀 + value: >- + 6. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -Playground팀 + -APP팀 + -공식홈페이지팀 + -Crew팀 + -플랫폼팀 + order: 7 + urls: null + isFile: null + optional: false + placeholder: ex. 1순위 000팀, 2순위 000팀, 3순위 000팀, 4순위 000팀, 5순위 000팀 + charLimit: 100 + - part: 서버 + recruitingQuestionTypeId: 7 + questions: + - id: 324 + question: |- + 백엔드 개발자 포지션에 지원해주셔서 감사해요 😄 + 백엔드 개발자 포지션은 두 가지의 질문과 자유 형식의 포트폴리오를 받고 있어요. + value: |- + 백엔드 개발자 포지션에 지원해주셔서 감사해요 😄 + 백엔드 개발자 포지션은 두 가지의 질문과 자유 형식의 포트폴리오를 받고 있어요. + order: 1 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: null + - id: 325 + question: >- + 1. 기술적 도전 과제가 있었던 프로젝트를 예로 들어 설명해주세요. 해당 도전 과제를 어떻게 + 해결했는지, 또는 해결하지 못했는지와 그 이유를 포함하여, 그 과정에서 얻은 교훈이 무엇인지 + 작성해주세요. + value: >- + 1. 기술적 도전 과제가 있었던 프로젝트를 예로 들어 설명해주세요. 해당 도전 과제를 어떻게 + 해결했는지, 또는 해결하지 못했는지와 그 이유를 포함하여, 그 과정에서 얻은 교훈이 무엇인지 + 작성해주세요. + order: 2 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 1000 + - id: 326 + question: >- + 2. 개발 과정에서의 문제 해결을 위해 다른 파트 혹은 챕터의 팀원와 협력한 경험이 있다면 + 설명해주세요. 협력의 과정과 그 결과, 그리고 협력에서 얻은 교훈을 중심으로 작성해주세요. + value: >- + 2. 개발 과정에서의 문제 해결을 위해 다른 파트 혹은 챕터의 팀원와 협력한 경험이 있다면 + 설명해주세요. 협력의 과정과 그 결과, 그리고 협력에서 얻은 교훈을 중심으로 작성해주세요. + order: 3 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 700 + - id: 327 + question: 3. 자신을 드러낼 수 있는 개인 블로그나 노션, Github 링크 등을 자유롭게 입력해주세요. + value: 3. 자신을 드러낼 수 있는 개인 블로그나 노션, Github 링크 등을 자유롭게 입력해주세요. + order: 4 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 500 + - id: 328 + question: >- + 4. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -Playground팀 + -APP팀 + -공식홈페이지팀 + -Crew팀 + -플랫폼팀 + + <플레이스홀더>ex. 1순위 000팀, 2순위 000팀, 3순위 000팀, 4순위 000팀, + 5순위 000팀 + value: >- + 4. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -Playground팀 + -APP팀 + -공식홈페이지팀 + -Crew팀 + -플랫폼팀 + order: 5 + urls: null + isFile: null + optional: false + placeholder: ex. 1순위 000팀, 2순위 000팀, 3순위 000팀, 4순위 000팀, 5순위 000팀 + charLimit: 100 + - part: 안드로이드 + recruitingQuestionTypeId: 4 + questions: + - id: 329 + question: |- + 안드로이드 개발자 포지션에 지원해주셔서 감사해요 😄 + 안드로이드 개발자 포지션은 두 가지의 질문과 자유 형식의 포트폴리오를 받고 있어요. + value: |- + 안드로이드 개발자 포지션에 지원해주셔서 감사해요 😄 + 안드로이드 개발자 포지션은 두 가지의 질문과 자유 형식의 포트폴리오를 받고 있어요. + order: 1 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: null + - id: 330 + question: >- + 1. 문제를 해결하실 때 스스로 문제를 해결하시나요, 다른 사람들과 같이 문제를 해결하시나요? + 지원자님이 겪은 문제해결과정을 위의 질문에 기반하여 답해주세요. + value: >- + 1. 문제를 해결하실 때 스스로 문제를 해결하시나요, 다른 사람들과 같이 문제를 해결하시나요? + 지원자님이 겪은 문제해결과정을 위의 질문에 기반하여 답해주세요. + order: 2 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 600 + - id: 331 + question: >- + 2. 희망하는 팀에 따라, 다음 두 가지 (2-1, 2-2) 질문 중 하나를 선택해서 + 답변해주세요. + + + 2-1. [프로덕트 팀 지원자 전용] 개발에서 품질과 속도는 상충관계에 있습니다. 지원자님은 어느 + 부분에 더 가치를 두시고 계신가요? 경험에 기반하여 서술해주세요. + + 2-2. [플랫폼 팀 지원자 전용] 본인이 개발한 서비스의 기술적인 문제를 정의하고 이를 해결한 + 전 과정과 이를 통해 본인이 생각하는 팀에 기여한 성과에 대해 서술해주세요. + value: >- + 2. 희망하는 팀에 따라, 다음 두 가지 (2-1, 2-2) 질문 중 하나를 선택해서 + 답변해주세요. + + + 2-1. [프로덕트 팀 지원자 전용] 개발에서 품질과 속도는 상충관계에 있습니다. 지원자님은 어느 + 부분에 더 가치를 두시고 계신가요? 경험에 기반하여 서술해주세요. + + 2-2. [플랫폼 팀 지원자 전용] 본인이 개발한 서비스의 기술적인 문제를 정의하고 이를 해결한 + 전 과정과 이를 통해 본인이 생각하는 팀에 기여한 성과에 대해 서술해주세요. + order: 3 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 700 + - id: 332 + question: >- + 4. 깃허브 프로필 링크를 필수적으로 첨부해주시고 본인을 잘 소개할 수 있는 자료의 링크가 있다면 + 같이 첨부해주세요. + value: >- + 4. 깃허브 프로필 링크를 필수적으로 첨부해주시고 본인을 잘 소개할 수 있는 자료의 링크가 있다면 + 같이 첨부해주세요. + order: 4 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 500 + - id: 337 + question: >- + 5. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -APP팀 + -플랫폼팀 + + <플레이스홀더>ex. 1순위 000팀, 2순위 000팀 + value: >- + 5. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -APP팀 + -플랫폼팀 + order: 5 + urls: null + isFile: null + optional: false + placeholder: ex. 1순위 000팀, 2순위 000팀 + charLimit: 100 + - part: iOS + recruitingQuestionTypeId: 5 + questions: + - id: 333 + question: |- + iOS 개발자 포지션에 지원해주셔서 감사해요 😄 + iOS 개발자 포지션은 자유 양식의 자기소개서를 받고 있어요. + value: |- + iOS 개발자 포지션에 지원해주셔서 감사해요 😄 + iOS 개발자 포지션은 자유 양식의 자기소개서를 받고 있어요. + order: 1 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: null + - id: 334 + question: >- + 1. 본인을 소개할 수 있는 이력서 또는 포트폴리오를 자유로운 양식으로 제출해 주세요. + + (PDF 형식을 권장 드려요)<파일> + + + 준비된 서류가 없다면 SOPT에서 iOS 개발자로 참여한 프로젝트에 대한 간단한 설명, 본인의 + 역할, 기술적 도전 및 고민에 대해 적어서 제출해도 좋아요! + value: >- + 1. 본인을 소개할 수 있는 이력서 또는 포트폴리오를 자유로운 양식으로 제출해 주세요. + + (PDF 형식을 권장 드려요) + + + 준비된 서류가 없다면 SOPT에서 iOS 개발자로 참여한 프로젝트에 대한 간단한 설명, 본인의 + 역할, 기술적 도전 및 고민에 대해 적어서 제출해도 좋아요! + order: 2 + urls: null + isFile: true + optional: false + placeholder: null + charLimit: 1000 + - id: 335 + question: 2. Github 링크를 입력해 주세요. + value: 2. Github 링크를 입력해 주세요. + order: 3 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 100 + - id: 336 + question: >- + 3. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -APP팀 + -플랫폼팀 + + <플레이스홀더>ex. 1순위 000팀, 2순위 000팀 + value: >- + 3. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -APP팀 + -플랫폼팀 + order: 4 + urls: null + isFile: null + optional: false + placeholder: ex. 1순위 000팀, 2순위 000팀 + charLimit: 100 + - part: 웹 + recruitingQuestionTypeId: 6 + questions: + - id: 338 + question: |- + 웹 프론트엔드 개발자 포지션에 지원해주셔서 감사해요 😁 + 웹 프론트엔드 개발자 포지션은 두 가지의 질문과 자유 형식의 포트폴리오를 받고 있어요. + value: |- + 웹 프론트엔드 개발자 포지션에 지원해주셔서 감사해요 😁 + 웹 프론트엔드 개발자 포지션은 두 가지의 질문과 자유 형식의 포트폴리오를 받고 있어요. + order: 1 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: null + - id: 339 + question: >- + 1. 지금까지 개발을 해오면서 만난 문제 중, 해결하기 가장 어려웠던 기술적인 문제는 + 무엇이었나요? 그때의 문제 상황을 설명해 주시고, 만약 해결했다면 어떻게 해결했는지 이야기해 + 주세요. 해결하지 못했더라도, 어떻게 해결하면 좋을 것 같은지에 대해 이야기해 주세요. + value: >- + 1. 지금까지 개발을 해오면서 만난 문제 중, 해결하기 가장 어려웠던 기술적인 문제는 + 무엇이었나요? 그때의 문제 상황을 설명해 주시고, 만약 해결했다면 어떻게 해결했는지 이야기해 + 주세요. 해결하지 못했더라도, 어떻게 해결하면 좋을 것 같은지에 대해 이야기해 주세요. + order: 2 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 700 + - id: 340 + question: 2. 코드 리뷰 등 타인이 작성한 코드를 파악하고 개선해 본 경험에 대해 이야기해 주세요. + value: 2. 코드 리뷰 등 타인이 작성한 코드를 파악하고 개선해 본 경험에 대해 이야기해 주세요. + order: 3 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 500 + - id: 341 + question: |- + 3. 자유롭게 깃허브(*필수), 블로그 등의 링크를 첨부해 주세요. + (1, 2번 문항과 관련된 링크를 첨부해주셔도 좋아요.) + value: |- + 3. 자유롭게 깃허브(*필수), 블로그 등의 링크를 첨부해 주세요. + (1, 2번 문항과 관련된 링크를 첨부해주셔도 좋아요.) + order: 4 + urls: null + isFile: null + optional: false + placeholder: null + charLimit: 500 + - id: 351 + question: >- + 4. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -Playground팀 + -공식홈페이지팀 + -Crew팀 + -플랫폼팀 + + <플레이스홀더>ex. 1순위 000팀, 2순위 000팀, 3순위 000팀, 4순위 000팀 + value: >- + 4. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 + 있어요. 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -Playground팀 + -공식홈페이지팀 + -Crew팀 + -플랫폼팀 + order: 5 + urls: null + isFile: null + optional: false + placeholder: ex. 1순위 000팀, 2순위 000팀, 3순위 000팀, 4순위 000팀 + charLimit: 100 + questionTypes: + - id: 3 + type: design + typeKr: 디자인 + typeLegacy: null + - id: 4 + type: android + typeKr: 안드로이드 + typeLegacy: null + - id: 5 + type: ios + typeKr: iOS + typeLegacy: null + - id: 6 + type: web + typeKr: 웹 + typeLegacy: null + - id: 7 + type: server + typeKr: 서버 + typeLegacy: null + - id: 2 + type: plan + typeKr: PM + typeLegacy: null + - id: 8 + type: research + typeKr: 리서치 + typeLegacy: null + /recruiting-answer/store: + get: + tags: + - default + summary: 임시저장 지원서 조회 + security: + - bearerAuth: [] + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '12919' + etag: + schema: + type: string + example: W/"3277-l3WSfGRS8UqMSo1U5HbKpui73zo" + date: + schema: + type: string + example: Wed, 25 Sep 2024 16:05:33 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + isSubmit: true + applicant: + id: 151 + group: OB + season: 35 + mostRecentSeason: 34 + part: 서버 + phone: 010-9977-9012 + email: limchangi@naver.com + name: 최영철 + address: 서울 노원구 석계로13길 11-9 + gender: 남자 + birthday: 1999/10/15 + college: 광운대학교 + major: 전자통신공학과 + univYear: 4 + leaveAbsence: false + willAppjam: false + knownPath: null + pic: >- + https://firebasestorage.googleapis.com/v0/b/sopt-recruiting-dev.appspot.com/o/recruiting%2Fapplicants%2F%C3%A1%C2%84%C2%8B%C3%A1%C2%85%C2%A7%C3%A1%C2%84%C2%80%C3%A1%C2%85%C2%AF%C3%A1%C2%86%C2%AB%C3%A1%C2%84%C2%89%C3%A1%C2%85%C2%A1%C3%A1%C2%84%C2%8C%C3%A1%C2%85%C2%B5%C3%A1%C2%86%C2%AB.jpegqNzzmlm?alt=media + nearestStation: 광운대역, 석계역 + applicationPass: true + finalPass: true + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:15:15.652Z' + updatedAt: '2024-08-20T10:38:49.377Z' + submit: true + commonQuestions: + - id: 310 + group: OB + season: 35 + recruitingQuestionTypeId: 1 + order: 1 + question: |- + 1. SOPT에서 어떤 활동을 하셨는지 작성해주세요. + <플레이스홀더>여러 활동을 하신 경우 다 적어주시면 좋아요 :) + - 33기 : 기획파트, 앱잼 OOO Team Leader + - 32기 : iOS파트, 운영팀 + charLimit: 100 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T00:55:02.961Z' + updatedAt: '2024-07-31T00:56:41.720Z' + answer: + id: 2485 + recruitingApplicantId: 151 + recruitingQuestionId: 310 + answer: >- + 34기 : Server 파트, 도커 스터디, 디자인패턴 스터디, 앱잼 유니보이스 서버 파트 + (Lead) + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.132Z' + updatedAt: '2024-08-07T13:36:52.301Z' + file: null + fileName: null + - id: 311 + group: OB + season: 35 + recruitingQuestionTypeId: 1 + order: 2 + question: 2. makers에 지원하신 동기는 무엇인가요? + charLimit: 500 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T00:55:52.805Z' + updatedAt: '2024-07-31T00:56:39.550Z' + answer: + id: 2486 + recruitingApplicantId: 151 + recruitingQuestionId: 311 + answer: >- + 저는 극 E와 N 성향을 가지고 있어 도와줄 수 있는 일 혹은 알고 있는 정보와 지식을 다른 + 사람들에게 공유할 때 행복을 느끼며 더욱 무언가를 배우고 싶다는 열정에 대한 동기를 얻습니다. + + IT 서비스 개발을 하며 손쉽게 접할 수 있는 하나의 서비스를 통해 많은 사람들에게 긍정적인 영향을 + 줄 수 있다는 점이 너무 매력적이었고 꼭 실사용자를 가진 서비스를 운영해 보고 싶다는 꿈을 + 꾸었습니다. + + + 그런 와중 서버 파트 1차 세미나 시간에 Makers 팀장님께서 실시간으로 발생한 버그를 수정하고 + 해결하는 모습을 보았습니다. 저의 꿈을 직접 눈으로 보니 가슴이 쿵쿵 뛰었고 이후로 Makers에 + 대해 더욱 관심을 가지게 되었고 같은 목표를 향해 같이 고민하며 열정적으로 다 같이 달려가며 + 성장하는 모습들이 너무 부러웠습니다. + + 그래서 저 또한 뜨거운 열정과 책임감을 가진 Makers분들과 함께 지식을 공유하며 성장하고 싶어 + 지원을 하게 되었습니다. + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.136Z' + updatedAt: '2024-08-07T13:36:52.306Z' + file: null + fileName: null + - id: 312 + group: OB + season: 35 + recruitingQuestionTypeId: 1 + order: 3 + question: 3. makers에서 본인의 역량을 어떻게 활용해서 기여하고 싶은지 간단하게 서술해주세요. + charLimit: 300 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T00:56:23.258Z' + updatedAt: '2024-07-31T00:56:40.202Z' + answer: + id: 2487 + recruitingApplicantId: 151 + recruitingQuestionId: 312 + answer: >- + 저는 2년간 여러 창업 동아리에서 Node 계열 프레임워크를 사용하여 풀스택 개발을 한 경험이 + 있습니다. + + 주로 NestJS를 사용하여 백엔드 개발을 하였고 짧은 시간이지만 3개의 실사용자를 가진 서비스를 + 운영해 보았습니다. 또한 선착순 이벤트를 진행하는 과정에서 발생한 동시성 이슈를 깊이 고민하고 해결한 + 경험이 있습니다. + + 위와 같은 저의 NestJS 개발 역량을 활용하여, 현재 유일하게 NestJS로 개발되어 운영 중인 + ‘공식 홈페이지 팀’을 Spring으로 마이그레이션 하는데 기여하고 싶습니다. + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.141Z' + updatedAt: '2024-08-07T13:36:52.310Z' + file: null + fileName: null + partQuestions: + - id: 324 + group: OB + season: 35 + recruitingQuestionTypeId: 7 + order: 1 + question: |- + 백엔드 개발자 포지션에 지원해주셔서 감사해요 😄 + 백엔드 개발자 포지션은 두 가지의 질문과 자유 형식의 포트폴리오를 받고 있어요. + charLimit: null + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T01:13:20.923Z' + updatedAt: '2024-07-31T01:34:03.592Z' + answer: + id: 6853 + recruitingApplicantId: 151 + recruitingQuestionId: 324 + answer: null + isDeleted: false + isForTest: false + createdAt: '2024-08-07T13:36:52.314Z' + updatedAt: '2024-08-07T13:36:52.314Z' + file: null + fileName: null + - id: 325 + group: OB + season: 35 + recruitingQuestionTypeId: 7 + order: 2 + question: >- + 1. 기술적 도전 과제가 있었던 프로젝트를 예로 들어 설명해주세요. 해당 도전 과제를 어떻게 해결했는지, + 또는 해결하지 못했는지와 그 이유를 포함하여, 그 과정에서 얻은 교훈이 무엇인지 작성해주세요. + charLimit: 1000 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T01:13:53.441Z' + updatedAt: '2024-07-31T01:15:33.475Z' + answer: + id: 2488 + recruitingApplicantId: 151 + recruitingQuestionId: 325 + answer: >- + 저는 마감 시간대에 떨이 상품을 판매하는 점주들과 마감 할인 상품 정보를 필요로 하는 고객들을 위한 + 유통 서비스 플랫폼을 개발하며 기술적 도전을 경험했습니다. + + + 당시 인천대학교와 협약을 맺어 해당 플랫폼을 운영하기 위해 저는 1000명 이상의 동시 사용자들의 + 주문 요청에 대한 동시성을 제어하는 역할을 맡았습니다. 푸시 알림을 통해 고객들에게 마감 할인 상품에 + 대한 정보가 주어지면 특정 시간대, 특정 메뉴에 많은 사용자의 트래픽이 몰려 DB의 count 값에 + 자주 접근하며 조회/수정이 되는 상황이었습니다. 동시성 제어를 하지 않고 일반적인 비즈니스 로직을 + 수행하게 되면 데이터 무결성이 보장되지 않아 사용자들이 유효하지 않은 재고를 기반으로 서비스를 + 이용하게 되는 문제가 발생할 수 있었습니다. + + + 우선 여러 명의 요청을 동시에 받는 상황을 시뮬레이션 하기 위해 Jemter라는 부하 테스트 툴을 + 사용했으며 처음에는 재고가 부족한 상황에 요청이 들어올 경우 단순히 트랜잭션의 Rollback을 통해 + 무결성이 지켜질 것이라고 생각했지만 10명의 동시 요청조차 제어가 되지 않았습니다. + + 또한 DB 접근 시 다양한 Lock과 격리 수준을 적용하여 테스트해 보았지만 각각의 장단점이 명확해서 + 서버의 안전성, 데이터 무결성 보장, 준수한 응답속도, 선착순 요청 순서 보장을 모두 만족하지 + 못했습니다. + + + 그로 인해 Redis, RabbitMQ, Kafka와 같은 외부 인프라를 활용하여 문제를 해결하고자 + 했습니다. + + 하지만 최고의 효율을 가지더라도 과도한 서버 비용 및 정해진 개발 기간과 러닝 커브를 고려하여 + Serverless Redis를 사용해서 분산락을 구현하여 동시성을 제어하였습니다. + + + 특정한 요청에 단순한 응답 값 만을 약속하는 API가 아닌 실사용자들 및 기획 등 다양한 비즈니스적 + 요소를 고려하며 개발하는 과정을 통해 기술 스택 및 이슈 해결에 정해진 최고의 정답이 있는 것이 아닌 + 각 프로젝트의 상황에 맞게 유동적이며 효율적으로 사용해야 함을 배울 수 있었습니다. + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.145Z' + updatedAt: '2024-08-07T13:36:52.320Z' + file: null + fileName: null + - id: 326 + group: OB + season: 35 + recruitingQuestionTypeId: 7 + order: 3 + question: >- + 2. 개발 과정에서의 문제 해결을 위해 다른 파트 혹은 챕터의 팀원와 협력한 경험이 있다면 설명해주세요. + 협력의 과정과 그 결과, 그리고 협력에서 얻은 교훈을 중심으로 작성해주세요. + charLimit: 700 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T01:15:33.928Z' + updatedAt: '2024-07-31T01:55:26.866Z' + answer: + id: 2489 + recruitingApplicantId: 151 + recruitingQuestionId: 326 + answer: >- + 저는 실사용자를 가진 서비스를 운영해 보기 위해 주로 플랫폼 서비스의 백엔드 개발을 담당했습니다. + 그런 과정 중, 일주일간 60만 원이라는 예상치 못한 과금 문제로 팀 전체가 긴급 상황에 + 직면했습니다. + + + 이후 회의에서 프론트엔드 파트와 협력하여 문제의 원인을 찾기 위해 노력하였고 근거 있는 원인은 찾지 + 못했지만 개선 사항을 토대로 추측해 본 결과 프론트엔드 파트에서 재귀적인 API 호출로 인해 과도한 + 트래픽이 발생할 수 있다는 사실을 발견했습니다. 또한 백엔드에서는 API 요청을 제한 없이 처리하고 + 있었고, 이는 인프라에 과부하를 초래하고 있었습니다. + + + 이 문제를 해결하기 위해 API 호출 로직을 수정하고, 호출 제한을 설정하여 무분별한 요청을 + 차단했습니다. 또한 확실한 근거 없이 이슈를 해결하며 서비스를 운영한다는 것은 불안하다고 판단하여 + Google analytics 및 Aws와 Slack을 활용해 로그 알람 시스템을 구축했습니다. + + + 이러한 협력 과정에서 팀원들과의 꼼꼼한 코드 리뷰, 커뮤니케이션을 통한 전체 시스템 파악, 로그의 + 중요성을 배웠습니다. 또한 팀워크를 통해 문제를 해결하며 개인의 성장뿐만 아니라 팀 전체의 역량이 + 함께 향상됨을 경험했습니다. 비록 서비스는 결국 중단되었지만, 협력을 통해 얻은 값진 경험은 앞으로 + 어떤 도전과 문제에 직면하더라도 팀과 함께라면 해결할 수 있다는 자신감을 심어주었습니다. + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.150Z' + updatedAt: '2024-08-07T13:36:52.324Z' + file: null + fileName: null + - id: 327 + group: OB + season: 35 + recruitingQuestionTypeId: 7 + order: 4 + question: 3. 자신을 드러낼 수 있는 개인 블로그나 노션, Github 링크 등을 자유롭게 입력해주세요. + charLimit: 500 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T01:15:55.217Z' + updatedAt: '2024-07-31T01:27:52.415Z' + answer: + id: 2490 + recruitingApplicantId: 151 + recruitingQuestionId: 327 + answer: >- + https://github.com/softmoca + + → 깃허브 링크입니다.(softmoca) + + + https://moca9012.tistory.com/ + + → 개발 첫 시작 부터 작성을 했던 습작인 개발 블로그입니다. + + + https://softmoca.tistory.com/ + + → 2024년 부터 새롭게 정리하고 현재 운영중인 개발 블로그입니다. + + + https://breezy-way-675.notion.site/Makers-Profolio-511930754cf34e28add40054190f5e35 + + → 메이커스 지원 포토폴리오 노션 링크입니다. + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.156Z' + updatedAt: '2024-08-07T13:36:52.328Z' + file: null + fileName: null + - id: 328 + group: OB + season: 35 + recruitingQuestionTypeId: 7 + order: 5 + question: >- + 4. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 있어요. + 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -Playground팀 + -APP팀 + -공식홈페이지팀 + -Crew팀 + -플랫폼팀 + + <플레이스홀더>ex. 1순위 000팀, 2순위 000팀, 3순위 000팀, 4순위 000팀, 5순위 + 000팀 + charLimit: 100 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T01:16:49.884Z' + updatedAt: '2024-08-06T17:46:20.524Z' + answer: + id: 2491 + recruitingApplicantId: 151 + recruitingQuestionId: 328 + answer: |- + 1순위 - 공식 홈페이지 팀 + 2순위 - Crew팀 + 3순위 - 플랫폼팀 + 4순위 - Playground팀 + 5순위 -APP팀 + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.162Z' + updatedAt: '2024-08-07T13:36:52.332Z' + file: null + fileName: null + '401': + description: Unauthorized + headers: + X-Powered-By: + schema: + type: string + example: Express + Access-Control-Allow-Origin: + schema: + type: string + example: '*' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Etag: + schema: + type: string + example: W/"2a-KF3ANmWs7Wh/KFJBeKwSTgv9/EU" + Function-Execution-Id: + schema: + type: string + example: 8pwald4agjzw + X-Cloud-Trace-Context: + schema: + type: string + example: 67efe3e1801549f3b38d9551a2fefc35 + Date: + schema: + type: string + example: Thu, 04 Jul 2024 08:12:27 GMT + Server: + schema: + type: string + example: Google Frontend + Content-Length: + schema: + type: integer + example: '42' + Alt-Svc: + schema: + type: string + example: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content: + application/json: + schema: + type: object + example: + err: true + userMessage: Invalid token + post: + tags: + - default + summary: 지원서 임시저장 + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + picture: + type: string + format: binary + part: + type: string + description: string + example: 서버 + address: + type: string + description: string + example: home1 + birthday: + type: number + description: string + example: 2001.01.23 + college: + type: string + description: string + example: 대학 + gender: + type: string + description: string + example: male + knownPath: + type: string + description: string + example: 지인 추천 + leaveAbsence: + type: boolean + description: bool + example: 'false' + major: + type: string + description: string + example: 통계 + mostRecentSeason: + type: integer + description: int + example: '0' + univYear: + type: integer + description: int + example: '4' + nearestStation: + type: string + description: string + example: 사당역 + answers: + type: string + description: json + example: |- + [ + { + "recruitingQuestionId": 1, + "answer": "5그릇" + }, + { + "recruitingQuestionId": 2, + "answer": "4그릇" + } + ] + willAppjam: + type: boolean + description: bool + example: 'false' + file_28: + type: string + format: binary + file_29: + type: string + format: binary + security: + - bearerAuth: [] + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '1695' + etag: + schema: + type: string + example: W/"69f-97WE+qxoha5hC9Fql8QkB271zZ0" + date: + schema: + type: string + example: Thu, 04 Jul 2024 09:04:57 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + applicant: + id: 151 + group: OB + season: 35 + mostRecentSeason: 34 + part: 서버 + phone: 010-9977-9012 + email: limchangi@naver.com + name: 최영철 + address: 서울 노원구 석계로13길 11-9 + gender: 남자 + birthday: 1999/10/15 + college: 광운대학교 + major: 전자통신공학과 + univYear: 4 + leaveAbsence: false + willAppjam: false + knownPath: null + pic: >- + https://firebasestorage.googleapis.com/v0/b/sopt-recruiting-dev.appspot.com/o/recruiting%2Fapplicants%2F%C3%A1%C2%84%C2%8B%C3%A1%C2%85%C2%A7%C3%A1%C2%84%C2%80%C3%A1%C2%85%C2%AF%C3%A1%C2%86%C2%AB%C3%A1%C2%84%C2%89%C3%A1%C2%85%C2%A1%C3%A1%C2%84%C2%8C%C3%A1%C2%85%C2%B5%C3%A1%C2%86%C2%AB.jpegqNzzmlm?alt=media + nearestStation: 광운대역, 석계역 + applicationPass: true + finalPass: true + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:15:15.652Z' + updatedAt: '2024-08-20T10:38:49.377Z' + submit: true + commonQuestions: + - id: 310 + group: OB + season: 35 + recruitingQuestionTypeId: 1 + order: 1 + question: |- + 1. SOPT에서 어떤 활동을 하셨는지 작성해주세요. + <플레이스홀더>여러 활동을 하신 경우 다 적어주시면 좋아요 :) + - 33기 : 기획파트, 앱잼 OOO Team Leader + - 32기 : iOS파트, 운영팀 + charLimit: 100 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T00:55:02.961Z' + updatedAt: '2024-07-31T00:56:41.720Z' + answer: + id: 2485 + recruitingApplicantId: 151 + recruitingQuestionId: 310 + answer: >- + 34기 : Server 파트, 도커 스터디, 디자인패턴 스터디, 앱잼 유니보이스 서버 파트 + (Lead) + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.132Z' + updatedAt: '2024-08-07T13:36:52.301Z' + file: null + fileName: null + - id: 311 + group: OB + season: 35 + recruitingQuestionTypeId: 1 + order: 2 + question: 2. makers에 지원하신 동기는 무엇인가요? + charLimit: 500 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T00:55:52.805Z' + updatedAt: '2024-07-31T00:56:39.550Z' + answer: + id: 2486 + recruitingApplicantId: 151 + recruitingQuestionId: 311 + answer: >- + 저는 극 E와 N 성향을 가지고 있어 도와줄 수 있는 일 혹은 알고 있는 정보와 지식을 다른 + 사람들에게 공유할 때 행복을 느끼며 더욱 무언가를 배우고 싶다는 열정에 대한 동기를 얻습니다. + + IT 서비스 개발을 하며 손쉽게 접할 수 있는 하나의 서비스를 통해 많은 사람들에게 긍정적인 영향을 + 줄 수 있다는 점이 너무 매력적이었고 꼭 실사용자를 가진 서비스를 운영해 보고 싶다는 꿈을 + 꾸었습니다. + + + 그런 와중 서버 파트 1차 세미나 시간에 Makers 팀장님께서 실시간으로 발생한 버그를 수정하고 + 해결하는 모습을 보았습니다. 저의 꿈을 직접 눈으로 보니 가슴이 쿵쿵 뛰었고 이후로 Makers에 + 대해 더욱 관심을 가지게 되었고 같은 목표를 향해 같이 고민하며 열정적으로 다 같이 달려가며 + 성장하는 모습들이 너무 부러웠습니다. + + 그래서 저 또한 뜨거운 열정과 책임감을 가진 Makers분들과 함께 지식을 공유하며 성장하고 싶어 + 지원을 하게 되었습니다. + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.136Z' + updatedAt: '2024-08-07T13:36:52.306Z' + file: null + fileName: null + - id: 312 + group: OB + season: 35 + recruitingQuestionTypeId: 1 + order: 3 + question: 3. makers에서 본인의 역량을 어떻게 활용해서 기여하고 싶은지 간단하게 서술해주세요. + charLimit: 300 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T00:56:23.258Z' + updatedAt: '2024-07-31T00:56:40.202Z' + answer: + id: 2487 + recruitingApplicantId: 151 + recruitingQuestionId: 312 + answer: >- + 저는 2년간 여러 창업 동아리에서 Node 계열 프레임워크를 사용하여 풀스택 개발을 한 경험이 + 있습니다. + + 주로 NestJS를 사용하여 백엔드 개발을 하였고 짧은 시간이지만 3개의 실사용자를 가진 서비스를 + 운영해 보았습니다. 또한 선착순 이벤트를 진행하는 과정에서 발생한 동시성 이슈를 깊이 고민하고 해결한 + 경험이 있습니다. + + 위와 같은 저의 NestJS 개발 역량을 활용하여, 현재 유일하게 NestJS로 개발되어 운영 중인 + ‘공식 홈페이지 팀’을 Spring으로 마이그레이션 하는데 기여하고 싶습니다. + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.141Z' + updatedAt: '2024-08-07T13:36:52.310Z' + file: null + fileName: null + partQuestions: + - id: 324 + group: OB + season: 35 + recruitingQuestionTypeId: 7 + order: 1 + question: |- + 백엔드 개발자 포지션에 지원해주셔서 감사해요 😄 + 백엔드 개발자 포지션은 두 가지의 질문과 자유 형식의 포트폴리오를 받고 있어요. + charLimit: null + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T01:13:20.923Z' + updatedAt: '2024-07-31T01:34:03.592Z' + answer: + id: 6853 + recruitingApplicantId: 151 + recruitingQuestionId: 324 + answer: null + isDeleted: false + isForTest: false + createdAt: '2024-08-07T13:36:52.314Z' + updatedAt: '2024-08-07T13:36:52.314Z' + file: null + fileName: null + - id: 325 + group: OB + season: 35 + recruitingQuestionTypeId: 7 + order: 2 + question: >- + 1. 기술적 도전 과제가 있었던 프로젝트를 예로 들어 설명해주세요. 해당 도전 과제를 어떻게 해결했는지, + 또는 해결하지 못했는지와 그 이유를 포함하여, 그 과정에서 얻은 교훈이 무엇인지 작성해주세요. + charLimit: 1000 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T01:13:53.441Z' + updatedAt: '2024-07-31T01:15:33.475Z' + answer: + id: 2488 + recruitingApplicantId: 151 + recruitingQuestionId: 325 + answer: >- + 저는 마감 시간대에 떨이 상품을 판매하는 점주들과 마감 할인 상품 정보를 필요로 하는 고객들을 위한 + 유통 서비스 플랫폼을 개발하며 기술적 도전을 경험했습니다. + + + 당시 인천대학교와 협약을 맺어 해당 플랫폼을 운영하기 위해 저는 1000명 이상의 동시 사용자들의 + 주문 요청에 대한 동시성을 제어하는 역할을 맡았습니다. 푸시 알림을 통해 고객들에게 마감 할인 상품에 + 대한 정보가 주어지면 특정 시간대, 특정 메뉴에 많은 사용자의 트래픽이 몰려 DB의 count 값에 + 자주 접근하며 조회/수정이 되는 상황이었습니다. 동시성 제어를 하지 않고 일반적인 비즈니스 로직을 + 수행하게 되면 데이터 무결성이 보장되지 않아 사용자들이 유효하지 않은 재고를 기반으로 서비스를 + 이용하게 되는 문제가 발생할 수 있었습니다. + + + 우선 여러 명의 요청을 동시에 받는 상황을 시뮬레이션 하기 위해 Jemter라는 부하 테스트 툴을 + 사용했으며 처음에는 재고가 부족한 상황에 요청이 들어올 경우 단순히 트랜잭션의 Rollback을 통해 + 무결성이 지켜질 것이라고 생각했지만 10명의 동시 요청조차 제어가 되지 않았습니다. + + 또한 DB 접근 시 다양한 Lock과 격리 수준을 적용하여 테스트해 보았지만 각각의 장단점이 명확해서 + 서버의 안전성, 데이터 무결성 보장, 준수한 응답속도, 선착순 요청 순서 보장을 모두 만족하지 + 못했습니다. + + + 그로 인해 Redis, RabbitMQ, Kafka와 같은 외부 인프라를 활용하여 문제를 해결하고자 + 했습니다. + + 하지만 최고의 효율을 가지더라도 과도한 서버 비용 및 정해진 개발 기간과 러닝 커브를 고려하여 + Serverless Redis를 사용해서 분산락을 구현하여 동시성을 제어하였습니다. + + + 특정한 요청에 단순한 응답 값 만을 약속하는 API가 아닌 실사용자들 및 기획 등 다양한 비즈니스적 + 요소를 고려하며 개발하는 과정을 통해 기술 스택 및 이슈 해결에 정해진 최고의 정답이 있는 것이 아닌 + 각 프로젝트의 상황에 맞게 유동적이며 효율적으로 사용해야 함을 배울 수 있었습니다. + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.145Z' + updatedAt: '2024-08-07T13:36:52.320Z' + file: null + fileName: null + - id: 326 + group: OB + season: 35 + recruitingQuestionTypeId: 7 + order: 3 + question: >- + 2. 개발 과정에서의 문제 해결을 위해 다른 파트 혹은 챕터의 팀원와 협력한 경험이 있다면 설명해주세요. + 협력의 과정과 그 결과, 그리고 협력에서 얻은 교훈을 중심으로 작성해주세요. + charLimit: 700 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T01:15:33.928Z' + updatedAt: '2024-07-31T01:55:26.866Z' + answer: + id: 2489 + recruitingApplicantId: 151 + recruitingQuestionId: 326 + answer: >- + 저는 실사용자를 가진 서비스를 운영해 보기 위해 주로 플랫폼 서비스의 백엔드 개발을 담당했습니다. + 그런 과정 중, 일주일간 60만 원이라는 예상치 못한 과금 문제로 팀 전체가 긴급 상황에 + 직면했습니다. + + + 이후 회의에서 프론트엔드 파트와 협력하여 문제의 원인을 찾기 위해 노력하였고 근거 있는 원인은 찾지 + 못했지만 개선 사항을 토대로 추측해 본 결과 프론트엔드 파트에서 재귀적인 API 호출로 인해 과도한 + 트래픽이 발생할 수 있다는 사실을 발견했습니다. 또한 백엔드에서는 API 요청을 제한 없이 처리하고 + 있었고, 이는 인프라에 과부하를 초래하고 있었습니다. + + + 이 문제를 해결하기 위해 API 호출 로직을 수정하고, 호출 제한을 설정하여 무분별한 요청을 + 차단했습니다. 또한 확실한 근거 없이 이슈를 해결하며 서비스를 운영한다는 것은 불안하다고 판단하여 + Google analytics 및 Aws와 Slack을 활용해 로그 알람 시스템을 구축했습니다. + + + 이러한 협력 과정에서 팀원들과의 꼼꼼한 코드 리뷰, 커뮤니케이션을 통한 전체 시스템 파악, 로그의 + 중요성을 배웠습니다. 또한 팀워크를 통해 문제를 해결하며 개인의 성장뿐만 아니라 팀 전체의 역량이 + 함께 향상됨을 경험했습니다. 비록 서비스는 결국 중단되었지만, 협력을 통해 얻은 값진 경험은 앞으로 + 어떤 도전과 문제에 직면하더라도 팀과 함께라면 해결할 수 있다는 자신감을 심어주었습니다. + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.150Z' + updatedAt: '2024-08-07T13:36:52.324Z' + file: null + fileName: null + - id: 327 + group: OB + season: 35 + recruitingQuestionTypeId: 7 + order: 4 + question: 3. 자신을 드러낼 수 있는 개인 블로그나 노션, Github 링크 등을 자유롭게 입력해주세요. + charLimit: 500 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T01:15:55.217Z' + updatedAt: '2024-07-31T01:27:52.415Z' + answer: + id: 2490 + recruitingApplicantId: 151 + recruitingQuestionId: 327 + answer: >- + https://github.com/softmoca + + → 깃허브 링크입니다.(softmoca) + + + https://moca9012.tistory.com/ + + → 개발 첫 시작 부터 작성을 했던 습작인 개발 블로그입니다. + + + https://softmoca.tistory.com/ + + → 2024년 부터 새롭게 정리하고 현재 운영중인 개발 블로그입니다. + + + https://breezy-way-675.notion.site/Makers-Profolio-511930754cf34e28add40054190f5e35 + + → 메이커스 지원 포토폴리오 노션 링크입니다. + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.156Z' + updatedAt: '2024-08-07T13:36:52.328Z' + file: null + fileName: null + - id: 328 + group: OB + season: 35 + recruitingQuestionTypeId: 7 + order: 5 + question: >- + 4. 희망하는 팀을 순서대로 적어주세요. + + + makers에서는 예비 maker께서 원하는 가치를 실현하는 걸 돕고자 희망하는 팀을 지원받고 있어요. + 각 팀이 만들어가는 가치를 다시 한번 확인해주시고 팀을 지원해주세요. + + -Playground팀 + -APP팀 + -공식홈페이지팀 + -Crew팀 + -플랫폼팀 + + <플레이스홀더>ex. 1순위 000팀, 2순위 000팀, 3순위 000팀, 4순위 000팀, 5순위 + 000팀 + charLimit: 100 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-31T01:16:49.884Z' + updatedAt: '2024-08-06T17:46:20.524Z' + answer: + id: 2491 + recruitingApplicantId: 151 + recruitingQuestionId: 328 + answer: |- + 1순위 - 공식 홈페이지 팀 + 2순위 - Crew팀 + 3순위 - 플랫폼팀 + 4순위 - Playground팀 + 5순위 -APP팀 + isDeleted: false + isForTest: false + createdAt: '2024-07-31T02:31:43.162Z' + updatedAt: '2024-08-07T13:36:52.332Z' + file: null + fileName: null + '401': + description: Unauthorized + headers: + X-Powered-By: + schema: + type: string + example: Express + Access-Control-Allow-Origin: + schema: + type: string + example: '*' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Etag: + schema: + type: string + example: W/"2a-KF3ANmWs7Wh/KFJBeKwSTgv9/EU" + Function-Execution-Id: + schema: + type: string + example: qsvqlkwf15ee + X-Cloud-Trace-Context: + schema: + type: string + example: be3db374f515cfabacd9a8bbd7d14201;o=1 + Date: + schema: + type: string + example: Thu, 04 Jul 2024 09:21:44 GMT + Server: + schema: + type: string + example: Google Frontend + Content-Length: + schema: + type: integer + example: '42' + Alt-Svc: + schema: + type: string + example: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content: + application/json: + schema: + type: object + example: + err: true + userMessage: Invalid token + /recruiting-answer: + post: + tags: + - default + summary: 지원서 제출 + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + picture: + type: string + format: binary + part: + type: string + description: string + example: 서버 + address: + type: string + description: string + example: home1 + birthday: + type: number + description: string + example: 2001.01.23 + college: + type: string + description: string + example: 대학 + gender: + type: string + description: string + example: male + knownPath: + type: string + description: string + example: 지인 추천 + leaveAbsence: + type: boolean + description: bool + example: 'false' + major: + type: string + description: string + example: 통계 + mostRecentSeason: + type: integer + description: string + example: '0' + univYear: + type: integer + description: int + example: '4' + nearestStation: + type: string + description: string + example: 사당역 + answers: + type: string + description: json + example: |- + [ + { + "recruitingQuestionId": 1, + "answer": "5그릇" + }, + { + "recruitingQuestionId": 2, + "answer": "4그릇" + } + ] + willAppjam: + type: boolean + description: bool + example: 'false' + season: + type: integer + example: '1' + group: + type: string + example: OB + pictureUrl: + type: string + security: + - bearerAuth: [] + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '1636' + etag: + schema: + type: string + example: W/"664-ymhk8jG6799tlJrlu1IhvpxHNns" + date: + schema: + type: string + example: Thu, 04 Jul 2024 09:18:54 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + applicant: + id: 1 + group: OB + season: 1 + mostRecentSeason: null + part: 서버 + phone: 010-1234-1234 + email: limchangi@naver.com + name: 홍길동 + address: home1 + gender: male + birthday: 2001.01.23 + college: 대학 + major: 통계 + univYear: 4 + leaveAbsence: false + willAppjam: false + knownPath: 지인 추천 + pic: >- + https://firebasestorage.googleapis.com/v0/b/sopt-recruiting-dev.appspot.com/o/recruiting%2Fapplicants%2Fsample_license.pngMDQ88mk?alt=media + nearestStation: 사당역 + applicationPass: false + finalPass: false + isDeleted: false + isForTest: false + createdAt: '2024-07-04T08:10:58.204Z' + updatedAt: '2024-07-04T08:10:58.204Z' + submit: true + commonQuestions: + - id: 1 + group: OB + season: 1 + recruitingQuestionTypeId: 1 + order: 1 + question: 테스트~ + charLimit: 100 + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-04T08:45:45.304Z' + updatedAt: '2024-07-04T08:45:53.528Z' + answer: + id: 1 + recruitingApplicantId: 1 + recruitingQuestionId: 1 + answer: 5그릇 + isDeleted: false + isForTest: false + createdAt: '2024-07-04T09:04:57.197Z' + updatedAt: '2024-07-04T09:18:54.794Z' + partQuestions: + - id: 2 + group: OB + season: 1 + recruitingQuestionTypeId: 7 + order: 1 + question: 테스트~ + charLimit: null + ignoreCharLimit: false + isDeleted: false + isForTest: false + createdAt: '2024-07-04T08:45:55.102Z' + updatedAt: '2024-07-04T08:46:04.972Z' + answer: + id: 2 + recruitingApplicantId: 1 + recruitingQuestionId: 2 + answer: 4그릇 + isDeleted: false + isForTest: false + createdAt: '2024-07-04T09:04:57.208Z' + updatedAt: '2024-07-04T09:18:54.807Z' + '400': + description: Bad Request + headers: + X-Powered-By: + schema: + type: string + example: Express + Access-Control-Allow-Origin: + schema: + type: string + example: '*' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Etag: + schema: + type: string + example: W/"3d-QHnbS9suUIy0DJ9neVgqT8yzARc" + Function-Execution-Id: + schema: + type: string + example: qsvqn6casp63 + X-Cloud-Trace-Context: + schema: + type: string + example: 3beed715ac5e0926dff4876669cb9f98;o=1 + Date: + schema: + type: string + example: Thu, 04 Jul 2024 09:06:35 GMT + Server: + schema: + type: string + example: Google Frontend + Content-Length: + schema: + type: integer + example: '61' + Alt-Svc: + schema: + type: string + example: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content: + application/json: + schema: + type: object + examples: + example-0: + summary: 지원서 제출 400 누락된 필수정보 + value: + err: true + message: 누락된 정보가 존재합니다. + example-1: + summary: 지원서 제출 401 토큰에러 + value: + err: true + message: 누락된 정보가 존재합니다. + /recruiting-applicant/satisfaction: + post: + tags: + - default + summary: 만족도 점수 + requestBody: + content: + application/json: + schema: + type: object + example: + satisfaction: 5 + security: + - bearerAuth: [] + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '13' + etag: + schema: + type: string + example: W/"d-jjcNx+nWrD8NVIcgaqLDc/Wqpbg" + date: + schema: + type: string + example: Sat, 03 Aug 2024 07:51:26 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + '401': + description: Unauthorized + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '42' + etag: + schema: + type: string + example: W/"2a-KF3ANmWs7Wh/KFJBeKwSTgv9/EU" + date: + schema: + type: string + example: Sat, 03 Aug 2024 07:53:49 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: true + userMessage: Invalid token + /recruiting-auth/my: + get: + tags: + - default + summary: 마이페이지 + security: + - bearerAuth: [] + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '113' + etag: + schema: + type: string + example: W/"71-klnoPX+Bdyzf5c49SIKUypzVygY" + date: + schema: + type: string + example: Wed, 25 Sep 2024 15:50:03 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + season: 35 + name: 임찬기 + part: iOS + submit: true + applicationPass: false + finalPass: false + '401': + description: Unauthorized + headers: + X-Powered-By: + schema: + type: string + example: Express + Access-Control-Allow-Origin: + schema: + type: string + example: '*' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Etag: + schema: + type: string + example: W/"2a-aDef0NyRbIen6G/sQC4A2NmpYyc" + Function-Execution-Id: + schema: + type: string + example: 7ajybwb42nat + X-Cloud-Trace-Context: + schema: + type: string + example: c0b4565e432b7158b318bfba005015ff;o=1 + Date: + schema: + type: string + example: Thu, 11 Jul 2024 13:40:37 GMT + Server: + schema: + type: string + example: Google Frontend + Content-Length: + schema: + type: integer + example: '42' + Alt-Svc: + schema: + type: string + example: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content: + application/json: + schema: + type: object + example: + err: true + userMessage: Expired token + /recruiting-applicant/result/application: + get: + tags: + - default + summary: 마이페이지 서류 합격 확인 + security: + - bearerAuth: [] + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '172' + etag: + schema: + type: string + example: W/"ac-mne/ZKBF3y56K8b6ehnE0p39uBA" + date: + schema: + type: string + example: Thu, 11 Jul 2024 13:39:35 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + season: 1 + seasonName: MAKERS Test + group: OB + name: 홍길동 + pass: false + interviewStart: '2024-06-20 15:27:45' + interviewEnd: '2024-06-20 15:27:45' + '401': + description: Unauthorized + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '42' + etag: + schema: + type: string + example: W/"2a-KF3ANmWs7Wh/KFJBeKwSTgv9/EU" + date: + schema: + type: string + example: Thu, 11 Jul 2024 13:41:13 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: true + userMessage: Invalid token + /recruiting-applicant/result/final: + get: + tags: + - default + summary: 마이페이지 최종 합격 확인 + security: + - bearerAuth: [] + responses: + '200': + description: OK + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '96' + etag: + schema: + type: string + example: W/"60-vv0nSwQjCBywg+Uqd9Xx7pZs73k" + date: + schema: + type: string + example: Thu, 11 Jul 2024 13:42:17 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: false + season: 1 + seasonName: MAKERS Test + group: OB + name: 홍길동 + pass: false + '401': + description: Unauthorized + headers: + x-powered-by: + schema: + type: string + example: Express + access-control-allow-origin: + schema: + type: string + example: '*' + content-type: + schema: + type: string + example: application/json; charset=utf-8 + content-length: + schema: + type: integer + example: '42' + etag: + schema: + type: string + example: W/"2a-KF3ANmWs7Wh/KFJBeKwSTgv9/EU" + date: + schema: + type: string + example: Thu, 11 Jul 2024 13:41:13 GMT + connection: + schema: + type: string + example: keep-alive + keep-alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + err: true + userMessage: Invalid token diff --git a/src/__generated__/api-types/Auth.ts b/src/__generated__/api-types/Auth.ts new file mode 100644 index 00000000..900f9cc2 --- /dev/null +++ b/src/__generated__/api-types/Auth.ts @@ -0,0 +1,34 @@ +/* eslint-disable */ +/* tslint:disable */ +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { SignUpEmailCreateData, SignUpEmailCreatePayload } from './data-contracts'; +import { ContentType, HttpClient, RequestParams } from './http-client'; + +export class Auth extends HttpClient { + /** + * No description + * + * @tags default + * @name SignUpEmailCreate + * @summary Admin Signup + * @request POST:/auth/sign-up/email + * @response `200` `SignUpEmailCreateData` OK + */ + signUpEmailCreate = (data: SignUpEmailCreatePayload, params: RequestParams = {}) => + this.request({ + path: `/auth/sign-up/email`, + method: 'POST', + body: data, + type: ContentType.Json, + format: 'json', + ...params, + }); +} diff --git a/src/__generated__/api-types/RecruitingAnswer.ts b/src/__generated__/api-types/RecruitingAnswer.ts new file mode 100644 index 00000000..9ae08e10 --- /dev/null +++ b/src/__generated__/api-types/RecruitingAnswer.ts @@ -0,0 +1,86 @@ +/* eslint-disable */ +/* tslint:disable */ +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { + RecruitingAnswerCreateData, + RecruitingAnswerCreateError, + RecruitingAnswerCreatePayload, + StoreCreateData, + StoreCreateError, + StoreCreatePayload, + StoreListData, + StoreListError, +} from './data-contracts'; +import { ContentType, HttpClient, RequestParams } from './http-client'; + +export class RecruitingAnswer extends HttpClient { + /** + * No description + * + * @tags default + * @name StoreList + * @summary 임시저장 지원서 조회 + * @request GET:/recruiting-answer/store + * @secure + * @response `200` `StoreListData` OK + * @response `401` `object` Unauthorized + */ + storeList = (params: RequestParams = {}) => + this.request({ + path: `/recruiting-answer/store`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }); + /** + * No description + * + * @tags default + * @name StoreCreate + * @summary 지원서 임시저장 + * @request POST:/recruiting-answer/store + * @secure + * @response `200` `StoreCreateData` OK + * @response `401` `object` Unauthorized + */ + storeCreate = (data: StoreCreatePayload, params: RequestParams = {}) => + this.request({ + path: `/recruiting-answer/store`, + method: 'POST', + body: data, + secure: true, + type: ContentType.FormData, + format: 'json', + ...params, + }); + /** + * No description + * + * @tags default + * @name RecruitingAnswerCreate + * @summary 지원서 제출 + * @request POST:/recruiting-answer + * @secure + * @response `200` `RecruitingAnswerCreateData` OK + * @response `400` `object` Bad Request + */ + recruitingAnswerCreate = (data: RecruitingAnswerCreatePayload, params: RequestParams = {}) => + this.request({ + path: `/recruiting-answer`, + method: 'POST', + body: data, + secure: true, + type: ContentType.FormData, + format: 'json', + ...params, + }); +} diff --git a/src/__generated__/api-types/RecruitingApplicant.ts b/src/__generated__/api-types/RecruitingApplicant.ts new file mode 100644 index 00000000..7cff2fd6 --- /dev/null +++ b/src/__generated__/api-types/RecruitingApplicant.ts @@ -0,0 +1,83 @@ +/* eslint-disable */ +/* tslint:disable */ +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { + ResultApplicationListData, + ResultApplicationListError, + ResultFinalListData, + ResultFinalListError, + SatisfactionCreateData, + SatisfactionCreateError, + SatisfactionCreatePayload, +} from './data-contracts'; +import { ContentType, HttpClient, RequestParams } from './http-client'; + +export class RecruitingApplicant extends HttpClient { + /** + * No description + * + * @tags default + * @name SatisfactionCreate + * @summary 만족도 점수 + * @request POST:/recruiting-applicant/satisfaction + * @secure + * @response `200` `SatisfactionCreateData` OK + * @response `401` `object` Unauthorized + */ + satisfactionCreate = (data: SatisfactionCreatePayload, params: RequestParams = {}) => + this.request({ + path: `/recruiting-applicant/satisfaction`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }); + /** + * No description + * + * @tags default + * @name ResultApplicationList + * @summary 마이페이지 서류 합격 확인 + * @request GET:/recruiting-applicant/result/application + * @secure + * @response `200` `ResultApplicationListData` OK + * @response `401` `object` Unauthorized + */ + resultApplicationList = (params: RequestParams = {}) => + this.request({ + path: `/recruiting-applicant/result/application`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }); + /** + * No description + * + * @tags default + * @name ResultFinalList + * @summary 마이페이지 최종 합격 확인 + * @request GET:/recruiting-applicant/result/final + * @secure + * @response `200` `ResultFinalListData` OK + * @response `401` `object` Unauthorized + */ + resultFinalList = (params: RequestParams = {}) => + this.request({ + path: `/recruiting-applicant/result/final`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }); +} diff --git a/src/__generated__/api-types/RecruitingAuth.ts b/src/__generated__/api-types/RecruitingAuth.ts new file mode 100644 index 00000000..e6228edb --- /dev/null +++ b/src/__generated__/api-types/RecruitingAuth.ts @@ -0,0 +1,177 @@ +/* eslint-disable */ +/* tslint:disable */ +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { + ChangePasswordCreateData, + ChangePasswordCreateError, + ChangePasswordCreatePayload, + CheckUserCreateData, + CheckUserCreateError, + CheckUserCreatePayload, + GetRecruitingAuthData, + GetRecruitingAuthError, + LoginCreateData, + LoginCreateError, + LoginCreatePayload, + SignupCreateData, + SignupCreateError, + SignupCreatePayload, + VerifyEmailCreateData, + VerifyEmailCreateError, + VerifyEmailCreatePayload, + VerifySendCreateData, + VerifySendCreatePayload, +} from './data-contracts'; +import { ContentType, HttpClient, RequestParams } from './http-client'; + +export class RecruitingAuth extends HttpClient { + /** + * No description + * + * @tags default + * @name VerifySendCreate + * @summary 이메일 인증 코드 전송 + * @request POST:/recruiting-auth/verify/send + * @response `200` `VerifySendCreateData` OK + */ + verifySendCreate = (data: VerifySendCreatePayload, params: RequestParams = {}) => + this.request({ + path: `/recruiting-auth/verify/send`, + method: 'POST', + body: data, + type: ContentType.Json, + format: 'json', + ...params, + }); + /** + * No description + * + * @tags default + * @name VerifyEmailCreate + * @summary 이메일 인증 코드 확인 + * @request POST:/recruiting-auth/verify/email + * @response `200` `VerifyEmailCreateData` OK + * @response `400` `object` Bad Request + */ + verifyEmailCreate = (data: VerifyEmailCreatePayload, params: RequestParams = {}) => + this.request({ + path: `/recruiting-auth/verify/email`, + method: 'POST', + body: data, + type: ContentType.Json, + format: 'json', + ...params, + }); + /** + * No description + * + * @tags default + * @name SignupCreate + * @summary 지원자 회원가입 + * @request POST:/recruiting-auth/signup + * @secure + * @response `200` `SignupCreateData` OK + * @response `400` `object` Bad Request + * @response `403` `object` Forbidden + */ + signupCreate = (data: SignupCreatePayload, params: RequestParams = {}) => + this.request({ + path: `/recruiting-auth/signup`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }); + /** + * No description + * + * @tags default + * @name CheckUserCreate + * @summary 유저 확인 (비밀번호 변경) + * @request POST:/recruiting-auth/check/user + * @secure + * @response `200` `CheckUserCreateData` OK + * @response `400` `object` Bad Request + */ + checkUserCreate = (data: CheckUserCreatePayload, params: RequestParams = {}) => + this.request({ + path: `/recruiting-auth/check/user`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }); + /** + * No description + * + * @tags default + * @name ChangePasswordCreate + * @summary 비밀번호 변경 + * @request POST:/recruiting-auth/change/password + * @secure + * @response `200` `ChangePasswordCreateData` OK + * @response `403` `object` Forbidden + */ + changePasswordCreate = (data: ChangePasswordCreatePayload, params: RequestParams = {}) => + this.request({ + path: `/recruiting-auth/change/password`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }); + /** + * No description + * + * @tags default + * @name LoginCreate + * @summary 로그인 + * @request POST:/recruiting-auth/login + * @secure + * @response `200` `LoginCreateData` OK + * @response `403` `object` Forbidden + */ + loginCreate = (data: LoginCreatePayload, params: RequestParams = {}) => + this.request({ + path: `/recruiting-auth/login`, + method: 'POST', + body: data, + secure: true, + type: ContentType.Json, + format: 'json', + ...params, + }); + /** + * No description + * + * @tags default + * @name GetRecruitingAuth + * @summary 마이페이지 + * @request GET:/recruiting-auth/my + * @secure + * @response `200` `GetRecruitingAuthData` OK + * @response `401` `object` Unauthorized + */ + getRecruitingAuth = (params: RequestParams = {}) => + this.request({ + path: `/recruiting-auth/my`, + method: 'GET', + secure: true, + format: 'json', + ...params, + }); +} diff --git a/src/__generated__/api-types/RecruitingQuestion.ts b/src/__generated__/api-types/RecruitingQuestion.ts new file mode 100644 index 00000000..5b177b81 --- /dev/null +++ b/src/__generated__/api-types/RecruitingQuestion.ts @@ -0,0 +1,41 @@ +/* eslint-disable */ +/* tslint:disable */ +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { ListListData } from './data-contracts'; +import { HttpClient, RequestParams } from './http-client'; + +export class RecruitingQuestion extends HttpClient { + /** + * No description + * + * @tags default + * @name ListList + * @summary 질문 리스트 조회 (From Admin) + * @request GET:/recruiting-question/list + * @response `200` `ListListData` OK + */ + listList = ( + query?: { + /** @example "52" */ + season?: number; + /** @example "OB" */ + group?: string; + }, + params: RequestParams = {}, + ) => + this.request({ + path: `/recruiting-question/list`, + method: 'GET', + query: query, + format: 'json', + ...params, + }); +} diff --git a/src/__generated__/api-types/RecruitingSeason.ts b/src/__generated__/api-types/RecruitingSeason.ts new file mode 100644 index 00000000..c26eb5d5 --- /dev/null +++ b/src/__generated__/api-types/RecruitingSeason.ts @@ -0,0 +1,32 @@ +/* eslint-disable */ +/* tslint:disable */ +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +import { LatestListData } from './data-contracts'; +import { HttpClient, RequestParams } from './http-client'; + +export class RecruitingSeason extends HttpClient { + /** + * No description + * + * @tags default + * @name LatestList + * @summary 최신 기수 정보 조회 (From Admin) + * @request GET:/recruiting-season/latest + * @response `200` `LatestListData` OK + */ + latestList = (params: RequestParams = {}) => + this.request({ + path: `/recruiting-season/latest`, + method: 'GET', + format: 'json', + ...params, + }); +} diff --git a/src/__generated__/api-types/data-contracts.ts b/src/__generated__/api-types/data-contracts.ts new file mode 100644 index 00000000..7526a8c0 --- /dev/null +++ b/src/__generated__/api-types/data-contracts.ts @@ -0,0 +1,257 @@ +/* eslint-disable */ +/* tslint:disable */ +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +/** @example {"email":"35th_makers_recruiting@sopt.org","password":"makers!35"} */ +export type SignUpEmailCreatePayload = object; + +export type SignUpEmailCreateData = object; + +export type LatestListData = object; + +/** @example {"email":"limchangi@naver.com","season":44,"group":"OB","isSignup":true} */ +export type VerifySendCreatePayload = object; + +export type VerifySendCreateData = object; + +/** @example {"email":"limchangi@naver.com","code":"WJPQIX"} */ +export type VerifyEmailCreatePayload = object; + +export type VerifyEmailCreateData = object; + +export type VerifyEmailCreateError = object; + +/** @example {"email":"limchangi@naver.com","password":"1234","passwordCheck":"1234","name":"홍길동","phone":"010-1234-1234","season":6,"group":"OB"} */ +export type SignupCreatePayload = object; + +export type SignupCreateData = object; + +export type SignupCreateError = object; + +/** @example {"email":"limchangi@naver.com","name":"홍길동","season":1,"group":"OB"} */ +export type CheckUserCreatePayload = object; + +export type CheckUserCreateData = object; + +export type CheckUserCreateError = object; + +/** @example {"email":"limchangi@naver.com","season":35,"group":"OB","password":"1234","passwordCheck":"1234"} */ +export type ChangePasswordCreatePayload = object; + +export type ChangePasswordCreateData = object; + +export type ChangePasswordCreateError = object; + +/** @example {"email":"limchangi@naver.com","season":6,"group":"OB","password":"1234"} */ +export type LoginCreatePayload = object; + +export type LoginCreateData = object; + +export type LoginCreateError = object; + +export type ListListData = object; + +export type StoreListData = object; + +export type StoreListError = object; + +export interface StoreCreatePayload { + /** @format binary */ + picture?: File; + /** + * string + * @example "서버" + */ + part?: string; + /** + * string + * @example "home1" + */ + address?: string; + /** + * string + * @example "2001.01.23" + */ + birthday?: number; + /** + * string + * @example "대학" + */ + college?: string; + /** + * string + * @example "male" + */ + gender?: string; + /** + * string + * @example "지인 추천" + */ + knownPath?: string; + /** + * bool + * @example "false" + */ + leaveAbsence?: boolean; + /** + * string + * @example "통계" + */ + major?: string; + /** + * int + * @example "0" + */ + mostRecentSeason?: number; + /** + * int + * @example "4" + */ + univYear?: number; + /** + * string + * @example "사당역" + */ + nearestStation?: string; + /** + * json + * @example "[ + * { + * "recruitingQuestionId": 1, + * "answer": "5그릇" + * }, + * { + * "recruitingQuestionId": 2, + * "answer": "4그릇" + * } + * ]" + */ + answers?: string; + /** + * bool + * @example "false" + */ + willAppjam?: boolean; + /** @format binary */ + file_28?: File; + /** @format binary */ + file_29?: File; +} + +export type StoreCreateData = object; + +export type StoreCreateError = object; + +export interface RecruitingAnswerCreatePayload { + /** @format binary */ + picture?: File; + /** + * string + * @example "서버" + */ + part?: string; + /** + * string + * @example "home1" + */ + address?: string; + /** + * string + * @example "2001.01.23" + */ + birthday?: number; + /** + * string + * @example "대학" + */ + college?: string; + /** + * string + * @example "male" + */ + gender?: string; + /** + * string + * @example "지인 추천" + */ + knownPath?: string; + /** + * bool + * @example "false" + */ + leaveAbsence?: boolean; + /** + * string + * @example "통계" + */ + major?: string; + /** + * string + * @example "0" + */ + mostRecentSeason?: number; + /** + * int + * @example "4" + */ + univYear?: number; + /** + * string + * @example "사당역" + */ + nearestStation?: string; + /** + * json + * @example "[ + * { + * "recruitingQuestionId": 1, + * "answer": "5그릇" + * }, + * { + * "recruitingQuestionId": 2, + * "answer": "4그릇" + * } + * ]" + */ + answers?: string; + /** + * bool + * @example "false" + */ + willAppjam?: boolean; + /** @example "1" */ + season?: number; + /** @example "OB" */ + group?: string; + pictureUrl?: string; +} + +export type RecruitingAnswerCreateData = object; + +export type RecruitingAnswerCreateError = object; + +/** @example {"satisfaction":5} */ +export type SatisfactionCreatePayload = object; + +export type SatisfactionCreateData = object; + +export type SatisfactionCreateError = object; + +export type GetRecruitingAuthData = object; + +export type GetRecruitingAuthError = object; + +export type ResultApplicationListData = object; + +export type ResultApplicationListError = object; + +export type ResultFinalListData = object; + +export type ResultFinalListError = object; diff --git a/src/__generated__/api-types/http-client.ts b/src/__generated__/api-types/http-client.ts new file mode 100644 index 00000000..dedb6c45 --- /dev/null +++ b/src/__generated__/api-types/http-client.ts @@ -0,0 +1,220 @@ +/* eslint-disable */ +/* tslint:disable */ +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +export type QueryParamsType = Record; +export type ResponseFormat = keyof Omit; + +export interface FullRequestParams extends Omit { + /** set parameter to `true` for call `securityWorker` for this request */ + secure?: boolean; + /** request path */ + path: string; + /** content type of request body */ + type?: ContentType; + /** query params */ + query?: QueryParamsType; + /** format of response (i.e. response.json() -> format: "json") */ + format?: ResponseFormat; + /** request body */ + body?: unknown; + /** base url */ + baseUrl?: string; + /** request cancellation token */ + cancelToken?: CancelToken; +} + +export type RequestParams = Omit; + +export interface ApiConfig { + baseUrl?: string; + baseApiParams?: Omit; + securityWorker?: (securityData: SecurityDataType | null) => Promise | RequestParams | void; + customFetch?: typeof fetch; +} + +export interface HttpResponse extends Response { + data: D; + error: E; +} + +type CancelToken = Symbol | string | number; + +export enum ContentType { + Json = 'application/json', + FormData = 'multipart/form-data', + UrlEncoded = 'application/x-www-form-urlencoded', + Text = 'text/plain', +} + +export class HttpClient { + public baseUrl: string = 'http://{{host}}'; + private securityData: SecurityDataType | null = null; + private securityWorker?: ApiConfig['securityWorker']; + private abortControllers = new Map(); + private customFetch = (...fetchParams: Parameters) => fetch(...fetchParams); + + private baseApiParams: RequestParams = { + credentials: 'same-origin', + headers: {}, + redirect: 'follow', + referrerPolicy: 'no-referrer', + }; + + constructor(apiConfig: ApiConfig = {}) { + Object.assign(this, apiConfig); + } + + public setSecurityData = (data: SecurityDataType | null) => { + this.securityData = data; + }; + + protected encodeQueryParam(key: string, value: any) { + const encodedKey = encodeURIComponent(key); + return `${encodedKey}=${encodeURIComponent(typeof value === 'number' ? value : `${value}`)}`; + } + + protected addQueryParam(query: QueryParamsType, key: string) { + return this.encodeQueryParam(key, query[key]); + } + + protected addArrayQueryParam(query: QueryParamsType, key: string) { + const value = query[key]; + return value.map((v: any) => this.encodeQueryParam(key, v)).join('&'); + } + + protected toQueryString(rawQuery?: QueryParamsType): string { + const query = rawQuery || {}; + const keys = Object.keys(query).filter((key) => 'undefined' !== typeof query[key]); + return keys + .map((key) => (Array.isArray(query[key]) ? this.addArrayQueryParam(query, key) : this.addQueryParam(query, key))) + .join('&'); + } + + protected addQueryParams(rawQuery?: QueryParamsType): string { + const queryString = this.toQueryString(rawQuery); + return queryString ? `?${queryString}` : ''; + } + + private contentFormatters: Record any> = { + [ContentType.Json]: (input: any) => + input !== null && (typeof input === 'object' || typeof input === 'string') ? JSON.stringify(input) : input, + [ContentType.Text]: (input: any) => (input !== null && typeof input !== 'string' ? JSON.stringify(input) : input), + [ContentType.FormData]: (input: any) => + Object.keys(input || {}).reduce((formData, key) => { + const property = input[key]; + formData.append( + key, + property instanceof Blob + ? property + : typeof property === 'object' && property !== null + ? JSON.stringify(property) + : `${property}`, + ); + return formData; + }, new FormData()), + [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input), + }; + + protected mergeRequestParams(params1: RequestParams, params2?: RequestParams): RequestParams { + return { + ...this.baseApiParams, + ...params1, + ...(params2 || {}), + headers: { + ...(this.baseApiParams.headers || {}), + ...(params1.headers || {}), + ...((params2 && params2.headers) || {}), + }, + }; + } + + protected createAbortSignal = (cancelToken: CancelToken): AbortSignal | undefined => { + if (this.abortControllers.has(cancelToken)) { + const abortController = this.abortControllers.get(cancelToken); + if (abortController) { + return abortController.signal; + } + return void 0; + } + + const abortController = new AbortController(); + this.abortControllers.set(cancelToken, abortController); + return abortController.signal; + }; + + public abortRequest = (cancelToken: CancelToken) => { + const abortController = this.abortControllers.get(cancelToken); + + if (abortController) { + abortController.abort(); + this.abortControllers.delete(cancelToken); + } + }; + + public request = async ({ + body, + secure, + path, + type, + query, + format, + baseUrl, + cancelToken, + ...params + }: FullRequestParams): Promise> => { + const secureParams = + ((typeof secure === 'boolean' ? secure : this.baseApiParams.secure) && + this.securityWorker && + (await this.securityWorker(this.securityData))) || + {}; + const requestParams = this.mergeRequestParams(params, secureParams); + const queryString = query && this.toQueryString(query); + const payloadFormatter = this.contentFormatters[type || ContentType.Json]; + const responseFormat = format || requestParams.format; + + return this.customFetch(`${baseUrl || this.baseUrl || ''}${path}${queryString ? `?${queryString}` : ''}`, { + ...requestParams, + headers: { + ...(requestParams.headers || {}), + ...(type && type !== ContentType.FormData ? { 'Content-Type': type } : {}), + }, + signal: (cancelToken ? this.createAbortSignal(cancelToken) : requestParams.signal) || null, + body: typeof body === 'undefined' || body === null ? null : payloadFormatter(body), + }).then(async (response) => { + const r = response.clone() as HttpResponse; + r.data = null as unknown as T; + r.error = null as unknown as E; + + const data = !responseFormat + ? r + : await response[responseFormat]() + .then((data) => { + if (r.ok) { + r.data = data; + } else { + r.error = data; + } + return r; + }) + .catch((e) => { + r.error = e; + return r; + }); + + if (cancelToken) { + this.abortControllers.delete(cancelToken); + } + + if (!response.ok) throw data; + return data; + }); + }; +} diff --git a/src/__generated__/api.d.ts b/src/__generated__/api.d.ts new file mode 100644 index 00000000..6a70ebcb --- /dev/null +++ b/src/__generated__/api.d.ts @@ -0,0 +1,1147 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/auth/sign-up/email": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Admin Signup */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-season/latest": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 최신 기수 정보 조회 (From Admin) */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/verify/send": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 이메일 인증 코드 전송 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/verify/email": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 이메일 인증 코드 확인 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/signup": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 지원자 회원가입 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/check/user": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 유저 확인 (비밀번호 변경) */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/change/password": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 비밀번호 변경 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/login": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 로그인 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-question/list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 질문 리스트 조회 (From Admin) */ + get: { + parameters: { + query?: { + /** @example 52 */ + season?: number; + /** @example OB */ + group?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-answer/store": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 임시저장 지원서 조회 */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + /** 지원서 임시저장 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "multipart/form-data": { + /** Format: binary */ + picture?: string; + /** + * @description string + * @example 서버 + */ + part?: string; + /** + * @description string + * @example home1 + */ + address?: string; + /** + * @description string + * @example 2001.01.23 + */ + birthday?: number; + /** + * @description string + * @example 대학 + */ + college?: string; + /** + * @description string + * @example male + */ + gender?: string; + /** + * @description string + * @example 지인 추천 + */ + knownPath?: string; + /** + * @description bool + * @example false + */ + leaveAbsence?: boolean; + /** + * @description string + * @example 통계 + */ + major?: string; + /** + * @description int + * @example 0 + */ + mostRecentSeason?: number; + /** + * @description int + * @example 4 + */ + univYear?: number; + /** + * @description string + * @example 사당역 + */ + nearestStation?: string; + /** + * @description json + * @example [ + * { + * "recruitingQuestionId": 1, + * "answer": "5그릇" + * }, + * { + * "recruitingQuestionId": 2, + * "answer": "4그릇" + * } + * ] + */ + answers?: string; + /** + * @description bool + * @example false + */ + willAppjam?: boolean; + /** Format: binary */ + file_28?: string; + /** Format: binary */ + file_29?: string; + }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-answer": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 지원서 제출 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "multipart/form-data": { + /** Format: binary */ + picture?: string; + /** + * @description string + * @example 서버 + */ + part?: string; + /** + * @description string + * @example home1 + */ + address?: string; + /** + * @description string + * @example 2001.01.23 + */ + birthday?: number; + /** + * @description string + * @example 대학 + */ + college?: string; + /** + * @description string + * @example male + */ + gender?: string; + /** + * @description string + * @example 지인 추천 + */ + knownPath?: string; + /** + * @description bool + * @example false + */ + leaveAbsence?: boolean; + /** + * @description string + * @example 통계 + */ + major?: string; + /** + * @description string + * @example 0 + */ + mostRecentSeason?: number; + /** + * @description int + * @example 4 + */ + univYear?: number; + /** + * @description string + * @example 사당역 + */ + nearestStation?: string; + /** + * @description json + * @example [ + * { + * "recruitingQuestionId": 1, + * "answer": "5그릇" + * }, + * { + * "recruitingQuestionId": 2, + * "answer": "4그릇" + * } + * ] + */ + answers?: string; + /** + * @description bool + * @example false + */ + willAppjam?: boolean; + /** @example 1 */ + season?: number; + /** @example OB */ + group?: string; + pictureUrl?: string; + }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Bad Request */ + 400: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-applicant/satisfaction": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** 만족도 점수 */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": Record; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-auth/my": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 마이페이지 */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "X-Powered-By"?: string; + "Access-Control-Allow-Origin"?: string; + "Content-Type"?: string; + Etag?: string; + "Function-Execution-Id"?: string; + "X-Cloud-Trace-Context"?: string; + Date?: string; + Server?: string; + "Content-Length"?: number; + "Alt-Svc"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-applicant/result/application": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 마이페이지 서류 합격 확인 */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/recruiting-applicant/result/final": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** 마이페이지 최종 합격 확인 */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + "x-powered-by"?: string; + "access-control-allow-origin"?: string; + "content-type"?: string; + "content-length"?: number; + etag?: string; + date?: string; + connection?: string; + "keep-alive"?: string; + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export type operations = Record; diff --git a/src/__generated__/api.ts b/src/__generated__/api.ts new file mode 100644 index 00000000..0c71006e --- /dev/null +++ b/src/__generated__/api.ts @@ -0,0 +1,4 @@ +import createClient from 'openapi-fetch'; +import { paths } from './api-schema'; + +export const fetcher = createClient({ baseUrl: import.meta.env.VITE_BASE_URL }); diff --git a/src/common/apis/fetcher.ts b/src/common/apis/fetcher.ts new file mode 100644 index 00000000..154c8536 --- /dev/null +++ b/src/common/apis/fetcher.ts @@ -0,0 +1,45 @@ +const baseURL = import.meta.env.VITE_BASE_URL; + +type StandardHeaders = 'Content-Type' | 'Authorization' | 'Accept' | 'Cache-Control' | 'User-Agent'; +type RequestMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'; + +export class CustomError extends Error { + status: number; + + constructor(message: string, status: number) { + super(message); + this.status = status; + } +} + +interface FetchOptions extends Omit { + method?: RequestMethod; + headers?: Partial>; + body?: Record; + params?: Record; +} + +const fetcher = async (url: string, options: FetchOptions = {}) => { + const { body, params, headers = {}, ...rest } = options; + const urlWithParams = params ? `${url}?${new URLSearchParams(params).toString()}` : url; + const isFormData = body instanceof FormData; + + if (!isFormData) { + headers['Content-Type'] = 'application/json'; + } + + const response = await fetch(`${baseURL}${urlWithParams}`, { + headers, + body: isFormData ? body : JSON.stringify(body), + ...rest, + }); + + if (!response.ok) { + const errMsg = await response.json(); + throw new CustomError(errMsg.userMessage, response.status); + } + + return response.json(); +}; + +export default fetcher; diff --git a/src/common/apis/getRecruitingInfo.ts b/src/common/apis/getRecruitingInfo.ts index a7859ca3..d62c84b6 100644 --- a/src/common/apis/getRecruitingInfo.ts +++ b/src/common/apis/getRecruitingInfo.ts @@ -1,7 +1,7 @@ -import instance from '@apis/instance'; +import fetcher from '@apis/fetcher'; export const getRecruitingInfo = async () => { - const res = await instance.get('/recruiting-season/latest'); + const res = await fetcher('/recruiting-season/latest', { method: 'GET' }); return res; }; diff --git a/src/common/apis/instance.ts b/src/common/apis/instance.ts deleted file mode 100644 index 7948729b..00000000 --- a/src/common/apis/instance.ts +++ /dev/null @@ -1,10 +0,0 @@ -import axios from 'axios'; - -const instance = axios.create({ - baseURL: import.meta.env.VITE_BASE_URL, - headers: { - 'Content-Type': 'application/json', - }, -}); - -export default instance; diff --git a/src/common/apis/tokenInstance.ts b/src/common/apis/tokenInstance.ts index 92ed2687..6eb9ce5e 100644 --- a/src/common/apis/tokenInstance.ts +++ b/src/common/apis/tokenInstance.ts @@ -1,5 +1,5 @@ +import { isBefore } from '@utils/dateFormatter'; import axios from 'axios'; -import { isBefore } from 'date-fns'; const tokenInstance = axios.create({ baseURL: import.meta.env.VITE_BASE_URL, diff --git a/src/common/assets/NowsoptLogo.tsx b/src/common/assets/NowsoptLogo.tsx deleted file mode 100644 index 6282842e..00000000 --- a/src/common/assets/NowsoptLogo.tsx +++ /dev/null @@ -1,327 +0,0 @@ -const NowsoptLogo = ({ className }: { className?: string }) => { - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -}; - -export default NowsoptLogo; diff --git a/src/common/assets/SoptLogo.tsx b/src/common/assets/SoptLogo.tsx new file mode 100644 index 00000000..4c27c3b6 --- /dev/null +++ b/src/common/assets/SoptLogo.tsx @@ -0,0 +1,49 @@ +const SoptLogo = ({ className }: { className?: string }) => { + return ( + + + + + + + + + + + + + + + + + ); +}; + +export default SoptLogo; diff --git a/src/common/components/Button/AmplitudeEventTrack.tsx b/src/common/components/Button/AmplitudeEventTrack.tsx new file mode 100644 index 00000000..620154e2 --- /dev/null +++ b/src/common/components/Button/AmplitudeEventTrack.tsx @@ -0,0 +1,13 @@ +import { track } from '@amplitude/analytics-browser'; +import type { ReactNode } from 'react'; + +interface AmplitudeEventTrackProps { + eventName?: string; // amplitude event name + children: ReactNode; +} + +const AmplitudeEventTrack = ({ eventName, children }: AmplitudeEventTrackProps) => { + return
(eventName ? track(eventName) : null)}>{children}
; +}; + +export default AmplitudeEventTrack; diff --git a/src/common/components/Button/index.tsx b/src/common/components/Button/index.tsx index 48430d18..03968c56 100644 --- a/src/common/components/Button/index.tsx +++ b/src/common/components/Button/index.tsx @@ -1,14 +1,16 @@ -import { useContext, useId, type ButtonHTMLAttributes, type ReactNode } from 'react'; +import { useId, type ButtonHTMLAttributes, type ReactNode } from 'react'; import { Link, To } from 'react-router-dom'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import ButtonLoading from 'views/loadings/ButtonLoading'; import { buttonFontVar, container, outsideBox, paddings } from './style.css'; +import AmplitudeEventTrack from './AmplitudeEventTrack'; interface ButtonProps extends ButtonHTMLAttributes { children?: ReactNode; className?: string; + eventName?: string; buttonStyle?: 'solid' | 'line'; isLoading?: boolean; padding?: '15x32' | '13x20' | '10x24' | '15x25'; @@ -19,6 +21,7 @@ interface ButtonProps extends ButtonHTMLAttributes { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const { disabled, type = 'button' } = buttonElementProps; const Tag = isLink ? Link : 'button'; @@ -38,18 +41,20 @@ const Button = ({ } return ( - -
- {isLoading ? : children} -
-
+ + +
+ {isLoading ? : children} +
+
+
); }; diff --git a/src/common/components/Callout/index.tsx b/src/common/components/Callout/index.tsx index f2de0556..a23d1cf1 100644 --- a/src/common/components/Callout/index.tsx +++ b/src/common/components/Callout/index.tsx @@ -1,8 +1,8 @@ import { colors } from '@sopt-makers/colors'; import { IconAlertCircle } from '@sopt-makers/icons'; -import { useContext, type HTMLAttributes, type ReactNode } from 'react'; +import { type HTMLAttributes, type ReactNode } from 'react'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { buttonVar, container, warningWrapperVar } from './style.css'; @@ -13,7 +13,7 @@ interface CalloutProps extends HTMLAttributes { } const Callout = ({ children, size = 'sm', Button, ...calloutElementProps }: CalloutProps) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); return (
diff --git a/src/common/components/Dialog/index.tsx b/src/common/components/Dialog/index.tsx index b4a23bdb..43af777c 100644 --- a/src/common/components/Dialog/index.tsx +++ b/src/common/components/Dialog/index.tsx @@ -1,7 +1,7 @@ -import { forwardRef, useContext, type DialogHTMLAttributes, type ReactNode } from 'react'; +import { forwardRef, type DialogHTMLAttributes, type ReactNode } from 'react'; import { createPortal } from 'react-dom'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { containerVar } from './style.css'; @@ -10,7 +10,7 @@ interface DialogProps extends DialogHTMLAttributes { } const Dialog = forwardRef(({ children, ...dialogElementProps }: DialogProps, ref) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); return createPortal( diff --git a/src/common/components/Input/apis.ts b/src/common/components/Input/apis.ts index d90e0190..d8f63a0e 100644 --- a/src/common/components/Input/apis.ts +++ b/src/common/components/Input/apis.ts @@ -1,34 +1,43 @@ -import instance from '@apis/instance'; +import fetcher from '@apis/fetcher'; import { CheckUserRequest } from './types'; export const checkUser = async (userInfo: CheckUserRequest) => { const { email, name, season, group } = userInfo; - const res = await instance.post('/recruiting-auth/check/user', { - email, - name, - season, - group, + const res = await fetcher('/recruiting-auth/check/user', { + method: 'POST', + body: { + email, + name, + season, + group, + }, }); return res; }; export const sendVerificationCode = async (email: string, season: number, group: string, isSignup: boolean) => { - const res = await instance.post('/recruiting-auth/verify/send', { - email, - season, - group, - isSignup, + const res = await fetcher('/recruiting-auth/verify/send', { + method: 'POST', + body: { + email, + season, + group, + isSignup, + }, }); return res; }; export const checkVerificationCode = async (email: string, code: string) => { - const res = await instance.post('/recruiting-auth/verify/email', { - email, - code, + const res = await fetcher('/recruiting-auth/verify/email', { + method: 'POST', + body: { + email, + code, + }, }); return res; diff --git a/src/common/components/Input/components/Description/index.tsx b/src/common/components/Input/components/Description/index.tsx index 0101107f..c2df2691 100644 --- a/src/common/components/Input/components/Description/index.tsx +++ b/src/common/components/Input/components/Description/index.tsx @@ -1,13 +1,11 @@ -import { useContext } from 'react'; - import { TextBoxProps } from '@components/Input/types'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { descriptionFontVar, descriptionVar } from './style.css'; // TextBox 내부 Input 하단의 부가텍스트 const Description = ({ children, styleType = 'default' }: Pick) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); return
{children}
; }; diff --git a/src/common/components/Input/components/InputButton/index.tsx b/src/common/components/Input/components/InputButton/index.tsx index b7208dcb..8914cf79 100644 --- a/src/common/components/Input/components/InputButton/index.tsx +++ b/src/common/components/Input/components/InputButton/index.tsx @@ -1,14 +1,12 @@ -import { useContext } from 'react'; - import Button from '@components/Button'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { buttonVar } from './style.css'; import { InputButtonProps } from './types'; // TextBox 내부 InputLine 우측 버튼 const InputButton = ({ isLoading, text, ...props }: InputButtonProps) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); return (
+
+ + ); }; diff --git a/src/views/CompletePage/components/Survey.tsx b/src/views/CompletePage/components/Survey.tsx index 22d159e8..24a2c84a 100644 --- a/src/views/CompletePage/components/Survey.tsx +++ b/src/views/CompletePage/components/Survey.tsx @@ -1,6 +1,6 @@ -import { useContext, useState } from 'react'; +import { useState } from 'react'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import useMutateSatisfaction from '../hooks/useMutateSatisfaction'; import { @@ -13,7 +13,7 @@ import { } from '../style.css'; const Survey = () => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const [point, setPoint] = useState(-1); const handleSatisfaction = () => { diff --git a/src/views/CompletePage/index.tsx b/src/views/CompletePage/index.tsx index 40797803..2078bafd 100644 --- a/src/views/CompletePage/index.tsx +++ b/src/views/CompletePage/index.tsx @@ -1,24 +1,19 @@ -import { track } from '@amplitude/analytics-browser'; -import { useContext } from 'react'; - import Button from '@components/Button'; import Callout from '@components/Callout'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; -import { RecruitingInfoContext } from '@store/recruitingInfoContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; +import { useRecruitingInfo } from 'contexts/RecruitingInfoProvider'; import Survey from './components/Survey'; import IconCheckmark from './icons/IconCheckmark'; import { container, iconVar, mainTextVar, subTextVar } from './style.css'; const CompletePage = () => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const { - recruitingInfo: { name, season, group, soptName }, - } = useContext(RecruitingInfoContext); - const isMakers = soptName?.toLowerCase().includes('makers'); + recruitingInfo: { name, season, group, soptName, isMakers }, + } = useRecruitingInfo(); const handleClickMyPage = () => { - track('click-complete-my'); window.location.reload(); }; @@ -36,7 +31,9 @@ const CompletePage = () => { style={{ marginBottom: 35, }}>{`이메일 도착 시점에 차이가 있을 수 있습니다.\n이메일이 오지 않으면 스팸 메일함을 확인해주세요.`} - + ); diff --git a/src/views/ErrorPage/components/ErrorCode/index.tsx b/src/views/ErrorPage/components/ErrorCode/index.tsx index e1b9d301..63f23500 100644 --- a/src/views/ErrorPage/components/ErrorCode/index.tsx +++ b/src/views/ErrorPage/components/ErrorCode/index.tsx @@ -1,6 +1,4 @@ -import { useContext } from 'react'; - -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import Icon404Back from 'views/ErrorPage/icons/Icon404Back'; import Icon404Front from 'views/ErrorPage/icons/Icon404Front'; import Icon500Back from 'views/ErrorPage/icons/Icon500Back'; @@ -11,7 +9,7 @@ import IconGhost from 'views/ErrorPage/icons/IconGhost'; import { backText, frontText, iconWrapperVar, showIconVar } from './style.css'; export default function ErrorCode({ code }: { code: 404 | 500 }) { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const isMobile = deviceType === 'MOB'; return ( diff --git a/src/views/ErrorPage/components/NoMore/index.tsx b/src/views/ErrorPage/components/NoMore/index.tsx index dc241a93..a942fa75 100644 --- a/src/views/ErrorPage/components/NoMore/index.tsx +++ b/src/views/ErrorPage/components/NoMore/index.tsx @@ -1,9 +1,7 @@ -import { track } from '@amplitude/analytics-browser'; -import { useContext } from 'react'; - -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { article, contactButtonVar, container, errorButtonVar, errorTextVar, instructionVar } from '../../style.css'; +import AmplitudeEventTrack from '@components/Button/AmplitudeEventTrack'; interface NoMoreProps { isMakers?: boolean; @@ -11,31 +9,33 @@ interface NoMoreProps { } const NoMore = ({ isMakers, content }: NoMoreProps) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); return (
+

{`문의사항이 있다면\n아래 ‘문의하기’를 이용해 주세요`}

+ track(isMakers ? 'click-nomore-official_makers' : 'click-nomore-official')}> - 공식 홈페이지 가기 + className={contactButtonVar[deviceType]}> + 문의하기 -
-

{`문의사항이 있다면\n아래 ‘문의하기’를 이용해 주세요`}

- track(isMakers ? 'click-nomore-ask_makers' : 'click-nomore-ask')}> - 문의하기 - + ); }; diff --git a/src/views/ErrorPage/index.tsx b/src/views/ErrorPage/index.tsx index 5cb43059..f67dc746 100644 --- a/src/views/ErrorPage/index.tsx +++ b/src/views/ErrorPage/index.tsx @@ -1,15 +1,14 @@ -import { track } from '@amplitude/analytics-browser'; -import { useContext } from 'react'; import { useNavigate } from 'react-router-dom'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import ErrorCode from './components/ErrorCode'; import { ERROR_MESSAGE } from './constants'; import { article, contactButtonVar, container, errorButtonVar, errorTextVar, instructionVar } from './style.css'; +import AmplitudeEventTrack from '@components/Button/AmplitudeEventTrack'; const ErrorPage = ({ code }: { code: 404 | 500 }) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const navigate = useNavigate(); const handleGoBack = (code: 404 | 500) => { @@ -23,7 +22,6 @@ const ErrorPage = ({ code }: { code: 404 | 500 }) => { }; const handleClickErrorButton = () => { - code === 404 ? track('click-error-home') : track('click-error-back'); handleGoBack(code); }; @@ -34,23 +32,26 @@ const ErrorPage = ({ code }: { code: 404 | 500 }) => {

{ERROR_MESSAGE[CODE_KEY]?.text}

- + + +

{`문제가 지속적으로 발생하거나 문의사항이 있다면\n아래 ‘문의하기’를 이용해 주세요`}

- track('click-error-ask')}> - 문의하기 - + + + 문의하기 + + ); }; diff --git a/src/views/MyPage/index.tsx b/src/views/MyPage/index.tsx index bcab469c..d2c7235a 100644 --- a/src/views/MyPage/index.tsx +++ b/src/views/MyPage/index.tsx @@ -1,13 +1,11 @@ -import { track } from '@amplitude/analytics-browser'; -import { useContext } from 'react'; +import { lazy } from 'react'; import Button from '@components/Button'; import Callout from '@components/Callout'; import Title from '@components/Title'; import useDate from '@hooks/useDate'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; -import { RecruitingInfoContext } from '@store/recruitingInfoContext'; -import NoMore from 'views/ErrorPage/components/NoMore'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; +import { useRecruitingInfo } from 'contexts/RecruitingInfoProvider'; import BigLoading from 'views/loadings/BigLoding'; import { @@ -20,8 +18,10 @@ import { buttonWidthVar, } from './style.css'; +const NoMore = lazy(() => import('views/ErrorPage/components/NoMore')); + const MyInfoItem = ({ label, value }: { label: string; value?: string | number | boolean }) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const isMasking = label !== '지원서'; return ( @@ -33,17 +33,12 @@ const MyInfoItem = ({ label, value }: { label: string; value?: string | number | }; const StatusButton = ({ label, to, trackingEvent }: { label: string; to: string; trackingEvent: string }) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); return (
  • {label} -
  • @@ -56,10 +51,10 @@ interface MyPageProps { } const MyPage = ({ part, applicationPass }: MyPageProps) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const { recruitingInfo: { name, season }, - } = useContext(RecruitingInfoContext); + } = useRecruitingInfo(); const { NoMoreReview, NoMoreScreeningResult, NoMoreFinalResult, NoMoreRecruit, isLoading, isMakers } = useDate(); if (isLoading) return ; diff --git a/src/views/PasswordPage/apis.ts b/src/views/PasswordPage/apis.ts index ae637b87..31044164 100644 --- a/src/views/PasswordPage/apis.ts +++ b/src/views/PasswordPage/apis.ts @@ -1,15 +1,18 @@ -import instance from '@apis/instance'; +import fetcher from '@apis/fetcher'; import type { PasswordRequest } from './types'; export const sendPasswordChange = async (userInfo: PasswordRequest) => { const { email, season, group, password, passwordCheck } = userInfo; - const res = await instance.post('/recruiting-auth/change/password', { - email, - season, - group, - password, - passwordCheck, + const res = await fetcher('/recruiting-auth/change/password', { + method: 'POST', + body: { + email, + season, + group, + password, + passwordCheck, + }, }); return res; diff --git a/src/views/PasswordPage/components/PasswordForm/index.tsx b/src/views/PasswordPage/components/PasswordForm/index.tsx index 2d1c62b3..a5750a99 100644 --- a/src/views/PasswordPage/components/PasswordForm/index.tsx +++ b/src/views/PasswordPage/components/PasswordForm/index.tsx @@ -1,28 +1,30 @@ -import { track } from '@amplitude/analytics-browser'; -import { useContext, useRef } from 'react'; +import { lazy } from 'react'; import { FormProvider, useForm, type FieldValues } from 'react-hook-form'; import Button from '@components/Button'; import { TextBox비밀번호, TextBox이름, TextBox이메일 } from '@components/Input/components/InputTheme'; import { VALIDATION_CHECK } from '@constants/validationCheck'; import useVerificationStatus from '@hooks/useVerificationStatus'; -import { RecruitingInfoContext } from '@store/recruitingInfoContext'; -import { CompleteDialog } from 'views/dialogs'; +import { useRecruitingInfo } from 'contexts/RecruitingInfoProvider'; import useMutateChangePassword from 'views/PasswordPage/hooks/useMutateChangePassword'; import { formWrapper } from './style.css'; +import useDialog from '@hooks/useDialog'; + +const CompleteDialog = lazy(() => import('views/dialogs').then(({ CompleteDialog }) => ({ default: CompleteDialog }))); const PasswordForm = () => { - const completeDialog = useRef(null); + const { ref: completeDialogRef, handleShowDialog: handleShowCompleteDialog } = useDialog(); + const { recruitingInfo: { season, group }, - } = useContext(RecruitingInfoContext); + } = useRecruitingInfo(); const { isVerified, handleVerified } = useVerificationStatus(); const methods = useForm({ mode: 'onBlur' }); const { handleSubmit, setError } = methods; const handleCompleteChangePassword = () => { - completeDialog.current?.showModal(); + handleShowCompleteDialog(); }; const { changePasswordMutate, changePasswordIsPending } = useMutateChangePassword({ @@ -52,7 +54,7 @@ const PasswordForm = () => { return ( <> - +
    { isLoading={changePasswordIsPending} type="submit" style={{ marginTop: 30 }} - onClick={() => track('click-password-password')}> + eventName="click-password-password"> 저장하기 diff --git a/src/views/PasswordPage/hooks/useMutateChangePassword.tsx b/src/views/PasswordPage/hooks/useMutateChangePassword.tsx index ccc00950..54387ada 100644 --- a/src/views/PasswordPage/hooks/useMutateChangePassword.tsx +++ b/src/views/PasswordPage/hooks/useMutateChangePassword.tsx @@ -1,10 +1,9 @@ import { useMutation } from '@tanstack/react-query'; -import { AxiosError, AxiosResponse } from 'axios'; import { sendPasswordChange } from '../apis'; import type { PasswordRequest, PasswordResponse } from '../types'; -import type { ErrorResponse } from '@type/errorResponse'; +import type { CustomError } from '@apis/fetcher'; interface MutateChangePasswordProps { onSuccess: () => void; @@ -12,8 +11,8 @@ interface MutateChangePasswordProps { const useMutateChangePassword = ({ onSuccess }: MutateChangePasswordProps) => { const { mutate: changePasswordMutate, isPending: changePasswordIsPending } = useMutation< - AxiosResponse, - AxiosError, + PasswordResponse, + CustomError, PasswordRequest >({ mutationFn: (userInfo: PasswordRequest) => sendPasswordChange(userInfo), diff --git a/src/views/PasswordPage/index.tsx b/src/views/PasswordPage/index.tsx index 4637fbc3..8959e0d8 100644 --- a/src/views/PasswordPage/index.tsx +++ b/src/views/PasswordPage/index.tsx @@ -1,16 +1,17 @@ -import { useContext } from 'react'; +import { lazy } from 'react'; import Title from '@components/Title'; import useDate from '@hooks/useDate'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; -import NoMore from 'views/ErrorPage/components/NoMore'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import BigLoading from 'views/loadings/BigLoding'; import PasswordForm from './components/PasswordForm'; import { containerVar } from './style.css'; +const NoMore = lazy(() => import('views/ErrorPage/components/NoMore')); + const PasswordPage = () => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const { NoMoreRecruit, isLoading, isMakers } = useDate(); if (isLoading) return ; diff --git a/src/views/ResultPage/components/FinalResult.tsx b/src/views/ResultPage/components/FinalResult.tsx index c3afa225..4965c18f 100644 --- a/src/views/ResultPage/components/FinalResult.tsx +++ b/src/views/ResultPage/components/FinalResult.tsx @@ -1,11 +1,8 @@ -import { track } from '@amplitude/analytics-browser'; -import { format } from 'date-fns'; -import { ko } from 'date-fns/locale'; -import { useContext, useEffect } from 'react'; +import { useEffect } from 'react'; import Title from '@components/Title'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; -import { RecruitingInfoContext } from '@store/recruitingInfoContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; +import { useRecruitingInfo } from 'contexts/RecruitingInfoProvider'; import BigLoading from 'views/loadings/BigLoding'; import { @@ -23,19 +20,19 @@ import IconMakersLogo from '../assets/IconMakersLogo'; import imgSoptLogo from '../assets/imgSoptLogo.png'; import imgSoptLogoWebp from '../assets/imgSoptLogo.webp'; import useGetFinalResult from '../hooks/useGetFinalResult'; +import AmplitudeEventTrack from '@components/Button/AmplitudeEventTrack'; +import { format } from '@utils/dateFormatter'; const Content = ({ pass }: { pass?: boolean }) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const { recruitingInfo: { name, soptName, season, group, isMakers, finalPassConfirmStart }, - } = useContext(RecruitingInfoContext); + } = useRecruitingInfo(); if (!name) return; const finalDate = new Date(finalPassConfirmStart || ''); - const formattedFinalPassConfirmStart = format(finalDate, 'M월 dd일 EEEE', { - locale: ko, - }); + const formattedFinalPassConfirmStart = format(finalDate, 'M월 dd일 EEEE'); const SOPT_NAME = isMakers ? `SOPT ${soptName}` : soptName; return ( @@ -56,14 +53,15 @@ const Content = ({ pass }: { pass?: boolean }) => { `} {`( 구글폼 : `} - track('click-final-google_form')}> - {`https://${deviceType !== 'DESK' ? '\n' : ''}${import.meta.env.VITE_FINAL_PASS_LINK}`} - + + + {`https://${deviceType !== 'DESK' ? '\n' : ''}${import.meta.env.VITE_FINAL_PASS_LINK}`} + + {` )\n`}
    @@ -100,12 +98,12 @@ const Content = ({ pass }: { pass?: boolean }) => { }; const FinalResult = () => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const { finalResult, finalResultIsLoading } = useGetFinalResult(); const { recruitingInfo: { isMakers }, handleSaveRecruitingInfo, - } = useContext(RecruitingInfoContext); + } = useRecruitingInfo(); const { name, pass } = finalResult?.data || {}; diff --git a/src/views/ResultPage/components/ScreeningResult.tsx b/src/views/ResultPage/components/ScreeningResult.tsx index 60b14c5d..cfb329ed 100644 --- a/src/views/ResultPage/components/ScreeningResult.tsx +++ b/src/views/ResultPage/components/ScreeningResult.tsx @@ -1,11 +1,8 @@ -import { track } from '@amplitude/analytics-browser'; -import { format } from 'date-fns'; -import { ko } from 'date-fns/locale'; -import { useContext, useEffect } from 'react'; +import { useEffect } from 'react'; import Title from '@components/Title'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; -import { RecruitingInfoContext } from '@store/recruitingInfoContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; +import { useRecruitingInfo } from 'contexts/RecruitingInfoProvider'; import BigLoading from 'views/loadings/BigLoding'; import { @@ -23,12 +20,14 @@ import IconMakersLogo from '../assets/IconMakersLogo'; import imgSoptLogo from '../assets/imgSoptLogo.png'; import imgSoptLogoWebp from '../assets/imgSoptLogo.webp'; import useGetScreeningResult from '../hooks/useGetScreeningResult'; +import AmplitudeEventTrack from '@components/Button/AmplitudeEventTrack'; +import { format } from '@utils/dateFormatter'; const Content = ({ pass }: { pass?: boolean }) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const { recruitingInfo: { name, soptName, season, interviewStart, interviewEnd, applicationPassConfirmStart, isMakers }, - } = useContext(RecruitingInfoContext); + } = useRecruitingInfo(); if (!name) return; @@ -36,14 +35,10 @@ const Content = ({ pass }: { pass?: boolean }) => { const applicationPassConfirmNextDay = new Date(applicationDate); applicationPassConfirmNextDay.setDate(applicationDate.getDate() + 1); - const formattedInterviewStart = format(new Date(interviewStart || ''), 'M월 dd일', { locale: ko }); - const formattedInterviewEnd = format(new Date(interviewEnd || ''), 'M월 dd일', { locale: ko }); - const formattedApplicationPassConfirmStart = format(applicationDate, 'M월 dd일 EEEE', { - locale: ko, - }); - const formattedApplicationPassConfirmNextDay = format(new Date(applicationPassConfirmNextDay || ''), 'M월 dd일', { - locale: ko, - }); + const formattedInterviewStart = format(new Date(interviewStart || ''), 'M월 dd일'); + const formattedInterviewEnd = format(new Date(interviewEnd || ''), 'M월 dd일'); + const formattedApplicationPassConfirmStart = format(applicationDate, 'M월 dd일 EEEE'); + const formattedApplicationPassConfirmNextDay = format(new Date(applicationPassConfirmNextDay || ''), 'M월 dd일'); const SOPT_NAME = isMakers ? `SOPT ${soptName}` : soptName; return ( @@ -63,14 +58,15 @@ const Content = ({ pass }: { pass?: boolean }) => { `} {`( 구글폼 : `} - track('click-screening-google_form')}> - {`https://${deviceType !== 'DESK' ? '\n' : ''}${import.meta.env.VITE_SCREENING_PASS_LINK}`} - + + + {`https://${deviceType !== 'DESK' ? '\n' : ''}${import.meta.env.VITE_SCREENING_PASS_LINK}`} + + {` )\n`}
    @@ -110,11 +106,11 @@ const Content = ({ pass }: { pass?: boolean }) => { }; const ScreeningResult = () => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const { recruitingInfo: { isMakers }, handleSaveRecruitingInfo, - } = useContext(RecruitingInfoContext); + } = useRecruitingInfo(); const { screeningResult, screeningResultIsLoading } = useGetScreeningResult(); const { name, interviewStart, interviewEnd, pass } = screeningResult?.data || {}; diff --git a/src/views/ResultPage/index.tsx b/src/views/ResultPage/index.tsx index 00a1ea8b..3d5db6db 100644 --- a/src/views/ResultPage/index.tsx +++ b/src/views/ResultPage/index.tsx @@ -1,16 +1,17 @@ -import { useContext, useEffect } from 'react'; +import { useEffect, lazy } from 'react'; import useDate from '@hooks/useDate'; -import { ThemeContext } from '@store/themeContext'; -import NoMore from 'views/ErrorPage/components/NoMore'; +import { useTheme } from 'contexts/ThemeProvider'; import BigLoading from 'views/loadings/BigLoding'; import useGetMyInfo from 'views/SignedInPage/hooks/useGetMyInfo'; import FinalResult from './components/FinalResult'; import ScreeningResult from './components/ScreeningResult'; +const NoMore = lazy(() => import('views/ErrorPage/components/NoMore')); + const ResultPage = () => { - const { handleChangeMode } = useContext(ThemeContext); + const { handleChangeMode } = useTheme(); const { myInfoData, myInfoIsLoading } = useGetMyInfo(); const { submit, applicationPass } = myInfoData?.data || {}; diff --git a/src/views/ReviewPage/index.tsx b/src/views/ReviewPage/index.tsx index 9afaaaed..85553646 100644 --- a/src/views/ReviewPage/index.tsx +++ b/src/views/ReviewPage/index.tsx @@ -1,10 +1,10 @@ -import { useCallback, useContext, useEffect, useRef, useState } from 'react'; +import { lazy, useCallback, useEffect, useRef, useState } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import useDate from '@hooks/useDate'; import useScrollToHash from '@hooks/useScrollToHash'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; -import { RecruitingInfoContext } from '@store/recruitingInfoContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; +import { useRecruitingInfo } from 'contexts/RecruitingInfoProvider'; import ApplyCategory from 'views/ApplyPage/components/ApplyCategory'; import ApplyHeader from 'views/ApplyPage/components/ApplyHeader'; import ApplyInfo from 'views/ApplyPage/components/ApplyInfo'; @@ -15,16 +15,20 @@ import PartSection from 'views/ApplyPage/components/PartSection'; import useGetDraft from 'views/ApplyPage/hooks/useGetDraft'; import useGetQuestions from 'views/ApplyPage/hooks/useGetQuestions'; import { container, formContainerVar } from 'views/ApplyPage/style.css'; -import { PreventReviewDialog } from 'views/dialogs'; -import NoMore from 'views/ErrorPage/components/NoMore'; import BigLoading from 'views/loadings/BigLoding'; +import useDialog from '@hooks/useDialog'; + +const PreventReviewDialog = lazy(() => + import('views/dialogs').then(({ PreventReviewDialog }) => ({ default: PreventReviewDialog })), +); +const NoMore = lazy(() => import('views/ErrorPage/components/NoMore')); const ReviewPage = () => { - const { deviceType } = useContext(DeviceTypeContext); - const preventReviewDialog = useRef(null); + const { deviceType } = useDeviceType(); + const { ref: preventReviewDialogRef, handleShowDialog: handleShowPreventReviewDialog } = useDialog(); const sectionsRef = useRef([]); - const { handleSaveRecruitingInfo } = useContext(RecruitingInfoContext); + const { handleSaveRecruitingInfo } = useRecruitingInfo(); const { draftData, draftIsLoading } = useGetDraft(); const [isInView, setIsInView] = useState([true, false, false]); @@ -49,8 +53,8 @@ const ReviewPage = () => { const { setValue } = methods; useEffect(() => { - if (preventReviewDialog.current && !applicantDraft?.submit) { - preventReviewDialog.current.showModal(); + if (preventReviewDialogRef.current && !applicantDraft?.submit) { + handleShowPreventReviewDialog(); } if (applicantDraft?.part) { @@ -61,7 +65,7 @@ const ReviewPage = () => { name: applicantDraft?.name, }); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [applicantDraft, preventReviewDialog.current]); + }, [applicantDraft, preventReviewDialogRef.current]); const refCallback = useCallback((element: HTMLSelectElement) => { if (element) { @@ -106,7 +110,7 @@ const ReviewPage = () => { return ( <> - +
    diff --git a/src/views/SignInPage/apis.ts b/src/views/SignInPage/apis.ts index 18dc093a..655da4e6 100644 --- a/src/views/SignInPage/apis.ts +++ b/src/views/SignInPage/apis.ts @@ -1,14 +1,17 @@ -import instance from '@apis/instance'; +import fetcher from '@apis/fetcher'; import type { SignInRequest } from './types'; export const sendSignIn = async (userInfo: SignInRequest) => { const { email, season, group, password } = userInfo; - const res = await instance.post('/recruiting-auth/login', { - email, - season, - group, - password, + const res = await fetcher('/recruiting-auth/login', { + method: 'POST', + body: { + email, + season, + group, + password, + }, }); return res; diff --git a/src/views/SignInPage/components/SignInForm/index.tsx b/src/views/SignInPage/components/SignInForm/index.tsx index f5025925..d376c72e 100644 --- a/src/views/SignInPage/components/SignInForm/index.tsx +++ b/src/views/SignInPage/components/SignInForm/index.tsx @@ -1,20 +1,19 @@ -import { track } from '@amplitude/analytics-browser'; -import { useContext } from 'react'; import { type FieldValues, FormProvider, useForm } from 'react-hook-form'; import { Link } from 'react-router-dom'; import Button from '@components/Button'; import { Description, InputLine, TextBox } from '@components/Input'; import { VALIDATION_CHECK } from '@constants/validationCheck'; -import { RecruitingInfoContext } from '@store/recruitingInfoContext'; +import { useRecruitingInfo } from 'contexts/RecruitingInfoProvider'; import useMutateSignIn from 'views/SignInPage/hooks/useMutateSignIn'; import { inputWrapper, newPasswordButton } from './style.css'; +import AmplitudeEventTrack from '@components/Button/AmplitudeEventTrack'; const SignInForm = () => { const { recruitingInfo: { season, group, finalPassConfirmEnd }, - } = useContext(RecruitingInfoContext); + } = useRecruitingInfo(); const methods = useForm({ mode: 'onBlur' }); const { handleSubmit, setError } = methods; const { signInMutate, signInIsPending } = useMutateSignIn({ @@ -62,12 +61,14 @@ const SignInForm = () => { />

    비밀번호를 잃어버리셨나요?

    - track('click-signin-password')}> - 비밀번호 재설정하기 - + + + 비밀번호 재설정하기 + +
    - diff --git a/src/views/SignInPage/components/SignInInfo/index.tsx b/src/views/SignInPage/components/SignInInfo/index.tsx index 3a01d74e..80f6ff0f 100644 --- a/src/views/SignInPage/components/SignInInfo/index.tsx +++ b/src/views/SignInPage/components/SignInInfo/index.tsx @@ -1,19 +1,18 @@ -import { track } from '@amplitude/analytics-browser'; -import { useContext } from 'react'; import { Link } from 'react-router-dom'; import Callout from '@components/Callout'; import Title from '@components/Title'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; -import { RecruitingInfoContext } from '@store/recruitingInfoContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; +import { useRecruitingInfo } from 'contexts/RecruitingInfoProvider'; import { calloutButtonVar } from './style.css'; +import AmplitudeEventTrack from '@components/Button/AmplitudeEventTrack'; const SignInInfo = () => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const { recruitingInfo: { soptName, isMakers, season, group }, - } = useContext(RecruitingInfoContext); + } = useRecruitingInfo(); return ( <> @@ -22,9 +21,11 @@ const SignInInfo = () => { track('click-signin-signup')}> - 새 지원서 작성하기 - + + + 새 지원서 작성하기 + + }>

    {season}기 {isMakers ? '' : group} 지원서 작성이 처음이라면 ‘새 지원서 작성하기’를 진행해주세요. 이전에 diff --git a/src/views/SignInPage/hooks/useMutateSignIn.tsx b/src/views/SignInPage/hooks/useMutateSignIn.tsx index 85351fe4..4f2b5ccc 100644 --- a/src/views/SignInPage/hooks/useMutateSignIn.tsx +++ b/src/views/SignInPage/hooks/useMutateSignIn.tsx @@ -6,8 +6,7 @@ import { VALIDATION_CHECK } from '@constants/validationCheck'; import { sendSignIn } from '../apis'; import type { SignInRequest, SignInResponse } from '../types'; -import type { ErrorResponse } from '@type/errorResponse'; -import type { AxiosError, AxiosResponse } from 'axios'; +import type { CustomError } from '@apis/fetcher'; interface MutateSignInProps { finalPassConfirmEnd?: string; @@ -15,20 +14,16 @@ interface MutateSignInProps { } const useMutateSignIn = ({ finalPassConfirmEnd, onSetError }: MutateSignInProps) => { - const { mutate: signInMutate, isPending: signInIsPending } = useMutation< - AxiosResponse, - AxiosError, - SignInRequest - >({ + const { mutate: signInMutate, isPending: signInIsPending } = useMutation({ mutationFn: (userInfo: SignInRequest) => sendSignIn(userInfo), - onSuccess: ({ data: { email, token } }) => { + onSuccess: ({ email, token }) => { setUserId(email); localStorage.setItem('soptApplyAccessToken', token); localStorage.setItem('soptApplyAccessTokenExpiredTime', finalPassConfirmEnd || ''); window.location.reload(); }, onError(error) { - if (error.response?.status === 403) { + if (error.status === 403) { onSetError('email', 'not-match', VALIDATION_CHECK.email.notMatchErrorText); onSetError('password', 'not-match', VALIDATION_CHECK.password.notMatchErrorText); } diff --git a/src/views/SignInPage/index.tsx b/src/views/SignInPage/index.tsx index 6222eb9d..dae11867 100644 --- a/src/views/SignInPage/index.tsx +++ b/src/views/SignInPage/index.tsx @@ -1,16 +1,17 @@ -import { useContext } from 'react'; +import { lazy } from 'react'; import useDate from '@hooks/useDate'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; -import NoMore from 'views/ErrorPage/components/NoMore'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import BigLoading from 'views/loadings/BigLoding'; import SignInForm from './components/SignInForm'; import SignInInfo from './components/SignInInfo'; import { containerVar } from './style.css'; +const NoMore = lazy(() => import('views/ErrorPage/components/NoMore')); + const SignInPage = () => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const { isLoading, NoMoreRecruit, isMakers } = useDate(); if (isLoading) return ; diff --git a/src/views/SignedInPage/index.tsx b/src/views/SignedInPage/index.tsx index 6323fb49..25ed7c5a 100644 --- a/src/views/SignedInPage/index.tsx +++ b/src/views/SignedInPage/index.tsx @@ -1,7 +1,7 @@ import { track } from '@amplitude/analytics-browser'; -import { useContext, useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; -import { RecruitingInfoContext } from '@store/recruitingInfoContext'; +import { useRecruitingInfo } from 'contexts/RecruitingInfoProvider'; import ApplyPage from 'views/ApplyPage'; import CompletePage from 'views/CompletePage'; import BigLoading from 'views/loadings/BigLoding'; @@ -15,7 +15,7 @@ const SignedInPage = () => { const { myInfoData, myInfoIsLoading } = useGetMyInfo(); const { name, season, part, submit, applicationPass } = myInfoData?.data || {}; - const { handleSaveRecruitingInfo } = useContext(RecruitingInfoContext); + const { handleSaveRecruitingInfo } = useRecruitingInfo(); const handleSetComplete = () => { track('done-apply-confirm_submit'); diff --git a/src/views/SignupPage/apis.ts b/src/views/SignupPage/apis.ts index acae49bc..9803c327 100644 --- a/src/views/SignupPage/apis.ts +++ b/src/views/SignupPage/apis.ts @@ -1,17 +1,20 @@ -import instance from '@apis/instance'; +import fetcher from '@apis/fetcher'; import type { SignUpRequest } from './types'; export const sendSignUp = async (userInfo: SignUpRequest) => { const { email, password, passwordCheck, name, phone, season, group } = userInfo; - const res = await instance.post('/recruiting-auth/signup', { - email, - password, - passwordCheck, - name, - phone, - season, - group, + const res = await fetcher('/recruiting-auth/signup', { + method: 'POST', + body: { + email, + password, + passwordCheck, + name, + phone, + season, + group, + }, }); return res; diff --git a/src/views/SignupPage/components/SignupForm/index.tsx b/src/views/SignupPage/components/SignupForm/index.tsx index 56137cb2..d5f96de4 100644 --- a/src/views/SignupPage/components/SignupForm/index.tsx +++ b/src/views/SignupPage/components/SignupForm/index.tsx @@ -1,5 +1,4 @@ -import { track } from '@amplitude/analytics-browser'; -import { useContext, useEffect, useRef } from 'react'; +import { lazy, useEffect } from 'react'; import { type FieldValues, FormProvider, useForm } from 'react-hook-form'; import Button from '@components/Button'; @@ -10,17 +9,21 @@ import { TextBox비밀번호, TextBox이름, TextBox이메일 } from '@component import { PRIVACY_POLICY } from '@constants/policy'; import { VALIDATION_CHECK } from '@constants/validationCheck'; import useVerificationStatus from '@hooks/useVerificationStatus'; -import { RecruitingInfoContext } from '@store/recruitingInfoContext'; -import { ExistingApplicantDialog } from 'views/dialogs'; +import { useRecruitingInfo } from 'contexts/RecruitingInfoProvider'; import useMutateSignUp from 'views/SignupPage/hooks/useMutateSignUp'; import { formWrapper } from './style.css'; +import useDialog from '@hooks/useDialog'; + +const ExistingApplicantDialog = lazy(() => + import('views/dialogs').then(({ ExistingApplicantDialog }) => ({ default: ExistingApplicantDialog })), +); const SignupForm = () => { const { recruitingInfo: { season, group }, - } = useContext(RecruitingInfoContext); - const existingApplicantRef = useRef(null); + } = useRecruitingInfo(); + const { ref: existingApplicantDialogRef, handleShowDialog: handleShowExistingApplicantDialog } = useDialog(); const { isVerified, handleVerified } = useVerificationStatus(); const methods = useForm({ mode: 'onBlur' }); @@ -31,7 +34,7 @@ const SignupForm = () => { formState: { errors }, } = methods; const { signUpMutate, signUpIsPending } = useMutateSignUp({ - onCheckExistence: () => existingApplicantRef.current?.showModal(), + onCheckExistence: () => handleShowExistingApplicantDialog(), }); const handleSubmitSignUp = ({ email, password, passwordCheck, name, phone }: FieldValues) => { @@ -66,7 +69,7 @@ const SignupForm = () => { return ( <> - +

    { {PRIVACY_POLICY}
    - diff --git a/src/views/SignupPage/hooks/useMutateSignUp.tsx b/src/views/SignupPage/hooks/useMutateSignUp.tsx index 0fc547dd..b42d9aae 100644 --- a/src/views/SignupPage/hooks/useMutateSignUp.tsx +++ b/src/views/SignupPage/hooks/useMutateSignUp.tsx @@ -5,8 +5,7 @@ import { useNavigate } from 'react-router-dom'; import { sendSignUp } from '../apis'; import type { SignUpRequest, SignUpResponse } from '../types'; -import type { ErrorResponse } from '@type/errorResponse'; -import type { AxiosError, AxiosResponse } from 'axios'; +import type { CustomError } from '@apis/fetcher'; interface MutateSignUpProps { onCheckExistence: () => void; @@ -15,18 +14,14 @@ interface MutateSignUpProps { const useMutateSignUp = ({ onCheckExistence }: MutateSignUpProps) => { const navigate = useNavigate(); - const { mutate: signUpMutate, isPending: signUpIsPending } = useMutation< - AxiosResponse, - AxiosError, - SignUpRequest - >({ + const { mutate: signUpMutate, isPending: signUpIsPending } = useMutation({ mutationFn: (userInfo: SignUpRequest) => sendSignUp(userInfo), onSuccess: () => { track('done-signup-apply'); navigate('/'); }, onError: (error) => { - if (error.response?.status === 400) { + if (error.status === 400) { onCheckExistence(); } }, diff --git a/src/views/SignupPage/index.tsx b/src/views/SignupPage/index.tsx index f7a5251a..b7098b2f 100644 --- a/src/views/SignupPage/index.tsx +++ b/src/views/SignupPage/index.tsx @@ -1,16 +1,17 @@ -import { useContext } from 'react'; +import { lazy } from 'react'; import Title from '@components/Title'; import useDate from '@hooks/useDate'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; -import NoMore from 'views/ErrorPage/components/NoMore'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import BigLoading from 'views/loadings/BigLoding'; import SignupForm from './components/SignupForm'; import { containerVar } from './style.css'; +const NoMore = lazy(() => import('views/ErrorPage/components/NoMore')); + const SignupPage = () => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const { NoMoreRecruit, NoMoreApply, isLoading, isMakers } = useDate(); if (isLoading) return ; diff --git a/src/views/UnsupportedPage/assets/ChromeIcon.tsx b/src/views/UnsupportedPage/assets/ChromeIcon.tsx new file mode 100644 index 00000000..2bc2a68d --- /dev/null +++ b/src/views/UnsupportedPage/assets/ChromeIcon.tsx @@ -0,0 +1,58 @@ +const ChromeIcon = ({ className }: { className?: string }) => { + return ( + + + + + + + + + + + + + + + + + ); +}; + +export default ChromeIcon; diff --git a/src/views/UnsupportedPage/assets/EdgeIcon.tsx b/src/views/UnsupportedPage/assets/EdgeIcon.tsx new file mode 100644 index 00000000..54c321b2 --- /dev/null +++ b/src/views/UnsupportedPage/assets/EdgeIcon.tsx @@ -0,0 +1,109 @@ +const EdgeIcon = ({ className }: { className?: string }) => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default EdgeIcon; diff --git a/src/views/UnsupportedPage/assets/FirefoxIcon.tsx b/src/views/UnsupportedPage/assets/FirefoxIcon.tsx new file mode 100644 index 00000000..24ec8fbc --- /dev/null +++ b/src/views/UnsupportedPage/assets/FirefoxIcon.tsx @@ -0,0 +1,226 @@ +const FirefoxIcon = ({ className }: { className?: string }) => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default FirefoxIcon; diff --git a/src/views/UnsupportedPage/assets/SafariIcon.tsx b/src/views/UnsupportedPage/assets/SafariIcon.tsx new file mode 100644 index 00000000..0bb72fa8 --- /dev/null +++ b/src/views/UnsupportedPage/assets/SafariIcon.tsx @@ -0,0 +1,73 @@ +const SafariIcon = ({ className }: { className?: string }) => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default SafariIcon; diff --git a/src/views/UnsupportedPage/index.tsx b/src/views/UnsupportedPage/index.tsx new file mode 100644 index 00000000..c2d6991b --- /dev/null +++ b/src/views/UnsupportedPage/index.tsx @@ -0,0 +1,104 @@ +import Callout from '@components/Callout'; +import { + browserButtonVar, + browserIconVar, + browsersWrapper, + contactButtonVar, + wrapper, + headingVar, + infoText, + infoTitle, + instructionVar, + updateInfoTitle, + updateInfoWrapperVar, +} from './style.css'; +import ChromeIcon from './assets/ChromeIcon'; +import EdgeIcon from './assets/EdgeIcon'; +import FirefoxIcon from './assets/FirefoxIcon'; +import SafariIcon from './assets/SafariIcon'; +import MakersLogo from '@assets/MakersLogo'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; +import { containerSizeVer, containerVar, logoVar } from '@components/Layout/components/Header/style.css'; +import { container, mainWrapper } from '@components/Layout/style.css'; +import SoptLogo from '@assets/SoptLogo'; + +const UnsupportedPage = () => { + const { deviceType } = useDeviceType(); + const isMakers = import.meta.env.MODE === 'makers'; + const logoVariant = logoVar[deviceType]; + + return ( +
    +
    + {isMakers ? : } +
    +
    +
    +

    지원되지 않는 브라우저예요

    + +
    +

    지원하지 않는 브라우저 목록이에요.

    +
      +
    1. 1. 서비스가 종료된 브라우저
    2. +
    3. 2. 업데이트 후 2.5년이 지난 브라우저
    4. +
    5. 3. 전 세계 0.3% 미만의 점유율을 보유한 브라우저
    6. +
    +
    +
    + +

    + 문제가 지속적으로 발생하거나 문의사항이 있다면 +
    + 아래 ‘문의하기’를 이용해 주세요` +

    + + 문의하기 + +
    +
    +
    + ); +}; + +export default UnsupportedPage; diff --git a/src/views/UnsupportedPage/pre-render.tsx b/src/views/UnsupportedPage/pre-render.tsx new file mode 100644 index 00000000..218b7459 --- /dev/null +++ b/src/views/UnsupportedPage/pre-render.tsx @@ -0,0 +1,22 @@ +import { renderToStaticMarkup } from 'react-dom/server'; +import fs from 'node:fs'; +import path from 'node:path'; +import UnsupportedPage from './index'; + +const str = renderToStaticMarkup(); + +const html = ` + + + + + SOPT - 지원하지 않는 브라우저 입니다 + + + + ${str} + + +`; + +fs.writeFileSync(path.resolve('./public/unsupported.html'), html, 'utf-8'); diff --git a/src/views/UnsupportedPage/style.css.ts b/src/views/UnsupportedPage/style.css.ts new file mode 100644 index 00000000..084222a7 --- /dev/null +++ b/src/views/UnsupportedPage/style.css.ts @@ -0,0 +1,208 @@ +import { style, styleVariants } from '@vanilla-extract/css'; +import { calc } from '@vanilla-extract/css-utils'; +import { theme } from 'styles/theme.css'; + +export const wrapper = style({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + height: calc.subtract('100vh', '160px'), + minHeight: 753, +}); + +export const headingVar = styleVariants({ + DESK: [ + { + marginBottom: 38, + ...theme.font.HEADING_3_28_B, + }, + ], + TAB: [ + { + marginBottom: 32, + ...theme.font.HEADING_3_28_B, + }, + ], + MOB: [ + { + marginBottom: 26, + ...theme.font.HEADING_4_24_B, + }, + ], +}); + +export const infoTitle = style({ + ...theme.font.HEADING_7_16_B, +}); + +export const infoText = style({ + ...theme.font.BODY_2_16_M, +}); + +const updateInfoWrapper = style({ + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + marginBottom: 90, +}); + +export const updateInfoWrapperVar = styleVariants({ + DESK: [ + updateInfoWrapper, + { + gap: 16, + marginTop: 60, + }, + ], + TAB: [ + updateInfoWrapper, + { + gap: 16, + marginTop: 50, + }, + ], + MOB: [ + updateInfoWrapper, + { + gap: 14, + marginTop: 50, + }, + ], +}); + +export const updateInfoTitle = style({ + color: theme.color.lighterText, + ...theme.font.TITLE_6_16_SB, +}); + +export const browsersWrapper = style({ + display: 'flex', + gap: 9, + alignItems: 'center', +}); + +const browserButton = style({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + border: `1px solid ${theme.color.border}`, + borderRadius: 15, + color: theme.color.lighterText, +}); + +export const browserButtonVar = styleVariants({ + DESK: [ + browserButton, + { + gap: 9, + width: 109, + height: 120, + padding: '22px 22px 10px', + ...theme.font.BODY_3_14_M, + }, + ], + TAB: [ + browserButton, + { + gap: 9, + width: 90, + height: 99, + padding: '18px 18px 10px', + ...theme.font.BODY_3_14_M, + }, + ], + MOB: [ + browserButton, + { + gap: 6, + width: 72, + height: 80, + padding: '14px 13px 8px 12px', + ...theme.font.BODY_4_13_M, + }, + ], +}); + +export const browserIconVar = styleVariants({ + DESK: [ + { + width: 48, + height: 48, + }, + ], + TAB: [ + { + width: 40, + height: 40, + }, + ], + MOB: [ + { + width: 32, + height: 32, + }, + ], +}); + +const instruction = style({ + color: theme.color.lightestText, + textAlign: 'center', + whiteSpace: 'pre-line', +}); + +export const instructionVar = styleVariants({ + DESK: [ + instruction, + { + marginBottom: 20, + ...theme.font.BODY_1_18_M, + }, + ], + TAB: [ + instruction, + { + marginBottom: 24, + ...theme.font.BODY_2_16_M, + }, + ], + MOB: [ + instruction, + { + marginBottom: 24, + ...theme.font.BODY_3_14_M, + }, + ], +}); + +const contactButton = style({ + display: 'block', + textDecorationLine: 'underline', + margin: '0 auto', + color: theme.color.buttonText, +}); + +export const contactButtonVar = styleVariants({ + DESK: [ + contactButton, + { + fontSize: 24, + fontWeight: '600', + lineHeight: '150%' /* 36px */, + letterSpacing: '-0.48px', + }, + ], + TAB: [ + contactButton, + { + ...theme.font.HEADING_5_20_B, + }, + ], + MOB: [ + contactButton, + { + ...theme.font.TITLE_5_18_SB, + }, + ], +}); diff --git a/src/views/UnsupportedPage/supportedBrowsers.ts b/src/views/UnsupportedPage/supportedBrowsers.ts new file mode 100644 index 00000000..26a7050d --- /dev/null +++ b/src/views/UnsupportedPage/supportedBrowsers.ts @@ -0,0 +1 @@ +export default /Edge?\/([1-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(9{2}|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/([1-9]\d{2}|\d{4,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(10[7-9]|1[1-9]\d|[2-9]\d{2}|\d{4,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](12[4-9]|1[3-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(12[5-9]|1[3-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(12[4-9]|1[3-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(2[4-9]|[3-9]\d|\d{3,})\.\d+/; diff --git a/src/views/UnsupportedPage/utils/checkBrowser.ts b/src/views/UnsupportedPage/utils/checkBrowser.ts new file mode 100644 index 00000000..45a5d9fc --- /dev/null +++ b/src/views/UnsupportedPage/utils/checkBrowser.ts @@ -0,0 +1,5 @@ +import supportedBrowsers from '../supportedBrowsers'; + +if (!supportedBrowsers.test(navigator.userAgent)) { + if (window.location.pathname !== '/unsupported') window.location.href = '/unsupported.html'; +} diff --git a/src/views/dialogs/CompleteDialog/index.tsx b/src/views/dialogs/CompleteDialog/index.tsx index 1e3137e9..9f3a0e6a 100644 --- a/src/views/dialogs/CompleteDialog/index.tsx +++ b/src/views/dialogs/CompleteDialog/index.tsx @@ -1,13 +1,13 @@ -import { forwardRef, useContext } from 'react'; +import { forwardRef } from 'react'; import { Link } from 'react-router-dom'; import Dialog from '@components/Dialog'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { buttonInside, buttonOutside, buttonOutsideVar, buttonWrapperVar, mainTextVar, subTextVar } from '../style.css'; const CompleteDialog = forwardRef((_, ref) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); return ( diff --git a/src/views/dialogs/DraftDialog/index.tsx b/src/views/dialogs/DraftDialog/index.tsx index 1c400324..a53458aa 100644 --- a/src/views/dialogs/DraftDialog/index.tsx +++ b/src/views/dialogs/DraftDialog/index.tsx @@ -1,12 +1,12 @@ -import { forwardRef, useContext } from 'react'; +import { forwardRef } from 'react'; import Dialog from '@components/Dialog'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { buttonInside, buttonOutside, buttonOutsideVar, buttonWrapperVar, mainTextVar } from '../style.css'; const DraftDialog = forwardRef((_, ref) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); return ( diff --git a/src/views/dialogs/ExistingApplicantDialog/index.tsx b/src/views/dialogs/ExistingApplicantDialog/index.tsx index 5833e7ba..a06475a8 100644 --- a/src/views/dialogs/ExistingApplicantDialog/index.tsx +++ b/src/views/dialogs/ExistingApplicantDialog/index.tsx @@ -1,13 +1,13 @@ -import { forwardRef, useContext } from 'react'; +import { forwardRef } from 'react'; import { Link } from 'react-router-dom'; import Dialog from '@components/Dialog'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { buttonInside, buttonOutside, buttonOutsideVar, buttonWrapperVar, mainTextVar } from '../style.css'; const ExistingApplicantDialog = forwardRef((_, ref) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); return ( diff --git a/src/views/dialogs/ExitDialog/index.tsx b/src/views/dialogs/ExitDialog/index.tsx index 94c07b73..343ce7fc 100644 --- a/src/views/dialogs/ExitDialog/index.tsx +++ b/src/views/dialogs/ExitDialog/index.tsx @@ -1,12 +1,12 @@ -import { forwardRef, useContext } from 'react'; +import { forwardRef } from 'react'; import Dialog from '@components/Dialog'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { buttonInside, buttonOutside, buttonOutsideVar, buttonWrapperVar, mainTextVar, subTextVar } from '../style.css'; const ExitDialog = forwardRef((_, ref) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); return ( diff --git a/src/views/dialogs/PreventApplyDialog/index.tsx b/src/views/dialogs/PreventApplyDialog/index.tsx index 0e138a01..053665a6 100644 --- a/src/views/dialogs/PreventApplyDialog/index.tsx +++ b/src/views/dialogs/PreventApplyDialog/index.tsx @@ -1,12 +1,12 @@ -import { forwardRef, useContext, type KeyboardEvent } from 'react'; +import { forwardRef, type KeyboardEvent } from 'react'; import Dialog from '@components/Dialog'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { buttonInside, buttonOutside, buttonOutsideVar, buttonWrapperVar, mainTextVar } from '../style.css'; const PreventApplyDialog = forwardRef((_, ref) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const handlePreventESCKeyPress = (e: KeyboardEvent) => { if (e.key === 'Escape') e.preventDefault(); diff --git a/src/views/dialogs/PreventReviewDialog/index.tsx b/src/views/dialogs/PreventReviewDialog/index.tsx index 96ce8ac7..614dcc5e 100644 --- a/src/views/dialogs/PreventReviewDialog/index.tsx +++ b/src/views/dialogs/PreventReviewDialog/index.tsx @@ -1,13 +1,13 @@ -import { forwardRef, useContext, type KeyboardEvent } from 'react'; +import { forwardRef, type KeyboardEvent } from 'react'; import { Link } from 'react-router-dom'; import Dialog from '@components/Dialog'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { buttonInside, buttonOutside, buttonOutsideVar, buttonWrapperVar, mainTextVar, subTextVar } from '../style.css'; const PreventReviewDialog = forwardRef((_, ref) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const handlePreventESCKeyPress = (e: KeyboardEvent) => { if (e.key === 'Escape') e.preventDefault(); diff --git a/src/views/dialogs/SessionExpiredDialog/index.tsx b/src/views/dialogs/SessionExpiredDialog/index.tsx index 2a57b872..824a2f4b 100644 --- a/src/views/dialogs/SessionExpiredDialog/index.tsx +++ b/src/views/dialogs/SessionExpiredDialog/index.tsx @@ -1,20 +1,19 @@ -import { track } from '@amplitude/analytics-browser'; -import { forwardRef, useContext, type KeyboardEvent } from 'react'; +import { forwardRef, type KeyboardEvent } from 'react'; import Dialog from '@components/Dialog'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import { buttonInside, buttonOutside, buttonOutsideVar, buttonWrapperVar, mainTextVar, subTextVar } from '../style.css'; +import AmplitudeEventTrack from '@components/Button/AmplitudeEventTrack'; const SessionExpiredDialog = forwardRef((_, ref) => { - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const handlePreventESCKeyPress = (e: KeyboardEvent) => { if (e.key === 'Escape') e.preventDefault(); }; const handleLogout = () => { - track('click-session-okay'); localStorage.removeItem('soptApplyAccessToken'); localStorage.removeItem('soptApplyAccessTokenExpiredTime'); if (window.location.pathname === '/') { @@ -31,9 +30,11 @@ const SessionExpiredDialog = forwardRef((_, ref) => {
    - + + +
    ); diff --git a/src/views/dialogs/SubmitDialog/index.tsx b/src/views/dialogs/SubmitDialog/index.tsx index d1fd33ec..70bc26dc 100644 --- a/src/views/dialogs/SubmitDialog/index.tsx +++ b/src/views/dialogs/SubmitDialog/index.tsx @@ -1,8 +1,7 @@ -import { track } from '@amplitude/analytics-browser'; -import { type ChangeEvent, forwardRef, useContext, useState } from 'react'; +import { type ChangeEvent, forwardRef, useState } from 'react'; import Dialog from '@components/Dialog'; -import { DeviceTypeContext } from '@store/deviceTypeContext'; +import { useDeviceType } from 'contexts/DeviceTypeProvider'; import ButtonLoading from 'views/loadings/ButtonLoading'; import { @@ -16,6 +15,7 @@ import { infoWrapperVar, } from './style.css'; import { buttonInside, buttonOutside, buttonOutsideVar, buttonWrapperVar, mainTextVar, subTextVar } from '../style.css'; +import AmplitudeEventTrack from '@components/Button/AmplitudeEventTrack'; const MyInfoItem = ({ deviceType, @@ -49,7 +49,7 @@ const SubmitDialog = forwardRef( ({ userInfo: { name, email, phone, part }, dataIsPending, onSendData }, ref) => { const [isChecked, setIsChecked] = useState(false); - const { deviceType } = useContext(DeviceTypeContext); + const { deviceType } = useDeviceType(); const handleCheck = (e: ChangeEvent) => { setIsChecked(e.target.checked); @@ -82,14 +82,18 @@ const SubmitDialog = forwardRef( method="dialog" className={`${dataIsPending ? buttonOutside.disabled : buttonOutside.line} ${buttonOutsideVar[deviceType]}`} onSubmit={() => setIsChecked(false)}> - + + +
    - + + +
    diff --git a/src/views/loadings/BigLoding/index.tsx b/src/views/loadings/BigLoding/index.tsx index 6071ea8d..b476febc 100644 --- a/src/views/loadings/BigLoding/index.tsx +++ b/src/views/loadings/BigLoding/index.tsx @@ -1,6 +1,5 @@ -import Lottie from 'lottie-react'; - import { container, loadingText, wrapper } from './style.css'; +import Lottie from 'lottie-react'; import mainLoading from '../lotties/mainLoading.json'; const BigLoading = () => { diff --git a/src/views/loadings/ButtonLoading/index.tsx b/src/views/loadings/ButtonLoading/index.tsx index 7fc88803..9f5b4c34 100644 --- a/src/views/loadings/ButtonLoading/index.tsx +++ b/src/views/loadings/ButtonLoading/index.tsx @@ -1,9 +1,8 @@ import Lottie from 'lottie-react'; - import buttonLoadingWhite from '../lotties/buttonLoadingWhite.json'; const ButtonLoading = ({ width, height = 28 }: { width: number | undefined; height?: number }) => { - return ; + return ; }; export default ButtonLoading; diff --git a/src/views/loadings/SmallLoading/index.tsx b/src/views/loadings/SmallLoading/index.tsx deleted file mode 100644 index dac25c9d..00000000 --- a/src/views/loadings/SmallLoading/index.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import Lottie from 'lottie-react'; - -import { container, loadingText, wrapper } from './style.css'; -import mainLoading from '../lotties/mainLoading.json'; - -const SmallLoading = () => { - return ( -
    -
    - -

    로딩 중입니다

    -
    -
    - ); -}; - -export default SmallLoading; diff --git a/src/views/loadings/SmallLoading/style.css.ts b/src/views/loadings/SmallLoading/style.css.ts deleted file mode 100644 index c8fe92a6..00000000 --- a/src/views/loadings/SmallLoading/style.css.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { style } from '@vanilla-extract/css'; - -import { theme } from 'styles/theme.css'; - -export const container = style({ - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - justifyContent: 'center', - width: '100%', - height: '100%', -}); - -export const wrapper = style({ - marginTop: '-105px', - display: 'flex', - flexDirection: 'column', - justifyContent: 'center', - alignItems: 'center', -}); - -export const loadingText = style({ - marginTop: '-60px', - color: theme.color.lighterText, - ...theme.font.BODY_2_16_R, -}); diff --git a/src/views/loadings/lotties/mainLoading.json b/src/views/loadings/lotties/mainLoading.json index f9ffa94d..227f10ae 100644 --- a/src/views/loadings/lotties/mainLoading.json +++ b/src/views/loadings/lotties/mainLoading.json @@ -1,5 +1,4 @@ { - "nm": "Comp 1", "ddd": 0, "h": 900, "w": 1200, @@ -9,12 +8,10 @@ "layers": [ { "ty": 0, - "nm": "Masked Group 1", "sr": 1, "st": 0, "op": 401, "ip": 0, - "hd": false, "ddd": 0, "bm": 0, "hasMask": false, @@ -25,44 +22,37 @@ "k": [ 10000, 10000 - ], - "ix": 2 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ - 610.4069061279297, - 415.1792602539062 - ], - "ix": 2 + 610.41, + 415.18 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, "ef": [], @@ -78,17 +68,14 @@ "ip": 0, "assets": [ { - "nm": "", "id": "0", "layers": [ { "ty": 4, - "nm": "Shape Layer 1", "sr": 1, "st": 0, "op": 401, "ip": 0, - "hd": false, "ddd": 0, "bm": 0, "hasMask": false, @@ -99,44 +86,37 @@ "k": [ 0, 0 - ], - "ix": 2 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ 10000, 10000 - ], - "ix": 2 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, "ef": [], @@ -144,26 +124,22 @@ { "ty": "gr", "bm": 0, - "hd": false, - "nm": "", "it": [ { "ty": "sh", "bm": 0, - "hd": false, - "nm": "", "d": 1, "ks": { "a": 1, "k": [ { "o": { - "x": 0.167, - "y": 0.167 + "x": 0.17, + "y": 0.17 }, "i": { - "x": 0.833, - "y": 0.833 + "x": 0.83, + "y": 0.83 }, "s": [ { @@ -182,23 +158,23 @@ 0 ], [ - 6.396759033203125, - 9.841171264648438 + 6.4, + 9.84 ], [ 0, 0 ], [ - -6.396760940551758, + -6.4, 0 ], [ - -4.635403409234519, + -4.64, 0 ], [ - -19.93594982572876, + -19.94, 0 ], [ @@ -284,19 +260,19 @@ 0 ], [ - -6.396759033203125, - -9.841171264648438 + -6.4, + -9.84 ], [ 0, 0 ], [ - 0.9466622313741766, + 0.95, 0 ], [ - 21.61248115926822, + 21.61, 0 ], [ @@ -374,104 +350,104 @@ ], "v": [ [ - -331.2053527832031, - 133.0563049316406 + -331.21, + 133.06 ], [ - -285.8681335449219, - 94.76681518554688 + -285.87, + 94.77 ], [ - -135.8598327636719, - 94.76681518554688 + -135.86, + 94.77 ], [ - -126.4090881347656, - 77.54476928710938 + -126.41, + 77.54 ], [ - -215.9637451171875, - -9.549652099609375 + -215.96, + -9.55 ], [ - -222.7738647460938, - -38.68634414672852 + -222.77, + -38.69 ], [ - -207.258119013612, - -28.36317598268284 + -207.26, + -28.36 ], [ - -111.2316601122227, - -28.36317598268284 + -111.23, + -28.36 ], [ - -102.5145492553711, - -28.73989868164062 + -102.51, + -28.74 ], [ - 12.35140991210938, - -25.29547119140625 + 12.35, + -25.3 ], [ - 12.35140991210938, - 94.76681518554688 + 12.35, + 94.77 ], [ - -76.2191162109375, - 94.76681518554688 + -76.22, + 94.77 ], [ - -76.2191162109375, - -0.20050048828125 + -76.22, + -0.2 ], [ - -76.2191162109375, - -133.0563049316406 + -76.22, + -133.06 ], [ - 49.25582885742188, - -28.73989868164062 + 49.26, + -28.74 ], [ - 155.5404357910156, - -28.73989868164062 + 155.54, + -28.74 ], [ - 155.5404357910156, - 39.1641845703125 + 155.54, + 39.16 ], [ - 68.44607543945312, - 39.1641845703125 + 68.45, + 39.16 ], [ - 68.44607543945312, - -0.20050048828125 + 68.45, + -0.2 ], [ - 68.44607543945312, - 125.7665100097656 + 68.45, + 125.77 ], [ - 181.1274719238281, - 125.7665100097656 + 181.13, + 125.77 ], [ - 181.1274719238281, - -25.29547119140625 + 181.13, + -25.3 ], [ - 331.2053527832031, - -25.29547119140625 + 331.21, + -25.3 ], [ - 247.5820617675781, - -23.93475341796875 + 247.58, + -23.93 ], [ - 247.6548156738281, - 129.4666442871094 + 247.65, + 129.47 ] ] } @@ -480,12 +456,12 @@ }, { "o": { - "x": 0.167, - "y": 0.167 + "x": 0.17, + "y": 0.17 }, "i": { - "x": 0.833, - "y": 0.833 + "x": 0.83, + "y": 0.83 }, "s": [ { @@ -504,23 +480,23 @@ 0 ], [ - 6.396759033203125, - 9.841171264648438 + 6.4, + 9.84 ], [ 0, 0 ], [ - -6.396760940551758, + -6.4, 0 ], [ - -4.635403409234519, + -4.64, 0 ], [ - -19.93594982572876, + -19.94, 0 ], [ @@ -606,19 +582,19 @@ 0 ], [ - -6.396759033203125, - -9.841171264648438 + -6.4, + -9.84 ], [ 0, 0 ], [ - 0.9466622313741766, + 0.95, 0 ], [ - 21.61248115926822, + 21.61, 0 ], [ @@ -696,104 +672,104 @@ ], "v": [ [ - -331.2053527832031, - 133.0563049316406 + -331.21, + 133.06 ], [ - -285.8681335449219, - 94.76681518554688 + -285.87, + 94.77 ], [ - -135.8598327636719, - 94.76681518554688 + -135.86, + 94.77 ], [ - -126.4090881347656, - 77.54476928710938 + -126.41, + 77.54 ], [ - -215.9637451171875, - -9.549652099609375 + -215.96, + -9.55 ], [ - -227.4279172459164, - -52.83690967943781 + -227.43, + -52.84 ], [ - -207.258119013612, - -28.36317598268284 + -207.26, + -28.36 ], [ - -111.2316601122227, - -28.36317598268284 + -111.23, + -28.36 ], [ - -102.5145492553711, - -28.73989868164062 + -102.51, + -28.74 ], [ - 12.35140991210938, - -25.29547119140625 + 12.35, + -25.3 ], [ - 12.35140991210938, - 94.76681518554688 + 12.35, + 94.77 ], [ - -76.2191162109375, - 94.76681518554688 + -76.22, + 94.77 ], [ - -76.2191162109375, - -0.20050048828125 + -76.22, + -0.2 ], [ - -76.2191162109375, - -133.0563049316406 + -76.22, + -133.06 ], [ - 49.25582885742188, - -28.73989868164062 + 49.26, + -28.74 ], [ - 155.5404357910156, - -28.73989868164062 + 155.54, + -28.74 ], [ - 155.5404357910156, - 39.1641845703125 + 155.54, + 39.16 ], [ - 91.9609375, - 39.1641845703125 + 91.96, + 39.16 ], [ - 68.44607543945312, - -0.20050048828125 + 68.45, + -0.2 ], [ - 68.44607543945312, - 125.7665100097656 + 68.45, + 125.77 ], [ - 181.1274719238281, - 125.7665100097656 + 181.13, + 125.77 ], [ - 181.1274434682485, - -29.59544540095974 + 181.13, + -29.6 ], [ - 331.2053243276235, - -29.59544540095974 + 331.21, + -29.6 ], [ - 247.5820617675781, - -23.93475341796875 + 247.58, + -23.93 ], [ - 247.6548156738281, - 129.4666442871094 + 247.65, + 129.47 ] ] } @@ -818,23 +794,23 @@ 0 ], [ - 6.396759033203125, - 9.841171264648438 + 6.4, + 9.84 ], [ 0, 0 ], [ - -6.396760940551758, + -6.4, 0 ], [ - -4.635403409234519, + -4.64, 0 ], [ - -19.93594982572876, + -19.94, 0 ], [ @@ -920,19 +896,19 @@ 0 ], [ - -6.396759033203125, - -9.841171264648438 + -6.4, + -9.84 ], [ 0, 0 ], [ - 0.9466622313741766, + 0.95, 0 ], [ - 21.61248115926822, + 21.61, 0 ], [ @@ -1010,131 +986,126 @@ ], "v": [ [ - -331.2053527832031, - 133.0563049316406 + -331.21, + 133.06 ], [ - -285.8681335449219, - 94.76681518554688 + -285.87, + 94.77 ], [ - -135.8598327636719, - 94.76681518554688 + -135.86, + 94.77 ], [ - -126.4090881347656, - 77.54476928710938 + -126.41, + 77.54 ], [ - -215.9637451171875, - -9.549652099609375 + -215.96, + -9.55 ], [ - -227.765167427063, - -53.8623129789095 + -227.77, + -53.86 ], [ - -207.258119013612, - -28.36317598268284 + -207.26, + -28.36 ], [ - -111.2316601122227, - -28.36317598268284 + -111.23, + -28.36 ], [ - -102.5145492553711, - -28.73989868164062 + -102.51, + -28.74 ], [ - 12.35140991210938, - -25.29547119140625 + 12.35, + -25.3 ], [ - 12.35140991210938, - 94.76681518554688 + 12.35, + 94.77 ], [ - -76.2191162109375, - 94.76681518554688 + -76.22, + 94.77 ], [ - -76.2191162109375, - -0.20050048828125 + -76.22, + -0.2 ], [ - -76.2191162109375, - -133.0563049316406 + -76.22, + -133.06 ], [ - 49.25582885742188, - -28.73989868164062 + 49.26, + -28.74 ], [ - 155.5404357910156, - -28.73989868164062 + 155.54, + -28.74 ], [ - 155.5404357910156, - 39.1641845703125 + 155.54, + 39.16 ], [ - 68.44607543945312, - 39.1641845703125 + 68.45, + 39.16 ], [ - 68.44607543945312, - -0.20050048828125 + 68.45, + -0.2 ], [ - 68.44607543945312, - 125.7665100097656 + 68.45, + 125.77 ], [ - 181.1274719238281, - 125.7665100097656 + 181.13, + 125.77 ], [ - 181.12744140625, - -29.90703773498535 + 181.13, + -29.91 ], [ - 331.205322265625, - -29.90703773498535 + 331.21, + -29.91 ], [ - 247.5820617675781, - -23.93475341796875 + 247.58, + -23.93 ], [ - 247.6548156738281, - 129.4666442871094 + 247.65, + 129.47 ] ] } ], "t": 296 } - ], - "ix": 2 + ] } }, { "ty": "st", "bm": 0, - "hd": false, - "nm": "", "lc": 1, "lj": 2, "ml": 4, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 }, "w": { "a": 0, - "k": 46, - "ix": 2 + "k": 46 }, "c": { "a": 0, @@ -1142,15 +1113,12 @@ 0.8118, 0.8118, 0.8118 - ], - "ix": 2 + ] } }, { "ty": "tm", "bm": 0, - "hd": false, - "nm": "", "e": { "a": 1, "k": [ @@ -1160,7 +1128,7 @@ "y": 0 }, "i": { - "x": 0.8275862068965517, + "x": 0.83, "y": 1 }, "s": [ @@ -1174,18 +1142,15 @@ ], "t": 400 } - ], - "ix": 2 + ] }, "o": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "s": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "m": 1 }, @@ -1196,44 +1161,37 @@ "k": [ 0, 0 - ], - "ix": 2 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ - -42.62127685546875, - 1.794830322265625 - ], - "ix": 2 + -42.62, + 1.79 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } } ] @@ -1244,17 +1202,14 @@ ] }, { - "nm": "", "id": "1", "layers": [ { "ty": 0, - "nm": "SOPT.svg 1", "sr": 1, "st": 0, "op": 401, "ip": 0, - "hd": false, "ddd": 0, "bm": 0, "hasMask": false, @@ -1266,44 +1221,37 @@ "k": [ 10000, 10000 - ], - "ix": 2 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ 10000, 10000 - ], - "ix": 2 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, "ef": [], @@ -1314,12 +1262,10 @@ }, { "ty": 0, - "nm": "Masked Group 1", "sr": 1, "st": 0, "op": 401, "ip": 0, - "hd": false, "ddd": 0, "bm": 0, "tt": 1, @@ -1331,44 +1277,37 @@ "k": [ 10000, 10000 - ], - "ix": 2 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ 10000, 10000 - ], - "ix": 2 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, "ef": [], @@ -1380,17 +1319,14 @@ ] }, { - "nm": "", "id": "2", "layers": [ { "ty": 3, - "nm": "SOPT.svg 1", "sr": 1, "st": 0, "op": 401, "ip": 0, - "hd": false, "ddd": 0, "bm": 0, "hasMask": false, @@ -1399,46 +1335,39 @@ "a": { "a": 0, "k": [ - 43.49636083375663, - 12.02382261119783 - ], - "ix": 2 + 43.5, + 12.02 + ] }, "s": { "a": 0, "k": [ - 658.8152408599855, - 658.8152408599855 - ], - "ix": 2 + 658.82, + 658.82 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ - 9997.82859826088, - 10034.80782699585 - ], - "ix": 2 + 9997.83, + 10034.81 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, "ef": [], @@ -1446,12 +1375,10 @@ }, { "ty": 4, - "nm": "Path", "sr": 1, "st": 0, "op": 401, "ip": 0, - "hd": false, "ddd": 0, "bm": 0, "hasMask": false, @@ -1462,44 +1389,37 @@ "k": [ 0, 0 - ], - "ix": 2 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ 0, 0 - ], - "ix": 2 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, "ef": [], @@ -1507,14 +1427,10 @@ { "ty": "gr", "bm": 0, - "hd": false, - "nm": "", "it": [ { "ty": "sh", "bm": 0, - "hd": false, - "nm": "", "d": 1, "ks": { "a": 0, @@ -1527,315 +1443,315 @@ ], [ 0, - 0.06650000000000134 + 0.07 ], [ - 0.01120000000000232, - 0.09779999999999944 + 0.01, + 0.1 ], [ - 0.003800000000001802, - 0.04690000000000083 + 0, + 0.05 ], [ 0, - 0.01170000000000115 + 0.01 ], [ - 0.007500000000000284, - 0.04689999999999728 + 0.01, + 0.05 ], [ - 0.003799999999998249, - 0.01170000000000115 + 0, + 0.01 ], [ - 0.007500000000000284, - 0.03910000000000124 + 0.01, + 0.04 ], [ - 0.003800000000001802, - 0.01170000000000115 + 0, + 0.01 ], [ - 0.007500000000000284, - 0.03920000000000101 + 0.01, + 0.04 ], [ - 0.003799999999998249, - 0.01569999999999894 + 0, + 0.02 ], [ - 0.01129999999999853, - 0.03910000000000124 + 0.01, + 0.04 ], [ 0, - 0.003900000000001569 + 0 ], [ - 0.003799999999998249, - 0.01959999999999695 + 0, + 0.02 ], [ - 0.01129999999999853, - 0.02740000000000009 + 0.01, + 0.03 ], [ - 0.007500000000000284, - 0.01569999999999894 + 0.01, + 0.02 ], [ - 0.01500000000000057, - 0.03910000000000124 + 0.02, + 0.04 ], [ - 0.003800000000001802, - 0.01570000000000249 + 0, + 0.02 ], [ - 0.01130000000000209, - 0.03129999999999811 + 0.01, + 0.03 ], [ - 0.003799999999998249, - 0.01570000000000249 + 0, + 0.02 ], [ - 0.01129999999999853, - 0.03519999999999968 + 0.01, + 0.04 ], [ - 0.007500000000000284, - 0.01569999999999894 + 0.01, + 0.02 ], [ - 0.01510000000000034, - 0.03910000000000124 + 0.02, + 0.04 ], [ - 0.007500000000000284, - 0.01559999999999917 + 0.01, + 0.02 ], [ - 0.01879999999999882, - 0.03129999999999811 + 0.02, + 0.03 ], [ - 0.007500000000000284, - 0.01180000000000092 + 0.01, + 0.01 ], [ - 0.02260000000000062, - 0.04300000000000281 + 0.02, + 0.04 ], [ - 0.003800000000001802, - 0.01170000000000115 + 0, + 0.01 ], [ - 0.01879999999999882, - 0.03130000000000166 + 0.02, + 0.03 ], [ - 0.003700000000002035, - 0.01170000000000115 + 0, + 0.01 ], [ - 0.0262999999999991, - 0.04299999999999926 + 0.03, + 0.04 ], [ - 0.003699999999998482, - 0.007799999999999585 + 0, + 0.01 ], [ - 0.0224999999999973, - 0.03129999999999811 + 0.02, + 0.03 ], [ - 0.007600000000000051, - 0.01179999999999737 + 0.01, + 0.01 ], [ - 0.0301000000000009, - 0.03910000000000124 + 0.03, + 0.04 ], [ - 0.03000000000000114, - 0.04309999999999903 + 0.03, + 0.04 ], [ - 0.01879999999999882, - 0.02349999999999852 + 0.02, + 0.02 ], [ - 0.0525999999999982, - 0.06649999999999778 + 0.05, + 0.07 ], [ - 0.04509999999999792, - 0.0586999999999982 + 0.05, + 0.06 ], [ - 0.04139999999999944, - 0.04690000000000083 + 0.04, + 0.05 ], [ - 0.04510000000000147, - 0.05080000000000062 + 0.05, + 0.05 ], [ - 0.06770000000000209, - 0.07429999999999914 + 0.07, + 0.07 ], [ - 0.04889999999999972, - 0.04699999999999882 + 0.05, + 0.05 ], [ - 0.09029999999999916, - 0.09779999999999944 + 0.09, + 0.1 ], [ - 0.04510000000000147, - 0.05079999999999885 + 0.05, + 0.05 ], [ - 0.09399999999999764, - 0.1015999999999995 + 0.09, + 0.1 ], [ - 0.1428000000000011, - 0.1563999999999997 + 0.14, + 0.16 ], [ - 0.7442000000000029, - 0.7744 + 0.74, + 0.77 ], [ - 0.218, - 0.222900000000001 + 0.22, + 0.22 ], [ - 0.08649999999999913, - 0.08990000000000009 + 0.09, + 0.09 ], [ - 0.04130000000000145, - 0.04689999999999905 + 0.04, + 0.05 ], [ - 0.08650000000000091, - 0.08610000000000007 + 0.09, + 0.09 ], [ - 0.4474, - 0.45756 + 0.45, + 0.46 ], [ - 0.0262999999999991, - 0.01956000000000024 + 0.03, + 0.02 ], [ - 0.08269999999999911, + 0.08, 0 ], [ - 2.735243333333334, + 2.74, 0 ], [ - -0.03758000000000017, - -0.03910999999999998 + -0.04, + -0.04 ], [ - -0.1917066666666667, - -0.2020600000000004 + -0.19, + -0.2 ], [ - -0.04761333333333306, - -0.04953666666666656 + -0.05, + -0.05 ], [ - -1.043723333333333, - -1.104163333333334 + -1.04, + -1.1 ], [ - -2.086203333333334, - -2.209633333333333 + -2.09, + -2.21 ], [ - 0.1240000000000006, - -0.04300000000000281 + 0.12, + -0.04 ], [ - 0.02249999999999908, + 0.02, 0 ], [ - 4.113516333333335, + 4.11, 0 ], [ - 0.0563835, - -0.07819999999999894 + 0.06, + -0.08 ], [ - 0.0112767, - -0.03519999999999968 + 0.01, + -0.04 ], [ - 0.003758900000000003, - -0.01170000000000115 + 0, + -0.01 ], [ 0, - -0.02349999999999852 + -0.02 ], [ 0, - -1.561700000000002 + -1.56 ], [ 0, - -0.1538333333333313 + -0.15 ], [ 0, - -0.007799999999999585 + -0.01 ], [ - -0.04134790000000001, - -0.04689999999999728 + -0.04, + -0.05 ], [ - -0.007517999999999997, - -0.007799999999999585 + -0.01, + -0.01 ], [ - -0.041348, - -0.01570000000000249 + -0.04, + -0.02 ], [ - -0.03759000000000001, + -0.04, 0 ], [ - -5.48424966666667, + -5.48, 0 ], [ - -0.8080999999999996, - 0.8876999999999988 + -0.81, + 0.89 ], [ - -0.007499999999996732, - 0.9346999999999994 + -0.01, + 0.93 ], [ 0, - 0.001300000000000523 + 0 ], [ 0, @@ -1849,315 +1765,315 @@ "o": [ [ 0, - -0.06649999999999778 + -0.07 ], [ 0, - -0.10170000000000101 + -0.1 ], [ - -0.003799999999998249, - -0.05079999999999885 + 0, + -0.05 ], [ 0, - -0.0116999999999976 + -0.01 ], [ - -0.007500000000000284, - -0.04690000000000083 + -0.01, + -0.05 ], [ 0, - -0.01170000000000115 + -0.01 ], [ - -0.007500000000000284, - -0.04299999999999926 + -0.01, + -0.04 ], [ 0, - -0.01179999999999737 + -0.01 ], [ - -0.007500000000000284, - -0.03910000000000124 + -0.01, + -0.04 ], [ 0, - -0.01559999999999917 + -0.02 ], [ - -0.007500000000000284, - -0.03910000000000124 + -0.01, + -0.04 ], [ 0, 0 ], [ - -0.003800000000001802, - -0.01959999999999695 + 0, + -0.02 ], [ - -0.007500000000000284, - -0.03130000000000166 + -0.01, + -0.03 ], [ - -0.003700000000002035, - -0.01960000000000051 + 0, + -0.02 ], [ - -0.01499999999999702, - -0.04299999999999926 + -0.01, + -0.04 ], [ - -0.003799999999998249, - -0.01569999999999894 + 0, + -0.02 ], [ - -0.01119999999999877, - -0.03119999999999834 + -0.01, + -0.03 ], [ - -0.007500000000000284, - -0.01960000000000051 + -0.01, + -0.02 ], [ - -0.01500000000000057, - -0.03519999999999968 + -0.02, + -0.04 ], [ - -0.007500000000000284, - -0.01569999999999894 + -0.01, + -0.02 ], [ - -0.01509999999999678, - -0.03910000000000124 + -0.02, + -0.04 ], [ - -0.007500000000000284, - -0.01559999999999917 + -0.01, + -0.02 ], [ - -0.01510000000000034, - -0.03130000000000166 + -0.02, + -0.03 ], [ - -0.007500000000000284, - -0.01170000000000115 + -0.01, + -0.01 ], [ - -0.02260000000000062, - -0.04299999999999926 + -0.02, + -0.04 ], [ - -0.007500000000000284, - -0.01179999999999737 + -0.01, + -0.01 ], [ - -0.01869999999999905, - -0.03129999999999811 + -0.02, + -0.03 ], [ - -0.007600000000000051, - -0.01170000000000115 + -0.01, + -0.01 ], [ - -0.0262999999999991, - -0.04299999999999926 + -0.03, + -0.04 ], [ - -0.003800000000001802, - -0.007899999999999352 + 0, + -0.01 ], [ - -0.02260000000000062, - -0.03520000000000323 + -0.02, + -0.04 ], [ - -0.007500000000000284, - -0.01170000000000115 + -0.01, + -0.01 ], [ - -0.0262999999999991, - -0.03910000000000124 + -0.03, + -0.04 ], [ - -0.0301000000000009, - -0.03909999999999769 + -0.03, + -0.04 ], [ - -0.01879999999999882, - -0.02730000000000032 + -0.02, + -0.03 ], [ - -0.05260000000000176, - -0.07039999999999935 + -0.05, + -0.07 ], [ - -0.04520000000000124, - -0.05870000000000175 + -0.05, + -0.06 ], [ - -0.04139999999999944, - -0.0508000000000024 + -0.04, + -0.05 ], [ - -0.04509999999999792, - -0.05479999999999841 + -0.05, + -0.05 ], [ - -0.06769999999999854, - -0.07429999999999914 + -0.07, + -0.07 ], [ - -0.04509999999999792, - -0.05080000000000062 + -0.05, + -0.05 ], [ - -0.09019999999999939, - -0.09770000000000145 + -0.09, + -0.1 ], [ - -0.04879999999999995, - -0.05080000000000062 + -0.05, + -0.05 ], [ - -0.09399999999999764, - -0.10170000000000101 + -0.09, + -0.1 ], [ - -0.1428000000000011, - -0.1526000000000014 + -0.14, + -0.15 ], [ - -0.4510999999999967, - -0.492799999999999 + -0.45, + -0.49 ], [ - -0.2068000000000012, - -0.2150999999999996 + -0.21, + -0.22 ], [ - -0.08649999999999913, - -0.08990000000000009 + -0.09, + -0.09 ], [ - -0.0450999999999997, - -0.04699999999999882 + -0.05, + -0.05 ], [ - -0.08649999999999913, - -0.08999999999999986 + -0.09, + -0.09 ], [ - -1.5711999999999993, - -1.61904 + -1.57, + -1.62 ], [ - -0.02249999999999908, - -0.02347000000000055 + -0.02, + -0.02 ], [ - -0.06770000000000032, - -0.04301999999999939 + -0.07, + -0.04 ], [ - -2.735243333333333, + -2.74, 0 ], [ - -0.05637999999999987, + -0.06, 0 ], [ - 0.1917066666666667, - 0.2020600000000004 + 0.19, + 0.2 ], [ - 0.04761333333333306, - 0.04953666666666656 + 0.05, + 0.05 ], [ - 1.043723333333334, - 1.104163333333333 + 1.04, + 1.1 ], [ - 2.086203333333332, - 2.209633333333333 + 2.09, + 2.21 ], [ - 0.1014999999999997, - 0.1054999999999993 + 0.1, + 0.11 ], [ - -0.01879999999999882, - 0.007899999999999352 + -0.02, + 0.01 ], [ - -4.113516333333333, + -4.11, 0 ], [ - -0.10525, + -0.11, 0 ], [ - -0.018794499999999992, - 0.02740000000000009 + -0.02, + 0.03 ], [ 0, - 0.01170000000000115 + 0.01 ], [ - -0.003758999999999998, - 0.01949999999999719 + 0, + 0.02 ], [ 0, - 1.561700000000002 + 1.56 ], [ 0, - 0.1538333333333313 + 0.15 ], [ 0, 0 ], [ - 0.007517900000000001, - 0.07039999999999935 + 0.01, + 0.07 ], [ - 0.007517999999999997, - 0.007800000000003138 + 0.01, + 0.01 ], [ - 0.030070999999999987, - 0.03129999999999811 + 0.03, + 0.03 ], [ - 0.030071000000000014, - 0.0116999999999976 + 0.03, + 0.01 ], [ - 5.484249666666665, + 5.48, 0 ], [ - 1.172800000000002, + 1.17, 0 ], [ - 0.9322000000000017, - -1.0208000000000013 + 0.93, + -1.02 ], [ 0, - -0.001300000000000523 + 0 ], [ 0, @@ -2174,328 +2090,328 @@ ], "v": [ [ - 21.1062391, - 12.51468 + 21.11, + 12.51 ], [ - 21.1062391, - 12.31128 + 21.11, + 12.31 ], [ - 21.0875391, - 12.01408 + 21.09, + 12.01 ], [ - 21.0724391, - 11.86548 + 21.07, + 11.87 ], [ - 21.0724391, - 11.83418 + 21.07, + 11.83 ], [ - 21.0536391, - 11.69338 + 21.05, + 11.69 ], [ - 21.0461391, - 11.65818 + 21.05, + 11.66 ], [ - 21.0236391, - 11.53308 + 21.02, + 11.53 ], [ - 21.0160391, - 11.50178 + 21.02, + 11.5 ], [ - 20.9897391, - 11.38048 + 20.99, + 11.38 ], [ - 20.9784391, - 11.33358 + 20.98, + 11.33 ], [ - 20.9484391, - 11.22018 + 20.95, + 11.22 ], [ - 20.9484391, - 11.20848 + 20.95, + 11.21 ], [ - 20.9333391, - 11.15368 + 20.93, + 11.15 ], [ - 20.9070391, - 11.06768 + 20.91, + 11.07 ], [ - 20.8882391, - 11.01288 + 20.89, + 11.01 ], [ - 20.8469391, - 10.88778 + 20.85, + 10.89 ], [ - 20.8318391, - 10.84078 + 20.83, + 10.84 ], [ - 20.7980391, - 10.74698 + 20.8, + 10.75 ], [ - 20.7792391, - 10.69608 + 20.78, + 10.7 ], [ - 20.7379391, - 10.59058 + 20.74, + 10.59 ], [ - 20.7191391, - 10.54748 + 20.72, + 10.55 ], [ - 20.6702391, - 10.43408 + 20.67, + 10.43 ], [ - 20.6477391, - 10.38718 + 20.65, + 10.39 ], [ - 20.5988391, - 10.28938 + 20.6, + 10.29 ], [ - 20.5800391, - 10.25418 + 20.58, + 10.25 ], [ - 20.5123391, - 10.12908 + 20.51, + 10.13 ], [ - 20.4935391, - 10.09388 + 20.49, + 10.09 ], [ - 20.4372391, - 9.99608 + 20.44, + 10 ], [ - 20.4184391, - 9.96088 + 20.42, + 9.96 ], [ - 20.3432391, - 9.83578 + 20.34, + 9.84 ], [ - 20.3282391, - 9.812280000000001 + 20.33, + 9.81 ], [ - 20.2605391, - 9.71058 + 20.26, + 9.71 ], [ - 20.2379391, - 9.67538 + 20.24, + 9.68 ], [ - 20.1515391, - 9.554179999999999 + 20.15, + 9.55 ], [ - 20.0613391, - 9.43288 + 20.06, + 9.43 ], [ - 20.0049391, - 9.35858 + 20, + 9.36 ], [ - 19.8433391, - 9.155280000000001 + 19.84, + 9.16 ], [ - 19.7042391, - 8.98318 + 19.7, + 8.98 ], [ - 19.5801391, - 8.838479999999999 + 19.58, + 8.84 ], [ - 19.4411391, - 8.67818 + 19.44, + 8.68 ], [ - 19.2418391, - 8.45518 + 19.24, + 8.46 ], [ - 19.1027391, - 8.30658 + 19.1, + 8.31 ], [ - 18.8283391, - 8.01328 + 18.83, + 8.01 ], [ - 18.6855391, - 7.86078 + 18.69, + 7.86 ], [ - 18.4036391, - 7.55968 + 18.4, + 7.56 ], [ - 17.9751391, - 7.098179999999999 + 17.98, + 7.1 ], [ - 16.1107391, - 5.127079999999999 + 16.11, + 5.13 ], [ - 15.4754391, - 4.470079999999999 + 15.48, + 4.47 ], [ - 15.2160391, - 4.204179999999999 + 15.22, + 4.2 ], [ - 15.0845391, - 4.06728 + 15.08, + 4.07 ], [ - 14.8251391, - 3.80128 + 14.83, + 3.8 ], [ - 11.2353391, - 0.12906 + 11.24, + 0.13 ], [ - 11.1602391, - 0.06647999999999943 + 11.16, + 0.07 ], [ - 10.9309391, + 10.93, 0 ], [ - 2.7252091, + 2.73, 0 ], [ - 2.6800991, - 0.1094999999999997 + 2.68, + 0.11 ], [ - 3.2552191, - 0.7156799999999999 + 3.26, + 0.72 ], [ - 3.3980591, - 0.8642899999999996 + 3.4, + 0.86 ], [ - 6.5292291, - 4.176779999999999 + 6.53, + 4.18 ], [ - 12.7878391, - 10.80568 + 12.79, + 10.81 ], [ - 12.7164391, - 11.12628 + 12.72, + 11.13 ], [ - 12.6525391, - 11.13808 + 12.65, + 11.14 ], [ - 0.3119901, - 11.13808 + 0.31, + 11.14 ], [ - 0.0601426, - 11.27098 + 0.06, + 11.27 ], [ - 0.0150357, - 11.36488 + 0.02, + 11.36 ], [ - 0.007517900000000001, - 11.39618 + 0.01, + 11.4 ], [ 0, - 11.46268 + 11.46 ], [ 0, - 16.14778 + 16.15 ], [ 0, - 16.60928 + 16.61 ], [ 0, - 16.64058 + 16.64 ], [ - 0.07893710000000001, - 16.82438 + 0.08, + 16.82 ], [ - 0.1014911, - 16.84788 + 0.1, + 16.85 ], [ - 0.2104991, - 16.91438 + 0.21, + 16.91 ], [ - 0.3119901, - 16.92998 + 0.31, + 16.93 ], [ - 16.7647391, - 16.92998 + 16.76, + 16.93 ], [ - 19.8921391, - 15.57688 + 19.89, + 15.58 ], [ - 21.1062391, - 12.51858 + 21.11, + 12.52 ], [ - 21.1062391, - 12.51468 + 21.11, + 12.51 ], [ - 21.1062391, - 12.51468 + 21.11, + 12.51 ], [ - 21.1062391, - 12.51468 + 21.11, + 12.51 ] ] } @@ -2504,43 +2420,34 @@ { "ty": "fl", "bm": 0, - "hd": false, - "nm": "", "c": { "a": 0, "k": [ 0.1529, 0.1529, 0.1529 - ], - "ix": 2 + ] }, "r": 1, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, { "ty": "tm", "bm": 0, - "hd": false, - "nm": "", "e": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 }, "o": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "s": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "m": 1 }, @@ -2549,46 +2456,39 @@ "a": { "a": 0, "k": [ - 10.55311955, - 8.46499 - ], - "ix": 2 + 10.55, + 8.46 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ - 10.57558059692383, - 15.53920745849609 - ], - "ix": 2 + 10.58, + 15.54 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } } ] @@ -2599,12 +2499,10 @@ }, { "ty": 4, - "nm": "Path", "sr": 1, "st": 0, "op": 401, "ip": 0, - "hd": false, "ddd": 0, "bm": 0, "hasMask": false, @@ -2615,44 +2513,37 @@ "k": [ 0, 0 - ], - "ix": 2 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ 0, 0 - ], - "ix": 2 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, "ef": [], @@ -2660,14 +2551,10 @@ { "ty": "gr", "bm": 0, - "hd": false, - "nm": "", "it": [ { "ty": "sh", "bm": 0, - "hd": false, - "nm": "", "d": 1, "ks": { "a": 0, @@ -2679,91 +2566,91 @@ 0 ], [ - 3.925566666666668, + 3.93, 0 ], [ - 0.03379999999999939, - -0.011732499999999993 + 0.03, + -0.01 ], [ - 0.01129999999999143, - -0.007821599999999998 + 0.01, + -0.01 ], [ 0, - -0.121236 + -0.12 ], [ 0, - -1.7377140000000009 + -1.74 ], [ - -0.1728999999999985, + -0.17, 0 ], [ - -1.829333333333338, + -1.83, 0 ], [ - -0.02259999999999707, - -0.007819999999999716 + -0.02, + -0.01 ], [ - -0.01879999999999882, - -0.05866999999999933 + -0.02, + -0.06 ], [ 0, - -0.01564000000000032 + -0.02 ], [ 0, - -0.007820000000000604 + -0.01 ], [ 0, - -5.583349999999999 + -5.58 ], [ 0, - -0.21640000000000015 + -0.22 ], [ 0, - -0.05996666666666783 + -0.06 ], [ - -0.00750000000000739, - -0.02340000000000231 + -0.01, + -0.02 ], [ - -0.00750000000000739, - -0.01960000000000051 + -0.01, + -0.02 ], [ - -0.07150000000000034, - -0.03519999999999968 + -0.07, + -0.04 ], [ - -0.04879999999999995, + -0.05, 0 ], [ - -1.825599999999994, + -1.83, 0 ], [ 0, - 0.17989999999999995 + 0.18 ], [ 0, - 7.880343733333334 + 7.88 ], [ - 0.001233333333331643, + 0, 0 ], [ @@ -2777,91 +2664,91 @@ ], "o": [ [ - -3.925566666666668, + -3.93, 0 ], [ - -0.03759999999999764, + -0.04, 0 ], [ - -0.01510000000000389, - 0.003910800000000006 + -0.02, + 0 ], [ - -0.09770000000000323, - 0.0547518 + -0.1, + 0.05 ], [ 0, - 1.737714 + 1.74 ], [ 0, - 0.17989999999999995 + 0.18 ], [ - 1.829333333333338, + 1.83, 0 ], [ - 0.02260000000001128, + 0.02, 0 ], [ - 0.0525999999999982, - 0.01954999999999973 + 0.05, + 0.02 ], [ 0, - 0.01173000000000002 + 0.01 ], [ 0, - 0.007830000000000226 + 0.01 ], [ 0, - 5.583349999999999 + 5.58 ], [ 0, - 0.21640000000000015 + 0.22 ], [ 0, - 0.05996666666666783 + 0.06 ], [ 0, - 0.02349999999999852 + 0.02 ], [ - 0.007499999999993179, - 0.02349999999999852 + 0.01, + 0.02 ], [ - 0.03009999999999025, - 0.07430000000000092 + 0.03, + 0.07 ], [ - 0.04129999999999256, - 0.01950000000000074 + 0.04, + 0.02 ], [ - 1.825599999999994, + 1.83, 0 ], [ - 0.1728999999999985, + 0.17, 0 ], [ 0, - -7.880343733333333 + -7.88 ], [ - -0.001233333333331643, + 0, 0 ], [ @@ -2879,103 +2766,103 @@ ], "v": [ [ - 12.0887, + 12.09, 0 ], [ - 0.3119999999999976, + 0.31, 0 ], [ - 0.2068000000000012, - 0.019554199999999994 + 0.21, + 0.02 ], [ - 0.1654000000000053, - 0.0391084 + 0.17, + 0.04 ], [ 0, - 0.3245992 + 0.32 ], [ 0, - 5.5377412 + 5.54 ], [ - 0.3119999999999976, - 5.8623412 + 0.31, + 5.86 ], [ - 5.799999999999997, - 5.8623412 + 5.8, + 5.86 ], [ - 5.867699999999999, - 5.8740712 + 5.87, + 5.87 ], [ - 5.980500000000006, - 5.9992212 + 5.98, + 6 ], [ - 5.988, - 6.0383212 + 5.99, + 6.04 ], [ - 5.988, - 6.057881200000001 + 5.99, + 6.06 ], [ - 5.988, - 22.8079312 + 5.99, + 22.81 ], [ - 5.988, - 23.4571312 + 5.99, + 23.46 ], [ - 5.988, - 23.6370312 + 5.99, + 23.64 ], [ - 5.995500000000007, - 23.7035312 + 6, + 23.7 ], [ - 6.014300000000006, - 23.7661312 + 6.01, + 23.77 ], [ - 6.172200000000004, - 23.9343312 + 6.17, + 23.93 ], [ - 6.303700000000006, - 23.9656312 + 6.3, + 23.97 ], [ - 11.7805, - 23.9656312 + 11.78, + 23.97 ], [ - 12.0924, - 23.6410312 + 12.09, + 23.64 ], [ - 12.0924, + 12.09, 0 ], [ - 12.0887, + 12.09, 0 ], [ - 12.0887, + 12.09, 0 ], [ - 12.0887, + 12.09, 0 ] ] @@ -2985,43 +2872,34 @@ { "ty": "fl", "bm": 0, - "hd": false, - "nm": "", "c": { "a": 0, "k": [ 0.1529, 0.1529, 0.1529 - ], - "ix": 2 + ] }, "r": 1, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, { "ty": "tm", "bm": 0, - "hd": false, - "nm": "", "e": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 }, "o": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "s": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "m": 1 }, @@ -3030,46 +2908,39 @@ "a": { "a": 0, "k": [ - 6.046199999999999, - 11.9828156 - ], - "ix": 2 + 6.05, + 11.98 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ - 71.46609497070312, - 12.02578449249268 - ], - "ix": 2 + 71.47, + 12.03 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } } ] @@ -3080,12 +2951,10 @@ }, { "ty": 4, - "nm": "Path", "sr": 1, "st": 0, "op": 401, "ip": 0, - "hd": false, "ddd": 0, "bm": 0, "hasMask": false, @@ -3096,44 +2965,37 @@ "k": [ 0, 0 - ], - "ix": 2 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ 0, 0 - ], - "ix": 2 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, "ef": [], @@ -3141,14 +3003,10 @@ { "ty": "gr", "bm": 0, - "hd": false, - "nm": "", "it": [ { "ty": "sh", "bm": 0, - "hd": false, - "nm": "", "d": 1, "ks": { "a": 0, @@ -3160,228 +3018,228 @@ 0 ], [ - 0.6540999999999997, - 0.492767 + 0.65, + 0.49 ], [ - 0.01879999999999882, - 0.01564300000000007 + 0.02, + 0.02 ], [ - 0.0262999999999991, - 0.01955400000000007 + 0.03, + 0.02 ], [ - 0.007499999999993179, - 0.003910999999999998 + 0.01, + 0 ], [ - 0.06390000000000384, - 0.03519800000000001 + 0.06, + 0.04 ], [ - 0.5714000000000041, + 0.57, 0 ], [ - 4.377866666666666, + 4.38, 0 ], [ - 0.5300000000000011, - -0.42237 + 0.53, + -0.42 ], [ - 0.02260000000000062, - -0.01955399999999996 + 0.02, + -0.02 ], [ - 0.03379999999999939, - -0.03128699999999995 + 0.03, + -0.03 ], [ - 0.0301000000000009, - -0.03128700000000006 + 0.03, + -0.03 ], [ - 0.06020000000000181, - -0.72742 + 0.06, + -0.73 ], [ 0, - -0.01563999999999988 + -0.02 ], [ 0, - -1.015513333333333 + -1.02 ], [ - -4.506933333333336, + -4.51, 0 ], [ - -0.02249999999999375, - -0.01173000000000002 + -0.02, + -0.01 ], [ - -0.003799999999998249, - -0.003909999999999414 + 0, + 0 ], [ - -0.007500000000000284, - -0.003909999999999414 + -0.01, + 0 ], [ 0, - -0.06648000000000032 + -0.07 ], [ 0, - -3.96949 + -3.97 ], [ - 0.03379999999999939, - -0.03519999999999968 + 0.03, + -0.04 ], [ - 0.05260000000000531, + 0.05, 0 ], [ - 2.602433333333334, + 2.6, 0 ], [ - 0.0262999999999991, - 0.01560000000000272 + 0.03, + 0.02 ], [ - 0.003800000000001802, + 0, 0 ], [ - 0.01129999999999853, - 0.0116999999999976 + 0.01, + 0.01 ], [ - 0.01130000000000209, - 0.02740000000000009 + 0.01, + 0.03 ], [ 0, - 0.02350000000000207 + 0.02 ], [ 0, - 3.5406 + 3.54 ], [ - 0.01879999999999882, - 0.04302000000000028 + 0.02, + 0.04 ], [ - 0.0262999999999991, - 0.02737000000000034 + 0.03, + 0.03 ], [ - 0.007500000000000284, - 0.003910000000000302 + 0.01, + 0 ], [ - 0.07519999999999882, + 0.08, 0 ], [ - 1.744133333333334, + 1.74, 0 ], [ 0, - -4.5444 + -4.54 ], [ - -0.04129999999999967, - -0.2189999999999976 + -0.04, + -0.22 ], [ - -0.003800000000001802, - -0.0116999999999976 + 0, + -0.01 ], [ - -0.007500000000000284, - -0.03909999999999769 + -0.01, + -0.04 ], [ - -0.003699999999998482, - -0.01570000000000249 + 0, + -0.02 ], [ - -0.01129999999999853, - -0.03519999999999968 + -0.01, + -0.04 ], [ - -0.003800000000001802, - -0.01949999999999719 + 0, + -0.02 ], [ - -0.02260000000000062, - -0.05860000000000198 + -0.02, + -0.06 ], [ - -0.04510000000000147, - -0.09380000000000166 + -0.05, + -0.09 ], [ - -0.01130000000000209, - -0.01950000000000074 + -0.01, + -0.02 ], [ - -0.01500000000000057, - -0.02340000000000231 + -0.02, + -0.02 ], [ - -0.01119999999999877, - -0.01960000000000051 + -0.01, + -0.02 ], [ - -0.07150000000000034, - -0.09390000000000143 + -0.07, + -0.09 ], [ - -0.0224999999999973, - -0.03120000000000189 + -0.02, + -0.03 ], [ - -0.9923000000000002, - 0.0116999999999976 + -0.99, + 0.01 ], [ - -4.277633333333334, + -4.28, 0 ], [ - 0.01879999999999882, - 1.892799999999998 + 0.02, + 1.89 ], [ 0, - 3.359400000000001 + 3.36 ], [ 0, - 1.877216666666667 + 1.88 ], [ 0, - 0.7078600000000002 + 0.71 ], [ 0, - 0.01955000000000018 + 0.02 ], [ - -0.003766666666663809, - -0.001303333333333434 + 0, + 0 ], [ 0, @@ -3394,99 +3252,99 @@ ], "o": [ [ - -0.07519999999999527, - -0.8994900000000001 + -0.08, + -0.9 ], [ - -0.01500000000000057, - -0.011732999999999993 + -0.02, + -0.01 ], [ - -0.0262999999999991, - -0.01955399999999996 + -0.03, + -0.02 ], [ - -0.007500000000000284, - -0.003910999999999998 + -0.01, + 0 ], [ - -0.06020000000000181, - -0.03910799999999992 + -0.06, + -0.04 ], [ - -0.4547999999999988, - -0.258115 + -0.45, + -0.26 ], [ - -4.377866666666662, + -4.38, 0 ], [ - -0.7479999999999976, + -0.75, 0 ], [ - -0.0262999999999991, - 0.01955399999999996 + -0.03, + 0.02 ], [ - -0.03759999999999764, - 0.03128699999999995 + -0.04, + 0.03 ], [ - -0.0301000000000009, - 0.03128700000000006 + -0.03, + 0.03 ], [ - -0.46229999999999905, - 0.4771239999999999 + -0.46, + 0.48 ], [ 0, - 0.01955000000000018 + 0.02 ], [ 0, - 1.015513333333333 + 1.02 ], [ - 4.506933333333333, + 4.51, 0 ], [ - 0.0262999999999991, + 0.03, 0 ], [ - 0.003800000000005355, + 0, 0 ], [ - 0.007500000000000284, - 0.003910000000000302 + 0.01, + 0 ], [ - 0.04509999999999792, - 0.03520000000000056 + 0.05, + 0.04 ], [ 0, - 3.96949 + 3.97 ], [ 0, - 0.05480000000000018 + 0.05 ], [ - -0.03379999999999939, - 0.03519999999999968 + -0.03, + 0.04 ], [ - -2.60243333333333, + -2.6, 0 ], [ - -0.03379999999999939, + -0.03, 0 ], [ @@ -3494,128 +3352,128 @@ 0 ], [ - -0.01499999999999702, - -0.007799999999999585 + -0.01, + -0.01 ], [ - -0.01880000000000237, - -0.01950000000000074 + -0.02, + -0.02 ], [ - -0.007500000000000284, - -0.01960000000000051 + -0.01, + -0.02 ], [ 0, - -3.5406 + -3.54 ], [ 0, - -0.04692999999999969 + -0.05 ], [ - -0.01510000000000034, - -0.03519000000000005 + -0.02, + -0.04 ], [ - -0.007500000000000284, - -0.007830000000000226 + -0.01, + -0.01 ], [ - -0.0525999999999982, - -0.04692999999999969 + -0.05, + -0.05 ], [ - -1.744133333333334, + -1.74, 0 ], [ 0, - 4.5444 + 4.54 ], [ 0, - 0.2306999999999988 + 0.23 ], [ 0, - 0.01180000000000092 + 0.01 ], [ - 0.007500000000000284, - 0.04299999999999926 + 0.01, + 0.04 ], [ 0, - 0.01560000000000272 + 0.02 ], [ - 0.01130000000000209, - 0.03909999999999769 + 0.01, + 0.04 ], [ - 0.003799999999998249, - 0.01559999999999917 + 0, + 0.02 ], [ - 0.01869999999999905, - 0.05870000000000175 + 0.02, + 0.06 ], [ - 0.03760000000000119, - 0.09779999999999944 + 0.04, + 0.1 ], [ - 0.01129999999999853, - 0.02349999999999852 + 0.01, + 0.02 ], [ - 0.01500000000000057, - 0.02740000000000009 + 0.02, + 0.03 ], [ - 0.01129999999999853, - 0.01959999999999695 + 0.01, + 0.02 ], [ - 0.06020000000000181, - 0.10170000000000101 + 0.06, + 0.1 ], [ - 0.02250000000000085, - 0.03129999999999811 + 0.02, + 0.03 ], [ - 0.6014000000000017, - 0.7626999999999988 + 0.6, + 0.76 ], [ - 4.277633333333331, + 4.28, 0 ], [ - 1.7254, - 0.02349999999999852 + 1.73, + 0.02 ], [ 0, - -3.359400000000001 + -3.36 ], [ 0, - -1.877216666666666 + -1.88 ], [ 0, - -0.7078600000000002 + -0.71 ], [ 0, 0 ], [ - 0.003766666666663809, - 0.001303333333333434 + 0, + 0 ], [ 0, @@ -3632,240 +3490,240 @@ ], "v": [ [ - 19.2795, - 2.76887 + 19.28, + 2.77 ], [ - 18.1104, - 0.621823 + 18.11, + 0.62 ], [ - 18.0578, - 0.582714 + 18.06, + 0.58 ], [ - 17.9789, - 0.527963 + 17.98, + 0.53 ], [ - 17.9601, - 0.51623 + 17.96, + 0.52 ], [ - 17.7759, - 0.402816 + 17.78, + 0.4 ], [ - 16.2159, + 16.22, 0 ], [ - 3.0823, + 3.08, 0 ], [ - 1.123899999999999, - 0.672663 + 1.12, + 0.67 ], [ - 1.0487, - 0.735236 + 1.05, + 0.74 ], [ - 0.9435000000000002, - 0.829097 + 0.94, + 0.83 ], [ - 0.849499999999999, - 0.919046 + 0.85, + 0.92 ], [ - 0.0262999999999991, - 2.76105 + 0.03, + 2.76 ], [ - 0.0262999999999991, - 2.8158 + 0.03, + 2.82 ], [ - 0.0262999999999991, - 5.86234 + 0.03, + 5.86 ], [ - 13.5471, - 5.86234 + 13.55, + 5.86 ], [ - 13.6185, - 5.87798 + 13.62, + 5.88 ], [ - 13.6336, - 5.8858 + 13.63, + 5.89 ], [ - 13.6561, - 5.90145 + 13.66, + 5.9 ], [ - 13.7313, - 6.05788 + 13.73, + 6.06 ], [ - 13.7313, - 17.96635 + 13.73, + 17.97 ], [ - 13.6749, - 18.10325 + 13.67, + 18.1 ], [ - 13.5434, - 18.16195 + 13.54, + 18.16 ], [ - 5.7361, - 18.16195 + 5.74, + 18.16 ], [ - 5.645900000000001, - 18.13845 + 5.65, + 18.14 ], [ - 5.642099999999999, - 18.13845 + 5.64, + 18.14 ], [ - 5.604500000000002, - 18.10715 + 5.6, + 18.11 ], [ - 5.5594, - 18.03285 + 5.56, + 18.03 ], [ - 5.548200000000001, - 17.96635 + 5.55, + 17.97 ], [ - 5.548200000000001, - 7.34455 + 5.55, + 7.34 ], [ - 5.5181, - 7.20766 + 5.52, + 7.21 ], [ - 5.4542, - 7.11381 + 5.45, + 7.11 ], [ - 5.4316, - 7.09425 + 5.43, + 7.09 ], [ - 5.232400000000002, - 7.01995 + 5.23, + 7.02 ], [ 0, - 7.01995 + 7.02 ], [ 0, - 20.65315 + 20.65 ], [ - 0.06010000000000204, - 21.32575 + 0.06, + 21.33 ], [ - 0.06770000000000209, - 21.36095 + 0.07, + 21.36 ], [ - 0.0940000000000012, - 21.48615 + 0.09, + 21.49 ], [ - 0.1052, - 21.52915 + 0.11, + 21.53 ], [ - 0.1353000000000009, - 21.64255 + 0.14, + 21.64 ], [ - 0.1504000000000012, - 21.69335 + 0.15, + 21.69 ], [ - 0.2104999999999997, - 21.86935 + 0.21, + 21.87 ], [ - 0.334500000000002, - 22.15875 + 0.33, + 22.16 ], [ - 0.3684000000000012, - 22.22525 + 0.37, + 22.23 ], [ - 0.4097000000000008, - 22.30345 + 0.41, + 22.3 ], [ - 0.4435000000000002, - 22.36215 + 0.44, + 22.36 ], [ - 0.6353000000000009, - 22.65155 + 0.64, + 22.65 ], [ - 0.7028999999999996, - 22.74145 + 0.7, + 22.74 ], [ - 3.217600000000001, - 23.95775 + 3.22, + 23.96 ], [ - 16.0505, - 23.95775 + 16.05, + 23.96 ], [ - 19.2682, - 20.65705 + 19.27, + 20.66 ], [ - 19.2682, - 10.57885 + 19.27, + 10.58 ], [ - 19.2682, - 4.9472 + 19.27, + 4.95 ], [ - 19.2682, - 2.82362 + 19.27, + 2.82 ], [ - 19.2682, - 2.76496 + 19.27, + 2.76 ], [ - 19.2795, - 2.76887 + 19.28, + 2.77 ], [ - 19.2795, - 2.76887 + 19.28, + 2.77 ], [ - 19.2795, - 2.76887 + 19.28, + 2.77 ] ] } @@ -3874,43 +3732,34 @@ { "ty": "fl", "bm": 0, - "hd": false, - "nm": "", "c": { "a": 0, "k": [ 0.1529, 0.1529, 0.1529 - ], - "ix": 2 + ] }, "r": 1, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, { "ty": "tm", "bm": 0, - "hd": false, - "nm": "", "e": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 }, "o": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "s": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "m": 1 }, @@ -3919,46 +3768,39 @@ "a": { "a": 0, "k": [ - 9.63975, - 11.97901760501438 - ], - "ix": 2 + 9.64, + 11.98 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ - 32.60655212402344, - 12.0102653503418 - ], - "ix": 2 + 32.61, + 12.01 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } } ] @@ -3969,12 +3811,10 @@ }, { "ty": 4, - "nm": "Path", "sr": 1, "st": 0, "op": 401, "ip": 0, - "hd": false, "ddd": 0, "bm": 0, "hasMask": false, @@ -3985,44 +3825,37 @@ "k": [ 0, 0 - ], - "ix": 2 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ 0, 0 - ], - "ix": 2 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, "ef": [], @@ -4030,14 +3863,10 @@ { "ty": "gr", "bm": 0, - "hd": false, - "nm": "", "it": [ { "ty": "sh", "bm": 0, - "hd": false, - "nm": "", "d": 1, "ks": { "a": 0, @@ -4050,223 +3879,223 @@ ], [ 0, - 1.735106666666667 + 1.74 ], [ - 0.7593000000000032, - 0.7743480000000003 + 0.76, + 0.77 ], [ - 1.300600000000003, + 1.3, 0 ], [ - 5.1372, + 5.14, 0 ], [ - 0.04889999999999617, - -0.117325 + 0.05, + -0.12 ], [ - 0.003800000000005355, - -0.023464999999999986 + 0, + -0.02 ], [ 0, - -0.02346499999999996 + -0.02 ], [ 0, - -0.06778766666666669 + -0.07 ], [ 0, - -0.08603833333333333 + -0.09 ], [ 0, - -1.427454333333333 + -1.43 ], [ 0, - -0.08864666666666654 + -0.09 ], [ 0, - -0.1759866666666667 + -0.18 ], [ - -4.18116666666667, + -4.18, 0 ], [ - -0.01879999999999882, - -0.01173000000000002 + -0.02, + -0.01 ], [ - -0.01509999999999678, - -0.007829999999999337 + -0.02, + -0.01 ], [ - -0.003799999999998249, - -0.003910000000000302 + 0, + 0 ], [ - -0.01129999999999853, - -0.04302000000000028 + -0.01, + -0.04 ], [ 0, - -0.01564999999999994 + -0.02 ], [ 0, - -0.007819999999999716 + -0.01 ], [ 0, - -0.2411666666666665 + -0.24 ], [ 0, - -1.080680000000001 + -1.08 ], [ 0, - -0.1655666666666669 + -0.17 ], [ - 0.1052000000000035, + 0.11, 0 ], [ - 2.084966666666666, + 2.08, 0 ], [ 0, - 0.1095000000000006 + 0.11 ], [ 0, - 0.1147000000000009 + 0.11 ], [ 0, - 0.6778899999999997 + 0.68 ], [ 0, - 0.2633299999999998 + 0.26 ], [ - 0.01879999999999882, - 0.04302000000000028 + 0.02, + 0.04 ], [ - 0.1240999999999985, + 0.12, 0 ], [ - 1.929566666666666, + 1.93, 0 ], [ 0, - -5.263983333333336 + -5.26 ], [ 0, - -0.2411666666666683 + -0.24 ], [ 0, - -0.03259999999999863 + -0.03 ], [ - -0.007500000000000284, - -0.02340000000000231 + -0.01, + -0.02 ], [ - -0.007500000000000284, - -0.01950000000000074 + -0.01, + -0.02 ], [ - -0.07140000000000413, - -0.03519999999999968 + -0.07, + -0.04 ], [ - -0.04879999999999995, + -0.05, 0 ], [ - -1.8256000000000014, + -1.83, 0 ], [ - -0.04130000000000678, - 0.01950000000000074 + -0.04, + 0.02 ], [ - -0.03010000000000446, - 0.07430000000000092 + -0.03, + 0.07 ], [ - -0.003799999999998249, - 0.02349999999999852 + 0, + 0.02 ], [ 0, - 0.02340000000000231 + 0.02 ], [ 0, - 0.03259999999999863 + 0.03 ], [ 0, - 0.3063666666666656 + 0.31 ], [ 0, - 2.050566666666668 + 2.05 ], [ - -3.277766666666665, + -3.28, 0 ], [ - -0.02260000000000417, + -0.02, 0 ], [ - -0.5150000000000006, - 0.3832000000000004 + -0.52, + 0.38 ], [ - -0.04129999999999967, - 0.03129999999999988 + -0.04, + 0.03 ], [ - -0.04129999999999967, - 0.03519999999999968 + -0.04, + 0.04 ], [ - -0.05270000000000152, - 0.05470000000000041 + -0.05, + 0.05 ], [ - 0.01129999999999853, - 0.7586999999999993 + 0.01, + 0.76 ], [ 0, - 1.839383333333333 + 1.84 ], [ - 0.002499999999997726, - 0.005213333333333736 + 0, + 0.01 ], [ 0, @@ -4280,223 +4109,223 @@ "o": [ [ 0, - -1.735106666666666 + -1.74 ], [ 0, 0 ], [ - -0.4885999999999981, - -0.4966759999999999 + -0.49, + -0.5 ], [ - -5.1372, + -5.14, 0 ], [ - -0.1277999999999935, + -0.13, 0 ], [ - -0.007500000000000284, - 0.01955400000000002 + -0.01, + 0.02 ], [ - -0.003799999999998249, - 0.02346499999999996 + 0, + 0.02 ], [ 0, - 0.06778766666666669 + 0.07 ], [ 0, - 0.08603833333333333 + 0.09 ], [ 0, - 1.427454333333333 + 1.43 ], [ 0, - 0.08864666666666654 + 0.09 ], [ 0, - 0.1759866666666667 + 0.18 ], [ - 4.18116666666667, + 4.18, 0 ], [ - 0.02250000000000085, + 0.02, 0 ], [ - 0.01510000000000389, - 0.003909999999999414 + 0.02, + 0 ], [ 0, 0 ], [ - 0.03379999999999939, - 0.02346000000000004 + 0.03, + 0.02 ], [ 0, - 0.01173000000000002 + 0.01 ], [ 0, - 0.007819999999999716 + 0.01 ], [ 0, - 0.2411666666666665 + 0.24 ], [ 0, - 1.0806799999999992 + 1.08 ], [ 0, - 0.1655666666666669 + 0.17 ], [ 0, - 0.1095000000000006 + 0.11 ], [ - -2.084966666666666, + -2.08, 0 ], [ - -0.1051999999999964, + -0.11, 0 ], [ 0, - -0.1147000000000009 + -0.11 ], [ 0, - -0.6778899999999997 + -0.68 ], [ 0, - -0.26332999999999895 + -0.26 ], [ 0, - -0.04692999999999969 + -0.05 ], [ - -0.04879999999999995, - -0.1134199999999996 + -0.05, + -0.11 ], [ - -1.929566666666666, + -1.93, 0 ], [ 0, - 5.263983333333331 + 5.26 ], [ 0, - 0.2411666666666683 + 0.24 ], [ 0, - 0.03259999999999863 + 0.03 ], [ 0, - 0.02340000000000231 + 0.02 ], [ - 0.007500000000000284, - 0.02349999999999852 + 0.01, + 0.02 ], [ - 0.03009999999999735, - 0.07430000000000092 + 0.03, + 0.07 ], [ - 0.04129999999999967, - 0.01950000000000074 + 0.04, + 0.02 ], [ - 1.8256000000000014, + 1.83, 0 ], [ - 0.04509999999999792, + 0.05, 0 ], [ - 0.07139999999999702, - -0.03519999999999968 + 0.07, + -0.04 ], [ - 0.007500000000000284, - -0.01950000000000074 + 0.01, + -0.02 ], [ - 0.003799999999998249, - -0.02340000000000231 + 0, + -0.02 ], [ 0, - -0.03259999999999863 + -0.03 ], [ 0, - -0.3063666666666656 + -0.31 ], [ 0, - -2.050566666666665 + -2.05 ], [ - 3.277766666666665, + 3.28, 0 ], [ - 0.02259999999999707, + 0.02, 0 ], [ - 0.5975999999999999, - -0.007799999999999585 + 0.6, + -0.01 ], [ - 0.04129999999999967, - -0.03129999999999988 + 0.04, + -0.03 ], [ - 0.04139999999999588, - -0.03129999999999988 + 0.04, + -0.03 ], [ - 0.05639999999999645, - -0.05080000000000062 + 0.06, + -0.05 ], [ - 0.5675999999999988, - -0.5670999999999999 + 0.57, + -0.57 ], [ 0, - -1.839383333333334 + -1.84 ], [ - -0.002499999999997726, - -0.005213333333333736 + 0, + -0.01 ], [ 0, @@ -4513,236 +4342,236 @@ ], "v": [ [ - 19.0765, - 7.8842412 + 19.08, + 7.88 ], [ - 19.0765, - 2.6789212 + 19.08, + 2.68 ], [ - 18.3096, - 0.9073131999999999 + 18.31, + 0.91 ], [ - 15.7273, + 15.73, 0 ], [ - 0.3156999999999996, + 0.32, 0 ], [ - 0.02630000000000621, - 0.1994522 + 0.03, + 0.2 ], [ - 0.007500000000000284, - 0.2620262 + 0.01, + 0.26 ], [ 0, - 0.3285102 + 0.33 ], [ 0, - 0.5318731999999999 + 0.53 ], [ 0, - 0.7899881999999999 + 0.79 ], [ 0, - 5.0723512 + 5.07 ], [ 0, - 5.3382912 + 5.34 ], [ 0, - 5.866251200000001 + 5.87 ], [ - 12.5435, - 5.866251200000001 + 12.54, + 5.87 ], [ - 12.6036, - 5.877981200000001 + 12.6, + 5.88 ], [ - 12.645, - 5.8975412 + 12.65, + 5.9 ], [ - 12.6525, - 5.9014512 + 12.65, + 5.9 ], [ - 12.7239, - 6.0031312 + 12.72, + 6 ], [ - 12.7314, - 6.0422412 + 12.73, + 6.04 ], [ - 12.7314, - 6.0617912 + 12.73, + 6.06 ], [ - 12.7314, - 6.7852912000000005 + 12.73, + 6.79 ], [ - 12.7314, - 10.0273312 + 12.73, + 10.03 ], [ - 12.7314, - 10.5240312 + 12.73, + 10.52 ], [ - 12.5435, - 10.7196312 + 12.54, + 10.72 ], [ - 6.288600000000002, - 10.7196312 + 6.29, + 10.72 ], [ - 6.100700000000003, - 10.5240312 + 6.1, + 10.52 ], [ - 6.100700000000003, - 10.1799312 + 6.1, + 10.18 ], [ - 6.100700000000003, - 8.1462612 + 6.1, + 8.15 ], [ - 6.100700000000003, - 7.3562712 + 6.1, + 7.36 ], [ - 6.070600000000006, - 7.2194012 + 6.07, + 7.22 ], [ - 5.788700000000006, - 7.0316812 + 5.79, + 7.03 ], [ 0, - 7.0316812 + 7.03 ], [ 0, - 22.8236312 + 22.82 ], [ 0, - 23.5471312 + 23.55 ], [ 0, - 23.6449312 + 23.64 ], [ - 0.007500000000000284, - 23.7113312 + 0.01, + 23.71 ], [ - 0.02630000000000621, - 23.7739312 + 0.03, + 23.77 ], [ - 0.1842000000000041, - 23.9421312 + 0.18, + 23.94 ], [ - 0.3156999999999996, - 23.9734312 + 0.32, + 23.97 ], [ - 5.792500000000004, - 23.9734312 + 5.79, + 23.97 ], [ - 5.924000000000007, - 23.9421312 + 5.92, + 23.94 ], [ - 6.081900000000005, - 23.7739312 + 6.08, + 23.77 ], [ - 6.100700000000003, - 23.7113312 + 6.1, + 23.71 ], [ - 6.108200000000004, - 23.6449312 + 6.11, + 23.64 ], [ - 6.108200000000004, - 23.5471312 + 6.11, + 23.55 ], [ - 6.108200000000004, - 22.6280312 + 6.11, + 22.63 ], [ - 6.108200000000004, - 16.4763312 + 6.11, + 16.48 ], [ - 15.9415, - 16.4763312 + 15.94, + 16.48 ], [ - 16.013000000000005, - 16.4763312 + 16.01, + 16.48 ], [ - 17.7383, - 15.8467312 + 17.74, + 15.85 ], [ - 17.8623, - 15.7528312 + 17.86, + 15.75 ], [ - 17.982600000000005, - 15.6511312 + 17.98, + 15.65 ], [ - 18.1518, - 15.4908312 + 18.15, + 15.49 ], [ - 19.084, - 13.4180312 + 19.08, + 13.42 ], [ - 19.084, - 7.8998812 + 19.08, + 7.9 ], [ - 19.0765, - 7.8842412 + 19.08, + 7.88 ], [ - 19.0765, - 7.8842412 + 19.08, + 7.88 ], [ - 19.0765, - 7.8842412 + 19.08, + 7.88 ] ] } @@ -4751,43 +4580,34 @@ { "ty": "fl", "bm": 0, - "hd": false, - "nm": "", "c": { "a": 0, "k": [ 0.1529, 0.1529, 0.1529 - ], - "ix": 2 + ] }, "r": 1, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, { "ty": "tm", "bm": 0, - "hd": false, - "nm": "", "e": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 }, "o": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "s": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "m": 1 }, @@ -4796,46 +4616,39 @@ "a": { "a": 0, "k": [ - 9.542123972108259, - 11.9867156 - ], - "ix": 2 + 9.54, + 11.99 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ - 54.28432464599609, - 12.02968215942383 - ], - "ix": 2 + 54.28, + 12.03 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } } ] @@ -4846,12 +4659,10 @@ }, { "ty": 4, - "nm": "Path", "sr": 1, "st": 0, "op": 401, "ip": 0, - "hd": false, "ddd": 0, "bm": 0, "hasMask": false, @@ -4862,44 +4673,37 @@ "k": [ 0, 0 - ], - "ix": 2 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ 0, 0 - ], - "ix": 2 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, "ef": [], @@ -4907,14 +4711,10 @@ { "ty": "gr", "bm": 0, - "hd": false, - "nm": "", "it": [ { "ty": "sh", "bm": 0, - "hd": false, - "nm": "", "d": 1, "ks": { "a": 0, @@ -4926,36 +4726,36 @@ 0 ], [ - 2.718933333333339, + 2.72, 0 ], [ 0, - -1.954113733333334 + -1.95 ], [ - -1.388300000000001, + -1.39, 0 ], [ - -0.1954999999999956, - 0.2854900000000002 + -0.2, + 0.29 ], [ - -1.131433333333334, - 1.706427666666666 + -1.13, + 1.71 ], [ - -0.01380000000000337, - 0.01955399999999996 + -0.01, + 0.02 ], [ - 0.154200000000003, + 0.15, 0 ], [ 0, - 0.001303633333333332 + 0 ], [ 0, @@ -4968,36 +4768,36 @@ ], "o": [ [ - -2.718933333333339, + -2.72, 0 ], [ 0, - 1.954113733333333 + 1.95 ], [ - 1.388300000000001, + 1.39, 0 ], [ - 0.345799999999997, + 0.35, 0 ], [ - 1.131433333333334, - -1.706427666666667 + 1.13, + -1.71 ], [ - 0.01380000000000337, - -0.01955400000000007 + 0.01, + -0.02 ], [ - 0.08639999999999759, - -0.129058 + 0.09, + -0.13 ], [ 0, - -0.001303633333333332 + 0 ], [ 0, @@ -5014,7 +4814,7 @@ ], "v": [ [ - 8.156800000000004, + 8.16, 0 ], [ @@ -5023,38 +4823,38 @@ ], [ 0, - 5.8623412 + 5.86 ], [ - 4.164900000000003, - 5.8623412 + 4.16, + 5.86 ], [ - 4.875299999999996, - 5.4869012 + 4.88, + 5.49 ], [ - 8.269599999999997, - 0.3676182 + 8.27, + 0.37 ], [ - 8.311000000000007, - 0.3089562 + 8.31, + 0.31 ], [ - 8.156800000000004, - 0.003910900000000002 + 8.16, + 0 ], [ - 8.156800000000004, + 8.16, 0 ], [ - 8.156800000000004, + 8.16, 0 ], [ - 8.156800000000004, + 8.16, 0 ] ] @@ -5064,43 +4864,34 @@ { "ty": "fl", "bm": 0, - "hd": false, - "nm": "", "c": { "a": 0, "k": [ 0.1529, 0.1529, 0.1529 - ], - "ix": 2 + ] }, "r": 1, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, { "ty": "tm", "bm": 0, - "hd": false, - "nm": "", "e": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 }, "o": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "s": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "m": 1 }, @@ -5109,46 +4900,39 @@ "a": { "a": 0, "k": [ - 4.172631109613312, - 2.9311706 - ], - "ix": 2 + 4.17, + 2.93 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ - 82.7976303100586, - 2.974139928817749 - ], - "ix": 2 + 82.8, + 2.97 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } } ] @@ -5159,12 +4943,10 @@ }, { "ty": 4, - "nm": "Path", "sr": 1, "st": 0, "op": 401, "ip": 0, - "hd": false, "ddd": 0, "bm": 0, "hasMask": false, @@ -5175,44 +4957,37 @@ "k": [ 0, 0 - ], - "ix": 2 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ 0, 0 - ], - "ix": 2 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, "ef": [], @@ -5220,14 +4995,10 @@ { "ty": "gr", "bm": 0, - "hd": false, - "nm": "", "it": [ { "ty": "sh", "bm": 0, - "hd": false, - "nm": "", "d": 1, "ks": { "a": 0, @@ -5239,40 +5010,40 @@ 0 ], [ - 1.264266666666668, - 1.753356666666667 + 1.26, + 1.75 ], [ - 0.09769999999999968, + 0.1, 0 ], [ - 4.012023333333334, + 4.01, 0 ], [ 0, - -1.57215 + -1.57 ], [ 0, - -1.059836666666667 + -1.06 ], [ - -6.318723333333335, + -6.32, 0 ], [ - 0.09389999999999787, - 0.12906 + 0.09, + 0.13 ], [ - 0.03886666666666727, - 0.0547500000000003 + 0.04, + 0.05 ], [ - 0.001233333333331643, - -0.001303333333333434 + 0, + 0 ], [ 0, @@ -5285,40 +5056,40 @@ ], "o": [ [ - -1.264266666666668, - -1.753356666666666 + -1.26, + -1.75 ], [ - -0.06010000000000204, - -0.0821272 + -0.06, + -0.08 ], [ - -4.012023333333332, + -4.01, 0 ], [ - -1.74414, - 0.0117325 + -1.74, + 0.01 ], [ 0, - 1.059836666666667 + 1.06 ], [ - 6.318723333333334, + 6.32, 0 ], [ - 0.1540999999999997, + 0.15, 0 ], [ - -0.03886666666666727, - -0.0547500000000003 + -0.04, + -0.05 ], [ - -0.001233333333331643, - 0.001303333333333434 + 0, + 0 ], [ 0, @@ -5335,52 +5106,52 @@ ], "v": [ [ - 18.98627, - 5.3891275 + 18.99, + 5.39 ], [ - 15.19347, - 0.1290575 + 15.19, + 0.13 ], [ - 14.94547, + 14.95, 0 ], [ - 2.9094, + 2.91, 0 ], [ 0, - 2.6828275 + 2.68 ], [ 0, - 5.8623375 + 5.86 ], [ - 18.95617, - 5.8623375 + 18.96, + 5.86 ], [ - 19.10657, - 5.5494675 + 19.11, + 5.55 ], [ - 18.98997, - 5.3852175 + 18.99, + 5.39 ], [ - 18.98627, - 5.3891275 + 18.99, + 5.39 ], [ - 18.98627, - 5.3891275 + 18.99, + 5.39 ], [ - 18.98627, - 5.3891275 + 18.99, + 5.39 ] ] } @@ -5389,43 +5160,34 @@ { "ty": "fl", "bm": 0, - "hd": false, - "nm": "", "c": { "a": 0, "k": [ 0.1529, 0.1529, 0.1529 - ], - "ix": 2 + ] }, "r": 1, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } }, { "ty": "tm", "bm": 0, - "hd": false, - "nm": "", "e": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 }, "o": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "s": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "m": 1 }, @@ -5434,46 +5196,39 @@ "a": { "a": 0, "k": [ - 9.572392284439037, - 2.93116875 - ], - "ix": 2 + 9.57, + 2.93 + ] }, "s": { "a": 0, "k": [ 100, 100 - ], - "ix": 2 + ] }, "sk": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "p": { "a": 0, "k": [ - 11.5753231048584, - 2.970231294631958 - ], - "ix": 2 + 11.58, + 2.97 + ] }, "r": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "sa": { "a": 0, - "k": 0, - "ix": 2 + "k": 0 }, "o": { "a": 0, - "k": 100, - "ix": 2 + "k": 100 } } ] diff --git a/tsconfig.json b/tsconfig.json index e55ed2fe..b3f0fc57 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,12 +8,16 @@ /* Bundler mode */ "moduleResolution": "bundler", + "noUncheckedIndexedAccess": true, "allowImportingTsExtensions": true, "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", + /* testing library */ + "types": ["vitest/globals", "@testing-library/jest-dom"], + /* Linting */ "strict": true, "noUnusedLocals": true, @@ -31,11 +35,13 @@ "@store/*": ["common/store/*"], "@type/*": ["common/type/*"], "@utils/*": ["common/utils/*"], - "pages/*": ["pages/*"], + "contexts/*": ["contexts/*"], "styles/*": ["styles/*"], - "views/*": ["views/*"] + "tests/*": ["tests/*"], + "views/*": ["views/*"], + "mocks/*": ["mocks/*"] } }, - "include": ["src"], + "include": ["src", "./src/tests/setupTests.ts"], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/vite.config.ts b/vite.config.ts index 40690ac6..02883dc1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,12 +1,42 @@ +/// import path from 'path'; import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'; import react from '@vitejs/plugin-react'; -import { defineConfig } from 'vite'; +import { visualizer } from 'rollup-plugin-visualizer'; +import { defineConfig, type PluginOption } from 'vite'; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react(), vanillaExtractPlugin()], + plugins: [ + react(), + vanillaExtractPlugin(), + visualizer({ + filename: './dist/report.html', + gzipSize: true, + brotliSize: true, + }) as PluginOption, + ], + build: { + rollupOptions: { + output: { + manualChunks: (id) => { + // unsupported css 추출 + // if ( + // !id.includes('ApplyHeader') && + // (id.includes('reset') || + // id.includes('Callout') || + // id.includes('Header') || + // id.includes('Layout') || + // id.includes('Unsupported')) + // ) { + // return 'unsupported'; + // } + if (id.includes('firebase')) return 'firebase'; + }, + }, + }, + }, resolve: { alias: [ { find: '@apis', replacement: path.resolve(__dirname, 'src/common/apis') }, @@ -35,9 +65,15 @@ export default defineConfig({ find: '@utils', replacement: path.resolve(__dirname, 'src/common/utils'), }, - { find: 'pages', replacement: path.resolve(__dirname, 'src/pages') }, + { find: 'contexts', replacement: path.resolve(__dirname, 'src/contexts') }, { find: 'styles', replacement: path.resolve(__dirname, 'src/styles') }, + { find: 'tests', replacement: path.resolve(__dirname, 'src/tests') }, { find: 'views', replacement: path.resolve(__dirname, 'src/views') }, ], }, + test: { + globals: true, + environment: 'jsdom', + setupFiles: './src/tests/setupTests.ts', + }, }); diff --git a/yarn.lock b/yarn.lock index 31102e96..715554ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@adobe/css-tools@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" + integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== + "@amplitude/analytics-browser@^2.9.3": version "2.9.3" resolved "https://registry.yarnpkg.com/@amplitude/analytics-browser/-/analytics-browser-2.9.3.tgz#6139d2c5482cde5df0b42b65866c0dcbdf583257" @@ -119,7 +124,7 @@ idb "^8.0.0" tslib "^2.4.1" -"@ampproject/remapping@^2.2.0": +"@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== @@ -127,7 +132,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== @@ -135,6 +140,15 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" +"@babel/code-frame@^7.22.13": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" @@ -285,6 +299,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" @@ -359,6 +378,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.16.3": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.4.tgz#6ef37d678428306e7d75f054d5b1bdb8cf8aa8ee" + integrity sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.18.3": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" @@ -431,6 +457,28 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@bundled-es-modules/cookie@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz#c3b82703969a61cf6a46e959a012b2c257f6b164" + integrity sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw== + dependencies: + cookie "^0.5.0" + +"@bundled-es-modules/statuses@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz#761d10f44e51a94902c4da48675b71a76cc98872" + integrity sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg== + dependencies: + statuses "^2.0.1" + +"@bundled-es-modules/tough-cookie@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz#fa9cd3cedfeecd6783e8b0d378b4a99e52bde5d3" + integrity sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw== + dependencies: + "@types/tough-cookie" "^4.0.5" + tough-cookie "^4.1.4" + "@emotion/babel-plugin@^11.12.0": version "11.12.0" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2" @@ -805,6 +853,11 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@exodus/schemasafe@^1.0.0-rc.2": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@exodus/schemasafe/-/schemasafe-1.3.0.tgz#731656abe21e8e769a7f70a4d833e6312fe59b7f" + integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== + "@fastify/busboy@^2.0.0": version "2.1.1" resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" @@ -1247,6 +1300,51 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@inquirer/confirm@^3.0.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.2.0.tgz#6af1284670ea7c7d95e3f1253684cfbd7228ad6a" + integrity sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw== + dependencies: + "@inquirer/core" "^9.1.0" + "@inquirer/type" "^1.5.3" + +"@inquirer/core@^9.1.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.2.1.tgz#677c49dee399c9063f31e0c93f0f37bddc67add1" + integrity sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg== + dependencies: + "@inquirer/figures" "^1.0.6" + "@inquirer/type" "^2.0.0" + "@types/mute-stream" "^0.0.4" + "@types/node" "^22.5.5" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + cli-width "^4.1.0" + mute-stream "^1.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.6.tgz#1a562f916da39888c56b65b78259d2261bd7d40b" + integrity sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ== + +"@inquirer/type@^1.5.3": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.5.5.tgz#303ea04ce7ad2e585b921b662b3be36ef7b4f09b" + integrity sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA== + dependencies: + mute-stream "^1.0.0" + +"@inquirer/type@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-2.0.0.tgz#08fa513dca2cb6264fe1b0a2fabade051444e3f6" + integrity sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag== + dependencies: + mute-stream "^1.0.0" + "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" @@ -1271,6 +1369,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" @@ -1279,6 +1382,18 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@mswjs/interceptors@^0.35.8": + version "0.35.8" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.35.8.tgz#f36e5907e05593e33037ef4519aac7815fa3509f" + integrity sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ== + dependencies: + "@open-draft/deferred-promise" "^2.2.0" + "@open-draft/logger" "^0.3.0" + "@open-draft/until" "^2.0.0" + is-node-process "^1.2.0" + outvariant "^1.4.3" + strict-event-emitter "^0.5.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1300,6 +1415,24 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@open-draft/deferred-promise@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" + integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== + +"@open-draft/logger@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@open-draft/logger/-/logger-0.3.0.tgz#2b3ab1242b360aa0adb28b85f5d7da1c133a0954" + integrity sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ== + dependencies: + is-node-process "^1.2.0" + outvariant "^1.4.0" + +"@open-draft/until@^2.0.0", "@open-draft/until@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-2.1.0.tgz#0acf32f470af2ceaf47f095cdecd40d68666efda" + integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== + "@pkgr/core@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" @@ -1358,6 +1491,38 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@redocly/ajv@^8.11.2": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.11.2.tgz#46e1bf321ec0ac1e0fd31dea41a3d1fcbdcda0b5" + integrity sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js-replace "^1.0.1" + +"@redocly/config@^0.16.0": + version "0.16.0" + resolved "https://registry.yarnpkg.com/@redocly/config/-/config-0.16.0.tgz#4b7700a5cb6e04bc6d6fdb94b871c9e260a1fba6" + integrity sha512-t9jnODbUcuANRSl/K4L9nb12V+U5acIHnVSl26NWrtSdDZVtoqUXk2yGFPZzohYf62cCfEQUT8ouJ3bhPfpnJg== + +"@redocly/openapi-core@^1.25.9": + version "1.25.11" + resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.25.11.tgz#93f168284986da6809363b001e9aa7c2104c2fc0" + integrity sha512-bH+a8izQz4fnKROKoX3bEU8sQ9rjvEIZOqU6qTmxlhOJ0NsKa5e+LmU18SV0oFeg5YhWQhhEDihXkvKJ1wMMNQ== + dependencies: + "@redocly/ajv" "^8.11.2" + "@redocly/config" "^0.16.0" + colorette "^1.2.0" + https-proxy-agent "^7.0.4" + js-levenshtein "^1.1.6" + js-yaml "^4.1.0" + lodash.isequal "^4.5.0" + minimatch "^5.0.1" + node-fetch "^2.6.1" + pluralize "^8.0.0" + yaml-ast-parser "0.0.43" + "@remix-run/router@1.16.1": version "1.16.1" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.16.1.tgz#73db3c48b975eeb06d0006481bde4f5f2d17d1cd" @@ -1489,6 +1654,50 @@ dependencies: "@tanstack/query-core" "5.36.1" +"@testing-library/dom@^10.4.0": + version "10.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" + integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.3.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz#50484da3f80fb222a853479f618a9ce5c47bfe54" + integrity sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA== + dependencies: + "@adobe/css-tools" "^4.4.0" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.3" + lodash "^4.17.21" + redent "^3.0.0" + +"@testing-library/react@^16.0.1": + version "16.0.1" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.0.1.tgz#29c0ee878d672703f5e7579f239005e4e0faa875" + integrity sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg== + dependencies: + "@babel/runtime" "^7.12.5" + +"@testing-library/user-event@^14.5.2": + version "14.5.2" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" + integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== + +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + "@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" @@ -1522,17 +1731,22 @@ dependencies: "@babel/types" "^7.20.7" +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== + "@types/css-font-loading-module@0.0.7": version "0.0.7" resolved "https://registry.yarnpkg.com/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz#2f98ede46acc0975de85c0b7b0ebe06041d24601" integrity sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q== -"@types/estree@1.0.5": +"@types/estree@1.0.5", "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== -"@types/json-schema@^7.0.12": +"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -1547,6 +1761,13 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612" integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== +"@types/mute-stream@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478" + integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== + dependencies: + "@types/node" "*" + "@types/node@*": version "20.12.12" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" @@ -1561,6 +1782,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@^22.5.5": + version "22.5.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" + integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA== + dependencies: + undici-types "~6.19.2" + "@types/parse-json@^4.0.0": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" @@ -1571,14 +1799,14 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/react-dom@^18.2.22": +"@types/react-dom@^18.3.0": version "18.3.0" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.2.66": +"@types/react@*": version "18.3.2" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.2.tgz#462ae4904973bc212fa910424d901e3d137dbfcd" integrity sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w== @@ -1586,11 +1814,39 @@ "@types/prop-types" "*" csstype "^3.0.2" -"@types/semver@^7.5.0": +"@types/react@^18.3.5": + version "18.3.5" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.5.tgz#5f524c2ad2089c0ff372bbdabc77ca2c4dbadf8f" + integrity sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/semver@^7.3.12", "@types/semver@^7.5.0": version "7.5.8" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== +"@types/statuses@^2.0.4": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.5.tgz#f61ab46d5352fd73c863a1ea4e1cef3b0b51ae63" + integrity sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A== + +"@types/swagger-schema-official@^2.0.25": + version "2.0.25" + resolved "https://registry.yarnpkg.com/@types/swagger-schema-official/-/swagger-schema-official-2.0.25.tgz#c8073914004d0a9c5412aeaf458d96e34c504840" + integrity sha512-T92Xav+Gf/Ik1uPW581nA+JftmjWPgskw/WBf4TJzxRG/SJ+DfNnNE+WuZ4mrXuzflQMqMkm1LSYjzYW7MB1Cg== + +"@types/tough-cookie@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + +"@types/wrap-ansi@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" + integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== + "@typescript-eslint/eslint-plugin@^7.2.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz#093b96fc4e342226e65d5f18f9c87081e0b04a31" @@ -1617,6 +1873,14 @@ "@typescript-eslint/visitor-keys" "7.9.0" debug "^4.3.4" +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + "@typescript-eslint/scope-manager@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" @@ -1625,6 +1889,14 @@ "@typescript-eslint/types" "6.21.0" "@typescript-eslint/visitor-keys" "6.21.0" +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + "@typescript-eslint/scope-manager@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz#1dd3e63a4411db356a9d040e75864851b5f2619b" @@ -1643,16 +1915,39 @@ debug "^4.3.4" ts-api-utils "^1.3.0" +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + "@typescript-eslint/types@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== + "@typescript-eslint/types@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.9.0.tgz#b58e485e4bfba055659c7e683ad4f5f0821ae2ec" integrity sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + "@typescript-eslint/typescript-estree@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" @@ -1667,6 +1962,20 @@ semver "^7.5.4" ts-api-utils "^1.0.1" +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/typescript-estree@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz#3395e27656060dc313a6b406c3a298b729685e07" @@ -1691,6 +2000,20 @@ "@typescript-eslint/types" "7.9.0" "@typescript-eslint/typescript-estree" "7.9.0" +"@typescript-eslint/utils@^5.58.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + "@typescript-eslint/utils@^6.20.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" @@ -1704,6 +2027,24 @@ "@typescript-eslint/typescript-estree" "6.21.0" semver "^7.5.4" +"@typescript-eslint/utils@^7.7.1": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + "@typescript-eslint/visitor-keys@6.21.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" @@ -1712,6 +2053,14 @@ "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== + dependencies: + "@typescript-eslint/types" "7.18.0" + eslint-visitor-keys "^3.4.3" + "@typescript-eslint/visitor-keys@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz#82162656e339c3def02895f5c8546f6888d9b9ea" @@ -1795,11 +2144,67 @@ "@types/babel__core" "^7.20.5" react-refresh "^0.14.0" +"@vitest/expect@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.0.5.tgz#f3745a6a2c18acbea4d39f5935e913f40d26fa86" + integrity sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA== + dependencies: + "@vitest/spy" "2.0.5" + "@vitest/utils" "2.0.5" + chai "^5.1.1" + tinyrainbow "^1.2.0" + +"@vitest/pretty-format@2.0.5", "@vitest/pretty-format@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.5.tgz#91d2e6d3a7235c742e1a6cc50e7786e2f2979b1e" + integrity sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ== + dependencies: + tinyrainbow "^1.2.0" + +"@vitest/runner@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.5.tgz#89197e712bb93513537d6876995a4843392b2a84" + integrity sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig== + dependencies: + "@vitest/utils" "2.0.5" + pathe "^1.1.2" + +"@vitest/snapshot@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.5.tgz#a2346bc5013b73c44670c277c430e0334690a162" + integrity sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew== + dependencies: + "@vitest/pretty-format" "2.0.5" + magic-string "^0.30.10" + pathe "^1.1.2" + +"@vitest/spy@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.5.tgz#590fc07df84a78b8e9dd976ec2090920084a2b9f" + integrity sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA== + dependencies: + tinyspy "^3.0.0" + +"@vitest/utils@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.5.tgz#6f8307a4b6bc6ceb9270007f73c67c915944e926" + integrity sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ== + dependencies: + "@vitest/pretty-format" "2.0.5" + estree-walker "^3.0.3" + loupe "^3.1.1" + tinyrainbow "^1.2.0" + "@xstate/fsm@^1.4.0": version "1.6.5" resolved "https://registry.yarnpkg.com/@xstate/fsm/-/fsm-1.6.5.tgz#f599e301997ad7e3c572a0b1ff0696898081bea5" integrity sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -1810,6 +2215,13 @@ acorn@^8.11.3, acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1820,6 +2232,18 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -1839,11 +2263,28 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +argue-cli@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/argue-cli/-/argue-cli-2.1.0.tgz#e05b54cb913a80e2e29440611023ac9357f0e4de" + integrity sha512-dgojXfc4SiqmNwe38PnbT3zJasrz7g62dLAPD+VFT5RJb8W7LGRqw2IFd2ES+plnhsp4HYNJmFqMU1tCThdCww== + +aria-query@5.3.0, aria-query@^5.0.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" @@ -1948,11 +2389,21 @@ arraybuffer.prototype.slice@^1.0.3: is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -2010,6 +2461,24 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist-useragent-regexp@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/browserslist-useragent-regexp/-/browserslist-useragent-regexp-4.1.3.tgz#a8fad3530eb1e3e627530a034ec447f7e4ca98e1" + integrity sha512-+KteEIVlrE2eJOmtteWhcs3wYKjbFd9fVPzPlj4VGggKMyf9orf+zjmlNt91ekInZ2zqox5ArEZD/tKXDj0v9Q== + dependencies: + argue-cli "^2.1.0" + easy-table "^1.2.0" + picocolors "^1.0.0" + regexp-tree "^0.1.24" + ua-regexes-lite "^1.2.1" + browserslist@^4.22.2: version "4.23.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" @@ -2036,6 +2505,11 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" +call-me-maybe@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -2046,6 +2520,17 @@ caniuse-lite@^1.0.30001587: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz#78bb6f35b8fe315b96b8590597094145d0b146b4" integrity sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew== +chai@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" + integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2055,7 +2540,15 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2063,6 +2556,26 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +change-case@^5.4.4: + version "5.4.4" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-5.4.4.tgz#0d52b507d8fb8f204343432381d1a6d7bff97a02" + integrity sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w== + +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + +ci-info@^3.7.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -2072,6 +2585,11 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2096,6 +2614,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -2113,6 +2636,11 @@ confbox@^0.1.7: resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.7.tgz#ccfc0a2bcae36a84838e83a3b7f770fb17d6c579" integrity sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA== +consola@^3.2.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.3.3.tgz#0dd8a2314b0f7bf18a49064138ad685f3346543d" + integrity sha512-Qil5KwghMzlqd51UXM0b6fyaGHtOC22scxrwrz4A2882LyUMwQjnvaedN1HAeXzphspQ6CpHkzMAWxBTUruDLg== + convert-source-map@^1.5.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" @@ -2123,6 +2651,11 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + cosmiconfig@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" @@ -2134,7 +2667,17 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cross-spawn@^7.0.2: +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2153,16 +2696,36 @@ css-what@^6.1.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +cssstyle@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.0.1.tgz#ef29c598a1e90125c870525490ea4f354db0660a" + integrity sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ== + dependencies: + rrweb-cssom "^0.6.0" + csstype@^3.0.2, csstype@^3.0.7: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +data-urls@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde" + integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg== + dependencies: + whatwg-mimetype "^4.0.0" + whatwg-url "^14.0.0" + data-view-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" @@ -2190,10 +2753,12 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -date-fns@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" - integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== +debug@4, debug@^4.3.5: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" debug@^3.2.7: version "3.2.7" @@ -2209,11 +2774,21 @@ debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" +decimal.js@^10.4.3: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + dedent@^1.5.1, dedent@^1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -2229,6 +2804,13 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -2238,6 +2820,11 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" @@ -2252,11 +2839,16 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -dequal@^2.0.2: +dequal@^2.0.2, dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -2278,6 +2870,25 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + +easy-table@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/easy-table/-/easy-table-1.2.0.tgz#ba9225d7138fee307bfd4f0b5bc3c04bdc7c54eb" + integrity sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww== + dependencies: + ansi-regex "^5.0.1" + optionalDependencies: + wcwidth "^1.0.1" + electron-to-chromium@^1.4.668: version "1.4.774" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.774.tgz#1017d1758aaeeefe5423aa9d67b4b1e5d1d0a856" @@ -2296,6 +2907,16 @@ enhanced-resolve@^5.12.0: graceful-fs "^4.2.4" tapable "^2.2.0" +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -2419,6 +3040,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== + esbuild@^0.20.1: version "0.20.2" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" @@ -2549,6 +3175,14 @@ eslint-plugin-import@^2.29.1: semver "^6.3.1" tsconfig-paths "^3.15.0" +eslint-plugin-jest-dom@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest-dom/-/eslint-plugin-jest-dom-5.4.0.tgz#03a5ea600f8af63f4fcd5de49ae83dc0e6aca325" + integrity sha512-yBqvFsnpS5Sybjoq61cJiUsenRkC9K32hYQBFS9doBR7nbQZZ5FyO+X7MlmfM1C48Ejx/qTuOCgukDUNyzKZ7A== + dependencies: + "@babel/runtime" "^7.16.3" + requireindex "^1.2.0" + eslint-plugin-prettier@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" @@ -2591,6 +3225,28 @@ eslint-plugin-react@^7.34.1: semver "^6.3.1" string.prototype.matchall "^4.0.10" +eslint-plugin-testing-library@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.3.0.tgz#9c31a9941a860efdff3c06180151ab9c8142f685" + integrity sha512-GYcEErTt6EGwE0bPDY+4aehfEBpB2gDBFKohir8jlATSUvzStEyzCx8QWB/14xeKc/AwyXkzScSzMHnFojkWrA== + dependencies: + "@typescript-eslint/utils" "^5.58.0" + +eslint-plugin-vitest@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-vitest/-/eslint-plugin-vitest-0.5.4.tgz#2838a40ee116ba7c15eb6132df31371d960e3bf5" + integrity sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ== + dependencies: + "@typescript-eslint/utils" "^7.7.1" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" @@ -2671,16 +3327,33 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +eta@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" + integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== + eval@0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" @@ -2689,6 +3362,21 @@ eval@0.1.8: "@types/node" "*" require-like ">= 0.1.1" +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2720,6 +3408,11 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -2753,6 +3446,13 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" @@ -2766,6 +3466,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + firebase@^10.12.4: version "10.12.4" resolved "https://registry.yarnpkg.com/firebase/-/firebase-10.12.4.tgz#ca2451d1cf999a3e94e2287c56abdd94e043ddb0" @@ -2834,6 +3541,16 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2874,6 +3591,11 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-func-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -2885,6 +3607,11 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@ has-symbols "^1.0.3" hasown "^2.0.0" +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-symbol-description@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" @@ -2966,7 +3693,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.2.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -2976,6 +3703,11 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +graphql@^16.8.1: + version "16.9.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f" + integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw== + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -3022,6 +3754,11 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +headers-polyfill@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-4.0.3.tgz#922a0155de30ecc1f785bcf04be77844ca95ad07" + integrity sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ== + hoist-non-react-statics@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -3029,16 +3766,56 @@ hoist-non-react-statics@^3.3.1: dependencies: react-is "^16.7.0" +html-encoding-sniffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448" + integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ== + dependencies: + whatwg-encoding "^3.1.1" + http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== +http-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http2-client@^1.2.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/http2-client/-/http2-client-1.3.5.tgz#20c9dc909e3cc98284dd20af2432c524086df181" + integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== + +https-proxy-agent@^7.0.4, https-proxy-agent@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + dependencies: + agent-base "^7.0.2" + debug "4" + +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + hyphenate-style-name@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz#1797bf50369588b47b72ca6d5e65374607cf4436" integrity sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw== +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + idb-keyval@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" @@ -3059,7 +3836,7 @@ ignore@^5.2.0, ignore@^5.3.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -import-fresh@^3.2.1: +import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -3072,6 +3849,16 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +index-to-position@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-0.1.2.tgz#e11bfe995ca4d8eddb1ec43274488f3c201a7f09" + integrity sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -3094,7 +3881,14 @@ internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" -is-array-buffer@^3.0.4: +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== @@ -3155,6 +3949,11 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -3196,6 +3995,11 @@ is-negative-zero@^2.0.3: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== +is-node-process@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.2.0.tgz#ea02a1b90ddb3934a19aea414e88edef7e11d134" + integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -3213,6 +4017,11 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -3233,6 +4042,11 @@ is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: dependencies: call-bind "^1.0.7" +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -3274,6 +4088,13 @@ is-weakset@^2.0.3: call-bind "^1.0.7" get-intrinsic "^1.2.4" +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -3300,6 +4121,11 @@ javascript-stringify@^2.0.1: resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3312,6 +4138,33 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsdom@^25.0.0: + version "25.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-25.0.0.tgz#d1612b4ddab85af56821b2f731e15faae135f4e1" + integrity sha512-OhoFVT59T7aEq75TVw9xxEfkXgacpqAhQaYgP9y/fDqWQCMB/b1H66RfmPm/MaeaAIU9nDwMOVTlPN51+ao6CQ== + dependencies: + cssstyle "^4.0.1" + data-urls "^5.0.0" + decimal.js "^10.4.3" + form-data "^4.0.0" + html-encoding-sniffer "^4.0.0" + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.5" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.12" + parse5 "^7.1.2" + rrweb-cssom "^0.7.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.4" + w3c-xmlserializer "^5.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^3.1.1" + whatwg-mimetype "^4.0.0" + whatwg-url "^14.0.0" + ws "^8.18.0" + xml-name-validator "^5.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -3332,11 +4185,26 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stable-stringify@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" + integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== + dependencies: + call-bind "^1.0.5" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -3349,6 +4217,20 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.3.5" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" @@ -3366,6 +4248,13 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -3396,6 +4285,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -3411,7 +4305,7 @@ long@^5.0.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== -loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -3430,6 +4324,13 @@ lottie-web@^5.10.2: resolved "https://registry.yarnpkg.com/lottie-web/-/lottie-web-5.12.2.tgz#579ca9fe6d3fd9e352571edd3c0be162492f68e5" integrity sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg== +loupe@^3.1.0, loupe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.1.tgz#71d038d59007d890e3247c5db97c1ec5a92edc54" + integrity sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw== + dependencies: + get-func-name "^2.0.1" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -3437,6 +4338,18 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +magic-string@^0.30.10: + version "0.30.11" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" + integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + matchmediaquery@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/matchmediaquery/-/matchmediaquery-0.4.2.tgz#22582bd4ae63ad9f54c53001bba80cbed0f7eafa" @@ -3451,11 +4364,24 @@ media-query-parser@^2.0.2: dependencies: "@babel/runtime" "^7.12.5" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +micromatch@^4.0.2: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -3476,6 +4402,16 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimatch@9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -3490,6 +4426,13 @@ minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^9.0.4: version "9.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" @@ -3532,6 +4475,34 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msw@^2.4.9: + version "2.4.9" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.4.9.tgz#350a84cedb90b578a32c7764431e3750900f8407" + integrity sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg== + dependencies: + "@bundled-es-modules/cookie" "^2.0.0" + "@bundled-es-modules/statuses" "^1.0.1" + "@bundled-es-modules/tough-cookie" "^0.1.6" + "@inquirer/confirm" "^3.0.0" + "@mswjs/interceptors" "^0.35.8" + "@open-draft/until" "^2.1.0" + "@types/cookie" "^0.6.0" + "@types/statuses" "^2.0.4" + chalk "^4.1.2" + graphql "^16.8.1" + headers-polyfill "^4.0.2" + is-node-process "^1.2.0" + outvariant "^1.4.2" + path-to-regexp "^6.3.0" + strict-event-emitter "^0.5.1" + type-fest "^4.9.0" + yargs "^17.7.2" + +mute-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" @@ -3547,11 +4518,90 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +node-fetch-h2@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz#c6188325f9bd3d834020bf0f2d6dc17ced2241ac" + integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== + dependencies: + http2-client "^1.2.5" + +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-readfiles@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-readfiles/-/node-readfiles-0.2.0.tgz#dbbd4af12134e2e635c245ef93ffcf6f60673a5d" + integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== + dependencies: + es6-promise "^3.2.1" + node-releases@^2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +nwsapi@^2.2.12: + version "2.2.12" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" + integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== + +oas-kit-common@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/oas-kit-common/-/oas-kit-common-1.0.8.tgz#6d8cacf6e9097967a4c7ea8bcbcbd77018e1f535" + integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== + dependencies: + fast-safe-stringify "^2.0.7" + +oas-linter@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/oas-linter/-/oas-linter-3.2.2.tgz#ab6a33736313490659035ca6802dc4b35d48aa1e" + integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== + dependencies: + "@exodus/schemasafe" "^1.0.0-rc.2" + should "^13.2.1" + yaml "^1.10.0" + +oas-resolver@^2.5.6: + version "2.5.6" + resolved "https://registry.yarnpkg.com/oas-resolver/-/oas-resolver-2.5.6.tgz#10430569cb7daca56115c915e611ebc5515c561b" + integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== + dependencies: + node-fetch-h2 "^2.3.0" + oas-kit-common "^1.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +oas-schema-walker@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz#74c3cd47b70ff8e0b19adada14455b5d3ac38a22" + integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== + +oas-validator@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/oas-validator/-/oas-validator-5.0.8.tgz#387e90df7cafa2d3ffc83b5fb976052b87e73c28" + integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== + dependencies: + call-me-maybe "^1.0.1" + oas-kit-common "^1.0.8" + oas-linter "^3.2.2" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + reftools "^1.1.9" + should "^13.2.1" + yaml "^1.10.0" + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3630,6 +4680,54 @@ once@^1.3.0: dependencies: wrappy "1" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +openapi-fetch@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/openapi-fetch/-/openapi-fetch-0.13.0.tgz#42dcdac4a8e14d2aeba321b46f6fbf4dac997a94" + integrity sha512-6Nlf/BDbtyHwHdNrLPUiyt4CZMzL3ZyAt55yWH8W7+Z+8aYWnvca4uZHQHXViy8KcnCMqAhLM/bifh2Yjjkf6w== + dependencies: + openapi-typescript-helpers "^0.0.15" + +openapi-typescript-helpers@^0.0.15: + version "0.0.15" + resolved "https://registry.yarnpkg.com/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.15.tgz#96ffa762a5e01ef66a661b163d5f1109ed1967ed" + integrity sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw== + +openapi-typescript@^7.4.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/openapi-typescript/-/openapi-typescript-7.4.3.tgz#269c367929e8580dae2f7ef2d68bb39ffa30fa47" + integrity sha512-xTIjMIIOv9kNhsr8JxaC00ucbIY/6ZwuJPJBZMSh5FA2dicZN5uM805DWVJojXdom8YI4AQTavPDPHMx/3g0vQ== + dependencies: + "@redocly/openapi-core" "^1.25.9" + ansi-colors "^4.1.3" + change-case "^5.4.4" + parse-json "^8.1.0" + supports-color "^9.4.0" + yargs-parser "^21.1.1" + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -3642,6 +4740,16 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +outvariant@^1.4.0, outvariant@^1.4.2, outvariant@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" + integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -3663,7 +4771,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -3673,6 +4781,43 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-json@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-8.1.0.tgz#91cdc7728004e955af9cb734de5684733b24a717" + integrity sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA== + dependencies: + "@babel/code-frame" "^7.22.13" + index-to-position "^0.1.2" + type-fest "^4.7.1" + +parse5@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +patch-package@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" + integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^2.2.2" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -3688,11 +4833,21 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4" + integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -3703,6 +4858,11 @@ pathe@^1.1.1, pathe@^1.1.2: resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + picocolors@^1.0.0, picocolors@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" @@ -3722,6 +4882,11 @@ pkg-types@^1.1.0: mlly "^1.7.0" pathe "^1.1.2" +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -3736,6 +4901,11 @@ postcss@^8.4.38: picocolors "^1.0.0" source-map-js "^1.2.0" +postinstall-postinstall@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -3753,6 +4923,20 @@ prettier@^3.2.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +prettier@~3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + prop-types@^15.6.1, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -3785,11 +4969,21 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -punycode@^2.1.0: +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -3808,6 +5002,20 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.2" +react-fast-compare@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== + +react-helmet-async@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.5.tgz#cfc70cd7bb32df7883a8ed55502a1513747223ec" + integrity sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg== + dependencies: + invariant "^2.2.4" + react-fast-compare "^3.2.2" + shallowequal "^1.1.0" + react-hook-form@^7.51.5: version "7.51.5" resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.51.5.tgz#4afbfb819312db9fea23e8237a3a0d097e128b43" @@ -3818,6 +5026,11 @@ react-is@^16.13.1, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-refresh@^0.14.0: version "0.14.2" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" @@ -3860,6 +5073,14 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + reflect.getprototypeof@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" @@ -3873,11 +5094,21 @@ reflect.getprototypeof@^1.0.4: globalthis "^1.0.3" which-builtin-type "^1.1.3" +reftools@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" + integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== + regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== +regexp-tree@^0.1.24: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== + regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -3893,11 +5124,26 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + "require-like@>= 0.1.1": version "0.1.2" resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== +requireindex@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" + integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -3931,6 +5177,13 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -3938,6 +5191,16 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +rollup-plugin-visualizer@^5.12.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz#661542191ce78ee4f378995297260d0c1efb1302" + integrity sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ== + dependencies: + open "^8.4.0" + picomatch "^2.3.1" + source-map "^0.7.4" + yargs "^17.5.1" + rollup@^4.13.0: version "4.17.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.17.2.tgz#26d1785d0144122277fdb20ab3a24729ae68301f" @@ -3963,6 +5226,16 @@ rollup@^4.13.0: "@rollup/rollup-win32-x64-msvc" "4.17.2" fsevents "~2.3.2" +rrweb-cssom@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" + integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== + +rrweb-cssom@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b" + integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -3994,11 +5267,23 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + safevalues@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/safevalues/-/safevalues-0.6.0.tgz#425eadbdb699c13d8cfd932485983f858222362a" integrity sha512-MZ7DcTOcIoPXN36/UONVE9BT0pmwlCr9WcS7Pj/q4FxOwr33FkWC0CUWj/THQXYWxf/F7urbhaHaOeFPSqGqHA== +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.23.2: version "0.23.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" @@ -4011,6 +5296,11 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.7, semver@^7.5.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + semver@^7.5.4, semver@^7.6.0: version "7.6.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" @@ -4043,6 +5333,11 @@ shallow-equal@^3.1.0: resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-3.1.0.tgz#e7a54bac629c7f248eff6c2f5b63122ba4320bec" integrity sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg== +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4055,6 +5350,50 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== + +should-util@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.1.tgz#fb0d71338f532a3a149213639e2d32cbea8bcb28" + integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== + +should@^13.2.1: + version "13.2.3" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.3.tgz#96d8e5acf3e97b49d89b51feaa5ae8d07ef58f10" + integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" @@ -4065,6 +5404,21 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -4080,6 +5434,31 @@ source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +source-map@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +statuses@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +std-env@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + +strict-event-emitter@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" + integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -4147,6 +5526,18 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -4171,11 +5562,61 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" + integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swagger-schema-official@2.0.0-bab6bed: + version "2.0.0-bab6bed" + resolved "https://registry.yarnpkg.com/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz#70070468d6d2977ca5237b2e519ca7d06a2ea3fd" + integrity sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA== + +swagger-typescript-api@^13.0.23: + version "13.0.23" + resolved "https://registry.yarnpkg.com/swagger-typescript-api/-/swagger-typescript-api-13.0.23.tgz#411d421a64877c5f168260329fefda6d7bf4629f" + integrity sha512-HhoIepxlFEU7Ol42Gh8/tvwhSxdkHcweX2tRkNhbZYBiEA+rK3C6N85MnwoeQR5XbidE3Kz8mLOqIerVGgR9uw== + dependencies: + "@types/swagger-schema-official" "^2.0.25" + consola "^3.2.3" + cosmiconfig "^9.0.0" + didyoumean "^1.2.2" + eta "^2.2.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + nanoid "^3.3.7" + prettier "~3.3.3" + swagger-schema-official "2.0.0-bab6bed" + swagger2openapi "^7.0.8" + typescript "~5.5.4" + +swagger2openapi@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/swagger2openapi/-/swagger2openapi-7.0.8.tgz#12c88d5de776cb1cbba758994930f40ad0afac59" + integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== + dependencies: + call-me-maybe "^1.0.1" + node-fetch "^2.6.1" + node-fetch-h2 "^2.3.0" + node-readfiles "^0.2.0" + oas-kit-common "^1.0.8" + oas-resolver "^2.5.6" + oas-schema-walker "^1.1.5" + oas-validator "^5.0.8" + reftools "^1.1.9" + yaml "^1.10.0" + yargs "^17.0.1" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + synckit@^0.8.6: version "0.8.8" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" @@ -4194,6 +5635,33 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +tinybench@^2.8.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinypool@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.1.tgz#c64233c4fac4304e109a64340178760116dbe1fe" + integrity sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA== + +tinyrainbow@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== + +tinyspy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" + integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -4206,6 +5674,28 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tough-cookie@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.0.0.tgz#3b46d583613ec7283020d79019f1335723801cec" + integrity sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g== + dependencies: + punycode "^2.3.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + ts-api-utils@^1.0.1, ts-api-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" @@ -4221,6 +5711,11 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tslib@^2.1.0, tslib@^2.4.1: version "2.6.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" @@ -4231,6 +5726,13 @@ tslib@^2.6.2: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -4243,6 +5745,16 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^4.7.1, type-fest@^4.9.0: + version "4.26.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.26.1.tgz#a4a17fa314f976dd3e6d6675ef6c775c16d7955e" + integrity sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg== + typed-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" @@ -4292,6 +5804,16 @@ typescript@^5.2.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +typescript@~5.5.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== + +ua-regexes-lite@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ua-regexes-lite/-/ua-regexes-lite-1.2.1.tgz#4ffa818855fb343cb68675f882a6b257f232deab" + integrity sha512-ling4WX4ZtxXjmSMHzuI8PGos2brw/6gG3YuVWn5RunHoQjeCokpFeMe/ti+R8E7kOTLE2FqBG4bMdFQLFwcJQ== + ufo@^1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.3.tgz#3325bd3c977b6c6cd3160bf4ff52989adc9d3344" @@ -4312,6 +5834,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + undici@5.28.4: version "5.28.4" resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" @@ -4319,6 +5846,16 @@ undici@5.28.4: dependencies: "@fastify/busboy" "^2.0.0" +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + update-browserslist-db@^1.0.13: version "1.0.16" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" @@ -4327,6 +5864,11 @@ update-browserslist-db@^1.0.13: escalade "^3.1.2" picocolors "^1.0.1" +uri-js-replace@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uri-js-replace/-/uri-js-replace-1.0.1.tgz#c285bb352b701c9dfdaeffc4da5be77f936c9048" + integrity sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -4334,6 +5876,14 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + use-deep-compare-effect@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/use-deep-compare-effect/-/use-deep-compare-effect-1.8.1.tgz#ef0ce3b3271edb801da1ec23bf0754ef4189d0c6" @@ -4347,6 +5897,17 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +vite-node@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.0.5.tgz#36d909188fc6e3aba3da5fc095b3637d0d18e27b" + integrity sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q== + dependencies: + cac "^6.7.14" + debug "^4.3.5" + pathe "^1.1.2" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node@^1.2.0: version "1.6.0" resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.0.tgz#2c7e61129bfecc759478fa592754fd9704aaba7f" @@ -4369,6 +5930,55 @@ vite@^5.0.0, vite@^5.0.11, vite@^5.2.0: optionalDependencies: fsevents "~2.3.3" +vitest@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.0.5.tgz#2f15a532704a7181528e399cc5b754c7f335fd62" + integrity sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA== + dependencies: + "@ampproject/remapping" "^2.3.0" + "@vitest/expect" "2.0.5" + "@vitest/pretty-format" "^2.0.5" + "@vitest/runner" "2.0.5" + "@vitest/snapshot" "2.0.5" + "@vitest/spy" "2.0.5" + "@vitest/utils" "2.0.5" + chai "^5.1.1" + debug "^4.3.5" + execa "^8.0.1" + magic-string "^0.30.10" + pathe "^1.1.2" + std-env "^3.7.0" + tinybench "^2.8.0" + tinypool "^1.0.0" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node "2.0.5" + why-is-node-running "^2.3.0" + +w3c-xmlserializer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c" + integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== + dependencies: + xml-name-validator "^5.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" @@ -4383,6 +5993,34 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== +whatwg-encoding@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" + integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" + integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== + +whatwg-url@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.0.0.tgz#00baaa7fd198744910c4b1ef68378f2200e4ceb6" + integrity sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw== + dependencies: + tr46 "^5.0.0" + webidl-conversions "^7.0.0" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -4440,11 +6078,28 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -4459,6 +6114,21 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@^8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +xml-name-validator@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" + integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -4469,17 +6139,27 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yaml-ast-parser@0.0.43: + version "0.0.43" + resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" + integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== + yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.2.2: + version "2.5.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" + integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.7.2: +yargs@^17.0.1, yargs@^17.5.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -4496,3 +6176,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yoctocolors-cjs@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" + integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==