diff --git a/package.json b/package.json index 510aef5a9..e91f5f688 100644 --- a/package.json +++ b/package.json @@ -5,24 +5,25 @@ "main": "src/server.ts", "type": "module", "scripts": { - "build:bot": "node scripts/build --build=bot", - "build:server": "node scripts/build --build=server", + "build:bot": "vite-node --script scripts/build --build=bot", + "build:server": "vite-node --script scripts/build --build=server", "build:docs": "vitepress build docs", - "build:ratingsleaderboard": "node scripts/generateRatingsLeaderboard", - "build": "node scripts/build --build=all", + "build:ratingsleaderboard": "vite-node --script scripts/buildRatingsLeaderboard", + "build": "vite-node --script scripts/build --build=all", "dev:bot": "yarn build:bot --dev && yarn start:bot", "dev:server": "yarn build:server --dev && yarn start:server", "dev:docs": "vitepress dev docs", "start:bot": "node --enable-source-maps --trace-warnings dist/bot.cjs", "start:server": "node --enable-source-maps --trace-warnings dist/server.cjs", "host:docs": "vitepress preview docs", - "publish:ratingsleaderboard": "node scripts/generateRatingsLeaderboard --publish", + "publish:ratingsleaderboard": "vite-node --script scripts/buildRatingsLeaderboard --publish", "zip": "zip -r dist.zip dist", "lint": "npx tsc", "format": "prettier --write \"**/*.@(json|js|jsx|css|md|ts|tsx|html|xml|yml|gltf)\"" }, "license": "MIT", "dependencies": { + "@octokit/rest": "^20.0.1", "@radix-ui/colors": "^0.1.8", "@resvg/resvg-js": "^2.4.1", "bepaint": "^0.1.0-beta.3", @@ -35,10 +36,10 @@ "markdown-escape": "^2.0.0", "react": "^18.2.0", "satori": "^0.9.1", + "vite-node": "^0.33.0", "vitepress-plugin-auto-sidebar": "^1.1.0" }, "devDependencies": { - "@octokit/rest": "^20.0.1", "@total-typescript/ts-reset": "^0.4.2", "@types/escape-html": "^1.0.2", "@types/express": "^4.17.17", diff --git a/scripts/build.js b/scripts/build.ts similarity index 91% rename from scripts/build.js rename to scripts/build.ts index 59e812ddb..18c450987 100644 --- a/scripts/build.js +++ b/scripts/build.ts @@ -1,4 +1,4 @@ -import { build } from 'esbuild'; +import { BuildOptions, build } from 'esbuild'; import { copyFile, mkdir, rm } from 'fs/promises'; import { argv } from 'process'; @@ -7,6 +7,8 @@ const buildAll = argv.includes('--build=all'); const buildBot = argv.includes('--build=bot') || buildAll; const buildServer = argv.includes('--build=server') || buildAll; +console.log(buildAll, buildBot, buildServer); + if (isProd) { // only remove in production to ensure no time is wasted in dev console.log('Removing dist...'); @@ -23,7 +25,7 @@ if (isProd) { ); } -const commonOptions = { +const commonOptions: BuildOptions = { platform: 'node', loader: { '.node': 'copy', diff --git a/scripts/generateRatingsLeaderboard.js b/scripts/buildRatingsLeaderboard.ts similarity index 86% rename from scripts/generateRatingsLeaderboard.js rename to scripts/buildRatingsLeaderboard.ts index b39f732dd..835c52f65 100644 --- a/scripts/generateRatingsLeaderboard.js +++ b/scripts/buildRatingsLeaderboard.ts @@ -3,6 +3,19 @@ import { rm, writeFile } from 'fs/promises'; import { argv, env } from 'process'; import commitMultipleFiles from './commitMultipleFiles.js'; +interface RatingsSeasonInfo { + count: number; +} + +interface RatingsPlayer { + number: number; + spa_id: number; +} + +interface RatingsNeighbors { + neighbors: RatingsPlayer[]; +} + /* * Central North American Time (UTC-5): use 0 5 * * *. * Central European Time (UTC+1): use 0 23 * * *. @@ -23,22 +36,22 @@ const NEIGHBORS = 1000; const PLAYERS = await fetch( `https://${server}.wotblitz.com/en/api/rating-leaderboards/season/`, ) - .then((response) => response.json()) + .then((response) => response.json() as Promise) .then((data) => data.count); -const players = {}; -const leaderboard = []; +const players: Record = {}; +const leaderboard: RatingsPlayer[] = []; let registered = 0; -async function branchFromPlayer(id) { +async function branchFromPlayer(id: number) { const { neighbors } = await fetch( `https://${server}.wotblitz.com/en/api/rating-leaderboards/user/${id}/?neighbors=${NEIGHBORS}`, - ).then((response) => response.json()); + ).then((response) => response.json() as Promise); const firstPlayer = neighbors[0]; const lastPlayer = neighbors[neighbors.length - 1]; - const branches = []; + const branches: Promise[] = []; if (!players[firstPlayer.number]) branches.push(branchFromPlayer(firstPlayer.spa_id)); if (!players[lastPlayer.number]) @@ -61,7 +74,7 @@ async function branchFromPlayer(id) { await Promise.all(branches); } -async function branchFromLeague(id) { +async function branchFromLeague(id: number) { const { result } = await fetch( `https://${server}.wotblitz.com/en/api/rating-leaderboards/league/${id}/top/`, ).then((response) => response.json()); @@ -75,7 +88,7 @@ async function branchFromLeague(id) { ]); } -console.log('Branching form leagues...'); +console.log('Branching from leagues...'); await Promise.all([ branchFromLeague(0), branchFromLeague(1), diff --git a/scripts/commitMultipleFiles.js b/scripts/commitMultipleFiles.ts similarity index 87% rename from scripts/commitMultipleFiles.js rename to scripts/commitMultipleFiles.ts index 58d6a6cdd..f00083554 100644 --- a/scripts/commitMultipleFiles.js +++ b/scripts/commitMultipleFiles.ts @@ -1,10 +1,12 @@ +import { Octokit } from '@octokit/rest'; + export default async function commitMultipleFiles( - octokit, - owner, - repo, - branch, - message, - changes, + octokit: Octokit, + owner: string, + repo: string, + branch: string, + message: string, + changes: { path: string; content: string }[], ) { // Get the latest commit SHA on the specified branch const { data: refData } = await octokit.git.getRef({ @@ -31,12 +33,13 @@ export default async function commitMultipleFiles( content: change.content, encoding: 'utf-8', }); + return { sha: blobData.sha, path: change.path, mode: '100644', type: 'blob', - }; + } as const; }), ); diff --git a/yarn.lock b/yarn.lock index 9199e75d1..69a544844 100644 --- a/yarn.lock +++ b/yarn.lock @@ -933,6 +933,11 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + algoliasearch@^4.0.0: version "4.18.0" resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.18.0.tgz#1183ad0384a5b2c14f381c3a361da611acc8edb3" @@ -1013,6 +1018,11 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + call-bind@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -1089,6 +1099,13 @@ debug@2.6.9: dependencies: ms "2.0.0" +debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -1475,11 +1492,26 @@ minisearch@^6.1.0: resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-6.1.0.tgz#6e74e743dbd0e88fa5ca52fef2391e0aa7055252" integrity sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg== +mlly@^1.2.0, mlly@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.4.0.tgz#830c10d63f1f97bd8785377b24dc2a15d972832b" + integrity sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg== + dependencies: + acorn "^8.9.0" + pathe "^1.1.1" + pkg-types "^1.0.3" + ufo "^1.1.2" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" @@ -1537,6 +1569,11 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +pathe@^1.1.0, pathe@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" + integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== + peek-readable@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.0.0.tgz#7ead2aff25dc40458c60347ea76cfdfd63efdfec" @@ -1547,6 +1584,15 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +pkg-types@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" + integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== + dependencies: + jsonc-parser "^3.2.0" + mlly "^1.2.0" + pathe "^1.1.0" + postcss-value-parser@^4.0.2, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" @@ -1561,6 +1607,15 @@ postcss@^8.1.10, postcss@^8.4.23: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.25: + version "8.4.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" + integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + preact@^10.0.0: version "10.15.1" resolved "https://registry.yarnpkg.com/preact/-/preact-10.15.1.tgz#a1de60c9fc0c79a522d969c65dcaddc5d994eede" @@ -1631,6 +1686,13 @@ rollup@^3.21.0: optionalDependencies: fsevents "~2.3.2" +rollup@^3.25.2: + version "3.26.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.26.2.tgz#2e76a37606cb523fc9fef43e6f59c93f86d95e7c" + integrity sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA== + optionalDependencies: + fsevents "~2.3.2" + safe-buffer@5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -1790,6 +1852,11 @@ typescript@^5.0.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== +ufo@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.1.2.tgz#d0d9e0fa09dece0c31ffd57bd363f030a35cfe76" + integrity sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ== + undici@^5.22.0: version "5.22.1" resolved "https://registry.yarnpkg.com/undici/-/undici-5.22.1.tgz#877d512effef2ac8be65e695f3586922e1a57d7b" @@ -1830,6 +1897,29 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vite-node@^0.33.0: + version "0.33.0" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.33.0.tgz#c6a3a527e0b8090da7436241bc875760ae0eef28" + integrity sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw== + dependencies: + cac "^6.7.14" + debug "^4.3.4" + mlly "^1.4.0" + pathe "^1.1.1" + picocolors "^1.0.0" + vite "^3.0.0 || ^4.0.0" + +"vite@^3.0.0 || ^4.0.0": + version "4.4.4" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.4.tgz#b76e6049c0e080cb54e735ad2d18287753752118" + integrity sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg== + dependencies: + esbuild "^0.18.10" + postcss "^8.4.25" + rollup "^3.25.2" + optionalDependencies: + fsevents "~2.3.2" + vite@^4.3.9: version "4.3.9" resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.9.tgz#db896200c0b1aa13b37cdc35c9e99ee2fdd5f96d"