From 7785a7bde4ea866d981ec609129cae011be1b00b Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 23 Feb 2026 08:17:37 +0800 Subject: [PATCH] style: update eslint rules (#21207) * style: update eslint rules * style: fix prefer-object-spread * style: fix no-lonely-if * fix: typescript-eslint/no-unnecessary-template-expression * fix: sort import * style: apply file filtering to config presets * revert: changes on pkg * style: revert * style: use defineConfig * style: reorder js plugin in eslint config * chore: remove obsolete override * style: fix CodeQL initialization to ensure language matrix is used --- .github/workflows/codeql.yml | 2 +- .oxfmtrc.json | 5 +- eslint.config.mjs | 96 ++-- lib/routes/18comic/album.ts | 2 +- lib/routes/dlsite/utils.ts | 7 +- lib/routes/flyert/utils.ts | 2 +- lib/routes/getitfree/util.ts | 4 +- lib/routes/gov/cn/news/index.ts | 32 +- lib/routes/huggingface/models.ts | 14 +- lib/routes/kanxue/topic.ts | 14 +- lib/routes/mirrormedia/category.ts | 2 +- lib/routes/neea/index.ts | 2 +- lib/routes/taptap/topic.ts | 14 +- lib/routes/twitter/api/mobile-api/login.ts | 2 +- lib/routes/voronoiapp/common.ts | 12 +- lib/routes/xiaoheihe/discount.ts | 32 +- package.json | 29 +- pnpm-lock.yaml | 587 ++++++++++++++++++++- scripts/docker/minify-docker.js | 4 +- 19 files changed, 715 insertions(+), 147 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 3c83d0301e..a870789efa 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -55,13 +55,13 @@ jobs: - name: Initialize CodeQL uses: github/codeql-action/init@v4 with: - languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality + languages: ${{ matrix.language }} # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). # If this step fails, then you should remove it and run the build manually (see below) diff --git a/.oxfmtrc.json b/.oxfmtrc.json index c25043a2b4..93705aa65c 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -5,5 +5,8 @@ "singleQuote": true, "trailingComma": "es5", "arrowParens": "always", - "ignorePatterns": ["lib/routes-deprecated", "lib/router.js", "babel.config.js", "scripts/docker/minify-docker.js", "dist", "pnpm-lock.yaml"] + "ignorePatterns": ["lib/routes-deprecated", "lib/router.js", "babel.config.js", "scripts/docker/minify-docker.js", "dist", "pnpm-lock.yaml"], + "experimentalSortPackageJson": { + "sortScripts": true + } } diff --git a/eslint.config.mjs b/eslint.config.mjs index 3560e7b6df..ee655c9eb7 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,23 +1,21 @@ -import { FlatCompat } from '@eslint/eslintrc'; import js from '@eslint/js'; import stylistic from '@stylistic/eslint-plugin'; import typescriptEslint from '@typescript-eslint/eslint-plugin'; import tsParser from '@typescript-eslint/parser'; +import { defineConfig } from 'eslint/config'; +import github from 'eslint-plugin-github'; import { importX } from 'eslint-plugin-import-x'; import n from 'eslint-plugin-n'; import simpleImportSort from 'eslint-plugin-simple-import-sort'; import unicorn from 'eslint-plugin-unicorn'; import eslintPluginYml from 'eslint-plugin-yml'; import globals from 'globals'; + // import nsfwFlagPlugin from './eslint-plugins/nsfw-flag.js'; -const __dirname = import.meta.dirname; -const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended, -}); +const SOURCE_FILES_GLOB = '**/*.?([cm])[jt]s?(x)'; -export default [ +export default defineConfig([ // { // plugins: { // '@rsshub/nsfw-flag': nsfwFlagPlugin, @@ -27,17 +25,19 @@ export default [ // }, // }, { - ignores: ['**/coverage', '**/.vscode', '**/docker-compose.yml', '!.github', 'assets/build', 'lib/routes-deprecated', 'lib/router.js', '**/babel.config.js', 'scripts/docker/minify-docker.js', 'dist', 'dist-lib'], + ignores: ['**/coverage', '**/.vscode', '**/docker-compose.yml', '!.github', 'assets/build', 'lib/routes-deprecated', 'lib/router.js', 'dist', 'dist-lib', 'dist-worker'], }, - ...compat.extends('eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:@typescript-eslint/stylistic'), - n.configs['flat/recommended-script'], - unicorn.configs.recommended, - ...eslintPluginYml.configs.recommended, { + files: [SOURCE_FILES_GLOB], plugins: { '@stylistic': stylistic, '@typescript-eslint': typescriptEslint, + github, + js, + n, + unicorn, }, + extends: [js.configs.recommended, typescriptEslint.configs['flat/recommended'], typescriptEslint.configs['flat/stylistic'], n.configs['flat/recommended-script'], unicorn.configs.recommended], languageOptions: { globals: { @@ -51,7 +51,7 @@ export default [ }, rules: { - // possible problems + // #region possible problems 'array-callback-return': [ 'error', { @@ -62,8 +62,9 @@ export default [ 'no-await-in-loop': 'error', 'no-control-regex': 'off', 'no-prototype-builtins': 'off', + // #endregion - // suggestions + // #region suggestions 'arrow-body-style': 'error', 'block-scoped-var': 'error', curly: 'error', @@ -95,9 +96,9 @@ export default [ 'no-implicit-globals': 'error', 'no-labels': 'error', + 'no-lonely-if': 'error', 'no-multi-str': 'error', 'no-new-func': 'error', - 'no-restricted-imports': 'error', 'no-restricted-syntax': [ 'error', @@ -136,7 +137,6 @@ export default [ 'prefer-arrow-callback': 'error', 'prefer-const': 'error', 'prefer-object-has-own': 'error', - 'no-useless-escape': 'warn', 'prefer-regex-literals': [ 'error', @@ -146,8 +146,9 @@ export default [ ], 'require-await': 'error', + // #endregion - // typescript + // #region typescript '@typescript-eslint/array-type': ['error', { default: 'array-simple' }], '@typescript-eslint/ban-ts-comment': 'off', @@ -177,8 +178,9 @@ export default [ ], '@typescript-eslint/prefer-for-of': 'error', + // #endregion - // unicorn + // #region unicorn 'unicorn/consistent-function-scoping': 'warn', 'unicorn/explicit-length-check': 'off', @@ -265,8 +267,9 @@ export default [ 'unicorn/switch-case-braces': ['error', 'avoid'], 'unicorn/text-encoding-identifier-case': 'off', 'unicorn/number-literal-case': 'off', + // #endregion - // formatting rules + // #region stylistic '@stylistic/arrow-parens': 'error', '@stylistic/arrow-spacing': 'error', '@stylistic/comma-spacing': 'error', @@ -291,9 +294,9 @@ export default [ '@stylistic/space-infix-ops': 'error', '@stylistic/space-unary-ops': 'error', '@stylistic/spaced-comment': 'error', + // #endregion - // https://github.com/eslint-community/eslint-plugin-n - // node specific rules + // #region node specific rules 'n/no-extraneous-require': 'error', 'n/no-deprecated-api': 'warn', @@ -317,6 +320,10 @@ export default [ ignores: [], }, ], + // #endregion + + // github + 'github/no-then': 'warn', }, }, { @@ -325,9 +332,33 @@ export default [ '@typescript-eslint/no-require-imports': 'off', }, }, + { + files: [SOURCE_FILES_GLOB], + plugins: { + 'simple-import-sort': simpleImportSort, + 'import-x': importX, + }, + rules: { + 'sort-imports': 'off', + 'import-x/order': 'off', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', + + 'import-x/first': 'error', + 'import-x/newline-after-import': 'error', + 'no-duplicate-imports': 'off', + 'import-x/no-duplicates': 'error', + + '@typescript-eslint/consistent-type-imports': 'error', + 'import-x/consistent-type-specifier-style': ['error', 'prefer-top-level'], + }, + }, { files: ['**/*.yaml', '**/*.yml'], ignores: ['pnpm-lock.yaml'], + plugins: { + yml: eslintPluginYml, + }, language: 'yml/yaml', rules: { 'lines-around-comment': [ @@ -355,25 +386,4 @@ export default [ ], }, }, - { - files: ['**/*.?([cm])[jt]s?(x)'], - plugins: { - 'simple-import-sort': simpleImportSort, - 'import-x': importX, - }, - rules: { - 'sort-imports': 'off', - 'import-x/order': 'off', - 'simple-import-sort/imports': 'error', - 'simple-import-sort/exports': 'error', - - 'import-x/first': 'error', - 'import-x/newline-after-import': 'error', - 'no-duplicate-imports': 'off', - 'import-x/no-duplicates': 'error', - - '@typescript-eslint/consistent-type-imports': 'error', - 'import-x/consistent-type-specifier-style': ['error', 'prefer-top-level'], - }, - }, -]; +]); diff --git a/lib/routes/18comic/album.ts b/lib/routes/18comic/album.ts index c2ecd580a1..575c71d725 100644 --- a/lib/routes/18comic/album.ts +++ b/lib/routes/18comic/album.ts @@ -72,7 +72,7 @@ async function handler(ctx) { const chapterResult = await processApiItems(chapterApiUrl); const result = {}; const chapterNum = index + 1; - result.title = `第${String(chapterNum)}話 ${item.name === '' ? `${String(chapterNum)}` : item.name}`; + result.title = `第${chapterNum}話 ${item.name === '' ? chapterNum : item.name}`; result.link = `${rootUrl}/photo/${item.id}`; result.guid = `${rootUrl}/photo/${item.id}`; result.updated = new Date(chapterResult.addtime * 1000); diff --git a/lib/routes/dlsite/utils.ts b/lib/routes/dlsite/utils.ts index 069881a797..b13e050f0c 100644 --- a/lib/routes/dlsite/utils.ts +++ b/lib/routes/dlsite/utils.ts @@ -133,12 +133,7 @@ const ProcessItems = async (ctx) => { images = images.length === 0 ? [detail.work_image] : images; return { - title: `${ - discountRate - ? `${discountRate}% OFF - ${` ${discountEndDate ? `${dayjs(discountEndDate).format('YYYY-MM-DD HH:mm')} まで` : ''}`}` - : ' ' - }${title}`, + title: `${discountRate ? `${discountRate}% OFF ${discountEndDate ? `${dayjs(discountEndDate).format('YYYY-MM-DD HH:mm')} まで` : ''}` : ' '}${title}`, link, pubDate, author: authors.map((a) => a.name).join(' / '), diff --git a/lib/routes/flyert/utils.ts b/lib/routes/flyert/utils.ts index 8502f150e0..78874f26bc 100644 --- a/lib/routes/flyert/utils.ts +++ b/lib/routes/flyert/utils.ts @@ -70,7 +70,7 @@ const ProcessFeed = (list, caches) => { const other = await caches.tryGet(itemUrl, () => loadContent(itemUrl)); // 合并解析后的结果集作为该篇文章最终的输出结果 - return Object.assign({}, single, other); + return { ...single, ...other }; }, { concurrency: 2 } ); // 设置并发请求数量为 2 diff --git a/lib/routes/getitfree/util.ts b/lib/routes/getitfree/util.ts index 454a946aaa..50385c17bd 100644 --- a/lib/routes/getitfree/util.ts +++ b/lib/routes/getitfree/util.ts @@ -48,7 +48,7 @@ const bakeFilterSearchParams = (filterPairs, pairKey, isApi = false) => { const key = keys[0]; const pairs = filterPairs[key]; - const originalFilters = Object.assign({}, filterPairs); + const originalFilters = { ...filterPairs }; delete originalFilters[key]; filterSearchParams.append(getFilterKeyForSearchParams(key, isApi), pairs.map((pair) => (Object.hasOwn(pair, pairKey) ? pair[pairKey] : pair)).join(',')); @@ -121,7 +121,7 @@ const bakeFiltersWithPair = async (filters) => { const key = keys[0]; const keywords = filters[key]; - const originalFilters = Object.assign({}, filters); + const originalFilters = { ...filters }; delete originalFilters[key]; return bakeFilters(originalFilters, { diff --git a/lib/routes/gov/cn/news/index.ts b/lib/routes/gov/cn/news/index.ts index 924f93cf6a..326d192452 100644 --- a/lib/routes/gov/cn/news/index.ts +++ b/lib/routes/gov/cn/news/index.ts @@ -98,25 +98,23 @@ async function handler(ctx) { } else { description = item.find('a').text(); // 忽略获取吹风会的全文 } - } else { - if (contentUrl.includes('content')) { - fullTextGet = await got.get(contentUrl); - fullTextData = load(fullTextGet.data); - const $1 = fullTextData.html(); - pubDate = timezone(parseDate(fullTextData('meta[name="firstpublishedtime"]').attr('content'), 'YYYY-MM-DD HH:mm:ss'), 8); - author = fullTextData('meta[name="author"]').attr('content'); - category = fullTextData('meta[name="keywords"]').attr('content').split(/[,;]/); - if (/zhengceku/g.test(contentUrl)) { - // 政策文件库 - description = fullTextData('.pages_content').html(); - } else { - fullTextData('.shuzi').remove(); // 移除videobg的图片 - fullTextData('#myFlash').remove(); // 移除flash - description = /UCAP-CONTENT/g.test($1) ? fullTextData('#UCAP-CONTENT').html() : fullTextData('body').html(); - } + } else if (contentUrl.includes('content')) { + fullTextGet = await got.get(contentUrl); + fullTextData = load(fullTextGet.data); + const $1 = fullTextData.html(); + pubDate = timezone(parseDate(fullTextData('meta[name="firstpublishedtime"]').attr('content'), 'YYYY-MM-DD HH:mm:ss'), 8); + author = fullTextData('meta[name="author"]').attr('content'); + category = fullTextData('meta[name="keywords"]').attr('content').split(/[,;]/); + if (/zhengceku/g.test(contentUrl)) { + // 政策文件库 + description = fullTextData('.pages_content').html(); } else { - description = item.find('a').text(); // 忽略获取吹风会的全文 + fullTextData('.shuzi').remove(); // 移除videobg的图片 + fullTextData('#myFlash').remove(); // 移除flash + description = /UCAP-CONTENT/g.test($1) ? fullTextData('#UCAP-CONTENT').html() : fullTextData('body').html(); } + } else { + description = item.find('a').text(); // 忽略获取吹风会的全文 } return { title: item.find('a').text(), diff --git a/lib/routes/huggingface/models.ts b/lib/routes/huggingface/models.ts index 94f8a54485..b5e0f73780 100644 --- a/lib/routes/huggingface/models.ts +++ b/lib/routes/huggingface/models.ts @@ -92,15 +92,13 @@ async function handler(ctx) { if (/^https?:\/\//i.test(src)) { // 已经是完整 URL $e.attr('src', src); - } else { + } else if (src.startsWith('/')) { // 处理以 / 开头的绝对路径 - if (src.startsWith('/')) { - $e.attr('src', `${item.link}/resolve/main/` + src); - } else { - // 处理相对路径(如 ./images/pic.png 或 images/pic.png) - const baseUrl = item.link + '/resolve/main/'; - $e.attr('src', baseUrl + src.replace(/^\.\//, '')); - } + $e.attr('src', `${item.link}/resolve/main/` + src); + } else { + // 处理相对路径(如 ./images/pic.png 或 images/pic.png) + const baseUrl = item.link + '/resolve/main/'; + $e.attr('src', baseUrl + src.replace(/^\.\//, '')); } }); item.description = $Out.html(); diff --git a/lib/routes/kanxue/topic.ts b/lib/routes/kanxue/topic.ts index a4613d536c..edefb572d7 100644 --- a/lib/routes/kanxue/topic.ts +++ b/lib/routes/kanxue/topic.ts @@ -74,15 +74,13 @@ async function handler(ctx) { path = `forum-${categoryId[category][0]}.html`; title = `看雪论坛最新主题 - ${categoryId[category][1]}`; } - } else { + } else if (category === 'digest') { // category未知时则获取全站最新帖 - if (category === 'digest') { - path = 'new-digest.htm'; - title = '看雪论坛精华主题'; - } else { - path = 'new-tid.htm'; - title = '看雪论坛最新主题'; - } + path = 'new-digest.htm'; + title = '看雪论坛精华主题'; + } else { + path = 'new-tid.htm'; + title = '看雪论坛最新主题'; } const response = await got({ diff --git a/lib/routes/mirrormedia/category.ts b/lib/routes/mirrormedia/category.ts index cb08c0bc44..31b4cd1c15 100644 --- a/lib/routes/mirrormedia/category.ts +++ b/lib/routes/mirrormedia/category.ts @@ -88,7 +88,7 @@ query ($take: Int, $skip: Int, $orderBy: [PostOrderByInput!]!, $filter: PostWher title: e.title, pubDate: parseDate(e.publishedDate), category: [...(e.sections ?? []).map((_) => `section:${_.name}`), ...(e.categories ?? []).map((_) => `category:${_.name}`)], - link: `${rootUrl}/${'story'}/${e.slug}`, + link: `${rootUrl}/story/${e.slug}`, })); const list = await Promise.all(items.map((item) => getArticle(item))); diff --git a/lib/routes/neea/index.ts b/lib/routes/neea/index.ts index 5a0c95c59b..f93476f5a9 100644 --- a/lib/routes/neea/index.ts +++ b/lib/routes/neea/index.ts @@ -49,7 +49,7 @@ async function handler(ctx) { pubDate: timezone(parseDate(time), +8), }; const other = await loadContent(String(itemUrl)); - return Object.assign({}, single, other); + return { ...single, ...other }; }) ); return { diff --git a/lib/routes/taptap/topic.ts b/lib/routes/taptap/topic.ts index 2954d43779..270cefc5f0 100644 --- a/lib/routes/taptap/topic.ts +++ b/lib/routes/taptap/topic.ts @@ -90,15 +90,13 @@ async function handler(ctx) { if (moment.reposted_moment.topic.footer_images) { description += imagePost(moment.reposted_moment.topic.footer_images); } - } else { - if (moment.topic.pin_video) { - description += videoPost(moment.topic.pin_video); - if (moment.topic.footer_images?.images) { - description += imagePost(moment.topic.footer_images.images); - } - } else { - description = await topicPost(appId, topicId, lang); + } else if (moment.topic.pin_video) { + description += videoPost(moment.topic.pin_video); + if (moment.topic.footer_images?.images) { + description += imagePost(moment.topic.footer_images.images); } + } else { + description = await topicPost(appId, topicId, lang); } return { title, diff --git a/lib/routes/twitter/api/mobile-api/login.ts b/lib/routes/twitter/api/mobile-api/login.ts index 0ba8634508..793cda0d98 100644 --- a/lib/routes/twitter/api/mobile-api/login.ts +++ b/lib/routes/twitter/api/mobile-api/login.ts @@ -49,7 +49,7 @@ const postTask = async (flowToken: string, subtaskId: string, subtaskInput: Reco headers, json: { flow_token: flowToken, - subtask_inputs: [Object.assign({ subtask_id: subtaskId }, subtaskInput)], + subtask_inputs: [{ subtask_id: subtaskId, ...subtaskInput }], }, }); diff --git a/lib/routes/voronoiapp/common.ts b/lib/routes/voronoiapp/common.ts index 98b02ea1d9..3e65d9f9c3 100644 --- a/lib/routes/voronoiapp/common.ts +++ b/lib/routes/voronoiapp/common.ts @@ -19,13 +19,11 @@ export async function getPostItems(params: { }): Promise { const baseUrl = 'https://9oyi4rk426.execute-api.ca-central-1.amazonaws.com/production/post'; const url = new URL(baseUrl); - const finalSearchParams = Object.assign( - { - limit: 20, - offset: 0, - }, - params - ); + const finalSearchParams = { + limit: 20, + offset: 0, + ...params, + }; if (finalSearchParams.time_range !== undefined) { finalSearchParams.time_range = finalSearchParams.time_range.toUpperCase(); if (!TimeRangeParam.options.some((option) => option.value === finalSearchParams.time_range)) { diff --git a/lib/routes/xiaoheihe/discount.ts b/lib/routes/xiaoheihe/discount.ts index 5e8d054140..df1aa9ebf9 100644 --- a/lib/routes/xiaoheihe/discount.ts +++ b/lib/routes/xiaoheihe/discount.ts @@ -104,23 +104,21 @@ async function handler(ctx) { } } } - } else { - if (item.price) { - description += `平台: ${platformInfo.desc}
`; - if (item.heybox_price) { - description += `当前价格: ${item.price.current} ${getHeyboxPriceDesc(item.heybox_price)} ${getLowestDesc(item.price, item.heybox_price.super_lowest)}
`; - } else if (item.price.current) { - description += `当前价格: ${item.price.current} ${getLowestDesc(item.price)}
`; - } - if (item.price.initial) { - description += `原价: ${item.price.initial}
`; - } - if (item.price.discount && item.price.discount > 0) { - description += `折扣力度: ${getDiscountDesc(item.price.discount)}
`; - } - if (item.price.deadline_date) { - description += `截止时间: ${item.price.deadline_date}
`; - } + } else if (item.price) { + description += `平台: ${platformInfo.desc}
`; + if (item.heybox_price) { + description += `当前价格: ${item.price.current} ${getHeyboxPriceDesc(item.heybox_price)} ${getLowestDesc(item.price, item.heybox_price.super_lowest)}
`; + } else if (item.price.current) { + description += `当前价格: ${item.price.current} ${getLowestDesc(item.price)}
`; + } + if (item.price.initial) { + description += `原价: ${item.price.initial}
`; + } + if (item.price.discount && item.price.discount > 0) { + description += `折扣力度: ${getDiscountDesc(item.price.discount)}
`; + } + if (item.price.deadline_date) { + description += `截止时间: ${item.price.deadline_date}
`; } } if (item.score) { diff --git a/package.json b/package.json index e65ad23392..b3258faafb 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,7 @@ "build:docs": "npm run build:routes && tsx scripts/workflow/build-docs.ts", "build:lib": "npm run build:routes && tsdown --config ./tsdown-lib.config.ts", "build:routes": "cross-env NODE_ENV=dev tsx scripts/workflow/build-routes.ts", - "vercel-build": "npm run build:routes && tsdown --config ./tsdown-vercel.config.ts", "build:routes:worker": "cross-env NODE_ENV=dev WORKER_BUILD=true tsx scripts/workflow/build-routes.ts", - "worker-build": "npm run build:routes:worker && tsdown --config ./tsdown-worker.config.ts", - "worker-dev": "npm run worker-build && wrangler dev", - "worker-deploy": "npm run worker-build && wrangler deploy", - "worker-test": "npm run worker-build && vitest run lib/worker.worker.test.ts", "container-build": "tsdown --config ./tsdown-container.config.ts", "container-deploy": "npm run container-build && wrangler deploy --config wrangler-container.toml --containers-rollout=immediate", "dev": "cross-env NODE_ENV=dev NODE_OPTIONS='--max-http-header-size=32768' tsx watch --inspect --clear-screen=false lib/index.ts", @@ -49,10 +44,15 @@ "profiling": "cross-env NODE_ENV=production tsx --prof lib/index.ts", "start": "cross-env NODE_ENV=production NODE_OPTIONS='--max-http-header-size=32768' node dist/index.mjs", "test": "npm run format:check && npm run vitest:coverage", + "vercel-build": "npm run build:routes && tsdown --config ./tsdown-vercel.config.ts", "vitest": "cross-env NODE_ENV=test vitest", "vitest:coverage": "cross-env NODE_ENV=test vitest --coverage.enabled --reporter=junit", "vitest:fullroutes": "cross-env NODE_ENV=test FULL_ROUTES_TEST=true vitest --reporter=json --reporter=default --outputFile=\"./assets/build/test-full-routes.json\" routes", - "vitest:watch": "cross-env NODE_ENV=test vitest --watch" + "vitest:watch": "cross-env NODE_ENV=test vitest --watch", + "worker-build": "npm run build:routes:worker && tsdown --config ./tsdown-worker.config.ts", + "worker-deploy": "npm run worker-build && wrangler deploy", + "worker-dev": "npm run worker-build && wrangler dev", + "worker-test": "npm run worker-build && vitest run lib/worker.worker.test.ts" }, "dependencies": { "@bbob/html": "4.3.1", @@ -174,6 +174,7 @@ "domhandler": "5.0.3", "eslint": "10.0.0", "eslint-nibble": "9.1.1", + "eslint-plugin-github": "6.0.0", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-n": "17.24.0", "eslint-plugin-simple-import-sort": "12.1.1", @@ -212,7 +213,7 @@ "engines": { "node": "^22.20.0 || ^24" }, - "packageManager": "pnpm@10.29.3+sha512.498e1fb4cca5aa06c1dcf2611e6fafc50972ffe7189998c409e90de74566444298ffe43e6cd2acdc775ba1aa7cc5e092a8b7054c811ba8c5770f84693d33d2dc", + "packageManager": "pnpm@10.30.1+sha512.3590e550d5384caa39bd5c7c739f72270234b2f6059e13018f975c313b1eb9fefcc09714048765d4d9efe961382c312e624572c0420762bdc5d5940cdf9be73a", "pnpm": { "onlyBuiltDependencies": [ "bufferutil", @@ -234,6 +235,10 @@ "wrangler" ], "overrides": { + "array-includes": "npm:@nolyfill/array-includes@^1", + "array.prototype.findlastindex": "npm:@nolyfill/array.prototype.findlastindex@^1", + "array.prototype.flat": "npm:@nolyfill/array.prototype.flat@^1", + "array.prototype.flatmap": "npm:@nolyfill/array.prototype.flatmap@^1", "difflib": "https://codeload.github.com/postlight/difflib.js/tar.gz/32e8e38c7fcd935241b9baab71bb432fd9b166ed", "es-set-tostringtag": "npm:@nolyfill/es-set-tostringtag@^1", "google-play-scraper>got": "^14.6.4", @@ -241,12 +246,18 @@ "google-play-scraper>tough-cookie": "^6.0.0", "hasown": "npm:@nolyfill/hasown@^1", "is-core-module": "npm:@nolyfill/is-core-module@^1", - "js-beautify@1.15.4>glob": "^10.5.0", + "object.assign": "npm:@nolyfill/object.assign@^1", + "object.fromentries": "npm:@nolyfill/object.fromentries@^1", + "object.groupby": "npm:@nolyfill/object.groupby@^1", + "object.values": "npm:@nolyfill/object.values@^1", "rss-parser@3.13.0>entities": "^7.0.0", "rss-parser@3.13.0>xml2js": "^0.6.2", "safe-buffer": "npm:@nolyfill/safe-buffer@^1", + "safe-regex-test": "npm:@nolyfill/safe-regex-test@^1", "safer-buffer": "npm:@nolyfill/safer-buffer@^1", - "side-channel": "npm:@nolyfill/side-channel@^1" + "side-channel": "npm:@nolyfill/side-channel@^1", + "string.prototype.includes": "npm:@nolyfill/string.prototype.includes@^1", + "string.prototype.trimend": "npm:@nolyfill/string.prototype.trimend@^1" }, "patchedDependencies": { "rss-parser@3.13.0": "patches/rss-parser@3.13.0.patch" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb931d8159..3557bb4b53 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,10 @@ settings: excludeLinksFromLockfile: false overrides: + array-includes: npm:@nolyfill/array-includes@^1 + array.prototype.findlastindex: npm:@nolyfill/array.prototype.findlastindex@^1 + array.prototype.flat: npm:@nolyfill/array.prototype.flat@^1 + array.prototype.flatmap: npm:@nolyfill/array.prototype.flatmap@^1 difflib: https://codeload.github.com/postlight/difflib.js/tar.gz/32e8e38c7fcd935241b9baab71bb432fd9b166ed es-set-tostringtag: npm:@nolyfill/es-set-tostringtag@^1 google-play-scraper>got: ^14.6.4 @@ -12,12 +16,18 @@ overrides: google-play-scraper>tough-cookie: ^6.0.0 hasown: npm:@nolyfill/hasown@^1 is-core-module: npm:@nolyfill/is-core-module@^1 - js-beautify@1.15.4>glob: ^10.5.0 + object.assign: npm:@nolyfill/object.assign@^1 + object.fromentries: npm:@nolyfill/object.fromentries@^1 + object.groupby: npm:@nolyfill/object.groupby@^1 + object.values: npm:@nolyfill/object.values@^1 rss-parser@3.13.0>entities: ^7.0.0 rss-parser@3.13.0>xml2js: ^0.6.2 safe-buffer: npm:@nolyfill/safe-buffer@^1 + safe-regex-test: npm:@nolyfill/safe-regex-test@^1 safer-buffer: npm:@nolyfill/safer-buffer@^1 side-channel: npm:@nolyfill/side-channel@^1 + string.prototype.includes: npm:@nolyfill/string.prototype.includes@^1 + string.prototype.trimend: npm:@nolyfill/string.prototype.trimend@^1 patchedDependencies: rss-parser@3.13.0: @@ -380,9 +390,12 @@ importers: eslint-nibble: specifier: 9.1.1 version: 9.1.1(@types/node@25.3.0)(eslint@10.0.0(jiti@2.6.1)) + eslint-plugin-github: + specifier: 6.0.0 + version: 6.0.0(@types/eslint@9.6.1)(eslint@10.0.0(jiti@2.6.1)) eslint-plugin-import-x: specifier: 4.16.1 - version: 4.16.1(@typescript-eslint/utils@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1)) + version: 4.16.1(@typescript-eslint/utils@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.0.0(jiti@2.6.1)) eslint-plugin-n: specifier: 17.24.0 version: 17.24.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) @@ -436,7 +449,7 @@ importers: version: 7.2.2 tsdown: specifier: 0.20.3 - version: 0.20.3(synckit@0.11.11)(typescript@5.9.3) + version: 0.20.3(synckit@0.11.12)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 @@ -837,6 +850,15 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/compat@1.4.1': + resolution: {integrity: sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.40 || 9 + peerDependenciesMeta: + eslint: + optional: true + '@eslint/config-array@0.23.1': resolution: {integrity: sha512-uVSdg/V4dfQmTjJzR0szNczjOH/J+FyUMMjYtr07xFRXR7EDf9i1qdxrD0VusZH9knj1/ecxzCQQxyic5NzAiA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -866,6 +888,10 @@ packages: eslint: optional: true + '@eslint/js@9.39.3': + resolution: {integrity: sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/markdown@7.5.1': resolution: {integrity: sha512-R8uZemG9dKTbru/DQRPblbJyXpObwKzo8rv1KYGGuPUPtjM4LXBYM9q5CIZAComzZupws3tWbDwam5AFpPLyJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -882,6 +908,9 @@ packages: resolution: {integrity: sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@github/browserslist-config@1.0.0': + resolution: {integrity: sha512-gIhjdJp/c2beaIWWIlsXdqXVRUz3r2BxBCpfz/F3JXHvSAQ1paMYjLH+maEATtENg+k5eLV7gA+9yPp762ieuw==} + '@hono/node-server@1.19.9': resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} engines: {node: '>=18.14.1'} @@ -1217,6 +1246,22 @@ packages: resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} engines: {node: '>= 20.19.0'} + '@nolyfill/array-includes@1.0.44': + resolution: {integrity: sha512-IVEqpEgFbLaU0hUoMwJYXNSdi6lq+FxHdxd8xTKDLxh8k6u5YNGz4Bo6bT46l7p0x8PbJmHViBtngqhvE528fA==} + engines: {node: '>=12.4.0'} + + '@nolyfill/array.prototype.findlastindex@1.0.44': + resolution: {integrity: sha512-BLeHS3SulsR3iFxxETL9q21lArV2KS7lh2wcUnhue1ppx19xah1W7MdFxepyeGbM3Umk9S90snfboXAds5HkTg==} + engines: {node: '>=12.4.0'} + + '@nolyfill/array.prototype.flat@1.0.44': + resolution: {integrity: sha512-HnOqOT4te0l+XU9UKhy3ry+pc+ZRNsUJFR7omMEtjXf4+dq6oXmIBk7vR35+hSTk4ldjwm/27jwV3ZIGp3l4IQ==} + engines: {node: '>=12.4.0'} + + '@nolyfill/array.prototype.flatmap@1.0.44': + resolution: {integrity: sha512-P6OsaEUrpBJ9NdNekFDQVM9LOFHPDKSJzwOWRBaC6LqREX+4lkZT2Q+to78R6aG6atuOQsxBVqPjMGCKjWdvyQ==} + engines: {node: '>=12.4.0'} + '@nolyfill/es-set-tostringtag@1.0.44': resolution: {integrity: sha512-Qfiv/3wI+mKSPCgU8Fg/7Auu4os00St4GwyLqCCZ/oBD4W00itWUkl9Rq1MCGS+VXYDnTobvrc6AvPagwnT2pg==} engines: {node: '>=12.4.0'} @@ -1225,18 +1270,53 @@ packages: resolution: {integrity: sha512-GA/21lkTr2PAQuT6jGnhLuBD5IFd/AEhBXJ/tf33+/bVxPxg+5ejKx9jGQGnyV/P0eSmdup5E+s8b2HL6lOrwQ==} engines: {node: '>=12.4.0'} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@nolyfill/object.assign@1.0.44': + resolution: {integrity: sha512-cZoXq09YZXDgkxRMAP/TTb3kAsWm7p5OyBugWDe4fOfxf0XRI55mgDSkuyq41sV1qW1zVC5aSsKEh1hQo1KOvA==} + engines: {node: '>=12.4.0'} + + '@nolyfill/object.fromentries@1.0.44': + resolution: {integrity: sha512-/LrsCtpLmByZ6GwP/NeXULSgMyNsVr5d6FlgQy1HZatAiBc8c+WZ1VmFkK19ZLXCNNXBedXDultrp0x4Nz+QQw==} + engines: {node: '>=12.4.0'} + + '@nolyfill/object.groupby@1.0.44': + resolution: {integrity: sha512-jCt/8pN+10mlbeg0ZESpVVaqn5qqpv6kpjM+GDfEP7cXGDSPlIjtvfYWRZK4k4Gftkhhgqkzvcrr8z1wuNO1TQ==} + engines: {node: '>=12.4.0'} + + '@nolyfill/object.values@1.0.44': + resolution: {integrity: sha512-bwIpVzFMudUC0ofnvdSDB/OyGUizcU+r32ZZ0QTMbN03gUttMtdCFDekuSYT0XGFgufTQyZ4ONBnAeb3DFCPGQ==} + engines: {node: '>=12.4.0'} + '@nolyfill/safe-buffer@1.0.44': resolution: {integrity: sha512-SqlKXtlhNTDMeZKey9jnnuPhi8YTl1lJuEcY9zbm5i4Pqe79UJJ8IJ9oiD6DhgI8KjYc+HtLzpQJNRdNYqb/hw==} engines: {node: '>=12.4.0'} + '@nolyfill/safe-regex-test@1.0.44': + resolution: {integrity: sha512-Q6veatd1NebtD8Sre6zjvO35QzG21IskMVOOEbePFcNO9noanNJgsqHeOCr0c5yZz6Z0DAizLg2gIZWokJSkXw==} + engines: {node: '>=12.4.0'} + '@nolyfill/safer-buffer@1.0.44': resolution: {integrity: sha512-Ouw1fMwjAy1V4MpnDASfu1DCPgkP0nNFteiiWbFoEGSqa7Vnmkb6if2c522N2WcMk+RuaaabQbC1F1D4/kTXcg==} engines: {node: '>=12.4.0'} + '@nolyfill/shared@1.0.44': + resolution: {integrity: sha512-NI1zxDh4LYL7PYlKKCwojjuc5CEZslywrOTKBNyodjmWjRiZ4AlCMs3Gp+zDoPQPNkYCSQp/luNojHmJWWfCbw==} + '@nolyfill/side-channel@1.0.44': resolution: {integrity: sha512-y3SvzjuY1ygnzWA4Krwx/WaJAsTMP11DN+e21A8Fa8PW1oDtVB5NSRW7LWurAiS2oKRkuCgcjTYMkBuBkcPCRg==} engines: {node: '>=12.4.0'} + '@nolyfill/string.prototype.includes@1.0.44': + resolution: {integrity: sha512-d1t7rnoAYyoap0X3a/gCnusCvxzK6v7uMFzW8k0mI2WtAK8HiKuzaQUwAriyVPh63GsvQCqvXx8Y5gtdh4LjSA==} + engines: {node: '>=12.4.0'} + + '@nolyfill/string.prototype.trimend@1.0.44': + resolution: {integrity: sha512-3dsKlf4Ma7o+uxLIg5OI1Tgwfet2pE8WTbPjEGWvOe6CSjMtK0skJnnSVHaEVX4N4mYU81To0qDeZOPqjaUotg==} + engines: {node: '>=12.4.0'} + '@notionhq/client@5.9.0': resolution: {integrity: sha512-TvAVMfwtVv61hsPrRfB9ehgzSjX6DaAi1ZRAnpg8xFjzaXhzhEfbO0PhBRm3ecSv1azDuO2kBuyQHh2/z7G4YQ==} engines: {node: '>=18'} @@ -1970,6 +2050,9 @@ packages: '@rss3/sdk@0.0.25': resolution: {integrity: sha512-jyXT4YTwefxxRZ0tt5xjbnw8e7zPg2OGdo/0xb+h/7qWnMNhLtWpc95DsYs/1C/I0rIyiDpZBhLI2DieQ9y+tw==} + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@scalar/core@0.3.41': resolution: {integrity: sha512-IPgiHOSGBDfBcJELbev0lo+ZHc8Q/vA82neX0Ax1iHNGtf/munH+qN5I+p9rGRS60IRQAwABlUo31Y3Gw1c0EA==} engines: {node: '>=20'} @@ -2146,6 +2229,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} @@ -2518,6 +2604,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -2536,6 +2626,9 @@ packages: resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} engines: {node: '>=20.19.0'} + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} @@ -2565,6 +2658,14 @@ packages: aws4@1.13.2: resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + axe-core@4.11.1: + resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==} + engines: {node: '>=4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + b4a@1.7.4: resolution: {integrity: sha512-u20zJLDaSWpxaZ+zaAkEIB2dZZ1o+DF4T/MRbmsvGp9nletHOyiai19OzX1fF8xUBYsO1bPXxODvcd0978pnug==} peerDependencies: @@ -2959,6 +3060,9 @@ packages: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} @@ -3088,6 +3192,10 @@ packages: discord-api-types@0.38.39: resolution: {integrity: sha512-XRdDQvZvID1XvcFftjSmd4dcmMi/RL/jSy5sduBDAvCGFcNFHThdIQXCEBDZFe52lCNEzuIL0QJoKYAmRmxLUA==} + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} @@ -3259,6 +3367,12 @@ packages: peerDependencies: eslint: '>=6.0.0' + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + eslint-filtered-fix@0.3.0: resolution: {integrity: sha512-UMHOza9epEn9T+yVT8RiCFf0JdALpVzmoH62Ez/zvxM540IyUNAkr7aH2Frkv6zlm9a/gbmq/sc7C4SvzZQXcA==} hasBin: true @@ -3274,6 +3388,30 @@ packages: unrs-resolver: optional: true + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + eslint-nibble@9.1.1: resolution: {integrity: sha512-yXq9GsGE7hYuQ7D7b/hCvOmNVxQ9MmBkm3VKKIqbEYLicbcv/638jm3/m8pd33rERhZ0hnSDjTn3df9n6X6fPA==} engines: {node: '>=18.0.0'} @@ -3287,6 +3425,33 @@ packages: peerDependencies: eslint: '>=8' + eslint-plugin-escompat@3.11.4: + resolution: {integrity: sha512-j0ywwNnIufshOzgAu+PfIig1c7VRClKSNKzpniMT2vXQ4leL5q+e/SpMFQU0nrdL2WFFM44XmhSuwmxb3G0CJg==} + peerDependencies: + eslint: '>=5.14.1' + + eslint-plugin-eslint-comments@3.2.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-filenames@1.3.2: + resolution: {integrity: sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==} + peerDependencies: + eslint: '*' + + eslint-plugin-github@6.0.0: + resolution: {integrity: sha512-J8MvUoiR/TU/Y9NnEmg1AnbvMUj9R6IO260z47zymMLLvso7B4c80IKjd8diqmqtSmeXXlbIus4i0SvK84flag==} + hasBin: true + peerDependencies: + eslint: ^8 || ^9 + + eslint-plugin-i18n-text@1.0.1: + resolution: {integrity: sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA==} + peerDependencies: + eslint: '>=5.0.0' + eslint-plugin-import-x@4.16.1: resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3300,12 +3465,46 @@ packages: eslint-import-resolver-node: optional: true + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + eslint-plugin-n@17.24.0: resolution: {integrity: sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' + eslint-plugin-no-only-tests@3.3.0: + resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} + engines: {node: '>=5.0.0'} + + eslint-plugin-prettier@5.5.5: + resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + eslint-plugin-simple-import-sort@12.1.1: resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} peerDependencies: @@ -3323,6 +3522,10 @@ packages: peerDependencies: eslint: '>=9.38.0' + eslint-rule-documentation@1.0.23: + resolution: {integrity: sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==} + engines: {node: '>=4.0.0'} + eslint-scope@9.1.0: resolution: {integrity: sha512-CkWE42hOJsNj9FJRaoMX9waUFYhqY4jmyLFdAdzZr6VaCg3ynLYx4WnOdkaIifGfH4gsUcBTn4OZbHXkpLD0FQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -3431,6 +3634,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} @@ -4017,6 +4223,10 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} @@ -4036,6 +4246,10 @@ packages: jsrsasign@11.1.0: resolution: {integrity: sha512-Ov74K9GihaK9/9WncTe1mPmvrO7Py665TUfUKvraXBpu+xcTWitrtuOwcjf4KMU9maPaYn0OuaWy0HOzy/GBXg==} + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + jwa@2.0.1: resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} @@ -4055,6 +4269,13 @@ packages: kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + leac@0.6.0: resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} @@ -4093,6 +4314,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -4103,6 +4327,15 @@ packages: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} @@ -4381,6 +4614,9 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -4668,6 +4904,9 @@ packages: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -4760,6 +4999,15 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} + engines: {node: '>=6.0.0'} + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + process-warning@5.0.0: resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} @@ -4956,6 +5204,11 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + responselike@4.0.2: resolution: {integrity: sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==} engines: {node: '>=20'} @@ -5031,6 +5284,10 @@ packages: selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} @@ -5183,6 +5440,10 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -5214,11 +5475,18 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-element-attributes@1.3.1: + resolution: {integrity: sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA==} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} system-architecture@0.1.0: @@ -5387,6 +5655,9 @@ packages: typescript: optional: true + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsdown@0.20.3: resolution: {integrity: sha512-qWOUXSbe4jN8JZEgrkc/uhJpC8VN2QpNu3eZkBWwNuTEjc/Ik1kcc54ycfcQ5QPRHeu9OQXaLfCI3o7pEJgB2w==} engines: {node: '>=20.19.0'} @@ -5464,6 +5735,13 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typescript-eslint@8.56.0: + resolution: {integrity: sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -6222,6 +6500,12 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} + '@eslint/compat@1.4.1(eslint@10.0.0(jiti@2.6.1))': + dependencies: + '@eslint/core': 0.17.0 + optionalDependencies: + eslint: 10.0.0(jiti@2.6.1) + '@eslint/config-array@0.23.1': dependencies: '@eslint/object-schema': 3.0.1 @@ -6260,6 +6544,8 @@ snapshots: optionalDependencies: eslint: 10.0.0(jiti@2.6.1) + '@eslint/js@9.39.3': {} + '@eslint/markdown@7.5.1': dependencies: '@eslint/core': 0.17.0 @@ -6286,6 +6572,8 @@ snapshots: '@eslint/core': 1.1.0 levn: 0.4.1 + '@github/browserslist-config@1.0.0': {} + '@hono/node-server@1.19.9(hono@4.12.0)': dependencies: hono: 4.12.0 @@ -6590,16 +6878,62 @@ snapshots: '@noble/hashes@2.0.1': {} + '@nolyfill/array-includes@1.0.44': + dependencies: + '@nolyfill/shared': 1.0.44 + + '@nolyfill/array.prototype.findlastindex@1.0.44': + dependencies: + '@nolyfill/shared': 1.0.44 + + '@nolyfill/array.prototype.flat@1.0.44': + dependencies: + '@nolyfill/shared': 1.0.44 + + '@nolyfill/array.prototype.flatmap@1.0.44': + dependencies: + '@nolyfill/shared': 1.0.44 + '@nolyfill/es-set-tostringtag@1.0.44': {} '@nolyfill/hasown@1.0.44': {} + '@nolyfill/is-core-module@1.0.39': {} + + '@nolyfill/object.assign@1.0.44': + dependencies: + '@nolyfill/shared': 1.0.44 + + '@nolyfill/object.fromentries@1.0.44': + dependencies: + '@nolyfill/shared': 1.0.44 + + '@nolyfill/object.groupby@1.0.44': + dependencies: + '@nolyfill/shared': 1.0.44 + + '@nolyfill/object.values@1.0.44': + dependencies: + '@nolyfill/shared': 1.0.44 + '@nolyfill/safe-buffer@1.0.44': {} + '@nolyfill/safe-regex-test@1.0.44': {} + '@nolyfill/safer-buffer@1.0.44': {} + '@nolyfill/shared@1.0.44': {} + '@nolyfill/side-channel@1.0.44': {} + '@nolyfill/string.prototype.includes@1.0.44': + dependencies: + '@nolyfill/shared': 1.0.44 + + '@nolyfill/string.prototype.trimend@1.0.44': + dependencies: + '@nolyfill/shared': 1.0.44 + '@notionhq/client@5.9.0': {} '@one-ini/wasm@0.1.1': {} @@ -7019,8 +7353,7 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.9': - optional: true + '@pkgr/core@0.2.9': {} '@poppinss/colors@4.1.6': dependencies: @@ -7273,6 +7606,8 @@ snapshots: '@rss3/api-core': 0.0.25 '@rss3/api-utils': 0.0.25 + '@rtsao/scc@1.1.0': {} + '@scalar/core@0.3.41': dependencies: '@scalar/types': 0.6.6 @@ -7467,6 +7802,8 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/json5@0.0.29': {} + '@types/jsonfile@6.1.4': dependencies: '@types/node': 25.3.0 @@ -7861,6 +8198,8 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.2: {} + asap@2.0.6: {} asn1@0.2.6: @@ -7877,6 +8216,8 @@ snapshots: estree-walker: 3.0.3 pathe: 2.0.3 + ast-types-flow@0.0.8: {} + ast-types@0.13.4: dependencies: tslib: 2.8.1 @@ -7903,6 +8244,10 @@ snapshots: aws4@1.13.2: {} + axe-core@4.11.1: {} + + axobject-query@4.1.0: {} + b4a@1.7.4: {} bail@2.0.2: {} @@ -8279,6 +8624,8 @@ snapshots: es5-ext: 0.10.64 type: 2.7.3 + damerau-levenshtein@1.0.8: {} + dashdash@1.14.1: dependencies: assert-plus: 1.0.0 @@ -8374,6 +8721,10 @@ snapshots: discord-api-types@0.38.39: {} + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + dom-serializer@1.4.1: dependencies: domelementtype: 2.3.0 @@ -8563,6 +8914,10 @@ snapshots: eslint: 10.0.0(jiti@2.6.1) semver: 7.7.4 + eslint-config-prettier@10.1.8(eslint@10.0.0(jiti@2.6.1)): + dependencies: + eslint: 10.0.0(jiti@2.6.1) + eslint-filtered-fix@0.3.0(eslint@10.0.0(jiti@2.6.1)): dependencies: eslint: 10.0.0(jiti@2.6.1) @@ -8575,6 +8930,24 @@ snapshots: optionalDependencies: unrs-resolver: 1.11.1 + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: '@nolyfill/is-core-module@1.0.39' + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.0.0(jiti@2.6.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.0.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + eslint-nibble@9.1.1(@types/node@25.3.0)(eslint@10.0.0(jiti@2.6.1)): dependencies: '@babel/code-frame': 7.29.0 @@ -8596,7 +8969,62 @@ snapshots: eslint: 10.0.0(jiti@2.6.1) eslint-compat-utils: 0.5.1(eslint@10.0.0(jiti@2.6.1)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1)): + eslint-plugin-escompat@3.11.4(eslint@10.0.0(jiti@2.6.1)): + dependencies: + browserslist: 4.28.1 + eslint: 10.0.0(jiti@2.6.1) + + eslint-plugin-eslint-comments@3.2.0(eslint@10.0.0(jiti@2.6.1)): + dependencies: + escape-string-regexp: 1.0.5 + eslint: 10.0.0(jiti@2.6.1) + ignore: 5.3.2 + + eslint-plugin-filenames@1.3.2(eslint@10.0.0(jiti@2.6.1)): + dependencies: + eslint: 10.0.0(jiti@2.6.1) + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.upperfirst: 4.3.1 + + eslint-plugin-github@6.0.0(@types/eslint@9.6.1)(eslint@10.0.0(jiti@2.6.1)): + dependencies: + '@eslint/compat': 1.4.1(eslint@10.0.0(jiti@2.6.1)) + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.3 + '@github/browserslist-config': 1.0.0 + '@typescript-eslint/eslint-plugin': 8.56.0(@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + aria-query: 5.3.2 + eslint: 10.0.0(jiti@2.6.1) + eslint-config-prettier: 10.1.8(eslint@10.0.0(jiti@2.6.1)) + eslint-plugin-escompat: 3.11.4(eslint@10.0.0(jiti@2.6.1)) + eslint-plugin-eslint-comments: 3.2.0(eslint@10.0.0(jiti@2.6.1)) + eslint-plugin-filenames: 1.3.2(eslint@10.0.0(jiti@2.6.1)) + eslint-plugin-i18n-text: 1.0.1(eslint@10.0.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@10.0.0(jiti@2.6.1)) + eslint-plugin-no-only-tests: 3.3.0 + eslint-plugin-prettier: 5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.0.0(jiti@2.6.1)))(eslint@10.0.0(jiti@2.6.1))(prettier@3.8.1) + eslint-rule-documentation: 1.0.23 + globals: 16.5.0 + jsx-ast-utils: 3.3.5 + prettier: 3.8.1 + svg-element-attributes: 1.3.1 + typescript: 5.9.3 + typescript-eslint: 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + transitivePeerDependencies: + - '@types/eslint' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-i18n-text@1.0.1(eslint@10.0.0(jiti@2.6.1)): + dependencies: + eslint: 10.0.0(jiti@2.6.1) + + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.0.0(jiti@2.6.1)): dependencies: '@typescript-eslint/types': 8.55.0 comment-parser: 1.4.5 @@ -8610,9 +9038,58 @@ snapshots: unrs-resolver: 1.11.1 optionalDependencies: '@typescript-eslint/utils': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: '@nolyfill/array-includes@1.0.44' + array.prototype.findlastindex: '@nolyfill/array.prototype.findlastindex@1.0.44' + array.prototype.flat: '@nolyfill/array.prototype.flat@1.0.44' + array.prototype.flatmap: '@nolyfill/array.prototype.flatmap@1.0.44' + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 10.0.0(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@10.0.0(jiti@2.6.1)) + hasown: '@nolyfill/hasown@1.0.44' + is-core-module: '@nolyfill/is-core-module@1.0.39' + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: '@nolyfill/object.fromentries@1.0.44' + object.groupby: '@nolyfill/object.groupby@1.0.44' + object.values: '@nolyfill/object.values@1.0.44' + semver: 6.3.1 + string.prototype.trimend: '@nolyfill/string.prototype.trimend@1.0.44' + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@10.0.0(jiti@2.6.1)): + dependencies: + aria-query: 5.3.2 + array-includes: '@nolyfill/array-includes@1.0.44' + array.prototype.flatmap: '@nolyfill/array.prototype.flatmap@1.0.44' + ast-types-flow: 0.0.8 + axe-core: 4.11.1 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 10.0.0(jiti@2.6.1) + hasown: '@nolyfill/hasown@1.0.44' + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: '@nolyfill/object.fromentries@1.0.44' + safe-regex-test: '@nolyfill/safe-regex-test@1.0.44' + string.prototype.includes: '@nolyfill/string.prototype.includes@1.0.44' + eslint-plugin-n@17.24.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0(jiti@2.6.1)) @@ -8628,6 +9105,18 @@ snapshots: transitivePeerDependencies: - typescript + eslint-plugin-no-only-tests@3.3.0: {} + + eslint-plugin-prettier@5.5.5(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.0.0(jiti@2.6.1)))(eslint@10.0.0(jiti@2.6.1))(prettier@3.8.1): + dependencies: + eslint: 10.0.0(jiti@2.6.1) + prettier: 3.8.1 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.12 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 10.1.8(eslint@10.0.0(jiti@2.6.1)) + eslint-plugin-simple-import-sort@12.1.1(eslint@10.0.0(jiti@2.6.1)): dependencies: eslint: 10.0.0(jiti@2.6.1) @@ -8667,6 +9156,8 @@ snapshots: - '@eslint/markdown' - supports-color + eslint-rule-documentation@1.0.23: {} + eslint-scope@9.1.0: dependencies: '@types/esrecurse': 4.3.1 @@ -8816,6 +9307,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-fifo@1.3.2: {} fast-json-stable-stringify@2.1.0: {} @@ -9455,6 +9948,10 @@ snapshots: json-stringify-safe@5.0.1: {} + json5@1.0.2: + dependencies: + minimist: 1.2.8 + jsonfile@6.2.0: dependencies: universalify: 2.0.1 @@ -9483,6 +9980,13 @@ snapshots: jsrsasign@11.1.0: {} + jsx-ast-utils@3.3.5: + dependencies: + array-includes: '@nolyfill/array-includes@1.0.44' + array.prototype.flat: '@nolyfill/array.prototype.flat@1.0.44' + object.assign: '@nolyfill/object.assign@1.0.44' + object.values: '@nolyfill/object.values@1.0.44' + jwa@2.0.1: dependencies: buffer-equal-constant-time: 1.0.1 @@ -9506,6 +10010,12 @@ snapshots: kuler@2.0.0: {} + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + leac@0.6.0: {} levn@0.4.1: @@ -9560,12 +10070,20 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.camelcase@4.3.0: {} + lodash.defaults@4.2.0: {} lodash.isarguments@3.1.0: {} lodash.isequal@4.5.0: {} + lodash.kebabcase@4.1.1: {} + + lodash.snakecase@4.1.1: {} + + lodash.upperfirst@4.3.1: {} + lodash@4.17.23: {} log-update@6.1.0: @@ -10038,6 +10556,8 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimist@1.2.8: {} + minipass@7.1.2: {} minizlib@3.1.0: @@ -10341,6 +10861,8 @@ snapshots: path-key@4.0.0: {} + path-parse@1.0.7: {} + path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -10446,6 +10968,12 @@ snapshots: prelude-ls@1.2.1: {} + prettier-linter-helpers@1.0.1: + dependencies: + fast-diff: 1.3.0 + + prettier@3.8.1: {} + process-warning@5.0.0: {} progress@2.0.3: {} @@ -10714,6 +11242,12 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve@1.22.11: + dependencies: + is-core-module: '@nolyfill/is-core-module@1.0.39' + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + responselike@4.0.2: dependencies: lowercase-keys: 3.0.0 @@ -10830,6 +11364,8 @@ snapshots: dependencies: parseley: 0.12.1 + semver@6.3.1: {} + semver@7.7.4: {} sharp@0.34.5: @@ -11004,6 +11540,8 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-bom@3.0.0: {} + strip-final-newline@3.0.0: {} strip-indent@4.1.1: {} @@ -11040,12 +11578,15 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + + svg-element-attributes@1.3.1: {} + symbol-tree@3.2.4: {} - synckit@0.11.11: + synckit@0.11.12: dependencies: '@pkgr/core': 0.2.9 - optional: true system-architecture@0.1.0: {} @@ -11219,7 +11760,14 @@ snapshots: optionalDependencies: typescript: 5.9.3 - tsdown@0.20.3(synckit@0.11.11)(typescript@5.9.3): + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tsdown@0.20.3(synckit@0.11.12)(typescript@5.9.3): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -11236,7 +11784,7 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig-core: 7.5.0 - unrun: 0.2.27(synckit@0.11.11) + unrun: 0.2.27(synckit@0.11.12) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -11291,6 +11839,17 @@ snapshots: dependencies: is-typedarray: 1.0.0 + typescript-eslint@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.56.0(@typescript-eslint/parser@8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.0(eslint@10.0.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.0.0(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + typescript@5.9.3: {} uc.micro@2.1.0: {} @@ -11378,11 +11937,11 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - unrun@0.2.27(synckit@0.11.11): + unrun@0.2.27(synckit@0.11.12): dependencies: rolldown: 1.0.0-rc.3 optionalDependencies: - synckit: 0.11.11 + synckit: 0.11.12 update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: diff --git a/scripts/docker/minify-docker.js b/scripts/docker/minify-docker.js index d41a068dd4..7fc8b0a2d1 100644 --- a/scripts/docker/minify-docker.js +++ b/scripts/docker/minify-docker.js @@ -1,7 +1,9 @@ /* eslint-disable no-console */ -import fs from 'fs-extra'; import path from 'node:path'; + import { nodeFileTrace } from '@vercel/nft'; +import fs from 'fs-extra'; + const __dirname = import.meta.dirname; // !!! if any new dependencies are added, update the Dockerfile !!!