diff --git a/lib/routes/chub/characters.ts b/lib/routes/chub/characters.ts new file mode 100644 index 00000000000000..0f34350658848c --- /dev/null +++ b/lib/routes/chub/characters.ts @@ -0,0 +1,64 @@ +import { Route } from '@/types'; +import ofetch from '@/utils/ofetch'; +import { parseDate } from '@/utils/parse-date'; + +export const route: Route = { + path: '/characters', + categories: ['new-media'], + example: '/chub/characters', + name: 'Characters', + maintainers: ['flameleaf'], + handler, +}; + +async function handler() { + const hostURL = 'https://www.chub.ai/characters'; + const apiURL = 'https://api.chub.ai/api/characters/search'; + const data = await ofetch(apiURL, { + headers: { Accept: 'application/json' }, + query: { + query: '', + first: 200, + page: 1, + sort: 'last_activity_at', + asc: 'false', + include_forks: 'false', + nsfw: 'true', + nsfl: 'true', + nsfw_only: 'false', + require_images: 'false', + require_example_dialogues: 'false', + require_alternate_greetings: 'false', + require_custom_prompt: 'false', + exclude_mine: 'false', + venus: 'true', + chub: 'true', + min_tokens: 50, + require_expressions: 'false', + require_lore: 'false', + mine_first: 'false', + require_lore_embedded: 'false', + require_lore_linked: 'false', + inclusive_or: 'false', + recommended_verified: 'false', + }, + }); + const nodes = data.nodes; + + return { + allowEmpty: true, + title: 'Chub', + link: hostURL, + item: nodes.map((item) => ({ + title: item.name, + description: `${item.tagline}

${item.description}`, + pubDate: parseDate(item.createdAt), + updated: parseDate(item.lastActivityAt), + link: `${hostURL}/${item.fullPath}`, + author: String(item.fullPath.split('/', 1)), + enclosure_url: item.avatar_url, + enclosure_type: `image/webp`, + category: item.topics, + })), + }; +} diff --git a/lib/routes/chub/namespace.ts b/lib/routes/chub/namespace.ts new file mode 100644 index 00000000000000..c9d38725fd3095 --- /dev/null +++ b/lib/routes/chub/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'Chub', + url: 'chub.ai', +}; diff --git a/lib/routes/daily/discussed.ts b/lib/routes/daily/discussed.ts index 66ce51037d7858..54a5957276b6d4 100644 --- a/lib/routes/daily/discussed.ts +++ b/lib/routes/daily/discussed.ts @@ -59,21 +59,10 @@ const graphqlQuery = { export const route: Route = { path: '/discussed', - categories: ['social-media'], example: '/daily/discussed', - parameters: {}, - features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, - }, radar: [ { source: ['daily.dev/popular'], - target: '', }, ], name: 'Most Discussed', diff --git a/lib/routes/daily/index.ts b/lib/routes/daily/index.ts index b10418e9160a43..031f47c0a773eb 100644 --- a/lib/routes/daily/index.ts +++ b/lib/routes/daily/index.ts @@ -69,13 +69,13 @@ const graphqlQuery = { export const route: Route = { path: '/', + example: '/daily', radar: [ { source: ['daily.dev/popular'], - target: '', }, ], - name: 'Unknown', + name: 'Popular', maintainers: ['Rjnishant530'], handler, url: 'daily.dev/popular', diff --git a/lib/routes/daily/namespace.ts b/lib/routes/daily/namespace.ts index acddafe867b238..2dbd9bf58eba9c 100644 --- a/lib/routes/daily/namespace.ts +++ b/lib/routes/daily/namespace.ts @@ -3,4 +3,5 @@ import type { Namespace } from '@/types'; export const namespace: Namespace = { name: 'Daily.dev', url: 'daily.dev', + categories: ['social-media'], }; diff --git a/lib/routes/daily/templates/posts.art b/lib/routes/daily/templates/posts.art new file mode 100644 index 00000000000000..b8d94338e03448 --- /dev/null +++ b/lib/routes/daily/templates/posts.art @@ -0,0 +1,7 @@ +{{ if image }} +
+{{ /if }} + +{{ if content }} +{{@ content }} +{{ /if }} diff --git a/lib/routes/daily/upvoted.ts b/lib/routes/daily/upvoted.ts index 1b2c2ab9783691..68a2a19d6cc784 100644 --- a/lib/routes/daily/upvoted.ts +++ b/lib/routes/daily/upvoted.ts @@ -16,7 +16,7 @@ const query = ` ...FeedPostConnection } } - + fragment FeedPostConnection on PostConnection { edges { node { @@ -24,11 +24,11 @@ const query = ` } } } - + fragment FeedPost on Post { ...SharedPostInfo } - + fragment SharedPostInfo on Post { id title @@ -44,7 +44,7 @@ const query = ` } tags } - + fragment UserShortInfo on User { id name @@ -53,7 +53,7 @@ const query = ` username bio } - + `; const graphqlQuery = { @@ -63,21 +63,10 @@ const graphqlQuery = { export const route: Route = { path: '/upvoted', - categories: ['social-media'], example: '/daily/upvoted', - parameters: {}, - features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, - }, radar: [ { source: ['daily.dev/popular'], - target: '', }, ], name: 'Most upvoted', diff --git a/lib/routes/daily/user.ts b/lib/routes/daily/user.ts new file mode 100644 index 00000000000000..7abaf15a029cb8 --- /dev/null +++ b/lib/routes/daily/user.ts @@ -0,0 +1,227 @@ +import { Route } from '@/types'; +import { baseUrl, getBuildId, getData } from './utils'; +import ofetch from '@/utils/ofetch'; +import cache from '@/utils/cache'; +import { config } from '@/config'; +import { parseDate } from '@/utils/parse-date'; +import { art } from '@/utils/render'; +import path from 'path'; +import { getCurrentPath } from '@/utils/helpers'; +const __dirname = getCurrentPath(import.meta.url); + +const userPostQuery = ` + query AuthorFeed( + $loggedIn: Boolean! = false + $userId: ID! + $after: String + $first: Int + $supportedTypes: [String!] = [ + "article" + "share" + "freeform" + "video:youtube" + "collection" + ] + ) { + page: authorFeed( + author: $userId + after: $after + first: $first + ranking: TIME + supportedTypes: $supportedTypes + ) { + ...FeedPostConnection + } + } + fragment FeedPostConnection on PostConnection { + pageInfo { + hasNextPage + endCursor + } + edges { + node { + ...FeedPost + contentHtml + ...UserPost @include(if: $loggedIn) + } + } + } + fragment FeedPost on Post { + ...SharedPostInfo + sharedPost { + ...SharedPostInfo + } + trending + feedMeta + collectionSources { + handle + image + } + numCollectionSources + updatedAt + slug + } + fragment SharedPostInfo on Post { + id + title + titleHtml + image + readTime + permalink + commentsPermalink + summary + createdAt + private + upvoted + commented + bookmarked + views + numUpvotes + numComments + videoId + scout { + ...UserShortInfo + } + author { + ...UserShortInfo + } + type + tags + source { + ...SourceBaseInfo + } + downvoted + flags { + promoteToPublic + } + userState { + vote + flags { + feedbackDismiss + } + } + slug + } + fragment SourceBaseInfo on Source { + id + active + handle + name + permalink + public + type + description + image + membersCount + privilegedMembers { + user { + id + } + role + } + currentMember { + ...CurrentMember + } + memberPostingRole + memberInviteRole + } + fragment CurrentMember on SourceMember { + user { + id + } + permissions + role + referralToken + flags { + hideFeedPosts + collapsePinnedPosts + } + } + fragment UserShortInfo on User { + id + name + image + permalink + username + bio + createdAt + reputation + } + fragment UserPost on Post { + read + upvoted + commented + bookmarked + downvoted + }`; + +const render = (data) => art(path.join(__dirname, 'templates/posts.art'), data); + +export const route: Route = { + path: '/user/:userId', + example: '/daily/user/kramer', + radar: [ + { + source: ['daily.dev/:userId/posts', 'daily.dev/:userId'], + }, + ], + name: 'User Posts', + maintainers: ['TonyRL'], + handler, + url: 'daily.dev', +}; + +async function handler(ctx) { + const userId = ctx.req.param('userId'); + const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 7; + + const buildId = await getBuildId(); + + const userData = await cache.tryGet(`daily:user:${userId}`, async () => { + const resposne = await ofetch(`${baseUrl}/_next/data/${buildId}/en/${userId}.json`, { + query: { + userId, + }, + }); + return resposne.pageProps; + }); + const user = (userData as any).user; + + const items = await cache.tryGet( + `daily:user:${userId}:posts`, + async () => { + const edges = await getData({ + query: userPostQuery, + variables: { + userId: user.id, + first: limit, + loggedIn: false, + }, + }); + return edges.map(({ node }) => ({ + title: node.title, + description: render({ + image: node.image, + content: node.contentHtml?.replaceAll('\n', '
') ?? node.summary, + }), + link: node.permalink, + author: node.author?.name, + category: node.tags, + pubDate: parseDate(node.createdAt), + })); + }, + config.cache.routeExpire, + false + ); + + return { + title: `${user.name} | daily.dev`, + description: user.bio, + link: `${baseUrl}/${userId}/posts`, + item: items, + image: user.image, + logo: user.image, + icon: user.image, + language: 'en-us', + }; +} diff --git a/lib/routes/daily/utils.ts b/lib/routes/daily/utils.ts index d9c67025b85d2b..8f203c744d15a3 100644 --- a/lib/routes/daily/utils.ts +++ b/lib/routes/daily/utils.ts @@ -1,19 +1,34 @@ -import dayjs from 'dayjs'; -import got from '@/utils/got'; +import { parseDate } from '@/utils/parse-date'; +import ofetch from '@/utils/ofetch'; +import cache from '@/utils/cache'; +import { config } from '@/config'; -const getData = async (graphqlQuery) => - ( - await got - .post('https://app.daily.dev/api/graphql', { - json: graphqlQuery, - }) - .json() - ).data.page.edges; +const baseUrl = 'https://app.daily.dev'; + +const getBuildId = () => + cache.tryGet( + 'daily:buildId', + async () => { + const response = await ofetch(`${baseUrl}/onboarding`); + const buildId = response.match(/"buildId":"(.*?)"/)[1]; + return buildId; + }, + config.cache.routeExpire, + false + ); + +const getData = async (graphqlQuery) => { + const response = await ofetch(`${baseUrl}/api/graphql`, { + method: 'POST', + body: graphqlQuery, + }); + return response.data.page.edges; +}; const getList = (data) => data.map((value) => { const { id, title, image, permalink, summary, createdAt, numUpvotes, author, tags, numComments } = value.node; - const pubDate = dayjs(createdAt); + const pubDate = parseDate(createdAt); return { id, title, @@ -30,10 +45,12 @@ const getList = (data) => const getRedirectedLink = (data) => Promise.all( - data.map(async (v) => { - const resp = await got(v.link); - return { ...v, link: resp.headers.link.split(/[<>]/g)[1] }; - }) + data.map((v) => + cache.tryGet(v.link, async () => { + const resp = await ofetch.raw(v.link); + return { ...v, link: resp.headers.get('location') }; + }) + ) ); -export { getData, getList, getRedirectedLink }; +export { baseUrl, getBuildId, getData, getList, getRedirectedLink }; diff --git a/lib/routes/douyu/room.ts b/lib/routes/douyu/room.ts index 7cad249a74a7e6..bd0a36c6cd9d3c 100644 --- a/lib/routes/douyu/room.ts +++ b/lib/routes/douyu/room.ts @@ -20,37 +20,77 @@ export const route: Route = { }, ], name: '直播间开播', - maintainers: ['DIYgod'], + maintainers: ['DIYgod', 'ChaosTong'], handler, }; async function handler(ctx) { const id = ctx.req.param('id'); - const response = await got({ - method: 'get', - url: `http://open.douyucdn.cn/api/RoomApi/room/${id}`, - headers: { - Referer: `https://www.douyu.com/${id}`, - }, - }); + let data; + let item; + let room_thumb; + try { + const response = await got({ + method: 'get', + url: `https://www.douyu.com/betard/${id}`, + }); - const data = response.data.data; + if (!response.data.room) { + throw new Error('Invalid response'); + } - let item; - if (data.online !== 0) { - item = [ - { - title: `开播: ${data.room_name}`, - pubDate: new Date(data.start_time).toUTCString(), - guid: data.start_time, - link: `https://www.douyu.com/${id}`, + data = response.data.room; + room_thumb = data.room_pic; + + if (data.show_status === 1) { + item = + data.videoLoop === 1 + ? [ + { + title: `视频轮播: ${data.room_name}`, + pubDate: new Date(data.show_time * 1000).toUTCString(), + guid: data.show_time, + link: `https://www.douyu.com/${id}`, + }, + ] + : [ + { + title: `开播: ${data.room_name}`, + pubDate: new Date(data.show_time * 1000).toUTCString(), + guid: data.show_time, + link: `https://www.douyu.com/${id}`, + }, + ]; + } + // make a fallback to the old api + } catch { + const response = await got({ + method: 'get', + url: `http://open.douyucdn.cn/api/RoomApi/room/${id}`, + headers: { + Referer: `https://www.douyu.com/${id}`, }, - ]; + }); + + data = response.data.data; + room_thumb = data.room_thumb; + + if (data.online !== 0) { + item = [ + { + title: `开播: ${data.room_name}`, + pubDate: new Date(data.start_time).toUTCString(), + guid: data.start_time, + link: `https://www.douyu.com/${id}`, + }, + ]; + } } return { title: `${data.owner_name}的斗鱼直播间`, + image: room_thumb, link: `https://www.douyu.com/${id}`, item, allowEmpty: true, diff --git a/lib/routes/gov/ah/kjt.ts b/lib/routes/gov/ah/kjt.ts new file mode 100644 index 00000000000000..7831299c5a2dec --- /dev/null +++ b/lib/routes/gov/ah/kjt.ts @@ -0,0 +1,229 @@ +import { Route } from '@/types'; + +import cache from '@/utils/cache'; +import got from '@/utils/got'; +import { load } from 'cheerio'; +import timezone from '@/utils/timezone'; +import { parseDate } from '@/utils/parse-date'; + +export const handler = async (ctx) => { + const { category = 'kjzx/tzgg' } = ctx.req.param(); + const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 20; + + const rootUrl = 'https://kjt.ah.gov.cn'; + const currentUrl = new URL(`${category.replace(/\/$/, '').replace(/\/index\.html$/, '')}/`, rootUrl).href; + + const { data: response } = await got(currentUrl); + + const $ = load(response); + + const language = $('html').prop('lang'); + + let items = $('ul.doc_list li') + .slice(0, limit) + .toArray() + .map((item) => { + item = $(item); + + const a = item.find('a'); + + const title = a.prop('title') ?? a.text(); + + return { + title, + pubDate: parseDate(item.find('span.date').text()), + link: a.prop('href'), + language, + }; + }); + + items = await Promise.all( + items.map((item) => + cache.tryGet(item.link, async () => { + const { data: detailResponse } = await got(item.link); + + const $$ = load(detailResponse); + + const description = $$('div.wzcon').html(); + + item.title = $$('meta[name="ArticleTitle"]').prop('content'); + item.description = description; + item.pubDate = timezone(parseDate($$('meta[name="PubDate"]').prop('content')), +8); + item.category = [ + ...new Set([ + $$('meta[name="ColumnName"]').prop('content'), + $$('meta[name="ColumnType"]').prop('content'), + $$('meta[name="ColumnKeywords"]').prop('content'), + $$('meta[name="ContentSource"]').prop('content'), + $$('meta[name="ContentSource"]').prop('content'), + ]), + ].filter(Boolean); + item.author = $$('meta[name="Author"]').prop('content'); + item.content = { + html: description, + text: $$('div.wzcon').text(), + }; + item.updated = timezone(parseDate($$('meta[name="HtmlGenerateTime"]').prop('content')), +8); + item.language = language; + + return item; + }) + ) + ); + + const author = $('meta[name="SiteName"]').prop('content'); + const image = $('span.img_title').first().prev().prop('src'); + + return { + title: `${author} - ${$('meta[name="ColumnName"]').prop('content')}`, + description: $('meta[name="ColumnDescription"]').prop('content'), + link: currentUrl, + item: items, + allowEmpty: true, + image, + author, + language, + }; +}; + +export const route: Route = { + path: '/ah/kjt/:category{.+}?', + name: '安徽省科学技术厅', + url: 'kjt.ah.gov.cn', + maintainers: ['nczitzk'], + handler, + example: '/gov/ah/kjt', + parameters: { category: '分类,默认为 `kjzx/tzgg`,即通知公告,可在对应分类页 URL 中找到' }, + description: `:::tip + 若订阅 [通知公告](https://kjt.ah.gov.cn/kjzx/tzgg/),网址为 \`https://kjt.ah.gov.cn/kjzx/tzgg/\`。截取 \`https://kjt.ah.gov.cn/\` 到末尾 \`/\` 的部分 \`\` 作为参数填入,此时路由为 [\`/gov/ah/kjt/kjzx/tzgg\`](https://rsshub.app/gov/ah/kjt/kjzx/tzgg)。 + ::: + + #### [科技资讯](https://kjt.ah.gov.cn/kjzx/index.html) + + | [通知公告](https://kjt.ah.gov.cn/kjzx/tzgg/index.html) | [工作动态](https://kjt.ah.gov.cn/kjzx/gzdt/index.html) | [基层科技](https://kjt.ah.gov.cn/kjzx/jckj/index.html) | [媒体聚焦](https://kjt.ah.gov.cn/kjzx/mtjj/index.html) | + | ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | + | [kjzx/tzgg](https://rsshub.app/gov/ah/kjt/kjzx/tzgg) | [kjzx/gzdt](https://rsshub.app/gov/ah/kjt/kjzx/gzdt) | [kjzx/jckj](https://rsshub.app/gov/ah/kjt/kjzx/jckj) | [kjzx/mtjj](https://rsshub.app/gov/ah/kjt/kjzx/mtjj) | + + | [重要转载](https://kjt.ah.gov.cn/kjzx/zyzz/index.html) | [图片视频](https://kjt.ah.gov.cn/kjzx/tpsp/index.html) | + | ------------------------------------------------------ | ------------------------------------------------------ | + | [kjzx/zyzz](https://rsshub.app/gov/ah/kjt/kjzx/zyzz) | [kjzx/tpsp](https://rsshub.app/gov/ah/kjt/kjzx/tpsp) | + + #### [科技统计](https://kjt.ah.gov.cn/kjzy/kjtj/index.html) + + | [技术市场交易](https://kjt.ah.gov.cn/kjzy/kjtj/jsscjy/index.html) | [科技成果公报](https://kjt.ah.gov.cn/kjzy/kjtj/kjcggb/index.html) | [孵化载体发展](https://kjt.ah.gov.cn/kjzy/kjtj/cyfhfz/index.html) | + | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | + | [kjzy/kjtj/jsscjy](https://rsshub.app/gov/ah/kjt/kjzy/kjtj/jsscjy) | [kjzy/kjtj/kjcggb](https://rsshub.app/gov/ah/kjt/kjzy/kjtj/kjcggb) | [kjzy/kjtj/cyfhfz](https://rsshub.app/gov/ah/kjt/kjzy/kjtj/cyfhfz) | + + #### [科技数据](https://kjt.ah.gov.cn/kjzy/kjsj/index.html) + + | [创新企业](https://kjt.ah.gov.cn/kjzy/kjsj/cxqy/index.html) | [创新项目](https://kjt.ah.gov.cn/kjzy/kjsj/cxxm/index.html) | [创新成果](https://kjt.ah.gov.cn/kjzy/kjsj/cxcg/index.html) | [转化基金入库项目](https://kjt.ah.gov.cn/kjzy/kjsj/zhjjrkxm/index.html) | + | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | ----------------------------------------------------------------------- | + | [kjzy/kjsj/cxqy](https://rsshub.app/gov/ah/kjt/kjzy/kjsj/cxqy) | [kjzy/kjsj/cxxm](https://rsshub.app/gov/ah/kjt/kjzy/kjsj/cxxm) | [kjzy/kjsj/cxcg](https://rsshub.app/gov/ah/kjt/kjzy/kjsj/cxcg) | [kjzy/kjsj/zhjjrkxm](https://rsshub.app/gov/ah/kjt/kjzy/kjsj/zhjjrkxm) | + + | [创新平台](https://kjt.ah.gov.cn/kjzy/kjsj/cxpt/index.html) | [创新园区](https://kjt.ah.gov.cn/kjzy/kjsj/cxyq/index.html) | [创新许可](https://kjt.ah.gov.cn/kjzy/kjsj/cxxk/index.html) | + | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | + | [kjzy/kjsj/cxpt](https://rsshub.app/gov/ah/kjt/kjzy/kjsj/cxpt) | [kjzy/kjsj/cxyq](https://rsshub.app/gov/ah/kjt/kjzy/kjsj/cxyq) | [kjzy/kjsj/cxxk](https://rsshub.app/gov/ah/kjt/kjzy/kjsj/cxxk) | + + `, + categories: ['government'], + + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportRadar: true, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['kjt.ah.gov.cn/:category'], + target: (params) => { + const category = params.category; + + return `/gov/ah/kjt${category ? `/${category}` : ''}`; + }, + }, + { + title: '科技资讯 - 通知公告', + source: ['kjt.ah.gov.cn/kjzx/tzgg/index.html'], + target: '/ah/kjt/kjzx/tzgg', + }, + { + title: '科技资讯 - 工作动态', + source: ['kjt.ah.gov.cn/kjzx/gzdt/index.html'], + target: '/ah/kjt/kjzx/gzdt', + }, + { + title: '科技资讯 - 基层科技', + source: ['kjt.ah.gov.cn/kjzx/jckj/index.html'], + target: '/ah/kjt/kjzx/jckj', + }, + { + title: '科技资讯 - 媒体聚焦', + source: ['kjt.ah.gov.cn/kjzx/mtjj/index.html'], + target: '/ah/kjt/kjzx/mtjj', + }, + { + title: '科技资讯 - 重要转载', + source: ['kjt.ah.gov.cn/kjzx/zyzz/index.html'], + target: '/ah/kjt/kjzx/zyzz', + }, + { + title: '科技资讯 - 图片视频', + source: ['kjt.ah.gov.cn/kjzx/tpsp/index.html'], + target: '/ah/kjt/kjzx/tpsp', + }, + { + title: '科技统计 - 技术市场交易', + source: ['kjt.ah.gov.cn/kjzy/kjtj/jsscjy/index.html'], + target: '/ah/kjt/kjzy/kjtj/jsscjy', + }, + { + title: '科技统计 - 科技成果公报', + source: ['kjt.ah.gov.cn/kjzy/kjtj/kjcggb/index.html'], + target: '/ah/kjt/kjzy/kjtj/kjcggb', + }, + { + title: '科技统计 - 孵化载体发展', + source: ['kjt.ah.gov.cn/kjzy/kjtj/cyfhfz/index.html'], + target: '/ah/kjt/kjzy/kjtj/cyfhfz', + }, + { + title: '科技数据 - 创新企业', + source: ['kjt.ah.gov.cn/kjzy/kjsj/cxqy/index.html'], + target: '/ah/kjt/kjzy/kjsj/cxqy', + }, + { + title: '科技数据 - 创新项目', + source: ['kjt.ah.gov.cn/kjzy/kjsj/cxxm/index.html'], + target: '/ah/kjt/kjzy/kjsj/cxxm', + }, + { + title: '科技数据 - 创新成果', + source: ['kjt.ah.gov.cn/kjzy/kjsj/cxcg/index.html'], + target: '/ah/kjt/kjzy/kjsj/cxcg', + }, + { + title: '科技数据 - 转化基金入库项目', + source: ['kjt.ah.gov.cn/kjzy/kjsj/zhjjrkxm/index.html'], + target: '/ah/kjt/kjzy/kjsj/zhjjrkxm', + }, + { + title: '科技数据 - 创新平台', + source: ['kjt.ah.gov.cn/kjzy/kjsj/cxpt/index.html'], + target: '/ah/kjt/kjzy/kjsj/cxpt', + }, + { + title: '科技数据 - 创新园区', + source: ['kjt.ah.gov.cn/kjzy/kjsj/cxyq/index.html'], + target: '/ah/kjt/kjzy/kjsj/cxyq', + }, + { + title: '科技数据 - 创新许可', + source: ['kjt.ah.gov.cn/kjzy/kjsj/cxxk/index.html'], + target: '/ah/kjt/kjzy/kjsj/cxxk', + }, + ], +}; diff --git a/lib/routes/gov/ah/namespace.ts b/lib/routes/gov/ah/namespace.ts new file mode 100644 index 00000000000000..6994f2f4d64662 --- /dev/null +++ b/lib/routes/gov/ah/namespace.ts @@ -0,0 +1,8 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '安徽省人民政府', + url: 'ah.gov.cn', + categories: ['government'], + description: '', +}; diff --git a/lib/routes/gov/anhui/kjt.ts b/lib/routes/gov/anhui/kjt.ts deleted file mode 100644 index e6e3f56edd723a..00000000000000 --- a/lib/routes/gov/anhui/kjt.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Route } from '@/types'; -import cache from '@/utils/cache'; -import got from '@/utils/got'; -import { load } from 'cheerio'; -import timezone from '@/utils/timezone'; -import { parseDate } from '@/utils/parse-date'; - -export const route: Route = { - path: '/anhui/kjt/*', - name: 'Unknown', - maintainers: [], - handler, -}; - -async function handler(ctx) { - const params = ctx.params[0] ?? 'kjzx/tzgg'; - - const rootUrl = 'http://kjt.ah.gov.cn'; - const currentUrl = `${rootUrl}/${params}/index.html`; - - const response = await got({ - method: 'get', - url: currentUrl, - }); - - const $ = load(response.data); - - let items = $('.doc_list li') - .not('.columnName') - .find('a') - .toArray() - .map((item) => { - item = $(item); - - return { - title: item.text(), - link: item.attr('href'), - }; - }); - - items = await Promise.all( - items.map((item) => - cache.tryGet(item.link, async () => { - const detailResponse = await got({ - method: 'get', - url: item.link, - }); - - const content = load(detailResponse.data); - - item.description = content('.wzcon').html(); - item.author = content('meta[name="Author"]').attr('content'); - item.pubDate = timezone(parseDate(content('meta[name="PubDate"]').attr('content')), +8); - - return item; - }) - ) - ); - - return { - title: $('title').text(), - link: currentUrl, - item: items, - }; -} diff --git a/lib/routes/hellogithub/index.ts b/lib/routes/hellogithub/index.ts index 7050f35d50fbec..c5093e5e3524fe 100644 --- a/lib/routes/hellogithub/index.ts +++ b/lib/routes/hellogithub/index.ts @@ -15,7 +15,7 @@ const sorts = { }; export const route: Route = { - path: ['/article/:sort?/:id?', '/:sort?/:id?'], + path: ['/article/:sort?/:id?'], categories: ['programming'], example: '/hellogithub/article', parameters: { sort: '排序方式,见下表,默认为 `hot`,即热门', id: '标签 id,可在对应标签页 URL 中找到,默认为全部标签' }, @@ -61,7 +61,7 @@ async function handler(ctx) { const $ = load(tagResponse.data); - tag = $('meta[property="og:title"]').attr('content').split(' ').pop(); + tag = $('meta[property="og:title"]')?.attr('content')?.split(' ').pop(); buildId = tagResponse.data.match(/"buildId":"(.*?)",/)[1]; } diff --git a/lib/routes/hellogithub/report.ts b/lib/routes/hellogithub/report.ts index 9b9e77ccdea5ec..734e98e3b8bdc9 100644 --- a/lib/routes/hellogithub/report.ts +++ b/lib/routes/hellogithub/report.ts @@ -15,7 +15,8 @@ const types = { export const route: Route = { path: ['/ranking/:type?', '/report/:type?'], - name: 'Unknown', + example: '/hellogithub/ranking', + name: '榜单报告', maintainers: ['moke8', 'nczitzk'], handler, description: `| 编程语言 | 服务器 | 数据库 | diff --git a/lib/routes/hellogithub/volume.ts b/lib/routes/hellogithub/volume.ts index 8f675c7f622375..34bd20a219b2b0 100644 --- a/lib/routes/hellogithub/volume.ts +++ b/lib/routes/hellogithub/volume.ts @@ -10,6 +10,8 @@ const md = MarkdownIt({ html: true, }); import { load } from 'cheerio'; +import cache from '@/utils/cache'; +import { config } from '@/config'; art.defaults.imports.render = function (string) { return md.render(string); @@ -17,12 +19,14 @@ art.defaults.imports.render = function (string) { export const route: Route = { path: ['/month', '/volume'], - name: 'Unknown', - maintainers: ['moke8', 'nczitzk'], + example: '/hellogithub/volume', + name: '月刊', + maintainers: ['moke8', 'nczitzk', 'CaoMeiYouRen'], handler, }; -async function handler() { +async function handler(ctx) { + const limit: number = Number.parseInt(ctx.req.query('limit')) || 10; const rootUrl = 'https://hellogithub.com'; const apiUrl = 'https://api.hellogithub.com/v1/periodical/'; @@ -30,33 +34,44 @@ async function handler() { method: 'get', url: apiUrl, }); - const current = periodicalResponse.data.volumes[0].num; - const currentUrl = `${rootUrl}/periodical/volume/${current}`; - const buildResponse = await got({ - method: 'get', - url: currentUrl, - }); + const volumes = periodicalResponse.data.volumes.slice(0, limit); - const $ = load(buildResponse.data); + const items = await Promise.all( + volumes.map(async (volume) => { + const current = volume.num; + const currentUrl = `${rootUrl}/periodical/volume/${current}`; + const key = `hellogithub:${currentUrl}`; + return await cache.tryGet( + key, + async () => { + const buildResponse = await got({ + method: 'get', + url: currentUrl, + }); - const text = $('#__NEXT_DATA__').text(); - const response = JSON.parse(text); - const data = response.props; - const id = data.pageProps.volume.current_num; + const $ = load(buildResponse.data); - const items = [ - { - title: `No.${id}`, - link: `${rootUrl}/periodical/volume/${id}`, - description: art(path.join(__dirname, 'templates/volume.art'), { - data: data.pageProps.volume.data, - }), - }, - ]; + const text = $('#__NEXT_DATA__').text(); + const response = JSON.parse(text); + const data = response.props; + const id = data.pageProps.volume.current_num; + return { + title: `《HelloGitHub》第 ${id} 期`, + link: `${rootUrl}/periodical/volume/${id}`, + description: art(path.join(__dirname, 'templates/volume.art'), { + data: data.pageProps.volume.data, + }), + }; + }, + config.cache.routeExpire, + false + ); + }) + ); return { title: 'HelloGithub - 月刊', - link: currentUrl, + link: 'https://hellogithub.com/periodical', item: items, }; } diff --git a/lib/routes/olevod/namespace.ts b/lib/routes/olevod/namespace.ts new file mode 100644 index 00000000000000..c0bcbcee5895c0 --- /dev/null +++ b/lib/routes/olevod/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '欧乐影院', + url: 'olevod.one', +}; diff --git a/lib/routes/olevod/vod.ts b/lib/routes/olevod/vod.ts new file mode 100644 index 00000000000000..7f945ad78c0977 --- /dev/null +++ b/lib/routes/olevod/vod.ts @@ -0,0 +1,49 @@ +import { Route } from '@/types'; +import { load } from 'cheerio'; +import ofetch from '@/utils/ofetch'; + +export const route: Route = { + path: '/vod/:id', + categories: ['multimedia'], + example: '/olevod/vod/202449091', + parameters: { id: '视频id号' }, + radar: [ + { + source: ['www.olevod.one/vod/:id'], + target: '/vod/:id', + }, + ], + name: '视频', + maintainers: ['fang63625'], + handler, +}; + +async function handler(ctx) { + const urlBase = 'https://www.olevod.one'; + const id = ctx.req.param('id'); + const url = `${urlBase}/vod/${id}`; + + const response = await ofetch(url); + const $ = load(response); + + const title = $('.title.scookie').text().trim(); + const image = $('.vodlist_thumb.lazyload').attr('data-original'); + const items = $('.content_playlist.clearfix a') + .toArray() + .map((item) => { + const tmp = $(item); + const href = urlBase + tmp.attr('href'); + + return { + title: `${title} ${tmp.text()}`, + link: href, + }; + }); + + return { + title, + link: url, + item: items, + image: urlBase + image, + }; +} diff --git a/lib/routes/olevod/vodlist.ts b/lib/routes/olevod/vodlist.ts new file mode 100644 index 00000000000000..39ac6f6932126c --- /dev/null +++ b/lib/routes/olevod/vodlist.ts @@ -0,0 +1,48 @@ +import { Route } from '@/types'; +import { load } from 'cheerio'; +import ofetch from '@/utils/ofetch'; + +export const route: Route = { + path: '/vodlist', + categories: ['multimedia'], + example: '/olevod/vodlist', + radar: [ + { + source: ['www.olevod.one'], + target: '/vodlist', + }, + ], + name: '最新视频', + maintainers: ['fang63625'], + handler, +}; + +async function handler() { + const urlBase = 'https://www.olevod.one'; + const title = '欧乐影院 最新视频'; + + const response = await ofetch(urlBase); + const $ = load(response); + + const items = $('.cbox1 .vodlist_thumb.lazyload') + .toArray() + .map((item) => { + const tmp = $(item); + const href = urlBase + tmp.attr('href'); + const title = tmp.attr('title'); + const image = urlBase + tmp.attr('data-original'); + + return { + title: `${title} ${tmp.find('.pic_text.text_right').text()}`, + link: href, + image, + description: `豆瓣评分 ${tmp.find('.text_right.text_dy').text()}`, + }; + }); + + return { + title, + link: urlBase, + item: items, + }; +} diff --git a/lib/routes/ollama/models.ts b/lib/routes/ollama/models.ts new file mode 100644 index 00000000000000..335fe40424258f --- /dev/null +++ b/lib/routes/ollama/models.ts @@ -0,0 +1,39 @@ +import { Route } from '@/types'; +import ofetch from '@/utils/ofetch'; +import { load } from 'cheerio'; + +export const route: Route = { + path: '/library', + categories: ['programming'], + example: '/ollama/library', + radar: [ + { + source: ['ollama.com/library'], + }, + ], + name: 'Models', + maintainers: ['Nick22nd'], + handler, +}; +async function handler() { + const response = await ofetch('https://ollama.com/library'); + const $ = load(response); + const items = $('#repo > ul > li > a') + .toArray() + .map((item) => { + const name = $(item).children('h2').first(); + const link = $(item).attr('href'); + const description = $(item).children('p').first(); + + return { + title: name.text(), + link, + description: description.text(), + }; + }); + return { + title: 'ollama library', + link: 'https://ollama.com/library', + item: items, + }; +} diff --git a/lib/routes/ollama/namespace.ts b/lib/routes/ollama/namespace.ts new file mode 100644 index 00000000000000..1e60b826e13473 --- /dev/null +++ b/lib/routes/ollama/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'Ollama', + url: 'ollama.com', +}; diff --git a/lib/routes/sjtu/yzb/zkxx.ts b/lib/routes/sjtu/yzb/zkxx.ts index a90cbb62904a02..69ee5f8f943e30 100644 --- a/lib/routes/sjtu/yzb/zkxx.ts +++ b/lib/routes/sjtu/yzb/zkxx.ts @@ -47,8 +47,8 @@ async function handler(ctx) { .toArray() .map((elem) => ({ link: new URL(elem.attribs.href, pageUrl).href, - title: elem.attribs.title, - pubDate: parseDate($(elem.next).text().trim()), + title: $(elem).text(), + pubDate: parseDate($(elem.next?.next).text().trim()), })), }; } diff --git a/lib/routes/sohu/mp.ts b/lib/routes/sohu/mp.ts index 8a6ca2f05c6123..b822b5f7f6eff3 100644 --- a/lib/routes/sohu/mp.ts +++ b/lib/routes/sohu/mp.ts @@ -3,88 +3,208 @@ import { getCurrentPath } from '@/utils/helpers'; const __dirname = getCurrentPath(import.meta.url); import cache from '@/utils/cache'; -import got from '@/utils/got'; -import { load } from 'cheerio'; +import ofetch from '@/utils/ofetch'; +import * as cheerio from 'cheerio'; import { parseDate } from '@/utils/parse-date'; import path from 'node:path'; import { art } from '@/utils/render'; export const route: Route = { - path: '/mp/:id', + path: '/mp/:xpt', categories: ['new-media'], - example: '/sohu/mp/119097', - parameters: { id: '搜狐号 ID' }, - features: { - requireConfig: false, - requirePuppeteer: false, - antiCrawler: false, - supportBT: false, - supportPodcast: false, - supportScihub: false, - }, - name: '更新', + example: '/sohu/mp/c29odXptdGhnbjZ3NEBzb2h1LmNvbQ==', + parameters: { xpt: '搜狐号 xpt ,可在URL中找到或搜狐号 ID' }, + radar: [ + { + source: ['mp.sohu.com/profile'], + target: (_params, url) => `/sohu/mp/${new URL(url).searchParams.get('xpt')}`, + }, + ], + name: '最新', maintainers: ['HenryQW'], handler, - description: `1. 通过浏览器搜索相关搜狐号 \`果壳 site: mp.sohu.com\`。 - 2. 通过浏览器控制台执行 \`contentData.mkey\`,返回的即为搜狐号 ID。`, + description: `搜狐号 ID 可以通过以下方式获取: + 1. 通过浏览器搜索相关搜狐号 \`果壳 site: mp.sohu.com\`。 + 2. 通过浏览器控制台执行 \`window.globalConst.mkeyConst_mkey\`,返回的即为搜狐号 ID。`, }; +function randomString(length = 32) { + let r = ''; + const e = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; + const n = e.length; + for (let i = 0; i < length; i++) { + r += e.charAt(Math.floor(Math.random() * n)); + } + return r; +} +const defaultSUV = '1612268936507kas0gk'; + +function fetchArticle(item) { + return cache.tryGet(item.link, async () => { + const response = await ofetch(item.link); + const $ = cheerio.load(response); + + $('.original-title, .lookall-box').remove(); + item.author = item.author || $('span[data-role="original-link"] a').text(); + + if (/window\.sohu_mp\.article_video/.test($('script').text())) { + const videoSrc = $('script') + .text() + .match(/\s*url: "(.*?)",/)?.[1]; + item.description = art(path.join(__dirname, 'templates/video.art'), { + poster: $('script') + .text() + .match(/cover: "(.*?)",/)?.[1], + src: videoSrc, + type: videoSrc?.split('.').pop()?.toLowerCase(), + }); + } else { + const article = $('#mp-editor'); + + article.find('#backsohucom, p[data-role="editor-name"]').each((i, e) => { + $(e).remove(); + }); + + item.description = article.html(); + } + + return item; + }); +} + async function handler(ctx) { - const id = ctx.req.param('id'); + const xpt = ctx.req.param('xpt'); + const isPureNumber = /^\d+$/.test(xpt); + if (isPureNumber) { + return legacyIdHandler(ctx); + } + + const pageResponse = await ofetch.raw('https://mp.sohu.com/profile', { + query: { + xpt, + }, + }); + const suv = pageResponse.headers + ?.getSetCookie() + .find((e) => e.startsWith('SUV')) + ?.split(';')[0]; + const $ = cheerio.load(pageResponse._data); + + const CBDRenderConst = JSON.parse( + $('script:contains("CBDRenderConst")') + .text() + .trim() + .match(/CBDRenderConst\s=\s(.*)/)?.[1] || '{}' + ); + const contentData = JSON.parse( + $('script:contains("contentData")') + .toArray() + .map( + (e) => + $(e) + .text() + .match(/contentData = (.*)/)?.[1] + ) + .sort((a: any, b: any) => b.length - a.length)[0] || '{}' + ); + const renderData = JSON.parse( + $('script:contains("column_2_text")') + .text() + .match(/renderData:\s(.*)/)?.[1] || '{}' + ); + const globalConst = JSON.parse( + $('script:contains("globalConst")') + .text() + .match(/globalConst\s=\s(.*)/)?.[1] || '{}' + ); + const originalRequest = JSON.parse( + $('script:contains("originalRequest")') + .text() + .match(/originalRequest\s=\s(.*)/)?.[1] || '{}' + ); + + const blockData = await ofetch('https://odin.sohu.com/odin/api/blockdata', { + method: 'POST', + headers: { + Cookie: Object.entries({ + SUV: suv, + itssohu: 'true', + reqtype: 'pc', + t: Date.now(), + }) + .map(([key, value]) => `${key}=${value}`) + .join('; '), + }, + body: { + pvId: CBDRenderConst.COMMONCONFIG.pvId || `${Date.now()}_${randomString(7)}`, + pageId: `${Date.now()}_${defaultSUV.slice(0, -5)}_${randomString(3)}`, + mainContent: { + productType: contentData.businessType || '13', + productId: contentData.id || '324', + secureScore: contentData.secureScore || '5', + categoryId: contentData.categoryId || '47', + adTags: contentData.adTags || '11111111', + authorId: contentData.account.id || 121_135_924, + }, + resourceList: [ + { + tplCompKey: renderData.param.data2.reqParam.tplCompKey || 'FeedSlideloadAuthor_2_0_pc_1655965929143_data2', + isServerRender: renderData.param.data2.reqParam.isServerRender || false, + isSingleAd: renderData.param.data2.reqParam.isSingleAd || false, + configSource: renderData.param.data2.reqParam.configSource || 'mp', + content: { + productId: renderData.param.data2.reqParam.content.productId || '325', + productType: renderData.param.data2.reqParam.content.productType || '13', + size: 20, + pro: renderData.param.pro || '0,1,3,4,5', + feedType: renderData.param.feedType || 'XTOPIC_SYNTHETICAL', + view: '', + innerTag: renderData.param.data2.reqParam.content.innerTag || 'work', + spm: renderData.param.data2.reqParam.content.spm || 'smpc.channel_248.block3_308_hHsK47_2_fd', + page: 1, + requestId: `${Date.now()}_${randomString(13)}_${contentData.id}`, + }, + adInfo: {}, + context: { + mkey: globalConst.mkeyConst_mkey, // legacy ID + }, + }, + ], + }, + }); + + const list = blockData.data[renderData.param.data2.reqParam.tplCompKey].list.map((item) => ({ + title: item.title, + description: item.brief, + link: `https://www.sohu.com/a/${item.id}_${item.authorId}`, + author: item.authorName, + pubDate: parseDate(item.postTime, 'x'), + })); + + const items = await Promise.all(list.map((e) => fetchArticle(e))); + + return { + title: `搜狐号 - ${globalConst.title}`, + link: originalRequest.url, + item: items, + }; +} + +async function legacyIdHandler(ctx) { + const id = ctx.req.param('xpt'); const authorArticleAPI = `https://v2.sohu.com/author-page-api/author-articles/pc/${id}`; - const response = await got(authorArticleAPI); - const list = response.data.data.pcArticleVOS.map((item) => ({ + const response = await ofetch(authorArticleAPI); + const list = response.data.pcArticleVOS.map((item) => ({ title: item.title, link: item.link.startsWith('http') ? item.link : `https://${item.link}`, pubDate: parseDate(item.publicTime), })); - let author, link; - - const items = await Promise.all( - list.map((e) => - cache.tryGet(e.link, async () => { - const { data: response } = await got(e.link); - const $ = load(response); - - if (!author) { - const meta = $('span[data-role="original-link"]'); - author = meta.find('a').text(); - // can't get author's link on server, so use the RSSHub link - // link = meta.attr('href').split('==')[0]; - } - - if (/window\.sohu_mp\.article_video/.test($('script').text())) { - const videoSrc = $('script') - .text() - .match(/\s*url: "(.*?)",/)?.[1]; - e.description = art(path.join(__dirname, 'templates/video.art'), { - poster: $('script') - .text() - .match(/cover: "(.*?)",/)?.[1], - src: videoSrc, - type: videoSrc?.split('.').pop().toLowerCase(), - }); - } else { - const article = $('#mp-editor'); - - article.find('#backsohucom, p[data-role="editor-name"]').each((i, e) => { - $(e).remove(); - }); - - e.description = article.html(); - } - - e.author = author; - - return e; - }) - ) - ); + + const items = await Promise.all(list.map((e) => fetchArticle(e))); return { - title: `搜狐号 - ${author}`, - link, + title: `搜狐号 - ${id}`, item: items, }; } diff --git a/lib/routes/stbu/jsjxy.ts b/lib/routes/stbu/jsjxy.ts index 81f739a9ffb11a..2f4a8333f8187d 100644 --- a/lib/routes/stbu/jsjxy.ts +++ b/lib/routes/stbu/jsjxy.ts @@ -15,17 +15,17 @@ export const route: Route = { features: { requireConfig: false, requirePuppeteer: false, - antiCrawler: false, + antiCrawler: true, supportBT: false, supportPodcast: false, supportScihub: false, }, radar: [ { - source: ['jsjxy.stbu.edu.cn/news', 'jsjxy.stbu.edu.cn/'], + source: ['jsjxy.stbu.edu.cn/news', 'jsjxy.stbu.edu.cn', 'stbu.edu.cn'], }, ], - name: '计算机学院通知公告', + name: '计算机学院 - 通知公告', maintainers: ['HyperCherry'], handler, url: 'jsjxy.stbu.edu.cn/news', diff --git a/lib/routes/stbu/xyxw.ts b/lib/routes/stbu/xyxw.ts index ec9a75c1062b99..a93e25bedafd03 100644 --- a/lib/routes/stbu/xyxw.ts +++ b/lib/routes/stbu/xyxw.ts @@ -9,19 +9,30 @@ import timezone from '@/utils/timezone'; const gbk2utf8 = (s) => iconv.decode(s, 'gbk'); export const route: Route = { path: '/xyxw', + categories: ['university'], + example: '/stbu/xyxw', + parameters: {}, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: true, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, radar: [ { - source: ['stbu.edu.cn/html/news/xueyuan', 'stbu.edu.cn/'], + source: ['stbu.edu.cn/html/news/xueyuan', 'stbu.edu.cn'], }, ], - name: 'Unknown', + name: '学院新闻', maintainers: ['HyperCherry'], handler, url: 'stbu.edu.cn/html/news/xueyuan', }; async function handler() { - const baseUrl = 'https://www.stbu.edu.cn'; + const baseUrl = 'http://www.stbu.edu.cn'; const requestUrl = `${baseUrl}/html/news/xueyuan/`; const { data: response } = await got(requestUrl, { responseType: 'buffer', diff --git a/lib/routes/weibo/keyword.ts b/lib/routes/weibo/keyword.ts index b56e926c221731..df8b1b2cd27bab 100644 --- a/lib/routes/weibo/keyword.ts +++ b/lib/routes/weibo/keyword.ts @@ -53,15 +53,17 @@ async function handler(ctx) { title: `又有人在微博提到${keyword}了`, link: `http://s.weibo.com/weibo/${encodeURIComponent(keyword)}&b=1&nodup=1`, description: `又有人在微博提到${keyword}了`, - item: data.map((item) => { - item.mblog.created_at = timezone(item.mblog.created_at, +8); - if (item.mblog.retweeted_status && item.mblog.retweeted_status.created_at) { - item.mblog.retweeted_status.created_at = timezone(item.mblog.retweeted_status.created_at, +8); - } - return weiboUtils.formatExtended(ctx, item.mblog, undefined, { - showAuthorInTitle: fallback(undefined, queryToBoolean(routeParams.showAuthorInTitle), true), - showAuthorInDesc: fallback(undefined, queryToBoolean(routeParams.showAuthorInDesc), true), - }); - }), + item: data + .filter((i) => i.mblog) + .map((item) => { + item.mblog.created_at = timezone(item.mblog.created_at, +8); + if (item.mblog.retweeted_status && item.mblog.retweeted_status.created_at) { + item.mblog.retweeted_status.created_at = timezone(item.mblog.retweeted_status.created_at, +8); + } + return weiboUtils.formatExtended(ctx, item.mblog, undefined, { + showAuthorInTitle: fallback(undefined, queryToBoolean(routeParams.showAuthorInTitle), true), + showAuthorInDesc: fallback(undefined, queryToBoolean(routeParams.showAuthorInDesc), true), + }); + }), }); } diff --git a/package.json b/package.json index 49347779594825..5aff9bff67f703 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,8 @@ "scripts": { "build": "tsx scripts/workflow/build-routes.ts", "build:docs": "tsx scripts/workflow/build-docs.ts", - "dev": "cross-env NODE_ENV=dev tsx watch --no-cache lib/index.ts", - "dev:cache": "cross-env NODE_ENV=production tsx watch lib/index.ts", + "dev": "cross-env NODE_ENV=dev tsx watch --clear-screen=false lib/index.ts", + "dev:cache": "cross-env NODE_ENV=production tsx watch --clear-screen=false lib/index.ts", "format": "prettier \"**/*.{ts,tsx,js,json}\" --write && eslint --cache --fix \"**/*.{ts,tsx,js,yml}\"", "format:check": "prettier \"**/*.{ts,tsx,js,json}\" --check && eslint --cache \"**/*.{ts,tsx,js,yml}\"", "format:staged": "lint-staged", @@ -50,13 +50,13 @@ "*.yml": "eslint --cache --fix" }, "dependencies": { - "@hono/node-server": "1.11.0", + "@hono/node-server": "1.11.1", "@hono/swagger-ui": "0.2.1", "@hono/zod-openapi": "0.11.0", "@notionhq/client": "2.2.15", "@postlight/parser": "2.2.3", "@sentry/node": "7.112.2", - "@tonyrl/rand-user-agent": "2.0.60", + "@tonyrl/rand-user-agent": "2.0.61", "aes-js": "3.1.2", "art-template": "4.13.2", "bbcodejs": "0.0.4", @@ -75,7 +75,7 @@ "fanfou-sdk": "5.0.0", "form-data": "4.0.0", "googleapis": "135.0.0", - "hono": "4.2.7", + "hono": "4.2.8", "html-to-text": "9.0.5", "https-proxy-agent": "7.0.4", "iconv-lite": "0.6.3", @@ -86,7 +86,7 @@ "jsdom": "24.0.0", "json-bigint": "1.0.0", "jsrsasign": "10.9.0", - "lru-cache": "10.2.1", + "lru-cache": "10.2.2", "lz-string": "1.5.0", "mailparser": "3.7.1", "markdown-it": "14.1.0", @@ -115,7 +115,7 @@ "title": "3.5.3", "tldts": "6.1.18", "tosource": "2.0.0-alpha.3", - "tough-cookie": "4.1.3", + "tough-cookie": "4.1.4", "tsx": "4.7.3", "twitter-api-v2": "1.16.3", "undici": "6.14.1", @@ -125,7 +125,7 @@ "zod": "3.23.4" }, "devDependencies": { - "@babel/preset-env": "7.24.4", + "@babel/preset-env": "7.24.5", "@babel/preset-typescript": "7.24.1", "@microsoft/eslint-formatter-sarif": "3.1.0", "@stylistic/eslint-plugin": "1.7.2", @@ -154,7 +154,7 @@ "@types/tough-cookie": "4.0.5", "@types/uuid": "9.0.8", "@typescript-eslint/eslint-plugin": "7.7.1", - "@typescript-eslint/parser": "7.7.1", + "@typescript-eslint/parser": "7.8.0", "@vercel/nft": "0.26.4", "@vitest/coverage-v8": "1.5.2", "eslint": "8.57.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e687ceee2a9aaa..e8caad104d9b26 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,14 +6,14 @@ settings: dependencies: '@hono/node-server': - specifier: 1.11.0 - version: 1.11.0 + specifier: 1.11.1 + version: 1.11.1 '@hono/swagger-ui': specifier: 0.2.1 - version: 0.2.1(hono@4.2.7) + version: 0.2.1(hono@4.2.8) '@hono/zod-openapi': specifier: 0.11.0 - version: 0.11.0(hono@4.2.7)(zod@3.23.4) + version: 0.11.0(hono@4.2.8)(zod@3.23.4) '@notionhq/client': specifier: 2.2.15 version: 2.2.15 @@ -24,8 +24,8 @@ dependencies: specifier: 7.112.2 version: 7.112.2 '@tonyrl/rand-user-agent': - specifier: 2.0.60 - version: 2.0.60 + specifier: 2.0.61 + version: 2.0.61 aes-js: specifier: 3.1.2 version: 3.1.2 @@ -81,8 +81,8 @@ dependencies: specifier: 135.0.0 version: 135.0.0 hono: - specifier: 4.2.7 - version: 4.2.7 + specifier: 4.2.8 + version: 4.2.8 html-to-text: specifier: 9.0.5 version: 9.0.5 @@ -114,8 +114,8 @@ dependencies: specifier: 10.9.0 version: 10.9.0 lru-cache: - specifier: 10.2.1 - version: 10.2.1 + specifier: 10.2.2 + version: 10.2.2 lz-string: specifier: 1.5.0 version: 1.5.0 @@ -201,8 +201,8 @@ dependencies: specifier: 2.0.0-alpha.3 version: 2.0.0-alpha.3 tough-cookie: - specifier: 4.1.3 - version: 4.1.3 + specifier: 4.1.4 + version: 4.1.4 tsx: specifier: 4.7.3 version: 4.7.3 @@ -227,8 +227,8 @@ dependencies: devDependencies: '@babel/preset-env': - specifier: 7.24.4 - version: 7.24.4(@babel/core@7.24.4) + specifier: 7.24.5 + version: 7.24.5(@babel/core@7.24.4) '@babel/preset-typescript': specifier: 7.24.1 version: 7.24.1(@babel/core@7.24.4) @@ -312,10 +312,10 @@ devDependencies: version: 9.0.8 '@typescript-eslint/eslint-plugin': specifier: 7.7.1 - version: 7.7.1(@typescript-eslint/parser@7.7.1)(eslint@8.57.0)(typescript@5.4.5) + version: 7.7.1(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': - specifier: 7.7.1 - version: 7.7.1(eslint@8.57.0)(typescript@5.4.5) + specifier: 7.8.0 + version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) '@vercel/nft': specifier: 0.26.4 version: 0.26.4 @@ -504,6 +504,24 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.4): + resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.24.5 + semver: 6.3.1 + dev: true + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.4): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} @@ -523,7 +541,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.8 @@ -558,6 +576,13 @@ packages: '@babel/types': 7.24.0 dev: true + /@babel/helper-member-expression-to-functions@7.24.5: + resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: true + /@babel/helper-module-imports@7.24.3: resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} @@ -591,6 +616,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-plugin-utils@7.24.5: + resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.4): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} @@ -636,15 +666,32 @@ packages: '@babel/types': 7.24.0 dev: true + /@babel/helper-split-export-declaration@7.24.5: + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.5 + dev: true + /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-string-parser@7.24.1: + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier@7.24.5: + resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} @@ -687,15 +734,15 @@ packages: '@babel/types': 7.24.0 dev: true - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==} + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.4): + resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.4): @@ -705,7 +752,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.4): @@ -715,9 +762,9 @@ packages: '@babel/core': ^7.13.0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.4) dev: true /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.4): @@ -728,7 +775,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.4): @@ -746,7 +793,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4): @@ -755,7 +802,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.4): @@ -765,7 +812,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.4): @@ -774,7 +821,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.4): @@ -783,7 +830,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.4): @@ -793,7 +840,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.4): @@ -803,7 +850,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4): @@ -812,7 +859,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4): @@ -821,7 +868,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4): @@ -840,7 +887,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4): @@ -849,7 +896,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4): @@ -858,7 +905,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4): @@ -867,7 +914,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4): @@ -876,7 +923,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4): @@ -885,7 +932,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.4): @@ -895,7 +942,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4): @@ -905,7 +952,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): @@ -926,7 +973,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.4): @@ -936,7 +983,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.4): @@ -947,7 +994,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4) dev: true @@ -960,7 +1007,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.4) dev: true @@ -971,17 +1018,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true - /@babel/plugin-transform-block-scoping@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==} + /@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.4): + resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.4): @@ -992,7 +1039,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.4): @@ -1003,12 +1050,12 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.4) dev: true - /@babel/plugin-transform-classes@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} + /@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.4): + resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1018,9 +1065,9 @@ packages: '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-split-export-declaration': 7.24.5 globals: 11.12.0 dev: true @@ -1031,18 +1078,18 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/template': 7.24.0 dev: true - /@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} + /@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.4): + resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.4): @@ -1053,7 +1100,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.4): @@ -1063,7 +1110,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.4): @@ -1073,7 +1120,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.4) dev: true @@ -1085,7 +1132,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.4): @@ -1095,7 +1142,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.4) dev: true @@ -1106,7 +1153,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true @@ -1119,7 +1166,7 @@ packages: '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.4): @@ -1129,7 +1176,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4) dev: true @@ -1140,7 +1187,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.4): @@ -1150,7 +1197,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4) dev: true @@ -1161,7 +1208,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.4): @@ -1172,7 +1219,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.4): @@ -1196,7 +1243,7 @@ packages: '@babel/core': 7.24.4 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-validator-identifier': 7.22.20 dev: true @@ -1208,7 +1255,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.4): @@ -1219,7 +1266,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.4): @@ -1229,7 +1276,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.4): @@ -1239,7 +1286,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4) dev: true @@ -1250,21 +1297,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4) dev: true - /@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} + /@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.4): + resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.4) dev: true /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.4): @@ -1274,7 +1321,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) dev: true @@ -1285,30 +1332,30 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4) dev: true - /@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} + /@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.4): + resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4) dev: true - /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} + /@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.4): + resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.4): @@ -1319,19 +1366,19 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true - /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} + /@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.4): + resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.4) + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.4) dev: true @@ -1342,7 +1389,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.4): @@ -1352,7 +1399,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 regenerator-transform: 0.15.2 dev: true @@ -1363,7 +1410,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.4): @@ -1373,7 +1420,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.4): @@ -1383,7 +1430,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true @@ -1394,7 +1441,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.4): @@ -1404,17 +1451,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true - /@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.24.4): - resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} + /@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.4): + resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-typescript@7.24.4(@babel/core@7.24.4): @@ -1437,7 +1484,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.4): @@ -1448,7 +1495,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.4): @@ -1459,7 +1506,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.4): @@ -1470,11 +1517,11 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true - /@babel/preset-env@7.24.4(@babel/core@7.24.4): - resolution: {integrity: sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==} + /@babel/preset-env@7.24.5(@babel/core@7.24.4): + resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1482,9 +1529,9 @@ packages: '@babel/compat-data': 7.24.4 '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.4) '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.4) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.4) '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.4) @@ -1511,12 +1558,12 @@ packages: '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.4) '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-block-scoping': 7.24.4(@babel/core@7.24.4) + '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.4) '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.4) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.4) '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.4) '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.4) @@ -1536,13 +1583,13 @@ packages: '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.24.4) '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.4) + '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.4) '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.4) '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.4) @@ -1550,7 +1597,7 @@ packages: '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.24.4) '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.4) '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.4) @@ -1571,7 +1618,7 @@ packages: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/types': 7.24.0 esutils: 2.0.3 dev: true @@ -1645,6 +1692,15 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types@7.24.5: + resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.24.5 + to-fast-properties: 2.0.0 + dev: true + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -2129,20 +2185,20 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@hono/node-server@1.11.0: - resolution: {integrity: sha512-TLIJq9TMtD1NEG1mVoqNUn1Ita0qSaB5XboZErjFBcO/GJYXwWY4dVdTi9G0lbxtu0x+hJXDItcLaFHb7rlFTw==} + /@hono/node-server@1.11.1: + resolution: {integrity: sha512-GW1Iomhmm1o4Z+X57xGby8A35Cu9UZLL7pSMdqDBkD99U5cywff8F+8hLk5aBTzNubnsFAvWQ/fZjNwPsEn9lA==} engines: {node: '>=18.14.1'} dev: false - /@hono/swagger-ui@0.2.1(hono@4.2.7): + /@hono/swagger-ui@0.2.1(hono@4.2.8): resolution: {integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==} peerDependencies: hono: '*' dependencies: - hono: 4.2.7 + hono: 4.2.8 dev: false - /@hono/zod-openapi@0.11.0(hono@4.2.7)(zod@3.23.4): + /@hono/zod-openapi@0.11.0(hono@4.2.8)(zod@3.23.4): resolution: {integrity: sha512-thbxV4lWJoDo1NjF8ZGnd0muD3UHUpRqpKvS3RI+kWCXU05nyuViymUbPvVpp+O6i5SjovITTF91NRMTraZm3Q==} engines: {node: '>=16.0.0'} peerDependencies: @@ -2150,18 +2206,18 @@ packages: zod: 3.* dependencies: '@asteasolutions/zod-to-openapi': 7.0.0(zod@3.23.4) - '@hono/zod-validator': 0.2.1(hono@4.2.7)(zod@3.23.4) - hono: 4.2.7 + '@hono/zod-validator': 0.2.1(hono@4.2.8)(zod@3.23.4) + hono: 4.2.8 zod: 3.23.4 dev: false - /@hono/zod-validator@0.2.1(hono@4.2.7)(zod@3.23.4): + /@hono/zod-validator@0.2.1(hono@4.2.8)(zod@3.23.4): resolution: {integrity: sha512-HFoxln7Q6JsE64qz2WBS28SD33UB2alp3aRKmcWnNLDzEL1BLsWfbdX6e1HIiUprHYTIXf5y7ax8eYidKUwyaA==} peerDependencies: hono: '>=3.9.0' zod: ^3.19.1 dependencies: - hono: 4.2.7 + hono: 4.2.8 zod: 3.23.4 dev: false @@ -2793,8 +2849,8 @@ packages: dependencies: defer-to-connect: 2.0.1 - /@tonyrl/rand-user-agent@2.0.60: - resolution: {integrity: sha512-aECrYYbIRNbIz8LlgwAoOF9rc0WgGRwuzLvSVny/kzdtJCkszZjMRs4/WpFdRIiGWrw6KZ21O05CXeaFp0eNZw==} + /@tonyrl/rand-user-agent@2.0.61: + resolution: {integrity: sha512-sa/xm6BzI8FsDRk/jBJY8H2dI6JZ/SSDTRA/JW7aPSn6kJnPiHwPeWpGF3hATK/bgKgfKd5I0a/TePibemicwA==} engines: {node: '>=14.16'} dev: false @@ -3055,7 +3111,7 @@ packages: dev: false optional: true - /@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1)(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -3067,7 +3123,7 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/scope-manager': 7.7.1 '@typescript-eslint/type-utils': 7.7.1(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/utils': 7.7.1(eslint@8.57.0)(typescript@5.4.5) @@ -3084,8 +3140,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==} + /@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -3094,10 +3150,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.7.1 - '@typescript-eslint/types': 7.7.1 - '@typescript-eslint/typescript-estree': 7.7.1(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.7.1 + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.8.0 debug: 4.3.4 eslint: 8.57.0 typescript: 5.4.5 @@ -3121,6 +3177,14 @@ packages: '@typescript-eslint/visitor-keys': 7.7.1 dev: true + /@typescript-eslint/scope-manager@7.8.0: + resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 + dev: true + /@typescript-eslint/type-utils@7.7.1(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3151,6 +3215,11 @@ packages: engines: {node: ^18.18.0 || >=20.0.0} dev: true + /@typescript-eslint/types@7.8.0: + resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} + engines: {node: ^18.18.0 || >=20.0.0} + dev: true + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5): resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3195,6 +3264,28 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5): + resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -3249,6 +3340,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@typescript-eslint/visitor-keys@7.8.0: + resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} + engines: {node: ^18.18.0 || >=20.0.0} + dependencies: + '@typescript-eslint/types': 7.8.0 + eslint-visitor-keys: 3.4.3 + dev: true + /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true @@ -5812,8 +5911,8 @@ packages: resolution: {integrity: sha512-4FP6J0oI8jqb6gLLl9tSwVdosWJ/AKSGJ+HwYf6Ixe4MUcEkst4uWzpVQrNOCin0fzTRQbXV8ePheU8WiiDYBw==} dev: false - /hono@4.2.7: - resolution: {integrity: sha512-k1xHi86tJnRIVvqhFMBDGFKJ8r5O+bEsT4P59ZK59r0F300Xd910/r237inVfuT/VmE86RQQffX4OYNda6dLXw==} + /hono@4.2.8: + resolution: {integrity: sha512-re/zNrOWb7Sp9KhojlMEgcgvqsE8Rgk9IcmumqsbKa9ruPT5XuOcx1U+xuNaI4SUnwrPsiTQ72MiodtpJEVfjg==} engines: {node: '>=16.0.0'} dev: false @@ -6370,7 +6469,7 @@ packages: rrweb-cssom: 0.6.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.3 + tough-cookie: 4.1.4 w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 @@ -6752,8 +6851,8 @@ packages: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /lru-cache@10.2.1: - resolution: {integrity: sha512-tS24spDe/zXhWbNPErCHs/AGOzbKGHT+ybSBqmdLm8WZ1xXLWvH8Qn71QPAlqVhd0qUTWjy+Kl9JmISgDdEjsA==} + /lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} /lru-cache@4.1.5: @@ -7709,7 +7808,7 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.2.1 + lru-cache: 10.2.2 minipass: 5.0.0 dev: true @@ -9151,8 +9250,8 @@ packages: punycode: 2.3.1 dev: false - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + /tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} dependencies: psl: 1.9.0