diff --git a/lib/routes/500px/tribe-set.ts b/lib/routes/500px/tribe-set.ts index 57d6f7f06bb92b..c157f336940a7a 100644 --- a/lib/routes/500px/tribe-set.ts +++ b/lib/routes/500px/tribe-set.ts @@ -2,7 +2,6 @@ import { Route } from '@/types'; import { getCurrentPath } from '@/utils/helpers'; const __dirname = getCurrentPath(import.meta.url); -import cache from '@/utils/cache'; import { parseDate } from '@/utils/parse-date'; import { art } from '@/utils/render'; import path from 'node:path'; @@ -14,14 +13,6 @@ export const route: Route = { categories: ['picture'], example: '/500px/tribe/set/f5de0b8aa6d54ec486f5e79616418001', parameters: { id: '部落 ID' }, - features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, - }, name: '部落影集', maintainers: ['TonyRL'], handler, @@ -31,8 +22,8 @@ async function handler(ctx) { const id = ctx.req.param('id'); const limit = Number.parseInt(ctx.req.query('limit')) || 100; - const { tribe } = await getTribeDetail(id, cache.tryGet); - const tribeSets = await getTribeSets(id, limit, cache.tryGet); + const { tribe } = await getTribeDetail(id); + const tribeSets = await getTribeSets(id, limit); const items = tribeSets.map((item) => ({ title: item.title, diff --git a/lib/routes/500px/user.ts b/lib/routes/500px/user.ts deleted file mode 100644 index 1a4a9686e80fc8..00000000000000 --- a/lib/routes/500px/user.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Route } from '@/types'; -import { getCurrentPath } from '@/utils/helpers'; -const __dirname = getCurrentPath(import.meta.url); - -import cache from '@/utils/cache'; -import { art } from '@/utils/render'; -import { parseDate } from '@/utils/parse-date'; -import path from 'node:path'; -import { baseUrl, getUserInfoFromUsername, getUserInfoFromId, getUserWorks } from './utils'; - -export const route: Route = { - path: '/user/works/:id', - categories: ['picture'], - example: '/500px/user/works/hujunli', - parameters: { id: '摄影师 ID' }, - features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, - }, - radar: [ - { - source: ['500px.com.cn/:id', '500px.com.cn/community/user-details/:id', '500px.com.cn/community/user-details/:id/*'], - }, - ], - name: '摄影师作品', - maintainers: ['TonyRL'], - handler, -}; - -async function handler(ctx) { - let { id } = ctx.req.param(); - const limit = Number.parseInt(ctx.req.query('limit')) || 100; - - if (id.length !== 33) { - id = (await getUserInfoFromUsername(id, cache.tryGet)).id; - } - - const userInfo = await getUserInfoFromId(id, cache.tryGet); - const userWorks = await getUserWorks(id, limit, cache.tryGet); - - const items = userWorks.map((item) => ({ - title: item.title || '无题', - description: art(path.join(__dirname, 'templates/user.art'), { item }), - author: item.uploaderInfo.nickName, - pubDate: parseDate(item.createdTime, 'x'), - link: `${baseUrl}/community/photo-details/${item.id}`, - })); - - return { - title: userInfo.nickName, - description: userInfo.about, - image: userInfo.avatar.a1, - link: `${baseUrl}/${id}`, - item: items, - }; -} diff --git a/lib/routes/500px/utils.ts b/lib/routes/500px/utils.ts index a540a755d06f69..420f97a9f6f9f0 100644 --- a/lib/routes/500px/utils.ts +++ b/lib/routes/500px/utils.ts @@ -1,4 +1,5 @@ -import got from '@/utils/got'; +import ofetch from '@/utils/ofetch'; +import cache from '@/utils/cache'; import { load } from 'cheerio'; import { config } from '@/config'; @@ -24,39 +25,39 @@ const headers = { 'X-Tingyun-Id': `Fm3hXcTiLT8;r=${Date.now() % 1e8}`, }; -const getUserInfoFromUsername = (username, tryGet) => - tryGet(`500px:user:${username}`, async () => { - const { data } = await got(`${baseUrl}/${username}`); +const getUserInfoFromUsername = (username) => + cache.tryGet(`500px:user:${username}`, async () => { + const data = await ofetch(`${baseUrl}/${username}`); const $ = load(data); return JSON.parse( $('script[type="text/javascript"]') .text() - .match(/var cur_user = new Object\((.*?)\);/)[1] + .match(/var cur_user = new Object\((.*?)\);/)?.[1] || '{}' ); }); -const getUserInfoFromId = (id, tryGet) => - tryGet(`500px:user:indexInfo:${id}`, async () => { - const { data } = await got(`${baseUrl}/community/v2/user/indexInfo`, { +const getUserInfoFromId = (id) => + cache.tryGet(`500px:user:indexInfo:${id}`, async () => { + const data = await ofetch(`${baseUrl}/community/v2/user/indexInfo`, { headers: { ...headers, }, - searchParams: { + query: { queriedUserId: id, }, }); return data.data; }); -const getUserWorks = (id, limit, tryGet) => - tryGet( +const getUserWorks = (id, limit) => + cache.tryGet( `500px:user:profile:${id}`, async () => { - const { data } = await got(`${baseUrl}/community/v2/user/profile`, { + const data = await ofetch(`${baseUrl}/community/v2/user/profile`, { headers: { ...headers, }, - searchParams: { + query: { resourceType: '0,2,4', imgsize: 'p1,p2,p3,p4', queriedUserId: id, @@ -66,21 +67,21 @@ const getUserWorks = (id, limit, tryGet) => type: 'json', }, }); - return data.data; + return data; }, config.cache.routeExpire, false ); -const getTribeDetail = (id, tryGet) => - tryGet( +const getTribeDetail = (id) => + cache.tryGet( `500px:tribeDetail:${id}`, async () => { - const { data } = await got(`${baseUrl}/community/tribe/tribeDetail`, { + const data = await ofetch(`${baseUrl}/community/tribe/tribeDetail`, { headers: { ...headers, }, - searchParams: { + query: { tribeId: id, }, }); @@ -90,15 +91,15 @@ const getTribeDetail = (id, tryGet) => false ); -const getTribeSets = (id, limit, tryGet) => - tryGet( +const getTribeSets = (id, limit) => + cache.tryGet( `500px:tribeSets:${id}`, async () => { - const { data } = await got(`${baseUrl}/community/tribe/getTribeSetsV2`, { + const data = await ofetch(`${baseUrl}/community/tribe/getTribeSetsV2`, { headers: { ...headers, }, - searchParams: { + query: { tribeId: id, privacy: 1, page: 1, diff --git a/lib/routes/discourse/notifications.ts b/lib/routes/discourse/notifications.ts index 2216a50bc90837..0dff0bfbfbf165 100644 --- a/lib/routes/discourse/notifications.ts +++ b/lib/routes/discourse/notifications.ts @@ -1,7 +1,7 @@ import { Route } from '@/types'; import cache from '@/utils/cache'; import { getConfig } from './utils'; -import got from '@/utils/got'; +import ofetch from '@/utils/ofetch'; export const route: Route = { path: '/:configId/notifications/:fulltext?', @@ -32,7 +32,7 @@ If you opt to enable \`fulltext\` feature, consider adding \`limit\` parameter t async function handler(ctx) { const { link, key } = getConfig(ctx); - const response = await got(`${link}/notifications.json`, { headers: { 'User-Api-Key': key } }).json(); + const response = await ofetch(`${link}/notifications.json`, { headers: { 'User-Api-Key': key } }); let items = response.notifications.slice(0, ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit')) : 10).map((e) => ({ title: e.fancy_title ?? e.data.badge_name, link: `${link}/${Object.hasOwn(e.data, 'badge_id') ? `badges/${e.data.badge_id}/${e.data.badge_slug}?username=${e.data.username}` : `t/topic/${e.topic_id}/${e.post_number}`}`, @@ -48,7 +48,7 @@ async function handler(ctx) { if (e.original_post_id) { const post_link = `${link}/posts/${e.original_post_id}.json`; return cache.tryGet(post_link, async () => { - const { cooked } = await got(post_link, { headers: { 'User-Api-Key': key } }).json(); + const { cooked } = await ofetch(post_link, { headers: { 'User-Api-Key': key } }); return { ...e, description: cooked }; }); } else { @@ -58,7 +58,7 @@ async function handler(ctx) { ); } - const { about } = await got(`${link}/about.json`, { headers: { 'User-Api-Key': key } }).json(); + const { about } = await ofetch(`${link}/about.json`, { headers: { 'User-Api-Key': key } }); return { title: `${about.title} - Notifications`, description: about.description, diff --git a/lib/routes/hitcon/namespace.ts b/lib/routes/hitcon/namespace.ts new file mode 100644 index 00000000000000..3cda88d4c2b9a1 --- /dev/null +++ b/lib/routes/hitcon/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'HITCON', + url: 'hitcon.org', +}; diff --git a/lib/routes/hitcon/templates/zeroday.art b/lib/routes/hitcon/templates/zeroday.art new file mode 100644 index 00000000000000..f051ea4fa19653 --- /dev/null +++ b/lib/routes/hitcon/templates/zeroday.art @@ -0,0 +1,8 @@ + diff --git a/lib/routes/hitcon/zeroday.ts b/lib/routes/hitcon/zeroday.ts new file mode 100644 index 00000000000000..ce3aa2a297a224 --- /dev/null +++ b/lib/routes/hitcon/zeroday.ts @@ -0,0 +1,109 @@ +import type { Data, DataItem, Route } from '@/types'; +import type { Context } from 'hono'; +import { load } from 'cheerio'; +import puppeteer from '@/utils/puppeteer'; +import logger from '@/utils/logger'; +import { art } from '@/utils/render'; +import path from 'node:path'; +import { parseDate } from '@/utils/parse-date'; +import { getCurrentPath } from '@/utils/helpers'; + +const __dirname = getCurrentPath(import.meta.url); + +export const route: Route = { + name: '漏洞', + categories: ['programming'], + path: '/zeroday/vulnerability/:status?', + example: '/hitcon/zeroday/vulnerability', + parameters: { + status: '漏洞状态,见下表', + }, + maintainers: ['KarasuShin'], + radar: [ + { + source: ['zeroday.hitcon.org/vulnerability/:status?'], + }, + ], + features: { + requirePuppeteer: true, + }, + handler, + description: `| 缺省 | all | closed | disclosed | patching | + | ------ | ---- | ------ | --------- | -------- | + | 活動中 | 全部 | 關閉 | 公開 | 修補中 |`, +}; + +const baseUrl = 'https://zeroday.hitcon.org/vulnerability'; + +const titleMap = { + all: '全部', + closed: '關閉', + disclosed: '公開', + patching: '修補中', +}; + +async function handler(ctx: Context): Promise { + let url = baseUrl; + const status = ctx.req.param('status'); + if (status) { + url += `/${status}`; + } + + const browser = await puppeteer(); + const page = await browser.newPage(); + await page.setRequestInterception(true); + + page.on('request', (request) => { + request.resourceType() === 'document' ? request.continue() : request.abort(); + }); + + logger.http(`Requesting ${url}`); + await page.goto(url, { + waitUntil: 'domcontentloaded', + }); + + const response = await page.evaluate(() => document.documentElement.innerHTML); + browser.close(); + + const $ = load(response); + const items: DataItem[] = $('.zdui-strip-list>li') + .toArray() + .map((el) => { + const title = $(el).find('.title a'); + const vulData = $(el).find('.vul-data'); + const code = vulData + .find('.code') + .contents() + .filter(function () { + return this.nodeType === 3; + }) + .text(); + const risk = vulData.find('.risk span').eq(1).text(); + const vender = vulData.find('.vender').find('.v-name-full').text(); + const status = vulData.find('.status').text().replace('Status:', '').trim(); + const date = vulData.find('.date').text().replace('Date:', '').trim(); + const reporter = vulData.find('.zdui-author-badge').find('a>span').text(); + const description = art(path.join(__dirname, 'templates/zeroday.art'), { + code, + risk, + vender, + status, + date, + reporter, + }); + + return { + title: title.text(), + link: title.attr('href'), + description, + pubDate: parseDate(date), + }; + }); + + return { + title: status ? titleMap[status] ?? 'ZeroDay' : '活動中', + link: url, + item: items, + image: 'https://zeroday.hitcon.org/images/favicon/favicon.png', + }; +} diff --git a/lib/routes/modrinth/versions.ts b/lib/routes/modrinth/versions.ts index 41d0bd44fb2026..3f851e43b7bb8a 100644 --- a/lib/routes/modrinth/versions.ts +++ b/lib/routes/modrinth/versions.ts @@ -4,19 +4,20 @@ import { parseDate } from '@/utils/parse-date'; import { art } from '@/utils/render'; import path from 'node:path'; import { config } from '@/config'; -import got from '@/utils/got'; +import _ofetch from '@/utils/ofetch'; import MarkdownIt from 'markdown-it'; import type { Author, Project, Version } from '@/routes/modrinth/api'; import type { Context } from 'hono'; const __dirname = getCurrentPath(import.meta.url); -const customGot = got.extend({ +const ofetch = _ofetch.create({ headers: { // https://docs.modrinth.com/#section/User-Agents 'user-agent': config.trueUA, }, }); + const md = MarkdownIt({ html: true, }); @@ -83,19 +84,19 @@ async function handler(ctx: Context) { */ const parsedQuery = new URLSearchParams(routeParams); - parsedQuery.set('loaders', parsedQuery.has('loaders') ? JSON.stringify(parsedQuery.getAll('loaders')) : ''); - parsedQuery.set('game_versions', parsedQuery.has('game_versions') ? JSON.stringify(parsedQuery.getAll('game_versions')) : ''); - try { - const project = await customGot(`https://api.modrinth.com/v2/project/${id}`).json(); - const versions = await customGot(`https://api.modrinth.com/v2/project/${id}/version`, { - searchParams: parsedQuery, - }).json(); - const authors = await customGot(`https://api.modrinth.com/v2/users`, { - searchParams: { + const project = await ofetch(`https://api.modrinth.com/v2/project/${id}`); + const versions = await ofetch(`https://api.modrinth.com/v2/project/${id}/version`, { + query: { + loaders: parsedQuery.has('loaders') ? JSON.stringify(parsedQuery.getAll('loaders')) : '', + game_versions: parsedQuery.has('game_versions') ? JSON.stringify(parsedQuery.getAll('game_versions')) : '', + }, + }); + const authors = await ofetch(`https://api.modrinth.com/v2/users`, { + query: { ids: JSON.stringify([...new Set(versions.map((it) => it.author_id))]), }, - }).json(); + }); const groupedAuthors = >{}; for (const author of authors) { groupedAuthors[author.id] = author; diff --git a/lib/routes/nikkei/news.ts b/lib/routes/nikkei/news.ts index 6d3fb1c2e7dfbf..757dd8d999922a 100644 --- a/lib/routes/nikkei/news.ts +++ b/lib/routes/nikkei/news.ts @@ -14,14 +14,6 @@ export const route: Route = { categories: ['traditional-media'], example: '/nikkei/news', parameters: { category: 'Category, see table below', article_type: 'Only includes free articles, set `free` to enable, disabled by default' }, - features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, - }, radar: [ { source: ['www.nikkei.com/:category/archive', 'www.nikkei.com/:category'], @@ -29,7 +21,7 @@ export const route: Route = { }, ], name: 'News', - maintainers: ['Arracc'], + maintainers: ['Arracc', 'ladeng07'], handler, description: `| 総合 | オピニオン | 経済 | 政治 | 金融 | マーケット | ビジネス | マネーのまなび | テック | 国際 | スポーツ | 社会・調査 | 地域 | 文化 | ライフスタイル | | ---- | ---------- | ------- | -------- | --------- | ---------- | -------- | -------------- | ---------- | ------------- | -------- | ---------- | ----- | ------- | -------------- | @@ -47,18 +39,18 @@ async function handler(ctx) { const $ = load(data); let categoryName = ''; - const listSelector = $('div#CONTENTS_MAIN').children('div.m-miM09').not('.PRa'); - const paidSelector = 'span.m-iconMember'; + const listSelector = $('[class^="container_"] [class^="default_"]:has(article)'); + const paidSelector = 'img[class^="icon_"]'; let list = listSelector.toArray().map((item) => { item = $(item); item.find('p a').remove(); return { - title: item.find('.m-miM09_titleL').text(), - link: `${baseUrl}${item.find('.m-miM09_title a').attr('href')}`, - image: item.find('.m-miM09_thumb img').removeAttr('style').removeAttr('width').removeAttr('height').parent().html(), + title: item.find('[class^="titleLink_"]').text(), + link: `${baseUrl}${item.find('[class^="title_"] a').attr('href')}`, + image: item.find('[class^="image_"] img').removeAttr('style').removeAttr('width').removeAttr('height').parent().html(), category: item - .find('.m-miM09_keyword a') + .find('[class^="topicItem_"] a') .toArray() .map((item) => $(item).text()), paywall: !!item.find(paidSelector).length, diff --git a/lib/routes/seekingalpha/index.ts b/lib/routes/seekingalpha/index.ts index 64dd20548aae97..e1f2fad9168bb5 100644 --- a/lib/routes/seekingalpha/index.ts +++ b/lib/routes/seekingalpha/index.ts @@ -1,9 +1,12 @@ import { Route } from '@/types'; import cache from '@/utils/cache'; -import got from '@/utils/got'; -import { load } from 'cheerio'; +import ofetch from '@/utils/ofetch'; +import { art } from '@/utils/render'; import { parseDate } from '@/utils/parse-date'; -import dayjs from 'dayjs'; +import { getCurrentPath } from '@/utils/helpers'; +import path from 'node:path'; +const __dirname = getCurrentPath(import.meta.url); + const baseUrl = 'https://seekingalpha.com'; export const route: Route = { @@ -12,12 +15,7 @@ export const route: Route = { example: '/seekingalpha/TSM/transcripts', parameters: { symbol: 'Stock symbol', category: 'Category, see below, `news` by default' }, features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, + antiCrawler: true, }, radar: [ { @@ -33,39 +31,76 @@ export const route: Route = { | analysis | news | transcripts | press-releases | related-analysis |`, }; +const getMachineCookie = () => + cache.tryGet('seekingalpha:machine_cookie', async () => { + const response = await ofetch.raw(baseUrl); + return response.headers.getSetCookie().map((c) => c.split(';')[0]); + }); + +const apiParams = { + article: { + slug: '/articles', + include: 'author,primaryTickers,secondaryTickers,otherTags,presentations,presentations.slides,author.authorResearch,author.userBioTags,co_authors,promotedService,sentiments', + }, + news: { + slug: '/news', + include: 'author,primaryTickers,secondaryTickers,otherTags', + }, + pr: { + slug: '/press_releases', + include: 'acquireService,primaryTickers', + }, +}; + async function handler(ctx) { const { category = 'news', symbol } = ctx.req.param(); const pageUrl = `${baseUrl}/symbol/${symbol.toUpperCase()}/${category === 'transcripts' ? `earnings/${category}` : category}`; - const response = await got(`${baseUrl}/api/v3/symbols/${symbol.toUpperCase()}/${category}`, { - searchParams: { - cacheBuster: category === 'news' ? dayjs().format('YYYY-MM-DD') : undefined, + const machineCookie = await getMachineCookie(); + const response = await ofetch(`${baseUrl}/api/v3/symbols/${symbol.toUpperCase()}/${category}`, { + headers: { + cookie: machineCookie.join('; '), + }, + query: { + 'filter[since]': 0, + 'filter[until]': 0, id: symbol.toLowerCase(), include: 'author,primaryTickers,secondaryTickers,sentiments', - 'page[size]': ctx.req.query('limit') ? Number(ctx.req.query('limit')) : category === 'news' ? 40 : 20, + 'page[size]': ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : category === 'news' ? 40 : 20, + 'page[number]': 1, }, }); - const list = response.data.data?.map((item) => ({ + const list = response.data?.map((item) => ({ title: item.attributes.title, link: new URL(item.links.self, baseUrl).href, pubDate: parseDate(item.attributes.publishOn), - author: response.data.included.find((i) => i.id === item.relationships.author.data.id).attributes.nick, + author: response.included.find((i) => i.id === item.relationships.author.data.id).attributes.nick, + id: item.id, + articleType: item.links.self.split('/')[1], })); const items = list ? await Promise.all( list.map((item) => cache.tryGet(item.link, async () => { - const response = await got(item.link); - const $ = load(response.data); - - const summary = $('[data-test-id=article-summary-title]').length ? $('[data-test-id=article-summary-title]').html() + $('[data-test-id=article-summary-title]').next().html() : ''; + const response = await ofetch(`${baseUrl}/api/v3${apiParams[item.articleType].slug}/${item.id}`, { + headers: { + cookie: machineCookie.join('; '), + }, + query: { + include: apiParams[item.articleType].include, + }, + }); - item.category = $('div[data-test-id=themes-list] a') - .toArray() - .map((c) => $(c).text()); - item.description = summary + $('div.paywall-full-content').html(); + item.category = response.included.filter((i) => i.type === 'tag').map((i) => (i.attributes.company ? `${i.attributes.company} (${i.attributes.name})` : i.attributes.name)); + item.description = + (response.data.attributes.summary?.length + ? art(path.join(__dirname, 'templates/summary.art'), { + summary: response.data.attributes.summary, + }) + : '') + response.data.attributes.content; + item.updated = parseDate(response.data.attributes.lastModified); return item; }) @@ -74,8 +109,8 @@ async function handler(ctx) { : []; return { - title: response.data.meta.page.title, - description: response.data.meta.page.description, + title: response.meta.page.title, + description: response.meta.page.description, link: pageUrl, image: 'https://seekingalpha.com/samw/static/images/favicon.svg', item: items, diff --git a/lib/routes/seekingalpha/templates/summary.art b/lib/routes/seekingalpha/templates/summary.art new file mode 100644 index 00000000000000..dd0f1c40880fb4 --- /dev/null +++ b/lib/routes/seekingalpha/templates/summary.art @@ -0,0 +1,4 @@ +

Summary

+
    +{{ each summary s }}
  • {{ s }}
  • {{ /each }} +
diff --git a/package.json b/package.json index 7b7b4b30041cd0..dde4de79004836 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "fanfou-sdk": "5.0.0", "form-data": "4.0.0", "googleapis": "134.0.0", - "hono": "4.2.2", + "hono": "4.2.3", "html-to-text": "9.0.5", "https-proxy-agent": "7.0.4", "iconv-lite": "0.6.3", @@ -143,20 +143,20 @@ "@types/mailparser": "3.4.4", "@types/markdown-it": "14.0.0", "@types/module-alias": "2.0.4", - "@types/node": "20.12.4", + "@types/node": "20.12.7", "@types/request-promise-native": "1.0.21", "@types/sanitize-html": "2.11.0", "@types/supertest": "6.0.2", "@types/tiny-async-pool": "2.0.3", "@types/tough-cookie": "4.0.5", - "@typescript-eslint/eslint-plugin": "7.5.0", + "@typescript-eslint/eslint-plugin": "7.6.0", "@typescript-eslint/parser": "7.6.0", "@vercel/nft": "0.26.4", "@vitest/coverage-v8": "1.4.0", "eslint": "8.57.0", "eslint-config-prettier": "9.1.0", "eslint-nibble": "8.1.0", - "eslint-plugin-n": "17.0.0", + "eslint-plugin-n": "17.1.0", "eslint-plugin-prettier": "5.1.3", "eslint-plugin-unicorn": "52.0.0", "eslint-plugin-yml": "1.14.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 415c19bf3a3a8f..87065f7ab25bd5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ dependencies: version: 1.9.1 '@hono/swagger-ui': specifier: 0.2.1 - version: 0.2.1(hono@4.2.2) + version: 0.2.1(hono@4.2.3) '@hono/zod-openapi': specifier: 0.10.0 - version: 0.10.0(hono@4.2.2)(zod@3.22.4) + version: 0.10.0(hono@4.2.3)(zod@3.22.4) '@notionhq/client': specifier: 2.2.14 version: 2.2.14 @@ -81,8 +81,8 @@ dependencies: specifier: 134.0.0 version: 134.0.0 hono: - specifier: 4.2.2 - version: 4.2.2 + specifier: 4.2.3 + version: 4.2.3 html-to-text: specifier: 9.0.5 version: 9.0.5 @@ -281,8 +281,8 @@ devDependencies: specifier: 2.0.4 version: 2.0.4 '@types/node': - specifier: 20.12.4 - version: 20.12.4 + specifier: 20.12.7 + version: 20.12.7 '@types/request-promise-native': specifier: 1.0.21 version: 1.0.21 @@ -299,8 +299,8 @@ devDependencies: specifier: 4.0.5 version: 4.0.5 '@typescript-eslint/eslint-plugin': - specifier: 7.5.0 - version: 7.5.0(@typescript-eslint/parser@7.6.0)(eslint@8.57.0)(typescript@5.4.4) + specifier: 7.6.0 + version: 7.6.0(@typescript-eslint/parser@7.6.0)(eslint@8.57.0)(typescript@5.4.4) '@typescript-eslint/parser': specifier: 7.6.0 version: 7.6.0(eslint@8.57.0)(typescript@5.4.4) @@ -320,8 +320,8 @@ devDependencies: specifier: 8.1.0 version: 8.1.0(eslint@8.57.0) eslint-plugin-n: - specifier: 17.0.0 - version: 17.0.0(eslint@8.57.0) + specifier: 17.1.0 + version: 17.1.0(eslint@8.57.0) eslint-plugin-prettier: specifier: 5.1.3 version: 5.1.3(@types/eslint@8.56.7)(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) @@ -375,7 +375,7 @@ devDependencies: version: 4.3.2(typescript@5.4.4) vitest: specifier: 1.4.0 - version: 1.4.0(@types/node@20.12.4)(jsdom@24.0.0) + version: 1.4.0(@types/node@20.12.7)(jsdom@24.0.0) packages: @@ -1966,15 +1966,15 @@ packages: engines: {node: '>=18.14.1'} dev: false - /@hono/swagger-ui@0.2.1(hono@4.2.2): + /@hono/swagger-ui@0.2.1(hono@4.2.3): resolution: {integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==} peerDependencies: hono: '*' dependencies: - hono: 4.2.2 + hono: 4.2.3 dev: false - /@hono/zod-openapi@0.10.0(hono@4.2.2)(zod@3.22.4): + /@hono/zod-openapi@0.10.0(hono@4.2.3)(zod@3.22.4): resolution: {integrity: sha512-XvUtRMI5IugLSkdadYi349k1I40RntfeDqAcIskQ5dXqD+7ZEn3PxGX/jntyHXcbTLLotfzRTXQi0eh4Bb/LWg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -1982,18 +1982,18 @@ packages: zod: 3.* dependencies: '@asteasolutions/zod-to-openapi': 7.0.0(zod@3.22.4) - '@hono/zod-validator': 0.2.1(hono@4.2.2)(zod@3.22.4) - hono: 4.2.2 + '@hono/zod-validator': 0.2.1(hono@4.2.3)(zod@3.22.4) + hono: 4.2.3 zod: 3.22.4 dev: false - /@hono/zod-validator@0.2.1(hono@4.2.2)(zod@3.22.4): + /@hono/zod-validator@0.2.1(hono@4.2.3)(zod@3.22.4): resolution: {integrity: sha512-HFoxln7Q6JsE64qz2WBS28SD33UB2alp3aRKmcWnNLDzEL1BLsWfbdX6e1HIiUprHYTIXf5y7ax8eYidKUwyaA==} peerDependencies: hono: '>=3.9.0' zod: ^3.19.1 dependencies: - hono: 4.2.2 + hono: 4.2.3 zod: 3.22.4 dev: false @@ -2039,7 +2039,7 @@ packages: dependencies: '@inquirer/type': 1.2.1 '@types/mute-stream': 0.0.4 - '@types/node': 20.12.4 + '@types/node': 20.12.7 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -2670,14 +2670,14 @@ packages: /@types/etag@1.8.3: resolution: {integrity: sha512-QYHv9Yeh1ZYSMPQOoxY4XC4F1r+xRUiAriB303F4G6uBsT3KKX60DjiogvVv+2VISVDuJhcIzMdbjT+Bm938QQ==} dependencies: - '@types/node': 20.12.4 + '@types/node': 20.12.7 dev: true /@types/fs-extra@11.0.4: resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 20.12.4 + '@types/node': 20.12.7 dev: true /@types/git-rev-sync@2.0.2: @@ -2694,7 +2694,7 @@ packages: /@types/imapflow@1.0.18: resolution: {integrity: sha512-BoWZUoMktji2YJmkRY8z0KsjvyDNpBzeC/rLVMFKcHkPxaKp+SHBFfx/kj7ltKh3l010Lc9RZqnJs8KUMNhf6Q==} dependencies: - '@types/node': 20.12.4 + '@types/node': 20.12.7 dev: true /@types/istanbul-lib-coverage@2.0.6: @@ -2704,7 +2704,7 @@ packages: /@types/jsdom@21.1.6: resolution: {integrity: sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==} dependencies: - '@types/node': 20.12.4 + '@types/node': 20.12.7 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 dev: true @@ -2720,7 +2720,7 @@ packages: /@types/jsonfile@6.1.4: resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} dependencies: - '@types/node': 20.12.4 + '@types/node': 20.12.7 dev: true /@types/linkify-it@3.0.5: @@ -2734,7 +2734,7 @@ packages: /@types/mailparser@3.4.4: resolution: {integrity: sha512-C6Znp2QVS25JqtuPyxj38Qh+QoFcLycdxsvcc6IZCGekhaMBzbdTXzwGzhGoYb3TfKu8IRCNV0sV1o3Od97cEQ==} dependencies: - '@types/node': 20.12.4 + '@types/node': 20.12.7 iconv-lite: 0.6.3 dev: true @@ -2769,18 +2769,18 @@ packages: /@types/mute-stream@0.0.4: resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} dependencies: - '@types/node': 20.12.4 + '@types/node': 20.12.7 dev: true /@types/node-fetch@2.6.11: resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@types/node': 20.12.4 + '@types/node': 20.12.7 form-data: 4.0.0 dev: false - /@types/node@20.12.4: - resolution: {integrity: sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==} + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} dependencies: undici-types: 5.26.5 @@ -2805,7 +2805,7 @@ packages: resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} dependencies: '@types/caseless': 0.12.5 - '@types/node': 20.12.4 + '@types/node': 20.12.7 '@types/tough-cookie': 4.0.5 form-data: 2.5.1 @@ -2828,7 +2828,7 @@ packages: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 20.12.4 + '@types/node': 20.12.7 dev: true /@types/supertest@6.0.2: @@ -2861,12 +2861,12 @@ packages: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 20.12.4 + '@types/node': 20.12.7 dev: false optional: true - /@typescript-eslint/eslint-plugin@7.5.0(@typescript-eslint/parser@7.6.0)(eslint@8.57.0)(typescript@5.4.4): - resolution: {integrity: sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ==} + /@typescript-eslint/eslint-plugin@7.6.0(@typescript-eslint/parser@7.6.0)(eslint@8.57.0)(typescript@5.4.4): + resolution: {integrity: sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -2878,17 +2878,17 @@ packages: dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 7.6.0(eslint@8.57.0)(typescript@5.4.4) - '@typescript-eslint/scope-manager': 7.5.0 - '@typescript-eslint/type-utils': 7.5.0(eslint@8.57.0)(typescript@5.4.4) - '@typescript-eslint/utils': 7.5.0(eslint@8.57.0)(typescript@5.4.4) - '@typescript-eslint/visitor-keys': 7.5.0 + '@typescript-eslint/scope-manager': 7.6.0 + '@typescript-eslint/type-utils': 7.6.0(eslint@8.57.0)(typescript@5.4.4) + '@typescript-eslint/utils': 7.6.0(eslint@8.57.0)(typescript@5.4.4) + '@typescript-eslint/visitor-keys': 7.6.0 debug: 4.3.4 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.4.4) + ts-api-utils: 1.3.0(typescript@5.4.4) typescript: 5.4.4 transitivePeerDependencies: - supports-color @@ -2923,14 +2923,6 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/scope-manager@7.5.0: - resolution: {integrity: sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==} - engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.5.0 - '@typescript-eslint/visitor-keys': 7.5.0 - dev: true - /@typescript-eslint/scope-manager@7.6.0: resolution: {integrity: sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2939,8 +2931,8 @@ packages: '@typescript-eslint/visitor-keys': 7.6.0 dev: true - /@typescript-eslint/type-utils@7.5.0(eslint@8.57.0)(typescript@5.4.4): - resolution: {integrity: sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw==} + /@typescript-eslint/type-utils@7.6.0(eslint@8.57.0)(typescript@5.4.4): + resolution: {integrity: sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -2949,11 +2941,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.5.0(typescript@5.4.4) - '@typescript-eslint/utils': 7.5.0(eslint@8.57.0)(typescript@5.4.4) + '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.4) + '@typescript-eslint/utils': 7.6.0(eslint@8.57.0)(typescript@5.4.4) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.2.1(typescript@5.4.4) + ts-api-utils: 1.3.0(typescript@5.4.4) typescript: 5.4.4 transitivePeerDependencies: - supports-color @@ -2964,11 +2956,6 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/types@7.5.0: - resolution: {integrity: sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==} - engines: {node: ^18.18.0 || >=20.0.0} - dev: true - /@typescript-eslint/types@7.6.0: resolution: {integrity: sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2996,28 +2983,6 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.5.0(typescript@5.4.4): - resolution: {integrity: sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 7.5.0 - '@typescript-eslint/visitor-keys': 7.5.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.4) - typescript: 5.4.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree@7.6.0(typescript@5.4.4): resolution: {integrity: sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3059,8 +3024,8 @@ packages: - typescript dev: true - /@typescript-eslint/utils@7.5.0(eslint@8.57.0)(typescript@5.4.4): - resolution: {integrity: sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw==} + /@typescript-eslint/utils@7.6.0(eslint@8.57.0)(typescript@5.4.4): + resolution: {integrity: sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -3068,9 +3033,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.5.0 - '@typescript-eslint/types': 7.5.0 - '@typescript-eslint/typescript-estree': 7.5.0(typescript@5.4.4) + '@typescript-eslint/scope-manager': 7.6.0 + '@typescript-eslint/types': 7.6.0 + '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.4) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -3086,14 +3051,6 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.5.0: - resolution: {integrity: sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==} - engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.5.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@7.6.0: resolution: {integrity: sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3147,7 +3104,7 @@ packages: strip-literal: 2.0.0 test-exclude: 6.0.0 v8-to-istanbul: 9.2.0 - vitest: 1.4.0(@types/node@20.12.4)(jsdom@24.0.0) + vitest: 1.4.0(@types/node@20.12.7)(jsdom@24.0.0) transitivePeerDependencies: - supports-color dev: true @@ -4744,8 +4701,8 @@ packages: eslint-compat-utils: 0.1.2(eslint@8.57.0) dev: true - /eslint-plugin-n@17.0.0(eslint@8.57.0): - resolution: {integrity: sha512-0Ihff+kWUIiXYTNTotGj/yRI1X5uCh/lef5Hr7ih/mFeYMQ3bPfN0KxlrfhU+Xn4x697l/TPO6zxqE33M1yD0w==} + /eslint-plugin-n@17.1.0(eslint@8.57.0): + resolution: {integrity: sha512-+MTiTej3B07+8vS/RfSMD1w4O9VVR9BSJT9kSa9QUsBlXzKi5PZc+lB3w+iu/2eIS3drFU7zCikSrD8Yn8PEBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -4757,7 +4714,6 @@ packages: get-tsconfig: 4.7.2 globals: 14.0.0 ignore: 5.3.1 - is-builtin-module: 3.2.1 minimatch: 9.0.4 semver: 7.6.0 dev: true @@ -5681,8 +5637,8 @@ packages: resolution: {integrity: sha512-4FP6J0oI8jqb6gLLl9tSwVdosWJ/AKSGJ+HwYf6Ixe4MUcEkst4uWzpVQrNOCin0fzTRQbXV8ePheU8WiiDYBw==} dev: false - /hono@4.2.2: - resolution: {integrity: sha512-mDmjBHF6uBNN3TASdAbDCFsN9FLbrlgXyFZkhLEkU7hUgk0+T9hcsUrL/nho4qV+Xk0RDHx7gop4Q1gelZZVRw==} + /hono@4.2.3: + resolution: {integrity: sha512-yZDnPOp/XzjIB7KUWaOxwLSywnhxMvAKth8hfKhWQiWXeZhBfC6GlFnEst/FOOgn7rSWjShhQPS89PLEuHxq3Q==} engines: {node: '>=16.0.0'} dev: false @@ -9105,15 +9061,6 @@ packages: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} dev: true - /ts-api-utils@1.2.1(typescript@5.4.4): - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.4.4 - dev: true - /ts-api-utils@1.3.0(typescript@5.4.4): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -9474,7 +9421,7 @@ packages: vfile-message: 4.0.2 dev: true - /vite-node@1.4.0(@types/node@20.12.4): + /vite-node@1.4.0(@types/node@20.12.7): resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -9483,7 +9430,7 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.1.5(@types/node@20.12.4) + vite: 5.1.5(@types/node@20.12.7) transitivePeerDependencies: - '@types/node' - less @@ -9511,7 +9458,7 @@ packages: - typescript dev: true - /vite@5.1.5(@types/node@20.12.4): + /vite@5.1.5(@types/node@20.12.7): resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -9539,7 +9486,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.12.4 + '@types/node': 20.12.7 esbuild: 0.19.12 postcss: 8.4.35 rollup: 4.12.0 @@ -9547,7 +9494,7 @@ packages: fsevents: 2.3.3 dev: true - /vitest@1.4.0(@types/node@20.12.4)(jsdom@24.0.0): + /vitest@1.4.0(@types/node@20.12.7)(jsdom@24.0.0): resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -9572,7 +9519,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.12.4 + '@types/node': 20.12.7 '@vitest/expect': 1.4.0 '@vitest/runner': 1.4.0 '@vitest/snapshot': 1.4.0 @@ -9591,8 +9538,8 @@ packages: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.1.5(@types/node@20.12.4) - vite-node: 1.4.0(@types/node@20.12.4) + vite: 5.1.5(@types/node@20.12.7) + vite-node: 1.4.0(@types/node@20.12.7) why-is-node-running: 2.2.2 transitivePeerDependencies: - less