From 08123ee6d9c5484ffef076ff578173c3677dcf01 Mon Sep 17 00:00:00 2001 From: Elu Date: Fri, 1 Mar 2024 17:50:18 +0800 Subject: [PATCH 1/5] feat: Using the Hono web framework Using Hono (https://hono.dev) makes pixel-profile deployable to more PaaS (e.g. zeabur.com, heroku.com, render.com) and your own servers! --- api/handle.ts | 3 + package.json | 17 +- packages/server/package.json | 44 ++ packages/server/src/app.ts | 10 + {api => packages/server/src}/github-stats.ts | 34 +- packages/server/src/index.ts | 2 + packages/server/src/status/index.ts | 10 + .../server/src}/status/pat-info.ts | 24 +- {api => packages/server/src}/status/up.ts | 34 +- {utils => packages/server/src/utils}/index.ts | 0 packages/server/src/vercel.ts | 6 + packages/server/tsconfig.json | 14 + packages/server/tsup.config.ts | 15 + pnpm-lock.yaml | 739 +++++++++++++++++- tsconfig.json | 1 + vercel.json | 9 +- 16 files changed, 908 insertions(+), 54 deletions(-) create mode 100644 api/handle.ts create mode 100644 packages/server/package.json create mode 100644 packages/server/src/app.ts rename {api => packages/server/src}/github-stats.ts (77%) create mode 100644 packages/server/src/index.ts create mode 100644 packages/server/src/status/index.ts rename {api => packages/server/src}/status/pat-info.ts (88%) rename {api => packages/server/src}/status/up.ts (67%) rename {utils => packages/server/src/utils}/index.ts (100%) create mode 100644 packages/server/src/vercel.ts create mode 100644 packages/server/tsconfig.json create mode 100644 packages/server/tsup.config.ts diff --git a/api/handle.ts b/api/handle.ts new file mode 100644 index 0000000..6e5be1c --- /dev/null +++ b/api/handle.ts @@ -0,0 +1,3 @@ +import { vercelHandle } from '@pixel-profile/server' + +export default vercelHandle diff --git a/package.json b/package.json index 51f2453..902114f 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,15 @@ "url": "https://github.com/LuciNyan/pixel-profile.git" }, "scripts": { - "start": "concurrently \"pnpm dev:vercel\" \"pnpm dev:pixel-profile\"", + "start": "concurrently \"pnpm dev:vercel\" \"pnpm dev:pixel-profile\" \"pnpm dev:server\"", "dev:vercel": "vercel dev --yes", "dev:pixel-profile": "turbo dev --filter=pixel-profile", - "build": "pnpm --filter \"pixel-profile\" run build", + "dev:server": "turbo dev --filter=server", + "build": "pnpm -r build", "release": "bumpp --commit --push --tag -r && pnpm publish ./packages/pixel-profile --access=public", "format": "prettier --write .", "prepare": "husky install", - "lint": "eslint -c .eslintrc.json --ext .ts,.tsx api utils packages/pixel-profile/src", + "lint": "eslint -c .eslintrc.json --ext .ts,.tsx api packages/pixel-profile/src packages/server/src", "lint:fix": "pnpm lint --fix", "test": "vitest run", "test-type": "pnpm --filter=pixel-profile run test-type" @@ -30,28 +31,28 @@ "@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/parser": "^6.10.0", "@vercel/node": "^3.0.18", + "bumpp": "^9.3.0", + "concurrently": "^7.3.0", "eslint": "^8.25.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^16.0.3", "eslint-import-resolver-typescript": "^2.5.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-import": "^2.24.2", + "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-react": "^7.25.1", "eslint-plugin-simple-import-sort": "^10.0.0", - "bumpp": "^9.3.0", - "concurrently": "^7.3.0", "husky": "^8.0.3", "lint-staged": "^15.2.0", "prettier": "^3.1.1", "turbo": "^1.6.3", "typescript": "^5.3.3", + "vercel": "^33.5.3", "vitest": "^1.3.1" }, "dependencies": { - "axios": "^1.6.2", - "pixel-profile": "workspace:*", - "ts-known": "^0.1.3" + "@pixel-profile/server": "workspace:*" }, "lint-staged": { "*.{js,css,md}": "prettier --write", diff --git a/packages/server/package.json b/packages/server/package.json new file mode 100644 index 0000000..b42d503 --- /dev/null +++ b/packages/server/package.json @@ -0,0 +1,44 @@ +{ + "name": "@pixel-profile/server", + "version": "0.0.1", + "description": "", + "homepage": "https://github.com/LuciNyan/pixel-profile", + "bugs": { + "url": "https://github.com/LuciNyan/pixel-profile/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/LuciNyan/pixel-profile.git" + }, + "module": "./dist/index.js", + "main": "./dist/index.js", + "scripts": { + "dev": "tsup src/index.ts --watch", + "build": "tsup" + }, + "type": "module", + "author": "LuciNyan", + "license": "MIT", + "exports": { + "./package.json": "./package.json", + ".": { + "import": "./dist/index.js" + } + }, + "devDependencies": { + "@types/node": "^20.11.0", + "tsup": "^8.0.2", + "typescript": "^5.3.3" + }, + "dependencies": { + "@hono/node-server": "^1.8.2", + "axios": "^1.6.2", + "hono": "^4.0.8", + "pixel-profile": "workspace:*", + "ts-known": "^0.1.3" + }, + "packageManager": "pnpm@8.7.0", + "engines": { + "node": ">=18.17.0" + } +} diff --git a/packages/server/src/app.ts b/packages/server/src/app.ts new file mode 100644 index 0000000..761653c --- /dev/null +++ b/packages/server/src/app.ts @@ -0,0 +1,10 @@ +import githubStatsHandle from './github-stats' +import statusHandle from './status' +import { Hono } from 'hono' + +const app = new Hono().basePath('/api') + +app.route('/github-stats', githubStatsHandle) +app.route('/status', statusHandle) + +export { app } diff --git a/api/github-stats.ts b/packages/server/src/github-stats.ts similarity index 77% rename from api/github-stats.ts rename to packages/server/src/github-stats.ts index bdbc20d..be42524 100644 --- a/api/github-stats.ts +++ b/packages/server/src/github-stats.ts @@ -1,8 +1,12 @@ -import { CONSTANTS, parseArray, parseBoolean, parseString } from '../utils/index.js' -import type { VercelRequest, VercelResponse } from '@vercel/node' +import { CONSTANTS, parseArray, parseBoolean, parseString } from './utils' +import { Hono } from 'hono' +import { stream } from 'hono/streaming' import { clamp, fetchStats, renderStats } from 'pixel-profile' -export default async (req: VercelRequest, res: VercelResponse) => { +const githubStats = new Hono() + +githubStats.get('/', async (c) => { + const { req, res } = c const { background, cache_seconds = `${CONSTANTS.CARD_CACHE_SECONDS}`, @@ -17,9 +21,9 @@ export default async (req: VercelRequest, res: VercelResponse) => { show_total_stars, username, theme - } = req.query + } = req.query() - res.setHeader('Content-Type', 'image/png') + res.headers.set('Content-Type', 'image/png') try { const showStats = parseArray(show) @@ -45,7 +49,7 @@ export default async (req: VercelRequest, res: VercelResponse) => { cacheSeconds = process.env.CACHE_SECONDS ? parseInt(process.env.CACHE_SECONDS, 10) || cacheSeconds : cacheSeconds - res.setHeader( + res.headers.set( 'Cache-Control', `max-age=${cacheSeconds / 2}, s-maxage=${cacheSeconds}, stale-while-revalidate=${CONSTANTS.ONE_DAY}` ) @@ -60,18 +64,28 @@ export default async (req: VercelRequest, res: VercelResponse) => { } const result = await renderStats(stats, options) + const resultUint8Array = Uint8Array.from(result) - return res.send(result) + return stream(c, async (stream) => { + // Write a process to be executed when aborted. + stream.onAbort(() => { + console.log('Aborted!') + }) + // Write a Uint8Array. + await stream.write(resultUint8Array) + }) } catch (err) { console.log(err) - res.setHeader( + res.headers.set( 'Cache-Control', `max-age=${CONSTANTS.ERROR_CACHE_SECONDS / 2}, s-maxage=${ CONSTANTS.ERROR_CACHE_SECONDS }, stale-while-revalidate=${CONSTANTS.ONE_DAY}` ) - return res.send(1) + return c.html('') } -} +}) + +export default githubStats diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts new file mode 100644 index 0000000..f11bd35 --- /dev/null +++ b/packages/server/src/index.ts @@ -0,0 +1,2 @@ +export { app } from './app' +export { vercelHandle } from './vercel' diff --git a/packages/server/src/status/index.ts b/packages/server/src/status/index.ts new file mode 100644 index 0000000..dd2d1e5 --- /dev/null +++ b/packages/server/src/status/index.ts @@ -0,0 +1,10 @@ +import patInfo from './pat-info' +import up from './up' +import { Hono } from 'hono' + +const status = new Hono() + +status.route('/pat-info', patInfo) +status.route('/up', up) + +export default status diff --git a/api/status/pat-info.ts b/packages/server/src/status/pat-info.ts similarity index 88% rename from api/status/pat-info.ts rename to packages/server/src/status/pat-info.ts index 22d7f04..59d72d0 100644 --- a/api/status/pat-info.ts +++ b/packages/server/src/status/pat-info.ts @@ -2,32 +2,36 @@ * Copyright (c) 2020 Anurag Hazra * https://github.com/anuraghazra/github-readme-stats/blob/master/api/status/pat-info.js */ -import { dateDiff, hasMessage, isPATError } from '../../utils/index.js' -import { VercelRequest, VercelResponse } from '@vercel/node' +import { dateDiff, hasMessage, isPATError } from '../utils/index.js' import type { AxiosResponse } from 'axios' +import { Hono } from 'hono' import { request } from 'pixel-profile' +const patInfo = new Hono() + export const RATE_LIMIT_SECONDS = 60 * 5 -export default async (_: VercelRequest, res: VercelResponse): Promise => { - res.setHeader('Content-Type', 'application/json') +patInfo.get('/', async (c) => { + const { res } = c + res.headers.set('Content-Type', 'application/json') try { // Add header to prevent abuse. const PATsInfo = await getPATInfo(uptimeFetcher, {}) if (PATsInfo) { - res.setHeader('Cache-Control', `max-age=0, s-maxage=${RATE_LIMIT_SECONDS}`) + res.headers.set('Cache-Control', `max-age=0, s-maxage=${RATE_LIMIT_SECONDS}`) } - res.send(JSON.stringify(PATsInfo, null, 2)) + + return c.json(PATsInfo) } catch (err) { console.error(err) - res.setHeader('Cache-Control', 'no-store') + res.headers.set('Cache-Control', 'no-store') if (hasMessage(err)) { - res.send(`Something went wrong: ${err.message}`) + return c.html(`Something went wrong: ${err.message}`) } } -} +}) const uptimeFetcher = (variables: Record, github_token: string): Promise => { return request( @@ -168,3 +172,5 @@ const getPATInfo = async (fetcher: typeof uptimeFetcher, variables: Record => { - const _type = parseString(req.query.type) +const up = new Hono() + +up.get('/', async (c) => { + const { req, res } = c + const _type = parseString(req.query().type) const type = _type ? _type.toLowerCase() : 'boolean' - res.setHeader('Content-Type', 'application/json') + res.headers.set('Content-Type', 'application/json') try { let PATsValid = true @@ -25,32 +28,29 @@ export default async (req: VercelRequest, res: VercelResponse): Promise => } if (PATsValid) { - res.setHeader('Cache-Control', `max-age=0, s-maxage=${RATE_LIMIT_SECONDS}`) + res.headers.set('Cache-Control', `max-age=0, s-maxage=${RATE_LIMIT_SECONDS}`) } else { - res.setHeader('Cache-Control', 'no-store') + res.headers.set('Cache-Control', 'no-store') } switch (type) { case 'shields': - res.send(shieldsUptimeBadge(PATsValid)) - break + return c.json(shieldsUptimeBadge(PATsValid)) case 'json': - res.send({ up: PATsValid }) - break + return c.json({ up: PATsValid }) default: - res.send(PATsValid) - break + return c.json(PATsValid) } } catch (err) { console.error(err) - res.setHeader('Cache-Control', 'no-store') + res.headers.set('Cache-Control', 'no-store') if (hasMessage(err)) { - res.send(`Something went wrong: ${err.message}`) + return c.json(`Something went wrong: ${err.message}`) } } -} +}) const uptimeFetcher = (variables: Record, github_token: string): Promise => { return request( @@ -93,3 +93,5 @@ const shieldsUptimeBadge = (up: boolean): ShieldsResponse => { isError } } + +export default up diff --git a/utils/index.ts b/packages/server/src/utils/index.ts similarity index 100% rename from utils/index.ts rename to packages/server/src/utils/index.ts diff --git a/packages/server/src/vercel.ts b/packages/server/src/vercel.ts new file mode 100644 index 0000000..273690c --- /dev/null +++ b/packages/server/src/vercel.ts @@ -0,0 +1,6 @@ +import { app } from './app' +import { handle } from '@hono/node-server/vercel' + +const vercelHandle = handle(app) + +export { vercelHandle } diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json new file mode 100644 index 0000000..c0fb7c1 --- /dev/null +++ b/packages/server/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "strict": true, + }, + "include": [ + "src" + ], + "exclude": ["node_modules"] +} diff --git a/packages/server/tsup.config.ts b/packages/server/tsup.config.ts new file mode 100644 index 0000000..83ebe35 --- /dev/null +++ b/packages/server/tsup.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: ['src/index.ts'], + splitting: false, + sourcemap: false, + target: 'node16', + dts: false, + minify: process.env.NODE_ENV !== 'development', + format: ['esm'], + esbuildOptions(options) { + options.tsconfig = 'tsconfig.json' + options.legalComments = 'external' + } +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c0b76d..95caaef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,15 +8,9 @@ importers: .: dependencies: - axios: - specifier: ^1.6.2 - version: 1.6.2 - pixel-profile: + '@pixel-profile/server': specifier: workspace:* - version: link:packages/pixel-profile - ts-known: - specifier: ^0.1.3 - version: 0.1.3 + version: link:packages/server devDependencies: '@types/node': specifier: ^20.11.0 @@ -54,6 +48,9 @@ importers: eslint-plugin-import: specifier: ^2.24.2 version: 2.29.1(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-typescript@2.7.1)(eslint@8.56.0) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@8.56.0) eslint-plugin-prettier: specifier: ^5.0.0 version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.1.1) @@ -78,6 +75,9 @@ importers: typescript: specifier: ^5.3.3 version: 5.3.3 + vercel: + specifier: ^33.5.3 + version: 33.5.3 vitest: specifier: ^1.3.1 version: 1.3.1(@types/node@20.11.0) @@ -131,6 +131,34 @@ importers: specifier: ^5.3.3 version: 5.3.3 + packages/server: + dependencies: + '@hono/node-server': + specifier: ^1.8.2 + version: 1.8.2 + axios: + specifier: ^1.6.2 + version: 1.6.2 + hono: + specifier: ^4.0.8 + version: 4.0.8 + pixel-profile: + specifier: workspace:* + version: link:../pixel-profile + ts-known: + specifier: ^0.1.3 + version: 0.1.3 + devDependencies: + '@types/node': + specifier: ^20.11.0 + version: 20.11.0 + tsup: + specifier: ^8.0.2 + version: 8.0.2(typescript@5.3.3) + typescript: + specifier: ^5.3.3 + version: 5.3.3 + packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -162,6 +190,11 @@ packages: engines: {node: '>=16'} dev: true + /@edge-runtime/format@2.2.1: + resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} + engines: {node: '>=16'} + dev: true + /@edge-runtime/node-utils@2.2.1: resolution: {integrity: sha512-RUl/439BHKshkhSGFRlZ1kzy68wL4mn8VNKDSZr3p0tciyZ33Mjfpl+vofqnHqXRmDI6nLnZpfJvhY3D88o0pA==} engines: {node: '>=16'} @@ -169,16 +202,31 @@ packages: '@edge-runtime/cookies': 3.4.1 dev: true + /@edge-runtime/node-utils@2.3.0: + resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} + engines: {node: '>=16'} + dev: true + /@edge-runtime/ponyfill@2.4.1: resolution: {integrity: sha512-ZbR/EViY3gg2rmEAQTKPa6mXl4aR1/+cFcQe4r1segCjEbTAxT6PWu40odbu/KlZKSysEb2O/BWIC2lJgSJOMQ==} engines: {node: '>=16'} dev: true + /@edge-runtime/ponyfill@2.4.2: + resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} + engines: {node: '>=16'} + dev: true + /@edge-runtime/primitives@4.0.5: resolution: {integrity: sha512-t7QiN5d/KpXgCvIfSt6Nm9Hj3WVdNgc5CpOD73jasY+9EvTI7Ngdj5cXvjcHrPcmYWJZMySPgeEeoL/1N/Llag==} engines: {node: '>=16'} dev: true + /@edge-runtime/primitives@4.1.0: + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} + engines: {node: '>=16'} + dev: true + /@edge-runtime/vm@3.1.7: resolution: {integrity: sha512-hUMFbDQ/nZN+1TLMi6iMO1QFz9RSV8yGG8S42WFPFma1d7VSNE0eMdJUmwjmtav22/iQkzHMmu6oTSfAvRGS8g==} engines: {node: '>=16'} @@ -186,6 +234,13 @@ packages: '@edge-runtime/primitives': 4.0.5 dev: true + /@edge-runtime/vm@3.2.0: + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} + engines: {node: '>=16'} + dependencies: + '@edge-runtime/primitives': 4.1.0 + dev: true + /@esbuild/aix-ppc64@0.19.12: resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} engines: {node: '>=12'} @@ -435,6 +490,11 @@ packages: engines: {node: '>=14'} dev: true + /@hono/node-server@1.8.2: + resolution: {integrity: sha512-h8l2TBLCPHZBUrrkosZ6L5CpBLj6zdESyF4B+zngiCDF7aZFQJ0alVbLx7jn8PCVi9EyoFf8a4hOZFi1tD95EA==} + engines: {node: '>=18.14.1'} + dev: false + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -1165,6 +1225,10 @@ packages: string.prototype.codepointat: 0.2.1 dev: false + /@sinclair/typebox@0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + dev: true + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true @@ -1173,6 +1237,11 @@ packages: resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} dev: false + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: true + /@ts-morph/common@0.11.1: resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} dependencies: @@ -1394,10 +1463,80 @@ packages: resolution: {integrity: sha512-NHTakIX/OMl/VY+uKVZA8teNAekkkldUlYuoAxUGfVuxnRDoUGSouE6LJR3Cwi0NJXte20Y+z1n5h+fhLdqcrA==} dev: true + /@vercel/build-utils@7.7.0: + resolution: {integrity: sha512-dYE0QKnRj9tN1F2AAKHagh3QkgQhz7AWcrRqnp5gjEp74EnxBKJIcZe5qqyKANMCLQ1e96RYy1pQB3zPMGeEzg==} + dev: true + /@vercel/error-utils@2.0.2: resolution: {integrity: sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ==} dev: true + /@vercel/fun@1.1.0: + resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} + engines: {node: '>= 10'} + dependencies: + '@tootallnate/once': 2.0.0 + async-listen: 1.2.0 + debug: 4.1.1 + execa: 3.2.0 + fs-extra: 8.1.0 + generic-pool: 3.4.2 + micro: 9.3.5-canary.3 + ms: 2.1.1 + node-fetch: 2.6.7 + path-match: 1.2.4 + promisepipe: 3.0.0 + semver: 7.3.5 + stat-mode: 0.3.0 + stream-to-promise: 2.2.0 + tar: 4.4.18 + tree-kill: 1.2.2 + uid-promise: 1.0.0 + uuid: 3.3.2 + xdg-app-paths: 5.1.0 + yauzl-promise: 2.1.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@vercel/gatsby-plugin-vercel-analytics@1.0.11: + resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} + dependencies: + web-vitals: 0.2.4 + dev: true + + /@vercel/gatsby-plugin-vercel-builder@2.0.18: + resolution: {integrity: sha512-SbYV8ZBnROHJzS5DbFgSZ3Szp6UiY28DyHwtJ8cJ3z82tnCgIVqRMthUx/icPUZlHXKex4y+QhOWpyqopvEyqQ==} + dependencies: + '@sinclair/typebox': 0.25.24 + '@vercel/build-utils': 7.7.0 + '@vercel/routing-utils': 3.1.0 + esbuild: 0.14.47 + etag: 1.8.1 + fs-extra: 11.1.0 + dev: true + + /@vercel/go@3.0.5: + resolution: {integrity: sha512-+kEDI+hop3e8BuKisaEozxfzT6GBbp0OMBcgi0tlD5ZTmhGmpwi3vgK5mBQlB+RBXj7qlqDLW/uV2F1Y03FLcQ==} + dev: true + + /@vercel/hydrogen@1.0.2: + resolution: {integrity: sha512-/Q2MKk1GfOuZAnkE9jQexjtUQqanbY65R+xtJWd9yKIgwcfRI1hxiNH3uXyVM5AvLoY+fxxULkSuxDtUKpkJpQ==} + dependencies: + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + dev: true + + /@vercel/next@4.1.3: + resolution: {integrity: sha512-9+AZ0b1kFLCK4a9AGGnqE6IfM7bwUpqMDCgWXi2VC/KqCATQcTPfkD+O1GhIr2sgRL4E9u12o27sbG7sGdzh2Q==} + dependencies: + '@vercel/nft': 0.26.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@vercel/nft@0.26.3: resolution: {integrity: sha512-h1z/NN9ppS4YOKwSgBoopJlhm7tS2Qb/9Ld1HXjDpvvTE7mY0xVD8nllXs+RihD9uTGJISOIMzp18Eg0EApaMA==} engines: {node: '>=16'} @@ -1420,6 +1559,28 @@ packages: - supports-color dev: true + /@vercel/nft@0.26.4: + resolution: {integrity: sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + '@rollup/pluginutils': 4.2.1 + acorn: 8.11.3 + acorn-import-attributes: 1.9.2(acorn@8.11.3) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + node-gyp-build: 4.8.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@vercel/node@3.0.18: resolution: {integrity: sha512-EOwOQB80B/+JyXkjNDZs0N9z8P+5QyzGU3RrnpqqfcFkh518yiP5TQedS0NUBeITqKc04az5BTGIEr5uhyRngA==} dependencies: @@ -1448,6 +1609,84 @@ packages: - supports-color dev: true + /@vercel/node@3.0.20: + resolution: {integrity: sha512-J6EqkFczKJyLZFoMv863vBMsqJndisK4fQ6yz41VsBp5bfUo6v3KjNa5miRnLjeKUhrQYGbGQLG89Q6wO1jBVQ==} + dependencies: + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 + '@types/node': 14.18.33 + '@vercel/build-utils': 7.7.0 + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4 + '@vercel/static-config': 3.0.0 + async-listen: 3.0.0 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 + esbuild: 0.14.47 + etag: 1.8.1 + node-fetch: 2.6.9 + path-to-regexp: 6.2.1 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) + typescript: 4.9.5 + undici: 5.26.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color + dev: true + + /@vercel/python@4.1.1: + resolution: {integrity: sha512-EbAdKOZ0hPd5b59tLt7R3RQK1azNvuZTrCFRAVHNjqcIHNCmrSvjag5zBGn7Memkk8qWb3+CgBw9K/3LJKei0w==} + dev: true + + /@vercel/redwood@2.0.8: + resolution: {integrity: sha512-hAu7SYXDt+W7kscjtQ5NsuNflXH+QB5/xAdA6FRSS/e41lG6Xq6pqLMDobqq4BR7E2PpppVDw2DUx9KzPNoeEw==} + dependencies: + '@vercel/nft': 0.26.4 + '@vercel/routing-utils': 3.1.0 + semver: 6.3.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@vercel/remix-builder@2.1.0: + resolution: {integrity: sha512-nfqcDsyuOsiuaMCSxEl+PhgQsFWVXG07c+LaFE22MxiiC00RDN0dJ9A4m7AtYQ0Sb9g0TBBeshLg86uE20VciQ==} + dependencies: + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@vercel/routing-utils@3.1.0: + resolution: {integrity: sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==} + dependencies: + path-to-regexp: 6.1.0 + optionalDependencies: + ajv: 6.12.6 + dev: true + + /@vercel/ruby@2.0.5: + resolution: {integrity: sha512-Gfm8HDech41vf+EPleRzgoJUnDTJerKgckMm4KX0JT860gV9XBMSOWYH7eMWHmMza104+HRCWL7wT6OlpftF2Q==} + dev: true + + /@vercel/static-build@2.4.0: + resolution: {integrity: sha512-i+JDorkLGUVSoBrxbT86LL7L+TrBdL7uwVtqKA6S3QEQb8OfGOfvQKCjtbIRmplTxHWHWo3zFALrmFuB1AaubQ==} + dependencies: + '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 + '@vercel/gatsby-plugin-vercel-builder': 2.0.18 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + dev: true + /@vercel/static-config@3.0.0: resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} dependencies: @@ -1615,6 +1854,10 @@ packages: readable-stream: 3.6.2 dev: true + /arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + dev: true + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true @@ -1717,6 +1960,10 @@ packages: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true + /async-listen@1.2.0: + resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} + dev: true + /async-listen@3.0.0: resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} engines: {node: '>= 14'} @@ -1806,6 +2053,10 @@ packages: fill-range: 7.0.1 dev: true + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + /buffer-equal@0.0.1: resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} engines: {node: '>=0.4.0'} @@ -1842,6 +2093,11 @@ packages: load-tsconfig: 0.2.5 dev: true + /bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + dev: true + /c12@1.8.0: resolution: {integrity: sha512-93U6RndoaAwFQPBcS9F/6lwtgBfrWh4695sQ/ChILkbj0C7zOZVptOU3Sxp0I/9xvfW/lzBWD90AXDQz4muSkA==} dependencies: @@ -1921,6 +2177,21 @@ packages: get-func-name: 2.0.2 dev: true + /chokidar@3.3.1: + resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.3.0 + optionalDependencies: + fsevents: 2.1.3 + dev: true + /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1936,6 +2207,10 @@ packages: fsevents: 2.3.3 dev: true + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -1947,6 +2222,10 @@ packages: consola: 3.2.3 dev: true + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + /cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2040,6 +2319,11 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: true + /content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + dev: true + /convert-hrtime@3.0.0: resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} engines: {node: '>=8'} @@ -2101,6 +2385,18 @@ packages: ms: 2.1.2 dev: true + /debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2155,6 +2451,11 @@ packages: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + /destr@2.0.2: resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} dev: true @@ -2229,6 +2530,22 @@ packages: time-span: 4.0.0 dev: true + /edge-runtime@2.5.9: + resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} + engines: {node: '>=16'} + hasBin: true + dependencies: + '@edge-runtime/format': 2.2.1 + '@edge-runtime/ponyfill': 2.4.2 + '@edge-runtime/vm': 3.2.0 + async-listen: 3.0.1 + mri: 1.2.0 + picocolors: 1.0.0 + pretty-ms: 7.0.1 + signal-exit: 4.0.2 + time-span: 4.0.0 + dev: true + /emoji-name-map@1.2.9: resolution: {integrity: sha512-MSM8y6koSqh/2uEMI2VoKA+Ac0qL5RkgFGP/pzL6n5FOrOJ7FOZFxgs7+uNpqA+AT+WmdbMPXkd3HnFXXdz4AA==} dependencies: @@ -2252,6 +2569,18 @@ packages: resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} dev: false + /end-of-stream@1.1.0: + resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} + dependencies: + once: 1.3.3 + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + /es-abstract@1.22.4: resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} engines: {node: '>= 0.4'} @@ -2336,6 +2665,10 @@ packages: safe-array-concat: 1.1.0 dev: true + /es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + dev: true + /es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} @@ -2958,6 +3291,26 @@ packages: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: true + /events-intercept@2.0.0: + resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} + dev: true + + /execa@3.2.0: + resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} + engines: {node: ^8.12.0 || >=9.7.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3025,6 +3378,12 @@ packages: reusify: 1.0.4 dev: true + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + /fflate@0.7.4: resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} dev: false @@ -3115,6 +3474,30 @@ packages: mime-types: 2.1.35 dev: false + /fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 + dev: true + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -3126,6 +3509,15 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true + /fsevents@2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + deprecated: '"Please update to latest v2.3 or v2.2"' + requiresBuild: true + dev: true + optional: true + /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3167,6 +3559,11 @@ packages: wide-align: 1.1.5 dev: true + /generic-pool@3.4.2: + resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} + engines: {node: '>= 4'} + dev: true + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -3197,6 +3594,13 @@ packages: engines: {node: '>=0.12.0'} dev: true + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -3377,6 +3781,30 @@ packages: engines: {node: '>=6'} dev: false + /hono@4.0.8: + resolution: {integrity: sha512-zhTXu32vXeEXajsqZVjPfoyO0/fgAKLLmPBpSDzRBMr7zZ5N8yV1FmsfWl2MYtm+MD8hD7knLCovx8Oaqubd4w==} + engines: {node: '>=16.0.0'} + dev: false + + /http-errors@1.4.0: + resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} + engines: {node: '>= 0.6'} + dependencies: + inherits: 2.0.1 + statuses: 1.5.0 + dev: true + + /http-errors@1.7.3: + resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: true + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -3387,6 +3815,11 @@ packages: - supports-color dev: true + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -3403,6 +3836,13 @@ packages: hasBin: true dev: true + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false @@ -3438,6 +3878,10 @@ packages: wrappy: 1.0.2 dev: true + /inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + dev: true + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3642,6 +4086,10 @@ packages: get-intrinsic: 1.2.4 dev: true + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: true + /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true @@ -3781,6 +4229,20 @@ packages: resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} dev: true + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -3971,6 +4433,16 @@ packages: engines: {node: '>= 8'} dev: true + /micro@9.3.5-canary.3: + resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} + engines: {node: '>= 8.0.0'} + hasBin: true + dependencies: + arg: 4.1.0 + content-type: 1.0.4 + raw-body: 2.4.1 + dev: true + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -4030,6 +4502,13 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -4047,6 +4526,12 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dev: true + /minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + dev: true + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -4055,6 +4540,13 @@ packages: yallist: 4.0.0 dev: true + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -4075,6 +4567,10 @@ packages: engines: {node: '>=4'} dev: true + /ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + dev: true + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -4101,6 +4597,18 @@ packages: resolution: {integrity: sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==} dev: true + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + /node-fetch@2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} @@ -4252,6 +4760,12 @@ packages: resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} dev: false + /once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + dependencies: + wrappy: 1.0.2 + dev: true + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -4284,6 +4798,16 @@ packages: type-check: 0.4.0 dev: true + /os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + dev: true + + /p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + dev: true + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -4375,6 +4899,13 @@ packages: engines: {node: '>=12'} dev: true + /path-match@1.2.4: + resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} + dependencies: + http-errors: 1.4.0 + path-to-regexp: 1.8.0 + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -4387,6 +4918,16 @@ packages: minipass: 7.0.4 dev: true + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: true + + /path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} + dev: true + /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: true @@ -4409,6 +4950,10 @@ packages: engines: {node: '>=8'} dev: false + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + /perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} dev: true @@ -4540,6 +5085,10 @@ packages: engines: {node: '>= 0.6.0'} dev: false + /promisepipe@3.0.0: + resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} + dev: true + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -4560,6 +5109,13 @@ packages: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -4569,6 +5125,16 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /raw-body@2.4.1: + resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.0 + http-errors: 1.7.3 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + /rc9@2.1.1: resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} dependencies: @@ -4608,6 +5174,13 @@ packages: readable-stream: 3.6.2 dev: false + /readdirp@3.3.0: + resolution: {integrity: sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -4777,6 +5350,10 @@ packages: is-regex: 1.1.4 dev: true + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + /satori@0.10.11: resolution: {integrity: sha512-yLm1xPRPZUaKcBZJ6nmezoJjHB4MqV8x7Mu0PyZUJodRWRDD27UbeMwzuY9LEGG57WYLO4CQsGPlbHWV1Ex9TQ==} engines: {node: '>=16'} @@ -4802,6 +5379,14 @@ packages: hasBin: true dev: true + /semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -4836,6 +5421,10 @@ packages: has-property-descriptors: 1.0.2 dev: true + /setprototypeof@1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + dev: true + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -4929,10 +5518,33 @@ packages: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true + /stat-mode@0.3.0: + resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: true + /std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true + /stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + dependencies: + any-promise: 1.3.0 + dev: true + + /stream-to-promise@2.2.0: + resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + dependencies: + any-promise: 1.3.0 + end-of-stream: 1.1.0 + stream-to-array: 2.3.0 + dev: true + /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -5102,6 +5714,19 @@ packages: tslib: 2.6.2 dev: true + /tar@4.4.18: + resolution: {integrity: sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + /tar@6.2.0: resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} engines: {node: '>=10'} @@ -5171,6 +5796,11 @@ packages: is-number: 7.0.0 dev: true + /toidentifier@1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} + dev: true + /token-types@4.2.1: resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} engines: {node: '>=10'} @@ -5445,6 +6075,10 @@ packages: resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} dev: true + /uid-promise@1.0.0: + resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} + dev: true + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -5472,6 +6106,21 @@ packages: tiny-inflate: 1.0.3 dev: false + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -5487,10 +6136,40 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + /uuid@3.3.2: + resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true + /vercel@33.5.3: + resolution: {integrity: sha512-aVE2FTkqlbceXLbi27kwdJiWSdfl6b2kTDgOHvR5VmHlztqhO73DW4ZQw0UUd9mRXEXpQNmOYsidKPu6rX7PHA==} + engines: {node: '>= 16'} + hasBin: true + dependencies: + '@vercel/build-utils': 7.7.0 + '@vercel/fun': 1.1.0 + '@vercel/go': 3.0.5 + '@vercel/hydrogen': 1.0.2 + '@vercel/next': 4.1.3 + '@vercel/node': 3.0.20 + '@vercel/python': 4.1.1 + '@vercel/redwood': 2.0.8 + '@vercel/remix-builder': 2.1.0 + '@vercel/ruby': 2.0.5 + '@vercel/static-build': 2.4.0 + chokidar: 3.3.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color + dev: true + /vite-node@1.3.1(@types/node@20.11.0): resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} engines: {node: ^18.0.0 || >=20.0.0} @@ -5604,6 +6283,10 @@ packages: - terser dev: true + /web-vitals@0.2.4: + resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} + dev: true + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -5731,6 +6414,20 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /xdg-app-paths@5.1.0: + resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} + engines: {node: '>=6'} + dependencies: + xdg-portable: 7.3.0 + dev: true + + /xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + dependencies: + os-paths: 4.4.0 + dev: true + /xhr@2.6.0: resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} dependencies: @@ -5767,6 +6464,10 @@ packages: engines: {node: '>=10'} dev: true + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true @@ -5794,6 +6495,28 @@ packages: yargs-parser: 21.1.1 dev: true + /yauzl-clone@1.0.4: + resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} + engines: {node: '>=6'} + dependencies: + events-intercept: 2.0.0 + dev: true + + /yauzl-promise@2.1.3: + resolution: {integrity: sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==} + engines: {node: '>=6'} + dependencies: + yauzl: 2.10.0 + yauzl-clone: 1.0.4 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} diff --git a/tsconfig.json b/tsconfig.json index 873b565..f3035d3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,6 +13,7 @@ }, "include": [ "api", + "src" ], "exclude": ["node_modules", "packages"] } diff --git a/vercel.json b/vercel.json index 4ce8921..d147240 100644 --- a/vercel.json +++ b/vercel.json @@ -1,11 +1,14 @@ { "outputDirectory": ".", + "rewrites": [ + { + "source": "/api/(.*)", + "destination": "/api/handle" + } + ], "functions": { "api/*.ts": { "maxDuration": 10 - }, - "api/status/*.ts": { - "maxDuration": 10 } } } From 5b3862f268b1532259a78f4b62afb5e010a76fd2 Mon Sep 17 00:00:00 2001 From: Elu Date: Fri, 1 Mar 2024 21:46:18 +0800 Subject: [PATCH 2/5] feat: add local server entry --- package.json | 3 ++- packages/server/package.json | 4 +++- packages/server/src/node.ts | 12 ++++++++++++ packages/server/tsup.config.ts | 2 +- pnpm-lock.yaml | 4 +++- 5 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 packages/server/src/node.ts diff --git a/package.json b/package.json index 902114f..277a537 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "url": "https://github.com/LuciNyan/pixel-profile.git" }, "scripts": { - "start": "concurrently \"pnpm dev:vercel\" \"pnpm dev:pixel-profile\" \"pnpm dev:server\"", + "start": "concurrently \"pnpm dev:vercel\" \"pnpm dev:pixel-profile\"", + "start:server": "node --experimental-modules packages/server/dist/node.js", "dev:vercel": "vercel dev --yes", "dev:pixel-profile": "turbo dev --filter=pixel-profile", "dev:server": "turbo dev --filter=server", diff --git a/packages/server/package.json b/packages/server/package.json index b42d503..fde2694 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -14,7 +14,8 @@ "main": "./dist/index.js", "scripts": { "dev": "tsup src/index.ts --watch", - "build": "tsup" + "build": "tsup", + "start": "node --experimental-modules dist/node.js" }, "type": "module", "author": "LuciNyan", @@ -33,6 +34,7 @@ "dependencies": { "@hono/node-server": "^1.8.2", "axios": "^1.6.2", + "dotenv": "^16.3.1", "hono": "^4.0.8", "pixel-profile": "workspace:*", "ts-known": "^0.1.3" diff --git a/packages/server/src/node.ts b/packages/server/src/node.ts new file mode 100644 index 0000000..18eea4d --- /dev/null +++ b/packages/server/src/node.ts @@ -0,0 +1,12 @@ +import 'dotenv/config' +import { app } from './app' +import { serve } from '@hono/node-server' + +const PORT = Number(process.env.PORT) || 3000 + +console.log(`The server is start, Port is ${PORT}`) + +serve({ + fetch: app.fetch, + port: PORT +}) diff --git a/packages/server/tsup.config.ts b/packages/server/tsup.config.ts index 83ebe35..ceaafd5 100644 --- a/packages/server/tsup.config.ts +++ b/packages/server/tsup.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from 'tsup' export default defineConfig({ - entry: ['src/index.ts'], + entry: ['src/index.ts', 'src/node.ts'], splitting: false, sourcemap: false, target: 'node16', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 95caaef..13ce47d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -139,6 +139,9 @@ importers: axios: specifier: ^1.6.2 version: 1.6.2 + dotenv: + specifier: ^16.3.1 + version: 16.4.4 hono: specifier: ^4.0.8 version: 4.0.8 @@ -2508,7 +2511,6 @@ packages: /dotenv@16.4.4: resolution: {integrity: sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==} engines: {node: '>=12'} - dev: true /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} From c7136fae4e093d5f689735a8ee8c3ac75f758afb Mon Sep 17 00:00:00 2001 From: Elu Date: Fri, 1 Mar 2024 22:37:11 +0800 Subject: [PATCH 3/5] chore: change the server package name --- api/handle.ts | 2 +- package.json | 8 ++++---- packages/{server => pixel-profile-server}/package.json | 3 ++- packages/{server => pixel-profile-server}/src/app.ts | 0 .../{server => pixel-profile-server}/src/github-stats.ts | 0 packages/{server => pixel-profile-server}/src/index.ts | 0 packages/{server => pixel-profile-server}/src/node.ts | 0 .../{server => pixel-profile-server}/src/status/index.ts | 0 .../src/status/pat-info.ts | 0 .../{server => pixel-profile-server}/src/status/up.ts | 0 .../{server => pixel-profile-server}/src/utils/index.ts | 0 packages/{server => pixel-profile-server}/src/vercel.ts | 0 packages/{server => pixel-profile-server}/tsconfig.json | 0 packages/{server => pixel-profile-server}/tsup.config.ts | 2 +- pnpm-lock.yaml | 6 +++--- 15 files changed, 11 insertions(+), 10 deletions(-) rename packages/{server => pixel-profile-server}/package.json (94%) rename packages/{server => pixel-profile-server}/src/app.ts (100%) rename packages/{server => pixel-profile-server}/src/github-stats.ts (100%) rename packages/{server => pixel-profile-server}/src/index.ts (100%) rename packages/{server => pixel-profile-server}/src/node.ts (100%) rename packages/{server => pixel-profile-server}/src/status/index.ts (100%) rename packages/{server => pixel-profile-server}/src/status/pat-info.ts (100%) rename packages/{server => pixel-profile-server}/src/status/up.ts (100%) rename packages/{server => pixel-profile-server}/src/utils/index.ts (100%) rename packages/{server => pixel-profile-server}/src/vercel.ts (100%) rename packages/{server => pixel-profile-server}/tsconfig.json (100%) rename packages/{server => pixel-profile-server}/tsup.config.ts (96%) diff --git a/api/handle.ts b/api/handle.ts index 6e5be1c..38ce14b 100644 --- a/api/handle.ts +++ b/api/handle.ts @@ -1,3 +1,3 @@ -import { vercelHandle } from '@pixel-profile/server' +import { vercelHandle } from 'pixel-profile-server' export default vercelHandle diff --git a/package.json b/package.json index 277a537..57405e5 100644 --- a/package.json +++ b/package.json @@ -11,15 +11,15 @@ }, "scripts": { "start": "concurrently \"pnpm dev:vercel\" \"pnpm dev:pixel-profile\"", - "start:server": "node --experimental-modules packages/server/dist/node.js", + "start:server": "node --experimental-modules packages/pixel-profile-server/dist/node.js", "dev:vercel": "vercel dev --yes", "dev:pixel-profile": "turbo dev --filter=pixel-profile", - "dev:server": "turbo dev --filter=server", + "dev:server": "turbo dev --filter=pixel-profile-server", "build": "pnpm -r build", "release": "bumpp --commit --push --tag -r && pnpm publish ./packages/pixel-profile --access=public", "format": "prettier --write .", "prepare": "husky install", - "lint": "eslint -c .eslintrc.json --ext .ts,.tsx api packages/pixel-profile/src packages/server/src", + "lint": "eslint -c .eslintrc.json --ext .ts,.tsx api packages/pixel-profile/src packages/pixel-profile-server/src", "lint:fix": "pnpm lint --fix", "test": "vitest run", "test-type": "pnpm --filter=pixel-profile run test-type" @@ -53,7 +53,7 @@ "vitest": "^1.3.1" }, "dependencies": { - "@pixel-profile/server": "workspace:*" + "pixel-profile-server": "workspace:*" }, "lint-staged": { "*.{js,css,md}": "prettier --write", diff --git a/packages/server/package.json b/packages/pixel-profile-server/package.json similarity index 94% rename from packages/server/package.json rename to packages/pixel-profile-server/package.json index fde2694..ec865dd 100644 --- a/packages/server/package.json +++ b/packages/pixel-profile-server/package.json @@ -1,5 +1,5 @@ { - "name": "@pixel-profile/server", + "name": "pixel-profile-server", "version": "0.0.1", "description": "", "homepage": "https://github.com/LuciNyan/pixel-profile", @@ -12,6 +12,7 @@ }, "module": "./dist/index.js", "main": "./dist/index.js", + "types": "./dist/index.d.ts", "scripts": { "dev": "tsup src/index.ts --watch", "build": "tsup", diff --git a/packages/server/src/app.ts b/packages/pixel-profile-server/src/app.ts similarity index 100% rename from packages/server/src/app.ts rename to packages/pixel-profile-server/src/app.ts diff --git a/packages/server/src/github-stats.ts b/packages/pixel-profile-server/src/github-stats.ts similarity index 100% rename from packages/server/src/github-stats.ts rename to packages/pixel-profile-server/src/github-stats.ts diff --git a/packages/server/src/index.ts b/packages/pixel-profile-server/src/index.ts similarity index 100% rename from packages/server/src/index.ts rename to packages/pixel-profile-server/src/index.ts diff --git a/packages/server/src/node.ts b/packages/pixel-profile-server/src/node.ts similarity index 100% rename from packages/server/src/node.ts rename to packages/pixel-profile-server/src/node.ts diff --git a/packages/server/src/status/index.ts b/packages/pixel-profile-server/src/status/index.ts similarity index 100% rename from packages/server/src/status/index.ts rename to packages/pixel-profile-server/src/status/index.ts diff --git a/packages/server/src/status/pat-info.ts b/packages/pixel-profile-server/src/status/pat-info.ts similarity index 100% rename from packages/server/src/status/pat-info.ts rename to packages/pixel-profile-server/src/status/pat-info.ts diff --git a/packages/server/src/status/up.ts b/packages/pixel-profile-server/src/status/up.ts similarity index 100% rename from packages/server/src/status/up.ts rename to packages/pixel-profile-server/src/status/up.ts diff --git a/packages/server/src/utils/index.ts b/packages/pixel-profile-server/src/utils/index.ts similarity index 100% rename from packages/server/src/utils/index.ts rename to packages/pixel-profile-server/src/utils/index.ts diff --git a/packages/server/src/vercel.ts b/packages/pixel-profile-server/src/vercel.ts similarity index 100% rename from packages/server/src/vercel.ts rename to packages/pixel-profile-server/src/vercel.ts diff --git a/packages/server/tsconfig.json b/packages/pixel-profile-server/tsconfig.json similarity index 100% rename from packages/server/tsconfig.json rename to packages/pixel-profile-server/tsconfig.json diff --git a/packages/server/tsup.config.ts b/packages/pixel-profile-server/tsup.config.ts similarity index 96% rename from packages/server/tsup.config.ts rename to packages/pixel-profile-server/tsup.config.ts index ceaafd5..8f04209 100644 --- a/packages/server/tsup.config.ts +++ b/packages/pixel-profile-server/tsup.config.ts @@ -5,7 +5,7 @@ export default defineConfig({ splitting: false, sourcemap: false, target: 'node16', - dts: false, + dts: true, minify: process.env.NODE_ENV !== 'development', format: ['esm'], esbuildOptions(options) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13ce47d..b458f47 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,9 @@ importers: .: dependencies: - '@pixel-profile/server': + pixel-profile-server: specifier: workspace:* - version: link:packages/server + version: link:packages/pixel-profile-server devDependencies: '@types/node': specifier: ^20.11.0 @@ -131,7 +131,7 @@ importers: specifier: ^5.3.3 version: 5.3.3 - packages/server: + packages/pixel-profile-server: dependencies: '@hono/node-server': specifier: ^1.8.2 From 0063f583c0bae3692c97cfd535c7a85b18e11dba Mon Sep 17 00:00:00 2001 From: Elu Date: Fri, 1 Mar 2024 22:46:39 +0800 Subject: [PATCH 4/5] chore: use `cross-env` to set environment variables for development. On Windows, setting environment variables directly via `NODE_ENV=development` will fail. --- package.json | 1 + packages/pixel-profile-server/package.json | 2 +- packages/pixel-profile/package.json | 2 +- pnpm-lock.yaml | 11 +++++++++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 57405e5..a751185 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "@vercel/node": "^3.0.18", "bumpp": "^9.3.0", "concurrently": "^7.3.0", + "cross-env": "^7.0.3", "eslint": "^8.25.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^16.0.3", diff --git a/packages/pixel-profile-server/package.json b/packages/pixel-profile-server/package.json index ec865dd..c651204 100644 --- a/packages/pixel-profile-server/package.json +++ b/packages/pixel-profile-server/package.json @@ -14,7 +14,7 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "dev": "tsup src/index.ts --watch", + "dev": "cross-env NODE_ENV=development tsup src/index.ts --watch", "build": "tsup", "start": "node --experimental-modules dist/node.js" }, diff --git a/packages/pixel-profile/package.json b/packages/pixel-profile/package.json index 2c60412..850f966 100644 --- a/packages/pixel-profile/package.json +++ b/packages/pixel-profile/package.json @@ -13,7 +13,7 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "dev": "NODE_ENV=development tsup src/index.ts --watch", + "dev": "cross-env NODE_ENV=development tsup src/index.ts --watch", "build": "tsup", "test-type": "tsc --noEmit" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b458f47..485ce38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,6 +30,9 @@ importers: concurrently: specifier: ^7.3.0 version: 7.6.0 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 eslint: specifier: ^8.25.0 version: 8.56.0 @@ -2336,6 +2339,14 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} From 846fe32089167c71d4923900eb2bc1ae58fdd3ad Mon Sep 17 00:00:00 2001 From: Elu Date: Sat, 2 Mar 2024 00:13:30 +0800 Subject: [PATCH 5/5] chore: add Dockerfile --- .dockerignore | 6 ++++++ Dockerfile | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3673564 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +node_modules +.git +.gitignore +*.md +dist +.env diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ad5c032 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +FROM node:20-alpine AS base + +FROM base AS builder + +RUN npm i -g pnpm +RUN apk add --no-cache libc6-compat +WORKDIR /app + +COPY . . + +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile +RUN pnpm run -r build +RUN pnpm deploy --filter=pixel-profile-server --prod /prod/pixel-profile-server + +FROM base AS runner +WORKDIR /app + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 hono + +COPY --from=builder /prod/pixel-profile-server /app/packages/pixel-profile-server +COPY --from=builder /app/packages/pixel-profile/fonts/ /app/packages/pixel-profile/fonts/ + +USER hono +ENV NODE_ENV=production +ENV PORT 3000 +EXPOSE ${PORT} + +CMD ["node", "--experimental-modules", "/app/packages/pixel-profile-server/dist/node.js"]