From f40ff817ef3563c484bb331f72e3e628257f92e2 Mon Sep 17 00:00:00 2001 From: Cory Sanin Date: Fri, 25 Apr 2025 14:00:50 -0500 Subject: [PATCH] Ditch bun --- .gitignore | 1 + Dockerfile | 39 +- assets/images/{ => original}/bitch.jpg | Bin assets/images/{ => original}/cache-me.png | Bin build.ts | 171 --- bun.lockb | Bin 46243 -> 0 bytes docker-compose.yml | 2 +- package-lock.json | 1654 +++++++++++++++++++++ package.json | 19 +- index.ts => src/index.ts | 9 +- styles/01-poetry-n-style.scss | 2 +- tsconfig.json | 25 +- 12 files changed, 1691 insertions(+), 231 deletions(-) rename assets/images/{ => original}/bitch.jpg (100%) rename assets/images/{ => original}/cache-me.png (100%) delete mode 100644 build.ts delete mode 100755 bun.lockb create mode 100644 package-lock.json rename index.ts => src/index.ts (84%) diff --git a/.gitignore b/.gitignore index 68bcd94..f57401c 100644 --- a/.gitignore +++ b/.gitignore @@ -106,4 +106,5 @@ dist assets/css/ assets/js/ assets/webp/ +assets/images/webp/ config/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 76444fe..f51e38b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,36 +1,21 @@ -FROM oven/bun:alpine AS baseimg +FROM node:23-alpine AS base +FROM base AS build-env -FROM baseimg AS dependencies WORKDIR /build - -COPY ./package*json ./ -COPY ./bun.lockb ./ -RUN bun install --production --no-progress && \ - chown -R bun . - - -FROM dependencies as build-env -WORKDIR /build - RUN apk add --no-cache libwebp libwebp-tools - -RUN bun install --no-progress - +COPY ./package*json ./ +RUN npm ci COPY . . +RUN npm run build && \ + npm exec tsc && \ + npm ci --only=production --omit=dev -RUN bun run build.ts && \ - chown -R bun . +FROM base AS deploy +WORKDIR /srv/bitch -FROM baseimg as deploy -WORKDIR /usr/src/bitch -HEALTHCHECK --timeout=3s \ - CMD curl --fail http://localhost:8080/healthcheck || exit 1 -RUN apk add --no-cache curl -COPY --from=dependencies /build . -COPY --from=build-env /build/assets ./assets -COPY . . -USER bun +RUN apk add --no-cache docker-cli +COPY --from=build-env /build . EXPOSE 8080 -CMD [ "bun", "run", "index.ts"] \ No newline at end of file +CMD [ "node", "--experimental-strip-types", "src/index.ts"] \ No newline at end of file diff --git a/assets/images/bitch.jpg b/assets/images/original/bitch.jpg similarity index 100% rename from assets/images/bitch.jpg rename to assets/images/original/bitch.jpg diff --git a/assets/images/cache-me.png b/assets/images/original/cache-me.png similarity index 100% rename from assets/images/cache-me.png rename to assets/images/original/cache-me.png diff --git a/build.ts b/build.ts deleted file mode 100644 index 95cdb47..0000000 --- a/build.ts +++ /dev/null @@ -1,171 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import child_process from 'child_process'; -import uglifyjs from "uglify-js"; -import * as sass from 'sass'; -import * as csso from 'csso'; - -const spawn = child_process.spawn; -const fsp = fs.promises; -const STYLESDIR = 'styles'; -const SCRIPTSDIR = 'scripts'; -const IMAGESDIR = path.join('assets', 'images'); -const STYLEOUTDIR = process.env.STYLEOUTDIR || path.join(import.meta.dir, 'assets', 'css'); -const SCRIPTSOUTDIR = process.env.SCRIPTSOUTDIR || path.join(import.meta.dir, 'assets', 'js'); -const IMAGESOUTDIR = process.env.IMAGESOUTDIR || path.join(import.meta.dir, 'assets', 'webp'); -const STYLEOUTFILE = process.env.STYLEOUTFILE || 'styles.css'; -const SQUASH = new RegExp('^[0-9]+-'); - -async function emptyDir(dir: string) { - await Promise.all((await fsp.readdir(dir, { withFileTypes: true })).map(f => path.join(dir, f.name)).map(p => fsp.rm(p, { - recursive: true, - force: true - }))); -} - -async function mkdir(dir: string | string[]) { - if (typeof dir === 'string') { - await fsp.mkdir(dir, { recursive: true }); - } - else { - await Promise.all(dir.map(mkdir)); - } -} - -// Process styles -async function styles() { - await mkdir([STYLEOUTDIR, STYLESDIR]); - await emptyDir(STYLEOUTDIR); - let styles: string[] = []; - let files = await fsp.readdir(STYLESDIR); - await Promise.all(files.map(f => new Promise(async (res, reject) => { - let p = path.join(STYLESDIR, f); - console.log(`Processing style ${p}`); - let style = sass.compile(p).css; - if (f.charAt(0) !== '_') { - if (SQUASH.test(f)) { - styles.push(style); - } - else { - let o = path.join(STYLEOUTDIR, f.substring(0, f.lastIndexOf('.')) + '.css'); - await fsp.writeFile(o, csso.minify(style).css); - console.log(`Wrote ${o}`); - } - } - res(0); - }))); - let out = csso.minify(styles.join('\n')).css; - let outpath = path.join(STYLEOUTDIR, STYLEOUTFILE); - await fsp.writeFile(outpath, out); - console.log(`Wrote ${outpath}`); -} - -// Process scripts -async function scripts() { - await mkdir([SCRIPTSOUTDIR, SCRIPTSDIR]); - await emptyDir(SCRIPTSOUTDIR); - let files = await fsp.readdir(SCRIPTSDIR); - await Promise.all(files.map(f => new Promise(async (res, reject) => { - let p = path.join(SCRIPTSDIR, f); - let o = path.join(SCRIPTSOUTDIR, f); - console.log(`Processing script ${p}`); - try { - await fsp.writeFile(o, uglifyjs.minify((await fsp.readFile(p)).toString()).code); - console.log(`Wrote ${o}`); - } - catch (ex) { - console.log(`error writing ${o}: ${ex}`); - } - res(0); - }))); -} - -// Process images -async function images(dir = '') { - let p = path.join(IMAGESDIR, dir); - await mkdir(p); - if (dir.length === 0) { - await mkdir(IMAGESOUTDIR) - await emptyDir(IMAGESOUTDIR); - } - let files = await fsp.readdir(p, { - withFileTypes: true - }); - if (files.length) { - await Promise.all(files.map(f => new Promise(async (res, reject) => { - if (f.isFile()) { - let outDir = path.join(IMAGESOUTDIR, dir); - let infile = path.join(p, f.name); - let outfile = path.join(outDir, f.name.substring(0, f.name.lastIndexOf('.')) + '.webp'); - await mkdir(outDir); - console.log(`Processing image ${infile}`) - let process = spawn('cwebp', ['-mt', '-q', '50', infile, '-o', outfile]); - let timeout = setTimeout(() => { - reject('Timed out'); - process.kill(); - }, 30000); - process.on('exit', async (code) => { - clearTimeout(timeout); - if (code === 0) { - console.log(`Wrote ${outfile}`); - res(null); - } - else { - reject(code); - } - }); - } - else if (f.isDirectory()) { - images(path.join(dir, f.name)).then(res).catch(reject); - } - }))); - } -} - -function isAbortError(err: unknown): boolean { - return typeof err === 'object' && err !== null && 'name' in err && err.name === 'AbortError'; -} - -(async function () { - await Promise.all([styles(), scripts(), images()]); - if (process.argv.indexOf('--watch') >= 0) { - console.log('watching for changes...'); - (async () => { - try { - const watcher = fsp.watch(STYLESDIR); - for await (const _ of watcher) - await styles(); - } catch (err) { - if (isAbortError(err)) - return; - throw err; - } - })(); - - (async () => { - try { - const watcher = fsp.watch(SCRIPTSDIR); - for await (const _ of watcher) - await scripts(); - } catch (err) { - if (isAbortError(err)) - return; - throw err; - } - })(); - - (async () => { - try { - const watcher = fsp.watch(IMAGESDIR, { - recursive: true // no Linux ☹️ - }); - for await (const _ of watcher) - await images(); - } catch (err) { - if (isAbortError(err)) - return; - throw err; - } - })(); - } -})(); diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index ed0145c14a5c034da4e6149dff0a5dde421b6f13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46243 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 N6#TH^|9k)ce*k+Oh#dd` diff --git a/docker-compose.yml b/docker-compose.yml index cfe8e9e..4f29e53 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,4 +10,4 @@ services: ports: - 8080:8080 volumes: - - ./config:/usr/src/bitch/config \ No newline at end of file + - ./config:/srv/bitch/config \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9b07c0d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1654 @@ +{ + "name": "jakehurwitzisabitch", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "jakehurwitzisabitch", + "dependencies": { + "ejs": "3.1.10", + "express": "4.21.2" + }, + "devDependencies": { + "@types/express": "4.17.21", + "forking-build-shit": "0.0.2", + "typescript": "^5.0.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "3.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.11.5", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node/node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/send/node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.5", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filelist/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forking-build-shit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/forking-build-shit/-/forking-build-shit-0.0.2.tgz", + "integrity": "sha512-1qpXIK3nX8ZPTbwojsqxjTp5qDITX24MkKaX/8p6mMkIAQiVul1nhdYCAFLpnpnLon87Ru1exlJKhkvIKT7b+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "csso": "5.0.5", + "sass": "1.86.0", + "uglify-js": "3.19.3" + }, + "bin": { + "build-shit": "bin/build-shit.js" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", + "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.28", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz", + "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/package.json b/package.json index b87e0fe..4ddba4d 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,18 @@ { "name": "jakehurwitzisabitch", - "module": "index.ts", + "module": "src/index.ts", "type": "module", "dependencies": { - "ejs": "3.1.9", - "express": "4.18.2" + "ejs": "3.1.10", + "express": "4.21.2" }, "devDependencies": { - "@types/bun": "latest", "@types/express": "4.17.21", - "@types/csso": "5.0.4", - "@types/uglify-js": "3.17.4", - "csso": "5.0.5", - "sass": "1.66.1", - "uglify-js": "3.17.4" - }, - "peerDependencies": { + "forking-build-shit": "0.0.2", "typescript": "^5.0.0" + }, + "scripts": { + "build": "npx build-shit", + "watch": "npx build-shit --watch" } } \ No newline at end of file diff --git a/index.ts b/src/index.ts similarity index 84% rename from index.ts rename to src/index.ts index 522ef11..e3db7cb 100644 --- a/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ import type { Express } from "express"; import express, { application } from 'express'; import Path from 'path'; +import fsp from 'fs/promises'; function notStupidParseInt(v: string | undefined): number { return v === undefined ? NaN : parseInt(v); @@ -13,9 +14,9 @@ const dataPath: string = process.env.CONFIG || Path.join('config', 'config.json' app.set('trust proxy', 1); app.set('view engine', 'ejs'); app.set('view options', { outputFunctionName: 'echo' }); -app.use('/assets', express.static('assets')); +app.use('/assets', express.static('assets', { maxAge: '12m' })); -let visitCount = (await Bun.file(dataPath).json())['visits'] as number || 0; +let visitCount = JSON.parse((await fsp.readFile(dataPath)).toString())['visits'] as number || 0; app.get('/healthcheck', (req, res) => { res.send('Healthy'); @@ -41,7 +42,7 @@ app.get('/', (req, res) => { const sendPixel = (_: express.Request, res: express.Response) => { res.set('Cache-Control', 'private, max-age=31557600'); // one year visitCount++; - res.sendFile(Path.join(import.meta.dir, 'assets', 'webp', 'cache-me.webp')); + res.sendFile(Path.join(import.meta.dirname, 'assets', 'images', 'webp', 'cache-me.webp')); } app.get('/cache-me.webp', sendPixel); @@ -55,7 +56,7 @@ app.all('*', (req, res) => { const webserver = app.listen(port, () => console.log(`jakehurwitzisabitch.com running on port ${port}`)); async function saveVisits() { - await Bun.write(dataPath, JSON.stringify({ + await fsp.writeFile(dataPath, JSON.stringify({ visits: visitCount })); } diff --git a/styles/01-poetry-n-style.scss b/styles/01-poetry-n-style.scss index 2743040..46b9312 100644 --- a/styles/01-poetry-n-style.scss +++ b/styles/01-poetry-n-style.scss @@ -13,7 +13,7 @@ body { } body { - background: url('/assets/webp/bitch.webp'); + background: url('/assets/images/webp/bitch.webp'); } #w { diff --git a/tsconfig.json b/tsconfig.json index dcd8fc5..1a127c6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,22 +1,15 @@ { "compilerOptions": { "lib": ["ESNext"], + "module": "NodeNext", "target": "ESNext", - "module": "ESNext", - "moduleDetection": "force", - "jsx": "react-jsx", - "allowJs": true, - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "noEmit": true, - - /* Linting */ + "esModuleInterop": true, "skipLibCheck": true, - "strict": true, - "noFallthroughCasesInSwitch": true, - "forceConsistentCasingInFileNames": true - } -} + "moduleResolution": "node16", + "noEmit": true, + "allowImportingTsExtensions": true + }, + "include": ["src/**/*"], + "exclude": ["**/*.spec.ts"] +} \ No newline at end of file