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