diff --git a/astro.config.mjs b/astro.config.mjs index a518f8c..7e62710 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,23 +1,27 @@ -import { defineConfig } from 'astro/config' -import solid from '@astrojs/solid-js' import node from '@astrojs/node' +import solid from '@astrojs/solid-js' +import { defineConfig } from 'astro/config' +import UnoCSS from 'unocss/astro' // https://astro.build/config export default defineConfig({ - output: 'server', - integrations: [ - solid(), - ], - vite: { - esbuild: { jsx: 'automatic' }, - define: { - 'import.meta.env.VITE_BUILD_DATE': JSON.stringify(new Date().toISOString().split('T')[0]), - }, - }, - adapter: node({ - mode: 'standalone', + output: 'server', + integrations: [ + solid(), + UnoCSS({ + injectReset: true, }), - server: { - host: true, + ], + vite: { + esbuild: { jsx: 'automatic' }, + define: { + 'import.meta.env.VITE_BUILD_DATE': JSON.stringify(new Date().toISOString().split('T')[0]), }, + }, + adapter: node({ + mode: 'standalone', + }), + server: { + host: true, + }, }) diff --git a/drizzle.config.ts b/drizzle.config.ts index 25a7a6a..19f229b 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,10 +1,10 @@ import type { Config } from 'drizzle-kit' export default { - out: './drizzle', - schema: './src/backend/models/index.ts', - dialect: 'sqlite', - dbCredentials: { - url: '.runtime/data.db', - }, + out: './drizzle', + schema: './src/backend/models/index.ts', + dialect: 'sqlite', + dbCredentials: { + url: '.runtime/data.db', + }, } satisfies Config diff --git a/eslint.config.js b/eslint.config.js index e0a4af8..d3da9e8 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,32 +1,26 @@ import antfu from '@antfu/eslint-config' export default antfu({ - stylistic: { - indent: 4, - }, - typescript: true, - astro: true, - solid: true, - yaml: false, - rules: { - 'curly': ['error', 'multi-line'], - 'style/brace-style': ['error', '1tbs', { allowSingleLine: true }], - 'n/prefer-global/buffer': 'off', - 'style/quotes': ['error', 'single', { avoidEscape: true }], - 'test/consistent-test-it': 'off', - 'test/prefer-lowercase-title': 'off', - 'import/order': ['error', { - 'newlines-between': 'always', - 'pathGroups': [ - { - pattern: '~/**', - group: 'parent', - }, - ], - }], - 'antfu/if-newline': 'off', - 'style/max-statements-per-line': ['error', { max: 2 }], - 'ts/no-redeclare': 'off', - 'node/prefer-global/process': 'off', - }, + ignores: [ + 'public', + 'drizzle', + ], + typescript: true, + astro: true, + solid: true, + yaml: false, + unocss: true, + rules: { + 'antfu/no-top-level-await': 'off', + 'curly': ['error', 'multi-line'], + 'style/brace-style': ['error', '1tbs', { allowSingleLine: true }], + 'n/prefer-global/buffer': 'off', + 'style/quotes': ['error', 'single', { avoidEscape: true }], + 'test/consistent-test-it': 'off', + 'test/prefer-lowercase-title': 'off', + 'antfu/if-newline': 'off', + 'style/max-statements-per-line': ['error', { max: 2 }], + 'ts/no-redeclare': 'off', + 'node/prefer-global/process': 'off', + }, }) diff --git a/package.json b/package.json index d097033..9e6847d 100644 --- a/package.json +++ b/package.json @@ -1,49 +1,52 @@ { - "name": "tei.su", - "type": "module", - "version": "0.0.1", - "packageManager": "pnpm@9.5.0+sha512.140036830124618d624a2187b50d04289d5a087f326c9edfc0ccd733d76c4f52c3a313d4fc148794a2a9d81553016004e6742e8cf850670268a7387fc220c903", - "scripts": { - "dev": "astro dev", - "start": "astro dev", - "build": "astro check && astro build", - "preview": "astro preview", - "start:prod": "drizzle-kit migrate && node dist/server/entry.mjs", - "astro": "astro" - }, - "dependencies": { - "@astrojs/check": "^0.9.4", - "@astrojs/node": "^9.0.2", - "@astrojs/solid-js": "^5.0.4", - "@fuman/fetch": "0.0.10", - "@fuman/utils": "0.0.10", - "@mtcute/dispatcher": "^0.17.0", - "@mtcute/node": "^0.17.0", - "@tanstack/solid-query": "^5.51.21", - "astro": "^5.1.9", - "astro-loading-indicator": "^0.5.0", - "better-sqlite3": "^11.1.2", - "clsx": "^2.1.1", - "date-fns": "^3.6.0", - "dotenv": "^16.4.5", - "drizzle-kit": "^0.23.1", - "drizzle-orm": "^0.32.1", - "parse-duration": "^1.1.0", - "rate-limiter-flexible": "^5.0.3", - "solid-js": "^1.8.19", - "typescript": "^5.7.3", - "zod": "^3.23.8", - "zod-validation-error": "^3.3.1" - }, - "devDependencies": { - "@antfu/eslint-config": "^2.24.0", - "@types/better-sqlite3": "^7.6.11", - "@types/node": "^22.0.2", - "eslint-plugin-astro": "^1.2.3", - "eslint-plugin-solid": "0.14", - "postcss-custom-media": "^10.0.8", - "postcss-import": "^16.1.0", - "postcss-mixins": "^10.0.1", - "postcss-nesting": "^12.1.5" - } + "name": "tei.su", + "type": "module", + "version": "0.0.1", + "packageManager": "pnpm@9.5.0+sha512.140036830124618d624a2187b50d04289d5a087f326c9edfc0ccd733d76c4f52c3a313d4fc148794a2a9d81553016004e6742e8cf850670268a7387fc220c903", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro check && astro build", + "preview": "astro preview", + "start:prod": "drizzle-kit migrate && node dist/server/entry.mjs", + "astro": "astro" + }, + "dependencies": { + "@astrojs/check": "^0.9.4", + "@astrojs/node": "^9.0.2", + "@astrojs/solid-js": "^5.0.4", + "@fuman/fetch": "0.0.10", + "@fuman/utils": "0.0.10", + "@iconify-json/gravity-ui": "^1.2.4", + "@mtcute/dispatcher": "^0.17.0", + "@mtcute/node": "^0.17.0", + "@tanstack/solid-query": "^5.51.21", + "@unocss/postcss": "^65.4.3", + "@unocss/reset": "^65.4.3", + "astro": "^5.1.9", + "astro-loading-indicator": "0.7.0", + "better-sqlite3": "^11.1.2", + "clsx": "^2.1.1", + "date-fns": "^3.6.0", + "dotenv": "^16.4.5", + "drizzle-kit": "^0.23.1", + "drizzle-orm": "^0.32.1", + "parse-duration": "^1.1.0", + "rate-limiter-flexible": "^5.0.3", + "solid-js": "^1.8.19", + "tailwind-merge": "^2.6.0", + "typescript": "^5.7.3", + "unocss": "^65.4.3", + "zod": "^3.23.8", + "zod-validation-error": "^3.3.1" + }, + "devDependencies": { + "@antfu/eslint-config": "3.16.0", + "@types/better-sqlite3": "^7.6.11", + "@types/node": "^22.0.2", + "@unocss/eslint-plugin": "^65.4.3", + "eslint": "9.19.0", + "eslint-plugin-astro": "^1.2.3", + "eslint-plugin-solid": "0.14.5" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f32eb1..e04aa18 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,16 +13,19 @@ importers: version: 0.9.4(typescript@5.7.3) '@astrojs/node': specifier: ^9.0.2 - version: 9.0.2(astro@5.1.9(@types/node@22.0.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(typescript@5.7.3)(yaml@2.5.0)) + version: 9.0.2(astro@5.1.9(@types/node@22.0.2)(jiti@2.4.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(typescript@5.7.3)(yaml@2.5.0)) '@astrojs/solid-js': specifier: ^5.0.4 - version: 5.0.4(@types/node@22.0.2)(solid-js@1.8.19)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0) + version: 5.0.4(@types/node@22.0.2)(jiti@2.4.2)(solid-js@1.8.19)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0) '@fuman/fetch': specifier: 0.0.10 version: 0.0.10(zod@3.23.8) '@fuman/utils': specifier: 0.0.10 version: 0.0.10 + '@iconify-json/gravity-ui': + specifier: ^1.2.4 + version: 1.2.4 '@mtcute/dispatcher': specifier: ^0.17.0 version: 0.17.2 @@ -32,12 +35,18 @@ importers: '@tanstack/solid-query': specifier: ^5.51.21 version: 5.51.21(solid-js@1.8.19) + '@unocss/postcss': + specifier: ^65.4.3 + version: 65.4.3(postcss@8.5.1) + '@unocss/reset': + specifier: ^65.4.3 + version: 65.4.3 astro: specifier: ^5.1.9 - version: 5.1.9(@types/node@22.0.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(typescript@5.7.3)(yaml@2.5.0) + version: 5.1.9(@types/node@22.0.2)(jiti@2.4.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(typescript@5.7.3)(yaml@2.5.0) astro-loading-indicator: - specifier: ^0.5.0 - version: 0.5.0(astro@5.1.9(@types/node@22.0.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(typescript@5.7.3)(yaml@2.5.0)) + specifier: 0.7.0 + version: 0.7.0(astro@5.1.9(@types/node@22.0.2)(jiti@2.4.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(typescript@5.7.3)(yaml@2.5.0)) better-sqlite3: specifier: ^11.1.2 version: 11.1.2 @@ -65,9 +74,15 @@ importers: solid-js: specifier: ^1.8.19 version: 1.8.19 + tailwind-merge: + specifier: ^2.6.0 + version: 2.6.0 typescript: specifier: ^5.7.3 version: 5.7.3 + unocss: + specifier: ^65.4.3 + version: 65.4.3(postcss@8.5.1)(rollup@4.32.0)(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0))(vue@3.5.13(typescript@5.7.3)) zod: specifier: ^3.23.8 version: 3.23.8 @@ -76,32 +91,26 @@ importers: version: 3.3.1(zod@3.23.8) devDependencies: '@antfu/eslint-config': - specifier: ^2.24.0 - version: 2.24.0(@vue/compiler-sfc@3.4.35)(astro-eslint-parser@1.0.2(typescript@5.7.3))(eslint-plugin-astro@1.2.3(eslint@9.8.0)(typescript@5.7.3))(eslint-plugin-solid@0.14.1(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3) + specifier: 3.16.0 + version: 3.16.0(@typescript-eslint/utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(@unocss/eslint-plugin@65.4.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(@vue/compiler-sfc@3.5.13)(astro-eslint-parser@1.0.2(typescript@5.7.3))(eslint-plugin-astro@1.2.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint-plugin-solid@0.14.5(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) '@types/better-sqlite3': specifier: ^7.6.11 version: 7.6.11 '@types/node': specifier: ^22.0.2 version: 22.0.2 + '@unocss/eslint-plugin': + specifier: ^65.4.3 + version: 65.4.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + eslint: + specifier: 9.19.0 + version: 9.19.0(jiti@2.4.2) eslint-plugin-astro: specifier: ^1.2.3 - version: 1.2.3(eslint@9.8.0)(typescript@5.7.3) + version: 1.2.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) eslint-plugin-solid: - specifier: '0.14' - version: 0.14.1(eslint@9.8.0)(typescript@5.7.3) - postcss-custom-media: - specifier: ^10.0.8 - version: 10.0.8(postcss@8.5.1) - postcss-import: - specifier: ^16.1.0 - version: 16.1.0(postcss@8.5.1) - postcss-mixins: - specifier: ^10.0.1 - version: 10.0.1(postcss@8.5.1) - postcss-nesting: - specifier: ^12.1.5 - version: 12.1.5(postcss@8.5.1) + specifier: 0.14.5 + version: 0.14.5(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) packages: @@ -109,22 +118,22 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/eslint-config@2.24.0': - resolution: {integrity: sha512-F5wG5lP+f16aeQMVn1l5Wetd8973NsyaWirc9s3YCoe7LTBMpkxnduzTT/wP4L5OlLNLDTRQbH9GUMedTixcsA==} + '@antfu/eslint-config@3.16.0': + resolution: {integrity: sha512-g6RAXUMeow9vexoOMYwCpByY2xSDpAD78q+rvQLvVpY6MFcxFD/zmdrZGYa/yt7LizK86m17kIYKOGLJ3L8P0w==} hasBin: true peerDependencies: - '@eslint-react/eslint-plugin': ^1.5.8 + '@eslint-react/eslint-plugin': ^1.19.0 '@prettier/plugin-xml': ^3.4.1 '@unocss/eslint-plugin': '>=0.50.0' astro-eslint-parser: ^1.0.2 - eslint: '>=8.40.0' + eslint: ^9.10.0 eslint-plugin-astro: ^1.2.0 eslint-plugin-format: '>=0.1.0' - eslint-plugin-react-hooks: ^4.6.0 + eslint-plugin-react-hooks: ^5.0.0 eslint-plugin-react-refresh: ^0.4.4 - eslint-plugin-solid: ^0.13.2 + eslint-plugin-solid: ^0.14.3 eslint-plugin-svelte: '>=2.35.1' - prettier-plugin-astro: ^0.13.0 + prettier-plugin-astro: ^0.14.0 prettier-plugin-slidev: ^1.0.5 svelte-eslint-parser: '>=0.37.0' peerDependenciesMeta: @@ -155,12 +164,18 @@ packages: svelte-eslint-parser: optional: true - '@antfu/install-pkg@0.3.3': - resolution: {integrity: sha512-nHHsk3NXQ6xkCfiRRC8Nfrg8pU5kkr3P3Y9s9dKqiuRmBD0Yap7fymNDjGFKeWhZQHqqbCS5CfeMy9wtExM24w==} + '@antfu/install-pkg@0.4.1': + resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} + + '@antfu/install-pkg@1.0.0': + resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} '@antfu/utils@0.7.10': resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@antfu/utils@8.1.0': + resolution: {integrity: sha512-XPR7Jfwp0FFl/dFYPX8ZjpmU4/1mIXTjnZ1ba48BLMyKOV62/tiRjdsFcPs2hsYcSud4tzk7w3a3LjX8Fu3huA==} + '@astrojs/check@0.9.4': resolution: {integrity: sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==} hasBin: true @@ -319,49 +334,11 @@ packages: resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} engines: {node: '>=6.9.0'} - '@clack/core@0.3.4': - resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} + '@clack/core@0.4.1': + resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} - '@clack/prompts@0.7.0': - resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} - bundledDependencies: - - is-unicode-supported - - '@csstools/cascade-layer-name-parser@1.0.13': - resolution: {integrity: sha512-MX0yLTwtZzr82sQ0zOjqimpZbzjMaK/h2pmlrLK7DCzlmiZLYFpoO94WmN1akRVo6ll/TdpHb53vihHLUMyvng==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - '@csstools/css-parser-algorithms': ^2.7.1 - '@csstools/css-tokenizer': ^2.4.1 - - '@csstools/css-parser-algorithms@2.7.1': - resolution: {integrity: sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - '@csstools/css-tokenizer': ^2.4.1 - - '@csstools/css-tokenizer@2.4.1': - resolution: {integrity: sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==} - engines: {node: ^14 || ^16 || >=18} - - '@csstools/media-query-list-parser@2.1.13': - resolution: {integrity: sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - '@csstools/css-parser-algorithms': ^2.7.1 - '@csstools/css-tokenizer': ^2.4.1 - - '@csstools/selector-resolve-nested@1.1.0': - resolution: {integrity: sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss-selector-parser: ^6.0.13 - - '@csstools/selector-specificity@3.1.1': - resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss-selector-parser: ^6.0.13 + '@clack/prompts@0.9.1': + resolution: {integrity: sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==} '@drizzle-team/brocli@0.8.2': resolution: {integrity: sha512-zTrFENsqGvOkBOuHDC1pXCkDXNd2UhP4lI3gYGhQ1R1SPeAAfqzPsV1dcpMy4uNU6kB5VpU5NGhvwxVNETR02A==} @@ -390,13 +367,13 @@ packages: '@emnapi/runtime@1.2.0': resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} - '@es-joy/jsdoccomment@0.43.1': - resolution: {integrity: sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==} + '@es-joy/jsdoccomment@0.49.0': + resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==} engines: {node: '>=16'} - '@es-joy/jsdoccomment@0.46.0': - resolution: {integrity: sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==} - engines: {node: '>=16'} + '@es-joy/jsdoccomment@0.50.0': + resolution: {integrity: sha512-+zZymuVLH6zVwXPtCAtC+bDymxmEwEqDftdAK+f407IF1bnX49anIxvBhCA1AqUIfD6egj1jM1vUnSuijjNyYg==} + engines: {node: '>=18'} '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} @@ -410,6 +387,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} @@ -428,6 +411,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} @@ -446,6 +435,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.24.2': resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} @@ -464,6 +459,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.24.2': resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} @@ -482,6 +483,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} @@ -500,6 +507,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.24.2': resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} @@ -518,6 +531,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} @@ -536,6 +555,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.24.2': resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} @@ -554,6 +579,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} @@ -572,6 +603,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.24.2': resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} @@ -590,6 +627,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.24.2': resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} @@ -608,6 +651,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.24.2': resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} @@ -626,6 +675,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.24.2': resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} @@ -644,6 +699,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.24.2': resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} @@ -662,6 +723,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.24.2': resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} @@ -680,6 +747,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.24.2': resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} @@ -698,6 +771,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.24.2': resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} @@ -722,12 +801,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.24.2': resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.24.2': resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} @@ -746,6 +837,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.24.2': resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} @@ -764,6 +861,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} @@ -782,6 +885,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} @@ -800,6 +909,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.24.2': resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} @@ -818,36 +933,79 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.24.2': resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@eslint-community/eslint-plugin-eslint-comments@4.4.1': + resolution: {integrity: sha512-lb/Z/MzbTf7CaVYM9WCFNQZ4L1yi3ev2fsFPF99h31ljhSEyUoyEsKsNWiU+qD1glbYTDJdqgyaLKtyTkkqtuQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.11.0': resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.17.1': - resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@1.2.5': + resolution: {integrity: sha512-5iuG/StT+7OfvhoBHPlmxkPA9om6aDUFgmD4+mWKAGsYt4vCe8rypneG03AuseyRHBmcCLXQtIH5S26tIoggLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.19.1': + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.1.0': - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + '@eslint/core@0.10.0': + resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.8.0': - resolution: {integrity: sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==} + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + '@eslint/js@9.19.0': + resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/markdown@6.2.2': + resolution: {integrity: sha512-U0/KgzI9BVUuHDQ9M2fuVgB0QZ1fSyzwm8jKmHr1dlsLHGHYzoeIA9yqLMdTbV3ivZfp6rTdt6zqre3TfNExUQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.5': + resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fuman/fetch@0.0.10': @@ -873,6 +1031,14 @@ packages: '@fuman/utils@0.0.10': resolution: {integrity: sha512-KVlDx0S1Og7IWcPi93f1T45WPfCSUV6/A4dQb36zZRtb8KECl1BK2u9WkNVI+sjrjKCb3xijjY5gq4lS3PqH5g==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -881,6 +1047,19 @@ packages: resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} engines: {node: '>=18.18'} + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + + '@iconify-json/gravity-ui@1.2.4': + resolution: {integrity: sha512-8o8L0exFRA7a6U585bkYzxjAsMhx7WeUE2DsF/tkomqJLbcBZOlryLH6Sizk5xKRKLc8RMTj1LTfKQRKc7Jmew==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.2.1': + resolution: {integrity: sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==} + '@img/sharp-darwin-arm64@0.33.4': resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} @@ -1012,10 +1191,6 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@jsdevtools/ez-spawn@3.0.4': - resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} - engines: {node: '>=10'} - '@mtcute/core@0.17.1': resolution: {integrity: sha512-ejWWnjvmI6jKUxXdu7C82DQrHBeKqLbfL79oXzhXN4+9gpqwNCwpeuP7EFYCEbP/1tpAxzZblp7vU8qpLmqrHA==} @@ -1062,6 +1237,9 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@rollup/pluginutils@5.1.4': resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} engines: {node: '>=14.0.0'} @@ -1187,31 +1365,8 @@ packages: '@shikijs/vscode-textmate@10.0.1': resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} - '@stylistic/eslint-plugin-js@2.6.0': - resolution: {integrity: sha512-6oN0Djdy8gTRhx2qS1m4P+CeDKqmZZwc4ibgzzJS+8iBW3Ts1c2mAvi+OH6TN4bt0AHm0FnDv2+KtTqqueMATw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - - '@stylistic/eslint-plugin-jsx@2.6.0': - resolution: {integrity: sha512-Hm7YODwBwAsYtacY9hR5ONiBS7K9og4YZFjBr8mfqsmlCYVFje1HsOKG+tylePkwcu0Qhi+lY86cP3rlV4PhAA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - - '@stylistic/eslint-plugin-plus@2.6.0': - resolution: {integrity: sha512-9GfLF08zx/pNFpQQlNMz6f4IixoS8zdSBFdJLWLTorMilNUjd4dDuA5ej4Z32+mTZf4u6lduzQcUrAYiGKTLTg==} - peerDependencies: - eslint: '*' - - '@stylistic/eslint-plugin-ts@2.6.0': - resolution: {integrity: sha512-9ooVm+BRNqdyI/p10eKGAdbdLKU5lllc7mX4Xqp76hKDsh5cCxmZM6zMgK3CLKkYrW0RUunFORkg8dAnmc1qIA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - - '@stylistic/eslint-plugin@2.6.0': - resolution: {integrity: sha512-BYzdgwz/4WgDTGmkPMKXFLRBKnYNVnmgD4NDsDCGJulqLFLF6sW1gr6gAJSFnkxwsdhEg+GApF4m5e3OMDpd6g==} + '@stylistic/eslint-plugin@2.13.0': + resolution: {integrity: sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' @@ -1245,11 +1400,11 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/eslint@8.56.11': - resolution: {integrity: sha512-sVBpJMf7UPo/wGecYOpk2aQya2VUGeHhe38WG7/mN5FufNSubf5VT9Uh9Uyp8/eLJpu1/tuhJ/qTo4mhSB4V4Q==} + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} - '@types/eslint@9.6.0': - resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -1266,9 +1421,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1284,64 +1436,45 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/unist@2.0.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - '@types/unist@3.0.2': resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - '@typescript-eslint/eslint-plugin@8.0.0-alpha.40': - resolution: {integrity: sha512-yku4NjpP0UujYq8d1GWXYELpKYwuoESSgvXPd9uAiO24OszGxQhPsGWTe4fmZV05J47qILfaGANO9SCa9fEU0w==} + '@typescript-eslint/eslint-plugin@8.21.0': + resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.0.0-alpha.40': - resolution: {integrity: sha512-cjIgiaxmGtjlA6rRSs0Gsh0mWR08kPv1W+HsrZcuFwWxoGavBZPKtNctXND0NVf6MgSKyIcd4AHqBwE0htp5uw==} + '@typescript-eslint/parser@8.21.0': + resolution: {integrity: sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/scope-manager@7.18.0': resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.0.0': - resolution: {integrity: sha512-V0aa9Csx/ZWWv2IPgTfY7T4agYwJyILESu/PVqFtTFz9RIS823mAze+NbnBI8xiwdX3iqeQbcTYlvB04G9wyQw==} + '@typescript-eslint/scope-manager@8.21.0': + resolution: {integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.0.0-alpha.40': - resolution: {integrity: sha512-KQL502sCGZW+dYvxIzF6rEozbgppN0mBkYV6kT8ciY5OtFIRlLDTP7NdVAMMDk7q35T7Ad8negaQ9AGpZ8+Y5w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/type-utils@8.0.0-alpha.40': - resolution: {integrity: sha512-/Aynkgxy3x22i6Zxy73MR/r0y1OELOMC9Atn7MO97NsjBOrQQYJHi/UEklZ423aB8SCkYH34lO6EAzXX/lIN3g==} + '@typescript-eslint/type-utils@8.21.0': + resolution: {integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/types@7.18.0': resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.0.0': - resolution: {integrity: sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.0.0-alpha.40': - resolution: {integrity: sha512-44mUq4VZVydxNlOM8Xtp/BXDkyfuvvjgPIBf7vRQDutrLDeNS0pJ9pcSloSbop5MwKLfJjBU+PbwnJPQM+DWNg==} + '@typescript-eslint/types@8.21.0': + resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@7.18.0': @@ -1353,57 +1486,127 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.0.0': - resolution: {integrity: sha512-5b97WpKMX+Y43YKi4zVcCVLtK5F98dFls3Oxui8LbnmRsseKenbbDinmvxrWegKDMmlkIq/XHuyy0UGLtpCDKg==} + '@typescript-eslint/typescript-estree@8.21.0': + resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/typescript-estree@8.0.0-alpha.40': - resolution: {integrity: sha512-bz1rX5GXvGdx686FghDxPqGwgntlseZCQSRrVGDDOZlLSoWJnbfkzxXGOWch9c3ttcGkdFy/DiCyKKga3hrq0g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/utils@8.0.0': - resolution: {integrity: sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - - '@typescript-eslint/utils@8.0.0-alpha.40': - resolution: {integrity: sha512-ijxO1Hs3YWveuWK+Vbt25D05Q41UeK08JwEJbWTzV38LmkdCBktQd7X1sTw4W9Qku692HWuHgesZf6OhC8t3aA==} + '@typescript-eslint/utils@8.21.0': + resolution: {integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/visitor-keys@7.18.0': resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.0.0': - resolution: {integrity: sha512-oN0K4nkHuOyF3PVMyETbpP5zp6wfyOvm7tWhTMfoqxSSsPmJIh6JNASuZDlODE8eE+0EB9uar+6+vxr9DBTYOA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.0.0-alpha.40': - resolution: {integrity: sha512-y1stojSPb5D3M8VlGGpaiBU5XxGLe+sPuW0YbLe09Lxvo4AwKGvhAr5lhqJZo4z6qHNz385+6+BS63+qIQdYLw==} + '@typescript-eslint/visitor-keys@8.21.0': + resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@unocss/astro@65.4.3': + resolution: {integrity: sha512-yhPKH4CT2CFjvKR8lL6oS/7jarMWp4iSnYcNlTlZLmvTIS3dGxyhAsVy/xkdzdJ6sM+6FS0hUuQNv+NYvArRNg==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 + peerDependenciesMeta: + vite: + optional: true + + '@unocss/cli@65.4.3': + resolution: {integrity: sha512-pZESqf5tS5AjATkAP11M0ecIiias0//nir7MgUQLs/v2GX0x7K0KhVTJ50TiFePff0TnwTHheDNJGR3gesDiVg==} + engines: {node: '>=14'} + hasBin: true + + '@unocss/config@65.4.3': + resolution: {integrity: sha512-Z3tnQ10UjM09Y1yVqfCYfZEh2pXFQlUQ1g188mMWxjXWEIXeei3f9dIApRBgC+xcPE6prqdu3fDC5emU+sqyxw==} + engines: {node: '>=14'} + + '@unocss/core@65.4.3': + resolution: {integrity: sha512-luFgdcchSlNrYSaDvU2176T2PPQZdxqfREVbxEXNXlFEgyEFrx5hOSUXoJtJSZjRhAcE6zkWyLDf/JkQJ5Eeyw==} + + '@unocss/eslint-plugin@65.4.3': + resolution: {integrity: sha512-uK6WpZPy/zJxunw4lh51KjIO370SRAIFlvg/Knh4Kl5214xiJDezKp7F7NATVBx+JqSf7iHYn2qUdB8Z8I7sXg==} + engines: {node: '>=14'} + + '@unocss/extractor-arbitrary-variants@65.4.3': + resolution: {integrity: sha512-RhSOOzOxkNjJl9zeglaBe0U+o39jleCCNPWJ87DDJA3ckbyylIIf21ZwY1Xu76rmdar5DT9ob7ucuPfEpJLN9A==} + + '@unocss/inspector@65.4.3': + resolution: {integrity: sha512-mj3K0WtnP0DuonQPzxkXhLMBU5qi13dpxaJcEOSv+EBMPlJbww0bj7K7uaFqXv8LPufs/hkQzI9yjOrEzR5WBQ==} + + '@unocss/postcss@65.4.3': + resolution: {integrity: sha512-ZHlWfArfhhWBVhUeAETrtnD7nhqpfXv5muGrJCSDHmjgFJX8jtDa6rf52ICCFWEOe8p2dku7o27o26pGXYTYJg==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + + '@unocss/preset-attributify@65.4.3': + resolution: {integrity: sha512-kN8levkt+BwzzWKA6glthasuFt/Cplc70oxzAYd/gZcosxwDK5+MmxjGDG5aLLu2PA58tPHUZ+ltW/QG5BM+Xw==} + + '@unocss/preset-icons@65.4.3': + resolution: {integrity: sha512-g1WNamvYOIdD8YAOvZ5h4g3peel3rLTtKvB0wX4pVL5exsYsoyc0tmiGm57k+ZmnIucqSzxoUZ/vjHDLAViahw==} + + '@unocss/preset-mini@65.4.3': + resolution: {integrity: sha512-JajAF18DKJRXgd9usrAYTcHUtZy606mD396ZswDgw/mUSu529tuiT6LOD43aJMYHgPEw7wKYjiGFHkeBTHijuQ==} + + '@unocss/preset-tagify@65.4.3': + resolution: {integrity: sha512-8/MbMbgdvj1A87XNVVzD8gFVqywaSJAD3Bv8RwjcFn0rwlgZY0PdTBYo3M3FH25axb4znzXBmLZdEBVZOGUosg==} + + '@unocss/preset-typography@65.4.3': + resolution: {integrity: sha512-DEo7GECG0AQ8FkzH/x8QCEL5BR1D+GNoxHGmNxc7rFKghJONVyJ3jROA9mDmWNAva8JygN4Up+lzPZG3mNYezQ==} + + '@unocss/preset-uno@65.4.3': + resolution: {integrity: sha512-gxELOQwR3YbMLR+WjYz3m/Zb6VXa8O0Xln0rfS2TI7OXXoQ1twak5zwYPrOI5fJF8lJ5yyKUiXiOR8UEPBpoCQ==} + + '@unocss/preset-web-fonts@65.4.3': + resolution: {integrity: sha512-edkyohQ4+qjuOxIJf+NeQiEayB47A9eA2NhBLbcqZ0OfMpN8tRZPVW5cyB3b5Ef253NGMd4S8H/96vGTBpqOBA==} + + '@unocss/preset-wind@65.4.3': + resolution: {integrity: sha512-KM13xIARNeZ/ZKJr33fZ89l79wgI+1Oo8VPJzmckLjbH9IGOhcH2GON7wVIxQqqqM9IM3vALEqw2KNdM6ontWw==} + + '@unocss/reset@65.4.3': + resolution: {integrity: sha512-f9QnMtY1yPS1HEIkeKmSwUYcp4QS6zdo9ZcIFE9PDSLOcns3v+M1lTQg8mLChxJHVl73Cf6PofWVh5tmnxV53Q==} + + '@unocss/rule-utils@65.4.3': + resolution: {integrity: sha512-bzRRdb9mb82IvgOt3KiRyUh/njRfJC3hoV84lMyUPryT8YTEP/hl6kt2KQ2l1K3WDz7ZPQXVi2eqUbqc+AUpwg==} + engines: {node: '>=14'} + + '@unocss/transformer-attributify-jsx@65.4.3': + resolution: {integrity: sha512-GI0joW6+jG3sLMzqDxT/Nr0lGarHKsXQzpKQt1LfBGEDgNSQZtDZ1IGlkdZeErRFvWcDLWU0xm2LikLS4Az8kw==} + + '@unocss/transformer-compile-class@65.4.3': + resolution: {integrity: sha512-AzLeic0ESQ/yhLKfkSsQ72wQLkKEPsmX578+ZKcPSRh/HM5tfNz8RqffOHr6YOEKKTaZHN23OqbA511amRKC1w==} + + '@unocss/transformer-directives@65.4.3': + resolution: {integrity: sha512-e3zZYjXqHSWb6YrC09/FnCsndhZdRzmYhPubTzOjnvb5K0ihIiLvHx9c2TRPWvMspXs0wHKQsLW5fAs8oyimeQ==} + + '@unocss/transformer-variant-group@65.4.3': + resolution: {integrity: sha512-nZNgKLclhIjfuqCaZTmJwhWSByL7vnhb3l/ChRX4qtWOweRLro79r6MvfcqQNrweK5nCw4yibsXCrFUWq7Jj5w==} + + '@unocss/vite@65.4.3': + resolution: {integrity: sha512-YajF8Z2J/KvXdnC5BsGJjt3fm4D14vmYaHdlTyzi92Rkh/67JtaCz2OhElDoF6k4S4fm9B8uLRP10p+smRe9Fw==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 + + '@vitest/eslint-plugin@1.1.25': + resolution: {integrity: sha512-u8DpDnMbPcqBmJOB4PeEtn6q7vKmLVTLFMpzoxSAo0hjYdl4iYSHRleqwPQo0ywc7UV0S6RKIahYRQ3BnZdMVw==} + peerDependencies: + '@typescript-eslint/utils': '>= 8.0' + eslint: '>= 8.57.0' + typescript: '>= 5.0.0' + vitest: '*' + peerDependenciesMeta: + typescript: + optional: true + vitest: + optional: true + '@volar/kit@2.4.11': resolution: {integrity: sha512-ups5RKbMzMCr6RKafcCqDRnJhJDNWqo2vfekwOAj6psZ15v5TlcQFQAyokQJ3wZxVkzxrQM+TqTRDENfQEXpmA==} peerDependencies: @@ -1430,20 +1633,34 @@ packages: '@vscode/l10n@0.0.18': resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} - '@vue/compiler-core@3.4.35': - resolution: {integrity: sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg==} + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} - '@vue/compiler-dom@3.4.35': - resolution: {integrity: sha512-pWIZRL76/oE/VMhdv/ovZfmuooEni6JPG1BFe7oLk5DZRo/ImydXijoZl/4kh2406boRQ7lxTYzbZEEXEhj9NQ==} + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@vue/compiler-sfc@3.4.35': - resolution: {integrity: sha512-xacnRS/h/FCsjsMfxBkzjoNxyxEyKyZfBch/P4vkLRvYJwe5ChXmZZrj8Dsed/752H2Q3JE8kYu9Uyha9J6PgA==} + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} - '@vue/compiler-ssr@3.4.35': - resolution: {integrity: sha512-7iynB+0KB1AAJKk/biENTV5cRGHRdbdaD7Mx3nWcm1W8bVD6QmnH3B4AHhQQ1qZHhqFwzEzMwiytXm3PX1e60A==} + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} - '@vue/shared@3.4.35': - resolution: {integrity: sha512-hvuhBYYDe+b1G8KHxsQ0diDqDMA8D9laxWZhNAjE83VZb5UDaXl9Xnz7cGdDSyiHM90qqI/CyGMcpBpiDy6VVQ==} + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1518,10 +1735,10 @@ packages: resolution: {integrity: sha512-8hJaCuqxObShWl2wEsnASqh/DbQ2O+S66m0Q3ctJlzBPEQ4pfGwwama3FCjZO3GDLQsjvn1T0v93Vxyu/+5fGw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - astro-loading-indicator@0.5.0: - resolution: {integrity: sha512-NU06AzJEzvlzXLac8ODFgHjzTDyaF/GV+nQQ7Rq21rCeSifhmLQu219lJukIUS0ySs4ySO4PAwcaHGClOSEufA==} + astro-loading-indicator@0.7.0: + resolution: {integrity: sha512-oNSUYbHq8Aaol0zcVuBzGz+qrqKsviOvKl1xaaKo3DLkEef7HCzHQAgTgWv4lB1iYFWa5GaieQvlxBO4KjzKZg==} peerDependencies: - astro: ^4.0.0 + astro: ^4.0.0 || ^5.0.0 astro@5.1.9: resolution: {integrity: sha512-QB3MH7Ul3gEvmHXEfvPkGpTZyyB/TBKQbm0kTHpo0BTEB7BvaY+wrcWiGEJBVDpVdEAKY9fM3zrJ0c7hZSXVlw==} @@ -1598,6 +1815,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1608,17 +1830,20 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - call-me-maybe@1.0.2: - resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} @@ -1626,6 +1851,9 @@ packages: caniuse-lite@1.0.30001645: resolution: {integrity: sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==} + caniuse-lite@1.0.30001695: + resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1644,21 +1872,12 @@ packages: character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1670,10 +1889,6 @@ packages: chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - ci-info@4.1.0: resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} engines: {node: '>=8'} @@ -1714,6 +1929,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -1727,8 +1945,8 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} consola@3.4.0: resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} @@ -1744,16 +1962,20 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - core-js-compat@3.37.1: - resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} + core-js-compat@3.40.0: + resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} crossws@0.3.3: resolution: {integrity: sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw==} + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -1966,12 +2188,18 @@ packages: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} electron-to-chromium@1.5.4: resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + electron-to-chromium@1.5.88: + resolution: {integrity: sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==} + emmet@2.4.7: resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} @@ -2005,9 +2233,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} @@ -2026,6 +2251,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.24.2: resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} @@ -2035,6 +2265,10 @@ packages: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -2056,22 +2290,41 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-config-flat-gitignore@0.1.8: - resolution: {integrity: sha512-OEUbS2wzzYtUfshjOqzFo4Bl4lHykXUdM08TCnYNl7ki+niW4Q1R0j0FDFDr0vjVsI5ZFOz5LvluxOP+Ew+dYw==} + eslint-compat-utils@0.6.4: + resolution: {integrity: sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' - eslint-flat-config-utils@0.3.0: - resolution: {integrity: sha512-FaFQLUunAl6YK7aU/pT23DXYVWg/cEHbSfxwAxpCGT6Su8H9RfkmzKLh1G2bba46p6dTlQeA4VTiV5//0SeToQ==} + eslint-config-flat-gitignore@1.0.0: + resolution: {integrity: sha512-EWpSLrAP80IdcYK5sIhq/qAY0pmUdBnbzqzpE3QAn6H6wLBN26cMRoMNU9Di8upTzUSL6TXeYRxWhTYuz8+UQA==} + peerDependencies: + eslint: ^9.5.0 + + eslint-flat-config-utils@1.1.0: + resolution: {integrity: sha512-W49wz7yQJGRfg4QSV3nwdO/fYcWetiSKhLV5YykfQMcqnIATNpoS7EPdINhLB9P3fmdjNmFtOgZjiKnCndWAnw==} eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-merge-processors@0.1.0: - resolution: {integrity: sha512-IvRXXtEajLeyssvW4wJcZ2etxkR9mUf4zpNwgI+m/Uac9RfXHskuJefkHUcawVzePnd6xp24enp5jfgdHzjRdQ==} + eslint-json-compat-utils@0.2.1: + resolution: {integrity: sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg==} + engines: {node: '>=12'} + peerDependencies: + '@eslint/json': '*' + eslint: '*' + jsonc-eslint-parser: ^2.4.0 + peerDependenciesMeta: + '@eslint/json': + optional: true + + eslint-merge-processors@1.0.0: + resolution: {integrity: sha512-4GybyHmhXtT7/W8RAouQzNM0791sYasJCTYHIAYjuiJvbNFY0jMKkoESREhX+mjX37dxiN6v4EqhZ1nc0tJF7A==} peerDependencies: eslint: '*' - eslint-plugin-antfu@2.3.4: - resolution: {integrity: sha512-5RIjJpBK1tuNHuLyFyZ90/iW9s439dP1u2cxA4dH70djx9sKq1CqI+O6Q95aVjgFNTDtQzSC9uYdAD5uEEKciQ==} + eslint-plugin-antfu@2.7.0: + resolution: {integrity: sha512-gZM3jq3ouqaoHmUNszb1Zo2Ux7RckSvkGksjLWz9ipBYGSv1EwwBETN6AdiUXn+RpVHXTbEMPAPlXJazcA6+iA==} peerDependencies: eslint: '*' @@ -2081,8 +2334,8 @@ packages: peerDependencies: eslint: '>=8.57.0' - eslint-plugin-command@0.2.3: - resolution: {integrity: sha512-1bBYNfjZg60N2ZpLV5ATYSYyueIJ+zl5yKrTs0UFDdnyu07dNSZ7Xplnc+Wb6SXTdc1sIaoIrnuyhvztcltX6A==} + eslint-plugin-command@2.1.0: + resolution: {integrity: sha512-S3gvDSCRHLdRG7NYaevLvGA0g/txOju7NEB2di7SE80NtbCwsvpi/fft045YuTZpOzqCRUfuye39raldmpXXYQ==} peerDependencies: eslint: '*' @@ -2092,134 +2345,92 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-eslint-comments@3.2.0: - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} + eslint-plugin-import-x@4.6.1: + resolution: {integrity: sha512-wluSUifMIb7UfwWXqx7Yx0lE/SGCcGXECLx/9bCmbY2nneLwvAZ4vkd1IXDjPKFvdcdUgr1BaRnaRpx3k2+Pfw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=4.19.1' + eslint: ^8.57.0 || ^9.0.0 - eslint-plugin-import-x@3.1.0: - resolution: {integrity: sha512-/UbPA+bYY7nIxcjL3kpcDY3UNdoLHFhyBFzHox2M0ypcUoueTn6woZUUmzzi5et/dXChksasYYFeKE2wshOrhg==} - engines: {node: '>=16'} - peerDependencies: - eslint: ^8.56.0 || ^9.0.0-0 - - eslint-plugin-jsdoc@48.10.2: - resolution: {integrity: sha512-xTkf/MmEeVrTbezc6kDqCJmK9RcseIKo8X4oyoDCMvV4LY8dqrQi8kmfRrv9n0gNBkCclevaOh2Lkmu6Fs8SLg==} + eslint-plugin-jsdoc@50.6.3: + resolution: {integrity: sha512-NxbJyt1M5zffPcYZ8Nb53/8nnbIScmiLAMdoe0/FAszwb7lcSiX3iYBTsuF7RV84dZZJC8r3NghomrUXsmWvxQ==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-jsonc@2.16.0: - resolution: {integrity: sha512-Af/ZL5mgfb8FFNleH6KlO4/VdmDuTqmM+SPnWcdoWywTetv7kq+vQe99UyQb9XO3b0OWLVuTH7H0d/PXYCMdSg==} + eslint-plugin-jsonc@2.19.1: + resolution: {integrity: sha512-MmlAOaZK1+Lg7YoCZPGRjb88ZjT+ct/KTsvcsbZdBm+w8WMzGx+XEmexk0m40P1WV9G2rFV7X3klyRGRpFXEjA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' - eslint-plugin-markdown@5.1.0: - resolution: {integrity: sha512-SJeyKko1K6GwI0AN6xeCDToXDkfKZfXcexA6B+O2Wr2btUS9GrC+YgwSyVli5DJnctUHjFXcQ2cqTaAmVoLi2A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8' - - eslint-plugin-n@17.10.1: - resolution: {integrity: sha512-hm/q37W6efDptJXdwirsm6A257iY6ZNtpoSG0wEzFzjJ3AhL7OhEIhdSR2e4OdYfHO5EDeqlCfFrjf9q208IPw==} + eslint-plugin-n@17.15.1: + resolution: {integrity: sha512-KFw7x02hZZkBdbZEFQduRGH4VkIH4MW97ClsbAM4Y4E6KguBJWGfWG1P4HEIpZk2bkoWf0bojpnjNAhYQP8beA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' - eslint-plugin-no-only-tests@3.1.0: - resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} + eslint-plugin-no-only-tests@3.3.0: + resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} engines: {node: '>=5.0.0'} - eslint-plugin-perfectionist@3.0.0: - resolution: {integrity: sha512-B+leJTo1YjxiNIm8Yv0rCHp4eWh9RaJHO6T1ifxd26wg8NCbEiWSdqZVeYLWPCI+zS1dlf89WpOkUzG7cE4vtQ==} + eslint-plugin-perfectionist@4.7.0: + resolution: {integrity: sha512-e2ODzm2SsAztFWY3ZRJd1K702vyl8Sapacjc3JluOW294CfA3+jfjin+UxjcrK48EvlNIMOp+JJB9N54YR2LRw==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - astro-eslint-parser: ^1.0.2 eslint: '>=8.0.0' - svelte: '>=3.0.0' - svelte-eslint-parser: ^0.40.0 - vue-eslint-parser: '>=9.0.0' - peerDependenciesMeta: - astro-eslint-parser: - optional: true - svelte: - optional: true - svelte-eslint-parser: - optional: true - vue-eslint-parser: - optional: true - eslint-plugin-regexp@2.6.0: - resolution: {integrity: sha512-FCL851+kislsTEQEMioAlpDuK5+E5vs0hi1bF8cFlPlHcEjeRhuAzEsGikXRreE+0j4WhW2uO54MqTjXtYOi3A==} + eslint-plugin-regexp@2.7.0: + resolution: {integrity: sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==} engines: {node: ^18 || >=20} peerDependencies: eslint: '>=8.44.0' - eslint-plugin-solid@0.14.1: - resolution: {integrity: sha512-2bR21xTGhXufK5qqib0h8fQkoZbVm0Xmsgioj+D6ynLXvVq20Atf5F/qyu2WUVNukKJkpd6WsYW0JRWFo2yZvQ==} - engines: {node: '>=12.0.0'} + eslint-plugin-solid@0.14.5: + resolution: {integrity: sha512-nfuYK09ah5aJG/oEN6P1qziy1zLgW4PDWe75VNPi4CEFYk1x2AEqwFeQfEPR7gNn0F2jOeqKhx2E+5oNCOBYWQ==} + engines: {node: '>=18.0.0'} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + typescript: '>=4.8.4' - eslint-plugin-toml@0.11.1: - resolution: {integrity: sha512-Y1WuMSzfZpeMIrmlP1nUh3kT8p96mThIq4NnHrYUhg10IKQgGfBZjAWnrg9fBqguiX4iFps/x/3Hb5TxBisfdw==} + eslint-plugin-toml@0.12.0: + resolution: {integrity: sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' - eslint-plugin-unicorn@55.0.0: - resolution: {integrity: sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==} + eslint-plugin-unicorn@56.0.1: + resolution: {integrity: sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==} engines: {node: '>=18.18'} peerDependencies: eslint: '>=8.56.0' - eslint-plugin-unused-imports@4.0.1: - resolution: {integrity: sha512-rax76s05z64uQgG9YXsWFmXrgjkaK79AvfeAWiSxhPP6RVGxeRaj4+2u+wxxu/mDy2pmJoOy1QTOEALMia2xGQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-plugin-unused-imports@4.1.4: + resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} peerDependencies: - '@typescript-eslint/eslint-plugin': ^8.0.0-0 - eslint: ^9.0.0 + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^9.0.0 || ^8.0.0 peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true - eslint-plugin-vitest@0.5.4: - resolution: {integrity: sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==} - engines: {node: ^18.0.0 || >= 20.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': '*' - eslint: ^8.57.0 || ^9.0.0 - vitest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - vitest: - optional: true - - eslint-plugin-vue@9.27.0: - resolution: {integrity: sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==} + eslint-plugin-vue@9.32.0: + resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-yml@1.14.0: - resolution: {integrity: sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==} + eslint-plugin-yml@1.16.0: + resolution: {integrity: sha512-t4MNCetPjTn18/fUDlQ/wKkcYjnuLYKChBrZ0qUaNqRigVqChHWzTP8SrfFi5s4keX3vdlkWRSu8zHJMdKwxWQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' - eslint-processor-vue-blocks@0.1.2: - resolution: {integrity: sha512-PfpJ4uKHnqeL/fXUnzYkOax3aIenlwewXRX8jFinA1a2yCFnLgMuiH3xvCgvHHUlV2xJWQHbCTdiJWGwb3NqpQ==} + eslint-processor-vue-blocks@1.0.0: + resolution: {integrity: sha512-q+Wn9bCml65NwYtuINVCE5dUqZa/uVoY4jfc8qEDwWbcGqdRyfJJmAONNZsreA4Q9EJqjYGjk8Hk1QuwAktgkw==} peerDependencies: '@vue/compiler-sfc': ^3.3.0 eslint: ^8.50.0 || ^9.0.0 - eslint-rule-composer@0.3.0: - resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} - engines: {node: '>=4.0.0'} - eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2228,6 +2439,10 @@ packages: resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2236,15 +2451,28 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.8.0: - resolution: {integrity: sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.19.0: + resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true espree@10.1.0: resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2317,6 +2545,14 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -2381,6 +2617,9 @@ packages: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.7.6: resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} @@ -2410,6 +2649,10 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + engines: {node: '>=18'} + globals@15.8.0: resolution: {integrity: sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==} engines: {node: '>=18'} @@ -2424,6 +2667,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + h3@1.14.0: resolution: {integrity: sha512-ao22eiONdgelqcnknw0iD645qW0s9NnrJHr5OBz4WOMdBdycfSas1EQf1wXRsm+PcB2Yoj43pjBPwqIpJQTeWg==} @@ -2508,6 +2755,10 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -2515,6 +2766,9 @@ packages: import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + importx@0.5.1: + resolution: {integrity: sha512-YrRaigAec1sC2CdIJjf/hCH1Wp9Ii8Cq5ROw4k5nJ19FVl2FcJUHZ5gGIb1vs8+JNYIyOJpc2fcufS2330bxDw==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -2535,12 +2789,6 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -2559,9 +2807,6 @@ packages: resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} engines: {node: '>= 0.4'} - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2579,9 +2824,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - is-html@2.0.0: resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==} engines: {node: '>=8'} @@ -2595,10 +2837,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -2614,6 +2852,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2629,6 +2871,10 @@ packages: resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} engines: {node: '>=12.0.0'} + jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -2690,6 +2936,9 @@ packages: known-css-properties@0.30.0: resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2697,12 +2946,20 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + local-pkg@1.0.0: + resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} engines: {node: '>=14'} locate-path@5.0.0: @@ -2746,12 +3003,12 @@ packages: mdast-util-find-and-replace@3.0.1: resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} - mdast-util-from-markdown@2.0.1: resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + mdast-util-gfm-autolink-literal@2.0.0: resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} @@ -2779,12 +3036,12 @@ packages: mdast-util-to-markdown@2.1.0: resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} - mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + merge-anything@5.1.7: resolution: {integrity: sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==} engines: {node: '>=12.13'} @@ -2874,9 +3131,6 @@ packages: micromark-util-types@2.0.0: resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} - micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} @@ -2909,10 +3163,6 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2926,8 +3176,8 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mlly@1.7.1: - resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} @@ -2955,12 +3205,13 @@ packages: napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + natural-orderby@5.0.0: + resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} + engines: {node: '>=18'} + neotraverse@0.6.18: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} @@ -2978,6 +3229,9 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -3040,6 +3294,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-manager-detector@0.2.8: + resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3047,9 +3304,6 @@ packages: parse-duration@1.1.0: resolution: {integrity: sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==} - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - parse-gitignore@2.0.0: resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} engines: {node: '>=14'} @@ -3089,6 +3343,12 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.2: + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -3103,10 +3363,6 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -3115,56 +3371,17 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - pkg-types@1.1.3: - resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - postcss-custom-media@10.0.8: - resolution: {integrity: sha512-V1KgPcmvlGdxTel4/CyQtBJEFhMVpEmRGFrnVtgfGIHj5PJX9vO36eFBxKBeJn+aCDTed70cc+98Mz3J/uVdGQ==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - - postcss-import@16.1.0: - resolution: {integrity: sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==} - engines: {node: '>=18.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-mixins@10.0.1: - resolution: {integrity: sha512-5+cI9r8L5ChegVsLM9pXa53Ft03Mt9xAq+kvzqfrUHGPCArVGOfUvmQK2CLP3XWWP2dqxDLQI+lIcXG+GTqOBQ==} - engines: {node: ^18.0 || >= 20.0} - peerDependencies: - postcss: ^8.2.14 - - postcss-nesting@12.1.5: - resolution: {integrity: sha512-N1NgI1PDCiAGWPTYrwqm8wpjv0bgDmkYHH72pNsqTCv9CObxjxftdYu6AKtGN+pnJa7FQjMm3v4sp8QJbFsYdQ==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.4 - postcss-selector-parser@6.1.1: resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} engines: {node: '>=4'} - postcss-simple-vars@7.0.1: - resolution: {integrity: sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==} - engines: {node: '>=14.0'} - peerDependencies: - postcss: ^8.2.1 - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.40: resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} engines: {node: ^10 || ^12 || >=14} @@ -3226,9 +3443,6 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -3418,6 +3632,10 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -3479,10 +3697,6 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -3550,6 +3764,13 @@ packages: resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -3561,12 +3782,13 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -3583,6 +3805,10 @@ packages: resolution: {integrity: sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -3595,6 +3821,12 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-api-utils@2.0.0: + resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + tsconfck@3.1.4: resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==} engines: {node: ^18 || >=20} @@ -3608,6 +3840,11 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -3615,10 +3852,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -3652,6 +3885,9 @@ packages: ultrahtml@1.5.3: resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} + unconfig@0.6.1: + resolution: {integrity: sha512-cVU+/sPloZqOyJEAfNwnQSFCzFrZm85vcVkryH7lnlB/PiTycUkAjt5Ds79cfIshGOZ+M5v3PBDnKgpmlE5DtA==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -3679,9 +3915,6 @@ packages: unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -3694,6 +3927,18 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unocss@65.4.3: + resolution: {integrity: sha512-mwSVi0ovPxaDv58yFB7Vm5v1x/q/pUc7aTh7SJbeYoRrpbUGdKiVf20YSQfMqmBNXV9CFDr4o6tabP/58as6RQ==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 65.4.3 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + unstorage@1.14.4: resolution: {integrity: sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg==} peerDependencies: @@ -3759,6 +4004,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3953,6 +4204,19 @@ packages: peerDependencies: eslint: '>=6.0.0' + vue-flow-layout@0.1.1: + resolution: {integrity: sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==} + peerDependencies: + vue: ^3.4.37 + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -4076,61 +4340,71 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@antfu/eslint-config@2.24.0(@vue/compiler-sfc@3.4.35)(astro-eslint-parser@1.0.2(typescript@5.7.3))(eslint-plugin-astro@1.2.3(eslint@9.8.0)(typescript@5.7.3))(eslint-plugin-solid@0.14.1(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3)': + '@antfu/eslint-config@3.16.0(@typescript-eslint/utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(@unocss/eslint-plugin@65.4.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(@vue/compiler-sfc@3.5.13)(astro-eslint-parser@1.0.2(typescript@5.7.3))(eslint-plugin-astro@1.2.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint-plugin-solid@0.14.5(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@antfu/install-pkg': 0.3.3 - '@clack/prompts': 0.7.0 - '@stylistic/eslint-plugin': 2.6.0(eslint@9.8.0)(typescript@5.7.3) - '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3) - eslint: 9.8.0 - eslint-config-flat-gitignore: 0.1.8 - eslint-flat-config-utils: 0.3.0 - eslint-merge-processors: 0.1.0(eslint@9.8.0) - eslint-plugin-antfu: 2.3.4(eslint@9.8.0) - eslint-plugin-command: 0.2.3(eslint@9.8.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@9.8.0) - eslint-plugin-import-x: 3.1.0(eslint@9.8.0)(typescript@5.7.3) - eslint-plugin-jsdoc: 48.10.2(eslint@9.8.0) - eslint-plugin-jsonc: 2.16.0(eslint@9.8.0) - eslint-plugin-markdown: 5.1.0(eslint@9.8.0) - eslint-plugin-n: 17.10.1(eslint@9.8.0) - eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-perfectionist: 3.0.0(astro-eslint-parser@1.0.2(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3)(vue-eslint-parser@9.4.3(eslint@9.8.0)) - eslint-plugin-regexp: 2.6.0(eslint@9.8.0) - eslint-plugin-toml: 0.11.1(eslint@9.8.0) - eslint-plugin-unicorn: 55.0.0(eslint@9.8.0) - eslint-plugin-unused-imports: 4.0.1(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0) - eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3) - eslint-plugin-vue: 9.27.0(eslint@9.8.0) - eslint-plugin-yml: 1.14.0(eslint@9.8.0) - eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.35)(eslint@9.8.0) - globals: 15.8.0 + '@antfu/install-pkg': 1.0.0 + '@clack/prompts': 0.9.1 + '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.19.0(jiti@2.4.2)) + '@eslint/markdown': 6.2.2 + '@stylistic/eslint-plugin': 2.13.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@vitest/eslint-plugin': 1.1.25(@typescript-eslint/utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.19.0(jiti@2.4.2) + eslint-config-flat-gitignore: 1.0.0(eslint@9.19.0(jiti@2.4.2)) + eslint-flat-config-utils: 1.1.0 + eslint-merge-processors: 1.0.0(eslint@9.19.0(jiti@2.4.2)) + eslint-plugin-antfu: 2.7.0(eslint@9.19.0(jiti@2.4.2)) + eslint-plugin-command: 2.1.0(eslint@9.19.0(jiti@2.4.2)) + eslint-plugin-import-x: 4.6.1(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + eslint-plugin-jsdoc: 50.6.3(eslint@9.19.0(jiti@2.4.2)) + eslint-plugin-jsonc: 2.19.1(eslint@9.19.0(jiti@2.4.2)) + eslint-plugin-n: 17.15.1(eslint@9.19.0(jiti@2.4.2)) + eslint-plugin-no-only-tests: 3.3.0 + eslint-plugin-perfectionist: 4.7.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + eslint-plugin-regexp: 2.7.0(eslint@9.19.0(jiti@2.4.2)) + eslint-plugin-toml: 0.12.0(eslint@9.19.0(jiti@2.4.2)) + eslint-plugin-unicorn: 56.0.1(eslint@9.19.0(jiti@2.4.2)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2)) + eslint-plugin-vue: 9.32.0(eslint@9.19.0(jiti@2.4.2)) + eslint-plugin-yml: 1.16.0(eslint@9.19.0(jiti@2.4.2)) + eslint-processor-vue-blocks: 1.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.19.0(jiti@2.4.2)) + globals: 15.14.0 jsonc-eslint-parser: 2.4.0 - local-pkg: 0.5.0 + local-pkg: 1.0.0 parse-gitignore: 2.0.0 - picocolors: 1.0.1 + picocolors: 1.1.1 toml-eslint-parser: 0.10.0 - vue-eslint-parser: 9.4.3(eslint@9.8.0) + vue-eslint-parser: 9.4.3(eslint@9.19.0(jiti@2.4.2)) yaml-eslint-parser: 1.2.3 yargs: 17.7.2 optionalDependencies: + '@unocss/eslint-plugin': 65.4.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) astro-eslint-parser: 1.0.2(typescript@5.7.3) - eslint-plugin-astro: 1.2.3(eslint@9.8.0)(typescript@5.7.3) - eslint-plugin-solid: 0.14.1(eslint@9.8.0)(typescript@5.7.3) + eslint-plugin-astro: 1.2.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + eslint-plugin-solid: 0.14.5(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) transitivePeerDependencies: + - '@eslint/json' + - '@typescript-eslint/utils' - '@vue/compiler-sfc' - supports-color - - svelte - typescript - vitest - '@antfu/install-pkg@0.3.3': + '@antfu/install-pkg@0.4.1': dependencies: - '@jsdevtools/ez-spawn': 3.0.4 + package-manager-detector: 0.2.8 + tinyexec: 0.3.2 + + '@antfu/install-pkg@1.0.0': + dependencies: + package-manager-detector: 0.2.8 + tinyexec: 0.3.2 '@antfu/utils@0.7.10': {} + '@antfu/utils@8.1.0': {} + '@astrojs/check@0.9.4(typescript@5.7.3)': dependencies: '@astrojs/language-server': 2.15.4(typescript@5.7.3) @@ -4195,9 +4469,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/node@9.0.2(astro@5.1.9(@types/node@22.0.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(typescript@5.7.3)(yaml@2.5.0))': + '@astrojs/node@9.0.2(astro@5.1.9(@types/node@22.0.2)(jiti@2.4.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(typescript@5.7.3)(yaml@2.5.0))': dependencies: - astro: 5.1.9(@types/node@22.0.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(typescript@5.7.3)(yaml@2.5.0) + astro: 5.1.9(@types/node@22.0.2)(jiti@2.4.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(typescript@5.7.3)(yaml@2.5.0) send: 1.1.0 server-destroy: 1.0.1 transitivePeerDependencies: @@ -4207,11 +4481,11 @@ snapshots: dependencies: prismjs: 1.29.0 - '@astrojs/solid-js@5.0.4(@types/node@22.0.2)(solid-js@1.8.19)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0)': + '@astrojs/solid-js@5.0.4(@types/node@22.0.2)(jiti@2.4.2)(solid-js@1.8.19)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0)': dependencies: solid-js: 1.8.19 - vite: 6.0.11(@types/node@22.0.2)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0) - vite-plugin-solid: 2.11.0(solid-js@1.8.19)(vite@6.0.11(@types/node@22.0.2)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0)) + vite: 6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0) + vite-plugin-solid: 2.11.0(solid-js@1.8.19)(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0)) transitivePeerDependencies: - '@testing-library/jest-dom' - '@types/node' @@ -4379,41 +4653,17 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@clack/core@0.3.4': + '@clack/core@0.4.1': dependencies: - picocolors: 1.0.1 + picocolors: 1.1.1 sisteransi: 1.0.5 - '@clack/prompts@0.7.0': + '@clack/prompts@0.9.1': dependencies: - '@clack/core': 0.3.4 - picocolors: 1.0.1 + '@clack/core': 0.4.1 + picocolors: 1.1.1 sisteransi: 1.0.5 - '@csstools/cascade-layer-name-parser@1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': - dependencies: - '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) - '@csstools/css-tokenizer': 2.4.1 - - '@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1)': - dependencies: - '@csstools/css-tokenizer': 2.4.1 - - '@csstools/css-tokenizer@2.4.1': {} - - '@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': - dependencies: - '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) - '@csstools/css-tokenizer': 2.4.1 - - '@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.1.1)': - dependencies: - postcss-selector-parser: 6.1.1 - - '@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.1)': - dependencies: - postcss-selector-parser: 6.1.1 - '@drizzle-team/brocli@0.8.2': {} '@emmetio/abbreviation@2.3.3': @@ -4444,20 +4694,20 @@ snapshots: tslib: 2.6.3 optional: true - '@es-joy/jsdoccomment@0.43.1': + '@es-joy/jsdoccomment@0.49.0': dependencies: - '@types/eslint': 8.56.11 - '@types/estree': 1.0.5 - '@typescript-eslint/types': 7.18.0 comment-parser: 1.4.1 esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.0.0 + jsdoc-type-pratt-parser: 4.1.0 - '@es-joy/jsdoccomment@0.46.0': + '@es-joy/jsdoccomment@0.50.0': dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + '@typescript-eslint/types': 8.21.0 comment-parser: 1.4.1 esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.0.0 + jsdoc-type-pratt-parser: 4.1.0 '@esbuild-kit/core-utils@3.3.2': dependencies: @@ -4472,6 +4722,9 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true + '@esbuild/aix-ppc64@0.23.1': + optional: true + '@esbuild/aix-ppc64@0.24.2': optional: true @@ -4481,6 +4734,9 @@ snapshots: '@esbuild/android-arm64@0.19.12': optional: true + '@esbuild/android-arm64@0.23.1': + optional: true + '@esbuild/android-arm64@0.24.2': optional: true @@ -4490,6 +4746,9 @@ snapshots: '@esbuild/android-arm@0.19.12': optional: true + '@esbuild/android-arm@0.23.1': + optional: true + '@esbuild/android-arm@0.24.2': optional: true @@ -4499,6 +4758,9 @@ snapshots: '@esbuild/android-x64@0.19.12': optional: true + '@esbuild/android-x64@0.23.1': + optional: true + '@esbuild/android-x64@0.24.2': optional: true @@ -4508,6 +4770,9 @@ snapshots: '@esbuild/darwin-arm64@0.19.12': optional: true + '@esbuild/darwin-arm64@0.23.1': + optional: true + '@esbuild/darwin-arm64@0.24.2': optional: true @@ -4517,6 +4782,9 @@ snapshots: '@esbuild/darwin-x64@0.19.12': optional: true + '@esbuild/darwin-x64@0.23.1': + optional: true + '@esbuild/darwin-x64@0.24.2': optional: true @@ -4526,6 +4794,9 @@ snapshots: '@esbuild/freebsd-arm64@0.19.12': optional: true + '@esbuild/freebsd-arm64@0.23.1': + optional: true + '@esbuild/freebsd-arm64@0.24.2': optional: true @@ -4535,6 +4806,9 @@ snapshots: '@esbuild/freebsd-x64@0.19.12': optional: true + '@esbuild/freebsd-x64@0.23.1': + optional: true + '@esbuild/freebsd-x64@0.24.2': optional: true @@ -4544,6 +4818,9 @@ snapshots: '@esbuild/linux-arm64@0.19.12': optional: true + '@esbuild/linux-arm64@0.23.1': + optional: true + '@esbuild/linux-arm64@0.24.2': optional: true @@ -4553,6 +4830,9 @@ snapshots: '@esbuild/linux-arm@0.19.12': optional: true + '@esbuild/linux-arm@0.23.1': + optional: true + '@esbuild/linux-arm@0.24.2': optional: true @@ -4562,6 +4842,9 @@ snapshots: '@esbuild/linux-ia32@0.19.12': optional: true + '@esbuild/linux-ia32@0.23.1': + optional: true + '@esbuild/linux-ia32@0.24.2': optional: true @@ -4571,6 +4854,9 @@ snapshots: '@esbuild/linux-loong64@0.19.12': optional: true + '@esbuild/linux-loong64@0.23.1': + optional: true + '@esbuild/linux-loong64@0.24.2': optional: true @@ -4580,6 +4866,9 @@ snapshots: '@esbuild/linux-mips64el@0.19.12': optional: true + '@esbuild/linux-mips64el@0.23.1': + optional: true + '@esbuild/linux-mips64el@0.24.2': optional: true @@ -4589,6 +4878,9 @@ snapshots: '@esbuild/linux-ppc64@0.19.12': optional: true + '@esbuild/linux-ppc64@0.23.1': + optional: true + '@esbuild/linux-ppc64@0.24.2': optional: true @@ -4598,6 +4890,9 @@ snapshots: '@esbuild/linux-riscv64@0.19.12': optional: true + '@esbuild/linux-riscv64@0.23.1': + optional: true + '@esbuild/linux-riscv64@0.24.2': optional: true @@ -4607,6 +4902,9 @@ snapshots: '@esbuild/linux-s390x@0.19.12': optional: true + '@esbuild/linux-s390x@0.23.1': + optional: true + '@esbuild/linux-s390x@0.24.2': optional: true @@ -4616,6 +4914,9 @@ snapshots: '@esbuild/linux-x64@0.19.12': optional: true + '@esbuild/linux-x64@0.23.1': + optional: true + '@esbuild/linux-x64@0.24.2': optional: true @@ -4628,9 +4929,15 @@ snapshots: '@esbuild/netbsd-x64@0.19.12': optional: true + '@esbuild/netbsd-x64@0.23.1': + optional: true + '@esbuild/netbsd-x64@0.24.2': optional: true + '@esbuild/openbsd-arm64@0.23.1': + optional: true + '@esbuild/openbsd-arm64@0.24.2': optional: true @@ -4640,6 +4947,9 @@ snapshots: '@esbuild/openbsd-x64@0.19.12': optional: true + '@esbuild/openbsd-x64@0.23.1': + optional: true + '@esbuild/openbsd-x64@0.24.2': optional: true @@ -4649,6 +4959,9 @@ snapshots: '@esbuild/sunos-x64@0.19.12': optional: true + '@esbuild/sunos-x64@0.23.1': + optional: true + '@esbuild/sunos-x64@0.24.2': optional: true @@ -4658,6 +4971,9 @@ snapshots: '@esbuild/win32-arm64@0.19.12': optional: true + '@esbuild/win32-arm64@0.23.1': + optional: true + '@esbuild/win32-arm64@0.24.2': optional: true @@ -4667,6 +4983,9 @@ snapshots: '@esbuild/win32-ia32@0.19.12': optional: true + '@esbuild/win32-ia32@0.23.1': + optional: true + '@esbuild/win32-ia32@0.24.2': optional: true @@ -4676,31 +4995,55 @@ snapshots: '@esbuild/win32-x64@0.19.12': optional: true + '@esbuild/win32-x64@0.23.1': + optional: true + '@esbuild/win32-x64@0.24.2': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.8.0)': + '@eslint-community/eslint-plugin-eslint-comments@4.4.1(eslint@9.19.0(jiti@2.4.2))': dependencies: - eslint: 9.8.0 + escape-string-regexp: 4.0.0 + eslint: 9.19.0(jiti@2.4.2) + ignore: 5.3.1 + + '@eslint-community/eslint-utils@4.4.0(eslint@9.19.0(jiti@2.4.2))': + dependencies: + eslint: 9.19.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.4.1(eslint@9.19.0(jiti@2.4.2))': + dependencies: + eslint: 9.19.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.0': {} - '@eslint/config-array@0.17.1': + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/compat@1.2.5(eslint@9.19.0(jiti@2.4.2))': + optionalDependencies: + eslint: 9.19.0(jiti@2.4.2) + + '@eslint/config-array@0.19.1': dependencies: - '@eslint/object-schema': 2.1.4 + '@eslint/object-schema': 2.1.5 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/eslintrc@3.1.0': + '@eslint/core@0.10.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 debug: 4.4.0 - espree: 10.1.0 + espree: 10.3.0 globals: 14.0.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -4708,9 +5051,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.8.0': {} + '@eslint/js@9.19.0': {} - '@eslint/object-schema@2.1.4': {} + '@eslint/markdown@6.2.2': + dependencies: + '@eslint/core': 0.10.0 + '@eslint/plugin-kit': 0.2.5 + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@eslint/object-schema@2.1.5': {} + + '@eslint/plugin-kit@0.2.5': + dependencies: + '@eslint/core': 0.10.0 + levn: 0.4.1 '@fuman/fetch@0.0.10(zod@3.23.8)': dependencies: @@ -4720,10 +5078,38 @@ snapshots: '@fuman/utils@0.0.10': {} + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.0 + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.0': {} + '@humanwhocodes/retry@0.4.1': {} + + '@iconify-json/gravity-ui@1.2.4': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.2.1': + dependencies: + '@antfu/install-pkg': 0.4.1 + '@antfu/utils': 0.7.10 + '@iconify/types': 2.0.0 + debug: 4.4.0 + globals: 15.14.0 + kolorist: 1.8.0 + local-pkg: 0.5.1 + mlly: 1.7.4 + transitivePeerDependencies: + - supports-color + '@img/sharp-darwin-arm64@0.33.4': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.2 @@ -4816,13 +5202,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@jsdevtools/ez-spawn@3.0.4': - dependencies: - call-me-maybe: 1.0.2 - cross-spawn: 7.0.3 - string-argv: 0.3.2 - type-detect: 4.1.0 - '@mtcute/core@0.17.1': dependencies: '@mtcute/file-id': 0.17.0 @@ -4887,6 +5266,8 @@ snapshots: '@pkgr/core@0.1.1': {} + '@polka/url@1.0.0-next.28': {} + '@rollup/pluginutils@5.1.4(rollup@4.32.0)': dependencies: '@types/estree': 1.0.5 @@ -4987,49 +5368,14 @@ snapshots: '@shikijs/vscode-textmate@10.0.1': {} - '@stylistic/eslint-plugin-js@2.6.0(eslint@9.8.0)': + '@stylistic/eslint-plugin@2.13.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@types/eslint': 9.6.0 - acorn: 8.12.1 - eslint: 9.8.0 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 - - '@stylistic/eslint-plugin-jsx@2.6.0(eslint@9.8.0)': - dependencies: - '@stylistic/eslint-plugin-js': 2.6.0(eslint@9.8.0) - '@types/eslint': 9.6.0 - eslint: 9.8.0 + '@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.19.0(jiti@2.4.2) + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 estraverse: 5.3.0 picomatch: 4.0.2 - - '@stylistic/eslint-plugin-plus@2.6.0(eslint@9.8.0)(typescript@5.7.3)': - dependencies: - '@types/eslint': 9.6.0 - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.7.3) - eslint: 9.8.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@stylistic/eslint-plugin-ts@2.6.0(eslint@9.8.0)(typescript@5.7.3)': - dependencies: - '@stylistic/eslint-plugin-js': 2.6.0(eslint@9.8.0) - '@types/eslint': 9.6.0 - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.7.3) - eslint: 9.8.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@stylistic/eslint-plugin@2.6.0(eslint@9.8.0)(typescript@5.7.3)': - dependencies: - '@stylistic/eslint-plugin-js': 2.6.0(eslint@9.8.0) - '@stylistic/eslint-plugin-jsx': 2.6.0(eslint@9.8.0) - '@stylistic/eslint-plugin-plus': 2.6.0(eslint@9.8.0)(typescript@5.7.3) - '@stylistic/eslint-plugin-ts': 2.6.0(eslint@9.8.0)(typescript@5.7.3) - '@types/eslint': 9.6.0 - eslint: 9.8.0 transitivePeerDependencies: - supports-color - typescript @@ -5072,14 +5418,11 @@ snapshots: dependencies: '@types/ms': 0.7.34 - '@types/eslint@8.56.11': - dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 + '@types/doctrine@0.0.9': {} - '@types/eslint@9.6.0': + '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 '@types/estree@1.0.5': {} @@ -5094,10 +5437,6 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/mdast@3.0.15': - dependencies: - '@types/unist': 2.0.10 - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.2 @@ -5114,37 +5453,33 @@ snapshots: '@types/normalize-package-data@2.4.4': {} - '@types/unist@2.0.10': {} - '@types/unist@3.0.2': {} - '@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.0.0-alpha.40 - '@typescript-eslint/type-utils': 8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 - eslint: 9.8.0 + '@typescript-eslint/parser': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.21.0 + '@typescript-eslint/type-utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.21.0 + eslint: 9.19.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.7.3) - optionalDependencies: + ts-api-utils: 2.0.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.0.0-alpha.40 - '@typescript-eslint/types': 8.0.0-alpha.40 - '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 - debug: 4.3.6 - eslint: 9.8.0 - optionalDependencies: + '@typescript-eslint/scope-manager': 8.21.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.21.0 + debug: 4.4.0 + eslint: 9.19.0(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -5154,33 +5489,25 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.0.0': + '@typescript-eslint/scope-manager@8.21.0': dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/visitor-keys': 8.21.0 - '@typescript-eslint/scope-manager@8.0.0-alpha.40': + '@typescript-eslint/type-utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.0.0-alpha.40 - '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 - - '@typescript-eslint/type-utils@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.7.3) - '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3) - debug: 4.3.6 - ts-api-utils: 1.3.0(typescript@5.7.3) - optionalDependencies: + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + debug: 4.4.0 + eslint: 9.19.0(jiti@2.4.2) + ts-api-utils: 2.0.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - - eslint - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.0.0': {} - - '@typescript-eslint/types@8.0.0-alpha.40': {} + '@typescript-eslint/types@8.21.0': {} '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': dependencies: @@ -5197,86 +5524,215 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.0.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.21.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 - debug: 4.3.6 - globby: 11.1.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/visitor-keys': 8.21.0 + debug: 4.4.0 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.7.3) - optionalDependencies: + ts-api-utils: 2.0.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.0.0-alpha.40(typescript@5.7.3)': + '@typescript-eslint/utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.0.0-alpha.40 - '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 - debug: 4.3.6 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.7.3) - optionalDependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.19.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.21.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) + eslint: 9.19.0(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@9.8.0)(typescript@5.7.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) - eslint: 9.8.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@8.0.0(eslint@9.8.0)(typescript@5.7.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.7.3) - eslint: 9.8.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@typescript-eslint/scope-manager': 8.0.0-alpha.40 - '@typescript-eslint/types': 8.0.0-alpha.40 - '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.7.3) - eslint: 9.8.0 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/visitor-keys@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.0.0': + '@typescript-eslint/visitor-keys@8.21.0': dependencies: - '@typescript-eslint/types': 8.0.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@8.0.0-alpha.40': - dependencies: - '@typescript-eslint/types': 8.0.0-alpha.40 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.21.0 + eslint-visitor-keys: 4.2.0 '@ungap/structured-clone@1.2.0': {} + '@unocss/astro@65.4.3(rollup@4.32.0)(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0))(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@unocss/core': 65.4.3 + '@unocss/reset': 65.4.3 + '@unocss/vite': 65.4.3(rollup@4.32.0)(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0))(vue@3.5.13(typescript@5.7.3)) + optionalDependencies: + vite: 6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0) + transitivePeerDependencies: + - rollup + - supports-color + - vue + + '@unocss/cli@65.4.3(rollup@4.32.0)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.4(rollup@4.32.0) + '@unocss/config': 65.4.3 + '@unocss/core': 65.4.3 + '@unocss/preset-uno': 65.4.3 + cac: 6.7.14 + chokidar: 3.6.0 + colorette: 2.0.20 + consola: 3.4.0 + magic-string: 0.30.17 + pathe: 2.0.2 + perfect-debounce: 1.0.0 + tinyglobby: 0.2.10 + transitivePeerDependencies: + - rollup + - supports-color + + '@unocss/config@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + unconfig: 0.6.1 + transitivePeerDependencies: + - supports-color + + '@unocss/core@65.4.3': {} + + '@unocss/eslint-plugin@65.4.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@unocss/config': 65.4.3 + '@unocss/core': 65.4.3 + '@unocss/rule-utils': 65.4.3 + magic-string: 0.30.17 + synckit: 0.9.2 + transitivePeerDependencies: + - eslint + - supports-color + - typescript + + '@unocss/extractor-arbitrary-variants@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + + '@unocss/inspector@65.4.3(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@unocss/core': 65.4.3 + '@unocss/rule-utils': 65.4.3 + colorette: 2.0.20 + gzip-size: 6.0.0 + sirv: 3.0.0 + vue-flow-layout: 0.1.1(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - vue + + '@unocss/postcss@65.4.3(postcss@8.5.1)': + dependencies: + '@unocss/config': 65.4.3 + '@unocss/core': 65.4.3 + '@unocss/rule-utils': 65.4.3 + css-tree: 3.1.0 + postcss: 8.5.1 + tinyglobby: 0.2.10 + transitivePeerDependencies: + - supports-color + + '@unocss/preset-attributify@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + + '@unocss/preset-icons@65.4.3': + dependencies: + '@iconify/utils': 2.2.1 + '@unocss/core': 65.4.3 + ofetch: 1.4.1 + transitivePeerDependencies: + - supports-color + + '@unocss/preset-mini@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + '@unocss/extractor-arbitrary-variants': 65.4.3 + '@unocss/rule-utils': 65.4.3 + + '@unocss/preset-tagify@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + + '@unocss/preset-typography@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + '@unocss/preset-mini': 65.4.3 + + '@unocss/preset-uno@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + '@unocss/preset-mini': 65.4.3 + '@unocss/preset-wind': 65.4.3 + '@unocss/rule-utils': 65.4.3 + + '@unocss/preset-web-fonts@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + ofetch: 1.4.1 + + '@unocss/preset-wind@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + '@unocss/preset-mini': 65.4.3 + '@unocss/rule-utils': 65.4.3 + + '@unocss/reset@65.4.3': {} + + '@unocss/rule-utils@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + magic-string: 0.30.17 + + '@unocss/transformer-attributify-jsx@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + + '@unocss/transformer-compile-class@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + + '@unocss/transformer-directives@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + '@unocss/rule-utils': 65.4.3 + css-tree: 3.1.0 + + '@unocss/transformer-variant-group@65.4.3': + dependencies: + '@unocss/core': 65.4.3 + + '@unocss/vite@65.4.3(rollup@4.32.0)(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0))(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.4(rollup@4.32.0) + '@unocss/config': 65.4.3 + '@unocss/core': 65.4.3 + '@unocss/inspector': 65.4.3(vue@3.5.13(typescript@5.7.3)) + chokidar: 3.6.0 + magic-string: 0.30.17 + tinyglobby: 0.2.10 + vite: 6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0) + transitivePeerDependencies: + - rollup + - supports-color + - vue + + '@vitest/eslint-plugin@1.1.25(@typescript-eslint/utils@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': + dependencies: + '@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.19.0(jiti@2.4.2) + optionalDependencies: + typescript: 5.7.3 + '@volar/kit@2.4.11(typescript@5.7.3)': dependencies: '@volar/language-service': 2.4.11 @@ -5327,42 +5783,68 @@ snapshots: '@vscode/l10n@0.0.18': {} - '@vue/compiler-core@3.4.35': + '@vue/compiler-core@3.5.13': dependencies: '@babel/parser': 7.26.7 - '@vue/shared': 3.4.35 + '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.4.35': + '@vue/compiler-dom@3.5.13': dependencies: - '@vue/compiler-core': 3.4.35 - '@vue/shared': 3.4.35 + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 - '@vue/compiler-sfc@3.4.35': + '@vue/compiler-sfc@3.5.13': dependencies: '@babel/parser': 7.26.7 - '@vue/compiler-core': 3.4.35 - '@vue/compiler-dom': 3.4.35 - '@vue/compiler-ssr': 3.4.35 - '@vue/shared': 3.4.35 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 estree-walker: 2.0.2 magic-string: 0.30.17 postcss: 8.5.1 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.4.35': + '@vue/compiler-ssr@3.5.13': dependencies: - '@vue/compiler-dom': 3.4.35 - '@vue/shared': 3.4.35 + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 - '@vue/shared@3.4.35': {} + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.7.3) + + '@vue/shared@3.5.13': {} acorn-jsx@5.3.2(acorn@8.12.1): dependencies: acorn: 8.12.1 + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn@8.12.1: {} acorn@8.14.0: {} @@ -5437,11 +5919,11 @@ snapshots: - supports-color - typescript - astro-loading-indicator@0.5.0(astro@5.1.9(@types/node@22.0.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(typescript@5.7.3)(yaml@2.5.0)): + astro-loading-indicator@0.7.0(astro@5.1.9(@types/node@22.0.2)(jiti@2.4.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(typescript@5.7.3)(yaml@2.5.0)): dependencies: - astro: 5.1.9(@types/node@22.0.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(typescript@5.7.3)(yaml@2.5.0) + astro: 5.1.9(@types/node@22.0.2)(jiti@2.4.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(typescript@5.7.3)(yaml@2.5.0) - astro@5.1.9(@types/node@22.0.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(typescript@5.7.3)(yaml@2.5.0): + astro@5.1.9(@types/node@22.0.2)(jiti@2.4.2)(rollup@4.32.0)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(typescript@5.7.3)(yaml@2.5.0): dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/internal-helpers': 0.4.2 @@ -5493,8 +5975,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.14.4 vfile: 6.0.3 - vite: 6.0.11(@types/node@22.0.2)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0) - vitefu: 1.0.5(vite@6.0.11(@types/node@22.0.2)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0)) + vite: 6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0) + vitefu: 1.0.5(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0)) which-pm: 3.0.0 xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 @@ -5622,6 +6104,13 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.2) + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001695 + electron-to-chromium: 1.5.88 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + buffer-from@1.1.2: {} buffer@5.7.1: @@ -5631,16 +6120,21 @@ snapshots: builtin-modules@3.3.0: {} - call-me-maybe@1.0.2: {} + bundle-require@5.1.0(esbuild@0.24.2): + dependencies: + esbuild: 0.24.2 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} callsites@3.1.0: {} - camelcase-css@2.0.1: {} - camelcase@8.0.0: {} caniuse-lite@1.0.30001645: {} + caniuse-lite@1.0.30001695: {} + ccount@2.0.1: {} chalk@2.4.2: @@ -5658,16 +6152,10 @@ snapshots: character-entities-html4@2.1.0: {} - character-entities-legacy@1.1.4: {} - character-entities-legacy@3.0.0: {} - character-entities@1.2.4: {} - character-entities@2.0.2: {} - character-reference-invalid@1.1.4: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -5686,8 +6174,6 @@ snapshots: chownr@1.1.4: {} - ci-info@4.0.0: {} - ci-info@4.1.0: {} clean-regexp@1.0.0: @@ -5728,6 +6214,8 @@ snapshots: color-string: 1.9.1 optional: true + colorette@2.0.20: {} + comma-separated-tokens@2.0.3: {} comment-parser@1.4.1: {} @@ -5736,7 +6224,7 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.7: {} + confbox@0.1.8: {} consola@3.4.0: {} @@ -5746,11 +6234,11 @@ snapshots: cookie@0.7.2: {} - core-js-compat@3.37.1: + core-js-compat@3.40.0: dependencies: - browserslist: 4.23.2 + browserslist: 4.24.4 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -5760,6 +6248,11 @@ snapshots: dependencies: uncrypto: 0.1.3 + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + cssesc@3.0.0: {} csstype@3.1.3: {} @@ -5768,7 +6261,7 @@ snapshots: debug@3.2.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 debug@4.3.6: dependencies: @@ -5860,10 +6353,14 @@ snapshots: dset@3.1.4: {} + duplexer@0.1.2: {} + ee-first@1.1.1: {} electron-to-chromium@1.5.4: {} + electron-to-chromium@1.5.88: {} + emmet@2.4.7: dependencies: '@emmetio/abbreviation': 2.3.3 @@ -5894,8 +6391,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-module-lexer@1.5.4: {} - es-module-lexer@1.6.0: {} esbuild-register@3.6.0(esbuild@0.19.12): @@ -5956,6 +6451,33 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + esbuild@0.24.2: optionalDependencies: '@esbuild/aix-ppc64': 0.24.2 @@ -5986,6 +6508,8 @@ snapshots: escalade@3.1.2: {} + escalade@3.2.0: {} + escape-html@1.0.3: {} escape-string-regexp@1.0.5: {} @@ -5994,20 +6518,25 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.8.0): + eslint-compat-utils@0.5.1(eslint@9.19.0(jiti@2.4.2)): dependencies: - eslint: 9.8.0 + eslint: 9.19.0(jiti@2.4.2) semver: 7.6.3 - eslint-config-flat-gitignore@0.1.8: + eslint-compat-utils@0.6.4(eslint@9.19.0(jiti@2.4.2)): dependencies: - find-up-simple: 1.0.0 - parse-gitignore: 2.0.0 + eslint: 9.19.0(jiti@2.4.2) + semver: 7.6.3 - eslint-flat-config-utils@0.3.0: + eslint-config-flat-gitignore@1.0.0(eslint@9.19.0(jiti@2.4.2)): dependencies: - '@types/eslint': 9.6.0 - pathe: 1.1.2 + '@eslint/compat': 1.2.5(eslint@9.19.0(jiti@2.4.2)) + eslint: 9.19.0(jiti@2.4.2) + find-up-simple: 1.0.0 + + eslint-flat-config-utils@1.1.0: + dependencies: + pathe: 2.0.2 eslint-import-resolver-node@0.3.9: dependencies: @@ -6017,23 +6546,29 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-merge-processors@0.1.0(eslint@9.8.0): + eslint-json-compat-utils@0.2.1(eslint@9.19.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0): dependencies: - eslint: 9.8.0 + eslint: 9.19.0(jiti@2.4.2) + esquery: 1.6.0 + jsonc-eslint-parser: 2.4.0 - eslint-plugin-antfu@2.3.4(eslint@9.8.0): + eslint-merge-processors@1.0.0(eslint@9.19.0(jiti@2.4.2)): + dependencies: + eslint: 9.19.0(jiti@2.4.2) + + eslint-plugin-antfu@2.7.0(eslint@9.19.0(jiti@2.4.2)): dependencies: '@antfu/utils': 0.7.10 - eslint: 9.8.0 + eslint: 9.19.0(jiti@2.4.2) - eslint-plugin-astro@1.2.3(eslint@9.8.0)(typescript@5.7.3): + eslint-plugin-astro@1.2.3(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.19.0(jiti@2.4.2)) '@jridgewell/sourcemap-codec': 1.5.0 '@typescript-eslint/types': 7.18.0 astro-eslint-parser: 1.0.2(typescript@5.7.3) - eslint: 9.8.0 - eslint-compat-utils: 0.5.1(eslint@9.8.0) + eslint: 9.19.0(jiti@2.4.2) + eslint-compat-utils: 0.5.1(eslint@9.19.0(jiti@2.4.2)) globals: 15.8.0 postcss: 8.4.40 postcss-selector-parser: 6.1.1 @@ -6041,30 +6576,27 @@ snapshots: - supports-color - typescript - eslint-plugin-command@0.2.3(eslint@9.8.0): + eslint-plugin-command@2.1.0(eslint@9.19.0(jiti@2.4.2)): dependencies: - '@es-joy/jsdoccomment': 0.43.1 - eslint: 9.8.0 + '@es-joy/jsdoccomment': 0.50.0 + eslint: 9.19.0(jiti@2.4.2) - eslint-plugin-es-x@7.8.0(eslint@9.8.0): + eslint-plugin-es-x@7.8.0(eslint@9.19.0(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.11.0 - eslint: 9.8.0 - eslint-compat-utils: 0.5.1(eslint@9.8.0) + eslint: 9.19.0(jiti@2.4.2) + eslint-compat-utils: 0.5.1(eslint@9.19.0(jiti@2.4.2)) - eslint-plugin-eslint-comments@3.2.0(eslint@9.8.0): + eslint-plugin-import-x@4.6.1(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3): dependencies: - escape-string-regexp: 1.0.5 - eslint: 9.8.0 - ignore: 5.3.1 - - eslint-plugin-import-x@3.1.0(eslint@9.8.0)(typescript@5.7.3): - dependencies: - '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.7.3) - debug: 4.3.6 + '@types/doctrine': 0.0.9 + '@typescript-eslint/scope-manager': 8.21.0 + '@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + debug: 4.4.0 doctrine: 3.0.0 - eslint: 9.8.0 + enhanced-resolve: 5.17.1 + eslint: 9.19.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.7.6 is-glob: 4.0.3 @@ -6076,113 +6608,105 @@ snapshots: - supports-color - typescript - eslint-plugin-jsdoc@48.10.2(eslint@9.8.0): + eslint-plugin-jsdoc@50.6.3(eslint@9.19.0(jiti@2.4.2)): dependencies: - '@es-joy/jsdoccomment': 0.46.0 + '@es-joy/jsdoccomment': 0.49.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 - debug: 4.3.6 + debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint: 9.8.0 + eslint: 9.19.0(jiti@2.4.2) espree: 10.1.0 esquery: 1.6.0 parse-imports: 2.1.1 semver: 7.6.3 spdx-expression-parse: 4.0.0 - synckit: 0.9.1 + synckit: 0.9.2 transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@2.16.0(eslint@9.8.0): + eslint-plugin-jsonc@2.19.1(eslint@9.19.0(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - eslint: 9.8.0 - eslint-compat-utils: 0.5.1(eslint@9.8.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.19.0(jiti@2.4.2)) + eslint: 9.19.0(jiti@2.4.2) + eslint-compat-utils: 0.6.4(eslint@9.19.0(jiti@2.4.2)) + eslint-json-compat-utils: 0.2.1(eslint@9.19.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 natural-compare: 1.4.0 synckit: 0.6.2 - - eslint-plugin-markdown@5.1.0(eslint@9.8.0): - dependencies: - eslint: 9.8.0 - mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - - supports-color + - '@eslint/json' - eslint-plugin-n@17.10.1(eslint@9.8.0): + eslint-plugin-n@17.15.1(eslint@9.19.0(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2)) enhanced-resolve: 5.17.1 - eslint: 9.8.0 - eslint-plugin-es-x: 7.8.0(eslint@9.8.0) - get-tsconfig: 4.7.6 - globals: 15.8.0 - ignore: 5.3.1 + eslint: 9.19.0(jiti@2.4.2) + eslint-plugin-es-x: 7.8.0(eslint@9.19.0(jiti@2.4.2)) + get-tsconfig: 4.10.0 + globals: 15.14.0 + ignore: 5.3.2 minimatch: 9.0.5 semver: 7.6.3 - eslint-plugin-no-only-tests@3.1.0: {} + eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-perfectionist@3.0.0(astro-eslint-parser@1.0.2(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3)(vue-eslint-parser@9.4.3(eslint@9.8.0)): + eslint-plugin-perfectionist@4.7.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.7.3) - eslint: 9.8.0 - minimatch: 10.0.1 - natural-compare-lite: 1.4.0 - optionalDependencies: - astro-eslint-parser: 1.0.2(typescript@5.7.3) - vue-eslint-parser: 9.4.3(eslint@9.8.0) + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.19.0(jiti@2.4.2) + natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-regexp@2.6.0(eslint@9.8.0): + eslint-plugin-regexp@2.7.0(eslint@9.19.0(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.19.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.11.0 comment-parser: 1.4.1 - eslint: 9.8.0 + eslint: 9.19.0(jiti@2.4.2) jsdoc-type-pratt-parser: 4.0.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-solid@0.14.1(eslint@9.8.0)(typescript@5.7.3): + eslint-plugin-solid@0.14.5(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.7.3) - eslint: 9.8.0 + '@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.19.0(jiti@2.4.2) estraverse: 5.3.0 is-html: 2.0.0 kebab-case: 1.0.2 known-css-properties: 0.30.0 style-to-object: 1.0.6 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - - typescript - eslint-plugin-toml@0.11.1(eslint@9.8.0): + eslint-plugin-toml@0.12.0(eslint@9.19.0(jiti@2.4.2)): dependencies: - debug: 4.3.6 - eslint: 9.8.0 - eslint-compat-utils: 0.5.1(eslint@9.8.0) + debug: 4.4.0 + eslint: 9.19.0(jiti@2.4.2) + eslint-compat-utils: 0.6.4(eslint@9.19.0(jiti@2.4.2)) lodash: 4.17.21 toml-eslint-parser: 0.10.0 transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@55.0.0(eslint@9.8.0): + eslint-plugin-unicorn@56.0.1(eslint@9.19.0(jiti@2.4.2)): dependencies: - '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - ci-info: 4.0.0 + '@babel/helper-validator-identifier': 7.25.9 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.19.0(jiti@2.4.2)) + ci-info: 4.1.0 clean-regexp: 1.0.0 - core-js-compat: 3.37.1 - eslint: 9.8.0 + core-js-compat: 3.40.0 + eslint: 9.19.0(jiti@2.4.2) esquery: 1.6.0 - globals: 15.8.0 + globals: 15.14.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 jsesc: 3.0.2 @@ -6193,54 +6717,41 @@ snapshots: semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-unused-imports@4.0.1(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2)): dependencies: - eslint: 9.8.0 - eslint-rule-composer: 0.3.0 + eslint: 9.19.0(jiti@2.4.2) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3): + eslint-plugin-vue@9.32.0(eslint@9.19.0(jiti@2.4.2)): dependencies: - '@typescript-eslint/utils': 7.18.0(eslint@9.8.0)(typescript@5.7.3) - eslint: 9.8.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.8.0)(typescript@5.7.3))(eslint@9.8.0)(typescript@5.7.3) - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-vue@9.27.0(eslint@9.8.0): - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - eslint: 9.8.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.19.0(jiti@2.4.2)) + eslint: 9.19.0(jiti@2.4.2) globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.1 semver: 7.6.3 - vue-eslint-parser: 9.4.3(eslint@9.8.0) + vue-eslint-parser: 9.4.3(eslint@9.19.0(jiti@2.4.2)) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-yml@1.14.0(eslint@9.8.0): + eslint-plugin-yml@1.16.0(eslint@9.19.0(jiti@2.4.2)): dependencies: - debug: 4.3.6 - eslint: 9.8.0 - eslint-compat-utils: 0.5.1(eslint@9.8.0) + debug: 4.4.0 + eslint: 9.19.0(jiti@2.4.2) + eslint-compat-utils: 0.6.4(eslint@9.19.0(jiti@2.4.2)) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.3 transitivePeerDependencies: - supports-color - eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.35)(eslint@9.8.0): + eslint-processor-vue-blocks@1.0.0(@vue/compiler-sfc@3.5.13)(eslint@9.19.0(jiti@2.4.2)): dependencies: - '@vue/compiler-sfc': 3.4.35 - eslint: 9.8.0 - - eslint-rule-composer@0.3.0: {} + '@vue/compiler-sfc': 3.5.13 + eslint: 9.19.0(jiti@2.4.2) eslint-scope@7.2.2: dependencies: @@ -6252,46 +6763,55 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.0.0: {} - eslint@9.8.0: + eslint-visitor-keys@4.2.0: {} + + eslint@9.19.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/config-array': 0.17.1 - '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.8.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.1 + '@eslint/core': 0.10.0 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.19.0 + '@eslint/plugin-kit': 0.2.5 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 - '@nodelib/fs.walk': 1.2.8 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.2 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionalDependencies: + jiti: 2.4.2 transitivePeerDependencies: - supports-color @@ -6301,10 +6821,16 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 4.0.0 + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + espree@9.6.1: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -6365,6 +6891,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -6416,6 +6946,10 @@ snapshots: get-east-asian-width@1.2.0: {} + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + get-tsconfig@4.7.6: dependencies: resolve-pkg-maps: 1.0.0 @@ -6440,6 +6974,8 @@ snapshots: globals@14.0.0: {} + globals@15.14.0: {} + globals@15.8.0: {} globby@11.1.0: @@ -6455,6 +6991,10 @@ snapshots: graphemer@1.4.0: {} + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + h3@1.14.0: dependencies: cookie-es: 1.2.2 @@ -6618,6 +7158,8 @@ snapshots: ignore@5.3.1: {} + ignore@5.3.2: {} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -6625,6 +7167,17 @@ snapshots: import-meta-resolve@4.1.0: {} + importx@0.5.1: + dependencies: + bundle-require: 5.1.0(esbuild@0.24.2) + debug: 4.4.0 + esbuild: 0.24.2 + jiti: 2.4.2 + pathe: 1.1.2 + tsx: 4.19.2 + transitivePeerDependencies: + - supports-color + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -6637,13 +7190,6 @@ snapshots: iron-webcrypto@1.2.1: {} - is-alphabetical@1.0.4: {} - - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - is-arrayish@0.2.1: {} is-arrayish@0.3.2: @@ -6661,8 +7207,6 @@ snapshots: dependencies: hasown: 2.0.2 - is-decimal@1.0.4: {} - is-docker@3.0.0: {} is-extglob@2.1.1: {} @@ -6673,8 +7217,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-hexadecimal@1.0.4: {} - is-html@2.0.0: dependencies: html-tags: 3.3.1 @@ -6685,8 +7227,6 @@ snapshots: is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-plain-obj@4.1.0: {} is-what@4.1.16: {} @@ -6697,6 +7237,8 @@ snapshots: isexe@2.0.0: {} + jiti@2.4.2: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -6710,6 +7252,8 @@ snapshots: jsdoc-type-pratt-parser@4.0.0: {} + jsdoc-type-pratt-parser@4.1.0: {} + jsesc@0.5.0: {} jsesc@2.5.2: {} @@ -6730,7 +7274,7 @@ snapshots: jsonc-eslint-parser@2.4.0: dependencies: - acorn: 8.12.1 + acorn: 8.14.0 eslint-visitor-keys: 3.4.3 espree: 9.6.1 semver: 7.6.3 @@ -6751,6 +7295,8 @@ snapshots: known-css-properties@0.30.0: {} + kolorist@1.8.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -6758,6 +7304,8 @@ snapshots: lines-and-columns@1.2.4: {} + load-tsconfig@0.2.5: {} + load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 @@ -6765,10 +7313,15 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - local-pkg@0.5.0: + local-pkg@0.5.1: dependencies: - mlly: 1.7.1 - pkg-types: 1.1.3 + mlly: 1.7.4 + pkg-types: 1.3.1 + + local-pkg@1.0.0: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 locate-path@5.0.0: dependencies: @@ -6817,17 +7370,24 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - mdast-util-from-markdown@0.8.5: + mdast-util-from-markdown@2.0.1: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-string: 2.0.0 - micromark: 2.11.4 - parse-entities: 2.0.0 - unist-util-stringify-position: 2.0.3 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color - mdast-util-from-markdown@2.0.1: + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.2 @@ -6929,12 +7489,12 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 - mdast-util-to-string@2.0.0: {} - mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 + mdn-data@2.12.2: {} + merge-anything@5.1.7: dependencies: is-what: 4.1.16 @@ -7110,13 +7670,6 @@ snapshots: micromark-util-types@2.0.0: {} - micromark@2.11.4: - dependencies: - debug: 4.3.6 - parse-entities: 2.0.0 - transitivePeerDependencies: - - supports-color - micromark@4.0.0: dependencies: '@types/debug': 4.1.12 @@ -7161,10 +7714,6 @@ snapshots: min-indent@1.0.1: {} - minimatch@10.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -7177,11 +7726,11 @@ snapshots: mkdirp-classic@0.5.3: {} - mlly@1.7.1: + mlly@1.7.4: dependencies: - acorn: 8.12.1 - pathe: 1.1.2 - pkg-types: 1.1.3 + acorn: 8.14.0 + pathe: 2.0.2 + pkg-types: 1.3.1 ufo: 1.5.4 mrmime@2.0.0: {} @@ -7198,10 +7747,10 @@ snapshots: napi-build-utils@1.0.2: {} - natural-compare-lite@1.4.0: {} - natural-compare@1.4.0: {} + natural-orderby@5.0.0: {} + neotraverse@0.6.18: {} nlcst-to-string@4.0.0: @@ -7216,6 +7765,8 @@ snapshots: node-releases@2.0.18: {} + node-releases@2.0.19: {} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -7289,26 +7840,19 @@ snapshots: p-try@2.2.0: {} + package-manager-detector@0.2.8: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 parse-duration@1.1.0: {} - parse-entities@2.0.0: - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - parse-gitignore@2.0.0: {} parse-imports@2.1.1: dependencies: - es-module-lexer: 1.5.4 + es-module-lexer: 1.6.0 slashes: 3.0.12 parse-json@5.2.0: @@ -7343,6 +7887,10 @@ snapshots: pathe@1.1.2: {} + pathe@2.0.2: {} + + perfect-debounce@1.0.0: {} + picocolors@1.0.1: {} picocolors@1.1.1: {} @@ -7351,68 +7899,25 @@ snapshots: picomatch@4.0.2: {} - pify@2.3.0: {} - pify@4.0.1: {} pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - pkg-types@1.1.3: + pkg-types@1.3.1: dependencies: - confbox: 0.1.7 - mlly: 1.7.1 - pathe: 1.1.2 + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.2 pluralize@8.0.0: {} - postcss-custom-media@10.0.8(postcss@8.5.1): - dependencies: - '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) - '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) - '@csstools/css-tokenizer': 2.4.1 - '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) - postcss: 8.5.1 - - postcss-import@16.1.0(postcss@8.5.1): - dependencies: - postcss: 8.5.1 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - - postcss-js@4.0.1(postcss@8.5.1): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.5.1 - - postcss-mixins@10.0.1(postcss@8.5.1): - dependencies: - fast-glob: 3.3.2 - postcss: 8.5.1 - postcss-js: 4.0.1(postcss@8.5.1) - postcss-simple-vars: 7.0.1(postcss@8.5.1) - sugarss: 4.0.1(postcss@8.5.1) - - postcss-nesting@12.1.5(postcss@8.5.1): - dependencies: - '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.1.1) - '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.1) - postcss: 8.5.1 - postcss-selector-parser: 6.1.1 - postcss-selector-parser@6.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-simple-vars@7.0.1(postcss@8.5.1): - dependencies: - postcss: 8.5.1 - - postcss-value-parser@4.2.0: {} - postcss@8.4.40: dependencies: nanoid: 3.3.7 @@ -7482,10 +7987,6 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 @@ -7781,6 +8282,12 @@ snapshots: is-arrayish: 0.3.2 optional: true + sirv@3.0.0: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 2.0.0 + totalist: 3.0.1 + sisteransi@1.0.5: {} slash@3.0.0: {} @@ -7840,8 +8347,6 @@ snapshots: statuses@2.0.1: {} - string-argv@0.3.2: {} - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -7888,6 +8393,7 @@ snapshots: sugarss@4.0.1(postcss@8.5.1): dependencies: postcss: 8.5.1 + optional: true supports-color@5.5.0: dependencies: @@ -7908,6 +8414,13 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.6.3 + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.3 + + tailwind-merge@2.6.0: {} + tapable@2.2.1: {} tar-fs@2.1.1: @@ -7925,10 +8438,13 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - text-table@0.2.0: {} - tinyexec@0.3.2: {} + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: @@ -7941,6 +8457,8 @@ snapshots: dependencies: eslint-visitor-keys: 3.4.3 + totalist@3.0.1: {} + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -7949,12 +8467,23 @@ snapshots: dependencies: typescript: 5.7.3 + ts-api-utils@2.0.0(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + tsconfck@3.1.4(typescript@5.7.3): optionalDependencies: typescript: 5.7.3 tslib@2.6.3: {} + tsx@4.19.2: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.7.6 + optionalDependencies: + fsevents: 2.3.3 + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -7963,8 +8492,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.1.0: {} - type-fest@0.20.2: {} type-fest@0.6.0: {} @@ -7985,6 +8512,14 @@ snapshots: ultrahtml@1.5.3: {} + unconfig@0.6.1: + dependencies: + '@antfu/utils': 8.1.0 + defu: 6.1.4 + importx: 0.5.1 + transitivePeerDependencies: + - supports-color + uncrypto@0.1.3: {} undici-types@6.11.1: {} @@ -8030,10 +8565,6 @@ snapshots: '@types/unist': 3.0.2 unist-util-visit: 5.0.0 - unist-util-stringify-position@2.0.3: - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.2 @@ -8053,6 +8584,33 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + unocss@65.4.3(postcss@8.5.1)(rollup@4.32.0)(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0))(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@unocss/astro': 65.4.3(rollup@4.32.0)(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0))(vue@3.5.13(typescript@5.7.3)) + '@unocss/cli': 65.4.3(rollup@4.32.0) + '@unocss/core': 65.4.3 + '@unocss/postcss': 65.4.3(postcss@8.5.1) + '@unocss/preset-attributify': 65.4.3 + '@unocss/preset-icons': 65.4.3 + '@unocss/preset-mini': 65.4.3 + '@unocss/preset-tagify': 65.4.3 + '@unocss/preset-typography': 65.4.3 + '@unocss/preset-uno': 65.4.3 + '@unocss/preset-web-fonts': 65.4.3 + '@unocss/preset-wind': 65.4.3 + '@unocss/transformer-attributify-jsx': 65.4.3 + '@unocss/transformer-compile-class': 65.4.3 + '@unocss/transformer-directives': 65.4.3 + '@unocss/transformer-variant-group': 65.4.3 + '@unocss/vite': 65.4.3(rollup@4.32.0)(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0))(vue@3.5.13(typescript@5.7.3)) + optionalDependencies: + vite: 6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0) + transitivePeerDependencies: + - postcss + - rollup + - supports-color + - vue + unstorage@1.14.4: dependencies: anymatch: 3.1.3 @@ -8070,6 +8628,12 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -8098,7 +8662,7 @@ snapshots: '@types/unist': 3.0.2 vfile-message: 4.0.2 - vite-plugin-solid@2.11.0(solid-js@1.8.19)(vite@6.0.11(@types/node@22.0.2)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0)): + vite-plugin-solid@2.11.0(solid-js@1.8.19)(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0)): dependencies: '@babel/core': 7.25.2 '@types/babel__core': 7.20.5 @@ -8106,12 +8670,12 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.8.19 solid-refresh: 0.6.3(solid-js@1.8.19) - vite: 6.0.11(@types/node@22.0.2)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0) - vitefu: 1.0.5(vite@6.0.11(@types/node@22.0.2)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0)) + vite: 6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0) + vitefu: 1.0.5(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0)) transitivePeerDependencies: - supports-color - vite@6.0.11(@types/node@22.0.2)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0): + vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0): dependencies: esbuild: 0.24.2 postcss: 8.5.1 @@ -8119,12 +8683,14 @@ snapshots: optionalDependencies: '@types/node': 22.0.2 fsevents: 2.3.3 + jiti: 2.4.2 sugarss: 4.0.1(postcss@8.5.1) + tsx: 4.19.2 yaml: 2.5.0 - vitefu@1.0.5(vite@6.0.11(@types/node@22.0.2)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0)): + vitefu@1.0.5(vite@6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0)): optionalDependencies: - vite: 6.0.11(@types/node@22.0.2)(sugarss@4.0.1(postcss@8.5.1))(yaml@2.5.0) + vite: 6.0.11(@types/node@22.0.2)(jiti@2.4.2)(sugarss@4.0.1(postcss@8.5.1))(tsx@4.19.2)(yaml@2.5.0) volar-service-css@0.0.62(@volar/language-service@2.4.11): dependencies: @@ -8237,10 +8803,10 @@ snapshots: vscode-uri@3.0.8: {} - vue-eslint-parser@9.4.3(eslint@9.8.0): + vue-eslint-parser@9.4.3(eslint@9.19.0(jiti@2.4.2)): dependencies: - debug: 4.3.6 - eslint: 9.8.0 + debug: 4.4.0 + eslint: 9.19.0(jiti@2.4.2) eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -8250,6 +8816,20 @@ snapshots: transitivePeerDependencies: - supports-color + vue-flow-layout@0.1.1(vue@3.5.13(typescript@5.7.3)): + dependencies: + vue: 3.5.13(typescript@5.7.3) + + vue@3.5.13(typescript@5.7.3): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.7.3 + web-namespaces@2.0.1: {} which-pm-runs@1.1.0: {} diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index a112eb0..0000000 --- a/postcss.config.js +++ /dev/null @@ -1,8 +0,0 @@ -export default { - plugins: { - 'postcss-import': {}, - 'postcss-mixins': {}, - 'postcss-custom-media': {}, - 'postcss-nesting': {}, - }, -} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..2890f33 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,7 @@ +import UnoCSS from '@unocss/postcss' + +export default { + plugins: [ + UnoCSS(), + ], +} diff --git a/src/backend/bot.ts b/src/backend/bot.ts index 33b194f..8678f1e 100644 --- a/src/backend/bot.ts +++ b/src/backend/bot.ts @@ -6,9 +6,9 @@ import { env } from '~/backend/env' import { shoutboxDp } from './bot/shoutbox' export const tg = new TelegramClient({ - apiId: env.TG_API_ID, - apiHash: env.TG_API_HASH, - storage: '.runtime/bot.session', + apiId: env.TG_API_ID, + apiHash: env.TG_API_HASH, + storage: '.runtime/bot.session', }) const dp = Dispatcher.for(tg) diff --git a/src/backend/bot/notify.ts b/src/backend/bot/notify.ts index 1392d34..864ab2d 100644 --- a/src/backend/bot/notify.ts +++ b/src/backend/bot/notify.ts @@ -4,8 +4,8 @@ import { tg } from '~/backend/bot' import { env } from '~/backend/env' export function telegramNotify(text: InputText, options?: Parameters[2]): void { - tg.sendText(env.TG_CHAT_ID, text, { - disableWebPreview: true, - ...options, - }).catch(console.error) + tg.sendText(env.TG_CHAT_ID, text, { + disableWebPreview: true, + ...options, + }).catch(console.error) } diff --git a/src/backend/bot/shoutbox.ts b/src/backend/bot/shoutbox.ts index ae2489f..87154ce 100644 --- a/src/backend/bot/shoutbox.ts +++ b/src/backend/bot/shoutbox.ts @@ -1,16 +1,16 @@ +import { assertMatches } from '@fuman/utils' import { CallbackDataBuilder, Dispatcher, filters } from '@mtcute/dispatcher' import { html } from '@mtcute/node' import parseDuration from 'parse-duration' -import { assertMatches } from '@fuman/utils' import { env } from '../env' import { - answerBySerial, - approveShout, - banShouts, - declineShout, - deleteBySerial, - unbanShouts, + answerBySerial, + approveShout, + banShouts, + declineShout, + deleteBySerial, + unbanShouts, } from '../service/shoutbox' export const ShoutboxAction = new CallbackDataBuilder('shoutbox', 'id', 'action') @@ -18,83 +18,83 @@ export const ShoutboxAction = new CallbackDataBuilder('shoutbox', 'id', 'action' const dp = Dispatcher.child() dp.onCallbackQuery(ShoutboxAction.filter({ action: 'approve' }), async (ctx) => { - if (ctx.chat.id !== env.TG_CHAT_ID) return + if (ctx.chat.id !== env.TG_CHAT_ID) return - const serial = approveShout(ctx.match.id) - await ctx.editMessageWith(msg => ({ - text: html`${msg.textWithEntities}

✅ Approved! ID: ${serial}`, - })) + const serial = approveShout(ctx.match.id) + await ctx.editMessageWith(msg => ({ + text: html`${msg.textWithEntities}

✅ Approved! ID: ${serial}`, + })) }) dp.onCallbackQuery(ShoutboxAction.filter({ action: 'decline' }), async (ctx) => { - if (ctx.chat.id !== env.TG_CHAT_ID) return + if (ctx.chat.id !== env.TG_CHAT_ID) return - declineShout(ctx.match.id) + declineShout(ctx.match.id) - await ctx.editMessageWith(msg => ({ - text: html`${msg.textWithEntities}

❌ Declined!`, - })) + await ctx.editMessageWith(msg => ({ + text: html`${msg.textWithEntities}

❌ Declined!`, + })) }) dp.onNewMessage(filters.and(filters.chatId(env.TG_CHAT_ID), filters.command('shoutbox_del')), async (ctx) => { - const serial = Number(ctx.command[1]) - if (Number.isNaN(serial)) { - await ctx.answerText('invalid serial') - return - } + const serial = Number(ctx.command[1]) + if (Number.isNaN(serial)) { + await ctx.answerText('invalid serial') + return + } - deleteBySerial(serial) - await ctx.answerText('deleted') + deleteBySerial(serial) + await ctx.answerText('deleted') }) dp.onNewMessage(filters.and(filters.chatId(env.TG_CHAT_ID), filters.command('shoutbox_ban')), async (ctx) => { - const ip = ctx.command[1] - const duration = parseDuration(ctx.command[2]) + const ip = ctx.command[1] + const duration = parseDuration(ctx.command[2]) - if (!duration) { - await ctx.answerText('invalid duration') - return - } + if (!duration) { + await ctx.answerText('invalid duration') + return + } - const until = Date.now() + duration + const until = Date.now() + duration - banShouts(ip, until) - await ctx.answerText(`banned ${ip} until ${new Date(until).toISOString()}`) + banShouts(ip, until) + await ctx.answerText(`banned ${ip} until ${new Date(until).toISOString()}`) }) dp.onNewMessage(filters.and(filters.chatId(env.TG_CHAT_ID), filters.command('shoutbox_unban')), async (ctx) => { - const ip = ctx.command[1] + const ip = ctx.command[1] - unbanShouts(ip) - await ctx.answerText('done') + unbanShouts(ip) + await ctx.answerText('done') }) dp.onNewMessage(filters.and(filters.chatId(env.TG_CHAT_ID), filters.command('shoutbox_reply')), async (ctx) => { - const serial = Number(ctx.command[1]) - if (Number.isNaN(serial)) { - await ctx.answerText('invalid serial') - return - } + const serial = Number(ctx.command[1]) + if (Number.isNaN(serial)) { + await ctx.answerText('invalid serial') + return + } - answerBySerial(serial, ctx.command[2]) - await ctx.answerText('done') + answerBySerial(serial, ctx.command[2]) + await ctx.answerText('done') }) // eslint-disable-next-line regexp/no-unused-capturing-group const APPROVED_REGEX = /Approved! ID: (\d+)/ dp.onNewMessage( - filters.replyTo( - msg => APPROVED_REGEX.test(msg.text), - ), - async (ctx) => { - const msg = await ctx.getReplyTo() + filters.replyTo( + msg => APPROVED_REGEX.test(msg.text), + ), + async (ctx) => { + const msg = await ctx.getReplyTo() - const serial = assertMatches(msg.text, APPROVED_REGEX)[1] + const serial = assertMatches(msg.text, APPROVED_REGEX)[1] - answerBySerial(Number(serial), ctx.text) - await ctx.answerText('reply sent') - }, + answerBySerial(Number(serial), ctx.text) + await ctx.answerText('reply sent') + }, ) export { dp as shoutboxDp } diff --git a/src/backend/domain/misskey.ts b/src/backend/domain/misskey.ts index 1ea12c8..a881b95 100644 --- a/src/backend/domain/misskey.ts +++ b/src/backend/domain/misskey.ts @@ -1,244 +1,254 @@ import { z } from 'zod' const UserSchema = z.object({ - id: z.string().optional().nullable(), - name: z.string().optional().nullable(), - username: z.string().optional().nullable(), - host: z - .string() - .describe('The local host is represented with `null`.') - .optional().nullable(), - avatarUrl: z.string().optional().nullable(), - avatarBlurhash: z.string().optional().nullable(), - avatarDecorations: z - .array( - z.object({ - id: z.string().optional().nullable(), - angle: z.number().optional().nullable(), - flipH: z.boolean().optional().nullable(), - url: z.string().optional().nullable(), - offsetX: z.number().optional().nullable(), - offsetY: z.number().optional().nullable(), - }), - ) - .optional().nullable(), - isAdmin: z.boolean().optional().nullable(), - isModerator: z.boolean().optional().nullable(), - isSilenced: z.boolean().optional().nullable(), - noindex: z.boolean().optional().nullable(), - isBot: z.boolean().optional().nullable(), - isCat: z.boolean().optional().nullable(), - speakAsCat: z.boolean().optional().nullable(), - instance: z - .object({ - name: z.string().optional().nullable(), - softwareName: z.string().optional().nullable(), - softwareVersion: z.string().optional().nullable(), - iconUrl: z.string().optional().nullable(), - faviconUrl: z.string().optional().nullable(), - themeColor: z.string().optional().nullable(), - }) - .optional().nullable(), - emojis: z.record(z.string()).optional().nullable(), - onlineStatus: z.enum(['unknown', 'online', 'active', 'offline']).optional().nullable(), - badgeRoles: z - .array( - z.object({ - name: z.string().optional().nullable(), - iconUrl: z.string().optional().nullable(), - displayOrder: z.number().optional().nullable(), - }), - ) - .optional().nullable(), + id: z.string().optional().nullable(), + name: z.string().optional().nullable(), + username: z.string().optional().nullable(), + host: z + .string() + .describe('The local host is represented with `null`.') + .optional() + .nullable(), + avatarUrl: z.string().optional().nullable(), + avatarBlurhash: z.string().optional().nullable(), + avatarDecorations: z + .array( + z.object({ + id: z.string().optional().nullable(), + angle: z.number().optional().nullable(), + flipH: z.boolean().optional().nullable(), + url: z.string().optional().nullable(), + offsetX: z.number().optional().nullable(), + offsetY: z.number().optional().nullable(), + }), + ) + .optional() + .nullable(), + isAdmin: z.boolean().optional().nullable(), + isModerator: z.boolean().optional().nullable(), + isSilenced: z.boolean().optional().nullable(), + noindex: z.boolean().optional().nullable(), + isBot: z.boolean().optional().nullable(), + isCat: z.boolean().optional().nullable(), + speakAsCat: z.boolean().optional().nullable(), + instance: z + .object({ + name: z.string().optional().nullable(), + softwareName: z.string().optional().nullable(), + softwareVersion: z.string().optional().nullable(), + iconUrl: z.string().optional().nullable(), + faviconUrl: z.string().optional().nullable(), + themeColor: z.string().optional().nullable(), + }) + .optional() + .nullable(), + emojis: z.record(z.string()).optional().nullable(), + onlineStatus: z.enum(['unknown', 'online', 'active', 'offline']).optional().nullable(), + badgeRoles: z + .array( + z.object({ + name: z.string().optional().nullable(), + iconUrl: z.string().optional().nullable(), + displayOrder: z.number().optional().nullable(), + }), + ) + .optional() + .nullable(), }) export type MkUser = z.infer const NoteSchema = z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().optional().nullable(), - deletedAt: z.string().optional().nullable(), - text: z.string().optional().nullable(), - cw: z.string().optional().nullable(), - userId: z.string().optional().nullable(), - user: z - .object({}) - .catchall(z.any()) - .optional().nullable(), - replyId: z.string().optional().nullable(), - renoteId: z.string().optional().nullable(), - reply: z - .object({}) - .catchall(z.any()) - .optional().nullable(), - renote: z - .object({}) - .catchall(z.any()) - .optional().nullable(), - isHidden: z.boolean().optional().nullable(), - visibility: z.enum(['public', 'home', 'followers', 'specified']).optional().nullable(), - mentions: z.array(z.string()).optional().nullable(), - visibleUserIds: z.array(z.string()).optional().nullable(), - fileIds: z.array(z.string()).optional().nullable(), - files: z.array(z.object({}).catchall(z.any())).optional().nullable(), - tags: z.array(z.string()).optional().nullable(), - poll: z - .object({ - expiresAt: z.string().optional().nullable(), - multiple: z.boolean().optional().nullable(), - choices: z - .array( - z.object({ - isVoted: z.boolean().optional().nullable(), - text: z.string().optional().nullable(), - votes: z.number().optional().nullable(), - }), - ) - .optional().nullable(), - }) - .optional().nullable(), - emojis: z.record(z.string(), z.any()).optional().nullable(), - channelId: z.string().optional().nullable(), - channel: z - .object({ - id: z.string().optional().nullable(), - name: z.string().optional().nullable(), - color: z.string().optional().nullable(), - isSensitive: z.boolean().optional().nullable(), - allowRenoteToExternal: z.boolean().optional().nullable(), - userId: z.string().optional().nullable(), - }) - .optional().nullable(), - localOnly: z.boolean().optional().nullable(), - reactionAcceptance: z.string().optional().nullable(), - reactionEmojis: z.record(z.string(), z.string()).optional().nullable(), - reactions: z.record(z.string(), z.number()).optional().nullable(), - renoteCount: z.number().optional().nullable(), - repliesCount: z.number().optional().nullable(), - uri: z.string().optional().nullable(), - url: z.string().optional().nullable(), - reactionAndUserPairCache: z.array(z.string()).optional().nullable(), - clippedCount: z.number().optional().nullable(), - myReaction: z.string().optional().nullable(), + id: z.string().optional().nullable(), + createdAt: z.string().optional().nullable(), + deletedAt: z.string().optional().nullable(), + text: z.string().optional().nullable(), + cw: z.string().optional().nullable(), + userId: z.string().optional().nullable(), + user: z + .object({}) + .catchall(z.any()) + .optional() + .nullable(), + replyId: z.string().optional().nullable(), + renoteId: z.string().optional().nullable(), + reply: z + .object({}) + .catchall(z.any()) + .optional() + .nullable(), + renote: z + .object({}) + .catchall(z.any()) + .optional() + .nullable(), + isHidden: z.boolean().optional().nullable(), + visibility: z.enum(['public', 'home', 'followers', 'specified']).optional().nullable(), + mentions: z.array(z.string()).optional().nullable(), + visibleUserIds: z.array(z.string()).optional().nullable(), + fileIds: z.array(z.string()).optional().nullable(), + files: z.array(z.object({}).catchall(z.any())).optional().nullable(), + tags: z.array(z.string()).optional().nullable(), + poll: z + .object({ + expiresAt: z.string().optional().nullable(), + multiple: z.boolean().optional().nullable(), + choices: z + .array( + z.object({ + isVoted: z.boolean().optional().nullable(), + text: z.string().optional().nullable(), + votes: z.number().optional().nullable(), + }), + ) + .optional() + .nullable(), + }) + .optional() + .nullable(), + emojis: z.record(z.string(), z.any()).optional().nullable(), + channelId: z.string().optional().nullable(), + channel: z + .object({ + id: z.string().optional().nullable(), + name: z.string().optional().nullable(), + color: z.string().optional().nullable(), + isSensitive: z.boolean().optional().nullable(), + allowRenoteToExternal: z.boolean().optional().nullable(), + userId: z.string().optional().nullable(), + }) + .optional() + .nullable(), + localOnly: z.boolean().optional().nullable(), + reactionAcceptance: z.string().optional().nullable(), + reactionEmojis: z.record(z.string(), z.string()).optional().nullable(), + reactions: z.record(z.string(), z.number()).optional().nullable(), + renoteCount: z.number().optional().nullable(), + repliesCount: z.number().optional().nullable(), + uri: z.string().optional().nullable(), + url: z.string().optional().nullable(), + reactionAndUserPairCache: z.array(z.string()).optional().nullable(), + clippedCount: z.number().optional().nullable(), + myReaction: z.string().optional().nullable(), }) export type MkNote = z.infer const NotificationSchema = z.union([ - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('note').optional().nullable(), - user: UserSchema.optional().nullable(), - userId: z.string().optional().nullable(), - note: NoteSchema.optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('mention').optional().nullable(), - user: UserSchema.optional().nullable(), - userId: z.string().optional().nullable(), - note: NoteSchema.optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('reply').optional().nullable(), - user: UserSchema.optional().nullable(), - userId: z.string().optional().nullable(), - note: NoteSchema.optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('renote').optional().nullable(), - user: UserSchema.optional().nullable(), - userId: z.string().optional().nullable(), - note: NoteSchema.optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('quote').optional().nullable(), - user: UserSchema.optional().nullable(), - userId: z.string().optional().nullable(), - note: NoteSchema.optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('reaction').optional().nullable(), - user: UserSchema.optional().nullable(), - userId: z.string().optional().nullable(), - note: NoteSchema.optional().nullable(), - reaction: z.string().optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('pollEnded').optional().nullable(), - user: UserSchema.optional().nullable(), - userId: z.string().optional().nullable(), - note: NoteSchema.optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.union([z.literal('follow'), z.literal('unfollow')]).optional().nullable(), - user: UserSchema.optional().nullable(), - userId: z.string().optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('receiveFollowRequest').optional().nullable(), - user: UserSchema.optional().nullable(), - userId: z.string().optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('followRequestAccepted').optional().nullable(), - user: UserSchema.optional().nullable(), - userId: z.string().optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('roleAssigned').optional().nullable(), - role: z.record(z.any()).optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('achievementEarned').optional().nullable(), - achievement: z.string().optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('app').optional().nullable(), - body: z.string().optional().nullable(), - header: z.string().optional().nullable(), - icon: z.string().optional().nullable(), - }), - z.object({ - id: z.string().optional().nullable(), - createdAt: z.string().datetime().optional().nullable(), - type: z.literal('edited').optional().nullable(), - user: UserSchema.optional().nullable(), - userId: z.string().optional().nullable(), - note: NoteSchema.optional().nullable(), - }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('note').optional().nullable(), + user: UserSchema.optional().nullable(), + userId: z.string().optional().nullable(), + note: NoteSchema.optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('mention').optional().nullable(), + user: UserSchema.optional().nullable(), + userId: z.string().optional().nullable(), + note: NoteSchema.optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('reply').optional().nullable(), + user: UserSchema.optional().nullable(), + userId: z.string().optional().nullable(), + note: NoteSchema.optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('renote').optional().nullable(), + user: UserSchema.optional().nullable(), + userId: z.string().optional().nullable(), + note: NoteSchema.optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('quote').optional().nullable(), + user: UserSchema.optional().nullable(), + userId: z.string().optional().nullable(), + note: NoteSchema.optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('reaction').optional().nullable(), + user: UserSchema.optional().nullable(), + userId: z.string().optional().nullable(), + note: NoteSchema.optional().nullable(), + reaction: z.string().optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('pollEnded').optional().nullable(), + user: UserSchema.optional().nullable(), + userId: z.string().optional().nullable(), + note: NoteSchema.optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.union([z.literal('follow'), z.literal('unfollow')]).optional().nullable(), + user: UserSchema.optional().nullable(), + userId: z.string().optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('receiveFollowRequest').optional().nullable(), + user: UserSchema.optional().nullable(), + userId: z.string().optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('followRequestAccepted').optional().nullable(), + user: UserSchema.optional().nullable(), + userId: z.string().optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('roleAssigned').optional().nullable(), + role: z.record(z.any()).optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('achievementEarned').optional().nullable(), + achievement: z.string().optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('app').optional().nullable(), + body: z.string().optional().nullable(), + header: z.string().optional().nullable(), + icon: z.string().optional().nullable(), + }), + z.object({ + id: z.string().optional().nullable(), + createdAt: z.string().datetime().optional().nullable(), + type: z.literal('edited').optional().nullable(), + user: UserSchema.optional().nullable(), + userId: z.string().optional().nullable(), + note: NoteSchema.optional().nullable(), + }), ] as const) export const MisskeyWebhookBodySchema = z.object({ - server: z.string(), - hookId: z.string(), - userId: z.string(), - eventId: z.string(), - createdAt: z.number(), - type: z.string(), - body: z.object({ - notification: NotificationSchema, - }).partial(), + server: z.string(), + hookId: z.string(), + userId: z.string(), + eventId: z.string(), + createdAt: z.number(), + type: z.string(), + body: z.object({ + notification: NotificationSchema, + }).partial(), }) diff --git a/src/backend/env.ts b/src/backend/env.ts index 56450e2..d213114 100644 --- a/src/backend/env.ts +++ b/src/backend/env.ts @@ -1,23 +1,23 @@ -import 'dotenv/config' - import { z } from 'zod' import { zodValidateSync } from '~/utils/zod' +import 'dotenv/config' + export const env = zodValidateSync( - z.object({ - UMAMI_HOST: z.string().url(), - UMAMI_TOKEN: z.string(), - UMAMI_SITE_ID: z.string().uuid(), - TG_API_ID: z.coerce.number(), - TG_API_HASH: z.string(), - TG_BOT_TOKEN: z.string(), - TG_CHAT_ID: z.coerce.number(), - CURRENCY_API_TOKEN: z.string(), - FAKE_DEEPL_SECRET: z.string(), - MK_WEBHOOK_SECRET: z.string(), - QBT_WEBHOOK_SECRET: z.string(), - CSRF_SECRET: z.string(), - }), - process.env, + z.object({ + UMAMI_HOST: z.string().url(), + UMAMI_TOKEN: z.string(), + UMAMI_SITE_ID: z.string().uuid(), + TG_API_ID: z.coerce.number(), + TG_API_HASH: z.string(), + TG_BOT_TOKEN: z.string(), + TG_CHAT_ID: z.coerce.number(), + CURRENCY_API_TOKEN: z.string(), + FAKE_DEEPL_SECRET: z.string(), + MK_WEBHOOK_SECRET: z.string(), + QBT_WEBHOOK_SECRET: z.string(), + CSRF_SECRET: z.string(), + }), + process.env, ) diff --git a/src/backend/models/shoutbox.ts b/src/backend/models/shoutbox.ts index ad26944..df66a28 100644 --- a/src/backend/models/shoutbox.ts +++ b/src/backend/models/shoutbox.ts @@ -4,16 +4,16 @@ import { sql } from 'drizzle-orm' import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core' export const shouts = sqliteTable('shouts', { - id: text('id').primaryKey().$defaultFn(randomUUID), - serial: integer('serial').notNull().default(0), - fromIp: text('from_ip'), - pending: integer('pending', { mode: 'boolean' }).notNull().default(true), - text: text('text'), - createdAt: text('created_at').notNull().default(sql`(CURRENT_TIMESTAMP)`), - reply: text('reply'), + id: text('id').primaryKey().$defaultFn(randomUUID), + serial: integer('serial').notNull().default(0), + fromIp: text('from_ip'), + pending: integer('pending', { mode: 'boolean' }).notNull().default(true), + text: text('text'), + createdAt: text('created_at').notNull().default(sql`(CURRENT_TIMESTAMP)`), + reply: text('reply'), }) export const shoutsBans = sqliteTable('shouts_bans', { - ip: text('ip').primaryKey(), - expires: integer('expires').notNull(), + ip: text('ip').primaryKey(), + expires: integer('expires').notNull(), }) diff --git a/src/backend/service/currency.ts b/src/backend/service/currency.ts index bdf78a5..42f0324 100644 --- a/src/backend/service/currency.ts +++ b/src/backend/service/currency.ts @@ -1,5 +1,5 @@ -import { z } from 'zod' import { AsyncResource } from '@fuman/utils' +import { z } from 'zod' import { env } from '../env' import { ffetch } from '../utils/fetch.ts' @@ -8,52 +8,52 @@ export const AVAILABLE_CURRENCIES = ['RUB', 'USD', 'EUR'] const TTL = 60 * 60 * 1000 // 1 hour const schema = z.object({ - meta: z.object({ - last_updated_at: z.string(), - }), - data: z.record(z.string(), z.object({ - code: z.string(), - value: z.number(), - })), + meta: z.object({ + last_updated_at: z.string(), + }), + data: z.record(z.string(), z.object({ + code: z.string(), + value: z.number(), + })), }) const reloadable = new AsyncResource>({ - // expiresIn: () => TTL, - async fetcher() { - // https://api.currencyapi.com/v3/latest?apikey=cur_live_ZGgJCl3CfMM7TqXSdlUTiKlO2e81lLcOVX5mCXb6¤cies=USD%2CEUR - // apikey=cur_live_ZGgJCl3CfMM7TqXSdlUTiKlO2e81lLcOVX5mCXb6¤cies=USD%2CEUR - const res = await ffetch('https://api.currencyapi.com/v3/latest', { - query: { - apikey: env.CURRENCY_API_TOKEN, - currencies: AVAILABLE_CURRENCIES.slice(1).join(','), - base_currency: AVAILABLE_CURRENCIES[0], - }, - }).parsedJson(schema) + // expiresIn: () => TTL, + async fetcher() { + // https://api.currencyapi.com/v3/latest?apikey=cur_live_ZGgJCl3CfMM7TqXSdlUTiKlO2e81lLcOVX5mCXb6¤cies=USD%2CEUR + // apikey=cur_live_ZGgJCl3CfMM7TqXSdlUTiKlO2e81lLcOVX5mCXb6¤cies=USD%2CEUR + const res = await ffetch('https://api.currencyapi.com/v3/latest', { + query: { + apikey: env.CURRENCY_API_TOKEN, + currencies: AVAILABLE_CURRENCIES.slice(1).join(','), + base_currency: AVAILABLE_CURRENCIES[0], + }, + }).parsedJson(schema) - return { - data: res, - expiresIn: TTL, - } - }, - swr: true, + return { + data: res, + expiresIn: TTL, + } + }, + swr: true, }) export function convertCurrencySync(from: string, to: string, amount: number) { - if (from === to) return amount - if (!AVAILABLE_CURRENCIES.includes(from)) throw new Error(`Invalid currency: ${from}`) - if (!AVAILABLE_CURRENCIES.includes(to)) throw new Error(`Invalid currency: ${to}`) + if (from === to) return amount + if (!AVAILABLE_CURRENCIES.includes(from)) throw new Error(`Invalid currency: ${from}`) + if (!AVAILABLE_CURRENCIES.includes(to)) throw new Error(`Invalid currency: ${to}`) - const data = reloadable.getCached() - if (!data) throw new Error('currencies not available') + const data = reloadable.getCached() + if (!data) throw new Error('currencies not available') - if (from !== AVAILABLE_CURRENCIES[0]) { - // convert to base currency first - amount /= data.data[from].value - } + if (from !== AVAILABLE_CURRENCIES[0]) { + // convert to base currency first + amount /= data.data[from].value + } - return amount * data.data[to].value + return amount * data.data[to].value } export async function fetchConvertRates() { - await reloadable.get() + await reloadable.get() } diff --git a/src/backend/service/gtrans.ts b/src/backend/service/gtrans.ts index d0db2ca..07d5d8f 100644 --- a/src/backend/service/gtrans.ts +++ b/src/backend/service/gtrans.ts @@ -1,118 +1,118 @@ import { randomPick } from '~/utils/random' const USER_AGENTS = [ - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', - 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', - 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', - 'Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', - 'Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', - 'Mozilla/5.0 (Linux; Android 10; SM-A102U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', - 'Mozilla/5.0 (Linux; Android 10; SM-G960U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', - 'Mozilla/5.0 (Linux; Android 10; SM-N960U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', - 'Mozilla/5.0 (Linux; Android 10; LM-Q720) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', - 'Mozilla/5.0 (Linux; Android 10; LM-X420) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', - 'Mozilla/5.0 (Linux; Android 10; LM-Q710(FGN)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 Edg/103.0.1264.37', - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 Edg/103.0.1264.37', - 'Mozilla/5.0 (Linux; Android 10; HD1913) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36 EdgA/100.0.1185.50', - 'Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36 EdgA/100.0.1185.50', - 'Mozilla/5.0 (Linux; Android 10; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36 EdgA/100.0.1185.50', - 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 EdgiOS/100.1185.50 Mobile/15E148 Safari/605.1.15', - 'Mozilla/5.0 (Windows Mobile 10; Android 10.0; Microsoft; Lumia 950XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36 Edge/40.15254.603', - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15', - 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', - 'Mozilla/5.0 (iPad; CPU OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', - 'Mozilla/5.0 (iPod touch; CPU iPhone 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', + 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', + 'Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', + 'Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', + 'Mozilla/5.0 (Linux; Android 10; SM-A102U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', + 'Mozilla/5.0 (Linux; Android 10; SM-G960U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', + 'Mozilla/5.0 (Linux; Android 10; SM-N960U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', + 'Mozilla/5.0 (Linux; Android 10; LM-Q720) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', + 'Mozilla/5.0 (Linux; Android 10; LM-X420) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', + 'Mozilla/5.0 (Linux; Android 10; LM-Q710(FGN)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 Edg/103.0.1264.37', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 Edg/103.0.1264.37', + 'Mozilla/5.0 (Linux; Android 10; HD1913) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36 EdgA/100.0.1185.50', + 'Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36 EdgA/100.0.1185.50', + 'Mozilla/5.0 (Linux; Android 10; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Mobile Safari/537.36 EdgA/100.0.1185.50', + 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 EdgiOS/100.1185.50 Mobile/15E148 Safari/605.1.15', + 'Mozilla/5.0 (Windows Mobile 10; Android 10.0; Microsoft; Lumia 950XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36 Edge/40.15254.603', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 12_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15', + 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', + 'Mozilla/5.0 (iPad; CPU OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', + 'Mozilla/5.0 (iPod touch; CPU iPhone 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1', ] const Tk = { - ac(input: string) { - const e = new TextEncoder().encode(input) - let f = 0 - let a = 0 - for (f = 0; f < e.length; f++) { - a += e[f] - a = Tk.yc(a, '+-a^+6') - } - a = Tk.yc(a, '+-3^+b+-f') - a ^= 0 - if (a < 0) { a = (a & 0x7FFFFFFF) + 0x80000000 } - a %= 1e6 - return `${a}.${a}` - }, - yc(a: number, b: string) { - for (let c = 0; c < b.length - 2; c += 3) { - const d = b[c + 2] - const number = d >= 'a' - // @ts-expect-error lol - ? d - 87 - : Number.parseInt(d) - const number2 = b[c + 1] === '+' - ? a >>> number - : a << number - a = b[c] === '+' - ? a + number2 & 0xFFFFFFFF - : a ^ number2 - } - return a - }, + ac(input: string) { + const e = new TextEncoder().encode(input) + let f = 0 + let a = 0 + for (f = 0; f < e.length; f++) { + a += e[f] + a = Tk.yc(a, '+-a^+6') + } + a = Tk.yc(a, '+-3^+b+-f') + a ^= 0 + if (a < 0) { a = (a & 0x7FFFFFFF) + 0x80000000 } + a %= 1e6 + return `${a}.${a}` + }, + yc(a: number, b: string) { + for (let c = 0; c < b.length - 2; c += 3) { + const d = b[c + 2] + const number = d >= 'a' + // @ts-expect-error lol + ? d - 87 + : Number.parseInt(d) + const number2 = b[c + 1] === '+' + ? a >>> number + : a << number + a = b[c] === '+' + ? a + number2 & 0xFFFFFFFF + : a ^ number2 + } + return a + }, } async function translate(text: string, fromLanguage: string, toLanguage: string) { - let json = null - const response = await fetch('https://translate.googleapis.com/translate_a/single?client=gtx&' - + `sl=${encodeURIComponent(fromLanguage)}&tl=${encodeURIComponent(toLanguage)}&dt=t&ie=UTF-8&` - + 'oe=UTF-8&otf=1&ssel=0&tsel=0&kc=7&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss' - + `&tk=${Tk.ac(text)}` - + '&source=input' - + `&q=${encodeURIComponent(text)}`, { - headers: { - 'User-Agent': randomPick(USER_AGENTS), - 'Content-Type': 'application/json', - }, - }) - if (!response.ok) { - throw new Error('Error while requesting translation') - } - const content = await response.text() - json = JSON.parse(content) + let json = null + const response = await fetch('https://translate.googleapis.com/translate_a/single?client=gtx&' + + `sl=${encodeURIComponent(fromLanguage)}&tl=${encodeURIComponent(toLanguage)}&dt=t&ie=UTF-8&` + + 'oe=UTF-8&otf=1&ssel=0&tsel=0&kc=7&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss' + + `&tk=${Tk.ac(text)}` + + '&source=input' + + `&q=${encodeURIComponent(text)}`, { + headers: { + 'User-Agent': randomPick(USER_AGENTS), + 'Content-Type': 'application/json', + }, + }) + if (!response.ok) { + throw new Error('Error while requesting translation') + } + const content = await response.text() + json = JSON.parse(content) - let sourceLanguage = null - sourceLanguage = json[2] - let result = '' + let sourceLanguage = null + sourceLanguage = json[2] + let result = '' - for (let i = 0; i < json[0]?.length; ++i) { - const block = json[0][i][0] - if (block == null) { continue } - const blockText = block.toString() - if (blockText !== 'null') { result += blockText } - } + for (let i = 0; i < json[0]?.length; ++i) { + const block = json[0][i][0] + if (block == null) { continue } + const blockText = block.toString() + if (blockText !== 'null') { result += blockText } + } - return { - sourceLanguage, - originalText: text, - translatedText: result, - } + return { + sourceLanguage, + originalText: text, + translatedText: result, + } } export async function translateChunked(text: string, fromLanguage: string, toLanguage: string) { - let result = '' - const chunks = text.match(/.{1,5000}/gs)! - const promises = [] + let result = '' + const chunks = text.match(/.{1,5000}/gs)! + const promises = [] - for (let i = 0; i < chunks.length; ++i) { - promises.push(translate(chunks[i], fromLanguage, toLanguage)) - } + for (let i = 0; i < chunks.length; ++i) { + promises.push(translate(chunks[i], fromLanguage, toLanguage)) + } - const results = await Promise.all(promises) - for (let i = 0; i < results.length; ++i) { - result += results[i].translatedText - } + const results = await Promise.all(promises) + for (let i = 0; i < results.length; ++i) { + result += results[i].translatedText + } - return { - sourceLanguage: results[0].sourceLanguage, - originalText: text, - translatedText: result, - } + return { + sourceLanguage: results[0].sourceLanguage, + originalText: text, + translatedText: result, + } } diff --git a/src/backend/service/last-seen/bsky.ts b/src/backend/service/last-seen/bsky.ts index cd122bd..cf88880 100644 --- a/src/backend/service/last-seen/bsky.ts +++ b/src/backend/service/last-seen/bsky.ts @@ -1,57 +1,57 @@ +import type { LastSeenItem } from './index.ts' import { AsyncResource } from '@fuman/utils' + import { z } from 'zod' import { ffetch } from '../../utils/fetch.ts' -import type { LastSeenItem } from './index.ts' - const ENDPOINT = 'https://public.api.bsky.app/xrpc/app.bsky.feed.getAuthorFeed' const TTL = 3 * 60 * 60 * 1000 // 3 hours const STALE_TTL = 8 * 60 * 60 * 1000 // 8 hours const schema = z.object({ - uri: z.string(), - record: z.object({ - text: z.string(), - createdAt: z.string(), - }), + uri: z.string(), + record: z.object({ + text: z.string(), + createdAt: z.string(), + }), }) export const bskyLastSeen = new AsyncResource({ - async fetcher() { - const res = await ffetch(ENDPOINT, { - query: { - actor: 'did:web:tei.su', - filter: 'posts_and_author_threads', - limit: 1, - }, - }).parsedJson(z.object({ - feed: z.array(z.object({ - post: schema, - })), - })) + async fetcher() { + const res = await ffetch(ENDPOINT, { + query: { + actor: 'did:web:tei.su', + filter: 'posts_and_author_threads', + limit: 1, + }, + }).parsedJson(z.object({ + feed: z.array(z.object({ + post: schema, + })), + })) - const post = res.feed[0].post + const post = res.feed[0].post - const postId = post.uri.match(/at:\/\/did:web:tei.su\/app\.bsky\.feed\.post\/([a-zA-Z0-9]+)/) - if (postId) { - return { - data: { - source: 'bsky', - sourceLink: 'https://bsky.app/profile/did:web:tei.su', - time: new Date(post.record.createdAt).getTime(), - text: post.record.text.slice(0, 40) || '[no text]', - link: `https://bsky.app/profile/did:web:tei.su/post/${postId[1]}`, - }, - expiresIn: TTL, - } - } + const postId = post.uri.match(/at:\/\/did:web:tei.su\/app\.bsky\.feed\.post\/([a-zA-Z0-9]+)/) + if (postId) { + return { + data: { + source: 'bsky', + sourceLink: 'https://bsky.app/profile/did:web:tei.su', + time: new Date(post.record.createdAt).getTime(), + text: post.record.text.slice(0, 40) || '[no text]', + link: `https://bsky.app/profile/did:web:tei.su/post/${postId[1]}`, + }, + expiresIn: TTL, + } + } - return { - data: null, - expiresIn: TTL, - } - }, - swr: true, - swrValidator: ({ currentFetchedAt }) => Date.now() - currentFetchedAt < STALE_TTL, + return { + data: null, + expiresIn: TTL, + } + }, + swr: true, + swrValidator: ({ currentFetchedAt }) => Date.now() - currentFetchedAt < STALE_TTL, }) diff --git a/src/backend/service/last-seen/forgejo.ts b/src/backend/service/last-seen/forgejo.ts index b8ad3aa..4fd8ada 100644 --- a/src/backend/service/last-seen/forgejo.ts +++ b/src/backend/service/last-seen/forgejo.ts @@ -1,80 +1,80 @@ +import type { LastSeenItem } from './index.ts' import { AsyncResource } from '@fuman/utils' + import { z } from 'zod' import { ffetch } from '../../utils/fetch.ts' -import type { LastSeenItem } from './index.ts' - const ENDPOINT = 'https://git.stupid.fish/api/v1/users/teidesu/activities/feeds?only-performed-by=true' const TTL = 1 * 60 * 60 * 1000 // 1 hour const STALE_TTL = 4 * 60 * 60 * 1000 // 4 hours const schema = z.object({ - id: z.number(), - // create_repo,rename_repo,star_repo,watch_repo,commit_repo,create_issue,create_pull_request,transfer_repo,push_tag,comment_issue, - // merge_pull_request,close_issue,reopen_issue,close_pull_request,reopen_pull_request,delete_tag,delete_branch,mirror_sync_push, - // mirror_sync_create,mirror_sync_delete,approve_pull_request,reject_pull_request,comment_pull,publish_release,pull_review_dismissed, - // pull_request_ready_for_review,auto_merge_pull_request - op_type: z.string(), - content: z.string(), - repo: z.object({ - full_name: z.string(), - html_url: z.string(), - }), - created: z.string(), + id: z.number(), + // create_repo,rename_repo,star_repo,watch_repo,commit_repo,create_issue,create_pull_request,transfer_repo,push_tag,comment_issue, + // merge_pull_request,close_issue,reopen_issue,close_pull_request,reopen_pull_request,delete_tag,delete_branch,mirror_sync_push, + // mirror_sync_create,mirror_sync_delete,approve_pull_request,reject_pull_request,comment_pull,publish_release,pull_review_dismissed, + // pull_request_ready_for_review,auto_merge_pull_request + op_type: z.string(), + content: z.string(), + repo: z.object({ + full_name: z.string(), + html_url: z.string(), + }), + created: z.string(), }) // {"Commits":[{"Sha1":"2ee71666823761350bd28a0db9ef9140cd3814cb","Message":"docs: fix docs config\n","AuthorEmail":"alina@tei.su","AuthorName":"alina sireneva","CommitterEmail":"alina@tei.su","CommitterName":"alina sireneva","Timestamp":"2025-01-03T22:42:30+03:00"}],"HeadCommit":{"Sha1":"2ee71666823761350bd28a0db9ef9140cd3814cb","Message":"docs: fix docs config\n","AuthorEmail":"alina@tei.su","AuthorName":"alina sireneva","CommitterEmail":"alina@tei.su","CommitterName":"alina sireneva","Timestamp":"2025-01-03T22:42:30+03:00"},"CompareURL":"teidesu/mtcute/compare/db9b083d3595e78240146e8a590fe70049259612...2ee71666823761350bd28a0db9ef9140cd3814cb","Len":1} const CommitEventSchema = z.object({ - Commits: z.array(z.object({ - Message: z.string(), - })), + Commits: z.array(z.object({ + Message: z.string(), + })), }) function mkItem(item: z.infer, text: string) { - return { - source: 'forgejo', - sourceLink: 'https://git.stupid.fish/teidesu', - time: new Date(item.created).getTime(), - text: item.repo.full_name, - link: item.repo.html_url, - suffix: `: ${text}`, - } + return { + source: 'forgejo', + sourceLink: 'https://git.stupid.fish/teidesu', + time: new Date(item.created).getTime(), + text: item.repo.full_name, + link: item.repo.html_url, + suffix: `: ${text}`, + } } export const forgejoLastSeen = new AsyncResource({ - async fetcher() { - const res = await ffetch(ENDPOINT).parsedJson(z.array(schema)) + async fetcher() { + const res = await ffetch(ENDPOINT).parsedJson(z.array(schema)) - // for simplicity (and lack of proper documentation) we'll just support a few common events and return the first supported one + // for simplicity (and lack of proper documentation) we'll just support a few common events and return the first supported one - let result: LastSeenItem | null = null + let result: LastSeenItem | null = null - for (const item of res) { - if (item.op_type === 'commit_repo') { - const commits = CommitEventSchema.parse(JSON.parse(item.content)).Commits + for (const item of res) { + if (item.op_type === 'commit_repo') { + const commits = CommitEventSchema.parse(JSON.parse(item.content)).Commits - result = mkItem( - item, - commits.length === 1 && commits[0].Message.length > 0 - ? `${commits[0].Message.slice(0, 40)}` - : `pushed ${commits.length} commits`, - ) - break - } else if (item.op_type === 'close_pull_request') { - result = mkItem(item, 'closed pull request') - break - } else if (item.op_type === 'merge_pull_request') { - result = mkItem(item, 'merged pull request') - break - } - } + result = mkItem( + item, + commits.length === 1 && commits[0].Message.length > 0 + ? `${commits[0].Message.slice(0, 40)}` + : `pushed ${commits.length} commits`, + ) + break + } else if (item.op_type === 'close_pull_request') { + result = mkItem(item, 'closed pull request') + break + } else if (item.op_type === 'merge_pull_request') { + result = mkItem(item, 'merged pull request') + break + } + } - return { - data: result, - expiresIn: TTL, - } - }, - swr: true, - swrValidator: ({ currentFetchedAt }) => Date.now() - currentFetchedAt < STALE_TTL, + return { + data: result, + expiresIn: TTL, + } + }, + swr: true, + swrValidator: ({ currentFetchedAt }) => Date.now() - currentFetchedAt < STALE_TTL, }) diff --git a/src/backend/service/last-seen/github.ts b/src/backend/service/last-seen/github.ts index 84afbd2..ed0c6d3 100644 --- a/src/backend/service/last-seen/github.ts +++ b/src/backend/service/last-seen/github.ts @@ -1,67 +1,67 @@ +import type { LastSeenItem } from './index.ts' import { AsyncResource } from '@fuman/utils' + import { z } from 'zod' import { ffetch } from '../../utils/fetch.ts' -import type { LastSeenItem } from './index.ts' - const ENDPOINT = 'https://api.github.com/users/teidesu/events/public?per_page=1' const TTL = 1 * 60 * 60 * 1000 // 1 hour const STALE_TTL = 4 * 60 * 60 * 1000 // 4 hours const schema = z.object({ - id: z.string(), - type: z.string(), - payload: z.any(), - repo: z.object({ name: z.string(), url: z.string() }), - public: z.boolean(), - created_at: z.string(), + id: z.string(), + type: z.string(), + payload: z.any(), + repo: z.object({ name: z.string(), url: z.string() }), + public: z.boolean(), + created_at: z.string(), }) export const githubLastSeen = new AsyncResource({ - async fetcher() { - const res = await ffetch(ENDPOINT, { - headers: { - 'User-Agent': 'tei.su/1.0', - 'X-GitHub-Api-Version': '2022-11-28', - }, - }).parsedJson(z.array(schema)) + async fetcher() { + const res = await ffetch(ENDPOINT, { + headers: { + 'User-Agent': 'tei.su/1.0', + 'X-GitHub-Api-Version': '2022-11-28', + }, + }).parsedJson(z.array(schema)) - const data = res[0] + const data = res[0] - const eventTextMapper: Record string> = { - CreateEvent: () => `${data.payload.ref_type} created`, - DeleteEvent: () => `${data.payload.ref_type} deleted`, - ForkEvent: () => 'forked', - GollumEvent: () => 'wiki updated', - IssueCommentEvent: () => `issue comment ${data.payload.action}`, - IssuesEvent: () => `issue ${data.payload.action}`, - PublicEvent: () => 'made public', - PullRequestEvent: () => `pr ${data.payload.action}`, - PushEvent: () => `pushed ${data.payload.distinct_size} commits`, - ReleaseEvent: () => `release ${data.payload.action}`, - WatchEvent: () => 'starred', - } + const eventTextMapper: Record string> = { + CreateEvent: () => `${data.payload.ref_type} created`, + DeleteEvent: () => `${data.payload.ref_type} deleted`, + ForkEvent: () => 'forked', + GollumEvent: () => 'wiki updated', + IssueCommentEvent: () => `issue comment ${data.payload.action}`, + IssuesEvent: () => `issue ${data.payload.action}`, + PublicEvent: () => 'made public', + PullRequestEvent: () => `pr ${data.payload.action}`, + PushEvent: () => `pushed ${data.payload.distinct_size} commits`, + ReleaseEvent: () => `release ${data.payload.action}`, + WatchEvent: () => 'starred', + } - if (eventTextMapper[data.type]) { - return { - data: { - source: 'github', - sourceLink: 'https://github.com/teidesu', - time: new Date(data.created_at).getTime(), - text: data.repo.name, - suffix: `: ${eventTextMapper[data.type]()}`, - link: `https://github.com/${data.repo.name}`, - }, - expiresIn: TTL, - } - } + if (eventTextMapper[data.type]) { + return { + data: { + source: 'github', + sourceLink: 'https://github.com/teidesu', + time: new Date(data.created_at).getTime(), + text: data.repo.name, + suffix: `: ${eventTextMapper[data.type]()}`, + link: `https://github.com/${data.repo.name}`, + }, + expiresIn: TTL, + } + } - return { - data: null, - expiresIn: TTL, - } - }, - swr: true, - swrValidator: ({ currentFetchedAt }) => Date.now() - currentFetchedAt < STALE_TTL, + return { + data: null, + expiresIn: TTL, + } + }, + swr: true, + swrValidator: ({ currentFetchedAt }) => Date.now() - currentFetchedAt < STALE_TTL, }) diff --git a/src/backend/service/last-seen/index.ts b/src/backend/service/last-seen/index.ts index 7c5954b..1097ec0 100644 --- a/src/backend/service/last-seen/index.ts +++ b/src/backend/service/last-seen/index.ts @@ -1,51 +1,51 @@ import { bskyLastSeen } from './bsky.ts' +import { forgejoLastSeen } from './forgejo.ts' import { githubLastSeen } from './github' import { lastfm } from './listenbrainz.ts' import { shikimoriLastSeen } from './shikimori' -import { forgejoLastSeen } from './forgejo.ts' export interface LastSeenItem { - source: string - sourceLink: string - time: number - text: string - suffix?: string - link: string + source: string + sourceLink: string + time: number + text: string + suffix?: string + link: string } export async function fetchLastSeen() { - const [ - lastfmData, - bskyData, - shikimoriData, - githubData, - forgejoData, - ] = await Promise.all([ - lastfm.get(), - bskyLastSeen.get(), - shikimoriLastSeen.get(), - githubLastSeen.get(), - forgejoLastSeen.get(), - ]) + const [ + lastfmData, + bskyData, + shikimoriData, + githubData, + forgejoData, + ] = await Promise.all([ + lastfm.get(), + bskyLastSeen.get(), + shikimoriLastSeen.get(), + githubLastSeen.get(), + forgejoLastSeen.get(), + ]) - const res: LastSeenItem[] = [] + const res: LastSeenItem[] = [] - if (lastfmData) res.push(lastfmData) - if (bskyData) res.push(bskyData) - if (shikimoriData) res.push(shikimoriData) + if (lastfmData) res.push(lastfmData) + if (bskyData) res.push(bskyData) + if (shikimoriData) res.push(shikimoriData) - if (githubData && forgejoData) { - // only push the last one - if (forgejoData.time > githubData.time) { - res.push(forgejoData) - } else { - res.push(githubData) - } - } else if (githubData) { - res.push(githubData) - } else if (forgejoData) { - res.push(forgejoData) + if (githubData && forgejoData) { + // only push the last one + if (forgejoData.time > githubData.time) { + res.push(forgejoData) + } else { + res.push(githubData) } + } else if (githubData) { + res.push(githubData) + } else if (forgejoData) { + res.push(forgejoData) + } - return res + return res } diff --git a/src/backend/service/last-seen/listenbrainz.ts b/src/backend/service/last-seen/listenbrainz.ts index 25456ce..08d3efa 100644 --- a/src/backend/service/last-seen/listenbrainz.ts +++ b/src/backend/service/last-seen/listenbrainz.ts @@ -1,71 +1,71 @@ -import { z } from 'zod' +import type { LastSeenItem } from './index.ts' import { AsyncResource } from '@fuman/utils' -import { ffetch } from '../../utils/fetch.ts' +import { z } from 'zod' -import type { LastSeenItem } from './index.ts' +import { ffetch } from '../../utils/fetch.ts' const LB_TTL = 1000 * 60 * 5 // 5 minutes const LB_STALE_TTL = 1000 * 60 * 60 // 1 hour const LB_USERNAME = 'teidumb' const LbListen = z.object({ - listened_at: z.number(), - track_metadata: z.object({ - artist_name: z.string(), - track_name: z.string(), - additional_info: z.object({ - origin_url: z.string().optional(), - }).optional(), - mbid_mapping: z.object({ - recording_mbid: z.string().optional(), - }).optional(), - }), + listened_at: z.number(), + track_metadata: z.object({ + artist_name: z.string(), + track_name: z.string(), + additional_info: z.object({ + origin_url: z.string().optional(), + }).optional(), + mbid_mapping: z.object({ + recording_mbid: z.string().optional(), + }).optional(), + }), }) const ResponseSchema = z.object({ - payload: z.object({ - listens: z.array(LbListen), - }), + payload: z.object({ + listens: z.array(LbListen), + }), }) export const lastfm = new AsyncResource({ - async fetcher({ current }) { - const res = await ffetch(`https://api.listenbrainz.org/1/user/${LB_USERNAME}/listens`, { - query: { - count: 1, - min_ts: current ? Math.floor(current.time / 1000) : '', - }, - }).parsedJson(ResponseSchema) + async fetcher({ current }) { + const res = await ffetch(`https://api.listenbrainz.org/1/user/${LB_USERNAME}/listens`, { + query: { + count: 1, + min_ts: current ? Math.floor(current.time / 1000) : '', + }, + }).parsedJson(ResponseSchema) - if (!res.payload.listens.length) { - return { - data: current, - expiresIn: 0, - } - } + if (!res.payload.listens.length) { + return { + data: current, + expiresIn: 0, + } + } - const listen = res.payload.listens[0] + const listen = res.payload.listens[0] - let url: string | undefined - if (listen.track_metadata.mbid_mapping?.recording_mbid) { - url = `https://musicbrainz.org/recording/${listen.track_metadata.mbid_mapping.recording_mbid}` - } else if (listen.track_metadata.additional_info?.origin_url) { - url = listen.track_metadata.additional_info.origin_url - } else { - url = 'https://listenbrainz.org/user/teidumb/' - } - return { - data: { - source: 'listenbrainz', - sourceLink: 'https://listenbrainz.org/user/teidumb/', - time: listen.listened_at * 1000, - text: `${listen.track_metadata.track_name} – ${listen.track_metadata.artist_name}`, - link: url, - }, - expiresIn: LB_TTL, - } - }, - swr: true, - swrValidator: ({ currentExpiresAt }) => Date.now() - currentExpiresAt < LB_STALE_TTL, + let url: string | undefined + if (listen.track_metadata.mbid_mapping?.recording_mbid) { + url = `https://musicbrainz.org/recording/${listen.track_metadata.mbid_mapping.recording_mbid}` + } else if (listen.track_metadata.additional_info?.origin_url) { + url = listen.track_metadata.additional_info.origin_url + } else { + url = 'https://listenbrainz.org/user/teidumb/' + } + return { + data: { + source: 'listenbrainz', + sourceLink: 'https://listenbrainz.org/user/teidumb/', + time: listen.listened_at * 1000, + text: `${listen.track_metadata.track_name} – ${listen.track_metadata.artist_name}`, + link: url, + }, + expiresIn: LB_TTL, + } + }, + swr: true, + swrValidator: ({ currentExpiresAt }) => Date.now() - currentExpiresAt < LB_STALE_TTL, }) diff --git a/src/backend/service/last-seen/shikimori.ts b/src/backend/service/last-seen/shikimori.ts index d5bc308..e6b335e 100644 --- a/src/backend/service/last-seen/shikimori.ts +++ b/src/backend/service/last-seen/shikimori.ts @@ -1,63 +1,63 @@ +import type { LastSeenItem } from './index.ts' import { AsyncResource } from '@fuman/utils' + import { z } from 'zod' import { ffetch } from '../../utils/fetch.ts' -import type { LastSeenItem } from './index.ts' - const ENDPOINT = 'https://shikimori.one/api/users/698215/history?limit=1' const TTL = 3 * 60 * 60 * 1000 // 3 hours const STALE_TTL = 8 * 60 * 60 * 1000 // 8 hours const schema = z.object({ - created_at: z.string(), - description: z.string(), - target: z.object({ - name: z.string(), - url: z.string(), - }), + created_at: z.string(), + description: z.string(), + target: z.object({ + name: z.string(), + url: z.string(), + }), }) export const shikimoriLastSeen = new AsyncResource({ - async fetcher() { - const res = (await ffetch(ENDPOINT).parsedJson(z.array(schema)))[0] + async fetcher() { + const res = (await ffetch(ENDPOINT).parsedJson(z.array(schema)))[0] - // thx morr for this fucking awesome api + // thx morr for this fucking awesome api - const mapper: Record = { - 'Просмотрено': 'completed', - 'Прочитано': 'completed', - 'Добавлено в список': 'added', - 'Брошено': 'dropped', - } - let event = mapper[res.description] + const mapper: Record = { + 'Просмотрено': 'completed', + 'Прочитано': 'completed', + 'Добавлено в список': 'added', + 'Брошено': 'dropped', + } + let event = mapper[res.description] - if (!event && res.description.match(/^Просмотрен.*эпизод(ов)?$/)) { - event = 'watched' - } - if (!event && res.description.match(/^(Просмотрено|Прочитано) и оценено/)) { - event = 'completed' - } + if (!event && res.description.match(/^Просмотрен.*эпизод(ов)?$/)) { + event = 'watched' + } + if (!event && res.description.match(/^(Просмотрено|Прочитано) и оценено/)) { + event = 'completed' + } - if (event) { - return { - data: { - source: 'shiki', - sourceLink: 'https://shikimori.one/teidesu', - time: new Date(res.created_at).getTime(), - text: res.target.name, - suffix: `: ${event}`, - link: `https://shikimori.one${res.target.url}`, - }, - expiresIn: TTL, - } - } + if (event) { + return { + data: { + source: 'shiki', + sourceLink: 'https://shikimori.one/teidesu', + time: new Date(res.created_at).getTime(), + text: res.target.name, + suffix: `: ${event}`, + link: `https://shikimori.one${res.target.url}`, + }, + expiresIn: TTL, + } + } - return { - data: null, - expiresIn: TTL, - } - }, - swr: true, - swrValidator: ({ currentFetchedAt }) => Date.now() - currentFetchedAt < STALE_TTL, + return { + data: null, + expiresIn: TTL, + } + }, + swr: true, + swrValidator: ({ currentFetchedAt }) => Date.now() - currentFetchedAt < STALE_TTL, }) diff --git a/src/backend/service/shoutbox.ts b/src/backend/service/shoutbox.ts index 4b106f3..1ac77c8 100644 --- a/src/backend/service/shoutbox.ts +++ b/src/backend/service/shoutbox.ts @@ -1,197 +1,189 @@ import { BotKeyboard, html } from '@mtcute/node' import { and, desc, eq, gt, not, or, sql } from 'drizzle-orm' +import { tg } from '../bot' import { ShoutboxAction } from '../bot/shoutbox.js' -import { shouts, shoutsBans } from '../models/index.js' -import { URL_REGEX } from '../utils/url.js' import { db } from '../db' import { env } from '../env' -import { tg } from '../bot' +import { shouts, shoutsBans } from '../models/index.js' +import { URL_REGEX } from '../utils/url.js' const SHOUTS_PER_PAGE = 5 const filter = or( - not(shouts.pending), - and(shouts.pending, eq(shouts.fromIp, sql.placeholder('fromIp'))), + not(shouts.pending), + and(shouts.pending, eq(shouts.fromIp, sql.placeholder('fromIp'))), ) const fetchTotal = db.select({ - count: sql`count(1)`, -}).from(shouts) - .where(filter) - .prepare() + count: sql`count(1)`, +}).from(shouts).where(filter).prepare() const fetchList = db.select({ - createdAt: shouts.createdAt, - text: shouts.text, - pending: shouts.pending, - serial: shouts.serial, - reply: shouts.reply, -}).from(shouts) - .where(filter) - .limit(SHOUTS_PER_PAGE) - .orderBy(desc(shouts.createdAt)) - .offset(sql.placeholder('offset')) - .prepare() + createdAt: shouts.createdAt, + text: shouts.text, + pending: shouts.pending, + serial: shouts.serial, + reply: shouts.reply, +}).from(shouts).where(filter).limit(SHOUTS_PER_PAGE).orderBy(desc(shouts.createdAt)).offset(sql.placeholder('offset')).prepare() export function fetchShouts(page: number, ip: string) { - return { - items: fetchList.all({ - offset: page * SHOUTS_PER_PAGE, - fromIp: ip, - }), - pageCount: Math.ceil((fetchTotal.get({ - fromIp: ip, - })?.count ?? 0) / SHOUTS_PER_PAGE), - } + return { + items: fetchList.all({ + offset: page * SHOUTS_PER_PAGE, + fromIp: ip, + }), + pageCount: Math.ceil((fetchTotal.get({ + fromIp: ip, + })?.count ?? 0) / SHOUTS_PER_PAGE), + } } export type ShoutsData = ReturnType const fetchNextSerial = db.select({ - serial: sql`coalesce(max(serial), 0) + 1`, -}).from(shouts) - .prepare() + serial: sql`coalesce(max(serial), 0) + 1`, +}).from(shouts).prepare() export function approveShout(id: string) { - const nextSerial = fetchNextSerial.get({})!.serial + const nextSerial = fetchNextSerial.get({})!.serial - db.update(shouts) - .set({ pending: false, serial: nextSerial }) - .where(eq(shouts.id, id)) - .run() + db.update(shouts) + .set({ pending: false, serial: nextSerial }) + .where(eq(shouts.id, id)) + .run() - return nextSerial + return nextSerial } export function declineShout(id: string) { - db.delete(shouts) - .where(eq(shouts.id, id)) - .run() + db.delete(shouts) + .where(eq(shouts.id, id)) + .run() } export function deleteBySerial(serial: number) { - db.delete(shouts) - .where(eq(shouts.serial, serial)) - .run() - // adjust serials - db.update(shouts) - .set({ serial: sql`serial - 1` }) - .where(and( - eq(shouts.pending, false), - gt(shouts.serial, sql.placeholder('serial')), - )) - .run({ serial }) + db.delete(shouts) + .where(eq(shouts.serial, serial)) + .run() + // adjust serials + db.update(shouts) + .set({ serial: sql`serial - 1` }) + .where(and( + eq(shouts.pending, false), + gt(shouts.serial, sql.placeholder('serial')), + )) + .run({ serial }) } export function answerBySerial(serial: number, reply: string) { - db.update(shouts) - .set({ reply }) - .where(eq(shouts.serial, serial)) - .execute() + db.update(shouts) + .set({ reply }) + .where(eq(shouts.serial, serial)) + .execute() } export function banShouts(ip: string, expires: number) { - db.insert(shoutsBans) - .values({ - ip, - expires, - }) - .onConflictDoUpdate({ - target: shoutsBans.ip, - set: { expires }, - }) - .execute() + db.insert(shoutsBans) + .values({ + ip, + expires, + }) + .onConflictDoUpdate({ + target: shoutsBans.ip, + set: { expires }, + }) + .execute() } export function unbanShouts(ip: string) { - db.delete(shoutsBans) - .where(eq(shoutsBans.ip, ip)) - .execute() + db.delete(shoutsBans) + .where(eq(shoutsBans.ip, ip)) + .execute() } export function isShoutboxBanned(ip: string): Date | null { - const ban = db.select() - .from(shoutsBans) - .where(eq(shoutsBans.ip, ip)) - .get() - if (!ban) return null + const ban = db.select() + .from(shoutsBans) + .where(eq(shoutsBans.ip, ip)) + .get() + if (!ban) return null - const expires = ban.expires - if (Date.now() > expires) return null - return new Date(ban.expires) + const expires = ban.expires + if (Date.now() > expires) return null + return new Date(ban.expires) } function validateShout(text: string, isPublic: boolean) { - if (text.length < 3) { - return 'too short, come on' + if (text.length < 3) { + return 'too short, come on' + } + + if (text.length > 300) { + return 'please keep it under 300 characters' + } + + if (isPublic) { + const lineCount = text.split('\n').length + if (lineCount > 5) { + return 'too many lines, keep it under 5' } - if (text.length > 300) { - return 'please keep it under 300 characters' + if (URL_REGEX.test(text)) { + return 'no links plz' } + } - if (isPublic) { - const lineCount = text.split('\n').length - if (lineCount > 5) { - return 'too many lines, keep it under 5' - } - - if (URL_REGEX.test(text)) { - return 'no links plz' - } - } - - return true + return true } export async function createShout(params: { - fromIp: string - private: boolean - text: string + fromIp: string + private: boolean + text: string }): Promise { - let { text } = params + let { text } = params - text = text.trim() + text = text.trim() - const validateResult = validateShout(text, !params.private) + const validateResult = validateShout(text, !params.private) - const header = html`${params.private ? 'private message' : 'shout'} from ${params.fromIp}` - const subheader = html`
via: #api

` + const header = html`${params.private ? 'private message' : 'shout'} from ${params.fromIp}` + const subheader = html`
via: #api

` - if (params.private || validateResult !== true) { - const was = params.private ? '' : ` was auto-declined (${validateResult})` - await tg.sendText( - env.TG_CHAT_ID, - html` + if (params.private || validateResult !== true) { + const was = params.private ? '' : ` was auto-declined (${validateResult})` + await tg.sendText( + env.TG_CHAT_ID, + html` ${header}${was}: ${subheader} ${text} `, - ) - } + ) + } - if (!params.private && validateResult === true) { - const result = await db.insert(shouts) - .values(params) - .returning({ id: shouts.id }) - .execute() - const id = result[0].id + if (!params.private && validateResult === true) { + const result = await db.insert(shouts) + .values(params) + .returning({ id: shouts.id }) + .execute() + const id = result[0].id - await tg.sendText( - env.TG_CHAT_ID, - html` + await tg.sendText( + env.TG_CHAT_ID, + html` ${header}: ${subheader} ${text} `, - { - replyMarkup: BotKeyboard.inline([[ - BotKeyboard.callback('✅ approve', ShoutboxAction.build({ id, action: 'approve' })), - BotKeyboard.callback('❌ decline', ShoutboxAction.build({ id, action: 'decline' })), - ]]), - }, - ) - } + { + replyMarkup: BotKeyboard.inline([[ + BotKeyboard.callback('✅ approve', ShoutboxAction.build({ id, action: 'approve' })), + BotKeyboard.callback('❌ decline', ShoutboxAction.build({ id, action: 'decline' })), + ]]), + }, + ) + } - return validateResult + return validateResult } diff --git a/src/backend/service/umami.ts b/src/backend/service/umami.ts index b1845d7..4a133d3 100644 --- a/src/backend/service/umami.ts +++ b/src/backend/service/umami.ts @@ -2,64 +2,64 @@ import { ffetchAddons, ffetchBase } from '@fuman/fetch' import { ffetchZodAdapter } from '@fuman/fetch/zod' import { z } from 'zod' -import { isBotUserAgent } from '../utils/bot' import { env } from '~/backend/env' +import { isBotUserAgent } from '../utils/bot' const ffetch = ffetchBase.extend({ - addons: [ - ffetchAddons.parser(ffetchZodAdapter()), - ffetchAddons.timeout(), - ], - baseUrl: env.UMAMI_HOST, - timeout: 1000, + addons: [ + ffetchAddons.parser(ffetchZodAdapter()), + ffetchAddons.timeout(), + ], + baseUrl: env.UMAMI_HOST, + timeout: 1000, }) export async function umamiFetchStats(page: string, startAt: number) { - if (import.meta.env.DEV) { - return Promise.resolve({ visitors: { value: 1337 } }) - } + if (import.meta.env.DEV) { + return Promise.resolve({ visitors: { value: 1337 } }) + } - return await ffetch(`/api/websites/${env.UMAMI_SITE_ID}/stats`, { - query: { - endAt: Math.floor(Date.now()).toString(), - startAt: startAt.toString(), - url: page, - }, - headers: { - Authorization: `Bearer ${env.UMAMI_TOKEN}`, - }, - }).parsedJson(z.object({ - visitors: z.object({ - value: z.number(), - }), - })) + return await ffetch(`/api/websites/${env.UMAMI_SITE_ID}/stats`, { + query: { + endAt: Math.floor(Date.now()).toString(), + startAt: startAt.toString(), + url: page, + }, + headers: { + Authorization: `Bearer ${env.UMAMI_TOKEN}`, + }, + }).parsedJson(z.object({ + visitors: z.object({ + value: z.number(), + }), + })) } export function umamiLogThisVisit(request: Request, path?: string, website = env.UMAMI_SITE_ID): void { - if (import.meta.env.DEV) return - if (isBotUserAgent(request.headers.get('user-agent') || '')) return - const language = request.headers.get('accept-language')?.split(';')[0].split(',')[0] || '' + if (import.meta.env.DEV) return + if (isBotUserAgent(request.headers.get('user-agent') || '')) return + const language = request.headers.get('accept-language')?.split(';')[0].split(',')[0] || '' - ffetch.post('/api/send', { - json: { - payload: { - hostname: request.headers.get('host') || '', - language, - referrer: request.headers.get('referer') || '', - screen: '', - title: '', - url: path ?? new URL(request.url).pathname, - website, - }, - type: 'event', - }, - headers: { - 'User-Agent': request.headers.get('user-agent') || '', - 'X-Forwarded-For': request.headers.get('x-forwarded-for')?.[0] || '', - }, - }).then(async (r) => { - if (!r.ok) throw new Error(`failed to log visit: ${r.status} ${await r.text()}`) - }).catch((err) => { - console.warn(err) - }) + ffetch.post('/api/send', { + json: { + payload: { + hostname: request.headers.get('host') || '', + language, + referrer: request.headers.get('referer') || '', + screen: '', + title: '', + url: path ?? new URL(request.url).pathname, + website, + }, + type: 'event', + }, + headers: { + 'User-Agent': request.headers.get('user-agent') || '', + 'X-Forwarded-For': request.headers.get('x-forwarded-for')?.[0] || '', + }, + }).then(async (r) => { + if (!r.ok) throw new Error(`failed to log visit: ${r.status} ${await r.text()}`) + }).catch((err) => { + console.warn(err) + }) } diff --git a/src/backend/service/webring.ts b/src/backend/service/webring.ts index 6dd70b4..55537c0 100644 --- a/src/backend/service/webring.ts +++ b/src/backend/service/webring.ts @@ -7,26 +7,26 @@ const WEBRING_URL = 'https://otomir23.me/webring/5/data' const WEBRING_TTL = 1000 * 60 * 60 * 24 // 24 hours const WebringItem = z.object({ - id: z.number(), - name: z.string(), - url: z.string(), + id: z.number(), + name: z.string(), + url: z.string(), }) export type WebringItem = z.infer const WebringData = z.object({ - prev: WebringItem, - next: WebringItem, + prev: WebringItem, + next: WebringItem, }) export type WebringData = z.infer export const webring = new AsyncResource({ - fetcher: async () => { - const res = await ffetch(WEBRING_URL).parsedJson(WebringData) + fetcher: async () => { + const res = await ffetch(WEBRING_URL).parsedJson(WebringData) - return { - data: res, - expiresIn: WEBRING_TTL, - } - }, - swr: true, + return { + data: res, + expiresIn: WEBRING_TTL, + } + }, + swr: true, }) diff --git a/src/backend/utils/bot.ts b/src/backend/utils/bot.ts index b66bf1e..0524fc5 100644 --- a/src/backend/utils/bot.ts +++ b/src/backend/utils/bot.ts @@ -1,3 +1,3 @@ export function isBotUserAgent(userAgent: string) { - return /bot|crawl|slurp|spider|mediapartners|mastodon|akkoma|pleroma|misskey|firefish|sharkey/i.test(userAgent) + return /bot|crawl|slurp|spider|mediapartners|mastodon|akkoma|pleroma|misskey|firefish|sharkey/i.test(userAgent) } diff --git a/src/backend/utils/csrf.ts b/src/backend/utils/csrf.ts index 4f61ef4..1083bbe 100644 --- a/src/backend/utils/csrf.ts +++ b/src/backend/utils/csrf.ts @@ -8,35 +8,35 @@ const secret = env.CSRF_SECRET const validity = 300_000 export function getCsrfToken(ip: string) { - const data = utf8.encoder.encode(JSON.stringify([Date.now(), ip])) - const salt = randomBytes(8) as Uint8Array - const sign = createHmac('sha256', secret).update(data).update(salt).digest() + const data = utf8.encoder.encode(JSON.stringify([Date.now(), ip])) + const salt = randomBytes(8) as Uint8Array + const sign = createHmac('sha256', secret).update(data).update(salt).digest() - return base64.encode(u8.concat3( - data, - salt, - sign.subarray(0, 8), - ), true) + return base64.encode(u8.concat3( + data, + salt, + sign.subarray(0, 8), + ), true) } export function verifyCsrfToken(ip: string, token: string) { - try { - const buf = base64.decode(token, true) - if (buf.length < 16) return false + try { + const buf = base64.decode(token, true) + if (buf.length < 16) return false - const saltedData = buf.subarray(0, -8) - const correctSign = createHmac('sha256', secret).update(saltedData).digest() + const saltedData = buf.subarray(0, -8) + const correctSign = createHmac('sha256', secret).update(saltedData).digest() - if (!typed.equal(correctSign.subarray(0, 8) as Uint8Array, buf.subarray(-8))) { - return false - } - - const [issued, correctIp] = JSON.parse(buf.subarray(0, -16).toString()) - if (issued + validity < Date.now()) return false - if (ip !== correctIp) return false - - return true - } catch { - return false + if (!typed.equal(new Uint8Array(correctSign.subarray(0, 8)), buf.subarray(-8))) { + return false } + + const [issued, correctIp] = JSON.parse(utf8.decoder.decode(buf.subarray(0, -16))) + if (issued + validity < Date.now()) return false + if (ip !== correctIp) return false + + return true + } catch { + return false + } } diff --git a/src/backend/utils/fetch.ts b/src/backend/utils/fetch.ts index 57f080c..99cc910 100644 --- a/src/backend/utils/fetch.ts +++ b/src/backend/utils/fetch.ts @@ -2,11 +2,11 @@ import { ffetchAddons, ffetchBase } from '@fuman/fetch' import { ffetchZodAdapter } from '@fuman/fetch/zod' export const ffetch = ffetchBase.extend({ - addons: [ - ffetchAddons.parser(ffetchZodAdapter()), - ffetchAddons.retry(), - ], - headers: { - 'User-Agent': 'tei.su/1.0', - }, + addons: [ + ffetchAddons.parser(ffetchZodAdapter()), + ffetchAddons.retry(), + ], + headers: { + 'User-Agent': 'tei.su/1.0', + }, }) diff --git a/src/backend/utils/obfuscate-email.ts b/src/backend/utils/obfuscate-email.ts index e42f046..0ca648f 100644 --- a/src/backend/utils/obfuscate-email.ts +++ b/src/backend/utils/obfuscate-email.ts @@ -1,14 +1,14 @@ import { randomPick } from '../../utils/random' export function obfuscateEmail(email: string) { - const opener = randomPick(['[', '{', '(', '<', '|']) - const closer = { - '(': ')', - '[': ']', - '{': '}', - '<': '>', - '|': '|', - }[opener] + const opener = randomPick(['[', '{', '(', '<', '|']) + const closer = { + '(': ')', + '[': ']', + '{': '}', + '<': '>', + '|': '|', + }[opener] - return email.replace(/@/g, ` ${opener}at${closer} `).replace(/\./g, ` ${opener}dot${closer} `) + return email.replace(/@/g, ` ${opener}at${closer} `).replace(/\./g, ` ${opener}dot${closer} `) } diff --git a/src/backend/utils/request.ts b/src/backend/utils/request.ts index 00b5de1..d408bbc 100644 --- a/src/backend/utils/request.ts +++ b/src/backend/utils/request.ts @@ -1,8 +1,8 @@ import type { APIContext, AstroGlobal } from 'astro' export function getRequestIp(ctx: AstroGlobal | APIContext) { - const xForwardedFor = ctx.request.headers.get('x-forwarded-for') - if (xForwardedFor) return xForwardedFor.split(',')[0] + const xForwardedFor = ctx.request.headers.get('x-forwarded-for') + if (xForwardedFor) return xForwardedFor.split(',')[0] - return ctx.clientAddress + return ctx.clientAddress } diff --git a/src/backend/utils/response.ts b/src/backend/utils/response.ts index da689ea..7828c3e 100644 --- a/src/backend/utils/response.ts +++ b/src/backend/utils/response.ts @@ -1,28 +1,28 @@ export class HttpResponse { - private constructor() {} + private constructor() {} - static json(body: unknown, init?: ResponseInit) { - return new Response(JSON.stringify(body), { - ...init, - headers: { - 'Content-Type': 'application/json', - ...init?.headers, - }, - }) - } + static json(body: unknown, init?: ResponseInit) { + return new Response(JSON.stringify(body), { + ...init, + headers: { + 'Content-Type': 'application/json', + ...init?.headers, + }, + }) + } - static error(status: number) { - return new Response(null, { status }) - } + static error(status: number) { + return new Response(null, { status }) + } - static redirect(url: string, init?: ResponseInit) { - return new Response(null, { - status: 301, - ...init, - headers: { - Location: url, - ...init?.headers, - }, - }) - } + static redirect(url: string, init?: ResponseInit) { + return new Response(null, { + status: 301, + ...init, + headers: { + Location: url, + ...init?.headers, + }, + }) + } } diff --git a/src/backend/utils/url.ts b/src/backend/utils/url.ts index 0be3aaf..421957a 100644 --- a/src/backend/utils/url.ts +++ b/src/backend/utils/url.ts @@ -1454,13 +1454,13 @@ ZW const TLD_LIST = new Set(TLD_LIST_IANA.trim().split('\n')) for (const tld of TLD_LIST) { - if (tld.startsWith('XN--')) { - // also add the non-punycode version - TLD_LIST.add(domainToUnicode(tld)) - } + if (tld.startsWith('XN--')) { + // also add the non-punycode version + TLD_LIST.add(domainToUnicode(tld)) + } } export const URL_REGEX = new RegExp( - `(https?://)?([a-z0-9-]+\\.)+(${[...TLD_LIST].join('|')})(/[a-z0-9-._~:/?#[\\]@!$&'()*+,;=]*)?`, - 'i', + `(https?://)?([a-z0-9-]+\\.)+(${[...TLD_LIST].join('|')})(/[a-z0-9-._~:/?#[\\]@!$&'()*+,;=]*)?`, + 'i', ) diff --git a/src/components/interactive/RandomWord.tsx b/src/components/interactive/RandomWord.tsx new file mode 100644 index 0000000..83820df --- /dev/null +++ b/src/components/interactive/RandomWord.tsx @@ -0,0 +1,39 @@ +/** @jsxImportSource solid-js */ + +import type { JSX } from 'solid-js/jsx-runtime' +import { createSignal } from 'solid-js' + +import { shuffle } from '~/utils/random' + +export interface RandomWordProps { + choices: JSX.Element[] +} + +export function RandomWord(props: RandomWordProps) { + const [choice, setChoice] = createSignal() + let order: JSX.Element[] = [] + + function pickNew() { + if (order.length === 0) { + order = shuffle(props.choices) + } + + setChoice(order.pop()) + } + + function onClick(evt: MouseEvent) { + evt.preventDefault() + pickNew() + } + + pickNew() + + return ( +
+ {choice()} +
+ ) +} diff --git a/src/components/interactive/RandomWord/RandomWord.module.css b/src/components/interactive/RandomWord/RandomWord.module.css deleted file mode 100644 index e20d5d6..0000000 --- a/src/components/interactive/RandomWord/RandomWord.module.css +++ /dev/null @@ -1,12 +0,0 @@ -.choice { - cursor: pointer; - display: inline-block; - position: relative; - text-decoration: underline dotted; - transition: opacity 200ms, transform 200ms; - - /* prevent text selection on 2/3-ple click */ - &:active { - user-select: none; - } -} diff --git a/src/components/interactive/RandomWord/RandomWord.tsx b/src/components/interactive/RandomWord/RandomWord.tsx deleted file mode 100644 index bc44c59..0000000 --- a/src/components/interactive/RandomWord/RandomWord.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/** @jsxImportSource solid-js */ - -import type { JSX } from 'solid-js/jsx-runtime' -import { createSignal } from 'solid-js' - -import { shuffle } from '~/utils/random' - -import css from './RandomWord.module.css' - -export interface RandomWordProps { - choices: JSX.Element[] -} - -export function RandomWord(props: RandomWordProps) { - const [choice, setChoice] = createSignal() - let order: JSX.Element[] = [] - - function pickNew() { - if (order.length === 0) { - order = shuffle(props.choices) - } - - setChoice(order.pop()) - } - - function onClick(evt: MouseEvent) { - evt.preventDefault() - pickNew() - } - - pickNew() - - return ( -
- {choice()} -
- ) -} diff --git a/src/components/pages/PageDonate/PageDonate.astro b/src/components/pages/PageDonate/PageDonate.astro index 74576a6..d99dcf7 100644 --- a/src/components/pages/PageDonate/PageDonate.astro +++ b/src/components/pages/PageDonate/PageDonate.astro @@ -1,10 +1,10 @@ --- -import DefaultLayout from '~/layouts/DefaultLayout/DefaultLayout.astro' -import { umamiLogThisVisit } from '~/backend/service/umami' import moneyImg from '~/assets/money.jpg' +import { umamiLogThisVisit } from '~/backend/service/umami' +import DefaultLayout from '~/layouts/DefaultLayout/DefaultLayout.astro' -import { PageDonate as PageDonateSolid, PaymentMethods } from './PageDonate' import { fetchDonatePageData } from './data' +import { PageDonate as PageDonateSolid, PaymentMethods } from './PageDonate' umamiLogThisVisit(Astro.request, '/donate') @@ -12,7 +12,7 @@ const data = await fetchDonatePageData(Astro.request) --- donate.txt', description: 'i would be extremely pleased if you sent me some money ❤️', image: moneyImg.src, diff --git a/src/components/pages/PageDonate/PageDonate.tsx b/src/components/pages/PageDonate/PageDonate.tsx index 7b9f18d..fb4ccac 100644 --- a/src/components/pages/PageDonate/PageDonate.tsx +++ b/src/components/pages/PageDonate/PageDonate.tsx @@ -1,96 +1,96 @@ /** @jsxImportSource solid-js */ -import { type JSX, createSignal, onMount } from 'solid-js' - -import { Link } from '~/components/ui/Link/Link' -import { SectionTitle } from '~/components/ui/SectionTitle/SectionTitle' -import { TextTable } from '~/components/ui/TextTable/TextTable' +import type { PaymentMethod } from './constants' import type { PageData } from './data' -import type { PaymentMethod } from './constants' +import { createSignal, type JSX, onMount } from 'solid-js' + +import { Link } from '../../ui/Link.tsx' +import { SectionTitle } from '../../ui/Section.tsx' +import { TextTable } from '../../ui/TextTable.tsx' import { deriveKey, dumbHash, xorContinuous } from './crypto-common' export function PaymentMethods(props: { data: PageData }) { - const [items, setItems] = createSignal( - // eslint-disable-next-line solid/reactivity - props.data.encryptedData.map(it => ({ - link: undefined, - name: it.name, - text: '[encrypted]', - })), - ) + const [items, setItems] = createSignal( + // eslint-disable-next-line solid/reactivity + props.data.encryptedData.map(it => ({ + link: undefined, + name: it.name, + text: '[encrypted]', + })), + ) - onMount(() => { - // force client-side - const key = deriveKey(navigator.userAgent, location.href, props.data.salt) - const keyHash = dumbHash(key) - const xor = [0] + onMount(() => { + // force client-side + const key = deriveKey(navigator.userAgent, location.href, props.data.salt) + const keyHash = dumbHash(key) + const xor = [0] - const probeDec = xorContinuous(keyHash, props.data.probeEnc, xor) - if (probeDec !== props.data.probe) { - console.error(`Probe mismatch (expected: ${props.data.probe}, got: ${probeDec})`) - return - } + const probeDec = xorContinuous(keyHash, props.data.probeEnc, xor) + if (probeDec !== props.data.probe) { + console.error(`Probe mismatch (expected: ${props.data.probe}, got: ${probeDec})`) + return + } - setItems(props.data.encryptedData.map(it => ({ - link: it.link ? xorContinuous(keyHash, it.link!, xor) : undefined, - name: it.name, - text: xorContinuous(keyHash, it.text, xor), - }))) - }) + setItems(props.data.encryptedData.map(it => ({ + link: it.link ? xorContinuous(keyHash, it.link!, xor) : undefined, + name: it.name, + text: xorContinuous(keyHash, it.text, xor), + }))) + }) - const itemsToRender = () => items().map(it => ({ - name: it.name, - value: () => it.link - ? {it.text} - : it.text, - })) + const itemsToRender = () => items().map(it => ({ + name: it.name, + value: () => it.link + ? {it.text} + : it.text, + })) - return ( - - ) + return ( + + ) } export function PageDonate(props: { methods?: JSX.Element, data: PageData }) { - return ( - <> -
heya
+ return ( + <> +
heya
-
- i'm not really struggling with money, but if you like what i do and want to support me — i - would totally appreciate it <3 -
+
+ i'm not really struggling with money, but if you like what i do and want to support me — i + would totally appreciate it <3 +
-
when donating crypto, please use stablecoins (usdt/dai) or native token
+
when donating crypto, please use stablecoins (usdt/dai) or native token
-
- my payment addresses (in order of preference): +
+ my payment addresses (in order of preference): - {props.methods} -
+ {props.methods} +
- + -
- total page views so far: - {' '} - {props.data.pageViews} -
- - ) +
+ total page views so far: + {' '} + {props.data.pageViews} +
+ + ) } diff --git a/src/components/pages/PageDonate/constants.ts b/src/components/pages/PageDonate/constants.ts index 8196fc8..67e3072 100644 --- a/src/components/pages/PageDonate/constants.ts +++ b/src/components/pages/PageDonate/constants.ts @@ -1,9 +1,9 @@ import data from './data.json' with { type: 'json' } export interface PaymentMethod { - link?: string - name: string - text: string + link?: string + name: string + text: string } export const PAYMENT_METHODS = data as PaymentMethod[] diff --git a/src/components/pages/PageDonate/crypto-common.ts b/src/components/pages/PageDonate/crypto-common.ts index a48c9a7..764e67b 100644 --- a/src/components/pages/PageDonate/crypto-common.ts +++ b/src/components/pages/PageDonate/crypto-common.ts @@ -1,34 +1,34 @@ const ascii = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' export function dumbHash(str: string) { - let hash = 0 - const len = str.length - for (let s = 0; s < len; s++) { - hash += str.charCodeAt(s) * (s + 1) * (len - s) - } - hash >>>= 0 + let hash = 0 + const len = str.length + for (let s = 0; s < len; s++) { + hash += str.charCodeAt(s) * (s + 1) * (len - s) + } + hash >>>= 0 - let res = '' - while (hash > 0) { - const q = hash % ascii.length - hash = ~~(hash / ascii.length) - res += ascii[q] - } + let res = '' + while (hash > 0) { + const q = hash % ascii.length + hash = ~~(hash / ascii.length) + res += ascii[q] + } - return res + return res } export function deriveKey(userAgent: string, href: string, salt: string) { - return userAgent.trim() + href.replace(/#.*$/, '') + Math.floor(Date.now() / 100000) + salt + return userAgent.trim() + href.replace(/#.*$/, '') + Math.floor(Date.now() / 100000) + salt } export function xorContinuous(key: string, str: string, posRef: number[]) { - let pos = posRef[0] - let ret = '' - for (let s = 0; s < str.length; s++) { - ret += String.fromCharCode(str.charCodeAt(s) ^ key.charCodeAt(pos)) - pos = (pos + 1) % key.length - } - posRef[0] = pos - return ret + let pos = posRef[0] + let ret = '' + for (let s = 0; s < str.length; s++) { + ret += String.fromCharCode(str.charCodeAt(s) ^ key.charCodeAt(pos)) + pos = (pos + 1) % key.length + } + posRef[0] = pos + return ret } diff --git a/src/components/pages/PageDonate/data.ts b/src/components/pages/PageDonate/data.ts index 4ace895..b33ca26 100644 --- a/src/components/pages/PageDonate/data.ts +++ b/src/components/pages/PageDonate/data.ts @@ -1,42 +1,42 @@ +import type { PaymentMethod } from './constants' + import { randomBytes } from 'node:crypto' import { umamiFetchStats } from '~/backend/service/umami' - -import type { PaymentMethod } from './constants' import { PAYMENT_METHODS } from './constants' import { deriveKey, dumbHash, xorContinuous } from './crypto-common' export async function fetchDonatePageData(request: Request) { - const pageViews = await umamiFetchStats('/donate', 1700088965789) - .then(stats => `${stats.visitors.value + 9089}`) // value before umami - .catch((err) => { - console.error('Failed to fetch page views: ', err) - return '[error]' - }) + const pageViews = await umamiFetchStats('/donate', 1700088965789) + .then(stats => `${stats.visitors.value + 9089}`) // value before umami + .catch((err) => { + console.error('Failed to fetch page views: ', err) + return '[error]' + }) - const salt = randomBytes(12).toString('base64') - const probe = randomBytes(12).toString('base64') - const url = new URL(request.url, `${import.meta.env.DEV ? 'http' : 'https'}://${request.headers.get('host')}`) - const key = deriveKey(request.headers.get('user-agent') || '', url.href, salt) + const salt = randomBytes(12).toString('base64') + const probe = randomBytes(12).toString('base64') + const url = new URL(request.url, `${import.meta.env.DEV ? 'http' : 'https'}://${request.headers.get('host')}`) + const key = deriveKey(request.headers.get('user-agent') || '', url.href, salt) - const keyHash = dumbHash(key) - const xorPos = [0] + const keyHash = dumbHash(key) + const xorPos = [0] - const probeEnc = xorContinuous(keyHash, probe, xorPos) + const probeEnc = xorContinuous(keyHash, probe, xorPos) - const encryptedData: PaymentMethod[] = PAYMENT_METHODS.map(it => ({ - ...it, - link: it.link ? xorContinuous(keyHash, it.link, xorPos) : undefined, - text: xorContinuous(keyHash, it.text, xorPos), - })) + const encryptedData: PaymentMethod[] = PAYMENT_METHODS.map(it => ({ + ...it, + link: it.link ? xorContinuous(keyHash, it.link, xorPos) : undefined, + text: xorContinuous(keyHash, it.text, xorPos), + })) - return { - encryptedData, - probe, - probeEnc, - salt, - pageViews, - } + return { + encryptedData, + probe, + probeEnc, + salt, + pageViews, + } } export type PageData = Awaited> diff --git a/src/components/pages/PageMain/PageMain.astro b/src/components/pages/PageMain/PageMain.astro index 8b6a1bd..406b33a 100644 --- a/src/components/pages/PageMain/PageMain.astro +++ b/src/components/pages/PageMain/PageMain.astro @@ -1,11 +1,11 @@ --- -import DefaultLayout from '~/layouts/DefaultLayout/DefaultLayout.astro' -import { RandomWord } from '~/components/interactive/RandomWord/RandomWord' import { umamiLogThisVisit } from '~/backend/service/umami' +import { RandomWord } from '~/components/interactive/RandomWord' +import DefaultLayout from '~/layouts/DefaultLayout/DefaultLayout.astro' -import { PageMain as PageMainSolid } from './PageMain' import { PARTTIME_VARIANTS } from './constants' import { fetchMainPageData } from './data' +import { PageMain as PageMainSolid } from './PageMain' import Shoutbox from './Shoutbox/Shoutbox.astro' umamiLogThisVisit(Astro.request) diff --git a/src/components/pages/PageMain/PageMain.module.css b/src/components/pages/PageMain/PageMain.module.css deleted file mode 100644 index 7f4160d..0000000 --- a/src/components/pages/PageMain/PageMain.module.css +++ /dev/null @@ -1,146 +0,0 @@ -@import url('../../shared.css'); - -.comment { - color: var(--text-secondary); - margin-bottom: 8px; - margin-left: 48px; -} - -.commentInline { - color: var(--text-secondary); - margin-bottom: 8px; - margin-left: 2em; -} - -.testimonial { - margin-bottom: 4px; -} - -.favColor { - background: #be15dc; - border: 1px solid #ccc; - display: inline-block; - height: 10px; - margin-bottom: 2px; - vertical-align: middle; - width: 10px; -} - -.webring { - display: flex; - justify-content: space-between; - align-items: center; - margin-top: 16px; - @mixin font-xs; -} - -.lastSeen summary { - position: relative; - list-style: none; - cursor: pointer; - border-radius: 4px; - - &::-webkit-details-marker { - display: none; - } - - &:hover { - background: var(--control-bg-hover); - } - - /* prevent text selection on 2/3-ple click */ - &:active { - user-select: none; - } -} - -.lastSeenItem { - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; -} - -.lastSeenItem + .lastSeenItem { - margin-top: 4px; -} - -.lastSeen[open] { - margin-bottom: 4px; -} - -.lastSeenTrigger::before { - content: '(click to expand)'; - @mixin font-xs; - margin-left: 1em; - color: var(--text-secondary); - white-space: nowrap; - - @media (--tablet) { - content: '(expand)'; - } - - @media (--mobile) { - content: '<'; - } -} - -.lastSeen[open] .lastSeenTrigger::before { - content: '(click to collapse)'; - - @media (--tablet) { - content: '(collapse)'; - } - - @media (--mobile) { - content: 'v'; - } -} - -.lastSeenLinkWrap { - display: flex; - align-items: center; - overflow: hidden; - max-width: 100%; - - @media (--tablet) { - flex-direction: column; - justify-content: center; - align-items: start; - } -} - -.lastSeenLinkWrapInner { - display: flex; - align-items: center; - width: min-content; - overflow: hidden; - max-width: 100%; -} - -.lastSeenLink { - max-width: 200px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - - @media (--tablet) { - max-width: 300px; - } -} - -.lastSeenSuffix { - @mixin font-xs; - white-space: nowrap; -} - -.lastSeenSource { - @mixin font-xs; - color: var(--text-secondary); - margin-left: 8px; - white-space: nowrap; - - @media (--tablet) { - margin-left: 0; - } -} diff --git a/src/components/pages/PageMain/PageMain.tsx b/src/components/pages/PageMain/PageMain.tsx index 3989e6e..4849c6c 100644 --- a/src/components/pages/PageMain/PageMain.tsx +++ b/src/components/pages/PageMain/PageMain.tsx @@ -1,333 +1,339 @@ /** @jsxImportSource solid-js */ -import { For, type JSX, Show } from 'solid-js' -import { Dynamic } from 'solid-js/web' +import type { PageData } from './data' +import type { LastSeenItem as TLastSeenItem } from '~/backend/service/last-seen' import { intlFormatDistance } from 'date-fns' -import { Emoji } from '~/components/ui/Emoji/Emoji' -import { SectionTitle } from '~/components/ui/SectionTitle/SectionTitle' -import { Link } from '~/components/ui/Link/Link' -import { TextComment } from '~/components/ui/TextComment/TextComment' -import { TextTable } from '~/components/ui/TextTable/TextTable' -import jsLogo from '~/assets/javascript.png' -import ukFlag from '~/assets/flag-united-kingdom_1f1ec-1f1e7.png' -import ruFlag from '~/assets/flag-russia_1f1f7-1f1fa.png' -import cherry from '~/assets/cherry-blossom_1f338.png' +import { For, type JSX, Show } from 'solid-js' +import { Dynamic } from 'solid-js/web' import axolotl from '~/assets/axolotl.png' -import type { LastSeenItem as TLastSeenItem } from '~/backend/service/last-seen' -import { randomInt } from '~/utils/random' +import cherry from '~/assets/cherry-blossom_1f338.png' +import ruFlag from '~/assets/flag-russia_1f1f7-1f1fa.png' +import ukFlag from '~/assets/flag-united-kingdom_1f1ec-1f1e7.png' +import jsLogo from '~/assets/javascript.png' -import css from './PageMain.module.css' +import { randomInt } from '~/utils/random' +import { cn } from '../../../utils/cn.ts' +import { Emoji } from '../../ui/Emoji.tsx' +import { Link } from '../../ui/Link.tsx' +import { SectionTitle } from '../../ui/Section.tsx' +import { TextComment } from '../../ui/TextComment.tsx' +import { TextTable } from '../../ui/TextTable.tsx' import { SUBLINKS, TESTIMONIALS } from './constants' -import type { PageData } from './data' function formatTimeRelative(time: number) { - return intlFormatDistance( - new Date(time), - new Date(), - ) + return intlFormatDistance( + new Date(time), + new Date(), + ) } function LastSeenItem(props: { first?: boolean, item: TLastSeenItem }) { - return ( - -
-
- - {props.item.text} - - {props.item.suffix && ( - - {props.item.suffix} - - )} -
- - {'@ '} - - {props.item.source} - - {', '} - {formatTimeRelative(props.item.time)} - -
- -
- - - ) + return ( + +
+
+ + {props.item.text} + + {props.item.suffix && ( + + {props.item.suffix} + + )} +
+ + {'@ '} + + {props.item.source} + + {', '} + {formatTimeRelative(props.item.time)} + +
+ +
+ + + ) } export function PageMain(props: { - data: PageData - partTimeWords?: JSX.Element - shoutbox?: JSX.Element + data: PageData + partTimeWords?: JSX.Element + shoutbox?: JSX.Element }) { - const testimonials = TESTIMONIALS.map((props) => { - const link = props.href - ? ( - - {props.author} - - ) - : {props.author} - - return ( -
- " - {props.text} - " -  - {link} -
+ const testimonials = TESTIMONIALS.map((props) => { + const link = props.href + ? ( + + {props.author} + ) - }) - - /* eslint-disable solid/no-innerhtml */ - const sublinks = SUBLINKS.map(item => ( -
- - - {' '} - - {item.title} - - : - {' '} - - -
- )) - /* eslint-enable solid/no-innerhtml */ + : {props.author} return ( - <> -
{`h${'i'.repeat(randomInt(2, 5))}~`}
- -
- i am - {' '} - alina - {' '} - aka - {' '} - teidesu - {' '} - 🌸 -
- full-time js/ts developer, part-time - {' '} - {props.partTimeWords} - {' '} -
- more about me as a dev on my - {' '} - - github page - -
- -
- - extremely interesting info (no): - - 'july 25 (leo ♌)' }, - { - name: 'langs', - value: () => ( - <> - - {' '} - native, - {' '} - - {' '} - c1, - {' '} - - {' '} - native - - ), - }, - { - name: 'last seen', - value: () => { - if (!props.data.lastSeen?.length) return - - return ( -
- - - {it => } - -
- ) - }, - }, - { - name: 'fav color', - value: () => ( - <> - #be15dc - {' '} -
- - ), - }, - { - name: 'fav flower', - value: () => ( - <> - cherry blossom - {' '} - - , lilac - - ), - }, - { - name: 'fav animal', - value: () => ( - <> - axolotl - {' '} - - - ), - }, - { - name: 'fav anime', - value: () => ( - <> - nichijou ( - - shiki - - / - - anilist - - ) - - ), - }, - { - name: 'fav music', - value: () => ( - <> - hyperpop, digicore, happy hardcore - - ), - }, - ]} - wrap - fill - /> -
-
- - contact me (in order of preference): - - ( - - @teidumb - - ), - }, - { - name: 'bluesky', - value: () => ( - - @tei.pet - - ), - }, - { - name: 'matrix', - value: () => ( - - @teidesu:stupid.fish - - ), - }, - { - name: 'email', - value: () => props.data.email, - }, - { - name: 'phone', - value: () => 'secret :p', - }, - { - name: 'post pigeons', - value: () => 'please don\'t', - }, - ]} - wrap - /> -
- -
- - testimonials from THEM: - - - {testimonials} - - - feel free to leave yours :3 - -
- - {props.shoutbox} - -
- - top secret sub-pages: - - - {sublinks} -
- -
- total page views so far: - {' '} - {props.data.pageViews} -
- - -
- - < - {' '} - {props.data.webring!.prev.name} - - - rutg webring - - - {props.data.webring!.next.name} - {' '} - > - -
-
- +
+ " + {props.text} + " -  + {link} +
) + }) + + /* eslint-disable solid/no-innerhtml */ + const sublinks = SUBLINKS.map(item => ( +
+ - + {' '} + + {item.title} + + : + {' '} + + +
+ )) + /* eslint-enable solid/no-innerhtml */ + + return ( + <> +
{`h${'i'.repeat(randomInt(2, 5))}~`}
+ +
+ i am + {' '} + alina + {' '} + aka + {' '} + teidesu + {' '} + 🌸 +
+ full-time js/ts developer, part-time + {' '} + {props.partTimeWords} + {' '} +
+ more about me as a dev on my + {' '} + + github page + +
+ +
+ + extremely interesting info (no): + + 'july 25 (leo ♌)' }, + { + name: 'langs', + value: () => ( + <> + + {' '} + native, + {' '} + + {' '} + c1, + {' '} + + {' '} + native + + ), + }, + { + name: 'last seen', + value: () => { + if (!props.data.lastSeen?.length) return + + return ( +
+ + + {it => } + +
+ ) + }, + }, + { + name: 'fav color', + value: () => ( + <> + #be15dc + {' '} +
+ + ), + }, + { + name: 'fav flower', + value: () => ( + <> + cherry blossom + {' '} + + , lilac + + ), + }, + { + name: 'fav animal', + value: () => ( + <> + axolotl + {' '} + + + ), + }, + { + name: 'fav anime', + value: () => ( + <> + nichijou ( + + shiki + + / + + anilist + + ) + + ), + }, + { + name: 'fav music', + value: () => ( + <> + hyperpop, digicore, happy hardcore + + ), + }, + ]} + wrap + fill + /> +
+
+ + contact me (in order of preference): + + ( + + @teidumb + + ), + }, + { + name: 'bluesky', + value: () => ( + + @tei.pet + + ), + }, + { + name: 'matrix', + value: () => ( + + @teidesu:stupid.fish + + ), + }, + { + name: 'email', + value: () => props.data.email, + }, + { + name: 'phone', + value: () => 'secret :p', + }, + { + name: 'post pigeons', + value: () => 'please don\'t', + }, + ]} + wrap + /> +
+ +
+ + testimonials from THEM: + + + {testimonials} + + + feel free to leave yours :3 + +
+ + {props.shoutbox} + +
+ + top secret sub-pages: + + + {sublinks} +
+ +
+ total page views so far: + {' '} + {props.data.pageViews} +
+ + +
+ + < + {' '} + {props.data.webring!.prev.name} + + + rutg webring + + + {props.data.webring!.next.name} + {' '} + > + +
+
+ + ) } diff --git a/src/components/pages/PageMain/Shoutbox/Shoutbox.astro b/src/components/pages/PageMain/Shoutbox/Shoutbox.astro index 043ef3e..e54c2db 100644 --- a/src/components/pages/PageMain/Shoutbox/Shoutbox.astro +++ b/src/components/pages/PageMain/Shoutbox/Shoutbox.astro @@ -1,7 +1,7 @@ --- import { fetchShouts } from '~/backend/service/shoutbox' -import { getRequestIp } from '~/backend/utils/request' import { getCsrfToken } from '~/backend/utils/csrf' +import { getRequestIp } from '~/backend/utils/request' import { Shoutbox as ShoutboxSolid } from './Shoutbox' @@ -17,9 +17,9 @@ const csrf = getCsrfToken(ip) --- diff --git a/src/components/pages/PageMain/Shoutbox/Shoutbox.module.css b/src/components/pages/PageMain/Shoutbox/Shoutbox.module.css deleted file mode 100644 index f4a96b2..0000000 --- a/src/components/pages/PageMain/Shoutbox/Shoutbox.module.css +++ /dev/null @@ -1,75 +0,0 @@ -@import '../../../../components/shared.css'; - -.form { - display: flex; - gap: 8px; - flex-direction: column; - width: 100%; -} - -.formInput { - display: flex; - gap: 8px; - width: 100%; -} - -.textarea { - width: 100%; -} - -.shouts { - display: flex; - flex-direction: column; - gap: 8px; - margin-top: 16px; -} - -.header { - display: flex; - flex-direction: row; - gap: 8px; - color: var(--text-secondary); -} - -.shout { - display: flex; - padding: 8px; - gap: 8px; - border: 1px solid var(--control-outline); - background: var(--control-bg); - border-radius: 4px; - width: fit-content; - - @media (--mobile) { - flex-direction: column; - width: 100%; - } -} - -.time { - white-space: nowrap; -} - -.text { - white-space: pre-wrap; -} - -.formControls { - display: flex; - flex-direction: row; - justify-content: space-between; -} - -.pagination { - display: flex; - gap: 8px; - color: var(--text-secondary); -} - -.paginationLink { - color: var(--text-secondary); -} - -.reply { - margin-top: 6px; -} \ No newline at end of file diff --git a/src/components/pages/PageMain/Shoutbox/Shoutbox.tsx b/src/components/pages/PageMain/Shoutbox/Shoutbox.tsx index 6e0c488..4241587 100644 --- a/src/components/pages/PageMain/Shoutbox/Shoutbox.tsx +++ b/src/components/pages/PageMain/Shoutbox/Shoutbox.tsx @@ -1,222 +1,211 @@ -/* eslint-disable no-alert */ /** @jsxImportSource solid-js */ -import { type ComponentProps, Show, createSignal, onMount } from 'solid-js' -import { QueryClient, QueryClientProvider, createQuery, keepPreviousData } from '@tanstack/solid-query' +/* eslint-disable no-alert */ +import type { ShoutsData } from '~/backend/service/shoutbox' +import { createQuery, keepPreviousData, QueryClient, QueryClientProvider } from '@tanstack/solid-query' import { format } from 'date-fns/format' -import { Button } from '~/components/ui/Button/Button' -import { Checkbox } from '~/components/ui/Checkbox/Checkbox' -import { GravityClock } from '~/components/ui/Icons/glyphs/GravityClock' -import { GravityMegaphone } from '~/components/ui/Icons/glyphs/GravityMegaphone' -import { Icon } from '~/components/ui/Icons/Icon' -import { SectionTitle } from '~/components/ui/SectionTitle/SectionTitle' -import { TextArea } from '~/components/ui/TextArea/TextArea' -import { TextComment } from '~/components/ui/TextComment/TextComment' -import type { ShoutsData } from '~/backend/service/shoutbox' -import pageCss from '../PageMain.module.css' +import { type ComponentProps, createSignal, onMount, Show } from 'solid-js' +import { Button } from '../../../ui/Button.tsx' -import css from './Shoutbox.module.css' +import { Checkbox } from '../../../ui/Checkbox/Checkbox.tsx' +import { SectionTitle } from '../../../ui/Section.tsx' +import { TextArea } from '../../../ui/TextArea.tsx' +import { TextComment } from '../../../ui/TextComment.tsx' async function fetchShouts(page: number): Promise { - return fetch(`/api/shoutbox?page=${page}`).then(r => r.json()) + return fetch(`/api/shoutbox?page=${page}`).then(r => r.json()) } function ShoutboxInner(props: { - initPage: number - initPageData: ShoutsData - shoutError?: string - csrf: string + initPage: number + initPageData: ShoutsData + shoutError?: string + csrf: string }) { - // eslint-disable-next-line solid/reactivity - const [page, setPage] = createSignal(props.initPage) - // eslint-disable-next-line solid/reactivity - const [initData, setInitData] = createSignal(props.initPageData) + // eslint-disable-next-line solid/reactivity + const [page, setPage] = createSignal(props.initPage) + // eslint-disable-next-line solid/reactivity + const [initData, setInitData] = createSignal(props.initPageData) - const shouts = createQuery(() => ({ - queryKey: ['shouts', page()], - queryFn: () => fetchShouts(page()), - cacheTime: 0, - gcTime: 0, - refetchInterval: 30000, - placeholderData: keepPreviousData, - initialData: initData, - })) - const [sending, setSending] = createSignal(false) - const [jsEnabled, setJsEnabled] = createSignal(false) - onMount(() => setJsEnabled(true)) + const shouts = createQuery(() => ({ + queryKey: ['shouts', page()], + queryFn: () => fetchShouts(page()), + cacheTime: 0, + gcTime: 0, + refetchInterval: 30000, + placeholderData: keepPreviousData, + initialData: initData, + })) + const [sending, setSending] = createSignal(false) + const [jsEnabled, setJsEnabled] = createSignal(false) + onMount(() => setJsEnabled(true)) - const onPageClick = (next: boolean) => (e: MouseEvent) => { - e.preventDefault() - e.stopPropagation() - setInitData(undefined) + const onPageClick = (next: boolean) => (e: MouseEvent) => { + e.preventDefault() + e.stopPropagation() + setInitData(undefined) - const newPage = next ? page() + 1 : page() - 1 + const newPage = next ? page() + 1 : page() - 1 - const link = e.currentTarget as HTMLAnchorElement - const href = link.href + const link = e.currentTarget as HTMLAnchorElement + const href = link.href - history.replaceState(null, '', href) - setPage(newPage) - } + history.replaceState(null, '', href) + setPage(newPage) + } - const shoutsRender = () => shouts.data?.items.map((props) => { - const icon = props.pending - ? ( - - ) - : `#${props.serial}` - - return ( -
-
- {icon} - -
-
- {props.text} - {props.reply && ( -
- reply: - {props.reply} -
- )} -
-
- ) - }) - - let privateCheckbox!: HTMLInputElement - let messageInput!: HTMLTextAreaElement - - const onSubmit = (e: Event) => { - e.preventDefault() - setSending(true) - setInitData(undefined) - - const isPrivate = privateCheckbox.checked - fetch('/api/shoutbox', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - _csrf: props.csrf, - message: messageInput.value, - private: isPrivate, - }), - }) - .then(res => res.json()) - .then((data) => { - if (data.error) { - alert(data.error + (data.message ? `: ${data.message}` : '')) - } else if (isPrivate) { - alert('private message sent') - messageInput.value = '' - } else { - alert('shout sent! it will appear after moderation') - shouts.refetch() - messageInput.value = '' - } - - setSending(false) - }) - } - - const placeholder = () => { - if (props.shoutError) return props.shoutError - if (!jsEnabled()) return '⚠️ please enable javascript to use the form.\nim sorry, but there are just too many spammers out there :c' - return 'let the void hear you' - } + const shoutsRender = () => shouts.data?.items.map((props) => { + const icon = props.pending + ?
+ : `#${props.serial}` return ( - -
- shoutbox! - - disclaimer: shouts - {' '} - are - {' '} - pre-moderated, but they do not reflect my views. - - -
- -
-