diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index bac3e70e6b78fe..234ae8ab7a1781 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -49,19 +49,19 @@ jobs: uses: sigstore/cosign-installer@v3 - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Log in to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Log in to the Container registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} @@ -69,7 +69,7 @@ jobs: - name: Extract Docker metadata (ordinary version) id: meta-ordinary - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: | ${{ secrets.DOCKER_USERNAME }}/rsshub @@ -81,7 +81,7 @@ jobs: - name: Build and push Docker image (ordinary version) id: build-and-push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: context: . push: true @@ -99,7 +99,7 @@ jobs: - name: Extract Docker metadata (Chromium-bundled version) id: meta-chromium-bundled - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: | ${{ secrets.DOCKER_USERNAME }}/rsshub @@ -111,7 +111,7 @@ jobs: - name: Build and push Docker image (Chromium-bundled version) id: build-and-push-chromium - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: context: . build-args: PUPPETEER_SKIP_DOWNLOAD=0 diff --git a/.github/workflows/docker-test.yml b/.github/workflows/docker-test.yml index ad1a3d3599f471..7571ecb60f6007 100644 --- a/.github/workflows/docker-test.yml +++ b/.github/workflows/docker-test.yml @@ -36,17 +36,17 @@ jobs: uses: actions/checkout@v4 - name: Set up Docker Buildx # needed by `cache-from` - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Extract Docker metadata id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: rsshub flavor: latest=true - name: Build Docker image - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: context: . build-args: PUPPETEER_SKIP_DOWNLOAD=0 # also test bundling Chromium diff --git a/lib/radar.js b/lib/radar.js index 29efd6ee842b3a..af7cc6f9456bd2 100644 --- a/lib/radar.js +++ b/lib/radar.js @@ -4,7 +4,7 @@ const toSource = require('tosource'); const { join } = require('path'); // Namespaces that do not require radar.js -const allowNamespace = ['discourse', 'discuz', 'ehentai', 'test']; +const allowNamespace = ['discourse', 'discuz', 'ehentai', 'mail', 'test']; // Check if a radar.js file is exist under each folder of dirname for (const dir of fs.readdirSync(dirname)) { const dirPath = join(dirname, dir); diff --git a/lib/router.js b/lib/router.js index bfe570a958dcad..6b5c9781931be5 100644 --- a/lib/router.js +++ b/lib/router.js @@ -351,8 +351,8 @@ router.get('/kmust/job/careers/:type?', lazyloadRouteHandler('./routes/universit router.get('/kmust/job/jobfairs', lazyloadRouteHandler('./routes/universities/kmust/job/jobfairs')); // 武汉大学 -router.get('/whu/cs/:type', lazyloadRouteHandler('./routes/universities/whu/cs')); -router.get('/whu/news/:type?', lazyloadRouteHandler('./routes/universities/whu/news')); +// router.get('/whu/cs/:type', lazyloadRouteHandler('./routes/universities/whu/cs')); +// router.get('/whu/news/:type?', lazyloadRouteHandler('./routes/universities/whu/news')); // 井冈山大学 router.get('/jgsu/jwc', lazyloadRouteHandler('./routes/universities/jgsu/jwc')); @@ -1199,7 +1199,7 @@ router.get('/latexstudio/home', lazyloadRouteHandler('./routes/latexstudio/home' router.get('/jskou/:type?', lazyloadRouteHandler('./routes/jskou/index')); // 邮箱 -router.get('/mail/imap/:email', lazyloadRouteHandler('./routes/mail/imap')); +// router.get('/mail/imap/:email/:folder*', lazyloadRouteHandler('./routes/mail/imap')); // 好队友 router.get('/network360/jobs', lazyloadRouteHandler('./routes/network360/jobs')); diff --git a/lib/routes/mail/imap.js b/lib/routes/mail/imap.js deleted file mode 100644 index 5fea80ce2979d0..00000000000000 --- a/lib/routes/mail/imap.js +++ /dev/null @@ -1,79 +0,0 @@ -const ImapClient = require('emailjs-imap-client').default; -const queryString = require('query-string'); -const config = require('@/config').value; -const parser = require('mailparser').simpleParser; -const logger = require('@/utils/logger'); - -module.exports = async (ctx) => { - const email = ctx.params.email; - const mailConfig = Object.assign( - { - username: email, - password: '', - host: '', - port: 993, - }, - queryString.parse(config.email.config[email.replace(/[@.]/g, '_')]) - ); - - if (!mailConfig.username || !mailConfig.password || !mailConfig.host || !mailConfig.port) { - throw Error('please config email password, host, port in .env file'); - } - - const imap = new ImapClient(mailConfig.host, parseInt(mailConfig.port), { - logLevel: 'error', - auth: { - user: mailConfig.username, - pass: mailConfig.password, - }, - }); - - const mails = await imap - .connect() - .then(() => imap.selectMailbox('INBOX')) - .then((mailbox) => imap.listMessages('INBOX', `${Math.max(mailbox.exists - 9, 1)}:*`, ['uid', 'flags', 'envelope', 'body[]'])) - .then((messages) => messages) - .catch((error) => logger.error(error)) - .finally(() => { - imap.close(); - }); - - const ParserMail = async (data) => { - const mail = await parser(Buffer.from(data, 'binary')); - let content = mail.html || mail.textAsHtml; - if (mail.attachments.length > 0) { - content += `
${attachment.filename}
`; - }); - } - return content; - }; - - const items = await Promise.all( - mails.reverse().map(async (item) => { - const guid = item.envelope['message-id'] || `mail_${new Date(item.envelope.date).getTime()}`; - const cache = await ctx.cache.get(guid); - if (cache) { - return Promise.resolve(JSON.parse(cache)); - } - const description = await ParserMail(item['body[]']); - const single = { - title: item.envelope.subject, - description, - guid, - pubDate: item.envelope.date, - author: `${item.envelope.from[0].name}(${item.envelope.from[0].address})`, - }; - ctx.cache.set(guid, JSON.stringify(single)); - return Promise.resolve(single); - }) - ); - - ctx.state.data = { - title: `${email}的邮件列表`, - link: ``, - description: `${email}的邮件列表`, - item: items, - }; -}; diff --git a/lib/routes/universities/whu/cs.js b/lib/routes/universities/whu/cs.js deleted file mode 100644 index 9d51b24f5117ca..00000000000000 --- a/lib/routes/universities/whu/cs.js +++ /dev/null @@ -1,38 +0,0 @@ -const got = require('@/utils/got'); -const date = require('@/utils/date'); -const cheerio = require('cheerio'); - -const baseUrl = 'http://cs.whu.edu.cn'; -const typelist = ['新闻动态', '学术讲座', '学院通知', '公示公告']; - -module.exports = async (ctx) => { - const type = parseInt(ctx.params.type); - const response = await got.get(baseUrl); - const $ = cheerio.load(response.data); - let list; - if (type === 0) { - list = $('ul.txt-list>li'); - } else if (type === 1) { - list = $('div.talks-list'); - } else if (type === 2) { - list = $('div.fl>ul.list-wrap>li'); - } else if (type === 3) { - list = $('div.fr>ul.list-wrap>li'); - } - - ctx.state.data = { - title: `${typelist[type]} - 武汉大学计算机学院`, - link: baseUrl, - description: `${typelist[type]} - 武汉大学计算机学院`, - item: - list && - list - .map((index, item) => ({ - title: $(item).find('a').attr('title'), - description: $(item).find('p').text().trim(), - pubDate: date($(item).find('span').text()), - link: baseUrl + $(item).find('a').attr('href'), - })) - .get(), - }; -}; diff --git a/lib/routes/universities/whu/news.js b/lib/routes/universities/whu/news.js deleted file mode 100644 index 0716ab37d2fb82..00000000000000 --- a/lib/routes/universities/whu/news.js +++ /dev/null @@ -1,128 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); -// const url = require('url'); - -// 参考 bit/jwc 北京理工大学的的页面写成 - -const baseUrl = 'https://news.whu.edu.cn/'; -const sizeTitle = '--武汉大学新闻网'; - -const catrgoryMap = { - wdyw: '武大要闻', - mtwd: '媒体武大', - ztbd: '专题报道', - ljrw: '珞珈人物', - gjjl: '国际交流', - bfxy: '缤纷校园', - xyzs: '校友之声', - ljlt: '珞珈论坛', - xwrx: '新闻热线', - ttxw: '头条新闻', - zhxw: '综合新闻', - ljyx: '珞珈影像', - kydt: '学术动态', - ljfk: '珞珈副刊', - xsgc: '校史钩沉', - lgxd: '来稿选登', -}; - -// 专门定义一个function用于加载文章内容 -async function load(link) { - let description = ''; - let pubDate = ''; - - let response; - // 如果不是 武汉大学的站点, 直接返回简单的标题即可 - // 判断 是否外站链接,如果是 则直接返回页面 不做单独的解析 - const https_reg = new RegExp('https://news.whu.edu.cn(.*)'); - if (!https_reg.test(link)) { - return { description }; - } - - // 外部链接访问不到不处理, 校内页面访问不到 记录错误 - try { - // 异步请求文章 - response = await got.get(link); - } catch (err) { - // 如果网络问题 直接出错 - if (err.name && (err.name === 'HTTPError' || err.name === 'RequestError')) { - description = 'Page 404 Please Check!'; - } - return { description }; - } - // 加载文章内容 - const $ = cheerio.load(response.data); - - // 正则匹配发布时间 然后转换成时间 - const date_txt = $('div.news_attrib') - .text() - .match(/[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d/); // 匹配 yyyy-mm-dd hh:MM 格式时间 - - // console.log(link,":",date_txt); - pubDate = new Date(date_txt[0]); - - // 提取文章内容 - description = $('div.v_news_content').html(); - // 返回解析的结果 - return { description, pubDate }; -} - -module.exports = async (ctx) => { - // 默认 武大要闻 然后获取列表页面 - const type = ctx.params.type || 'wdyw'; - const listPageUrl = baseUrl + type + '.htm'; - const response = await got({ - method: 'get', - url: listPageUrl, - headers: { - Referer: baseUrl, - }, - }); - const $ = cheerio.load(response.data); - - // 获取当前页面的 list - const list = $('div.list>div>ul>li'); - list.splice(0, 1); // 删除第一个元素 标题栏 - - const result = await Promise.all( - // 遍历每一篇文章 - list - .map(async (item) => { - const $ = cheerio.load(list[item]); // 将列表项加载成 html - const $rel_url = $('div.infotitle>a').attr('href'); // 获取 每一项的url - // 判断是否相对链接 然后改写绝对路径 http 默认 否则加上基础路径 - const https_reg = new RegExp('^(?:[a-z]+:)?//'); - const $item_url = https_reg.test($rel_url) ? $rel_url : baseUrl + $rel_url; - const $title = $('div>a').attr('title'); // 获取每个的标题 - - const $pubdate = new Date( - $('div.infodate').text().trim() - // .match('/[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s/')[0] - ); - - // console.log(item, ":", $item_url,":",$pubdate); - - // 列表上提取到的信息 - // 标题 链接 - const single = { - title: $title, - pubDate: $pubdate, - link: $item_url, - guid: $item_url, - }; - - // 对于列表的每一项, 单独获取 时间与详细内容 - const other = await ctx.cache.tryGet($item_url, () => load($item_url)); - // 合并解析后的结果集作为该篇文章最终的输出结果 - return Promise.resolve(Object.assign({}, single, other)); - }) - .get() - ); - - ctx.state.data = { - title: catrgoryMap[type] + sizeTitle, - link: baseUrl, - description: catrgoryMap[type] + sizeTitle, - item: result, - }; -}; diff --git a/lib/v2/mail/imap.js b/lib/v2/mail/imap.js new file mode 100644 index 00000000000000..d1cd4d376bff35 --- /dev/null +++ b/lib/v2/mail/imap.js @@ -0,0 +1,99 @@ +const { ImapFlow } = require('imapflow'); +const config = require('@/config').value; +const { simpleParser } = require('mailparser'); +const logger = require('@/utils/logger'); +const { parseDate } = require('@/utils/parse-date'); + +module.exports = async (ctx) => { + const { email, folder = 'INBOX' } = ctx.params; + const { limit = 10 } = ctx.query; + const mailConfig = { + username: email, + port: 993, + ...Object.fromEntries(new URLSearchParams(config.email.config[email.replace(/[@.]/g, '_')])), + }; + + if (!mailConfig.username || !mailConfig.password || !mailConfig.host || !mailConfig.port) { + throw Error('Email Inbox RSS is disabled due to the lack of relevant config'); + } + + const client = new ImapFlow({ + host: mailConfig.host, + port: parseInt(mailConfig.port), + secure: true, + auth: { + user: mailConfig.username, + pass: mailConfig.password, + }, + proxy: config.proxyUri, // Note: socks5h is not supported + logger: { + debug: (log) => logger.debug(log.msg), + info: (log) => logger.info(log.msg), + warn: (log) => logger.warn(log.msg), + error: (log) => logger.error(log?.msg), + }, + }); + + try { + await client.connect(); + } catch (e) { + throw Error(e.responseText); + } + + /** + [ + { + // https://imapflow.com/global.html#FetchMessageObject + seq: Number, + uid: Number, + envelope: { + // https://imapflow.com/global.html#MessageEnvelopeObject + }, + id: 'md5-like-hash-string', + source: Buffer, + } + ] + */ + const mails = []; + const lock = await client.getMailboxLock(folder); + try { + for await (const message of client.fetch(`${Math.max(client.mailbox.exists - limit + 1, 1)}:*`, { envelope: true, source: true, uid: true })) { + mails.push(message); + } + } finally { + lock.release(); + } + + const items = await Promise.all( + mails.map((item) => + ctx.cache.tryGet(`mail:${email}:${item.envelope.messageId}`, async () => { + const parsed = await simpleParser(item.source); + + let description = parsed.html || parsed.textAsHtml; + if (parsed.attachments.length) { + description += `${attachment.filename}
`; + }); + } + + return { + title: item.envelope.subject, + description, + pubDate: parseDate(item.envelope.date), + author: parsed.from.text, + guid: `mail:${email}:${item.envelope.messageId}`, + }; + }) + ) + ); + + await client.logout(); + + ctx.state.data = { + title: `${email}'s Inbox${folder !== 'INBOX' ? ` - ${folder}` : ''}`, + link: `https://${email.split('@')[1]}`, + item: items, + allowEmpty: true, + }; +}; diff --git a/lib/v2/mail/maintainer.js b/lib/v2/mail/maintainer.js new file mode 100644 index 00000000000000..e4593044d1ba90 --- /dev/null +++ b/lib/v2/mail/maintainer.js @@ -0,0 +1,3 @@ +module.exports = { + '/imap/:email/:folder*': ['kt286'], +}; diff --git a/lib/v2/mail/router.js b/lib/v2/mail/router.js new file mode 100644 index 00000000000000..df18c649f6d89e --- /dev/null +++ b/lib/v2/mail/router.js @@ -0,0 +1,3 @@ +module.exports = (router) => { + router.get('/imap/:email/:folder*', require('./imap')); +}; diff --git a/lib/v2/whu/cs.js b/lib/v2/whu/cs.js new file mode 100644 index 00000000000000..325f0bbc0804c4 --- /dev/null +++ b/lib/v2/whu/cs.js @@ -0,0 +1,71 @@ +const got = require('@/utils/got'); +const { parseDate } = require('@/utils/parse-date'); +const timezone = require('@/utils/timezone'); +const cheerio = require('cheerio'); + +const baseUrl = 'https://cs.whu.edu.cn'; + +module.exports = async (ctx) => { + const type = parseInt(ctx.params.type); + + let link; + if (type === 0) { + link = `${baseUrl}/xwdt/xyxw.htm`; // 学院新闻 + } else if (type === 1) { + link = `${baseUrl}/kxyj/xsjl.htm`; // 学术交流 + } else if (type === 2) { + link = `${baseUrl}/xwdt/tzgg.htm`; // 通知公告 + } else if (type === 3) { + link = `${baseUrl}/kxyj/kyjz.htm`; // 科研进展 + } + + const response = await got(link); + const $ = cheerio.load(response.data); + + const list = $('div.study ul li') + .toArray() + .map((item) => { + item = $(item); + return { + title: item.find('a p').text().trim(), + pubDate: parseDate(item.find('span').text()), + link: new URL(item.find('a').attr('href'), link).href, + }; + }); + + const items = await Promise.all( + list.map((item) => + ctx.cache.tryGet(item.link, async () => { + const response = await got(item.link); + const $ = cheerio.load(response.data); + + if ($('.prompt').length) { + item.description = $('.prompt').html(); + return item; + } + + const content = $('.content'); + + content.find('img').each((_, e) => { + e = $(e); + if (e.attr('orisrc')) { + e.attr('src', new URL(e.attr('orisrc'), response.url).href); + e.removeAttr('orisrc'); + e.removeAttr('vurl'); + } + }); + + item.description = content.html(); + item.pubDate = $('meta[name="PubDate"]').length ? timezone(parseDate($('meta[name="PubDate"]').attr('content')), +8) : item.pubDate; + + return item; + }) + ) + ); + + ctx.state.data = { + title: $('title').first().text(), + link, + item: items, + }; +}; diff --git a/lib/v2/whu/gs/index.js b/lib/v2/whu/gs/index.js new file mode 100644 index 00000000000000..98cf9efdf4e0d5 --- /dev/null +++ b/lib/v2/whu/gs/index.js @@ -0,0 +1,85 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); +const { parseDate } = require('@/utils/parse-date'); + +const gsIndexMap = new Map([ + [0, 'xwdt.htm'], + [1, 'xs_ts.htm'], + [2, 'yxfc.htm'], + [3, 'tzgg/qb.htm'], + [4, 'tzgg/zs.htm'], + [5, 'tzgg/py.htm'], + [6, 'tzgg/xw.htm'], + [7, 'tzgg/zlyzyxw.htm'], + [8, 'tzgg/zh.htm'], +]); + +module.exports = async (ctx) => { + const host = 'https://gs.whu.edu.cn/'; + const type = (ctx.params && parseInt(ctx.params.type)) || 0; + const response = await got(host + gsIndexMap.get(type)); + + const $ = cheerio.load(response.data); + const feed_title = $('div.location a') + .slice(-2) + .map((index, element) => $(element).text()) + .get() + .join(' > '); + + let items = $('.list ul li') + .toArray() + .map((item) => { + item = $(item); + const link = item.find('a').attr('href'); + return { + title: item.find('p').text(), + link: link.startsWith('http') ? link : new URL(link, host).href, + pubDate: parseDate(item.find('span').text()), + }; + }); + + items = await Promise.all( + items.map((item) => + ctx.cache.tryGet(item.link, async () => { + try { + const detail = await got(item.link); + const content = cheerio.load(detail.data); + + content('input').remove(); + content('h1').remove(); + content('h2').remove(); + content('div.arc-tit h2').remove(); + content('h4.information').remove(); + content('div.arc-info').remove(); + content('.con_xq').remove(); + + content('form[name=_newscontent_fromname] img').each((_, i) => { + i = $(i); + if (i.attr('src').startsWith('/')) { + i.attr('src', new URL(i.attr('src'), host).href); + } + }); + content('form[name=_newscontent_fromname] ul li a').each((_, a) => { + a = $(a); + if (a.attr('href').startsWith('/')) { + a.attr('href', new URL(a.attr('href'), host).href); + } + }); + + item.description = content('form[name=_newscontent_fromname]').html(); + return item; + } catch (error) { + item.description = 'NULL'; + return item; + } + }) + ) + ); + + ctx.state.data = { + title: `武汉大学研究生院 - ${feed_title}`, + link: host + gsIndexMap.get(type), + description: '武大研究生院', + item: items, + }; +}; diff --git a/lib/v2/whu/maintainer.js b/lib/v2/whu/maintainer.js new file mode 100644 index 00000000000000..28d4e230b1f3ae --- /dev/null +++ b/lib/v2/whu/maintainer.js @@ -0,0 +1,5 @@ +module.exports = { + '/cs/:type': ['ttyfly'], + '/gs/:type?': ['Delreyaa'], + '/news/:type*': ['SChen1024'], +}; diff --git a/lib/v2/whu/news.js b/lib/v2/whu/news.js new file mode 100644 index 00000000000000..22687274621338 --- /dev/null +++ b/lib/v2/whu/news.js @@ -0,0 +1,102 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); +const { parseDate } = require('@/utils/parse-date'); +const timezone = require('@/utils/timezone'); + +// 参考 bit/jwc 北京理工大学的的页面写成 + +const baseUrl = 'https://news.whu.edu.cn/'; + +// 专门定义一个function用于加载文章内容 +async function load(link) { + let description = ''; + let pubDate = ''; + + let response; + + // 外部链接访问不到不处理, 校内页面访问不到 记录错误 + try { + // 异步请求文章 + response = await got(link); + } catch (err) { + // 如果网络问题 直接出错 + if (err.name && (err.name === 'HTTPError' || err.name === 'RequestError')) { + description = 'Page 404 Please Check!'; + } + return { description }; + } + // 加载文章内容 + const $ = cheerio.load(response.data); + + pubDate = $('meta[name="PubDate"]').length ? timezone(parseDate($('meta[name="PubDate"]').attr('content')), 8) : undefined; + + $('div.v_news_content') + .find('img') + .each((_, e) => { + e = $(e); + if (e.attr('orisrc')) { + e.attr('src', new URL(e.attr('orisrc'), response.url).href); + e.removeAttr('orisrc'); + e.removeAttr('vurl'); + } + }); + + // 提取文章内容 + description = $('div.v_news_content').html(); + // 返回解析的结果 + return { + description, + pubDate, + author: $('meta[name="ContentSource"]').attr('content'), + }; +} + +module.exports = async (ctx) => { + // 默认 武大要闻 然后获取列表页面 + const type = ctx.params.type || 'wdzx/wdyw'; + const listPageUrl = baseUrl + type + '.htm'; + const response = await got(listPageUrl); + const $ = cheerio.load(response.data); + + // 获取当前页面的 list + const list = $('.nyleft ul li') + .toArray() + .map((item) => { + item = $(item); + const a = item.find('a').first(); + return { + title: a.attr('title') || item.find('.eclips').text(), + link: new URL(a.attr('href'), listPageUrl).href, + description: item.find('.line2').text(), + pubDate: item.find('time').length ? parseDate(item.find('time').text(), 'YYYY.MM.DD') : item.find('.line3').length ? parseDate(item.find('.line3').text()) : undefined, + }; + }); + + const result = await Promise.all( + // 遍历每一篇文章 + list.map((item) => + // 合并解析后的结果集作为该篇文章最终的输出结果 + ctx.cache.tryGet(item.link, async () => { + // 如果不是 武汉大学的站点, 直接返回简单的标题即可 + // 判断 是否外站链接,如果是 则直接返回页面 不做单独的解析 + if (!item.link.startsWith(baseUrl)) { + return item; + } + + const { description, pubDate, author } = await load(item.link); + + item.description = description; + item.pubDate = pubDate; + item.author = author; + + return item; + }) + ) + ); + + ctx.state.data = { + title: $('title').first().text(), + link: listPageUrl, + item: result, + }; +}; diff --git a/lib/v2/whu/radar.js b/lib/v2/whu/radar.js new file mode 100644 index 00000000000000..408cde56df2747 --- /dev/null +++ b/lib/v2/whu/radar.js @@ -0,0 +1,27 @@ +module.exports = { + 'whu.edu.cn': { + _name: '武汉大学', + cs: [ + { + title: '计算机学院公告', + docs: 'https://docs.rsshub.app/routes/university#wu-han-da-xue', + }, + ], + gs: [ + { + title: '研究生院', + docs: 'https://docs.rsshub.app/routes/university#wu-han-da-xue-yan-jiu-sheng-yuan', + source: ['/index.htm', '/'], + target: '/whu/gs', + }, + ], + news: [ + { + title: '新闻网', + docs: 'https://docs.rsshub.app/routes/university#wu-han-da-xue', + source: ['/*path'], + target: (params) => `/whu/news/${params.path.replace('.htm', '')}`, + }, + ], + }, +}; diff --git a/lib/v2/whu/router.js b/lib/v2/whu/router.js new file mode 100644 index 00000000000000..994fd014422b14 --- /dev/null +++ b/lib/v2/whu/router.js @@ -0,0 +1,5 @@ +module.exports = function (router) { + router.get('/cs/:type', require('./cs')); + router.get('/gs/:type?', require('./gs/index.js')); + router.get('/news/:type*', require('./news')); +}; diff --git a/package.json b/package.json index e8e18f3d595a0a..087306596b1bb3 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,6 @@ "currency-symbol-map": "5.1.0", "dayjs": "1.11.8", "dotenv": "16.3.1", - "emailjs-imap-client": "3.1.0", "entities": "4.5.0", "etag": "1.8.1", "fanfou-sdk": "4.2.0", @@ -106,6 +105,7 @@ "got": "11.8.6", "https-proxy-agent": "7.0.2", "iconv-lite": "0.6.3", + "imapflow": "1.0.143", "instagram-private-api": "1.45.3", "ioredis": "5.3.2", "ip-regex": "4.3.0", @@ -149,7 +149,37 @@ }, "devDependencies": { "@microsoft/eslint-formatter-sarif": "3.0.0", + "@types/aes-js": "3.1.1", + "@types/crypto-js": "4.1.2", + "@types/eslint": "8.44.2", + "@types/eslint-config-prettier": "6.11.0", + "@types/etag": "1.8.1", + "@types/fs-extra": "11.0.1", + "@types/git-rev-sync": "2.0.0", + "@types/imapflow": "1.0.13", + "@types/ip-regex": "4.1.1", + "@types/jsdom": "21.1.2", + "@types/json-bigint": "1.0.1", "@types/koa": "2.13.8", + "@types/koa-basic-auth": "2.0.4", + "@types/koa-favicon": "2.0.21", + "@types/koa-mount": "4.0.2", + "@types/koa-static": "4.0.2", + "@types/koa__router": "12.0.0", + "@types/lint-staged": "13.2.0", + "@types/mailparser": "3.4.0", + "@types/markdown-it": "13.0.1", + "@types/module-alias": "2.0.2", + "@types/nodemon": "1.19.2", + "@types/pidusage": "2.0.2", + "@types/plist": "3.0.2", + "@types/request-promise-native": "1.0.18", + "@types/require-all": "3.0.0", + "@types/showdown": "2.0.1", + "@types/string-width": "4.0.1", + "@types/supertest": "2.0.12", + "@types/tiny-async-pool": "2.0.0", + "@types/tough-cookie": "4.0.3", "@vercel/nft": "0.23.1", "cross-env": "7.0.3", "eslint": "8.49.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc78304e4163cc..492d052105f2c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,9 +47,6 @@ dependencies: dotenv: specifier: 16.3.1 version: 16.3.1 - emailjs-imap-client: - specifier: 3.1.0 - version: 3.1.0 entities: specifier: 4.5.0 version: 4.5.0 @@ -74,6 +71,9 @@ dependencies: iconv-lite: specifier: 0.6.3 version: 0.6.3 + imapflow: + specifier: 1.0.143 + version: 1.0.143 instagram-private-api: specifier: 1.45.3 version: 1.45.3 @@ -199,9 +199,99 @@ devDependencies: '@microsoft/eslint-formatter-sarif': specifier: 3.0.0 version: 3.0.0 + '@types/aes-js': + specifier: 3.1.1 + version: 3.1.1 + '@types/crypto-js': + specifier: 4.1.2 + version: 4.1.2 + '@types/eslint': + specifier: 8.44.2 + version: 8.44.2 + '@types/eslint-config-prettier': + specifier: 6.11.0 + version: 6.11.0 + '@types/etag': + specifier: 1.8.1 + version: 1.8.1 + '@types/fs-extra': + specifier: 11.0.1 + version: 11.0.1 + '@types/git-rev-sync': + specifier: 2.0.0 + version: 2.0.0 + '@types/imapflow': + specifier: 1.0.13 + version: 1.0.13 + '@types/ip-regex': + specifier: 4.1.1 + version: 4.1.1 + '@types/jsdom': + specifier: 21.1.2 + version: 21.1.2 + '@types/json-bigint': + specifier: 1.0.1 + version: 1.0.1 '@types/koa': specifier: 2.13.8 version: 2.13.8 + '@types/koa-basic-auth': + specifier: 2.0.4 + version: 2.0.4 + '@types/koa-favicon': + specifier: 2.0.21 + version: 2.0.21 + '@types/koa-mount': + specifier: 4.0.2 + version: 4.0.2 + '@types/koa-static': + specifier: 4.0.2 + version: 4.0.2 + '@types/koa__router': + specifier: 12.0.0 + version: 12.0.0 + '@types/lint-staged': + specifier: 13.2.0 + version: 13.2.0 + '@types/mailparser': + specifier: 3.4.0 + version: 3.4.0 + '@types/markdown-it': + specifier: 13.0.1 + version: 13.0.1 + '@types/module-alias': + specifier: 2.0.2 + version: 2.0.2 + '@types/nodemon': + specifier: 1.19.2 + version: 1.19.2 + '@types/pidusage': + specifier: 2.0.2 + version: 2.0.2 + '@types/plist': + specifier: 3.0.2 + version: 3.0.2 + '@types/request-promise-native': + specifier: 1.0.18 + version: 1.0.18 + '@types/require-all': + specifier: 3.0.0 + version: 3.0.0 + '@types/showdown': + specifier: 2.0.1 + version: 2.0.1 + '@types/string-width': + specifier: 4.0.1 + version: 4.0.1 + '@types/supertest': + specifier: 2.0.12 + version: 2.0.12 + '@types/tiny-async-pool': + specifier: 2.0.0 + version: 2.0.0 + '@types/tough-cookie': + specifier: 4.0.3 + version: 4.0.3 '@vercel/nft': specifier: 0.23.1 version: 0.23.1 @@ -219,7 +309,7 @@ devDependencies: version: 16.1.0(eslint@8.49.0) eslint-plugin-prettier: specifier: 5.0.0 - version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.49.0)(prettier@3.0.3) + version: 5.0.0(@types/eslint@8.44.2)(eslint-config-prettier@9.0.0)(eslint@8.49.0)(prettier@3.0.3) eslint-plugin-yml: specifier: 1.8.0 version: 1.8.0(eslint@8.49.0) @@ -1249,6 +1339,10 @@ packages: '@types/node': 20.5.6 dev: true + /@types/aes-js@3.1.1: + resolution: {integrity: sha512-SDSGgXT3LRCH6qMWk8OHT1vLSVNuHNvCpKCx2/TYtQMbMGGgxJC9fspwSkQjqzRagrWnCrxuLL3jMNXLXHHvSw==} + dev: true + /@types/babel__core@7.20.1: resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: @@ -1300,7 +1394,6 @@ packages: /@types/caseless@0.12.2: resolution: {integrity: sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==} - dev: false /@types/chance@1.1.3: resolution: {integrity: sha512-X6c6ghhe4/sQh4XzcZWSFaTAUOda38GQHmq9BUanYkOE/EO7ZrkazwKmtsj3xzTjkLWmwULE++23g3d3CCWaWw==} @@ -1316,6 +1409,10 @@ packages: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} dev: true + /@types/cookiejar@2.1.2: + resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} + dev: true + /@types/cookies@0.7.7: resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} dependencies: @@ -1325,12 +1422,37 @@ packages: '@types/node': 20.5.6 dev: true + /@types/crypto-js@4.1.2: + resolution: {integrity: sha512-t33RNmTu5ufG/sorROIafiCVJMx3jz95bXUMoPAZcUD14fxMXnuTzqzXZoxpR0tNx2xpw11Dlmem9vGCsrSOfA==} + dev: true + /@types/debug@4.1.8: resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} dependencies: '@types/ms': 0.7.31 dev: false + /@types/eslint-config-prettier@6.11.0: + resolution: {integrity: sha512-UBuZMZVog9c9jXvArbYtWH570sRWNaU6kEnUAHsHb/+zAufzPT4I+gMkUR2dVPWlqiceoRU1thjUVdGrAWVpCA==} + dev: true + + /@types/eslint@8.44.2: + resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + dev: true + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + + /@types/etag@1.8.1: + resolution: {integrity: sha512-bsKkeSqN7HYyYntFRAmzcwx/dKW4Wa+KVMTInANlI72PWLQmOpZu96j0OqHZGArW4VQwCmJPteQlXaUDeOB0WQ==} + dependencies: + '@types/node': 20.5.6 + dev: true + /@types/express-serve-static-core@4.17.36: resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==} dependencies: @@ -1349,6 +1471,17 @@ packages: '@types/serve-static': 1.15.2 dev: true + /@types/fs-extra@11.0.1: + resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} + dependencies: + '@types/jsonfile': 6.1.1 + '@types/node': 20.5.6 + dev: true + + /@types/git-rev-sync@2.0.0: + resolution: {integrity: sha512-qGYApbb0m8Ofy3pwYks+kYVIZQAN/cqNucJGbl5O5GpLw9JSzp74rkTWDhPv3brrJfJb5/ixtimLJpo4tfh2QA==} + dev: true + /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: @@ -1367,6 +1500,19 @@ packages: resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} dev: true + /@types/imapflow@1.0.13: + resolution: {integrity: sha512-TD8h02jSTDsXTE79HL0cSkjrU/ufXmSIsZv96O2sNBDA1VluqzKkjV2LrXSPIuXE1tn7JhND7o0iyP4r7haNFw==} + dependencies: + '@types/node': 20.5.6 + dev: true + + /@types/ip-regex@4.1.1: + resolution: {integrity: sha512-RUEV39p+XoK1rO4nDQYXb1TATpyVKzfIr75HgR0074G/uA9RzjPsIK4TMlxh7KZ4WxcM512j03esP06tHMZNLA==} + deprecated: This is a stub types definition. ip-regex provides its own type definitions, so you do not need this installed. + dependencies: + ip-regex: 4.3.0 + dev: true + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true @@ -1383,6 +1529,28 @@ packages: '@types/istanbul-lib-report': 3.0.0 dev: true + /@types/jsdom@21.1.2: + resolution: {integrity: sha512-bGj+7TaCkOwkJfx7HtS9p22Ij0A2aKMuz8a1+owpkxa1wU/HUBy/WAXhdv90uDdVI9rSjGvUrXmLSeA9VP3JeA==} + dependencies: + '@types/node': 20.5.6 + '@types/tough-cookie': 4.0.3 + parse5: 7.1.2 + dev: true + + /@types/json-bigint@1.0.1: + resolution: {integrity: sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==} + dev: true + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true + + /@types/jsonfile@6.1.1: + resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} + dependencies: + '@types/node': 20.5.6 + dev: true + /@types/keygrip@1.0.2: resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} dev: true @@ -1393,12 +1561,43 @@ packages: '@types/node': 20.5.6 dev: false + /@types/koa-basic-auth@2.0.4: + resolution: {integrity: sha512-PJKvoF5OMGlEEzUnctZDGRQVqV12xB0V4KplDJvHQDX9egh9ADFa456zGXRNnhNr43t3Fe4/VzD6ziM61uM5RQ==} + dependencies: + '@types/koa': 2.13.8 + dev: true + /@types/koa-compose@3.2.5: resolution: {integrity: sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==} dependencies: '@types/koa': 2.13.8 dev: true + /@types/koa-favicon@2.0.21: + resolution: {integrity: sha512-paH1nheVhijx/VduoR/RCD/qTCiX+OI/6fHLi3mZae053Ts+gUBOrKtzl3pMTDbdEBqdLolfLje3PZbb6jW0jQ==} + dependencies: + '@types/koa': 2.13.8 + dev: true + + /@types/koa-mount@4.0.2: + resolution: {integrity: sha512-XnuGwV8bzw22nv2WqOs5a8wCHR2VgSnLLLuBQPzNTmhyiAvH0O6c+994rQVbMaBuwQJKefUInkvKoKuk+21uew==} + dependencies: + '@types/koa': 2.13.8 + dev: true + + /@types/koa-send@4.1.3: + resolution: {integrity: sha512-daaTqPZlgjIJycSTNjKpHYuKhXYP30atFc1pBcy6HHqB9+vcymDgYTguPdx9tO4HMOqNyz6bz/zqpxt5eLR+VA==} + dependencies: + '@types/koa': 2.13.8 + dev: true + + /@types/koa-static@4.0.2: + resolution: {integrity: sha512-ns/zHg+K6XVPMuohjpOlpkR1WLa4VJ9czgUP9bxkCDn0JZBtUWbD/wKDZzPGDclkQK1bpAEScufCHOy8cbfL0w==} + dependencies: + '@types/koa': 2.13.8 + '@types/koa-send': 4.1.3 + dev: true + /@types/koa@2.13.8: resolution: {integrity: sha512-Ugmxmgk/yPRW3ptBTh9VjOLwsKWJuGbymo1uGX0qdaqqL18uJiiG1ZoV0rxCOYSaDGhvEp5Ece02Amx0iwaxQQ==} dependencies: @@ -1412,12 +1611,44 @@ packages: '@types/node': 20.5.6 dev: true + /@types/koa__router@12.0.0: + resolution: {integrity: sha512-S6eHyZyoWCZLNHyy8j0sMW85cPrpByCbGGU2/BO4IzGiI87aHJ92lZh4E9xfsM9DcbCT469/OIqyC0sSJXSIBQ==} + dependencies: + '@types/koa': 2.13.8 + dev: true + + /@types/linkify-it@3.0.3: + resolution: {integrity: sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g==} + dev: true + + /@types/lint-staged@13.2.0: + resolution: {integrity: sha512-rYHDtOV4BHb1hRH5dA7P+jarU/YFmQ9CGgwYPZNVRoxhrsrm2exEETeIEB+EmBk2AXIKAaK9JDzjpNCkceDGFQ==} + dev: true + + /@types/mailparser@3.4.0: + resolution: {integrity: sha512-MotFinA1sT2nPFtQw1WpaF3X6I1OdbEloaixMmk924BOYqwHmlZkoi7XcVUXHI+7i0to8JguHqYj5k/E6c9Chw==} + dependencies: + '@types/node': 20.5.6 + iconv-lite: 0.6.3 + dev: true + + /@types/markdown-it@13.0.1: + resolution: {integrity: sha512-SUEb8Frsxs3D5Gg9xek6i6EG6XQ5s+O+ZdQzIPESZVZw3Pv3CPQfjCJBI+RgqZd1IBeu18S0Rn600qpPnEK37w==} + dependencies: + '@types/linkify-it': 3.0.3 + '@types/mdurl': 1.0.2 + dev: true + /@types/mdast@3.0.12: resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} dependencies: '@types/unist': 2.0.7 dev: true + /@types/mdurl@1.0.2: + resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} + dev: true + /@types/mime@1.3.2: resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} dev: true @@ -1426,6 +1657,10 @@ packages: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} dev: true + /@types/module-alias@2.0.2: + resolution: {integrity: sha512-Oeo5NEjAceFgN8OzGiLXPswgv2GBmrDGuTnLS0sQ8g4Mq5sB5c97Hu5B+n9Gu/j+5Y+oUb4TSawHXkZ8MENGyw==} + dev: true + /@types/ms@0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: false @@ -1440,6 +1675,23 @@ packages: /@types/node@20.5.6: resolution: {integrity: sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==} + /@types/nodemon@1.19.2: + resolution: {integrity: sha512-4GWiTN3HevkxMIxEQ7OpD3MAHhlVsX2tairCMRmf8oYZxmhHw9+UpQpIdGdJrjsMT2Ty26FtJzUUcP/qM5fR8A==} + dependencies: + '@types/node': 20.5.6 + dev: true + + /@types/pidusage@2.0.2: + resolution: {integrity: sha512-lHgpGZjXDfjggZDLkgp4zQTYkvXq4S7RxjBjrDcPe1MBU72hESWxubutx8+AM4QkJdRxAhrQyxSA6pzHKJKlsQ==} + dev: true + + /@types/plist@3.0.2: + resolution: {integrity: sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==} + dependencies: + '@types/node': 20.5.6 + xmlbuilder: 15.1.1 + dev: true + /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true @@ -1448,6 +1700,12 @@ packages: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: true + /@types/request-promise-native@1.0.18: + resolution: {integrity: sha512-tPnODeISFc/c1LjWyLuZUY+Z0uLB3+IMfNoQyDEi395+j6kTFTTRAqjENjoPJUid4vHRGEozoTrcTrfZM+AcbA==} + dependencies: + '@types/request': 2.48.8 + dev: true + /@types/request-promise@4.1.48: resolution: {integrity: sha512-sLsfxfwP5G3E3U64QXxKwA6ctsxZ7uKyl4I28pMj3JvV+ztWECRns73GL71KMOOJME5u1A5Vs5dkBqyiR1Zcnw==} dependencies: @@ -1460,9 +1718,12 @@ packages: dependencies: '@types/caseless': 0.12.2 '@types/node': 20.5.6 - '@types/tough-cookie': 4.0.2 + '@types/tough-cookie': 4.0.3 form-data: 2.5.1 - dev: false + + /@types/require-all@3.0.0: + resolution: {integrity: sha512-UbZGpTz4mWN4MyWUcnwwC/z/ZyAYySPnW3ahNpQav+rFI2D0bWXarY+35PnSE6XyM1O7Sn9tYZFBtyIoyJyqyg==} + dev: true /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} @@ -1485,13 +1746,40 @@ packages: '@types/node': 20.5.6 dev: true + /@types/showdown@2.0.1: + resolution: {integrity: sha512-xdnAw2nFqomkaL0QdtEk0t7yz26UkaVPl4v1pYJvtE1T0fmfQEH3JaxErEhGByEAl3zUZrkNBlneuJp0WJGqEA==} + dev: true + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/tough-cookie@4.0.2: - resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} - dev: false + /@types/string-width@4.0.1: + resolution: {integrity: sha512-zsZXP4RSmw3TOXf2eut1xxb7Gto7I+BrB0WxwdRaEdCBnUbAQa57yZf/OWcAfop9m7t6Zd0pw9tV2ghpJXJPZg==} + deprecated: This is a stub types definition. string-width provides its own type definitions, so you do not need this installed. + dependencies: + string-width: 4.2.3 + dev: true + + /@types/superagent@4.1.18: + resolution: {integrity: sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==} + dependencies: + '@types/cookiejar': 2.1.2 + '@types/node': 20.5.6 + dev: true + + /@types/supertest@2.0.12: + resolution: {integrity: sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==} + dependencies: + '@types/superagent': 4.1.18 + dev: true + + /@types/tiny-async-pool@2.0.0: + resolution: {integrity: sha512-GB+FG7JF6SPX9yuGmfmDTRYFMdS2Za+YiYvh6RJPfTMa0LaTDEtQ6ncw6NYrHnf9cloVJxgXd6WGRdRp54O1cQ==} + dev: true + + /@types/tough-cookie@4.0.3: + resolution: {integrity: sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==} /@types/triple-beam@1.3.2: resolution: {integrity: sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==} @@ -1553,6 +1841,13 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -1738,6 +2033,11 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false + /aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} @@ -1946,6 +2246,13 @@ packages: ieee754: 1.2.1 dev: false + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: @@ -2741,53 +3048,6 @@ packages: resolution: {integrity: sha512-5gxbEjcb/Z2n6TTmXZx9wVi3N/DOzE7RXY3Xg9dakDuhX/izwumB9rGjeWUV6dTA0D0+juvo+JonZgNR9sgA5A==} dev: false - /emailjs-addressparser@2.0.3: - resolution: {integrity: sha512-GjahNdp1fRsWBGxmwC4o7XEoEf7QsdsVrbZFoeulEKNp49NrIUZcZfGMKCPDv5kExiuJLulq/7tJY+ei6BRitA==} - dev: false - - /emailjs-base64@1.1.4: - resolution: {integrity: sha512-4h0xp1jgVTnIQBHxSJWXWanNnmuc5o+k4aHEpcLXSToN8asjB5qbXAexs7+PEsUKcEyBteNYsSvXUndYT2CGGA==} - dev: false - - /emailjs-imap-client@3.1.0: - resolution: {integrity: sha512-YgWOmzxuD2/fGRL+VKDGt+nszHrUlz2BmD+gfM3+aeCzFF+Y+ayShylXl70rURRQ6a0TdEKp2Ty+kJB9d/lGJw==} - dependencies: - emailjs-addressparser: 2.0.3 - emailjs-base64: 1.1.4 - emailjs-imap-handler: 3.0.4 - emailjs-mime-codec: 2.0.9 - emailjs-tcp-socket: 2.0.2 - emailjs-utf7: 4.0.1 - pako: 1.0.11 - ramda: 0.26.1 - dev: false - - /emailjs-imap-handler@3.0.4: - resolution: {integrity: sha512-OKrmTATkLGP6etiUE3JzGbdMtrz5vaUDjv+N+arYIr0azgJfr29ZHs0shmn9KnqoxUg512GccB4UFRqJFCjzJA==} - dev: false - - /emailjs-mime-codec@2.0.9: - resolution: {integrity: sha512-7qJo4pFGcKlWh/kCeNjmcgj34YoJWY0ekZXEHYtluWg4MVBnXqGM4CRMtZQkfYwitOhUgaKN5EQktJddi/YIDQ==} - dependencies: - emailjs-base64: 1.1.4 - ramda: 0.26.1 - text-encoding: 0.7.0 - dev: false - - /emailjs-tcp-socket@2.0.2: - resolution: {integrity: sha512-ro2G1WS7UQwFNpjrWRK6awjsBjG00Y4AxSEvuG1YUORzIqnzdOUVmaHnptZ8UFDPYglsu8O4nm6+luflmTy3Qg==} - deprecated: This project is no longer maintained. Please reach out if you want to hop on as a maintainer. - dependencies: - node-forge: 0.7.6 - ramda: 0.25.0 - dev: false - - /emailjs-utf7@4.0.1: - resolution: {integrity: sha512-bvBpXUEr3alogZjqwVasCKSjfzxleQ1TeO9NBtG4FvS2nfQDvzSW2gqEU0VcZJ6hD/xGl5j0kZiGegPHvgVyww==} - dependencies: - emailjs-base64: 1.1.4 - dev: false - /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -2836,7 +3096,6 @@ packages: /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - dev: false /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -2928,7 +3187,7 @@ packages: semver: 7.5.4 dev: true - /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.49.0)(prettier@3.0.3): + /eslint-plugin-prettier@5.0.0(@types/eslint@8.44.2)(eslint-config-prettier@9.0.0)(eslint@8.49.0)(prettier@3.0.3): resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -2942,6 +3201,7 @@ packages: eslint-config-prettier: optional: true dependencies: + '@types/eslint': 8.44.2 eslint: 8.49.0 eslint-config-prettier: 9.0.0(eslint@8.49.0) prettier: 3.0.3 @@ -3073,10 +3333,20 @@ packages: engines: {node: '>= 0.6'} dev: false + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: true + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3184,6 +3454,11 @@ packages: /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + /fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + dev: false + /fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: true @@ -3307,7 +3582,6 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: false /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} @@ -3894,7 +4168,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: false /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -3915,6 +4188,20 @@ packages: hasBin: true dev: false + /imapflow@1.0.143: + resolution: {integrity: sha512-1J7ySUM7wGyh0OguhZc0EdM+4yywX/tB4tjAskvOwz4Kd1S8+cxcIBBuslq6hpO1XLDOnjUns0ADrjwQIuTBTg==} + dependencies: + encoding-japanese: 2.0.0 + iconv-lite: 0.6.3 + libbase64: 1.2.1 + libmime: 5.2.1 + libqp: 2.0.1 + mailsplit: 5.4.0 + nodemailer: 6.9.4 + pino: 8.15.0 + socks: 2.7.1 + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -4008,7 +4295,6 @@ packages: /ip-regex@4.3.0: resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} engines: {node: '>=8'} - dev: false /ip@1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} @@ -5607,10 +5893,6 @@ packages: dependencies: whatwg-url: 5.0.0 - /node-forge@0.7.6: - resolution: {integrity: sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==} - dev: false - /node-gyp-build@4.6.1: resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} hasBin: true @@ -5629,6 +5911,11 @@ packages: engines: {node: '>=6.0.0'} dev: false + /nodemailer@6.9.4: + resolution: {integrity: sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==} + engines: {node: '>=6.0.0'} + dev: false + /nodemon@3.0.1: resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} engines: {node: '>=10'} @@ -5734,6 +6021,10 @@ packages: /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /on-exit-leak-free@2.1.0: + resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} + dev: false + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -5886,10 +6177,6 @@ packages: netmask: 2.0.2 dev: false - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: false - /pangu@4.0.7: resolution: {integrity: sha512-weZKJIwwy5gjt4STGVUH9bix3BGk7wZ2ahtIypwe3e/mllsrIZIvtfLx1dPX56GcpZFOCFKmeqI1qVuB9enRzA==} hasBin: true @@ -5938,7 +6225,6 @@ packages: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.5.0 - dev: false /parseley@0.12.1: resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} @@ -6016,6 +6302,34 @@ packages: safe-buffer: 5.2.1 dev: false + /pino-abstract-transport@1.0.0: + resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} + dependencies: + readable-stream: 4.4.2 + split2: 4.2.0 + dev: false + + /pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + dev: false + + /pino@8.15.0: + resolution: {integrity: sha512-olUADJByk4twxccmAxb1RiGKOSvddHugCV3wkqjyv+3Sooa2KLrmXrKEWOKi0XPCLasRR5jBXxioE1jxUa4KzQ==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.3.0 + on-exit-leak-free: 2.1.0 + pino-abstract-transport: 1.0.0 + pino-std-serializers: 6.2.2 + process-warning: 2.2.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.3.0 + thread-stream: 2.4.0 + dev: false + /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -6097,6 +6411,15 @@ packages: react-is: 18.2.0 dev: true + /process-warning@2.2.0: + resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} + dev: false + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -6343,19 +6666,15 @@ packages: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} dev: false + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false + /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} dev: false - /ramda@0.25.0: - resolution: {integrity: sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==} - dev: false - - /ramda@0.26.1: - resolution: {integrity: sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==} - dev: false - /rand-user-agent@1.0.109: resolution: {integrity: sha512-mnAH0jDJQ0SJtEXjoW5aQILEc+33RwtKzKxwK9JG1a06M6nn8WDWheD+kmc5ucs+ux4FEWX3+PZuEB8r3x15yQ==} dev: false @@ -6376,6 +6695,17 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 + /readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: false + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -6383,6 +6713,11 @@ packages: picomatch: 2.3.1 dev: true + /real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + dev: false + /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} @@ -6834,6 +7169,12 @@ packages: smart-buffer: 4.2.0 dev: false + /sonic-boom@3.3.0: + resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: @@ -6860,6 +7201,11 @@ packages: engines: {node: '>=6'} dev: false + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true @@ -7104,11 +7450,6 @@ packages: minimatch: 3.1.2 dev: true - /text-encoding@0.7.0: - resolution: {integrity: sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==} - deprecated: no longer maintained - dev: false - /text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} dev: false @@ -7130,6 +7471,12 @@ packages: any-promise: 1.3.0 dev: false + /thread-stream@2.4.0: + resolution: {integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==} + dependencies: + real-require: 0.2.0 + dev: false + /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: false @@ -7686,7 +8033,6 @@ packages: /xmlbuilder@15.1.1: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} - dev: false /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} diff --git a/website/docs/routes/other.md b/website/docs/routes/other.md index 40e6d7d392af6e..44af8528f01b2e 100644 --- a/website/docs/routes/other.md +++ b/website/docs/routes/other.md @@ -219,7 +219,7 @@ Official Website: