Compare commits

..

13 Commits

Author SHA1 Message Date
dependabot[bot]
1639f9b8a3
chore(deps): bump node-forge from 1.3.1 to 1.3.2 (#696)
Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.3.1 to 1.3.2.
- [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md)
- [Commits](https://github.com/digitalbazaar/forge/compare/v1.3.1...v1.3.2)

---
updated-dependencies:
- dependency-name: node-forge
  dependency-version: 1.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-11 00:07:25 +09:00
skinmaker1345
cc9327d3cc chore: bump version to 2.12.2 2025-10-18 22:40:23 +09:00
SKINMAKER
1325a1212e
feat: add review guide (#694) 2025-10-18 22:24:13 +09:00
dependabot[bot]
1e975586f8
chore(deps): bump next from 14.2.30 to 14.2.32 (#690)
Bumps [next](https://github.com/vercel/next.js) from 14.2.30 to 14.2.32.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v14.2.30...v14.2.32)

---
updated-dependencies:
- dependency-name: next
  dependency-version: 14.2.32
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-18 22:22:21 +09:00
SKINMAKER
925b0bd98e
feat: improve category description (#693) 2025-10-18 22:12:52 +09:00
skinmaker1345
3d0300806a test: downgrade dd-trace to 5.24 2025-08-20 23:31:45 +09:00
skinmaker1345
5c1b8852d8 chore: bump version 2025-08-20 21:56:04 +09:00
dependabot[bot]
7a1a2d6828
chore(deps): bump next from 14.2.26 to 14.2.30 (#685)
Bumps [next](https://github.com/vercel/next.js) from 14.2.26 to 14.2.30.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v14.2.26...v14.2.30)

---
updated-dependencies:
- dependency-name: next
  dependency-version: 14.2.30
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-20 21:48:51 +09:00
SKINMAKER
51aa8e39e7
feat: 강제사항 명시 UX 개선 (#689)
* feat: add none to enforcement entries

* chore: clarify join enforced description

* feat: add constant for enforcements

* fix: do not filter none

* fix: do not show message when none is set

* style: fix lint

* chore: explicit next of dd-trace

* chore: improve wordings for join enforcements

* chore: clarify join enforced
2025-08-20 21:43:17 +09:00
skinmaker1345
8a96148245 chore: bump version 2025-07-05 22:19:04 +09:00
SKINMAKER
218e7909b3
feat: 강제사항 명시 (#687)
* feat: add enforcements field

* feat: add alert page

* chore: specify enforcement description

* fix: do not send vanity log when no changes are made

* chore: add license related enforcements

* fix: typo

* refactor: make botEnforcements more maintainable

* refactor: do not filter keys to display enforcements

* fix: typo
2025-07-05 22:18:06 +09:00
SKINMAKER
843e4137cb
fix: remove possiblity of duplicated instance of DataLoader (#688) 2025-06-30 08:55:44 +09:00
skinmaker1345
9aaf66018f fix: remove authorization check to /servers/:id/owners 2025-06-22 00:12:56 +09:00
15 changed files with 351 additions and 159 deletions

View File

@ -21,7 +21,7 @@ const Label: React.FC<LabelProps> = ({
<span className='align-text-top text-base font-semibold text-red-500'> *</span>
)}
</h3>
{labelDesc}
<span className='whitespace-pre-line'>{labelDesc}</span>
</div>
)}
<div className={short ? 'col-span-1' : 'col-span-3'}>

View File

@ -109,7 +109,10 @@ const Select: React.FC<SelectProps> = ({
onChange={handleChange}
onBlur={handleTouch}
noOptionsMessage={() => '검색 결과가 없습니다.'}
value={values.map((el) => ({ label: el, value: el }))}
value={values.map((el) => ({
label: Object.values(options).find(({ value }) => value === el)?.label || el,
value: el,
}))}
components={{
MultiValue,
MultiValueRemove,

View File

@ -7,5 +7,6 @@ export async function register() {
version: packageJson.version,
env: process.env.DD_ENV,
})
tracer.use('next')
}
}

View File

@ -1,6 +1,6 @@
{
"name": "koreanbots",
"version": "2.11.0",
"version": "2.12.2",
"private": true,
"scripts": {
"dev": "next dev",
@ -28,7 +28,7 @@
"csrf": "3.1.0",
"dataloader": "2.2.2",
"dayjs": "^1.11.9",
"dd-trace": "^5.30.0",
"dd-trace": "5.24.0",
"difflib": "0.2.4",
"discord.js": "^14.12.1",
"emoji-mart": "3.0.1",
@ -42,7 +42,7 @@
"knex": "^2.4.0",
"mongoose": "6.13.6",
"mysql": "2.18.1",
"next": "^14.2.26",
"next": "^14.2.32",
"next-connect": "0.10.1",
"next-pwa": "^5.6.0",
"next-seo": "^6.1.0",

View File

@ -10,7 +10,7 @@ import HCaptcha from '@hcaptcha/react-hcaptcha'
import { get } from '@utils/Query'
import { cleanObject, parseCookie, redirectTo } from '@utils/Tools'
import { AddBotSubmit, AddBotSubmitSchema } from '@utils/Yup'
import { botCategories, botCategoryDescription, library } from '@utils/Constants'
import { botCategories, botCategoryDescription, botEnforcements, library } from '@utils/Constants'
import { getToken } from '@utils/Csrf'
import Fetch from '@utils/Fetch'
import { ResponseProps, SubmittedBot, Theme, User } from '@types'
@ -57,6 +57,7 @@ const AddBot: NextPage<AddBotProps> = ({ logged, user, csrfToken, theme }) => {
-
-
- ?`,
enforcements: [],
_csrf: csrfToken,
_captcha: 'captcha',
}
@ -175,6 +176,18 @@ const AddBot: NextPage<AddBotProps> = ({ logged, user, csrfToken, theme }) => {
.
</li>
<li>, API에 .</li>
<li>
{' '}
<Link
href='https://contents.koreanbots.dev/bot-review'
rel='noreferrer'
target='_blank'
className='text-blue-500 hover:text-blue-600'
>
</Link>
.
</li>
</ul>
</Message>
</div>
@ -186,8 +199,8 @@ const AddBot: NextPage<AddBotProps> = ({ logged, user, csrfToken, theme }) => {
<div className='flex items-center'>
<CheckBox name='agree' />
<strong className='ml-2 text-sm'>
,
.
,
.
</strong>
</div>
</Label>
@ -356,6 +369,44 @@ const AddBot: NextPage<AddBotProps> = ({ logged, user, csrfToken, theme }) => {
</Segment>
</Label>
<Divider />
<Label
For='enforcements'
label='필수 고지 내용'
labelDesc='내용에 해당하는 경우 필수로 선택해야 합니다.'
required
error={
errors.enforcements && touched.enforcements ? (errors.enforcements as string) : null
}
>
<Selects
options={Object.entries(botEnforcements)
.filter(([k]) => k === 'NONE' || !values.enforcements.includes('NONE'))
.map(([k, v]) => ({
label: v.label,
value: k,
}))}
handleChange={(values) => {
if (values.some((i) => i.value === 'NONE')) {
setFieldValue('enforcements', ['NONE'])
} else {
setFieldValue(
'enforcements',
values.map((v) => v.value)
)
}
}}
handleTouch={() => setFieldTouched('enforcements', true)}
values={values.enforcements ?? ([] as string[])}
setValues={(values) => {
if (values.includes('NONE')) {
setFieldValue('enforcements', ['NONE'])
} else {
setFieldValue('enforcements', values)
}
}}
/>
</Label>
<Divider />
<p className='mb-5 mt-2 text-base'>
<span className='font-semibold text-red-500'> *</span> =
</p>

View File

@ -246,28 +246,29 @@ const Bots = RequestHandler()
errors: ['다른 커스텀 URL로 다시 시도해주세요.'],
})
}
await webhookClients.internal.noticeLog.send({
embeds: [
{
title: '한디리 커스텀 URL 변경',
description: `봇: ${bot.name} - <@${bot.id}> ([${bot.id}](${KoreanbotsEndPoints.URL.bot(
bot.id
)}))`,
fields: [
{
name: '이전',
value: bot.vanity || '없음',
},
{
name: '이후',
value: validated.vanity || '없음',
},
],
color: Colors.Blue,
},
],
})
if (validated.vanity !== bot.vanity) {
await webhookClients.internal.noticeLog.send({
embeds: [
{
title: '한디리 커스텀 URL 변경',
description: `봇: ${bot.name} - <@${bot.id}> ([${
bot.id
}](${KoreanbotsEndPoints.URL.bot(bot.id)}))`,
fields: [
{
name: '이전',
value: bot.vanity || '없음',
},
{
name: '이후',
value: validated.vanity || '없음',
},
],
color: Colors.Blue,
},
],
})
}
}
const result = await update.bot(req.query.id, validated)
if (result === 0) return ResponseWrapper(res, { code: 400 })
@ -289,6 +290,7 @@ const Bots = RequestHandler()
category: JSON.stringify(bot.category),
vanity: bot.vanity,
banner: bot.banner,
enforcements: JSON.stringify(bot.enforcements),
bg: bot.bg,
},
{
@ -302,6 +304,7 @@ const Bots = RequestHandler()
category: JSON.stringify(validated.category),
vanity: validated.vanity,
banner: validated.banner,
enforcements: JSON.stringify(validated.enforcements),
bg: validated.bg,
}
)

View File

@ -5,10 +5,6 @@ import ResponseWrapper from '@utils/ResponseWrapper'
import { get } from '@utils/Query'
const ServerOwners = RequestHandler().get(async (req: GetApiRequest, res) => {
const auth = req.headers.authorization
? await get.BotAuthorization(req.headers.authorization)
: await get.Authorization(req.cookies.token)
if (!auth) return ResponseWrapper(res, { code: 401 })
const owners = await get.serverOwners(req.query.id)
if (!owners) return ResponseWrapper(res, { code: 404 })
return ResponseWrapper(res, { code: 200, data: owners })

View File

@ -9,9 +9,16 @@ import { ParsedUrlQuery } from 'querystring'
import { getJosaPicker } from 'josa'
import { get } from '@utils/Query'
import { checkBotFlag, checkUserFlag, cleanObject, makeBotURL, parseCookie, redirectTo } from '@utils/Tools'
import {
checkBotFlag,
checkUserFlag,
cleanObject,
makeBotURL,
parseCookie,
redirectTo,
} from '@utils/Tools'
import { ManageBot, getManageBotSchema } from '@utils/Yup'
import { botCategories, botCategoryDescription, library } from '@utils/Constants'
import { botCategories, botCategoryDescription, botEnforcements, library } from '@utils/Constants'
import { Bot, Theme, User } from '@types'
import { getToken } from '@utils/Csrf'
import Fetch from '@utils/Fetch'
@ -82,6 +89,7 @@ const ManageBotPage: NextPage<ManageBotProps> = ({ bot, user, csrfToken, theme }
prefix: bot.prefix,
library: bot.lib,
category: bot.category,
enforcements: bot.enforcements,
intro: bot.intro,
desc: bot.desc,
website: bot.web,
@ -98,8 +106,12 @@ const ManageBotPage: NextPage<ManageBotProps> = ({ bot, user, csrfToken, theme }
>
{({ errors, touched, values, setFieldTouched, setFieldValue }) => (
<Form>
<div className='text-center md:flex md:text-left'>
<DiscordAvatar userID={bot.id} className='mx-auto rounded-full md:mx-1' hash={bot.avatar}/>
<div className='text-ceznter md:flex md:text-left'>
<DiscordAvatar
userID={bot.id}
className='mx-auto rounded-full md:mx-1'
hash={bot.avatar}
/>
<div className='px-8 py-6 md:w-2/3'>
<h1 className='text-3xl font-bold'>
{bot.name}#{bot.tag}
@ -165,7 +177,11 @@ const ManageBotPage: NextPage<ManageBotProps> = ({ bot, user, csrfToken, theme }
error={errors.category && touched.category ? (errors.category as string) : null}
>
<Selects
options={botCategories.map((el) => ({ label: el, value: el, description: botCategoryDescription[el] }))}
options={botCategories.map((el) => ({
label: el,
value: el,
description: botCategoryDescription[el],
}))}
handleChange={(value) => {
setFieldValue(
'category',
@ -273,24 +289,26 @@ const ManageBotPage: NextPage<ManageBotProps> = ({ bot, user, csrfToken, theme }
<Markdown text={values.desc} />
</Segment>
</Label>
{
isPerkAvailable && (
<>
{isPerkAvailable && (
<>
<Divider />
<h2 className='pt-2 text-2xl font-semibold text-koreanbots-green'> </h2>
<span className='mt-1 text-sm text-gray-400'> . ( URL과 / .)</span>
<h2 className='pt-2 text-2xl font-semibold text-koreanbots-green'>
</h2>
<span className='mt-1 text-sm text-gray-400'>
. ( URL과 /
.)
</span>
<Label
For='vanity'
label='한디리 커스텀 URL'
labelDesc='고유한 커스텀 URL을 설정해주세요.'
error={errors.vanity && touched.vanity ? errors.vanity : null}
>
<div className='flex items-center'>
koreanbots.dev/bots/
<Input name='vanity' placeholder='koreanbots' />
</div>
</Label>
<Label
For='banner'
@ -308,9 +326,46 @@ const ManageBotPage: NextPage<ManageBotProps> = ({ bot, user, csrfToken, theme }
>
<Input name='bg' placeholder='https://koreanbots.dev/logo.png' />
</Label>
</>
)
}
</>
)}
<Divider />
<Label
For='enforcements'
label='필수 고지 내용'
labelDesc='내용에 해당하는 경우 필수로 선택해야 합니다.'
required
error={
errors.enforcements && touched.enforcements ? (errors.enforcements as string) : null
}
>
<Selects
options={Object.entries(botEnforcements)
.filter(([k]) => k === 'NONE' || !values.enforcements.includes('NONE'))
.map(([k, v]) => ({
label: v.label,
value: k,
}))}
handleChange={(values) => {
if (values.some((i) => i.value === 'NONE')) {
setFieldValue('enforcements', ['NONE'])
} else {
setFieldValue(
'enforcements',
values.map((v) => v.value)
)
}
}}
handleTouch={() => setFieldTouched('enforcements', true)}
values={values.enforcements ?? ([] as string[])}
setValues={(values) => {
if (values.includes('NONE')) {
setFieldValue('enforcements', ['NONE'])
} else {
setFieldValue('enforcements', values)
}
}}
/>
</Label>
<Divider />
<p className='mb-5 mt-2 text-base'>
<span className='font-semibold text-red-500'> *</span> =
@ -320,7 +375,6 @@ const ManageBotPage: NextPage<ManageBotProps> = ({ bot, user, csrfToken, theme }
<i className='far fa-save' />
</>
</Button>
</Form>
)}
</Formik>

View File

@ -11,7 +11,7 @@ import { SnowflakeUtil } from 'discord.js'
import { ParsedUrlQuery } from 'querystring'
import { Bot, ResponseProps, Theme, User } from '@types'
import { git, KoreanbotsEndPoints, reportCats, Status } from '@utils/Constants'
import { botEnforcements, git, KoreanbotsEndPoints, reportCats, Status } from '@utils/Constants'
import { get } from '@utils/Query'
import Day from '@utils/Day'
import { ReportSchema } from '@utils/Yup'
@ -116,13 +116,29 @@ const Bots: NextPage<BotsProps> = ({ data, desc, date, user, theme, csrfToken })
.
</p>
</Message>
) : data.enforcements.filter((i) => i !== 'NONE').length > 0 ? (
<Message type='warning'>
<h2 className='text-lg font-extrabold'> .</h2>
<p>
{data.enforcements
.filter((i) => i !== 'NONE')
.map((i) => (
<li key={i}>{botEnforcements[i].description}</li>
))}
</p>
</Message>
) : (
''
)}
</div>
<div className='w-full lg:flex'>
<div className='w-full text-center lg:w-2/12'>
<DiscordAvatar userID={data.id} size={256} className='w-full rounded-full' hash={data.avatar}/>
<DiscordAvatar
userID={data.id}
size={256}
className='w-full rounded-full'
hash={data.avatar}
/>
</div>
<div className='w-full grow px-5 py-12 text-center lg:w-5/12 lg:text-left'>
<Tag
@ -158,7 +174,7 @@ const Bots: NextPage<BotsProps> = ({ data, desc, date, user, theme, csrfToken })
</p>
</div>
<div className='w-full lg:w-1/4'>
{(data.state === 'ok' && !checkBotFlag(data.flags, 'private')) && (
{data.state === 'ok' && !checkBotFlag(data.flags, 'private') && (
<LongButton newTab href={`/bots/${router.query.id}/invite`}>
<h4 className='whitespace-nowrap'>
<i className='fas fa-user-plus text-discord-blurple' />

2
types/global.d.ts vendored
View File

@ -2,6 +2,7 @@
import * as Yup from 'yup'
import { Client } from 'discord.js'
import NotificationManager from '@utils/NotificationManager'
import { CacheManager } from '@utils/Query'
declare global {
interface Window {
@ -14,6 +15,7 @@ declare global {
var kodl: Client
var serverlist: Client
var notification: NotificationManager
var get: CacheManager
interface Navigator {
standalone?: boolean
}

View File

@ -1,9 +1,12 @@
import { botEnforcements } from '@utils/Constants'
import type { GuildFeature } from 'discord.js'
import type { IncomingMessage } from 'http'
import type { NextPageContext } from 'next'
export type Nullable<T> = T | null
export type ValueOf<T> = T[keyof T]
export interface Bot {
id: string
name: string
@ -25,11 +28,14 @@ export interface Bot {
url: string | null
discord: string | null
vanity: string | null
enforcements: BotEnforcementKeys[]
bg: string
banner: string
owners: User[] | string[]
}
export type BotEnforcementKeys = keyof typeof botEnforcements
export interface RawGuild {
id: string
name: string

View File

@ -102,7 +102,7 @@ export const botCategoryDescription = {
: '게임 유저 전적이나 게임 정보 등 여러 전적에 대해 다룹니다.',
: '봇에 자체적인 게임 콘텐츠가 있습니다.',
: '봇 내 가상 재화를 이용해 도박을 할 수 있습니다.',
: '유저의 출입, 메시지 수정 / 삭제 등을 로그로 남길 수 있습니다.',
: '유저의 출입, 메시지 수정 / 삭제 등 각종 기록을 디스코드 채널에 남길 수 있습니다.',
'빗금 명령어': '메시지 기반이 아닌 빗금 명령어를 사용합니다.',
'웹 대시보드': '웹사이트를 통해 봇을 조작할 수 있습니다.',
: '각종 밈을 다루고 있습니다.',
@ -120,6 +120,29 @@ export const botCategoryDescription = {
: '게임 "마인크래프트"에 관련된 기능을 다룹니다.',
}
export const botEnforcements = {
NONE: {
label: '해당사항이 없습니다.',
description: '',
},
JOIN_PARTIALLY_ENFORCED: {
label: '지정된 서버에 참여해야만 사용이 가능한 기능이 있습니다',
description: '봇의 일부 명령어는 봇이 지정한 특정 디스코드 서버에 참여해야 사용할 수 있습니다.',
},
JOIN_ENFORCED: {
label: '지정된 서버에 참여하지 않으면 봇의 핵심 기능을 사용할 수 없습니다',
description: '봇의 핵심 기능은 봇이 지정한 특정 디스코드 서버에 참여해야 사용할 수 있습니다.',
},
LICENSE_PARTIALLY_ENFORCED: {
label: '유료 구매가 필요한 기능이 있습니다',
description: '봇의 일부 명령어는 유료 구매가 필요합니다.',
},
LICENSE_ENFORCED: {
label: '유료 구매 없이는 봇의 핵심 기능을 사용할 수 없습니다',
description: '유료 구매 없이는 봇의 핵심 기능을 사용할 수 없습니다.',
},
} as const
export const botCategoryIcon = {
: 'fas fa-cogs',
: 'fas fa-music',

View File

@ -62,6 +62,7 @@ async function getBot(id: string, topLevel = true): Promise<Bot> {
'bots.status',
'bots.trusted',
'bots.partnered',
'bots.enforcements',
'bots.discord',
'bots.state',
'bots.vanity',
@ -102,7 +103,7 @@ async function getBot(id: string, topLevel = true): Promise<Bot> {
res.owners = JSON.parse(res.owners)
res.banner = res.banner ? camoUrl(res.banner) : null
res.bg = res.bg ? camoUrl(res.bg) : null
res.enforcements = JSON.parse(res.enforcements ?? '[]')
if (discordBot.flags.bitfield & UserFlags.BotHTTPInteractions) {
res.status = 'online'
} else if (botMember) {
@ -448,6 +449,7 @@ async function getBotSubmit(id: string, date: number): Promise<SubmittedBot> {
'id',
'date',
'category',
'enforcements',
'lib',
'prefix',
'intro',
@ -463,6 +465,7 @@ async function getBotSubmit(id: string, date: number): Promise<SubmittedBot> {
.where({ id, date })
if (res.length === 0) return null
res[0].category = JSON.parse(res[0].category)
res[0].enforcements = JSON.parse(res[0].enforcements || '[]')
res[0].owner = await get.user.load(res[0].owner)
return res[0]
}
@ -474,6 +477,7 @@ async function getBotSubmits(id: string): Promise<SubmittedBot[]> {
'id',
'date',
'category',
'enforcements',
'lib',
'prefix',
'intro',
@ -492,6 +496,7 @@ async function getBotSubmits(id: string): Promise<SubmittedBot[]> {
res = await Promise.all(
res.map(async (el) => {
el.category = JSON.parse(el.category)
el.enforcements = JSON.parse(el.enforcements)
el.owner = owner
return el
})
@ -636,6 +641,7 @@ async function submitBot(
git: data.git,
url: data.url,
category: JSON.stringify(data.category),
enforcements: JSON.stringify(data.enforcements),
discord: data.discord,
state: 0,
})
@ -745,6 +751,7 @@ async function updateBot(id: string, data: ManageBot): Promise<number> {
intro: data.intro,
desc: data.desc,
vanity: data.vanity,
enforcements: JSON.stringify(data.enforcements),
banner: data.banner,
bg: data.bg,
})
@ -1134,6 +1141,7 @@ async function approveBotSubmission(id: string, date: number) {
'id',
'date',
'category',
'enforcements',
'lib',
'prefix',
'intro',
@ -1160,6 +1168,7 @@ async function approveBotSubmission(id: string, date: number) {
web: data.web,
git: data.git,
category: data.category,
enforcements: data.enforcements,
discord: data.discord,
token: sign({ id }),
})
@ -1199,7 +1208,7 @@ async function viewBot(id: string) {
await Bots.findByIdAndUpdate(id, { $push: { viewMetrix: { count: 0 } } }, { upsert: true })
}
export const get = {
const _get = {
discord: {
user: new DataLoader(
async (ids: string[]) =>
@ -1414,6 +1423,14 @@ export const get = {
},
}
export type CacheManager = typeof _get
if (!global.get) {
global.get = _get
}
export const get = global.get
export const update = {
assignToken,
resetBotToken,

View File

@ -3,6 +3,7 @@ import YupKorean from 'yup-locales-ko'
import { ListType } from '@types'
import {
botCategories,
botEnforcements,
library,
reportCats,
reservedVanityBypass,
@ -174,6 +175,10 @@ export const AddBotSubmitSchema: Yup.SchemaOf<AddBotSubmit> = Yup.object({
.min(100, '봇 설명은 최소 100자여야합니다.')
.max(1500, '봇 설명은 최대 1500자여야합니다.')
.required('봇 설명은 필수 항목입니다.'),
enforcements: Yup.array(Yup.string().oneOf(Object.keys(botEnforcements)))
.min(1, '최소 한 개의 선택지를 선택해주세요.')
.unique('선택지는 중복될 수 없습니다.')
.required('강제사항 명시는 필수 선택사항입니다.'),
_csrf: Yup.string().required(),
_captcha: Yup.string().required(),
})
@ -190,6 +195,7 @@ export interface AddBotSubmit {
category: string | string[]
intro: string
desc: string
enforcements: string[]
_csrf: string
_captcha: string
}
@ -303,6 +309,10 @@ export function getManageBotSchema(perkAvailable = false) {
.min(100, '봇 설명은 최소 100자여야합니다.')
.max(1500, '봇 설명은 최대 1500자여야합니다.')
.required('봇 설명은 필수 항목입니다.'),
enforcements: Yup.array(Yup.string().oneOf(Object.keys(botEnforcements)))
.min(1, '최소 한 개의 선택지를 선택해주세요.')
.unique('선택지는 중복될 수 없습니다.')
.required('강제사항 명시는 필수 선택사항입니다.'),
_csrf: Yup.string().required(),
}
@ -349,6 +359,7 @@ export interface ManageBot {
desc: string
vanity: string
banner: string
enforcements: string[]
bg: string
_csrf: string
}

215
yarn.lock
View File

@ -2108,45 +2108,40 @@
resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016"
integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==
"@datadog/libdatadog@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@datadog/libdatadog/-/libdatadog-0.3.0.tgz#2fc1e2695872840bc8c356f66acf675da428d6f0"
integrity sha512-TbP8+WyXfh285T17FnLeLUOPl4SbkRYMqKgcmknID2mXHNrbt5XJgW9bnDgsrrtu31Q7FjWWw2WolgRLWyzLRA==
"@datadog/native-appsec@8.3.0":
version "8.3.0"
resolved "https://registry.yarnpkg.com/@datadog/native-appsec/-/native-appsec-8.3.0.tgz#91afd89d18d386be4da8a1b0e04500f2f8b5eb66"
integrity sha512-RYHbSJ/MwJcJaLzaCaZvUyNLUKFbMshayIiv4ckpFpQJDiq1T8t9iM2k7008s75g1vRuXfsRNX7MaLn4aoFuWA==
"@datadog/native-appsec@8.1.1":
version "8.1.1"
resolved "https://registry.yarnpkg.com/@datadog/native-appsec/-/native-appsec-8.1.1.tgz#76aa34697e6ecbd3d9ef7e6938d3cdcfa689b1f3"
integrity sha512-mf+Ym/AzET4FeUTXOs8hz0uLOSsVIUnavZPUx8YoKWK5lKgR2L+CLfEzOpjBwgFpDgbV8I1/vyoGelgGpsMKHA==
dependencies:
node-gyp-build "^3.9.0"
"@datadog/native-iast-rewriter@2.6.1":
version "2.6.1"
resolved "https://registry.yarnpkg.com/@datadog/native-iast-rewriter/-/native-iast-rewriter-2.6.1.tgz#5e5393628c73c57dcf08256299c0e8cf71deb14f"
integrity sha512-zv7cr/MzHg560jhAnHcO7f9pLi4qaYrBEcB+Gla0xkVouYSDsp8cGXIGG4fiGdAMHdt7SpDNS6+NcEAqD/v8Ig==
"@datadog/native-iast-rewriter@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@datadog/native-iast-rewriter/-/native-iast-rewriter-2.5.0.tgz#b613defe86e78168f750d1f1662d4ffb3cf002e6"
integrity sha512-WRu34A3Wwp6oafX8KWNAbedtDaaJO+nzfYQht7pcJKjyC2ggfPeF7SoP+eDo9wTn4/nQwEOscSR4hkJqTRlpXQ==
dependencies:
lru-cache "^7.14.0"
node-gyp-build "^4.5.0"
"@datadog/native-iast-taint-tracking@3.2.0":
version "3.2.0"
resolved "https://registry.yarnpkg.com/@datadog/native-iast-taint-tracking/-/native-iast-taint-tracking-3.2.0.tgz#9fb6823d82f934e12c06ea1baa7399ca80deb2ec"
integrity sha512-Mc6FzCoyvU5yXLMsMS9yKnEqJMWoImAukJXolNWCTm+JQYCMf2yMsJ8pBAm7KyZKliamM9rCn7h7Tr2H3lXwjA==
"@datadog/native-iast-taint-tracking@3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@datadog/native-iast-taint-tracking/-/native-iast-taint-tracking-3.1.0.tgz#7b2ed7f8fad212d65e5ab03bcdea8b42a3051b2e"
integrity sha512-rw6qSjmxmu1yFHVvZLXFt/rVq2tUZXocNogPLB8n7MPpA0jijNGb109WokWw5ITImiW91GcGDuBW6elJDVKouQ==
dependencies:
node-gyp-build "^3.9.0"
"@datadog/native-metrics@^3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@datadog/native-metrics/-/native-metrics-3.1.0.tgz#c2378841accd9fdd6866d0e49bdf6e3d76e79f22"
integrity sha512-yOBi4x0OQRaGNPZ2bx9TGvDIgEdQ8fkudLTFAe7gEM1nAlvFmbE5YfpH8WenEtTSEBwojSau06m2q7axtEEmCg==
"@datadog/native-metrics@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@datadog/native-metrics/-/native-metrics-2.0.0.tgz#65bf03313ee419956361e097551db36173e85712"
integrity sha512-YklGVwUtmKGYqFf1MNZuOHvTYdKuR4+Af1XkWcMD8BwOAjxmd9Z+97328rCOY8TFUJzlGUPaXzB8j2qgG/BMwA==
dependencies:
node-addon-api "^6.1.0"
node-gyp-build "^3.9.0"
"@datadog/pprof@5.4.1":
version "5.4.1"
resolved "https://registry.yarnpkg.com/@datadog/pprof/-/pprof-5.4.1.tgz#08c9bcf5d8efb2eeafdfc9f5bb5402f79fb41266"
integrity sha512-IvpL96e/cuh8ugP5O8Czdup7XQOLHeIDgM5pac5W7Lc1YzGe5zTtebKFpitvb1CPw1YY+1qFx0pWGgKP2kOfHg==
"@datadog/pprof@5.3.0":
version "5.3.0"
resolved "https://registry.yarnpkg.com/@datadog/pprof/-/pprof-5.3.0.tgz#c2f58d328ecced7f99887f1a559d7fe3aecb9219"
integrity sha512-53z2Q3K92T6Pf4vz4Ezh8kfkVEvLzbnVqacZGgcbkP//q0joFzO8q00Etw1S6NdnCX0XmX08ULaF4rUI5r14mw==
dependencies:
delay "^5.0.0"
node-gyp-build "<4.0"
@ -2917,11 +2912,6 @@
wrap-ansi "^8.1.0"
wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
"@isaacs/ttlcache@^1.4.1":
version "1.4.1"
resolved "https://registry.yarnpkg.com/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz#21fb23db34e9b6220c6ba023a0118a2dd3461ea2"
integrity sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==
"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
@ -3187,10 +3177,10 @@
dependencies:
sparse-bitfield "^3.0.3"
"@next/env@14.2.26":
version "14.2.26"
resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.26.tgz#5d55f72d2edb7246607c78f61e7d3ff21516bc2e"
integrity sha512-vO//GJ/YBco+H7xdQhzJxF7ub3SUwft76jwaeOyVVQFHCi5DCnkP16WHB+JBylo4vOKPoZBlR94Z8xBxNBdNJA==
"@next/env@14.2.32":
version "14.2.32"
resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.32.tgz#6d1107e2b7cc8649ff3730b8b46deb4e8a6d38fa"
integrity sha512-n9mQdigI6iZ/DF6pCTwMKeWgF2e8lg7qgt5M7HXMLtyhZYMnf/u905M18sSpPmHL9MKp9JHo56C6jrD2EvWxng==
"@next/eslint-plugin-next@13.4.7":
version "13.4.7"
@ -3199,50 +3189,50 @@
dependencies:
glob "7.1.7"
"@next/swc-darwin-arm64@14.2.26":
version "14.2.26"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.26.tgz#84b31a22149b2c49f5c5b29cddd7acb3a84d7e1c"
integrity sha512-zDJY8gsKEseGAxG+C2hTMT0w9Nk9N1Sk1qV7vXYz9MEiyRoF5ogQX2+vplyUMIfygnjn9/A04I6yrUTRTuRiyQ==
"@next/swc-darwin-arm64@14.2.32":
version "14.2.32"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.32.tgz#83482a7282df899b73d916e02b02a189771e706c"
integrity sha512-osHXveM70zC+ilfuFa/2W6a1XQxJTvEhzEycnjUaVE8kpUS09lDpiDDX2YLdyFCzoUbvbo5r0X1Kp4MllIOShw==
"@next/swc-darwin-x64@14.2.26":
version "14.2.26"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.26.tgz#50a5eb37972d313951f76f36f1f0b7100d063ebd"
integrity sha512-U0adH5ryLfmTDkahLwG9sUQG2L0a9rYux8crQeC92rPhi3jGQEY47nByQHrVrt3prZigadwj/2HZ1LUUimuSbg==
"@next/swc-darwin-x64@14.2.32":
version "14.2.32"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.32.tgz#1a9eb676a014e1fc999251f10288c25a0f81d6d1"
integrity sha512-P9NpCAJuOiaHHpqtrCNncjqtSBi1f6QUdHK/+dNabBIXB2RUFWL19TY1Hkhu74OvyNQEYEzzMJCMQk5agjw1Qg==
"@next/swc-linux-arm64-gnu@14.2.26":
version "14.2.26"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.26.tgz#c4278c157623b05886e37ff17194811aca1c2d00"
integrity sha512-SINMl1I7UhfHGM7SoRiw0AbwnLEMUnJ/3XXVmhyptzriHbWvPPbbm0OEVG24uUKhuS1t0nvN/DBvm5kz6ZIqpg==
"@next/swc-linux-arm64-gnu@14.2.32":
version "14.2.32"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.32.tgz#7713a49abd555d6f698e766b1631b67d881b4ee4"
integrity sha512-v7JaO0oXXt6d+cFjrrKqYnR2ubrD+JYP7nQVRZgeo5uNE5hkCpWnHmXm9vy3g6foMO8SPwL0P3MPw1c+BjbAzA==
"@next/swc-linux-arm64-musl@14.2.26":
version "14.2.26"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.26.tgz#5751132764b7a1f13a5a3fe447b03d564eb29705"
integrity sha512-s6JaezoyJK2DxrwHWxLWtJKlqKqTdi/zaYigDXUJ/gmx/72CrzdVZfMvUc6VqnZ7YEvRijvYo+0o4Z9DencduA==
"@next/swc-linux-arm64-musl@14.2.32":
version "14.2.32"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.32.tgz#327efdffe97e56f5389a7889cdedbd676fdbb519"
integrity sha512-tA6sIKShXtSJBTH88i0DRd6I9n3ZTirmwpwAqH5zdJoQF7/wlJXR8DkPmKwYl5mFWhEKr5IIa3LfpMW9RRwKmQ==
"@next/swc-linux-x64-gnu@14.2.26":
version "14.2.26"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.26.tgz#74312cac45704762faa73e0880be6549027303af"
integrity sha512-FEXeUQi8/pLr/XI0hKbe0tgbLmHFRhgXOUiPScz2hk0hSmbGiU8aUqVslj/6C6KA38RzXnWoJXo4FMo6aBxjzg==
"@next/swc-linux-x64-gnu@14.2.32":
version "14.2.32"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.32.tgz#a3e7444613d0fe5c8ea4ead08d6a9c818246758c"
integrity sha512-7S1GY4TdnlGVIdeXXKQdDkfDysoIVFMD0lJuVVMeb3eoVjrknQ0JNN7wFlhCvea0hEk0Sd4D1hedVChDKfV2jw==
"@next/swc-linux-x64-musl@14.2.26":
version "14.2.26"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.26.tgz#5d96464d71d2000ec704e650a1a86bb9d73f760d"
integrity sha512-BUsomaO4d2DuXhXhgQCVt2jjX4B4/Thts8nDoIruEJkhE5ifeQFtvW5c9JkdOtYvE5p2G0hcwQ0UbRaQmQwaVg==
"@next/swc-linux-x64-musl@14.2.32":
version "14.2.32"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.32.tgz#a2ec5b0a06c740d6740c938b1d4a614f1a13f018"
integrity sha512-OHHC81P4tirVa6Awk6eCQ6RBfWl8HpFsZtfEkMpJ5GjPsJ3nhPe6wKAJUZ/piC8sszUkAgv3fLflgzPStIwfWg==
"@next/swc-win32-arm64-msvc@14.2.26":
version "14.2.26"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.26.tgz#859472b532b11499b8f5c2237f54401456286913"
integrity sha512-5auwsMVzT7wbB2CZXQxDctpWbdEnEW/e66DyXO1DcgHxIyhP06awu+rHKshZE+lPLIGiwtjo7bsyeuubewwxMw==
"@next/swc-win32-arm64-msvc@14.2.32":
version "14.2.32"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.32.tgz#b4d3e47c6b276fc4711deb978d04015d029d198d"
integrity sha512-rORQjXsAFeX6TLYJrCG5yoIDj+NKq31Rqwn8Wpn/bkPNy5rTHvOXkW8mLFonItS7QC6M+1JIIcLe+vOCTOYpvg==
"@next/swc-win32-ia32-msvc@14.2.26":
version "14.2.26"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.26.tgz#e52e9bd0c43b7a469b03eda6d7a07c3d0c28f549"
integrity sha512-GQWg/Vbz9zUGi9X80lOeGsz1rMH/MtFO/XqigDznhhhTfDlDoynCM6982mPCbSlxJ/aveZcKtTlwfAjwhyxDpg==
"@next/swc-win32-ia32-msvc@14.2.32":
version "14.2.32"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.32.tgz#d1f1f854a1fbbaeefa8f81271437448653f33494"
integrity sha512-jHUeDPVHrgFltqoAqDB6g6OStNnFxnc7Aks3p0KE0FbwAvRg6qWKYF5mSTdCTxA3axoSAUwxYdILzXJfUwlHhA==
"@next/swc-win32-x64-msvc@14.2.26":
version "14.2.26"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.26.tgz#6f42a3ae16ae15c5c5e36efa9b7e291c86ab1275"
integrity sha512-2rdB3T1/Gp7bv1eQTTm9d1Y1sv9UuJ2LAwOE0Pe2prHKe32UNscj7YS13fRB37d0GAiGNR+Y7ZcW8YjDI8Ns0w==
"@next/swc-win32-x64-msvc@14.2.32":
version "14.2.32"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.32.tgz#8212d681cf6858a9e3204728f8f2b161000683ed"
integrity sha512-2N0lSoU4GjfLSO50wvKpMQgKd4HdI2UHEhQPPPnlgfBJlOgJxkjpkYBqzk08f1gItBB6xF/n+ykso2hgxuydsA==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@ -5113,25 +5103,24 @@ dc-polyfill@^0.1.4:
resolved "https://registry.yarnpkg.com/dc-polyfill/-/dc-polyfill-0.1.4.tgz#4118cec81a8fab9a5729c41c285c715ffa42495a"
integrity sha512-8iwEduR2jR9wWYggeaYtYZWRiUe3XZPyAQtMTL1otv8X3kfR8xUIVb4l5awHEeyDrH6Je7N324lKzMKlMMN6Yw==
dd-trace@^5.30.0:
version "5.30.0"
resolved "https://registry.yarnpkg.com/dd-trace/-/dd-trace-5.30.0.tgz#b81cf5f1e20822bee55bcb0dfe475578cea59faf"
integrity sha512-rKNuh/uLgGw3CjpBK5TkhSX/2ErVTO2/b+FQlgKXJSx/h7GFD8AzGEj3VKKAm1ANLLLjFqS9+ulLmFhgtxXsPg==
dd-trace@5.24.0:
version "5.24.0"
resolved "https://registry.yarnpkg.com/dd-trace/-/dd-trace-5.24.0.tgz#971fcb53edec4023619642a1716e063987bf0c00"
integrity sha512-KJX/2ZRShuNafNaUkcWPwbIdq4bU1HQ0FrhPJWgKvljwAtNETeRhjac9nEe1fH2A9fTCGg5XCXifvK9Wr5g4xQ==
dependencies:
"@datadog/libdatadog" "^0.3.0"
"@datadog/native-appsec" "8.3.0"
"@datadog/native-iast-rewriter" "2.6.1"
"@datadog/native-iast-taint-tracking" "3.2.0"
"@datadog/native-metrics" "^3.1.0"
"@datadog/pprof" "5.4.1"
"@datadog/native-appsec" "8.1.1"
"@datadog/native-iast-rewriter" "2.5.0"
"@datadog/native-iast-taint-tracking" "3.1.0"
"@datadog/native-metrics" "^2.0.0"
"@datadog/pprof" "5.3.0"
"@datadog/sketches-js" "^2.1.0"
"@isaacs/ttlcache" "^1.4.1"
"@opentelemetry/api" ">=1.0.0 <1.9.0"
"@opentelemetry/core" "^1.14.0"
crypto-randomuuid "^1.0.0"
dc-polyfill "^0.1.4"
ignore "^5.2.4"
import-in-the-middle "1.11.2"
int64-buffer "^0.1.9"
istanbul-lib-coverage "3.2.0"
jest-docblock "^29.7.0"
koalas "^1.0.2"
@ -5139,15 +5128,15 @@ dd-trace@^5.30.0:
lodash.sortby "^4.7.0"
lru-cache "^7.14.0"
module-details-from-path "^1.0.3"
msgpack-lite "^0.1.26"
opentracing ">=0.12.1"
path-to-regexp "^0.1.12"
path-to-regexp "^0.1.10"
pprof-format "^2.1.0"
protobufjs "^7.2.5"
retry "^0.13.1"
rfdc "^1.3.1"
semver "^7.5.4"
shell-quote "^1.8.1"
source-map "^0.7.4"
tlhunter-sorted-set "^0.1.0"
debug@4, debug@4.3.4, debug@4.x, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
@ -5887,6 +5876,11 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
event-lite@^0.1.1:
version "0.1.3"
resolved "https://registry.yarnpkg.com/event-lite/-/event-lite-0.1.3.tgz#3dfe01144e808ac46448f0c19b4ab68e403a901d"
integrity sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==
event-target-shim@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
@ -6752,7 +6746,7 @@ idb@7.1.1, idb@^7.0.1:
resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b"
integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==
ieee754@^1.1.13:
ieee754@^1.1.13, ieee754@^1.1.8:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
@ -6845,6 +6839,11 @@ install-artifact-from-github@^1.3.3:
resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.3.3.tgz#57d89bacfa0f47d7307fe41b6247cda9f9a8079c"
integrity sha512-x79SL0d8WOi1ZjXSTUqqs0GPQZ92YArJAN9O46wgU9wdH2U9ecyyhB9YGDbPe2OLV4ptmt6AZYRQZ2GydQZosQ==
int64-buffer@^0.1.9:
version "0.1.10"
resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-0.1.10.tgz#277b228a87d95ad777d07c13832022406a473423"
integrity sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA==
internal-slot@^1.0.3, internal-slot@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986"
@ -7117,7 +7116,7 @@ is-wsl@^2.2.0:
dependencies:
is-docker "^2.0.0"
isarray@~1.0.0:
isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
@ -8277,6 +8276,16 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
msgpack-lite@^0.1.26:
version "0.1.26"
resolved "https://registry.yarnpkg.com/msgpack-lite/-/msgpack-lite-0.1.26.tgz#dd3c50b26f059f25e7edee3644418358e2a9ad89"
integrity sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw==
dependencies:
event-lite "^0.1.1"
ieee754 "^1.1.8"
int64-buffer "^0.1.9"
isarray "^1.0.0"
mute-stream@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
@ -8355,12 +8364,12 @@ next-seo@^6.1.0:
resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-6.1.0.tgz#b60b06958cc77e7ed56f0a61b2d6cd0afed88ebb"
integrity sha512-iMBpFoJsR5zWhguHJvsoBDxDSmdYTHtnVPB1ij+CD0NReQCP78ZxxbdL9qkKIf4oEuZEqZkrjAQLB0bkII7RYA==
next@^14.2.26:
version "14.2.26"
resolved "https://registry.yarnpkg.com/next/-/next-14.2.26.tgz#b918b3fc5c55e1a67aada1347907675713687721"
integrity sha512-b81XSLihMwCfwiUVRRja3LphLo4uBBMZEzBBWMaISbKTwOmq3wPknIETy/8000tr7Gq4WmbuFYPS7jOYIf+ZJw==
next@^14.2.32:
version "14.2.32"
resolved "https://registry.yarnpkg.com/next/-/next-14.2.32.tgz#279b544f0c8ed023c33454ce4d563d3e05c2f3fb"
integrity sha512-fg5g0GZ7/nFc09X8wLe6pNSU8cLWbLRG3TZzPJ1BJvi2s9m7eF991se67wliM9kR5yLHRkyGKU49MMx58s3LJg==
dependencies:
"@next/env" "14.2.26"
"@next/env" "14.2.32"
"@swc/helpers" "0.5.5"
busboy "1.6.0"
caniuse-lite "^1.0.30001579"
@ -8368,15 +8377,15 @@ next@^14.2.26:
postcss "8.4.31"
styled-jsx "5.1.1"
optionalDependencies:
"@next/swc-darwin-arm64" "14.2.26"
"@next/swc-darwin-x64" "14.2.26"
"@next/swc-linux-arm64-gnu" "14.2.26"
"@next/swc-linux-arm64-musl" "14.2.26"
"@next/swc-linux-x64-gnu" "14.2.26"
"@next/swc-linux-x64-musl" "14.2.26"
"@next/swc-win32-arm64-msvc" "14.2.26"
"@next/swc-win32-ia32-msvc" "14.2.26"
"@next/swc-win32-x64-msvc" "14.2.26"
"@next/swc-darwin-arm64" "14.2.32"
"@next/swc-darwin-x64" "14.2.32"
"@next/swc-linux-arm64-gnu" "14.2.32"
"@next/swc-linux-arm64-musl" "14.2.32"
"@next/swc-linux-x64-gnu" "14.2.32"
"@next/swc-linux-x64-musl" "14.2.32"
"@next/swc-win32-arm64-msvc" "14.2.32"
"@next/swc-win32-ia32-msvc" "14.2.32"
"@next/swc-win32-x64-msvc" "14.2.32"
node-addon-api@^6.1.0:
version "6.1.0"
@ -8408,9 +8417,9 @@ node-fetch@^2.6.9, node-fetch@^2.7.0:
whatwg-url "^5.0.0"
node-forge@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
version "1.3.2"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.2.tgz#d0d2659a26eef778bf84d73e7f55c08144ee7750"
integrity sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==
node-gyp-build@<4.0, node-gyp-build@^3.9.0:
version "3.9.0"
@ -8780,7 +8789,7 @@ path-scurry@^1.7.0:
lru-cache "^9.1.1"
minipass "^5.0.0 || ^6.0.2"
path-to-regexp@^0.1.12:
path-to-regexp@^0.1.10:
version "0.1.12"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7"
integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==