diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml deleted file mode 100644 index 451be5aac4..0000000000 --- a/.github/workflows/documentation.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Update Documentation - -on: - push: - branches: [main] - paths: ['docs/**'] - -permissions: - id-token: write - contents: read - -jobs: - deploy: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: ./.github/actions/setup-pnpm - - - name: Build documentation - run: pnpm docs:build - - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: ${{ secrets.AWS_ROLE_FOR_DOCUMENTATION }} - aws-region: ap-northeast-2 - - - name: Deploy documentation to AWS S3 - run: | - aws s3 sync ./docs/.vitepress/dist s3://docs.codedang.com --region ap-northeast-2 diff --git a/.gitignore b/.gitignore index e46396700c..37a0f06e12 100644 --- a/.gitignore +++ b/.gitignore @@ -72,9 +72,6 @@ dist/ # pnpm store .pnpm-store -# Vitepress -docs/.vitepress/cache/ - # NestJS & GraphQL @generated/ backend/schema.gql diff --git a/README.md b/README.md index fbd464f14d..7fb22a7c5b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Codedang은 스꾸딩(skkuding) 팀에서 만들고 관리하는 성균관대학 문서 웹페이지를 참고해주세요. https://docs.codedang.com -문서 미리보기는 `pnpm docs:dev` 명령어로 가능합니다. +> 문서 저장소: [skkuding/docs](https://github.com/skkuding/docs) ## Contributing Guide 👏 diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts deleted file mode 100644 index d086d944c0..0000000000 --- a/docs/.vitepress/config.mts +++ /dev/null @@ -1,128 +0,0 @@ -import { defineConfig } from 'vitepress' - -export default defineConfig({ - title: 'Codedang 코드당', - description: 'Codedang Document for Developers', - titleTemplate: false, - lastUpdated: true, - - head: [ - ['link', { rel: 'icon', href: '/logo.png' }], - ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }], - [ - 'link', - { - rel: 'preconnect', - href: 'https://fonts.gstatic.com', - crossorigin: '' - } - ], - [ - 'link', - { - rel: 'stylesheet', - href: 'https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;700&display=swap' - } - ] - ], - - themeConfig: { - logo: '/logo.png', - nav: [ - { - text: '📌 Guide', - link: '/intro/' - }, - { - text: '💡 Demo', - link: 'https://codedang.com' - } - ], - socialLinks: [{ icon: 'github', link: 'https://github.com/skkuding/next' }], - sidebar: [ - { - text: 'Introduction', - items: [ - { - text: 'What is Coding Platform?', - link: '/intro/' - }, - { - text: 'Getting Started', - link: '/intro/getting-started' - }, - { - text: 'Contributing Guide', - link: 'https://github.com/skkuding/next/blob/main/CONTRIBUTING.md' - }, - { - text: 'API Documentation', - link: '/intro/bruno' - } - ] - }, - { - text: 'Project', - items: [ - { - text: 'Tech Stack', - link: '/project/tech-stack' - }, - { - text: 'Hierarchy', - link: '/project/hierarchy' - }, - { - text: 'How Deployments Work', - link: '/project/deploy' - }, - { - text: 'Stage Server', - link: '/project/stage-server' - }, - { - text: 'Project Roadmap', - link: '/project/roadmap' - } - ] - }, - { - text: '학생 매뉴얼', - items: [ - { - text: 'Main', - link: '/user/main' - }, - { - text: 'Notice', - link: '/user/notice' - }, - { text: 'Contest', link: '/user/contest' }, - { text: 'Group', link: '/user/group' } - ] - }, - { - text: '관리자 매뉴얼', - items: [ - { - text: '가입 및 로그인', - link: '/group-admin/login' - }, - { text: '그룹 및 멤버 관리', link: '/group-admin/group' }, - { text: '문제 생성 및 관리', link: '/group-admin/problem' }, - { - text: 'Notice', - link: '/group-admin/notice' - }, - { text: 'Contest', link: '/group-admin/contest' }, - { text: 'Workbook', link: '/group-admin/workbook' } - ] - } - ] - }, - vite: { - server: { - host: true - } - } -}) diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts deleted file mode 100644 index 9c182f0176..0000000000 --- a/docs/.vitepress/theme/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import DefaultTheme from 'vitepress/theme' -import './vars.css' - -export default { - // root component to wrap each page - ...DefaultTheme, - - enhanceApp({ app, router, siteData }) { - // app is the Vue 3 app instance from `createApp()`. - // router is VitePress' custom router. `siteData` is - // a `ref` of current site-level metadata. - } -} diff --git a/docs/.vitepress/theme/vars.css b/docs/.vitepress/theme/vars.css deleted file mode 100644 index 2ba954d10e..0000000000 --- a/docs/.vitepress/theme/vars.css +++ /dev/null @@ -1,25 +0,0 @@ -:root { - --c-blue: #3581fa; - --c-blue-dark: #2e6de9; - --c-blue-light: #4d9dfc; - - --vp-font-family-base: 'Inter var experimental', 'Inter var', 'Noto Sans KR', - -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, - Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; - - --vp-home-hero-name-color: transparent; - --vp-home-hero-name-background: var(--c-blue); - --vp-c-brand: var(--c-blue); - --vp-c-brand-text: #fff; - - /* Button */ - --vp-button-brand-border: var(--c-blue-dark); - --vp-button-brand-text: var(--vp-c-brand-text); - --vp-button-brand-bg: var(--c-blue); - --vp-button-brand-hover-border: var(--c-blue-light); - --vp-button-brand-hover-text: var(--vp-c-brand-text); - --vp-button-brand-hover-bg: var(--c-blue-light); - --vp-button-brand-active-border: var(--c-blue-dark); - --vp-button-brand-active-text: var(--vp-c-brand-text); - --vp-button-brand-active-bg: var(--vp-button-brand-bg); -} diff --git a/docs/group-admin/contest.md b/docs/group-admin/contest.md deleted file mode 100644 index 5b9d7e0223..0000000000 --- a/docs/group-admin/contest.md +++ /dev/null @@ -1,5 +0,0 @@ -# Group Admin - Contest - -::: warning Work in Progress 🚧 -아직 작성 중인 페이지입니다. 조금만 기다려주세요! 🙏 -::: diff --git a/docs/group-admin/group.md b/docs/group-admin/group.md deleted file mode 100644 index 04a1c66ef3..0000000000 --- a/docs/group-admin/group.md +++ /dev/null @@ -1,89 +0,0 @@ -# 그룹 및 멤버 관리 - -본 Section에서는 그룹 및 멤버 관리 기능에 대해서 소개합니다. - -::: warning Group 내의 계층 관련 ⛔️ -Group 내에서는 두 가지의 계층이 존재합니다. -- __GroupLeader__ : 그룹의 관리자 역할으로, Group 및 Member 관리에 관한 권한들을 갖고 있습니다. -- __GroupMember__ : 그룹 내의 일반적인 Member 역할입니다. - -본 Section의 독자는 GroupLeader로 가정합니다. -::: -## 그룹 관리 - -### 새로운 그룹 생성 - -Manager 이상 계층의 관리자는 직접 그룹을 생성할 수 있습니다. - -Group 페이지에서 +Create Group 버튼을 클릭하면 그룹 생성창으로 넘어갑니다. -![My Groups](pic/myGroup.png) - -원하는 Group Name, Group Configuration, Group Description을 작성하고 Save를 클릭하면 그룹이 생성됩니다. 이때, 그룹을 생성한 관리자는 자동으로 해당 그룹의 GroupLeader로 설정됩니다. -![Create Group](pic/group-create-detail.png) -Group Configuration의 자세한 설명은 아래와 같습니다. - - __Show On List__ : - 자신의 그룹의 전체 공개(All Groups에 표시) 여부를 결정합니다. - - __Allow Join From Search__ : 그룹 목록에서 해당 그룹을 선택한 사용자들에게 그룹 가입 버튼의 공개 여부를 결정합니다. - - __Allow Join With URL__ : 그룹 가입용 URL 발급 가능 여부를 결정합니다. (⚠️ Allow Join From Search와 Allow Join With URL이 모두 False라면 경고창을 반환합니다.) - - __Require Approval Before Join__ : 가입 승인 절차의 유무를 결정합니다. False라면 승인 절차없이 즉시 가입이 완료됩니다. - -### 기존 그룹 관리 -관리자들은 상단 Header 중 Group을 눌러 자신이 속한 그룹들을 확인할 수 있습니다. - -이때, 자신이 GroupLeader로 속한 그룹은 그룹명 우측 상단에 톱니바퀴(⚙️) 모양의 아이콘이 뜨게 됩니다. -![My Groups](pic/myGroup.png) - -톱니바퀴 아이콘(⚙️)을 클릭시 관리자용 그룹 창으로 이동하게 됩니다. - -관리자는 그룹 창에서 (1) 그룹 세부설정 수정 (2) 초대 URL 생성 (3) 그룹 삭제를 할 수 있습니다. -![Group Config](pic/group-detail.png) - -- __그룹 세부설정 수정__ - - 관리자는 그룹명 옆의 연필 아이콘(📝)을 클릭해 그룹 세부 설정을 수정할 수 있습니다. - ![Group Config](pic/group-config-detail.png) - Group Name, Group Configuration, Description을 수정할 수 있습니다. - -- __초대 URL 생성__ - - Create URL 버튼을 클릭하여 학생들이 클릭시 해당 그룹에 가입할 수 있는 일회용 초대 URL을 생성할 수 있습니다. - -- __그룹 삭제__ - - Admin, SuperAdmin 계층의 관리자는 바로 그룹을 삭제할 수 있으며, 이외의 관리자는 자신이 생성한 그룹에 한해서 삭제할 수 있습니다. - -## 멤버 관리 - -![Group Config](pic/group-detail.png) -관리자는 관리자용 그룹창에서 Member 탭을 통해 관리자용 멤버창으로 접속할 수 있습니다. - -![Group Member](pic/group-member.png) - -관리자용 멤버창에서 사용할 수 있는 기능들은 아래와 같습니다. - -### 그룹 내의 계층 변경 - -관리자는 멤버들의 그룹 내 계층을 변경할 수 있습니다. - -계층 변경은 두 가지의 경우가 존재합니다. - -- __GroupLeader에서 GroupMember로 downgrade__ - - Member 탭의 GroupLeaders 목록에서 ⬇ 버튼을 클릭하면 해당 멤버의 계층을 GroupMember로 downgrade할 수 있습니다. - - > 이때, 모든 GroupLeader를 GroupMember로 downgrade할 수 없습니다.(최소 한 명의 GroupLeader가 존재해야 합니다.) - > 또한 Admin 및 SuperAdmin 계층의 사용자는 downgrade할 수 없습니다. - -- __GroupMember에서 GroupLeader로 upgrade__ - - Member 탭의 GroupMembers 목록에서 ⬆ 버튼을 클릭하면 해당 멤버의 계층을 GroupLeader로 upgrade할 수 있습니다. - -### 그룹 멤버 강제 탈퇴 - -관리자는 GroupLeaders 및 GroupMembers 목록에서 🗑️ 버튼을 눌러 멤버를 강제 탈퇴시킬 수 있습니다. - -### 그룹 가입 승인 및 거절 - -![Group Approval](pic/group-approval.png) -관리자는 Group Member Approval 목록에서 대기중인 그룹 가입신청 내역들을 확인할 수 있으며, 승인(✅) 혹은 거절(❎)을 선택할 수 있습니다. - diff --git a/docs/group-admin/login.md b/docs/group-admin/login.md deleted file mode 100644 index 1dd00fc046..0000000000 --- a/docs/group-admin/login.md +++ /dev/null @@ -1,29 +0,0 @@ -# 가입 및 로그인 - -본 Section에서는 현재 코드당의 계층을 소개하고, 가입 및 로그인 관련 기능들을 소개합니다. - -## 계층 소개 - -코드당의 사용자들은 총 네 가지의 계층 중 하나로 속해 있습니다. - -계층의 세부적인 정보는 아래와 같습니다. - -- __SuperAdmin__ : 하위 계층에 부여되는 모든 권한 및 시스템 관리(서버 로그 확인 등)와 관련된 권한을 가집니다. - -- __Admin__ : Admin Dashboard 접근을 통해 모든 Group들의 목록을 접근할 수 있으며, Open Space를 관리할 수 있습니다. 사용자 계층을 변경가능합니다. - -- __Manager__ : Group을 생성할 수 있습니다. - -- __User__ : 일반적인 사용자 계층입니다. - -표로 나타내면 아래와 같습니다. - -| 계층 | SuperAdmin | Admin | Manager | User | -|-|-|-|-|-| -| 그룹 생성 |✔️|✔️|✔️|❌| -| Admin Dashboard 접근 |✔️|✔️|❌|❌| -| OpenSpace 관리 |✔️|✔️|❌|❌| -| 사용자 계층 변경 |✔️|✔️|❌|❌| -| 시스템 관리 |✔️|❌|❌|❌| - -본 __관리자 매뉴얼__ 은 Manager 이상 계층의 사용자를 기준으로 작성되었습니다. diff --git a/docs/group-admin/notice.md b/docs/group-admin/notice.md deleted file mode 100644 index f1242863e4..0000000000 --- a/docs/group-admin/notice.md +++ /dev/null @@ -1,4 +0,0 @@ -# Group Admin - Notice -::: warning Work in Progress 🚧 -아직 작성 중인 페이지입니다. 조금만 기다려주세요! 🙏 -::: diff --git a/docs/group-admin/pic/group-approval.png b/docs/group-admin/pic/group-approval.png deleted file mode 100644 index 28dd379f63..0000000000 Binary files a/docs/group-admin/pic/group-approval.png and /dev/null differ diff --git a/docs/group-admin/pic/group-config-detail.png b/docs/group-admin/pic/group-config-detail.png deleted file mode 100644 index 0faabf2496..0000000000 Binary files a/docs/group-admin/pic/group-config-detail.png and /dev/null differ diff --git a/docs/group-admin/pic/group-create-detail.png b/docs/group-admin/pic/group-create-detail.png deleted file mode 100644 index 849977afdb..0000000000 Binary files a/docs/group-admin/pic/group-create-detail.png and /dev/null differ diff --git a/docs/group-admin/pic/group-detail.png b/docs/group-admin/pic/group-detail.png deleted file mode 100644 index 04cbce183e..0000000000 Binary files a/docs/group-admin/pic/group-detail.png and /dev/null differ diff --git a/docs/group-admin/pic/group-member.png b/docs/group-admin/pic/group-member.png deleted file mode 100644 index f19ddbd83f..0000000000 Binary files a/docs/group-admin/pic/group-member.png and /dev/null differ diff --git a/docs/group-admin/pic/management.png b/docs/group-admin/pic/management.png deleted file mode 100644 index 7b98e0f9f6..0000000000 Binary files a/docs/group-admin/pic/management.png and /dev/null differ diff --git a/docs/group-admin/pic/myGroup.png b/docs/group-admin/pic/myGroup.png deleted file mode 100644 index b943ec7a7a..0000000000 Binary files a/docs/group-admin/pic/myGroup.png and /dev/null differ diff --git a/docs/group-admin/pic/problem-create-detail.png b/docs/group-admin/pic/problem-create-detail.png deleted file mode 100644 index bbc43f8526..0000000000 Binary files a/docs/group-admin/pic/problem-create-detail.png and /dev/null differ diff --git a/docs/group-admin/pic/problem-create.png b/docs/group-admin/pic/problem-create.png deleted file mode 100644 index 31ad97f864..0000000000 Binary files a/docs/group-admin/pic/problem-create.png and /dev/null differ diff --git a/docs/group-admin/problem.md b/docs/group-admin/problem.md deleted file mode 100644 index 317ba8cb13..0000000000 --- a/docs/group-admin/problem.md +++ /dev/null @@ -1,51 +0,0 @@ -# 문제 생성 및 관리하기 -본 Section에서는 문제를 생성하고 관리하는 기능들을 소개합니다. - -## 문제 생성 및 삭제하기 -관리자들은 상단 Header 중 Group을 눌러 자신이 속한 그룹들을 확인할 수 있습니다. - -이때, 자신이 GroupLeader로 속한 그룹은 그룹명 우측 상단에 톱니바퀴(⚙️) 모양의 아이콘이 뜨게 됩니다. -![My Groups](pic/myGroup.png) - -톱니바퀴 아이콘(⚙️)을 클릭시 관리자용 그룹 창으로 이동하게 됩니다. - -![Group Config](pic/group-detail.png) - -관리자는 옆 Problem 탭을 통해 관리자용 Problem 창으로 이동할 수 있습니다. - -![Problem Create](pic/problem-create.png) - -### 문제 생성하기 - -그룹 내에서 문제를 생성할 수 있는 방법은 세 경우가 있습니다. - -- __문제를 직접 생성하는 경우__ (Create버튼) - - Create버튼을 누르면 직접 문제를 생성할 수 있습니다. - ![Problem Create](pic/problem-create-detail.png) - 문제의 세부 구성사항은 아래와 같습니다. - - __Title__ : 문제의 제목을 설정합니다. - - __Difficulty__ : 문제의 난이도를 설정합니다 Level 1~5까지 존재합니다. - - __Language__ : 문제의 지원언어를 설정합니다. 종류는 `C`, `C++`,`Java`, `Python3`로 이루어져 있습니다. - - __Description__ : 문제의 설명을 설정합니다. - - __Input Description__ : 입력과 관련한 설명을 설정합니다. - - __Output Description__ : 출력과 관련한 설명을 설정합니다. - - __Time Limit(ms)__ : 시간 제한을 설정합니다. 단위는 ms(밀리초)입니다. - - __Memory Limit(MB)__ : 메모리 제한을 설정합니다. 단위는 MB(메가바이트)입니다. - - __Hint__ : 표시될 힌트를 설정합니다. - - __Input Sample, Output Sample__ : 사용자에게 보여질 입력, 출력 예시를 설정합니다. - - __Testcase__ : 테스트케이스를 설정합니다. - -- __문제를 Import하는 경우__ (Import버튼) - - 추후 추가할 예정입니다. - -- __문제를 파일로 업로드 하는 경우__ (File Upload버튼) - - Excel 파일을 업로드하여 여러 개의 문제 및 테스트 케이스들을 업로드할 수 있습니다. - -### 문제 삭제하기 - -문제 옆 🗑️ 버튼을 클릭하면 문제를 삭제할 수 있습니다. - - diff --git a/docs/group-admin/workbook.md b/docs/group-admin/workbook.md deleted file mode 100644 index 6b48898b80..0000000000 --- a/docs/group-admin/workbook.md +++ /dev/null @@ -1,5 +0,0 @@ -# Group Admin - Workbook - -::: warning Work in Progress 🚧 -아직 작성 중인 페이지입니다. 조금만 기다려주세요! 🙏 -::: diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 4bb63e881f..0000000000 --- a/docs/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -layout: home - -hero: - name: Codedang - text: with SKKUDING 😎 - tagline: Online Judge for SKKU - image: - src: /logo.svg - alt: Codedang Logo - actions: - - theme: brand - text: Get Started - link: /intro/ - - theme: alt - text: View on GitHub - link: https://github.com/skkuding/next - -features: - - title: 👍 Easy to use - details: With imbedded code editor, you can code and submit easily. - - title: 🌈 Open Source - details: Codedang is open source project. You can contribute to this project freely! - - title: 🚦 Scalable - details: Codedang cares about stability and scalability. It can handle many users at the same time. ---- diff --git a/docs/intro/backend-preview.png b/docs/intro/backend-preview.png deleted file mode 100644 index ff72940c30..0000000000 Binary files a/docs/intro/backend-preview.png and /dev/null differ diff --git a/docs/intro/bruno-env.png b/docs/intro/bruno-env.png deleted file mode 100644 index 0a1313635d..0000000000 Binary files a/docs/intro/bruno-env.png and /dev/null differ diff --git a/docs/intro/bruno-select.png b/docs/intro/bruno-select.png deleted file mode 100644 index 79e4e9caf3..0000000000 Binary files a/docs/intro/bruno-select.png and /dev/null differ diff --git a/docs/intro/bruno-start.png b/docs/intro/bruno-start.png deleted file mode 100644 index 2ea6f52e99..0000000000 Binary files a/docs/intro/bruno-start.png and /dev/null differ diff --git a/docs/intro/bruno.md b/docs/intro/bruno.md deleted file mode 100644 index ca07c7cf54..0000000000 --- a/docs/intro/bruno.md +++ /dev/null @@ -1,128 +0,0 @@ -# API Documentation - -이 프로젝트에서는 API 문서화 도구로 Bruno를 사용하고 있습니다. Bruno는 Postman, Insomnia와 같이 API를 테스트하고 문서화하는 오픈 소스 도구입니다. - -자세한 내용은 공식 홈페이지에서 확인할 수 있습니다. -https://www.usebruno.com/ - -![Bruno](https://www.usebruno.com/images/landing-2.png) - -## How to use - -Bruno로 Codedang API collection을 보려면 아래 단계를 따르세요. - -### 1. Bruno 설치 - -Bruno 홈페이지에서 설치 파일을 다운로드 받아 설치하세요. -https://www.usebruno.com/downloads - -### 2. Collection 불러오기 - -Bruno를 실행하고 'Open Collection'을 클릭합니다. -Codedang 폴더에서 collection 폴더의 client 또는 admin을 선택합니다. - -![Open Collection](bruno-start.png) - -### 3. 환경 변수 설정 - -오른쪽 맨 위의 'No Environment'를 클릭하고, 환경을 변경합니다. - -- Development: 개발 서버 (https://dev.codedang.com) -- Local: 로컬 서버 (http://localhost) - -![Environment](bruno-env.png) - -### 4. 확인 - -왼쪽 탭에서 request를 선택하여 실행할 수 있습니다. `baseUrl`이 초록색으로 표시되는지 확인해주세요. - -![Select](bruno-select.png) - -## Convention 🤙 - -새로운 API request를 작성할 때 아래 사항을 지켜주세요. - -- 모든 예외 경우마다 request를 작성해주세요. (200, 403, 404 등) -- 설명문은 평어체로 작성해주세요. (~ 한다 등) - -### Structure - -APP 구분 / 모듈 이름 / 기능 / request 이름 -(예: Codedang Admin / Notice / Create Notice / Succeed) - -#### request 이름 - -각 request는 다음과 같이 이름 지어주세요. - -- 성공하는 경우 - - **"Succeed"** - - **"Succeed: \"**: 성공하는 경우 + 추가 설명 (예: "Succeed: Admin Login") -- 실패하는 경우 - - REST API - - **"40x: \"**: 400, 401, 403, 404 등의 오류가 발생하는 경우 + 추가 설명 (예: "40x: Invalid email") - - GraphQL - - **""**: GraphQL Error Code - - **"(1)"**: 동일한 Error Code가 발생하는 case가 여러 개인 경우 - -### Docs - -Endpoint마다 'Succeed' request의 'Docs' 탭에 아래 Format을 준수하여 설명을 남겨주세요. - -#### Format - -```markdown -## API 제목 -API가 수행하는 역할을 기재합니다. - -### Args / Query / Params / Body -필요한 경우, Args/Query/Params/Body에 대한 설명을 표로 정리합니다. -이름, 타입, 의미, 기본값, 제약사항을 포함해야 합니다. -(예) -| 이름 | 타입 | 설명 | -|--|--|--| -|take|Int|한번에 가져올 데이터의 수, 기본값은 10.| -|groupId|Int|포함하지 않으면 Open Space에 대한 요청이 된다. 기본값은 1.| -|problemId|Int|problemId와 contestId중 하나는 반드시 포함한다.| -|contestId|Int|problemId와 contestId중 하나는 반드시 포함한다.| - - -### Error Case -API를 호출했을 때 발생 가능한 Error Case의 이름과 설명을 기재합니다. -Error case의 이름은 실패하는 파일의 이름과 일치시켜주세요. -이름은 '#' 4개, 설명은 줄글로 작성합니다. -(예) -#### BAD_USER_INPUT(1) -password가 조건에 맞지 않는 경우. -``` - -### Scripts - -로그인 및 권한이 필요한 request의 경우, Pre Request에서 사전 인증 작업을 수행해주세요. GraphQL의 경우, Admin 계정으로 로그인하는 작업이 전역으로 적용되어 있습니다. - -~~Request를 보낼 때 상황별로 결과가 달라지지 않게 해주세요. 다시 말해 **언제나 동일한 결과**가 오게 해주세요.~~ - -### Assert - -모든 request마다 test를 충분히 작성해주세요(상태 코드 검사, body 검사 등). PR이 merge될 때마다 자동으로 E2E 검사가 이뤄집니다. - -다음 항목을 포함해야 합니다. -#### REST API -- 성공하는 경우 - - res.status - - res.body의 모든 property -- 실패하는 경우 - - res.status - - res.message -#### GraphQL -- 성공하는 경우 - - res.body.data[0] 존재 유무 -- 실패하는 경우 - - res.body.errors[0].extensions.code - - res.body.errors[0].message - -### GraphQL - -![GraphQL Docs](graphql-docs.png) -GraphQL 서버 개발 시, field 타입을 정확하게 지정하여 Docs panel만으로 필드 및 반환 객체의 이름과 타입 정보를 알 수 있게 해 주세요. - -Query나 Mutation에 인자가 들어가는 경우, `Variables` 항목에 분리하여 작성해주세요. diff --git a/docs/intro/frontend-preview.png b/docs/intro/frontend-preview.png deleted file mode 100644 index ddbbe3e7b8..0000000000 Binary files a/docs/intro/frontend-preview.png and /dev/null differ diff --git a/docs/intro/getting-started.md b/docs/intro/getting-started.md deleted file mode 100644 index 1243a1efb6..0000000000 --- a/docs/intro/getting-started.md +++ /dev/null @@ -1,162 +0,0 @@ -# Getting Started! - -스꾸딩 팀과 함께 SKKU Coding Platform 개발을 시작하려면 아래 가이드를 따라주세요. -가능한 개발 환경은 크게 세 가지가 있습니다. - -1. Visual Studio Code + Container -2. GitPod -3. Manual - -가장 권장하는 개발 환경은 Container 내에서 개발하는 Visual Studio Code이지만, 어려울 경우에는 GitPod을 이용하거나 직접 세팅할 수도 있습니다. - -## Visual Studio Code (이하 VSCode) - -### 1. 기본 도구 설치 (Git, WSL2(Windows), Docker) - -- **Git**: Windows는 [https://git-scm.com/download/win](https://git-scm.com/download/win)에서 다운로드하고, Mac은 [https://git-scm.com/download/mac](https://git-scm.com/download/mac)에서 다운로드합니다. -Linux는 패키지 관리도구로 쉽게 설치할 수 있습니다. (예: Debian 계열인 경우 `sudo apt install git-all`) - -- **WSL2(Windows)**: 자세한 설치 방법은 [WSL 설치 공식 가이드](https://docs.microsoft.com/ko-kr/windows/wsl/install)를 참고해주세요. - -- **Docker**: Windows는 WSL2를 먼저 설치하고, [Docker Desktop for Windows](https://docs.docker.com/desktop/install/windows-install/)를 설치하면 됩니다. -Mac은 [Docker Desktop for Mac](https://docs.docker.com/desktop/install/mac-install/)을 설치하면 됩니다. -Linux는 자신의 배포판에 맞는 버전을 [공식 홈페이지](https://docs.docker.com/engine/install/)에서 찾아 설치하면 됩니다. - -### 2. VSCode 설치 - -[VSCode 홈페이지](https://code.visualstudio.com/)에서 VSCode 설치 파일을 다운로드 받고, 파일을 실행하여 설치합니다. - -![VSCode Download](vscode-download.png) - -### 3. Remote - Containers 확장 설치 - -왼쪽의 'Extensions' icon을 눌러(단축키 Ctrl+Shift+X, ⇧⌘X) "remote containers"를 검색창에 입력합니다. -'Remote - Containers'를 선택하고 'Install' 버튼을 눌러 설치합니다. - -![Remote - Containers](remote-containers.png) - -### 4. Clone Repository - -GitHub에서 [skkuding/next](https://github.com/skkuding/next) repository를 clone 받습니다. -왼쪽의 'Source Control' icon을 눌러(단축키 Ctrl+Shift+G, ⌃⇧G) 'Clone Repository' 버튼을 누르고, skkuding/next를 검색하여 원하는 위치에 받습니다. - -::: warning Windows 유저라면... -Windows file system에 clone 받는 것보다 WSL file system에 clone 받는 것을 권장합니다. -[파일 저장 시 인식하지 못하는 문제](https://github.com/microsoft/WSL/issues/4739)를 비롯한 여러 문제가 있습니다. -WSL에 clone 받는 방법은 아래 설명을 참고해주세요. -::: - -![Git Clone in VSCode](git-clone.png) - -#### 4-1. WSL에 Clone 받기 (Windows만) - -3번처럼 'Extensions' 탭을 열어 "remote wsl"을 검색창에 입력합니다. -'Remote - WSL'을 선택하고 'Install' 버튼을 눌러 설치합니다. - -![Remote - WSL](remote-wsl.png) - -왼쪽 아래의 `><` 모양 아이콘을 누르고 'New WSL Window' 옵션을 선택하여 WSL 환경에서 VSCode를 시작합니다. - -![New WSL Window](new-wsl-window.png) - -이후 4번과 같은 방식으로 WSL 내에 clone하면 됩니다. - -### 5. VSCode로 repository 열기 - -왼쪽의 'Explorer' icon을 눌러(단축키 Ctrl+Shift+E, ⇧⌘E) 'Open Folder' 버튼을 누르고, clone 받았던 repository 폴더를 엽니다. - -Repository가 열리면 좌측 하단의 `><` 모양 아이콘을 누르고, "Reopen in Container" 옵션을 선택합니다. -이후 자동으로 Docker container가 생성되며 도구와 라이브러리, VSCode 확장들이 설치됩니다. -초기 구성에는 5~10분 정도 소요되지만, 다시 실행할 때에는 오래 걸리지 않습니다. - -![Reopen in Container](reopen-in-container.png) - -### 6. Preview server 열기 - -Container 세팅이 완료되면, 터미널을 열어(단축키 Ctrl+\`, ⌃\`) 명령어를 입력해 개발용 preview server를 시작합니다. - -#### 6-1. Frontend - -```sh -cd frontend -pnpm dev -``` - -Story(component 문서)를 보고 싶으면, `pnpm story` 명령어를 입력해주세요. - -![Frontend Preview](frontend-preview.png) - -#### 6-2. Backend - -```sh -cd backend -pnpm start:dev -``` - -![Backend Preview](backend-preview.png) - -## GitPod - -컴퓨터의 사양이 부족하거나 로컬 개발 환경이 제한적인 경우 브라우저로 원격 개발을 하는 GitPod이 좋습니다. -한 달에 50시간까지 무료고, 학생 인증을 하면 한 달에 9달러로 제한 없이 사용할 수 있습니다. -아래 버튼을 눌러 바로 시작하거나 아래 설명을 따르면 됩니다. - -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/skkuding/next) - -### 1. GitHub Repository 열기 - -브라우저에서 [skkuding/next](https://github.com/skkuding/next) repository를 엽니다. - -> TODO: img - -### 2. URL 입력 - -GitHub 전체 URL의 앞에 `gitpod.io/#`을 입력하고 해당 주소로 접속합니다. -예: `gitpod.io/#https://github.com/skkuding/next` - -::: tip -GitPod은 branch, pull request, commit 등의 context 별로 workspace를 생성하는 것도 가능합니다! - -- Branch `123-feat-name`의 코드로 workspace를 생성하려면: `gitpod.io/#https://github.com/skkuding/next/tree/123-feat-name` -- PR #123의 코드로 workspace를 생성하려면: `gitpod.io/#https://github.com/skkuding/next/pull/123` - -더 자세한 내용은 [공식 문서](https://www.gitpod.io/docs/introduction/learn-gitpod/context-url)에서 확인해주세요. -::: - -> TODO: img - -### 3. GitHub 계정 연결 - -화면에 나오는 대로 GitHub 계정을 GitPod에 연결합니다. - -> TODO: img - -### 4. Preview server 열기 - -GitPod이 자동으로 세팅을 마치면 [위의 Visual Studio Code와 같은 방법](#_6-preview-server-열기)으로 preview server를 열 수 있습니다. - -## Manually - -::: warning Not Recommended 🤔 -직접 모든 환경을 세팅하는 것은 특별한 경우가 아니라면 권장하지 않습니다. -꼭 필요한 경우에만 사용해주세요! -::: - -### 1. 기본 도구 설치 (Git, WSL2(Windows), Docker) - -[위의 Visual Studio Code와 같은 방법](#_1-기본-도구-설치-git-wsl2-windows-docker)으로 기본 도구들을 설치해주세요. - -### 2. Node.js 설치 - -```sh -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash -``` - -```sh -nvm install node -nvm use node -``` - -### 3. setup script 실행 - -### 4. Visual Studio Code 확장 diff --git a/docs/intro/git-clone.png b/docs/intro/git-clone.png deleted file mode 100644 index 09e82d36c2..0000000000 Binary files a/docs/intro/git-clone.png and /dev/null differ diff --git a/docs/intro/graphql-docs.png b/docs/intro/graphql-docs.png deleted file mode 100644 index 976abde45b..0000000000 Binary files a/docs/intro/graphql-docs.png and /dev/null differ diff --git a/docs/intro/index.md b/docs/intro/index.md deleted file mode 100644 index b51f617a9d..0000000000 --- a/docs/intro/index.md +++ /dev/null @@ -1,21 +0,0 @@ -# What is Coding Platform? - -Coding Platform은 성균관대학교 Online Judge 시스템입니다. -소프트웨어융합대학 알고리즘 동아리인 NPC에서 2020년 처음 시작하여, 2022년에 SKKUDING(스꾸딩) 팀으로 개발 팀이 분리되어 지금까지 개발을 맡고 있습니다. - -플랫폼의 목표는 성균관대 학우들의 코딩 실력을 증진시키는 것입니다. -프로그래밍 대회에 참가하여 자신의 실력을 확인하고 선의의 경쟁을 펼칠 수 있으며, 다양한 연습 문제로 실력을 키울 수 있습니다. -기존의 OJ에서 부족했거나 우리 학교에 필요했던 기능을 직접 만들고 커스터마이징할 수 있습니다. - -이 플랫폼의 큰 특징은 시스템을 구성하는 대부분을 오픈 소스로 공개한다는 점입니다([GitHub](https://github.com/skkuding)). -개발에 SKKUDING 팀원만 참여하는 것이 아닌, 누구나 수정하고 싶은 기능을 건의하고, 심지어 직접 구현할 수 있습니다. (PR은 언제나 환영이에요!) - -## About SKKUDING - -SKKUDING은 Coding Platform을 주도적으로 개발하고 있는 동아리입니다. -2022년 2월에 공식적으로 NPC 동아리에서 분리되었고, 비전공생들도 함께하며 성장을 주된 목표로 활동하고 있습니다. - -SKKUDING은 실력과 성과에 치중하기보다는 팀원 개개인의 성장을 지향합니다. -모두 실무 경험이 없는 학생들이고 비전공생들도 다수 있기에, 접하기 어려운 큰 규모의 프로젝트에 참가한다는 경험을 의의로 합니다. - -혹시 SKKUDING 팀에 함께하고 싶다면, [카카오톡 채널](https://pf.kakao.com/_UKraK/chat)을 통해서 운영진들에게 연락해보세요. diff --git a/docs/intro/new-wsl-window.png b/docs/intro/new-wsl-window.png deleted file mode 100644 index f2057cb499..0000000000 Binary files a/docs/intro/new-wsl-window.png and /dev/null differ diff --git a/docs/intro/remote-containers.png b/docs/intro/remote-containers.png deleted file mode 100644 index 8cc9766a6a..0000000000 Binary files a/docs/intro/remote-containers.png and /dev/null differ diff --git a/docs/intro/remote-wsl.png b/docs/intro/remote-wsl.png deleted file mode 100644 index 1a4f33bd7a..0000000000 Binary files a/docs/intro/remote-wsl.png and /dev/null differ diff --git a/docs/intro/reopen-in-container.png b/docs/intro/reopen-in-container.png deleted file mode 100644 index 335a624bab..0000000000 Binary files a/docs/intro/reopen-in-container.png and /dev/null differ diff --git a/docs/intro/vscode-download.png b/docs/intro/vscode-download.png deleted file mode 100644 index 74ce4c8ef8..0000000000 Binary files a/docs/intro/vscode-download.png and /dev/null differ diff --git a/docs/project/deploy-pipeline.png b/docs/project/deploy-pipeline.png deleted file mode 100644 index 1d793c7754..0000000000 Binary files a/docs/project/deploy-pipeline.png and /dev/null differ diff --git a/docs/project/deploy.md b/docs/project/deploy.md deleted file mode 100644 index 02ed4cc5f6..0000000000 --- a/docs/project/deploy.md +++ /dev/null @@ -1,5 +0,0 @@ -# How to deploy? - -::: warning Work in Progress 🚧 -아직 작성 중인 페이지입니다. 조금만 기다려주세요! 🙏 -::: diff --git a/docs/project/github-actions-runner.png b/docs/project/github-actions-runner.png deleted file mode 100644 index 6e2633b2f7..0000000000 Binary files a/docs/project/github-actions-runner.png and /dev/null differ diff --git a/docs/project/github-projects.png b/docs/project/github-projects.png deleted file mode 100644 index f98ce12bfb..0000000000 Binary files a/docs/project/github-projects.png and /dev/null differ diff --git a/docs/project/hierarchy.md b/docs/project/hierarchy.md deleted file mode 100644 index 659342b60b..0000000000 --- a/docs/project/hierarchy.md +++ /dev/null @@ -1,5 +0,0 @@ -# Hierarchy - -::: warning Work in Progress 🚧 -아직 작성 중인 페이지입니다. 조금만 기다려주세요! 🙏 -::: diff --git a/docs/project/roadmap.md b/docs/project/roadmap.md deleted file mode 100644 index 562a169b35..0000000000 --- a/docs/project/roadmap.md +++ /dev/null @@ -1,5 +0,0 @@ -# Project Planning - -::: warning Work in Progress 🚧 -아직 작성 중인 페이지입니다. 조금만 기다려주세요! 🙏 -::: diff --git a/docs/project/stage-server.md b/docs/project/stage-server.md deleted file mode 100644 index 61d68e4870..0000000000 --- a/docs/project/stage-server.md +++ /dev/null @@ -1,66 +0,0 @@ -# Stage Server - -스테이지 서버는 배포 전 테스트를 위한 서버로, [dev.codedang.com](https://dev.codedang.com/)에서 확인할 수 있습니다. - -![배포 과정](./deploy-pipeline.png) - -`main` 브랜치에 올라간 코드는 `deployment` environment에서 자동으로 스테이지 서버에 배포되며, -수동으로 production 배포를 trigger하면 `production` environment에서 진행합니다. - -## Stage Server 세팅 - -### Prerequisite - -- Docker -- PNPM -- 2 Core 4GB RAM 이상의 서버 -- x86_64 CPU Architecture (ARM은 지원하지 않습니다.) - -### 1. Docker 컨테이너 생성 - -우선 배포할 서버에 SSH로 접속 후, repository를 clone합니다. - -```bash -git clone https://github.com/skkuding/codedang -``` - -그 후, `codedang` 폴더로 이동하여 Docker Compose를 `deploy` profile로 실행합니다. - -```bash -docker compose --profile deploy up -d -``` - -### 2. Frontend Build (선택) - -::: tip 어떤 경우에 build해야 하나요? -컨테이너 생성만 하면 frontend build는 진행되지 않습니다. -그래서 바로 서버에 접속하면 404 에러가 발생해요. -대신 GitHub Actions로 배포가 진행되면 frontend build가 자동으로 이뤄지고 접속이 가능해집니다. -하지만 GitHub Actions까지 세팅하기 전 바로 접속하고 싶다면 이 단계를 진행해주세요. -::: - -`codedang` 폴더에서 frontend를 빌드합니다. - -```bash -pnpm install -pnpm --filter frontend build -``` - -이후 Caddy 컨테이너에 빌드된 파일을 업로드하고 재시작합니다. - -```bash -docker cp frontend/dist caddy:/var/www/html -docker exec -w /etc/caddy caddy caddy reload -``` - -이후 `https://<서버 주소>`로 접속하면, 화면이 나타납니다. - -### 3. GitHub Action Runner 세팅 - -자동 배포를 위해 GitHub Action의 Self-hosted Runner로 등록합니다. - -GitHub의 codedang repository에서 `Settings` > 좌측 사이드 바 `Actions` > `Runners` > `New self-hosted runner`를 클릭합니다. - -이후 설명된 내용을 따라 Runner를 등록합니다. - -![GitHub Action Runner 등록](./github-actions-runner.png) diff --git a/docs/project/tech-stack.md b/docs/project/tech-stack.md deleted file mode 100644 index 36281ebfc8..0000000000 --- a/docs/project/tech-stack.md +++ /dev/null @@ -1,157 +0,0 @@ -# Tech Stack - -Coding Platform은 Frontend, Backend, DevOps 세 팀으로 나누어 프로젝트를 진행합니다. - -| 분류 | Stacks | -|:--------:|-------------| -| 공통 | Visual Studio Code, GitHub, pnpm, Typescript, ESLint, Prettier, Lefthook | -| Frontend | Vue.js, Vite, Tailwind CSS, Pinia, Histoire | -| Backend | Node.js, Nest.js, Express, Mocha, Prisma, PostgreSQL, Redis | -| DevOps | Docker, AWS | - -## 공통 - -### GitHub - -프로젝트 코드 저장부터 이슈 관리, CI/CD 등 다양한 용도로 활용하고 있습니다. -GitHub Issues에 모든 task를 저장하여 스꾸딩 팀의 업무 단위로 활용하고 있고, pull request로 코드 리뷰를 거치며 의견을 교환합니다. -또한 GitHub Actions로 CI/CD 시스템을 구축하여 테스팅과 배포를 자동화하였습니다. - -![GitHub Projects](github-projects.png) - -### pnpm - -[pnpm](https://pnpm.io/)은 Node.js package manager로, npm과 yarn에 비해 월등히 속도가 빠르고 디스크 공간을 절약할 수 있습니다. -또한 monorepo 기능이 내장되어있어 frontend와 backend의 의존성을 별도로 관리하는 이 프로젝트에 적합합니다. -Frontend와 backend의 중복되는 의존성은 pnpm에 의해 모두 자동으로 하나로 관리됩니다. - -::: tip -보통 라이브러리를 설치할 때 `npm i ` 또는 `yarn add `처럼 NPM과 Yarn을 활용한 예시가 많습니다. -이를 그대로 따라하면 NPM 또는 Yarn의 lockfile이 새로 생성되고 pnpm의 것은 무시됩니다. -따라서 이 프로젝트에서는 `pnpm add ` 명령어를 이용하여 설치해야 합니다. (`devDependency`의 경우 `-D` 옵션을 추가해주세요!) -::: - -::: warning -pnpm은 symbolic link를 적극적으로 사용하기 때문에 일부 라이브러리에서 관련 issue가 발생할 수 있습니다. -혹시 프로젝트에서 알 수 없는 문제가 발생했다면 pnpm을 키워드에 넣어 검색해보세요. -::: - -### Typescript - -[Typescript](https://www.typescriptlang.org/)는 Javascript에 정적 타입을 추가한 언어로, 엄격한 문법을 통해 생산성을 높입니다. -VSCode에 Typescript가 내장되어있어 자동 완성이나 문법 분석 등 여러 편의 기능을 제공하고, 다양한 이슈를 runtime이 아닌 build time에 잡을 수 있다는 강점이 있습니다. -Frontend는 Vue 3에서 Typescript를 적극적으로 지원하며, backend는 Nest.js가 Typescript를 기반으로 제작된 framework입니다. - -### ESLint, Prettier - -[ESLint](https://eslint.org/)는 정적 코드 분석 도구로, 문법적 오류나 컨벤션 위반 등을 잡아줍니다. -[Prettier](https://prettier.io/)은 자동 코드 formatter로, 일관된 코드 형식을 자동으로 잡아줍니다. -가이드에 맞춰 VSCode로 개발 환경을 제대로 구성했다면 ESLint와 Prettier은 자동으로 설정됩니다. -또한 commit hook과 CI 단계에도 적용되어있어 main branch에 반영되기 전에 오류를 검출합니다. - -### Lefthook - -[Lefthook](https://github.com/evilmartians/lefthook)은 Git hook을 관리해주는 도구로, 앞서 언급한 linting이나 formatting 등을 commit하는 시점에 실행해줍니다. -보통 Git hook 관리 도구로 Husky를 많이 사용하지만, Lefthook이 훨씬 속도가 빠르고 여러 기능들을 제공합니다. - -## Frontend - -### Vue 3 - -Frontend framework로 [Vue 3](https://vuejs.org/)을 사용합니다. -지금은 구현 편의 상 SPA를 사용하고 있지만, 추후 SSR 또는 SSG 적용을 위해 [Nuxt 3](https://v3.nuxtjs.org/)을 사용할 예정입니다. -아직 Nuxt 3을 도입하기에는 Nuxt 문서가 충분히 완성되지 않았고 stable release 단계에 이르지 않았기 때문에 Nuxt가 어느 정도 성숙해지면 도입할 예정입니다. -React와 Svelte 등의 대안을 두고 Vue를 사용한 이유는 다음과 같습니다. - -- **React**: React는 frontend library 중 가장 큰 커뮤니티를 가지고 있어 자료 검색이나 라이브러리 도입이 쉽다는 장점이 있습니다. -또한 Next.js라는 훌륭한 SSR/SSG 용 framework도 있고, 채용 시장에서 수요도 제일 많습니다. -하지만 난이도가 비교적 높아 진입장벽이 높고 Vue에 비해 문법이 직관적이지 못합니다. -Vue 2에 대해서는 React가 Typescript 지원에서 크게 앞서있었지만, Vue 3에서는 Composition API로 여러 문제가 해결되며 React의 메리트가 줄어들었습니다. - -- **Svelte**: Svelte는 신생 frontend library로 매우 직관적인 문법이 특징입니다. -하지만 신생 라이브러리인 만큼 학습 자료나 라이브러리가 부족하여 개발 경험이 적은 팀원들에게 적합하지 않습니다. -또한 [자체적으로 설계 문제](https://gist.github.com/rabelais88/19bfe8dfd29d901554389f0a8cc8947a)가 있어 추후 scalable한 운영이 어려울 수 있습니다. - -기존에 스꾸딩 팀이 QingdaoU OJ 기반의 Online Judge를 구축할 때부터 Vue를 써온 것도 Vue를 택한 이유 중 하나입니다. -더 상세한 배경은 [issue #8](https://github.com/skkuding/next/issues/8#issuecomment-1065856244)에서 확인할 수 있습니다. - -### Vite - -[Vite](https://vitejs.dev/)는 Vue의 제작자인 Evan You가 만든 module bundler로, Vue 팀에서 공식적으로 권장하는 tool입니다. -ES module을 적극적으로 활용하고 dependecies를 esbuild로 bundle하기 때문에 매우 빠른 속도가 특징입니다. -사용하기 쉽고, 활용할 수 있는 plugin들도 많습니다. -이 프로젝트에서 사용하고 있는 plugin은 다음과 같습니다. - -- [`vite-plugin-pages`](https://github.com/hannoeru/vite-plugin-pages): File system 기반의 routing을 자동으로 만들어줍니다. -- [`unplugin-icons`](https://github.com/antfu/unplugin-icons): Iconset들을 쉽게 불러올 수 있는 plugin입니다. -[Icônes](https://icones.js.org/)에서 아이콘들을 확인할 수 있습니다. - -### Tailwind CSS - -[Tailwind CSS](https://tailwindcss.com/)는 CSS framework로, utility-first라는 특징을 가지고 있습니다. -각각의 CSS 속성들이 CSS class로 정의되어있기 때문에 inline style처럼 style을 정의할 수 있습니다. -이 프로젝트에서 Tailwind CSS를 사용하는 이유는 (1) 진입장벽이 낮고 사용법이 쉬우며, (2) 일관된 look & feel을 구현하기에 용이하기 때문입니다. - -### Pinia - -[Pinia](https://pinia.vuejs.org/)는 기존의 Vuex를 대체하는 상태 관리 라이브러리로, Vue 팀에서 공식적으로 권장하고 있습니다. -직관적인 문법과 뛰어난 Typescript 지원 등이 특징입니다. - -### Histoire - -[Histoire](https://histoire.dev/)은 UI component를 위한 문서화 라이브러리로, 잘 알려진 [Storybook](https://storybook.js.org/)과 동일한 용도입니다. -Storybook 대신 Histoire을 사용하는 이유는 (1) Histoire은 Vue 문법을 사용하기 때문에 쉽고 간결하게 작성할 수 있고, (2) Vite가 내장되어있어 빠릅니다. -Histoire가 Storybook에 비하면 기능도 훨씬 적고 자료도 부족하지만, 간단한 문서화 용도로는 충분하다고 판단하였고, Vue가 익숙한 팀원들이 쉽게 작성할 수 있을 것이라 생각해 Histoire을 택하였습니다. - -### 이 외 - -- [VueUse](https://vueuse.org/): 상태 관리, 시간, 반응형 등 다양한 유틸리티 함수들의 모음입니다. - -- [NProgress](https://ricostacruz.com/nprogress/): 페이지 상단에 progress bar를 표시해줍니다. - -## Backend - -### Node.js - -[Node.js](https://nodejs.org/ko/)는 서버에서 Javascript를 실행하는 runtime 환경입니다. -원래 Javascript는 웹 브라우저에서만 실행 가능하지만, Node.js는 Chrome의 V8엔진에 파일 시스템과 네트워킹 등의 API를 추가해 서버에서 활용할 수 있게끔 만들었습니다. -성능도 뛰어나고 frontend와 동일한 언어를 사용하기 때문에 의존성 관리가 용이합니다. - -### NestJS - -[NestJS](https://nestjs.com/)는 scalabe한 app을 만들기 위한 구조를 제공하는 framework입니다. -Python의 Django와 달리 Node.js에는 그동안 구조가 정해진 backend framework가 없었는데, 그 공백을 채운 것이 NestJS입니다. -그 구조가 Angular나 Java Spring과 유사하며 객체 지향(특히 Dependency Injection)을 핵심으로 합니다. - -### Express - -[Express](http://expressjs.com/ko/)는 Node.js 환경에서 가장 유명한 backend library로, 간단하게 web app을 만들 수 있습니다. -우리 프로젝트에서는 직접 Express를 쓰는 대신 NestJS가 Express를 감싸고 있습니다. -지금은 관련 자료가 풍부하다는 이유로 Express를 사용하고 있지만, 추후 성능 개선이 필요한 시점이 오면 [Fastify](https://www.fastify.io/)로 대체할 수 있습니다. - -### Mocha - -일반적으로 Node.js 생태계에서 testing framework로 [Jest](https://jestjs.io/)가 가장 많이 쓰이지만, Jest의 성능 문제로 우리 프로젝트에서는 [Mocha](https://mochajs.org)를 대신 사용합니다. (관련 issue: [#299](https://github.com/skkuding/next/issues/299)) -Mocha와 함께 assertion 기능을 제공하는 [Chai](https://www.chaijs.com), mocking과 fake 함수 기능을 제공하는 [Sinon](https://sinonjs.org)을 사용합니다. - -### Prisma - -[Prisma](https://www.prisma.io/)는 ORM으로, 직관적으로 사용할 수 있고 Typescript를 적극적으로 지원합니다. -ORM이란 database에 SQL로 직접 query문을 전달하는 대신, Typescript 등의 언어로 mapping 시켜주는 도구를 말합니다. -Prisma는 각 model들을 type으로 생성해주기 때문에 Typescript로 쉽게 query문을 작성할 수 있습니다. - -### PostgreSQL - -[PostgreSQL](https://www.postgresql.org/)은 널리 쓰이는 관계형 database입니다. -많이 비교되는 MySQL보다 다양한 기능을 제공합니다. - -### Redis - -[Redis](https://redis.io/)는 in-memory 저장소로, 이 프로젝트에서는 주로 caching과 message queue를 위해 쓰입니다. (추후 message queue는 Amazon SQS으로 대체할 수 있습니다) - - -## DevOps - -::: warning Work in Progress 🚧 -배포 완료 후 작성 예정입니다! -::: diff --git a/docs/public/logo.png b/docs/public/logo.png deleted file mode 100644 index 1b92bce156..0000000000 Binary files a/docs/public/logo.png and /dev/null differ diff --git a/docs/public/logo.svg b/docs/public/logo.svg deleted file mode 100644 index a2339a1e07..0000000000 --- a/docs/public/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/user/contest.md b/docs/user/contest.md deleted file mode 100644 index 229f354db3..0000000000 --- a/docs/user/contest.md +++ /dev/null @@ -1,7 +0,0 @@ -# User - Contest - -::: warning Work in Progress 🚧 -아직 작성 중인 페이지입니다. 조금만 기다려주세요! 🙏 -::: - - diff --git a/docs/user/group.md b/docs/user/group.md deleted file mode 100644 index 3a24c42933..0000000000 --- a/docs/user/group.md +++ /dev/null @@ -1,5 +0,0 @@ -# User - Group - -::: warning Work in Progress 🚧 -아직 작성 중인 페이지입니다. 조금만 기다려주세요! 🙏 -::: diff --git a/docs/user/main.md b/docs/user/main.md deleted file mode 100644 index a1955c719c..0000000000 --- a/docs/user/main.md +++ /dev/null @@ -1,5 +0,0 @@ -# 코드당 시작하기 - -::: warning Work in Progress 🚧 -아직 작성 중인 페이지입니다. 조금만 기다려주세요! 🙏 -::: diff --git a/docs/user/notice.md b/docs/user/notice.md deleted file mode 100644 index 77515e5777..0000000000 --- a/docs/user/notice.md +++ /dev/null @@ -1,5 +0,0 @@ -# User - Notice - -::: warning Work in Progress 🚧 -아직 작성 중인 페이지입니다. 조금만 기다려주세요! 🙏 -::: diff --git a/docs/user/problem.md b/docs/user/problem.md deleted file mode 100644 index c97193f0c5..0000000000 --- a/docs/user/problem.md +++ /dev/null @@ -1,5 +0,0 @@ -# User - Problem - -::: warning Work in Progress 🚧 -아직 작성 중인 페이지입니다. 조금만 기다려주세요! 🙏 -::: diff --git a/knip.ts b/knip.ts index 9b2bf49434..34166f7fe0 100644 --- a/knip.ts +++ b/knip.ts @@ -4,11 +4,7 @@ import type { KnipConfig } from 'knip' const config: KnipConfig = { workspaces: { '.': { - entry: [ - 'scripts/*.ts', - 'docs/.vitepress/config.mts', - 'docs/.vitepress/theme/index.ts' - ] + entry: ['scripts/*.ts'] }, backend: { entry: [ diff --git a/package.json b/package.json index 211b0cd84b..150fa32c9b 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,6 @@ "lint": "eslint . --ext .js,.ts,.vue,.tsx,.jsx", "format": "prettier --write .", "format:check": "prettier --check .", - "docs:dev": "vitepress dev docs --port 5555", - "docs:build": "vitepress build docs", "init:testcases": "ts-node scripts/init-testcase.ts", "knip": "knip" }, @@ -27,7 +25,6 @@ "prettier-plugin-tailwindcss": "^0.5.11", "ts-node": "^10.9.2", "typescript": "^5.3.3", - "vitepress": "1.0.0-rc.42", "vue-eslint-parser": "^9.4.2" }, "packageManager": "pnpm@8.15.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f63de7acc6..0fcb9d0bd5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,9 +59,6 @@ importers: typescript: specifier: ^5.3.3 version: 5.3.3 - vitepress: - specifier: 1.0.0-rc.42 - version: 1.0.0-rc.42(@algolia/client-search@4.22.1)(@types/node@20.11.17)(search-insights@2.13.0)(typescript@5.3.3) vue-eslint-parser: specifier: ^9.4.2 version: 9.4.2(eslint@8.56.0) @@ -696,140 +693,6 @@ packages: engines: {node: '>=14.0.0'} dev: true - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0): - resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - dev: true - - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0): - resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} - peerDependencies: - search-insights: '>= 1 < 3' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) - search-insights: 2.13.0 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - dev: true - - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1): - resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) - '@algolia/client-search': 4.22.1 - algoliasearch: 4.22.1 - dev: true - - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1): - resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/client-search': 4.22.1 - algoliasearch: 4.22.1 - dev: true - - /@algolia/cache-browser-local-storage@4.22.1: - resolution: {integrity: sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==} - dependencies: - '@algolia/cache-common': 4.22.1 - dev: true - - /@algolia/cache-common@4.22.1: - resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} - dev: true - - /@algolia/cache-in-memory@4.22.1: - resolution: {integrity: sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==} - dependencies: - '@algolia/cache-common': 4.22.1 - dev: true - - /@algolia/client-account@4.22.1: - resolution: {integrity: sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==} - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: true - - /@algolia/client-analytics@4.22.1: - resolution: {integrity: sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==} - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: true - - /@algolia/client-common@4.22.1: - resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} - dependencies: - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: true - - /@algolia/client-personalization@4.22.1: - resolution: {integrity: sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==} - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: true - - /@algolia/client-search@4.22.1: - resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: true - - /@algolia/logger-common@4.22.1: - resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} - dev: true - - /@algolia/logger-console@4.22.1: - resolution: {integrity: sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==} - dependencies: - '@algolia/logger-common': 4.22.1 - dev: true - - /@algolia/requester-browser-xhr@4.22.1: - resolution: {integrity: sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==} - dependencies: - '@algolia/requester-common': 4.22.1 - dev: true - - /@algolia/requester-common@4.22.1: - resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} - dev: true - - /@algolia/requester-node-http@4.22.1: - resolution: {integrity: sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==} - dependencies: - '@algolia/requester-common': 4.22.1 - dev: true - - /@algolia/transporter@4.22.1: - resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} - dependencies: - '@algolia/cache-common': 4.22.1 - '@algolia/logger-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - dev: true - /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -2404,49 +2267,6 @@ packages: vue: 3.4.19(typescript@5.3.3) dev: false - /@docsearch/css@3.5.2: - resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} - dev: true - - /@docsearch/js@3.5.2(@algolia/client-search@4.22.1)(search-insights@2.13.0): - resolution: {integrity: sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==} - dependencies: - '@docsearch/react': 3.5.2(@algolia/client-search@4.22.1)(search-insights@2.13.0) - preact: 10.19.3 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - react - - react-dom - - search-insights - dev: true - - /@docsearch/react@3.5.2(@algolia/client-search@4.22.1)(search-insights@2.13.0): - resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) - '@docsearch/css': 3.5.2 - algoliasearch: 4.22.1 - search-insights: 2.13.0 - transitivePeerDependencies: - - '@algolia/client-search' - dev: true - /@emnapi/runtime@0.45.0: resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} requiresBuild: true @@ -5698,16 +5518,6 @@ packages: selderee: 0.11.0 dev: false - /@shikijs/core@1.1.2: - resolution: {integrity: sha512-ERVzNQz88ZkDqUpWeC57Kp+Kmx5RjqeDBR1M8AGWGom4yrkITiTfXCGmjchlDSw12MhDTuPYR4HVFW8uT61RaQ==} - dev: true - - /@shikijs/transformers@1.1.2: - resolution: {integrity: sha512-tldkUMW7RBkU2F6eXbiRMw3ja+hQer1EjwhD2NGOv6K0pgZdVp3JKjU8uisRtg65tyBqrVHq7zlLHVk7EKmUZA==} - dependencies: - shiki: 1.1.2 - dev: true - /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: @@ -6731,13 +6541,6 @@ packages: '@types/mdurl': 1.0.5 dev: true - /@types/markdown-it@13.0.7: - resolution: {integrity: sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==} - dependencies: - '@types/linkify-it': 3.0.5 - '@types/mdurl': 1.0.5 - dev: true - /@types/mdurl@1.0.5: resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} dev: true @@ -6901,6 +6704,7 @@ packages: /@types/web-bluetooth@0.0.20: resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + dev: false /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3): resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} @@ -7320,33 +7124,6 @@ packages: /@vue/devtools-api@6.5.1: resolution: {integrity: sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==} - /@vue/devtools-api@7.0.14: - resolution: {integrity: sha512-TluWR9qZ6aO11bwtYK8+fzXxBqLfsE0mWZz1q/EQBmO9k82Cm6deieLwNNXjNFJz7xutazoia5Qa+zTYkPPOfw==} - dependencies: - '@vue/devtools-kit': 7.0.14 - dev: true - - /@vue/devtools-kit@7.0.14: - resolution: {integrity: sha512-wAAJazr4hI0aVRpgWOCVPw+NzMQdthhnprHHIg4njp1MkKrpCNGQ7MtQbZF1AltAA7xpMCGyyt+0kYH0FqTiPg==} - dependencies: - '@vue/devtools-schema': 7.0.14 - '@vue/devtools-shared': 7.0.14 - hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 1.0.0 - speakingurl: 14.0.1 - dev: true - - /@vue/devtools-schema@7.0.14: - resolution: {integrity: sha512-tpUeCLVrdHX+KzWMLTAwx/vAPFbo6jAUi7sr6Q+0mBIqIVSSIxNr5wEhegiFvYva+OtDeM2OrT+f7/X/5bvZNg==} - dev: true - - /@vue/devtools-shared@7.0.14: - resolution: {integrity: sha512-79RP1NDakBVWou9rDpVnT1WMjTbL1lJKm6YEOodjQ0dq5ehf0wsRbeYDhgAlnjehWRzTq5GAYFBFUPYBs0/QpA==} - dependencies: - rfdc: 1.3.1 - dev: true - /@vue/language-core@1.8.27(typescript@5.3.3): resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} peerDependencies: @@ -7426,6 +7203,7 @@ packages: transitivePeerDependencies: - '@vue/composition-api' - vue + dev: false /@vueuse/integrations@10.7.2(axios@1.6.7)(nprogress@0.2.0)(sortablejs@1.15.2)(vue@3.4.19): resolution: {integrity: sha512-+u3RLPFedjASs5EKPc69Ge49WNgqeMfSxFn+qrQTzblPXZg6+EFzhjarS5edj2qAf6xQ93f95TUxRwKStXj/sQ==} @@ -7479,56 +7257,6 @@ packages: - vue dev: false - /@vueuse/integrations@10.7.2(focus-trap@7.5.4)(vue@3.4.19): - resolution: {integrity: sha512-+u3RLPFedjASs5EKPc69Ge49WNgqeMfSxFn+qrQTzblPXZg6+EFzhjarS5edj2qAf6xQ93f95TUxRwKStXj/sQ==} - peerDependencies: - async-validator: '*' - axios: '*' - change-case: '*' - drauu: '*' - focus-trap: '*' - fuse.js: '*' - idb-keyval: '*' - jwt-decode: '*' - nprogress: '*' - qrcode: '*' - sortablejs: '*' - universal-cookie: '*' - peerDependenciesMeta: - async-validator: - optional: true - axios: - optional: true - change-case: - optional: true - drauu: - optional: true - focus-trap: - optional: true - fuse.js: - optional: true - idb-keyval: - optional: true - jwt-decode: - optional: true - nprogress: - optional: true - qrcode: - optional: true - sortablejs: - optional: true - universal-cookie: - optional: true - dependencies: - '@vueuse/core': 10.7.2(vue@3.4.19) - '@vueuse/shared': 10.7.2(vue@3.4.19) - focus-trap: 7.5.4 - vue-demi: 0.14.7(vue@3.4.19) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: true - /@vueuse/math@10.7.2(vue@3.4.19): resolution: {integrity: sha512-Z1h/kdW5f4c/v/QOpWFFaEx4UaIt7xQTxoDnxQAx1gHGHpGYTtBlQHm80zrRodCz0auyBZMkALkCgKinzGggXw==} dependencies: @@ -7541,6 +7269,7 @@ packages: /@vueuse/metadata@10.7.2: resolution: {integrity: sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==} + dev: false /@vueuse/router@10.7.2(vue-router@4.2.5)(vue@3.4.19): resolution: {integrity: sha512-TE9QtcqtZ793bwJWnlxn1gir7TXHJh5Y0KTIAS2DFOFvz4f3yTPmxAtIHC5e96oBVaVdnzxQQ9EsOhBDfBtCDg==} @@ -7562,6 +7291,7 @@ packages: transitivePeerDependencies: - '@vue/composition-api' - vue + dev: false /@webassemblyjs/ast@1.11.6: resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} @@ -7873,25 +7603,6 @@ packages: estraverse: 1.9.3 dev: false - /algoliasearch@4.22.1: - resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==} - dependencies: - '@algolia/cache-browser-local-storage': 4.22.1 - '@algolia/cache-common': 4.22.1 - '@algolia/cache-in-memory': 4.22.1 - '@algolia/client-account': 4.22.1 - '@algolia/client-analytics': 4.22.1 - '@algolia/client-common': 4.22.1 - '@algolia/client-personalization': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/logger-common': 4.22.1 - '@algolia/logger-console': 4.22.1 - '@algolia/requester-browser-xhr': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/requester-node-http': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: true - /amqp-connection-manager@3.9.0(amqplib@0.8.0): resolution: {integrity: sha512-ZKw9ckJKz40Lc2pC7DY0NVocpzPalMaCgv0sBn+N4er2QFAJul9pIiMOm/FsPHeCzB+FulV7PckOpmZvWvewGQ==} engines: {node: '>=10.0.0', npm: '>5.0.0'} @@ -10803,12 +10514,6 @@ packages: resolution: {integrity: sha512-W7cHV7Hrwjid6lWmy0IhsWDFQboWSng25U3VVywpHOTJnnAZNPScog67G+cVpeX9f7yDD21ih0WDrMMT+JoaYg==} dev: true - /focus-trap@7.5.4: - resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - dependencies: - tabbable: 6.2.0 - dev: true - /follow-redirects@1.15.5: resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} engines: {node: '>=4.0'} @@ -11376,10 +11081,6 @@ packages: react-is: 16.13.1 dev: false - /hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - dev: true - /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true @@ -12871,10 +12572,6 @@ packages: engines: {node: '>=8'} dev: true - /mark.js@8.11.1: - resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} - dev: true - /markdown-it-anchor@8.6.7(@types/markdown-it@12.2.3)(markdown-it@12.3.2): resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} peerDependencies: @@ -13140,10 +12837,6 @@ packages: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} - /minisearch@6.3.0: - resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} - dev: true - /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -13152,10 +12845,6 @@ packages: yallist: 4.0.0 dev: false - /mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - dev: true - /mjml-accordion@4.14.1: resolution: {integrity: sha512-dpNXyjnhYwhM75JSjD4wFUa9JgHm86M2pa0CoTzdv1zOQz67ilc4BoK5mc2S0gOjJpjBShM5eOJuCyVIuAPC6w==} dependencies: @@ -14536,10 +14225,6 @@ packages: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} dev: false - /perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - dev: true - /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -14749,6 +14434,7 @@ packages: /preact@10.19.3: resolution: {integrity: sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==} + dev: false /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -15744,10 +15430,6 @@ packages: resolution: {integrity: sha512-/x8uIPdTafBqakK0TmPNJzgkLP+3H+yxpUJhCQHsLBg1rYEVNR2D8BRYNWQhVBjyOd7oo1dZRVzIkwMY2oqfYQ==} dev: true - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: true - /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true @@ -15906,10 +15588,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /search-insights@2.13.0: - resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} - dev: true - /section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} @@ -16124,12 +15802,6 @@ packages: deprecated: Please migrate to https://github.com/antfu/shikiji dev: true - /shiki@1.1.2: - resolution: {integrity: sha512-qNzFwTv5uhEDNUIwp7wHjsrffVeLbmOgWnM5mZZhoiz7G2qAUvqVfUzuWfieD45/YAKipzCtdV9SndacKtABow==} - dependencies: - '@shikijs/core': 1.1.2 - dev: true - /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -16268,11 +15940,6 @@ packages: resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} dev: true - /speakingurl@14.0.1: - resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} - engines: {node: '>=0.10.0'} - dev: true - /split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: @@ -16607,10 +16274,6 @@ packages: tslib: 2.6.2 dev: true - /tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: true - /tailwind-merge@2.2.1: resolution: {integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==} dependencies: @@ -17550,61 +17213,6 @@ packages: fsevents: 2.3.3 dev: true - /vitepress@1.0.0-rc.42(@algolia/client-search@4.22.1)(@types/node@20.11.17)(search-insights@2.13.0)(typescript@5.3.3): - resolution: {integrity: sha512-VeiVVXFblt/sjruFSJBNChMWwlztMrRMe8UXdNpf4e05mKtTYEY38MF5qoP90KxPTCfMQiKqwEGwXAGuOTK8HQ==} - hasBin: true - peerDependencies: - markdown-it-mathjax3: ^4.3.2 - postcss: ^8.4.34 - peerDependenciesMeta: - markdown-it-mathjax3: - optional: true - postcss: - optional: true - dependencies: - '@docsearch/css': 3.5.2 - '@docsearch/js': 3.5.2(@algolia/client-search@4.22.1)(search-insights@2.13.0) - '@shikijs/core': 1.1.2 - '@shikijs/transformers': 1.1.2 - '@types/markdown-it': 13.0.7 - '@vitejs/plugin-vue': 5.0.4(vite@5.1.2)(vue@3.4.19) - '@vue/devtools-api': 7.0.14 - '@vueuse/core': 10.7.2(vue@3.4.19) - '@vueuse/integrations': 10.7.2(focus-trap@7.5.4)(vue@3.4.19) - focus-trap: 7.5.4 - mark.js: 8.11.1 - minisearch: 6.3.0 - shiki: 1.1.2 - vite: 5.1.2(@types/node@20.11.17) - vue: 3.4.19(typescript@5.3.3) - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/node' - - '@types/react' - - '@vue/composition-api' - - async-validator - - axios - - change-case - - drauu - - fuse.js - - idb-keyval - - jwt-decode - - less - - lightningcss - - nprogress - - qrcode - - react - - react-dom - - sass - - search-insights - - sortablejs - - stylus - - sugarss - - terser - - typescript - - universal-cookie - dev: true - /vlq@0.2.3: resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==} dev: true @@ -17691,6 +17299,7 @@ packages: optional: true dependencies: vue: 3.4.19(typescript@5.3.3) + dev: false /vue-dompurify-html@5.0.1(vue@3.4.19): resolution: {integrity: sha512-8yoMbo7PX4vt01k0dcCHvP4tY0fOCLkQeMhXXRNmH7/muIUTkFOQNzkAtE0RmqgaF/unabvYnsnCu2CjIMgueg==} diff --git a/skkuding.code-workspace b/skkuding.code-workspace index 66179fdbe2..7b14549f13 100644 --- a/skkuding.code-workspace +++ b/skkuding.code-workspace @@ -12,10 +12,6 @@ "path": "frontend", "name": "Frontend" }, - { - "path": "docs", - "name": "Documentation" - }, { "path": "frontend-client", "name": "Frontend Client"