├── .editorconfig ├── .eslintrc.yml ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ ├── check.yaml │ └── publish.yaml ├── .gitignore ├── .husky └── pre-commit ├── .nvmrc ├── .prettierrc.yml ├── .vscode └── settings.json ├── .yarnrc.yml ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── SECURITY.md ├── apps ├── README.md ├── frontend │ ├── .browserslistrc │ ├── .eslintrc.yml │ ├── .gitignore │ ├── README.md │ ├── env.d.ts │ ├── index.html │ ├── package.json │ ├── public │ │ ├── favicon.ico │ │ └── stage0.js │ ├── src │ │ ├── App.vue │ │ ├── assets │ │ │ └── logo.svg │ │ ├── components │ │ │ ├── admin │ │ │ │ ├── AdminSettingsInput.vue │ │ │ │ └── misc │ │ │ │ │ ├── DefaultOrgInput.vue │ │ │ │ │ ├── MilestoneSettingsInput.vue │ │ │ │ │ └── TitleURLInput.vue │ │ │ ├── announcement │ │ │ │ ├── AnnouncementList.vue │ │ │ │ └── fmtdate.ts │ │ │ ├── aoi │ │ │ │ ├── AoiBar.vue │ │ │ │ ├── AoiBarAddMenu.vue │ │ │ │ ├── AoiBarUserMenu.vue │ │ │ │ ├── AoiFooter.vue │ │ │ │ ├── AoiGravatar.vue │ │ │ │ ├── AoiLogo.vue │ │ │ │ ├── AoiNavDrawer.vue │ │ │ │ ├── AoiNavOrgSelector.vue │ │ │ │ └── AoiNotFound.vue │ │ │ ├── app │ │ │ │ ├── AppList.vue │ │ │ │ ├── AppSettingsInput.vue │ │ │ │ └── types.ts │ │ │ ├── common │ │ │ │ ├── CommonTagDialog.ts │ │ │ │ ├── CommonTagDialog.vue │ │ │ │ ├── RuleEditor.vue │ │ │ │ └── RulesEditor.vue │ │ │ ├── contest │ │ │ │ ├── ContestList.vue │ │ │ │ ├── ContestProblemIdInput.vue │ │ │ │ ├── ContestProblemRecommender.vue │ │ │ │ ├── ContestProblemSettingsInput.vue │ │ │ │ ├── ContestProgressBar.ts │ │ │ │ ├── ContestProgressBar.vue │ │ │ │ ├── ContestStageActionInput.vue │ │ │ │ ├── ContestStageChip.vue │ │ │ │ ├── ContestStageSettingsInput.vue │ │ │ │ ├── ContestStageTagRulesInput.vue │ │ │ │ ├── ContestTabs.vue │ │ │ │ ├── ProblemJumpBtn.vue │ │ │ │ ├── ProblemTabAdmin.vue │ │ │ │ ├── ProblemTabAttachments.vue │ │ │ │ ├── RanklistExportBtn.vue │ │ │ │ ├── RanklistExportBtnV2.vue │ │ │ │ ├── RanklistPublicSettings.vue │ │ │ │ ├── RanklistPublicSettingsInput.vue │ │ │ │ ├── RanklistRenderer.ts │ │ │ │ ├── RanklistRenderer.vue │ │ │ │ ├── RanklistSettings.vue │ │ │ │ ├── RanklistSettingsInput.vue │ │ │ │ ├── RanklistTopstars.vue │ │ │ │ ├── RanklistViewer.vue │ │ │ │ └── types.ts │ │ │ ├── group │ │ │ │ └── types.ts │ │ │ ├── homepage │ │ │ │ ├── AnnouncementsCard.vue │ │ │ │ ├── FriendLinksCard.vue │ │ │ │ ├── PlanCard.vue │ │ │ │ ├── PlanCardsWrapper.vue │ │ │ │ ├── PosterCarousel.vue │ │ │ │ ├── RecentContestsCard.vue │ │ │ │ ├── SearchBox.vue │ │ │ │ ├── SiteLogo.vue │ │ │ │ └── TimeLabel.vue │ │ │ ├── initial │ │ │ │ └── InitialPasswordInput.vue │ │ │ ├── instance │ │ │ │ ├── InstanceCreateBtn.ts │ │ │ │ ├── InstanceCreateBtn.vue │ │ │ │ ├── InstanceDeleteBtn.ts │ │ │ │ ├── InstanceDeleteBtn.vue │ │ │ │ ├── InstanceFilter.ts │ │ │ │ ├── InstanceFilter.vue │ │ │ │ ├── InstanceList.ts │ │ │ │ ├── InstanceList.vue │ │ │ │ ├── InstanceStateChip.vue │ │ │ │ └── types.ts │ │ │ ├── locale │ │ │ │ └── LocaleSelectBtn.vue │ │ │ ├── org │ │ │ │ ├── admin │ │ │ │ │ └── RunnerInfoInput.vue │ │ │ │ └── home │ │ │ │ │ ├── OrgInfoCard.vue │ │ │ │ │ ├── RecentContestsCard.vue │ │ │ │ │ └── RecentPlansCard.vue │ │ │ ├── plan │ │ │ │ ├── ContestTabAdmin.vue │ │ │ │ ├── PlanContestSettingsInput.vue │ │ │ │ ├── PlanList.vue │ │ │ │ ├── PlanSettingsInput.vue │ │ │ │ └── types.ts │ │ │ ├── problem │ │ │ │ ├── DataUpload.vue │ │ │ │ ├── ProblemList.vue │ │ │ │ ├── ProblemSettingsInput.vue │ │ │ │ ├── ProblemStatus.vue │ │ │ │ ├── ProblemSubmit.vue │ │ │ │ ├── ProblemTagGroup.vue │ │ │ │ ├── submit │ │ │ │ │ ├── SubmitDir.vue │ │ │ │ │ ├── SubmitFile.vue │ │ │ │ │ ├── SubmitForm.vue │ │ │ │ │ └── form │ │ │ │ │ │ ├── FormEditor.vue │ │ │ │ │ │ └── FormMetadata.vue │ │ │ │ └── types.ts │ │ │ ├── solution │ │ │ │ ├── SolutionDetails.vue │ │ │ │ ├── SolutionDetailsRenderer.vue │ │ │ │ ├── SolutionFilter.ts │ │ │ │ ├── SolutionFilter.vue │ │ │ │ ├── SolutionList.ts │ │ │ │ ├── SolutionList.vue │ │ │ │ ├── SolutionScoreDisplay.vue │ │ │ │ ├── SolutionStateChip.vue │ │ │ │ ├── SolutionStatus.ts │ │ │ │ ├── SolutionStatusChip.vue │ │ │ │ ├── SolutionView.ts │ │ │ │ ├── SolutionView.vue │ │ │ │ └── types.ts │ │ │ ├── user │ │ │ │ ├── UserAuth.vue │ │ │ │ ├── UserAuthIaaa.vue │ │ │ │ ├── UserAuthMail.vue │ │ │ │ ├── UserAuthPassword.vue │ │ │ │ ├── UserAuthSms.vue │ │ │ │ ├── UserAuthUaaa.vue │ │ │ │ ├── UserInfoBoard.vue │ │ │ │ ├── UserProfileInput.vue │ │ │ │ └── types.ts │ │ │ └── utils │ │ │ │ ├── AccessLevelBadge.vue │ │ │ │ ├── AccessLevelChip.vue │ │ │ │ ├── AccessLevelEditor.vue │ │ │ │ ├── AccessLevelInput.vue │ │ │ │ ├── AssociationEditor.vue │ │ │ │ ├── AsyncState.vue │ │ │ │ ├── CapabilityChips.vue │ │ │ │ ├── CapabilityInput.vue │ │ │ │ ├── DateTimeInput.vue │ │ │ │ ├── DownloadBtn.vue │ │ │ │ ├── HelpBtn.vue │ │ │ │ ├── IdInput.vue │ │ │ │ ├── JsonViewer.vue │ │ │ │ ├── LimitChips.vue │ │ │ │ ├── ListInput.vue │ │ │ │ ├── MarkdownEditor.vue │ │ │ │ ├── MarkdownRenderer.vue │ │ │ │ ├── MonacoEditor.vue │ │ │ │ ├── NotFound.vue │ │ │ │ ├── OptionalInput.vue │ │ │ │ ├── OrgProfile.vue │ │ │ │ ├── PrincipalInput.vue │ │ │ │ ├── PrincipalProfile.vue │ │ │ │ ├── RegisterBtn.vue │ │ │ │ ├── SettingsEditor.ts │ │ │ │ ├── SettingsEditor.vue │ │ │ │ ├── UserIdInput.vue │ │ │ │ └── zip │ │ │ │ ├── ZipAutoViewer.vue │ │ │ │ ├── ZipFileViewer.vue │ │ │ │ └── ZipViewer.vue │ │ ├── layouts │ │ │ └── default │ │ │ │ ├── Default.vue │ │ │ │ └── View.vue │ │ ├── locales │ │ │ ├── en.yaml │ │ │ └── zh-Hans.yml │ │ ├── main.ts │ │ ├── pages │ │ │ ├── about.vue │ │ │ ├── admin.vue │ │ │ ├── admin │ │ │ │ ├── index.vue │ │ │ │ ├── misc.vue │ │ │ │ └── user.vue │ │ │ ├── announcement │ │ │ │ ├── [articleId].vue │ │ │ │ ├── [articleId] │ │ │ │ │ ├── edit.vue │ │ │ │ │ └── index.vue │ │ │ │ ├── index.vue │ │ │ │ └── new.vue │ │ │ ├── auth │ │ │ │ ├── login.vue │ │ │ │ ├── login │ │ │ │ │ ├── iaaa.vue │ │ │ │ │ ├── index.vue │ │ │ │ │ ├── mail.vue │ │ │ │ │ ├── password.vue │ │ │ │ │ └── uaaa.vue │ │ │ │ ├── verify.vue │ │ │ │ └── verify │ │ │ │ │ ├── iaaa.vue │ │ │ │ │ ├── index.vue │ │ │ │ │ ├── mail.vue │ │ │ │ │ ├── password.vue │ │ │ │ │ ├── sms.vue │ │ │ │ │ └── uaaa.vue │ │ │ ├── debug.vue │ │ │ ├── index.vue │ │ │ ├── initial.vue │ │ │ ├── oauth │ │ │ │ ├── authorize.vue │ │ │ │ └── device.vue │ │ │ ├── org │ │ │ │ ├── [orgId].vue │ │ │ │ ├── [orgId] │ │ │ │ │ ├── [...all].vue │ │ │ │ │ ├── admin.vue │ │ │ │ │ ├── admin │ │ │ │ │ │ ├── access.vue │ │ │ │ │ │ ├── batch-import.vue │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ ├── member.vue │ │ │ │ │ │ ├── runner.vue │ │ │ │ │ │ └── settings.vue │ │ │ │ │ ├── app │ │ │ │ │ │ ├── [appId].vue │ │ │ │ │ │ ├── [appId] │ │ │ │ │ │ │ ├── admin.vue │ │ │ │ │ │ │ ├── admin │ │ │ │ │ │ │ │ ├── access.vue │ │ │ │ │ │ │ │ ├── content.vue │ │ │ │ │ │ │ │ └── index.vue │ │ │ │ │ │ │ └── index.vue │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ ├── new.vue │ │ │ │ │ │ ├── search.vue │ │ │ │ │ │ └── tag │ │ │ │ │ │ │ └── [:tag].vue │ │ │ │ │ ├── contest │ │ │ │ │ │ ├── [contestId].vue │ │ │ │ │ │ ├── [contestId] │ │ │ │ │ │ │ ├── admin.vue │ │ │ │ │ │ │ ├── admin │ │ │ │ │ │ │ │ ├── access.vue │ │ │ │ │ │ │ │ ├── content.vue │ │ │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ │ │ ├── rule.vue │ │ │ │ │ │ │ │ └── stage.vue │ │ │ │ │ │ │ ├── attachment.vue │ │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ │ ├── instance.vue │ │ │ │ │ │ │ ├── participant.vue │ │ │ │ │ │ │ ├── participant │ │ │ │ │ │ │ │ ├── [userId].vue │ │ │ │ │ │ │ │ ├── admin.vue │ │ │ │ │ │ │ │ └── index.vue │ │ │ │ │ │ │ ├── problem.vue │ │ │ │ │ │ │ ├── problem │ │ │ │ │ │ │ │ ├── [problemId].vue │ │ │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ │ │ └── new.vue │ │ │ │ │ │ │ ├── ranklist.vue │ │ │ │ │ │ │ ├── ranklist │ │ │ │ │ │ │ │ ├── [ranklistKey].vue │ │ │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ │ │ └── new.vue │ │ │ │ │ │ │ ├── solution.vue │ │ │ │ │ │ │ └── solution │ │ │ │ │ │ │ │ ├── [solutionId].vue │ │ │ │ │ │ │ │ └── index.vue │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ ├── new.vue │ │ │ │ │ │ ├── search.vue │ │ │ │ │ │ └── tag │ │ │ │ │ │ │ └── [:tag].vue │ │ │ │ │ ├── group │ │ │ │ │ │ ├── [groupId].vue │ │ │ │ │ │ ├── [groupId] │ │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ │ ├── member.vue │ │ │ │ │ │ │ └── settings.vue │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ └── new.vue │ │ │ │ │ ├── index.vue │ │ │ │ │ ├── instance │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── plan │ │ │ │ │ │ ├── [planId].vue │ │ │ │ │ │ ├── [planId] │ │ │ │ │ │ │ ├── admin.vue │ │ │ │ │ │ │ ├── admin │ │ │ │ │ │ │ │ ├── access.vue │ │ │ │ │ │ │ │ ├── content.vue │ │ │ │ │ │ │ │ └── index.vue │ │ │ │ │ │ │ ├── contest.vue │ │ │ │ │ │ │ ├── contest │ │ │ │ │ │ │ │ ├── [contestId].vue │ │ │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ │ │ └── new.vue │ │ │ │ │ │ │ └── index.vue │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ ├── new.vue │ │ │ │ │ │ ├── search.vue │ │ │ │ │ │ └── tag │ │ │ │ │ │ │ └── [:tag].vue │ │ │ │ │ ├── problem │ │ │ │ │ │ ├── [problemId].vue │ │ │ │ │ │ ├── [problemId] │ │ │ │ │ │ │ ├── admin.vue │ │ │ │ │ │ │ ├── admin │ │ │ │ │ │ │ │ ├── access.vue │ │ │ │ │ │ │ │ ├── content.vue │ │ │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ │ │ └── rule.vue │ │ │ │ │ │ │ ├── attachment.vue │ │ │ │ │ │ │ ├── data.vue │ │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ │ ├── instance.vue │ │ │ │ │ │ │ ├── solution.vue │ │ │ │ │ │ │ ├── solution │ │ │ │ │ │ │ │ ├── [solutionId].vue │ │ │ │ │ │ │ │ └── index.vue │ │ │ │ │ │ │ └── submit.vue │ │ │ │ │ │ ├── index.vue │ │ │ │ │ │ ├── new.vue │ │ │ │ │ │ ├── search.vue │ │ │ │ │ │ └── tag │ │ │ │ │ │ │ └── [:tag].vue │ │ │ │ │ └── solution │ │ │ │ │ │ └── index.vue │ │ │ │ └── new.vue │ │ │ ├── rk │ │ │ │ ├── [ranklistId].vue │ │ │ │ └── [ranklistId] │ │ │ │ │ └── index.vue │ │ │ ├── signup.vue │ │ │ └── user │ │ │ │ ├── [userId].vue │ │ │ │ └── [userId] │ │ │ │ ├── index.vue │ │ │ │ └── settings.vue │ │ ├── plugins │ │ │ ├── i18n.ts │ │ │ ├── index.ts │ │ │ ├── toast.ts │ │ │ └── vuetify.ts │ │ ├── router │ │ │ └── index.ts │ │ ├── stores │ │ │ ├── app.ts │ │ │ └── index.ts │ │ ├── styles │ │ │ └── main.css │ │ ├── types │ │ │ ├── index.ts │ │ │ └── server.ts │ │ └── utils │ │ │ ├── admin │ │ │ └── version.ts │ │ │ ├── app │ │ │ └── inject.ts │ │ │ ├── async.ts │ │ │ ├── avatar.ts │ │ │ ├── build.ts │ │ │ ├── capability.ts │ │ │ ├── colors.ts │ │ │ ├── contest │ │ │ ├── action.ts │ │ │ ├── inject.ts │ │ │ ├── participant.ts │ │ │ └── problem │ │ │ │ └── inject.ts │ │ │ ├── editor.ts │ │ │ ├── files │ │ │ ├── hash.ts │ │ │ ├── hash.worker.ts │ │ │ └── index.ts │ │ │ ├── flags.ts │ │ │ ├── http.ts │ │ │ ├── markdown │ │ │ ├── alerts.ts │ │ │ ├── index.ts │ │ │ ├── katex.d.ts │ │ │ └── katex.js │ │ │ ├── menus.ts │ │ │ ├── monaco.ts │ │ │ ├── org │ │ │ └── runner.ts │ │ │ ├── pagination.ts │ │ │ ├── persist.ts │ │ │ ├── plan │ │ │ └── inject.ts │ │ │ ├── platform │ │ │ ├── index.ts │ │ │ └── stage1.ts │ │ │ ├── problem │ │ │ ├── data.ts │ │ │ ├── inject.ts │ │ │ └── submit.ts │ │ │ ├── profile.ts │ │ │ ├── slug.ts │ │ │ ├── solution │ │ │ └── index.ts │ │ │ ├── time.ts │ │ │ ├── title.ts │ │ │ └── user │ │ │ ├── email.ts │ │ │ ├── iaaa.ts │ │ │ ├── password.ts │ │ │ ├── sms.ts │ │ │ └── uaaa.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ ├── uno.config.ts │ └── vite.config.ts └── server │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── src │ ├── auth │ │ ├── base.ts │ │ ├── iaaa.ts │ │ ├── index.ts │ │ ├── mail.ts │ │ ├── password.ts │ │ ├── sms.ts │ │ └── uaaa.ts │ ├── cache │ │ ├── base.ts │ │ ├── index.ts │ │ ├── mongo.ts │ │ └── redis.ts │ ├── cli │ │ ├── index.ts │ │ └── updater.ts │ ├── db │ │ ├── announcement.ts │ │ ├── app.ts │ │ ├── common.ts │ │ ├── contest.ts │ │ ├── group.ts │ │ ├── index.ts │ │ ├── info.ts │ │ ├── instance.ts │ │ ├── org.ts │ │ ├── plan.ts │ │ ├── problem.ts │ │ ├── publicRanklist.ts │ │ ├── runner.ts │ │ ├── solution.ts │ │ └── user.ts │ ├── index.ts │ ├── oss │ │ ├── index.ts │ │ └── key.ts │ ├── routes │ │ ├── admin │ │ │ ├── index.ts │ │ │ └── user.ts │ │ ├── announcement │ │ │ ├── index.ts │ │ │ └── scoped.ts │ │ ├── app │ │ │ ├── admin.ts │ │ │ ├── index.ts │ │ │ ├── inject.ts │ │ │ └── scoped.ts │ │ ├── auth │ │ │ └── index.ts │ │ ├── common │ │ │ ├── access.ts │ │ │ ├── content.ts │ │ │ ├── files.ts │ │ │ ├── index.ts │ │ │ ├── rule.ts │ │ │ └── settings.ts │ │ ├── contest │ │ │ ├── admin.ts │ │ │ ├── attachment.ts │ │ │ ├── index.ts │ │ │ ├── inject.ts │ │ │ ├── participant │ │ │ │ └── index.ts │ │ │ ├── problem │ │ │ │ ├── admin.ts │ │ │ │ ├── common.ts │ │ │ │ └── index.ts │ │ │ ├── ranklist │ │ │ │ ├── admin.ts │ │ │ │ └── index.ts │ │ │ ├── scoped.ts │ │ │ └── solution │ │ │ │ └── index.ts │ │ ├── group │ │ │ ├── index.ts │ │ │ └── scoped.ts │ │ ├── index.ts │ │ ├── info │ │ │ └── index.ts │ │ ├── instance │ │ │ ├── index.ts │ │ │ └── scoped.ts │ │ ├── oauth │ │ │ ├── device.ts │ │ │ ├── githubCompat.ts │ │ │ ├── iaaaCompat.ts │ │ │ └── index.ts │ │ ├── org │ │ │ ├── admin │ │ │ │ ├── index.ts │ │ │ │ ├── member.ts │ │ │ │ └── runner.ts │ │ │ ├── index.ts │ │ │ ├── inject.ts │ │ │ └── scoped.ts │ │ ├── plan │ │ │ ├── admin.ts │ │ │ ├── contest │ │ │ │ ├── admin.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── inject.ts │ │ │ └── scoped.ts │ │ ├── plugins │ │ │ ├── auth.ts │ │ │ ├── health.ts │ │ │ ├── index.ts │ │ │ ├── inject.ts │ │ │ └── ratelimit.ts │ │ ├── problem │ │ │ ├── admin.ts │ │ │ ├── attachment.ts │ │ │ ├── data.ts │ │ │ ├── index.ts │ │ │ ├── inject.ts │ │ │ ├── scoped.ts │ │ │ └── solution.ts │ │ ├── public │ │ │ └── index.ts │ │ ├── pubrk │ │ │ ├── index.ts │ │ │ └── scoped.ts │ │ ├── runner │ │ │ ├── index.ts │ │ │ ├── inject.ts │ │ │ ├── instance.ts │ │ │ ├── ranklist.ts │ │ │ └── solution.ts │ │ ├── solution │ │ │ ├── index.ts │ │ │ └── scoped.ts │ │ └── user │ │ │ ├── index.ts │ │ │ └── scoped.ts │ ├── schemas │ │ ├── api.ts │ │ ├── app.ts │ │ ├── common.ts │ │ ├── contest.ts │ │ ├── formats.ts │ │ ├── group.ts │ │ ├── index.ts │ │ ├── org.ts │ │ ├── plan.ts │ │ ├── problem.ts │ │ └── user.ts │ ├── server │ │ ├── index.ts │ │ └── schemas.ts │ └── utils │ │ ├── capability.ts │ │ ├── config.ts │ │ ├── index.ts │ │ ├── inject.ts │ │ ├── logger.ts │ │ ├── module.ts │ │ ├── package.ts │ │ ├── pagination.ts │ │ ├── rule.ts │ │ ├── search.ts │ │ └── types.ts │ ├── tsconfig.json │ └── tsconfig.package.json ├── docker ├── compose │ └── server │ │ └── docker-compose.yml └── dockerfiles │ └── server.dockerfile ├── docs ├── .vitepress │ ├── config.mts │ └── theme │ │ ├── custom.css │ │ └── index.ts ├── admin-guide.md ├── basic-concepts.md ├── dev-guide.md ├── en │ ├── admin-guide.md │ ├── dev-guide.md │ ├── getting-started.md │ └── index.md ├── getting-started.md ├── index.md ├── public │ ├── favicon.ico │ └── logo.svg ├── rule.md └── user-guide.md ├── libs ├── README.md ├── common │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── src │ │ ├── index.ts │ │ └── schemas │ │ │ ├── index.ts │ │ │ ├── problem.ts │ │ │ ├── ranklist.ts │ │ │ └── solution.ts │ └── tsconfig.json └── rule │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── src │ ├── index.spec.ts │ └── index.ts │ └── tsconfig.json ├── manifest.yml ├── package.json ├── scripts ├── local │ └── .gitkeep └── publish.mjs └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | 7 | [*.{js,json,yml}] 8 | charset = utf-8 9 | indent_style = space 10 | indent_size = 2 11 | -------------------------------------------------------------------------------- /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | env: 2 | browser: true 3 | es2021: true 4 | node: true 5 | extends: 6 | - eslint:recommended 7 | - plugin:@typescript-eslint/recommended 8 | - plugin:import/recommended 9 | - plugin:import/typescript 10 | - prettier 11 | parser: '@typescript-eslint/parser' 12 | parserOptions: 13 | ecmaVersion: latest 14 | sourceType: module 15 | plugins: 16 | - '@typescript-eslint' 17 | rules: 18 | '@typescript-eslint/no-empty-interface': 19 | - 'error' 20 | - allowSingleExtends: true 21 | 'import/order': 22 | - 'error' 23 | - alphabetize: 24 | order: 'asc' 25 | caseInsensitive: true 26 | newlines-between: always 27 | 'import/no-unresolved': 'off' 28 | settings: 29 | import/resolver: 30 | typescript: true 31 | node: true 32 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | /.yarn/** linguist-vendored 2 | /.yarn/releases/* binary 3 | /.yarn/plugins/**/* binary 4 | /.pnp.* binary linguist-generated 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | --- 8 | 9 | **Describe the bug** 10 | 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | 15 | Steps to reproduce the behavior: 16 | 17 | 1. Go to '...' 18 | 2. Click on '....' 19 | 3. Scroll down to '....' 20 | 4. See error 21 | 22 | **Expected behavior** 23 | 24 | A clear and concise description of what you expected to happen. 25 | 26 | **Screenshots** 27 | 28 | If applicable, add screenshots to help explain your problem. 29 | 30 | **Desktop (please complete the following information):** 31 | 32 | - OS: [e.g. Windows 11] 33 | - Browser [e.g. Google Chrome 122.0.0.0] 34 | - Version [e.g. v1.0.10] 35 | 36 | **Smartphone (please complete the following information):** 37 | 38 | - Device: [e.g. Samsung Galaxy S23 Ultra] 39 | - OS: [e.g. OneUI 6.0] 40 | - Browser [e.g. Chrome 122.0.0.0] 41 | - Version [e.g. v1.0.10] 42 | 43 | **Additional context** 44 | 45 | Add any other context about the problem here. 46 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | --- 8 | 9 | **Is your feature request related to a problem? Please describe.** 10 | 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | 15 | A clear and concise description of what you want to happen. 16 | 17 | **Describe alternatives you've considered** 18 | 19 | A clear and concise description of any alternative solutions or features you've considered. 20 | 21 | **Additional context** 22 | 23 | Add any other context or screenshots about the feature request here. 24 | -------------------------------------------------------------------------------- /.github/workflows/check.yaml: -------------------------------------------------------------------------------- 1 | name: Code Checks 2 | 3 | on: 4 | push: 5 | branches: ['main'] 6 | pull_request: 7 | branches: ['main'] 8 | 9 | jobs: 10 | check: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 0 17 | 18 | - name: Setup Node 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version-file: '.nvmrc' 22 | 23 | - name: Get yarn cache directory path 24 | id: yarn-cache-dir-path 25 | run: echo "dir=$(corepack yarn config get cacheFolder)" >> $GITHUB_OUTPUT 26 | 27 | - uses: actions/cache@v4 28 | id: yarn-cache 29 | with: 30 | path: ${{ steps.yarn-cache-dir-path.outputs.dir }} 31 | key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} 32 | restore-keys: | 33 | ${{ runner.os }}-yarn- 34 | 35 | - name: Install dependencies 36 | run: corepack yarn 37 | 38 | - name: Check version policies 39 | if: github.event_name == 'pull_request' 40 | run: corepack yarn version check 41 | 42 | - name: Build packages 43 | run: corepack yarn workspaces foreach -Ap --topological-dev --exclude @aoi-js/frontend run build 44 | 45 | - name: Run checks 46 | run: corepack yarn all:check 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .yarn/* 2 | !.yarn/patches 3 | !.yarn/plugins 4 | !.yarn/releases 5 | !.yarn/sdks 6 | !.yarn/versions 7 | 8 | # Swap the comments on the following lines if you don't wish to use zero-installs 9 | # Documentation here: https://yarnpkg.com/features/zero-installs 10 | # !.yarn/cache 11 | .pnp.* 12 | node_modules 13 | 14 | *.tsbuildinfo 15 | package.tgz 16 | 17 | /scripts/local/* 18 | !/scripts/local/.gitkeep 19 | 20 | docs/.vitepress/dist 21 | docs/.vitepress/cache 22 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | corepack yarn git:precommit 5 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v22.12.0 2 | -------------------------------------------------------------------------------- /.prettierrc.yml: -------------------------------------------------------------------------------- 1 | singleQuote: true 2 | semi: false 3 | printWidth: 100 4 | trailingComma: none 5 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "unocss.root": [ 3 | "apps/frontend" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | compressionLevel: mixed 2 | 3 | nodeLinker: node-modules 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
{{ item.raw._id }}
20 |
8 | /{{ scoreScale }}
9 |
)
11 |
12 | {{ article.title }}
6 |{{ fmtDate(article.date) }}
7 |{{ t('iaaa-wait') }}
5 |