Pulumi code for my server setup
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

wowee look at all those changes

+4500 -696
+28 -9
.env.example
··· 1 + PGID= 2 + TZ= 3 + PUID= 4 + AUTO_LANGUAGES_DISCORD_WEBHOOK= 5 + CADDY_PASSWORD= 6 + CADDY_USERNAME= 1 7 CF_API_KEY= 8 + CLOUDFLARE_API_KEY= 9 + CONNECTION_HOST= 10 + CONNECTION_PASSWORD= 11 + CONNECTION_USER= 12 + CURSEFORGE_API_KEY= 13 + DISCORD_AUTO_LANGUAGES_WEBHOOK= 14 + EMAIL= 15 + GHCR_TOKEN= 2 16 IPINFO_APIKEY= 3 - MKVTOOLNIX_VNC_PASSWORD= 4 - QBITTORRENT_USERNAME= 17 + JDOWNLOADER_PASSWORD= 18 + KOPIA_PASSWORD= 19 + LIBRESPEED_PASSWORD= 20 + PLEX_TOKEN= 21 + POSTGRES_PASSWORD= 22 + PROTON_OPENVPN_PASS= 23 + PROTON_OPENVPN_USER= 5 24 QBITTORRENT_PASSWORD= 6 - PLEX_TOKEN= 7 - DISCORD_AUTO_LANGUAGES_WEBHOOK= 8 - LIBRESPEED_PASSWORD= 9 - EMAIL= 10 - PUID= 11 - PGID= 12 - TZ= 25 + RCON_PASSWORD= 26 + SPACEDRIVE_PASSWORD= 27 + TAILSCALE_AUTH_KEY= 28 + USERNAME= 29 + VALKEY_PASSWORD= 30 + VNC_PASSWORD= 31 + KANEELNAS_HOST=
+3 -1
.gitignore
··· 1 1 node_modules/ 2 - 2 + .old/* 3 + !.old/jsonnet/ 3 4 .env 5 + *.trace
+2 -1
Pulumi.prod.yaml
··· 1 1 config: 2 - docker:host: ssh://haring 2 + pulumi:disable-default-providers: 3 + - docker
+2 -5
Pulumi.yaml
··· 2 2 runtime: 3 3 name: nodejs 4 4 options: 5 - nodeargs: "--loader ts-node/esm --no-warnings --experimental-specifier-resolution=node" 5 + packagemanager: bun 6 6 typescript: true 7 + nodeargs: "--import tsx/esm" 7 8 description: Pulumi definitions for my media server 8 - config: 9 - pulumi:tags: 10 - value: 11 - pulumi:template: https://www.pulumi.com/ai/api/project/836ba65a-7cc5-4519-930b-2e6ec54cc841.zip
+2 -4
README.md
··· 1 - # Media Server 1 + # Media Server Stack 2 2 3 - My single node media server. Used to be Docker Swarm (in the jsonnet folder), now just Docker containers orchestrated using Pulumi. 3 + The Pulumi code I use for my single node container-based media server (among other things). Used to be Docker Swarm, generating my Docker Compose file with Jsonnet (my old setup can be found in the [jsonnet](./.old/jsonnet) folder), but I have since switched to orchestrating Docker containers with Pulumi. 4 4 5 5 # Setup 6 - 7 - First change the required variables in .env, then 8 6 9 7 ```bash 10 8 bun install
+1185
bun.lock
··· 1 + { 2 + "lockfileVersion": 1, 3 + "workspaces": { 4 + "": { 5 + "name": "media-server-stack", 6 + "dependencies": { 7 + "@pulumi/command": "^1.1.0", 8 + "@pulumi/docker": "^4.8.2", 9 + "@pulumi/pulumi": "^3.196.0", 10 + "arktype": "^2.1.22", 11 + "dotenv": "^16.6.1", 12 + "ipaddr.js": "^2.2.0", 13 + "ts-node": "^10.9.2", 14 + "tsx": "^4.20.5", 15 + "typescript": "^5.9.2", 16 + "undici": "^7.16.0", 17 + "up-fetch": "^2.4.0", 18 + "zod": "^4.1.8", 19 + }, 20 + "devDependencies": { 21 + "@eslint/js": "^9.35.0", 22 + "@pulumi/eslint-plugin": "^0.3.1", 23 + "@types/node": "^24.5.0", 24 + "eslint": "^9.35.0", 25 + "jiti": "^2.5.1", 26 + "typescript-eslint": "^8.44.0", 27 + }, 28 + }, 29 + }, 30 + "packages": { 31 + "@ark/schema": ["@ark/schema@0.49.0", "", { "dependencies": { "@ark/util": "0.49.0" } }, "sha512-GphZBLpW72iS0v4YkeUtV3YIno35Gimd7+ezbPO9GwEi9kzdUrPVjvf6aXSBAfHikaFc/9pqZOpv3pOXnC71tw=="], 32 + 33 + "@ark/util": ["@ark/util@0.49.0", "", {}, "sha512-/BtnX7oCjNkxi2vi6y1399b+9xd1jnCrDYhZ61f0a+3X8x8DxlK52VgEEzyuC2UQMPACIfYrmHkhD3lGt2GaMA=="], 34 + 35 + "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], 36 + 37 + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag=="], 38 + 39 + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.2", "", { "os": "android", "cpu": "arm" }, "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA=="], 40 + 41 + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w=="], 42 + 43 + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.2", "", { "os": "android", "cpu": "x64" }, "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg=="], 44 + 45 + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA=="], 46 + 47 + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA=="], 48 + 49 + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w=="], 50 + 51 + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ=="], 52 + 53 + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.2", "", { "os": "linux", "cpu": "arm" }, "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g=="], 54 + 55 + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g=="], 56 + 57 + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ=="], 58 + 59 + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w=="], 60 + 61 + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q=="], 62 + 63 + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g=="], 64 + 65 + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.2", "", { "os": "linux", "cpu": "none" }, "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw=="], 66 + 67 + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q=="], 68 + 69 + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.2", "", { "os": "linux", "cpu": "x64" }, "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg=="], 70 + 71 + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.2", "", { "os": "none", "cpu": "arm64" }, "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw=="], 72 + 73 + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.2", "", { "os": "none", "cpu": "x64" }, "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg=="], 74 + 75 + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg=="], 76 + 77 + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw=="], 78 + 79 + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA=="], 80 + 81 + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q=="], 82 + 83 + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg=="], 84 + 85 + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.2", "", { "os": "win32", "cpu": "x64" }, "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA=="], 86 + 87 + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.8.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q=="], 88 + 89 + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], 90 + 91 + "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], 92 + 93 + "@eslint/config-helpers": ["@eslint/config-helpers@0.3.1", "", {}, "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA=="], 94 + 95 + "@eslint/core": ["@eslint/core@0.15.2", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg=="], 96 + 97 + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], 98 + 99 + "@eslint/js": ["@eslint/js@9.35.0", "", {}, "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw=="], 100 + 101 + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], 102 + 103 + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.5", "", { "dependencies": { "@eslint/core": "^0.15.2", "levn": "^0.4.1" } }, "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w=="], 104 + 105 + "@grpc/grpc-js": ["@grpc/grpc-js@1.10.6", "", { "dependencies": { "@grpc/proto-loader": "^0.7.10", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA=="], 106 + 107 + "@grpc/proto-loader": ["@grpc/proto-loader@0.7.12", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.4", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q=="], 108 + 109 + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], 110 + 111 + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], 112 + 113 + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], 114 + 115 + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], 116 + 117 + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], 118 + 119 + "@isaacs/string-locale-compare": ["@isaacs/string-locale-compare@1.1.0", "", {}, "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ=="], 120 + 121 + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], 122 + 123 + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.15", "", {}, "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="], 124 + 125 + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], 126 + 127 + "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], 128 + 129 + "@logdna/tail-file": ["@logdna/tail-file@2.2.0", "", {}, "sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng=="], 130 + 131 + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], 132 + 133 + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], 134 + 135 + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], 136 + 137 + "@npmcli/agent": ["@npmcli/agent@2.2.1", "", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", "socks-proxy-agent": "^8.0.1" } }, "sha512-H4FrOVtNyWC8MUwL3UfjOsAihHvT1Pe8POj3JvjXhSTJipsZMtgUALCT4mGyYZNxymkUfOw3PUj6dE4QPp6osQ=="], 138 + 139 + "@npmcli/arborist": ["@npmcli/arborist@7.4.2", "", { "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^3.1.0", "@npmcli/installed-package-contents": "^2.0.2", "@npmcli/map-workspaces": "^3.0.2", "@npmcli/metavuln-calculator": "^7.0.0", "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.0.0", "@npmcli/query": "^3.1.0", "@npmcli/redact": "^1.1.0", "@npmcli/run-script": "^7.0.2", "bin-links": "^4.0.1", "cacache": "^18.0.0", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^7.0.1", "json-parse-even-better-errors": "^3.0.0", "json-stringify-nice": "^1.1.4", "minimatch": "^9.0.4", "nopt": "^7.0.0", "npm-install-checks": "^6.2.0", "npm-package-arg": "^11.0.1", "npm-pick-manifest": "^9.0.0", "npm-registry-fetch": "^16.2.0", "npmlog": "^7.0.1", "pacote": "^17.0.4", "parse-conflict-json": "^3.0.0", "proc-log": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "ssri": "^10.0.5", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, "bin": { "arborist": "bin/index.js" } }, "sha512-13flK0DTIhG7VEmPtoKFoi+88hIjuZxuZAvnHUTthIFql1Kc51VlsMRpbJPIcDEZHaHkILwFjHRXtCUYdFWvAQ=="], 140 + 141 + "@npmcli/fs": ["@npmcli/fs@3.1.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w=="], 142 + 143 + "@npmcli/git": ["@npmcli/git@5.0.6", "", { "dependencies": { "@npmcli/promise-spawn": "^7.0.0", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^4.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^4.0.0" } }, "sha512-4x/182sKXmQkf0EtXxT26GEsaOATpD7WVtza5hrYivWZeo6QefC6xq9KAXrnjtFKBZ4rZwR7aX/zClYYXgtwLw=="], 144 + 145 + "@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@2.0.2", "", { "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "bin": { "installed-package-contents": "lib/index.js" } }, "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ=="], 146 + 147 + "@npmcli/map-workspaces": ["@npmcli/map-workspaces@3.0.6", "", { "dependencies": { "@npmcli/name-from-folder": "^2.0.0", "glob": "^10.2.2", "minimatch": "^9.0.0", "read-package-json-fast": "^3.0.0" } }, "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA=="], 148 + 149 + "@npmcli/metavuln-calculator": ["@npmcli/metavuln-calculator@7.1.0", "", { "dependencies": { "cacache": "^18.0.0", "json-parse-even-better-errors": "^3.0.0", "pacote": "^18.0.0", "proc-log": "^4.1.0", "semver": "^7.3.5" } }, "sha512-D4VZzVLZ4Mw+oUCWyQ6qzlm5SGlrLnhKtZscDwQXFFc1FUPvw69Ibo2E5ZpJAmjFSYkA5UlCievWmREW0JLC3w=="], 150 + 151 + "@npmcli/name-from-folder": ["@npmcli/name-from-folder@2.0.0", "", {}, "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg=="], 152 + 153 + "@npmcli/node-gyp": ["@npmcli/node-gyp@3.0.0", "", {}, "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA=="], 154 + 155 + "@npmcli/package-json": ["@npmcli/package-json@5.0.3", "", { "dependencies": { "@npmcli/git": "^5.0.0", "glob": "^10.2.2", "hosted-git-info": "^7.0.0", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^6.0.0", "proc-log": "^4.0.0", "semver": "^7.5.3" } }, "sha512-cgsjCvld2wMqkUqvY+SZI+1ZJ7umGBYc9IAKfqJRKJCcs7hCQYxScUgdsyrRINk3VmdCYf9TXiLBHQ6ECTxhtg=="], 156 + 157 + "@npmcli/promise-spawn": ["@npmcli/promise-spawn@7.0.1", "", { "dependencies": { "which": "^4.0.0" } }, "sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg=="], 158 + 159 + "@npmcli/query": ["@npmcli/query@3.1.0", "", { "dependencies": { "postcss-selector-parser": "^6.0.10" } }, "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ=="], 160 + 161 + "@npmcli/redact": ["@npmcli/redact@1.1.0", "", {}, "sha512-PfnWuOkQgu7gCbnSsAisaX7hKOdZ4wSAhAzH3/ph5dSGau52kCRrMMGbiSQLwyTZpgldkZ49b0brkOr1AzGBHQ=="], 162 + 163 + "@npmcli/run-script": ["@npmcli/run-script@7.0.4", "", { "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.0.0", "@npmcli/promise-spawn": "^7.0.0", "node-gyp": "^10.0.0", "which": "^4.0.0" } }, "sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg=="], 164 + 165 + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], 166 + 167 + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.55.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg=="], 168 + 169 + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.30.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA=="], 170 + 171 + "@opentelemetry/core": ["@opentelemetry/core@1.30.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ=="], 172 + 173 + "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA=="], 174 + 175 + "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.55.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.55.0", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ=="], 176 + 177 + "@opentelemetry/instrumentation-grpc": ["@opentelemetry/instrumentation-grpc@0.55.0", "", { "dependencies": { "@opentelemetry/instrumentation": "0.55.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-n2ZH4pRwOy0Vhag/3eKqiyDBwcpUnGgJI9iiIRX7vivE0FMncaLazWphNFezRRaM/LuKwq1TD8pVUvieP68mow=="], 178 + 179 + "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ=="], 180 + 181 + "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg=="], 182 + 183 + "@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="], 184 + 185 + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="], 186 + 187 + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@1.30.1", "", { "dependencies": { "@opentelemetry/context-async-hooks": "1.30.1", "@opentelemetry/core": "1.30.1", "@opentelemetry/propagator-b3": "1.30.1", "@opentelemetry/propagator-jaeger": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ=="], 188 + 189 + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], 190 + 191 + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], 192 + 193 + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], 194 + 195 + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], 196 + 197 + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], 198 + 199 + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], 200 + 201 + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], 202 + 203 + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], 204 + 205 + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], 206 + 207 + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], 208 + 209 + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], 210 + 211 + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], 212 + 213 + "@pulumi/command": ["@pulumi/command@1.1.0", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0" } }, "sha512-ovVec+gXeqpcm76xwYYZvfJym8bG9NRvlBGQWbn0+c0fKQziZIjiv5V+AxTKfb+dLWKe7Otyt206L1IWq41hyw=="], 214 + 215 + "@pulumi/docker": ["@pulumi/docker@4.8.2", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0", "semver": "^5.4.0" } }, "sha512-98PF3IlCR3t2+PKA/ExgO4x0vUiEhkScpNaClFJ8Qr1v5NEx167kJooVcduLvAG8ZaWPI/jwIyyH+TdMp6GOig=="], 216 + 217 + "@pulumi/eslint-plugin": ["@pulumi/eslint-plugin@0.3.1", "", { "dependencies": { "@typescript-eslint/utils": "^8.0.0", "typescript": "^5.0.0" } }, "sha512-Ztibd/rtYUcLCJ7eCc/A2ptxOVpElqNIQsZkDXiZ2tEW+9W0XzEHgGvdLPvgN8qpFnEDezu//c0vsp7OZisCzA=="], 218 + 219 + "@pulumi/pulumi": ["@pulumi/pulumi@3.196.0", "", { "dependencies": { "@grpc/grpc-js": "^1.10.1", "@logdna/tail-file": "^2.0.6", "@npmcli/arborist": "^7.3.1", "@opentelemetry/api": "^1.9", "@opentelemetry/exporter-zipkin": "^1.28", "@opentelemetry/instrumentation": "^0.55", "@opentelemetry/instrumentation-grpc": "^0.55", "@opentelemetry/resources": "^1.28", "@opentelemetry/sdk-trace-base": "^1.28", "@opentelemetry/sdk-trace-node": "^1.28", "@types/google-protobuf": "^3.15.5", "@types/semver": "^7.5.6", "@types/tmp": "^0.2.6", "execa": "^5.1.0", "fdir": "^6.1.1", "google-protobuf": "^3.21.4", "got": "^11.8.6", "ini": "^2.0.0", "js-yaml": "^3.14.0", "minimist": "^1.2.6", "normalize-package-data": "^6.0.0", "picomatch": "^3.0.1", "pkg-dir": "^7.0.0", "require-from-string": "^2.0.1", "semver": "^7.5.2", "source-map-support": "^0.5.6", "tmp": "^0.2.4", "upath": "^1.1.0" }, "peerDependencies": { "ts-node": ">= 7.0.1 < 12", "typescript": ">= 3.8.3 < 6" }, "optionalPeers": ["ts-node", "typescript"] }, "sha512-rsNQEuRCNkJy1yMXzSTAt/8mLM+yoxOcRk3HbyOF7z6HyXPdHRlmzFcVdBXW01MGL5lZaw8QEDjlpqdTFydhvg=="], 220 + 221 + "@sigstore/bundle": ["@sigstore/bundle@2.3.1", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.3.1" } }, "sha512-eqV17lO3EIFqCWK3969Rz+J8MYrRZKw9IBHpSo6DEcEX2c+uzDFOgHE9f2MnyDpfs48LFO4hXmk9KhQ74JzU1g=="], 222 + 223 + "@sigstore/core": ["@sigstore/core@1.1.0", "", {}, "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg=="], 224 + 225 + "@sigstore/protobuf-specs": ["@sigstore/protobuf-specs@0.3.1", "", {}, "sha512-aIL8Z9NsMr3C64jyQzE0XlkEyBLpgEJJFDHLVVStkFV5Q3Il/r/YtY6NJWKQ4cy4AE7spP1IX5Jq7VCAxHHMfQ=="], 226 + 227 + "@sigstore/sign": ["@sigstore/sign@2.3.0", "", { "dependencies": { "@sigstore/bundle": "^2.3.0", "@sigstore/core": "^1.0.0", "@sigstore/protobuf-specs": "^0.3.1", "make-fetch-happen": "^13.0.0" } }, "sha512-tsAyV6FC3R3pHmKS880IXcDJuiFJiKITO1jxR1qbplcsBkZLBmjrEw5GbC7ikD6f5RU1hr7WnmxB/2kKc1qUWQ=="], 228 + 229 + "@sigstore/tuf": ["@sigstore/tuf@2.3.2", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.3.0", "tuf-js": "^2.2.0" } }, "sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w=="], 230 + 231 + "@sigstore/verify": ["@sigstore/verify@1.2.0", "", { "dependencies": { "@sigstore/bundle": "^2.3.1", "@sigstore/core": "^1.1.0", "@sigstore/protobuf-specs": "^0.3.1" } }, "sha512-hQF60nc9yab+Csi4AyoAmilGNfpXT+EXdBgFkP9OgPwIBPwyqVf7JAWPtmqrrrneTmAT6ojv7OlH1f6Ix5BG4Q=="], 232 + 233 + "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], 234 + 235 + "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="], 236 + 237 + "@tsconfig/node10": ["@tsconfig/node10@1.0.10", "", {}, "sha512-PiaIWIoPvO6qm6t114ropMCagj6YAF24j9OkCA2mJDXFnlionEwhsBCJ8yek4aib575BI3OkART/90WsgHgLWw=="], 238 + 239 + "@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="], 240 + 241 + "@tsconfig/node14": ["@tsconfig/node14@1.0.3", "", {}, "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="], 242 + 243 + "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], 244 + 245 + "@tufjs/canonical-json": ["@tufjs/canonical-json@2.0.0", "", {}, "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA=="], 246 + 247 + "@tufjs/models": ["@tufjs/models@2.0.0", "", { "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.3" } }, "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg=="], 248 + 249 + "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="], 250 + 251 + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], 252 + 253 + "@types/google-protobuf": ["@types/google-protobuf@3.15.12", "", {}, "sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ=="], 254 + 255 + "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], 256 + 257 + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], 258 + 259 + "@types/keyv": ["@types/keyv@3.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="], 260 + 261 + "@types/node": ["@types/node@24.5.0", "", { "dependencies": { "undici-types": "~7.12.0" } }, "sha512-y1dMvuvJspJiPSDZUQ+WMBvF7dpnEqN4x9DDC9ie5Fs/HUZJA3wFp7EhHoVaKX/iI0cRoECV8X2jL8zi0xrHCg=="], 262 + 263 + "@types/responselike": ["@types/responselike@1.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="], 264 + 265 + "@types/semver": ["@types/semver@7.5.8", "", {}, "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ=="], 266 + 267 + "@types/shimmer": ["@types/shimmer@1.2.0", "", {}, "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg=="], 268 + 269 + "@types/tmp": ["@types/tmp@0.2.6", "", {}, "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA=="], 270 + 271 + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.44.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.44.0", "@typescript-eslint/type-utils": "8.44.0", "@typescript-eslint/utils": "8.44.0", "@typescript-eslint/visitor-keys": "8.44.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.44.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-EGDAOGX+uwwekcS0iyxVDmRV9HX6FLSM5kzrAToLTsr9OWCIKG/y3lQheCq18yZ5Xh78rRKJiEpP0ZaCs4ryOQ=="], 272 + 273 + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.44.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.44.0", "@typescript-eslint/types": "8.44.0", "@typescript-eslint/typescript-estree": "8.44.0", "@typescript-eslint/visitor-keys": "8.44.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw=="], 274 + 275 + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.44.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.44.0", "@typescript-eslint/types": "^8.44.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA=="], 276 + 277 + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.37.0", "", { "dependencies": { "@typescript-eslint/types": "8.37.0", "@typescript-eslint/visitor-keys": "8.37.0" } }, "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA=="], 278 + 279 + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.44.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ=="], 280 + 281 + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.44.0", "", { "dependencies": { "@typescript-eslint/types": "8.44.0", "@typescript-eslint/typescript-estree": "8.44.0", "@typescript-eslint/utils": "8.44.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-9cwsoSxJ8Sak67Be/hD2RNt/fsqmWnNE1iHohG8lxqLSNY8xNfyY7wloo5zpW3Nu9hxVgURevqfcH6vvKCt6yg=="], 282 + 283 + "@typescript-eslint/types": ["@typescript-eslint/types@8.37.0", "", {}, "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ=="], 284 + 285 + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.44.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.44.0", "@typescript-eslint/tsconfig-utils": "8.44.0", "@typescript-eslint/types": "8.44.0", "@typescript-eslint/visitor-keys": "8.44.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw=="], 286 + 287 + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.37.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.37.0", "@typescript-eslint/types": "8.37.0", "@typescript-eslint/typescript-estree": "8.37.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A=="], 288 + 289 + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.44.0", "", { "dependencies": { "@typescript-eslint/types": "8.44.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw=="], 290 + 291 + "abbrev": ["abbrev@2.0.0", "", {}, "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ=="], 292 + 293 + "acorn": ["acorn@8.11.3", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg=="], 294 + 295 + "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], 296 + 297 + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], 298 + 299 + "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], 300 + 301 + "agent-base": ["agent-base@7.1.0", "", { "dependencies": { "debug": "^4.3.4" } }, "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg=="], 302 + 303 + "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], 304 + 305 + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], 306 + 307 + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 308 + 309 + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 310 + 311 + "aproba": ["aproba@2.0.0", "", {}, "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="], 312 + 313 + "are-we-there-yet": ["are-we-there-yet@4.0.2", "", {}, "sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg=="], 314 + 315 + "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="], 316 + 317 + "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], 318 + 319 + "arktype": ["arktype@2.1.22", "", { "dependencies": { "@ark/schema": "0.49.0", "@ark/util": "0.49.0" } }, "sha512-xdzl6WcAhrdahvRRnXaNwsipCgHuNoLobRqhiP8RjnfL9Gp947abGlo68GAIyLtxbD+MLzNyH2YR4kEqioMmYQ=="], 320 + 321 + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], 322 + 323 + "bin-links": ["bin-links@4.0.3", "", { "dependencies": { "cmd-shim": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "read-cmd-shim": "^4.0.0", "write-file-atomic": "^5.0.0" } }, "sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA=="], 324 + 325 + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], 326 + 327 + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 328 + 329 + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], 330 + 331 + "builtins": ["builtins@5.0.1", "", { "dependencies": { "semver": "^7.0.0" } }, "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ=="], 332 + 333 + "cacache": ["cacache@18.0.2", "", { "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" } }, "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw=="], 334 + 335 + "cacheable-lookup": ["cacheable-lookup@5.0.4", "", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="], 336 + 337 + "cacheable-request": ["cacheable-request@7.0.4", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="], 338 + 339 + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], 340 + 341 + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], 342 + 343 + "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], 344 + 345 + "cjs-module-lexer": ["cjs-module-lexer@1.4.1", "", {}, "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA=="], 346 + 347 + "clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="], 348 + 349 + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], 350 + 351 + "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="], 352 + 353 + "cmd-shim": ["cmd-shim@6.0.2", "", {}, "sha512-+FFYbB0YLaAkhkcrjkyNLYDiOsFSfRjwjY19LXk/psmMx1z00xlCv7hhQoTGXXIKi+YXHL/iiFo8NqMVQX9nOw=="], 354 + 355 + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], 356 + 357 + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 358 + 359 + "color-support": ["color-support@1.1.3", "", { "bin": { "color-support": "bin.js" } }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="], 360 + 361 + "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="], 362 + 363 + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], 364 + 365 + "console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="], 366 + 367 + "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], 368 + 369 + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], 370 + 371 + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], 372 + 373 + "debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], 374 + 375 + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], 376 + 377 + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], 378 + 379 + "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], 380 + 381 + "diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], 382 + 383 + "dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], 384 + 385 + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], 386 + 387 + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], 388 + 389 + "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="], 390 + 391 + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], 392 + 393 + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], 394 + 395 + "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], 396 + 397 + "esbuild": ["esbuild@0.25.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.2", "@esbuild/android-arm": "0.25.2", "@esbuild/android-arm64": "0.25.2", "@esbuild/android-x64": "0.25.2", "@esbuild/darwin-arm64": "0.25.2", "@esbuild/darwin-x64": "0.25.2", "@esbuild/freebsd-arm64": "0.25.2", "@esbuild/freebsd-x64": "0.25.2", "@esbuild/linux-arm": "0.25.2", "@esbuild/linux-arm64": "0.25.2", "@esbuild/linux-ia32": "0.25.2", "@esbuild/linux-loong64": "0.25.2", "@esbuild/linux-mips64el": "0.25.2", "@esbuild/linux-ppc64": "0.25.2", "@esbuild/linux-riscv64": "0.25.2", "@esbuild/linux-s390x": "0.25.2", "@esbuild/linux-x64": "0.25.2", "@esbuild/netbsd-arm64": "0.25.2", "@esbuild/netbsd-x64": "0.25.2", "@esbuild/openbsd-arm64": "0.25.2", "@esbuild/openbsd-x64": "0.25.2", "@esbuild/sunos-x64": "0.25.2", "@esbuild/win32-arm64": "0.25.2", "@esbuild/win32-ia32": "0.25.2", "@esbuild/win32-x64": "0.25.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ=="], 398 + 399 + "escalade": ["escalade@3.1.2", "", {}, "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA=="], 400 + 401 + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], 402 + 403 + "eslint": ["eslint@9.35.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.35.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg=="], 404 + 405 + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], 406 + 407 + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], 408 + 409 + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], 410 + 411 + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], 412 + 413 + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], 414 + 415 + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], 416 + 417 + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], 418 + 419 + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], 420 + 421 + "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], 422 + 423 + "exponential-backoff": ["exponential-backoff@3.1.1", "", {}, "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw=="], 424 + 425 + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], 426 + 427 + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], 428 + 429 + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], 430 + 431 + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], 432 + 433 + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], 434 + 435 + "fdir": ["fdir@6.1.1", "", { "peerDependencies": { "picomatch": "3.x" }, "optionalPeers": ["picomatch"] }, "sha512-QfKBVg453Dyn3mr0Q0O+Tkr1r79lOTAKSi9f/Ot4+qVEwxWhav2Z+SudrG9vQjM2aYRMQQZ2/Q1zdA8ACM1pDg=="], 436 + 437 + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], 438 + 439 + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], 440 + 441 + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], 442 + 443 + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], 444 + 445 + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], 446 + 447 + "foreground-child": ["foreground-child@3.1.1", "", { "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" } }, "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg=="], 448 + 449 + "fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="], 450 + 451 + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], 452 + 453 + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], 454 + 455 + "gauge": ["gauge@5.0.1", "", { "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", "signal-exit": "^4.0.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.5" } }, "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ=="], 456 + 457 + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], 458 + 459 + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], 460 + 461 + "get-tsconfig": ["get-tsconfig@4.8.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg=="], 462 + 463 + "glob": ["glob@10.3.12", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.6", "minimatch": "^9.0.1", "minipass": "^7.0.4", "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg=="], 464 + 465 + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], 466 + 467 + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], 468 + 469 + "google-protobuf": ["google-protobuf@3.21.4", "", {}, "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ=="], 470 + 471 + "got": ["got@11.8.6", "", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="], 472 + 473 + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], 474 + 475 + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], 476 + 477 + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], 478 + 479 + "has-unicode": ["has-unicode@2.0.1", "", {}, "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="], 480 + 481 + "hasown": ["hasown@2.0.1", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA=="], 482 + 483 + "hosted-git-info": ["hosted-git-info@7.0.1", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA=="], 484 + 485 + "http-cache-semantics": ["http-cache-semantics@4.1.1", "", {}, "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="], 486 + 487 + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], 488 + 489 + "http2-wrapper": ["http2-wrapper@1.0.3", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="], 490 + 491 + "https-proxy-agent": ["https-proxy-agent@7.0.4", "", { "dependencies": { "agent-base": "^7.0.2", "debug": "4" } }, "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg=="], 492 + 493 + "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], 494 + 495 + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], 496 + 497 + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], 498 + 499 + "ignore-walk": ["ignore-walk@6.0.4", "", { "dependencies": { "minimatch": "^9.0.0" } }, "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw=="], 500 + 501 + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], 502 + 503 + "import-in-the-middle": ["import-in-the-middle@1.11.0", "", { "dependencies": { "acorn": "^8.8.2", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q=="], 504 + 505 + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], 506 + 507 + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], 508 + 509 + "ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="], 510 + 511 + "ip-address": ["ip-address@9.0.5", "", { "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" } }, "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g=="], 512 + 513 + "ipaddr.js": ["ipaddr.js@2.2.0", "", {}, "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA=="], 514 + 515 + "is-core-module": ["is-core-module@2.13.1", "", { "dependencies": { "hasown": "^2.0.0" } }, "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw=="], 516 + 517 + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], 518 + 519 + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], 520 + 521 + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 522 + 523 + "is-lambda": ["is-lambda@1.0.1", "", {}, "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="], 524 + 525 + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], 526 + 527 + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], 528 + 529 + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], 530 + 531 + "jackspeak": ["jackspeak@2.3.6", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ=="], 532 + 533 + "jiti": ["jiti@2.5.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w=="], 534 + 535 + "js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], 536 + 537 + "jsbn": ["jsbn@1.1.0", "", {}, "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="], 538 + 539 + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], 540 + 541 + "json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.1", "", {}, "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg=="], 542 + 543 + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], 544 + 545 + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], 546 + 547 + "json-stringify-nice": ["json-stringify-nice@1.1.4", "", {}, "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw=="], 548 + 549 + "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="], 550 + 551 + "just-diff": ["just-diff@6.0.2", "", {}, "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA=="], 552 + 553 + "just-diff-apply": ["just-diff-apply@5.5.0", "", {}, "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw=="], 554 + 555 + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], 556 + 557 + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], 558 + 559 + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], 560 + 561 + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], 562 + 563 + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], 564 + 565 + "long": ["long@5.2.3", "", {}, "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="], 566 + 567 + "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], 568 + 569 + "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], 570 + 571 + "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], 572 + 573 + "make-fetch-happen": ["make-fetch-happen@13.0.0", "", { "dependencies": { "@npmcli/agent": "^2.0.0", "cacache": "^18.0.0", "http-cache-semantics": "^4.1.1", "is-lambda": "^1.0.1", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "ssri": "^10.0.0" } }, "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A=="], 574 + 575 + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], 576 + 577 + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 578 + 579 + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], 580 + 581 + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], 582 + 583 + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], 584 + 585 + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], 586 + 587 + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], 588 + 589 + "minipass": ["minipass@7.0.4", "", {}, "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ=="], 590 + 591 + "minipass-collect": ["minipass-collect@2.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="], 592 + 593 + "minipass-fetch": ["minipass-fetch@3.0.4", "", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg=="], 594 + 595 + "minipass-flush": ["minipass-flush@1.0.5", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw=="], 596 + 597 + "minipass-json-stream": ["minipass-json-stream@1.0.1", "", { "dependencies": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" } }, "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg=="], 598 + 599 + "minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="], 600 + 601 + "minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="], 602 + 603 + "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], 604 + 605 + "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], 606 + 607 + "module-details-from-path": ["module-details-from-path@1.0.3", "", {}, "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A=="], 608 + 609 + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], 610 + 611 + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], 612 + 613 + "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], 614 + 615 + "node-gyp": ["node-gyp@10.0.1", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "glob": "^10.3.10", "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "tar": "^6.1.2", "which": "^4.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg=="], 616 + 617 + "nopt": ["nopt@7.2.0", "", { "dependencies": { "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA=="], 618 + 619 + "normalize-package-data": ["normalize-package-data@6.0.0", "", { "dependencies": { "hosted-git-info": "^7.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg=="], 620 + 621 + "normalize-url": ["normalize-url@6.1.0", "", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="], 622 + 623 + "npm-bundled": ["npm-bundled@3.0.0", "", { "dependencies": { "npm-normalize-package-bin": "^3.0.0" } }, "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ=="], 624 + 625 + "npm-install-checks": ["npm-install-checks@6.3.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw=="], 626 + 627 + "npm-normalize-package-bin": ["npm-normalize-package-bin@3.0.1", "", {}, "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ=="], 628 + 629 + "npm-package-arg": ["npm-package-arg@11.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw=="], 630 + 631 + "npm-packlist": ["npm-packlist@8.0.2", "", { "dependencies": { "ignore-walk": "^6.0.4" } }, "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA=="], 632 + 633 + "npm-pick-manifest": ["npm-pick-manifest@9.0.0", "", { "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "npm-package-arg": "^11.0.0", "semver": "^7.3.5" } }, "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg=="], 634 + 635 + "npm-registry-fetch": ["npm-registry-fetch@16.2.1", "", { "dependencies": { "@npmcli/redact": "^1.1.0", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", "proc-log": "^4.0.0" } }, "sha512-8l+7jxhim55S85fjiDGJ1rZXBWGtRLi1OSb4Z3BPLObPuIaeKRlPRiYMSHU4/81ck3t71Z+UwDDl47gcpmfQQA=="], 636 + 637 + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], 638 + 639 + "npmlog": ["npmlog@7.0.1", "", { "dependencies": { "are-we-there-yet": "^4.0.0", "console-control-strings": "^1.1.0", "gauge": "^5.0.0", "set-blocking": "^2.0.0" } }, "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg=="], 640 + 641 + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], 642 + 643 + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], 644 + 645 + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], 646 + 647 + "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="], 648 + 649 + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], 650 + 651 + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], 652 + 653 + "p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], 654 + 655 + "pacote": ["pacote@17.0.7", "", { "dependencies": { "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", "@npmcli/promise-spawn": "^7.0.0", "@npmcli/run-script": "^7.0.0", "cacache": "^18.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^11.0.0", "npm-packlist": "^8.0.0", "npm-pick-manifest": "^9.0.0", "npm-registry-fetch": "^16.0.0", "proc-log": "^4.0.0", "promise-retry": "^2.0.1", "read-package-json": "^7.0.0", "read-package-json-fast": "^3.0.0", "sigstore": "^2.2.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "lib/bin.js" } }, "sha512-sgvnoUMlkv9xHwDUKjKQFXVyUi8dtJGKp3vg6sYy+TxbDic5RjZCHF3ygv0EJgNRZ2GfRONjlKPUfokJ9lDpwQ=="], 656 + 657 + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], 658 + 659 + "parse-conflict-json": ["parse-conflict-json@3.0.1", "", { "dependencies": { "json-parse-even-better-errors": "^3.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" } }, "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw=="], 660 + 661 + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], 662 + 663 + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], 664 + 665 + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], 666 + 667 + "path-scurry": ["path-scurry@1.10.2", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA=="], 668 + 669 + "picomatch": ["picomatch@3.0.1", "", {}, "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag=="], 670 + 671 + "pkg-dir": ["pkg-dir@7.0.0", "", { "dependencies": { "find-up": "^6.3.0" } }, "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA=="], 672 + 673 + "postcss-selector-parser": ["postcss-selector-parser@6.0.15", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw=="], 674 + 675 + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], 676 + 677 + "proc-log": ["proc-log@3.0.0", "", {}, "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A=="], 678 + 679 + "promise-all-reject-late": ["promise-all-reject-late@1.0.1", "", {}, "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw=="], 680 + 681 + "promise-call-limit": ["promise-call-limit@3.0.1", "", {}, "sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg=="], 682 + 683 + "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="], 684 + 685 + "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], 686 + 687 + "protobufjs": ["protobufjs@7.2.6", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw=="], 688 + 689 + "pump": ["pump@3.0.0", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="], 690 + 691 + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], 692 + 693 + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], 694 + 695 + "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], 696 + 697 + "read-cmd-shim": ["read-cmd-shim@4.0.0", "", {}, "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q=="], 698 + 699 + "read-package-json": ["read-package-json@7.0.0", "", { "dependencies": { "glob": "^10.2.2", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^6.0.0", "npm-normalize-package-bin": "^3.0.0" } }, "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg=="], 700 + 701 + "read-package-json-fast": ["read-package-json-fast@3.0.2", "", { "dependencies": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" } }, "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw=="], 702 + 703 + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], 704 + 705 + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], 706 + 707 + "require-in-the-middle": ["require-in-the-middle@7.4.0", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ=="], 708 + 709 + "resolve": ["resolve@1.22.8", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="], 710 + 711 + "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], 712 + 713 + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], 714 + 715 + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], 716 + 717 + "responselike": ["responselike@2.0.1", "", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="], 718 + 719 + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], 720 + 721 + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], 722 + 723 + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], 724 + 725 + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], 726 + 727 + "semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], 728 + 729 + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], 730 + 731 + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], 732 + 733 + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], 734 + 735 + "shimmer": ["shimmer@1.2.1", "", {}, "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="], 736 + 737 + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], 738 + 739 + "sigstore": ["sigstore@2.3.0", "", { "dependencies": { "@sigstore/bundle": "^2.3.1", "@sigstore/core": "^1.0.0", "@sigstore/protobuf-specs": "^0.3.1", "@sigstore/sign": "^2.3.0", "@sigstore/tuf": "^2.3.1", "@sigstore/verify": "^1.2.0" } }, "sha512-q+o8L2ebiWD1AxD17eglf1pFrl9jtW7FHa0ygqY6EKvibK8JHyq9Z26v9MZXeDiw+RbfOJ9j2v70M10Hd6E06A=="], 740 + 741 + "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], 742 + 743 + "socks": ["socks@2.8.1", "", { "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ=="], 744 + 745 + "socks-proxy-agent": ["socks-proxy-agent@8.0.2", "", { "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", "socks": "^2.7.1" } }, "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g=="], 746 + 747 + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], 748 + 749 + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], 750 + 751 + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], 752 + 753 + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], 754 + 755 + "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], 756 + 757 + "spdx-license-ids": ["spdx-license-ids@3.0.17", "", {}, "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg=="], 758 + 759 + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], 760 + 761 + "ssri": ["ssri@10.0.5", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A=="], 762 + 763 + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 764 + 765 + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], 766 + 767 + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 768 + 769 + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 770 + 771 + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], 772 + 773 + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], 774 + 775 + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], 776 + 777 + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], 778 + 779 + "tar": ["tar@6.2.0", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ=="], 780 + 781 + "tmp": ["tmp@0.2.5", "", {}, "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow=="], 782 + 783 + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 784 + 785 + "treeverse": ["treeverse@3.0.0", "", {}, "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ=="], 786 + 787 + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], 788 + 789 + "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="], 790 + 791 + "tsx": ["tsx@4.20.5", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw=="], 792 + 793 + "tuf-js": ["tuf-js@2.2.0", "", { "dependencies": { "@tufjs/models": "2.0.0", "debug": "^4.3.4", "make-fetch-happen": "^13.0.0" } }, "sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg=="], 794 + 795 + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], 796 + 797 + "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], 798 + 799 + "typescript-eslint": ["typescript-eslint@8.44.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.44.0", "@typescript-eslint/parser": "8.44.0", "@typescript-eslint/typescript-estree": "8.44.0", "@typescript-eslint/utils": "8.44.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ib7mCkYuIzYonCq9XWF5XNw+fkj2zg629PSa9KNIQ47RXFF763S5BIX4wqz1+FLPogTZoiw8KmCiRPRa8bL3qw=="], 800 + 801 + "undici": ["undici@7.16.0", "", {}, "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g=="], 802 + 803 + "undici-types": ["undici-types@7.12.0", "", {}, "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ=="], 804 + 805 + "unique-filename": ["unique-filename@3.0.0", "", { "dependencies": { "unique-slug": "^4.0.0" } }, "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g=="], 806 + 807 + "unique-slug": ["unique-slug@4.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ=="], 808 + 809 + "up-fetch": ["up-fetch@2.4.0", "", {}, "sha512-Gw+8wyOpZD0Nl/frqdmj+SCH95xGNR9q6htH5qhPdKt8Xbz4yiWEVRg+NHufKDQuOdS7w+I2iNeoW/RJdnPCWA=="], 810 + 811 + "upath": ["upath@1.2.0", "", {}, "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="], 812 + 813 + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], 814 + 815 + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], 816 + 817 + "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], 818 + 819 + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], 820 + 821 + "validate-npm-package-name": ["validate-npm-package-name@5.0.0", "", { "dependencies": { "builtins": "^5.0.0" } }, "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ=="], 822 + 823 + "walk-up-path": ["walk-up-path@3.0.1", "", {}, "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA=="], 824 + 825 + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], 826 + 827 + "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], 828 + 829 + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], 830 + 831 + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 832 + 833 + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], 834 + 835 + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], 836 + 837 + "write-file-atomic": ["write-file-atomic@5.0.1", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw=="], 838 + 839 + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], 840 + 841 + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], 842 + 843 + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], 844 + 845 + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], 846 + 847 + "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], 848 + 849 + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], 850 + 851 + "zod": ["zod@4.1.8", "", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="], 852 + 853 + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], 854 + 855 + "@eslint/eslintrc/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], 856 + 857 + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], 858 + 859 + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], 860 + 861 + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], 862 + 863 + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], 864 + 865 + "@npmcli/agent/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], 866 + 867 + "@npmcli/arborist/minimatch": ["minimatch@9.0.4", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw=="], 868 + 869 + "@npmcli/arborist/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 870 + 871 + "@npmcli/fs/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 872 + 873 + "@npmcli/git/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], 874 + 875 + "@npmcli/git/proc-log": ["proc-log@4.1.0", "", {}, "sha512-dmQ2iPw2nJMi9/4dpaG1wd0m1GE+K5kW7RGbjy5hoEEGnhPIzsm+klBO5RGGdcoYbWsNtU2KSNAdEldts+icLg=="], 876 + 877 + "@npmcli/git/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 878 + 879 + "@npmcli/git/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], 880 + 881 + "@npmcli/map-workspaces/minimatch": ["minimatch@9.0.4", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw=="], 882 + 883 + "@npmcli/metavuln-calculator/pacote": ["pacote@18.0.0", "", { "dependencies": { "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", "@npmcli/promise-spawn": "^7.0.0", "@npmcli/run-script": "^8.0.0", "cacache": "^18.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^11.0.0", "npm-packlist": "^8.0.0", "npm-pick-manifest": "^9.0.0", "npm-registry-fetch": "^16.0.0", "proc-log": "^4.0.0", "promise-retry": "^2.0.1", "read-package-json": "^7.0.0", "read-package-json-fast": "^3.0.0", "sigstore": "^2.2.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "lib/bin.js" } }, "sha512-ma7uVt/q3Sb3XbLwUjOeClz+7feHjMOFegHn5whw++x+GzikZkAq/2auklSbRuy6EI2iJh1/ZqCpVaUcxRaeqQ=="], 884 + 885 + "@npmcli/metavuln-calculator/proc-log": ["proc-log@4.1.0", "", {}, "sha512-dmQ2iPw2nJMi9/4dpaG1wd0m1GE+K5kW7RGbjy5hoEEGnhPIzsm+klBO5RGGdcoYbWsNtU2KSNAdEldts+icLg=="], 886 + 887 + "@npmcli/metavuln-calculator/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 888 + 889 + "@npmcli/package-json/proc-log": ["proc-log@4.1.0", "", {}, "sha512-dmQ2iPw2nJMi9/4dpaG1wd0m1GE+K5kW7RGbjy5hoEEGnhPIzsm+klBO5RGGdcoYbWsNtU2KSNAdEldts+icLg=="], 890 + 891 + "@npmcli/package-json/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 892 + 893 + "@npmcli/promise-spawn/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], 894 + 895 + "@npmcli/run-script/@npmcli/package-json": ["@npmcli/package-json@5.0.0", "", { "dependencies": { "@npmcli/git": "^5.0.0", "glob": "^10.2.2", "hosted-git-info": "^7.0.0", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^6.0.0", "proc-log": "^3.0.0", "semver": "^7.5.3" } }, "sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g=="], 896 + 897 + "@npmcli/run-script/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], 898 + 899 + "@opentelemetry/instrumentation/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 900 + 901 + "@opentelemetry/instrumentation-grpc/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.27.0", "", {}, "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg=="], 902 + 903 + "@opentelemetry/sdk-trace-node/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 904 + 905 + "@pulumi/eslint-plugin/typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], 906 + 907 + "@pulumi/pulumi/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 908 + 909 + "@tufjs/models/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], 910 + 911 + "@types/cacheable-request/@types/node": ["@types/node@20.11.24", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long=="], 912 + 913 + "@types/keyv/@types/node": ["@types/node@20.11.24", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long=="], 914 + 915 + "@types/responselike/@types/node": ["@types/node@20.11.24", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long=="], 916 + 917 + "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.44.0", "", { "dependencies": { "@typescript-eslint/types": "8.44.0", "@typescript-eslint/visitor-keys": "8.44.0" } }, "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA=="], 918 + 919 + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.44.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.44.0", "@typescript-eslint/types": "8.44.0", "@typescript-eslint/typescript-estree": "8.44.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg=="], 920 + 921 + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], 922 + 923 + "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.44.0", "", { "dependencies": { "@typescript-eslint/types": "8.44.0", "@typescript-eslint/visitor-keys": "8.44.0" } }, "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA=="], 924 + 925 + "@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.44.0", "", {}, "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA=="], 926 + 927 + "@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.44.0", "", {}, "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA=="], 928 + 929 + "@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.37.0", "", { "dependencies": { "@typescript-eslint/types": "8.37.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w=="], 930 + 931 + "@typescript-eslint/type-utils/@typescript-eslint/types": ["@typescript-eslint/types@8.44.0", "", {}, "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA=="], 932 + 933 + "@typescript-eslint/type-utils/@typescript-eslint/utils": ["@typescript-eslint/utils@8.44.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.44.0", "@typescript-eslint/types": "8.44.0", "@typescript-eslint/typescript-estree": "8.44.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg=="], 934 + 935 + "@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.44.0", "", {}, "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA=="], 936 + 937 + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.4", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw=="], 938 + 939 + "@typescript-eslint/typescript-estree/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 940 + 941 + "@typescript-eslint/utils/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], 942 + 943 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.37.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.37.0", "@typescript-eslint/tsconfig-utils": "8.37.0", "@typescript-eslint/types": "8.37.0", "@typescript-eslint/visitor-keys": "8.37.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg=="], 944 + 945 + "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.44.0", "", {}, "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA=="], 946 + 947 + "agent-base/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], 948 + 949 + "builtins/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 950 + 951 + "cacache/glob": ["glob@10.3.10", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g=="], 952 + 953 + "cacache/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], 954 + 955 + "cacheable-request/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], 956 + 957 + "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], 958 + 959 + "espree/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], 960 + 961 + "execa/cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], 962 + 963 + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 964 + 965 + "foreground-child/cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], 966 + 967 + "foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], 968 + 969 + "gauge/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], 970 + 971 + "glob/minimatch": ["minimatch@9.0.4", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw=="], 972 + 973 + "hosted-git-info/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], 974 + 975 + "http-proxy-agent/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], 976 + 977 + "https-proxy-agent/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], 978 + 979 + "ignore-walk/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], 980 + 981 + "ip-address/sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], 982 + 983 + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 984 + 985 + "minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], 986 + 987 + "minipass-json-stream/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], 988 + 989 + "minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], 990 + 991 + "minipass-sized/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], 992 + 993 + "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], 994 + 995 + "node-gyp/glob": ["glob@10.3.10", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g=="], 996 + 997 + "node-gyp/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 998 + 999 + "node-gyp/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], 1000 + 1001 + "normalize-package-data/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 1002 + 1003 + "npm-install-checks/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 1004 + 1005 + "npm-package-arg/proc-log": ["proc-log@4.1.0", "", {}, "sha512-dmQ2iPw2nJMi9/4dpaG1wd0m1GE+K5kW7RGbjy5hoEEGnhPIzsm+klBO5RGGdcoYbWsNtU2KSNAdEldts+icLg=="], 1006 + 1007 + "npm-package-arg/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 1008 + 1009 + "npm-pick-manifest/npm-package-arg": ["npm-package-arg@11.0.1", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ=="], 1010 + 1011 + "npm-pick-manifest/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 1012 + 1013 + "npm-registry-fetch/proc-log": ["proc-log@4.1.0", "", {}, "sha512-dmQ2iPw2nJMi9/4dpaG1wd0m1GE+K5kW7RGbjy5hoEEGnhPIzsm+klBO5RGGdcoYbWsNtU2KSNAdEldts+icLg=="], 1014 + 1015 + "pacote/proc-log": ["proc-log@4.1.0", "", {}, "sha512-dmQ2iPw2nJMi9/4dpaG1wd0m1GE+K5kW7RGbjy5hoEEGnhPIzsm+klBO5RGGdcoYbWsNtU2KSNAdEldts+icLg=="], 1016 + 1017 + "pacote/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], 1018 + 1019 + "path-scurry/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], 1020 + 1021 + "pkg-dir/find-up": ["find-up@6.3.0", "", { "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" } }, "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw=="], 1022 + 1023 + "protobufjs/@types/node": ["@types/node@20.11.24", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long=="], 1024 + 1025 + "read-package-json/glob": ["glob@10.3.10", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g=="], 1026 + 1027 + "socks-proxy-agent/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], 1028 + 1029 + "tar/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], 1030 + 1031 + "tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], 1032 + 1033 + "tuf-js/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], 1034 + 1035 + "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.44.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.44.0", "@typescript-eslint/types": "8.44.0", "@typescript-eslint/typescript-estree": "8.44.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-nktOlVcg3ALo0mYlV+L7sWUD58KG4CMj1rb2HUVOO4aL3K/6wcD+NERqd0rrA5Vg06b42YhF6cFxeixsp9Riqg=="], 1036 + 1037 + "write-file-atomic/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], 1038 + 1039 + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], 1040 + 1041 + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], 1042 + 1043 + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.0.1", "", {}, "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="], 1044 + 1045 + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], 1046 + 1047 + "@npmcli/arborist/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 1048 + 1049 + "@npmcli/git/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], 1050 + 1051 + "@npmcli/git/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], 1052 + 1053 + "@npmcli/map-workspaces/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 1054 + 1055 + "@npmcli/metavuln-calculator/pacote/@npmcli/run-script": ["@npmcli/run-script@8.0.0", "", { "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.0.0", "@npmcli/promise-spawn": "^7.0.0", "node-gyp": "^10.0.0", "proc-log": "^4.0.0", "which": "^4.0.0" } }, "sha512-5noc+eCQmX1W9nlFUe65n5MIteikd3vOA2sEPdXtlUv68KWyHNFZnT/LDRXu/E4nZ5yxjciP30pADr/GQ97W1w=="], 1056 + 1057 + "@npmcli/metavuln-calculator/pacote/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], 1058 + 1059 + "@npmcli/promise-spawn/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], 1060 + 1061 + "@npmcli/run-script/@npmcli/package-json/@npmcli/git": ["@npmcli/git@5.0.4", "", { "dependencies": { "@npmcli/promise-spawn": "^7.0.0", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^4.0.0" } }, "sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ=="], 1062 + 1063 + "@npmcli/run-script/@npmcli/package-json/glob": ["glob@10.3.10", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g=="], 1064 + 1065 + "@npmcli/run-script/@npmcli/package-json/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 1066 + 1067 + "@npmcli/run-script/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], 1068 + 1069 + "@tufjs/models/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 1070 + 1071 + "@types/cacheable-request/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], 1072 + 1073 + "@types/keyv/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], 1074 + 1075 + "@types/responselike/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], 1076 + 1077 + "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.44.0", "", {}, "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA=="], 1078 + 1079 + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.44.0", "", {}, "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA=="], 1080 + 1081 + "@typescript-eslint/type-utils/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.44.0", "", { "dependencies": { "@typescript-eslint/types": "8.44.0", "@typescript-eslint/visitor-keys": "8.44.0" } }, "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA=="], 1082 + 1083 + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 1084 + 1085 + "@typescript-eslint/utils/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], 1086 + 1087 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.37.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.37.0", "@typescript-eslint/types": "^8.37.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA=="], 1088 + 1089 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.37.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg=="], 1090 + 1091 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.37.0", "", { "dependencies": { "@typescript-eslint/types": "8.37.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w=="], 1092 + 1093 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.4", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw=="], 1094 + 1095 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="], 1096 + 1097 + "agent-base/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], 1098 + 1099 + "cacache/glob/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], 1100 + 1101 + "cacache/glob/path-scurry": ["path-scurry@1.10.1", "", { "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ=="], 1102 + 1103 + "glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 1104 + 1105 + "http-proxy-agent/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], 1106 + 1107 + "https-proxy-agent/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], 1108 + 1109 + "ignore-walk/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 1110 + 1111 + "node-gyp/glob/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], 1112 + 1113 + "node-gyp/glob/path-scurry": ["path-scurry@1.10.1", "", { "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ=="], 1114 + 1115 + "node-gyp/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], 1116 + 1117 + "pacote/tar/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], 1118 + 1119 + "pacote/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], 1120 + 1121 + "pkg-dir/find-up/locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="], 1122 + 1123 + "pkg-dir/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], 1124 + 1125 + "protobufjs/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], 1126 + 1127 + "read-package-json/glob/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], 1128 + 1129 + "read-package-json/glob/path-scurry": ["path-scurry@1.10.1", "", { "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ=="], 1130 + 1131 + "socks-proxy-agent/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], 1132 + 1133 + "tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], 1134 + 1135 + "tuf-js/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], 1136 + 1137 + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.44.0", "", { "dependencies": { "@typescript-eslint/types": "8.44.0", "@typescript-eslint/visitor-keys": "8.44.0" } }, "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA=="], 1138 + 1139 + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.44.0", "", {}, "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA=="], 1140 + 1141 + "@npmcli/metavuln-calculator/pacote/@npmcli/run-script/node-gyp": ["node-gyp@10.1.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "glob": "^10.3.10", "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "tar": "^6.1.2", "which": "^4.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA=="], 1142 + 1143 + "@npmcli/metavuln-calculator/pacote/@npmcli/run-script/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], 1144 + 1145 + "@npmcli/metavuln-calculator/pacote/tar/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], 1146 + 1147 + "@npmcli/metavuln-calculator/pacote/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], 1148 + 1149 + "@npmcli/run-script/@npmcli/package-json/@npmcli/git/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], 1150 + 1151 + "@npmcli/run-script/@npmcli/package-json/glob/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], 1152 + 1153 + "@npmcli/run-script/@npmcli/package-json/glob/path-scurry": ["path-scurry@1.10.1", "", { "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ=="], 1154 + 1155 + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 1156 + 1157 + "cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 1158 + 1159 + "node-gyp/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 1160 + 1161 + "node-gyp/glob/path-scurry/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], 1162 + 1163 + "pacote/tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], 1164 + 1165 + "pkg-dir/find-up/locate-path/p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="], 1166 + 1167 + "read-package-json/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 1168 + 1169 + "read-package-json/glob/path-scurry/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], 1170 + 1171 + "@npmcli/metavuln-calculator/pacote/@npmcli/run-script/node-gyp/proc-log": ["proc-log@3.0.0", "", {}, "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A=="], 1172 + 1173 + "@npmcli/metavuln-calculator/pacote/@npmcli/run-script/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], 1174 + 1175 + "@npmcli/metavuln-calculator/pacote/tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], 1176 + 1177 + "@npmcli/run-script/@npmcli/package-json/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 1178 + 1179 + "@npmcli/run-script/@npmcli/package-json/glob/path-scurry/lru-cache": ["lru-cache@10.2.0", "", {}, "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="], 1180 + 1181 + "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], 1182 + 1183 + "pkg-dir/find-up/locate-path/p-locate/p-limit/yocto-queue": ["yocto-queue@1.0.0", "", {}, "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g=="], 1184 + } 1185 + }
bun.lockb

This is a binary file and will not be displayed.

+28
eslint.config.ts
··· 1 + import eslint from "@eslint/js"; 2 + import tseslint from "typescript-eslint"; 3 + // @ts-expect-error bleh 4 + import pulumi from "@pulumi/eslint-plugin"; 5 + 6 + export default tseslint.config( 7 + eslint.configs.recommended, 8 + tseslint.configs.recommended, 9 + { 10 + languageOptions: { 11 + parserOptions: { 12 + projectService: true, 13 + tsconfigRootDir: import.meta.dirname, 14 + }, 15 + }, 16 + }, 17 + { 18 + rules: { 19 + "@typescript-eslint/no-unused-vars": "off", 20 + }, 21 + }, 22 + { 23 + plugins: { pulumi }, 24 + rules: { 25 + "pulumi/no-output-in-template-literal": "error", 26 + }, 27 + }, 28 + );
jsonnet/README.md .old/jsonnet/README.md
jsonnet/haring.json .old/jsonnet/haring.json
jsonnet/haring.jsonnet .old/jsonnet/haring.jsonnet
jsonnet/portainer-agent-stack.yml .old/jsonnet/portainer-agent-stack.yml
jsonnet/service.libsonnet .old/jsonnet/service.libsonnet
+87
lib/service/mounts.ts
··· 1 + import docker from "@pulumi/docker"; 2 + import { Input, output, Unwrap } from "@pulumi/pulumi"; 3 + 4 + type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>; 5 + 6 + export type MountOpts = docker.types.input.ContainerMount & CustomMountOpts; 7 + 8 + type CustomMountOpts = Partial<{ 9 + kind: Input<"directory" | "file">; 10 + create: Input<boolean>; 11 + }>; 12 + 13 + export function _mount({ 14 + source, 15 + target, 16 + type = "bind", 17 + bindOptions, 18 + readOnly = false, 19 + kind = "directory", 20 + create = false, 21 + }: Optional<MountOpts, "target" | "type">): MountOpts { 22 + if (!source) { 23 + throw Error("mount does not have source"); 24 + } 25 + 26 + target ??= source; 27 + bindOptions = { propagation: "rshared", ...bindOptions }; 28 + 29 + return { 30 + source, 31 + target, 32 + type, 33 + bindOptions, 34 + kind, 35 + create, 36 + readOnly, 37 + }; 38 + } 39 + 40 + type OldMountOpts = Unwrap< 41 + MountOpts["bindOptions"] & 42 + CustomMountOpts & { readOnly: MountOpts["readOnly"] } 43 + >; 44 + 45 + export const mount = ( 46 + source: MountOpts["source"], 47 + target?: MountOpts["target"], 48 + opts?: OldMountOpts, 49 + ): MountOpts => { 50 + const bindOptions = output(opts).apply((opts) => 51 + opts?.propagation ? { propagation: opts.propagation } : {}, 52 + ); 53 + 54 + return _mount({ 55 + ...opts, 56 + source, 57 + target, 58 + bindOptions, 59 + }); 60 + }; 61 + 62 + export const gitMount = _mount({ source: "/home/bas/git" }); 63 + 64 + export const ssdcacheMount = (source: string = "", target?: string) => 65 + _mount({ source: `/home/bas/data/ssdcache/${source}`, target }); 66 + 67 + export const dataMount = (source: string = "", target?: string) => 68 + _mount({ source: `/home/bas/data/${source}`, target }); 69 + 70 + export const confMount = (source: string = "", target?: string) => 71 + _mount({ source: `/home/bas/docker/${source}`, target: target ?? "/config" }); 72 + 73 + export const nvmeMount = (source: string = "", target?: string) => 74 + _mount({ source: `/mnt/nvme1/${source}`, target }); 75 + 76 + export const dockerSocket = _mount({ 77 + source: "/var/run/docker.sock", 78 + kind: "file", 79 + readOnly: true, 80 + }); 81 + 82 + export const resolvConf = _mount({ 83 + source: "/run/systemd/resolve/stub-resolv.conf", 84 + target: "/etc/resolv.conf", 85 + kind: "file", 86 + readOnly: true, 87 + });
+29
lib/service/networks.ts
··· 1 + import docker from "@pulumi/docker"; 2 + import { haringDockerProvider } from "./providers"; 3 + 4 + export const network = new docker.Network( 5 + "haring", 6 + { 7 + name: "haring", 8 + driver: "bridge", 9 + options: { 10 + // "com.docker.network.bridge.gateway_mode_ipv6": "routed", 11 + "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", 12 + // "com.docker.network.driver.mtu": "1468", 13 + }, 14 + ipv6: true, 15 + ipamConfigs: [ 16 + { 17 + gateway: "2001:db8::1", 18 + subnet: "2001:db8::/64", 19 + }, 20 + { 21 + auxAddress: {}, 22 + gateway: "172.18.0.1", 23 + ipRange: "", 24 + subnet: "172.18.0.0/16", 25 + }, 26 + ], 27 + }, 28 + { provider: haringDockerProvider }, 29 + );
+86
lib/service/ports.ts
··· 1 + import { output } from "@pulumi/pulumi"; 2 + import { ContainerServiceArgs } from "./service"; 3 + 4 + function parsePort(input: string | number, localOnly: boolean = false) { 5 + input = String(input); 6 + 7 + const slashIdx = input.lastIndexOf("/"); 8 + let protocol: "tcp" | "udp" = "tcp"; 9 + if (slashIdx !== -1) { 10 + const proto = input.slice(slashIdx + 1); 11 + protocol = proto === "udp" ? "udp" : "tcp"; 12 + input = input.slice(0, slashIdx); 13 + } 14 + 15 + let ip = localOnly ? "127.0.0.1" : "0.0.0.0"; 16 + if (input.startsWith("[")) { 17 + const closingBracketIdx = input.indexOf("]"); 18 + if (closingBracketIdx === -1) { 19 + throw new Error(`missing ']' in port string ${input}`); 20 + } 21 + ip = input.slice(1, closingBracketIdx); 22 + input = input.slice(closingBracketIdx + 1); 23 + } 24 + 25 + const parts = input.split(":").filter(Boolean); 26 + 27 + let external: string, internal: string | undefined; 28 + if (parts.length === 3) { 29 + [ip, external, internal] = parts; 30 + } else if (parts.length === 2) { 31 + if (parts[0].includes(".")) { 32 + [ip, external] = parts; 33 + } else { 34 + [external, internal] = parts; 35 + } 36 + } else if (parts.length === 1) { 37 + external = parts[0]; 38 + } else { 39 + throw new Error(`too many segments for port string ${input}`); 40 + } 41 + 42 + const portSpecs = [ 43 + { 44 + ip, 45 + internal: parseInt(internal ?? external, 10), 46 + external: parseInt(external, 10), 47 + protocol, 48 + }, 49 + ]; 50 + 51 + if (ip === "0.0.0.0") { 52 + portSpecs.push({ 53 + ip: "::", 54 + internal: parseInt(internal ?? external, 10), 55 + external: parseInt(external, 10), 56 + protocol, 57 + }); 58 + } 59 + 60 + return portSpecs; 61 + } 62 + 63 + export function convertPorts( 64 + ports: NonNullable<ContainerServiceArgs["ports"]>, 65 + ) { 66 + return output(ports).apply((ports) => 67 + ports.flatMap((port) => { 68 + if (typeof port === "object") { 69 + return port; 70 + } 71 + 72 + return parsePort(port); 73 + }), 74 + ); 75 + // .sort((a, b) => { 76 + // if (a.protocol !== b.protocol) { 77 + // return a.protocol.localeCompare(b.protocol); 78 + // } 79 + // 80 + // if (a.ip !== b.ip) { 81 + // return a.ip.localeCompare(b.ip); 82 + // } 83 + // 84 + // return a.internal - b.internal; 85 + // }) 86 + }
+11
lib/service/providers.ts
··· 1 + import docker from "@pulumi/docker"; 2 + 3 + export const haringDockerProvider = new docker.Provider("haring", { 4 + host: "ssh://haring", 5 + context: "haring", 6 + }); 7 + 8 + export const kaneelnasDockerProvider = new docker.Provider("kaneelnas", { 9 + host: "ssh://kaneelnas", 10 + context: "kaneelnas", 11 + });
+310
lib/service/service.ts
··· 1 + import command from "@pulumi/command"; 2 + import type { input } from "@pulumi/command/types"; 3 + import docker from "@pulumi/docker"; 4 + import type { Input, Output } from "@pulumi/pulumi"; 5 + import pulumi, { interpolate } from "@pulumi/pulumi"; 6 + import path from "path"; 7 + import { network } from "./networks"; 8 + import { convertLabels, convertEnvs } from "./util"; 9 + import { convertPorts } from "./ports"; 10 + import { getEnv } from "~lib/env"; 11 + import { haringDockerProvider } from "./providers"; 12 + import { MountOpts } from "./mounts"; 13 + 14 + const defaultConnection: input.remote.ConnectionArgs = { 15 + host: getEnv("CONNECTION_HOST"), 16 + user: getEnv("CONNECTION_USER"), 17 + // password: getEnv("CONNECTION.PASSWORD"), 18 + }; 19 + 20 + type Env = string | number | boolean; 21 + 22 + export type ContainerServiceArgs = Partial< 23 + Omit< 24 + docker.ContainerArgs, 25 + "ports" | "labels" | "mounts" | "envs" | "capabilities" 26 + > & { 27 + enabled: boolean; 28 + disabled: boolean; 29 + servicePort: number; 30 + subdomain: string; 31 + hostRule: string; 32 + ports: Input<Input<number | string | docker.types.input.ContainerPort>[]>; 33 + middlewares: string[]; 34 + otherServicePorts: Record<string, number>; 35 + labels: Record<string, string>; 36 + mounts: MountOpts[]; 37 + envs: Input<Record<string, Input<Env | Env[]>>>; 38 + capabilities: string[] | { adds?: string[]; drops?: string[] }; 39 + internalHttps: boolean; 40 + dontUpdateIf: () => boolean; 41 + commandConnection: input.remote.ConnectionArgs; 42 + } 43 + >; 44 + 45 + // TODO: turn ContainerService into a factory function like https://sst.dev/docs/examples/#api-gateway-auth 46 + class ContainerService extends pulumi.ComponentResource { 47 + public readonly container: docker.Container | undefined; 48 + public readonly localUrl: string | undefined; 49 + public readonly remoteUrl: string | undefined; 50 + public readonly ip: Output<string | undefined>; 51 + public readonly enabled: boolean; 52 + private readonly commandConnection: input.remote.ConnectionArgs; 53 + 54 + constructor( 55 + name: string, 56 + _args: ContainerServiceArgs, 57 + opts?: pulumi.ComponentResourceOptions, 58 + ) { 59 + super("bas:docker:ContainerService", name, _args, opts); 60 + 61 + const args = { 62 + enabled: true, 63 + disabled: false, 64 + ports: [], 65 + envs: {}, 66 + mounts: [], 67 + middlewares: [], 68 + labels: {}, 69 + otherServicePorts: {}, 70 + networksAdvanced: [], 71 + hosts: [], 72 + commandConnection: defaultConnection, 73 + ..._args, 74 + } satisfies ContainerServiceArgs; 75 + 76 + this.commandConnection = args.commandConnection; 77 + 78 + const mounts = pulumi.output(args.mounts).apply((mounts) => { 79 + let i = 0; 80 + for (const mount of mounts) { 81 + if (mount.type === "bind" && mount.source && mount.create) { 82 + const dir = 83 + mount.kind === "file" ? path.dirname(mount.source) : mount.source; 84 + this.createRemoteDir(dir, name, i); 85 + i++; 86 + } 87 + 88 + delete mount.kind; 89 + delete mount.create; 90 + } 91 + 92 + // mounts.push({ 93 + // type: "bind", 94 + // source: "/run/systemd/resolve/stub-resolv.conf", 95 + // target: "/etc/resolv.conf", 96 + // readOnly: true, 97 + // }); 98 + 99 + return mounts; 100 + }); 101 + 102 + if (!args.enabled || args.disabled) { 103 + this.enabled = false; 104 + this.ip = pulumi.output(undefined); 105 + return; 106 + } 107 + 108 + const imageManifest = docker.getRegistryImageOutput( 109 + { name: args.image ?? `lscr.io/linuxserver/${name}` }, 110 + { parent: this }, 111 + ); 112 + 113 + const image = new docker.RemoteImage( 114 + `${name}`, 115 + { 116 + name: interpolate`${imageManifest.name}@${imageManifest.sha256Digest}`, 117 + keepLocally: true, 118 + }, 119 + { parent: this }, 120 + ); 121 + 122 + function createLabels(host: string, port: string) { 123 + const subdomain = host.replace(".bas.sh", ""); 124 + const id = 125 + name + 126 + (subdomain !== args.subdomain && subdomain !== name 127 + ? "-" + subdomain.replaceAll(/\.|\//g, "-") 128 + : ""); 129 + 130 + return { 131 + "traefik.enable": "true", 132 + [`traefik.http.services.${id}.loadbalancer.server.port`]: port, 133 + [`traefik.http.routers.${id}.service`]: id, 134 + [`traefik.http.routers.${id}.rule`]: `Host(\`${host}\`)`, 135 + [`traefik.http.routers.${id}.entrypoints`]: "https", 136 + [`traefik.http.routers.${id}.middlewares`]: [ 137 + "cloudflare", 138 + ...args.middlewares, 139 + ].join(","), 140 + ...(port === "443" && { 141 + [`traefik.http.services.${id}.loadbalancer.server.scheme`]: "https", 142 + }), 143 + }; 144 + } 145 + 146 + let labels = {}; 147 + if (args.servicePort) { 148 + this.localUrl = `http://${args.networkMode === "host" ? "host.docker.internal" : name}:${args.servicePort}`; 149 + const host = args.hostRule ?? `${args.subdomain ?? name}.bas.sh`; 150 + this.remoteUrl = `https://${host}`; 151 + 152 + labels = { 153 + ...labels, 154 + ...createLabels(host, args.servicePort.toString()), 155 + }; 156 + } 157 + 158 + for (const service of Object.keys(args.otherServicePorts)) { 159 + let host = service; 160 + const port = args.otherServicePorts[service]; 161 + 162 + if (!host.includes(".bas.sh") && !host.includes("/")) { 163 + host += ".bas.sh"; 164 + } else if (host.startsWith("/")) { 165 + host = this.remoteUrl + host; 166 + } 167 + 168 + labels = { 169 + ...labels, 170 + ...createLabels(host, port.toString()), 171 + }; 172 + } 173 + 174 + labels = { 175 + ...labels, 176 + ...args.labels, 177 + }; 178 + 179 + const envs = { 180 + PUID: `${getEnv("PUID")}`, 181 + PGID: `${getEnv("PGID")}`, 182 + TZ: `${getEnv("TZ")}`, 183 + ...args.envs, 184 + }; 185 + 186 + const ports = convertPorts(args.ports); 187 + 188 + // pulumi.output(ports).apply((ports) => { 189 + // if (name === "minecraft-akio") console.dir(ports, { depth: null }); 190 + // }); 191 + 192 + const capabilities = Array.isArray(args.capabilities) 193 + ? { adds: args.capabilities } 194 + : args.capabilities; 195 + 196 + const ensureCapPrefix = (cap: string) => 197 + cap.startsWith("CAP_") ? cap : `CAP_${cap}`; 198 + 199 + if (capabilities) { 200 + capabilities.adds &&= capabilities.adds.map(ensureCapPrefix); 201 + capabilities.drops &&= capabilities.drops.map(ensureCapPrefix); 202 + } 203 + 204 + this.container = new docker.Container( 205 + name, 206 + { 207 + ...args, 208 + image: image.imageId, 209 + name: args.name ?? name, 210 + command: args.command, 211 + restart: "always", 212 + labels: convertLabels(labels), 213 + envs: convertEnvs(envs), 214 + ports, 215 + mounts, 216 + volumes: args.volumes, 217 + networkMode: args.networkMode ?? "bridge", 218 + // TODO: healthchecks 219 + // healthcheck: {tests} 220 + networksAdvanced: args.networkMode 221 + ? [] 222 + : pulumi 223 + .output(args.networksAdvanced) 224 + .apply((networksAdvanced) => [ 225 + ...networksAdvanced, 226 + { name: network.name }, 227 + ]), 228 + hosts: args.networkMode 229 + ? [] 230 + : pulumi 231 + .output(args.hosts) 232 + .apply((hosts) => [ 233 + { host: "host.docker.internal", ip: "host-gateway" }, 234 + ...hosts, 235 + ]), 236 + capabilities, 237 + }, 238 + { 239 + parent: this, 240 + deleteBeforeReplace: true, 241 + replaceOnChanges: ["mounts", "volumes"], 242 + ignoreChanges: opts?.ignoreChanges, 243 + ...opts, 244 + }, 245 + ); 246 + 247 + this.ip = pulumi 248 + .all([this.container.networkDatas, network.name]) 249 + .apply(([networks, networkName]) => { 250 + const net = networks?.find((n) => n.networkName === networkName); 251 + return net?.ipAddress; 252 + }); 253 + 254 + this.enabled = true; 255 + 256 + this.registerOutputs(); 257 + } 258 + 259 + private createRemoteDir(path: string, name: string, index: number) { 260 + new command.remote.Command( 261 + `mkdir-${name}-${index}`, 262 + { 263 + connection: this.commandConnection, 264 + create: `test -e "${path}" || mkdir -p "${path}"`, 265 + delete: path.includes("/") 266 + ? path 267 + .split("/") 268 + .slice(1) 269 + .map( 270 + (_segment, i, segments) => 271 + `rmdir "/${segments.slice(0, segments.length - i).join("/")}"`, 272 + ) 273 + .join(" && ") + " || true" 274 + : undefined, 275 + }, 276 + { 277 + parent: this, 278 + deleteBeforeReplace: true, 279 + ignoreChanges: ["connection"], 280 + }, 281 + ); 282 + } 283 + 284 + static async remoteRun( 285 + args: command.local.RunArgs, 286 + opts?: pulumi.InvokeOptions, 287 + ): Promise<command.local.RunResult> { 288 + const newArgs: command.local.RunArgs = { 289 + ...args, 290 + interpreter: ["/usr/bin/ssh", getEnv("CONNECTION_HOST")], 291 + }; 292 + 293 + return command.local.run(newArgs, { 294 + ...opts, 295 + }); 296 + } 297 + } 298 + 299 + class ContainerServiceWrapper extends ContainerService { 300 + constructor(...args: ConstructorParameters<typeof ContainerService>) { 301 + args[2] = { 302 + provider: haringDockerProvider, 303 + ...args[2], 304 + }; 305 + 306 + super(...args); 307 + } 308 + } 309 + 310 + export { ContainerServiceWrapper as ContainerService };
+17
lib/service/util.ts
··· 1 + import { ContainerServiceArgs } from "./service"; 2 + import { output } from "@pulumi/pulumi"; 3 + 4 + export function convertLabels( 5 + labels: NonNullable<ContainerServiceArgs["labels"]>, 6 + ) { 7 + return Object.entries(labels).map(([label, value]) => ({ label, value })); 8 + } 9 + 10 + export function convertEnvs(envs: ContainerServiceArgs["envs"]) { 11 + return output(envs).apply((envs) => { 12 + return Object.entries(envs ?? {}).map( 13 + ([env, value]) => 14 + `${env}=${Array.isArray(value) ? value.join("\n") : value}`, 15 + ); 16 + }); 17 + }
+17 -6
package.json
··· 6 6 "private": true, 7 7 "author": "Bas van den Wollenberg <hi@bas.sh> (https://bas.sh)", 8 8 "dependencies": { 9 - "@pulumi/command": "^0.11.1", 10 - "@pulumi/docker": "4.5.3", 11 - "@pulumi/pulumi": "*", 12 - "dotenv": "^16.4.5", 9 + "@pulumi/command": "^1.1.0", 10 + "@pulumi/docker": "^4.8.2", 11 + "@pulumi/pulumi": "^3.196.0", 12 + "arktype": "^2.1.22", 13 + "dotenv": "^16.6.1", 14 + "ipaddr.js": "^2.2.0", 13 15 "ts-node": "^10.9.2", 14 - "typescript": "^5.4.5" 16 + "tsx": "^4.20.5", 17 + "typescript": "^5.9.2", 18 + "undici": "^7.16.0", 19 + "up-fetch": "^2.4.0", 20 + "zod": "^4.1.8" 15 21 }, 16 22 "devDependencies": { 17 - "@types/node": "^20.12.12" 23 + "@eslint/js": "^9.35.0", 24 + "@pulumi/eslint-plugin": "^0.3.1", 25 + "@types/node": "^24.5.0", 26 + "eslint": "^9.35.0", 27 + "jiti": "^2.5.1", 28 + "typescript-eslint": "^8.44.0" 18 29 } 19 30 }
src/env.ts lib/env.ts
+1 -424
src/index.ts
··· 1 - import * as pulumi from "@pulumi/pulumi"; 2 - import * as docker from "@pulumi/docker"; 3 - import { remote } from "@pulumi/command"; 4 - import { ContainerService } from "./service"; 5 - import { getEnv } from "./env"; 6 - 7 - const dockerConfMount = (name: string, target?: string) => { 8 - new remote.Command(`mkdir-${name}`, { 9 - connection: { host: "haring.bas.sh", user: "bas" }, 10 - create: `mkdir -p /home/bas/docker/${name}`, 11 - }); 12 - 13 - return { 14 - source: `/home/bas/docker/${name}`, 15 - target: target || "/config", 16 - type: "bind", 17 - }; 18 - }; 19 - 20 - const dataMount = { 21 - source: "/home/bas/data", 22 - target: "/home/bas/data", 23 - type: "bind", 24 - bindOptions: { 25 - propagation: "rshared", 26 - }, 27 - }; 28 - 29 - const gitMount = { 30 - target: "/home/bas/git", 31 - source: "/home/bas/git", 32 - type: "bind", 33 - }; 34 - 35 - const traefikVolume = new docker.Volume("traefik", { 36 - name: "traefik", 37 - }); 38 - 39 - const traefikService = await ContainerService.create("traefik", { 40 - image: "traefik", 41 - webPort: 8080, 42 - volumes: [ 43 - { 44 - volumeName: traefikVolume.name, 45 - containerPath: "/etc/traefik", 46 - }, 47 - ], 48 - mounts: [ 49 - { 50 - source: "/var/run/docker.sock", 51 - target: "/var/run/docker.sock", 52 - type: "bind", 53 - readOnly: true, 54 - }, 55 - ], 56 - ports: [80, 443], 57 - envs: [ 58 - `CF_API_EMAIL=${getEnv("EMAIL")}`, 59 - `CF_API_KEY=${getEnv("CF_API_KEY")}`, 60 - ], 61 - command: [ 62 - "--api", 63 - "--providers.docker.endpoint=unix:///var/run/docker.sock", 64 - "--providers.docker.exposedbydefault=false", 65 - "--entrypoints.http.address=:80", 66 - "--entrypoints.https.address=:443", 67 - "--entrypoints.https.http.tls=true", 68 - "--entrypoints.https.http.tls.certresolver=cloudflare", 69 - "--entrypoints.https.http.tls.domains[0].main=bas.sh", 70 - "--entrypoints.https.http.tls.domains[0].sans=*.bas.sh", 71 - "--certificatesresolvers.cloudflare.acme.dnschallenge=true", 72 - "--certificatesresolvers.cloudflare.acme.dnschallenge.provider=cloudflare", 73 - "--certificatesresolvers.cloudflare.acme.dnschallenge.resolvers=1.1.1.1:53,8.8.8.8:53", 74 - "--certificatesresolvers.cloudflare.acme.storage=/etc/traefik/acme.json", 75 - `--certificatesresolvers.cloudflare.acme.email=${getEnv("EMAIL")}`, 76 - "--experimental.plugins.cloudflarewarp.modulename=github.com/BetterCorp/cloudflarewarp", 77 - "--experimental.plugins.cloudflarewarp.version=v1.3.3", 78 - "--metrics.prometheus=true", 79 - "--metrics.prometheus.addEntryPointsLabels=true", 80 - "--metrics.prometheus.addServicesLabels=true", 81 - "--metrics.prometheus.addRoutersLabels=true", 82 - "--metrics.prometheus.buckets=0.1,0.3,1.2,5.0", 83 - "--metrics.prometheus.manualRouting=true", 84 - ], 85 - labels: { 86 - "traefik.http.middlewares.httpsredirect.redirectscheme.scheme": "https", 87 - "traefik.http.middlewares.cloudflarewarp.plugin.cloudflarewarp.disableDefault": 88 - "false", 89 - "traefik.http.middlewares.auth.basicauth.users": 90 - "bas:$2y$05$XUkzwNnxl2sdNIMqrqspsulGw6fbj1smtwk7bMClLiDIsrR3EatOG", 91 - "traefik.http.routers.httpsredirect.entrypoints": "http", 92 - "traefik.http.routers.httpsredirect.middlewares": "httpsredirect", 93 - "traefik.http.routers.httpsredirect.rule": "HostRegexp(`{any:.+}`)", 94 - 95 - "traefik.http.routers.traefik.service": "api@internal", 96 - "traefik.http.routers.traefik.middlewares": "auth", 97 - 98 - "traefik.http.routers.metrics.service": "prometheus@internal", 99 - "traefik.http.routers.metrics.rule": "Host(`metrics.bas.sh`)", 100 - "traefik.http.routers.metrics.entrypoints": "https", 101 - "traefik.http.routers.metrics.middlewares": "auth", 102 - }, 103 - }); 104 - 105 - const whoamiService = await ContainerService.create("whoami", { 106 - image: "traefik/whoami", 107 - webPort: 80, 108 - }); 109 - 110 - const wireguardService = await ContainerService.create("wireguard", { 111 - ports: [32400], 112 - mounts: [ 113 - dockerConfMount("wireguard"), 114 - { 115 - source: "/lib/modules", 116 - target: "/lib/modules", 117 - type: "bind", 118 - }, 119 - ], 120 - extraContainerOptions: { 121 - privileged: true, 122 - capabilities: { 123 - adds: ["NET_ADMIN", "SYS_MODULE"], 124 - }, 125 - sysctls: { "net.ipv4.conf.all.src_valid_mark": 1 }, 126 - }, 127 - }); 128 - 129 - const plexService = await ContainerService.create("plex", { 130 - webPort: 32400, 131 - envs: ["VERSION=latest"], 132 - mounts: [dockerConfMount("plex"), dataMount, gitMount], 133 - networkMode: pulumi.interpolate`container:${wireguardService.container.id}`, 134 - }); 135 - 136 - const overseerrService = await ContainerService.create("overseerr", { 137 - webPort: 5055, 138 - subdomain: "request", 139 - mounts: [dockerConfMount("overseerr"), dataMount], 140 - }); 141 - 142 - const sonarrService = await ContainerService.create("sonarr", { 143 - webPort: 8989, 144 - mounts: [dockerConfMount("sonarr"), dataMount], 145 - }); 146 - 147 - const radarrService = await ContainerService.create("radarr", { 148 - webPort: 7878, 149 - mounts: [dockerConfMount("radarr"), dataMount], 150 - }); 151 - 152 - const jackettService = await ContainerService.create("jackett", { 153 - webPort: 9117, 154 - ports: [9117], 155 - mounts: [dockerConfMount("jackett"), dataMount], 156 - }); 157 - 158 - const kitanaService = await ContainerService.create("kitana", { 159 - image: "pannal/kitana", 160 - webPort: 31337, 161 - mounts: [ 162 - { 163 - source: "kitana", 164 - target: "/app/data", 165 - type: "volume", 166 - }, 167 - ], 168 - }); 169 - 170 - const tautulliService = await ContainerService.create("tautulli", { 171 - webPort: 8181, 172 - mounts: [dockerConfMount("tautulli"), gitMount], 173 - envs: [ 174 - "DOCKER_MODS=linuxserver/mods:universal-package-install", 175 - "INSTALL_PIP_PACKAGES=-r /home/bas/git/PlexAniSync/requirements.txt", 176 - ], 177 - }); 178 - 179 - const qbittorrentService = await ContainerService.create("qbittorrent", { 180 - webPort: 8080, 181 - ports: [1337], 182 - envs: ["TORRENTING_PORT=1337"], 183 - mounts: [dockerConfMount("qbittorrent"), dataMount], 184 - }); 185 - 186 - const librespeedService = await ContainerService.create("librespeed", { 187 - image: "ghcr.io/librespeed/speedtest", 188 - webPort: 80, 189 - subdomain: "speedtest", 190 - envs: [ 191 - "TITLE=Speedtest | Bas", 192 - "TELEMETRY=true", 193 - "ENABLE_ID_OBFUSCATION=true", 194 - "REDACT_IP_ADDRESSES=true", 195 - `EMAIL=${getEnv("EMAIL")}`, 196 - `PASSWORD=${getEnv("LIBRESPEED_PASSWORD")}`, 197 - `IPINFO_APIKEY=${getEnv("IPINFO_APIKEY")}`, 198 - ], 199 - }); 200 - 201 - ["get", "static", "files", "f", "i"].map(async (subdomain) => { 202 - await ContainerService.create(`caddy${subdomain}`, { 203 - image: "caddy", 204 - webPort: 80, 205 - subdomain: subdomain, 206 - command: [ 207 - "caddy", 208 - "file-server", 209 - "--browse", 210 - "--root=/var/www", 211 - `--domain=${subdomain}.bas.sh`, 212 - "--listen=:80", 213 - ], 214 - mounts: [ 215 - { 216 - source: "/home/bas/data/media/web/files", 217 - target: "/var/www", 218 - type: "bind", 219 - bindOptions: { 220 - propagation: "rshared", 221 - }, 222 - }, 223 - ], 224 - }); 225 - }); 226 - 227 - const autolanguagesService = await ContainerService.create("autolanguages", { 228 - image: "remirigal/plex-auto-languages", 229 - envs: [ 230 - `PLEX_TOKEN=${getEnv("PLEX_TOKEN")}`, 231 - "PLEX_URL=https://plex.bas.sh:443", 232 - "UPDATE_LEVEL=season", 233 - "TRIGGER_ON_ACTIVITY=true", 234 - "REFRESH_ON_SCAN=true", 235 - "NOTIFICATIONS_ENABLE=true", 236 - `NOTIFICATIONS_APPRISE_CONFIGS=[{ urls: ["${getEnv("DISCORD_AUTO_LANGUAGES_WEBHOOK")}"], events: ["play_or_activity", "scheduler"] }]`, 237 - ], 238 - }); 239 - 240 - const theloungeService = await ContainerService.create("thelounge", { 241 - webPort: 9000, 242 - subdomain: "irc", 243 - mounts: [dockerConfMount("thelounge")], 244 - }); 245 - 246 - const autobrrService = await ContainerService.create("autobrr", { 247 - image: "ghcr.io/autobrr/autobrr", 248 - webPort: 7474, 249 - mounts: [dockerConfMount("autobrr")], 250 - }); 251 - 252 - const ankiService = await ContainerService.create("anki", { 253 - image: "ankicommunity/anki-sync-server:latest-develop", 254 - webPort: 27701, 255 - envs: [ 256 - "ANKISYNCD_AUTH_DB_PATH=/app/data/auth.db", 257 - "ANKISYNCD_DATA_ROOT=/app/data/collections", 258 - "ANKISYNCD_SESSION_DB_PATH=/app/data/session.db", 259 - ], 260 - mounts: [dockerConfMount("anki", "/app/data")], 261 - }); 262 - 263 - const sabnzbdService = await ContainerService.create("sabnzbd", { 264 - webPort: 8080, 265 - mounts: [dockerConfMount("sabnzbd"), dataMount], 266 - }); 267 - 268 - const recyclarrService = await ContainerService.create("recyclarr", { 269 - image: "recyclarr/recyclarr", 270 - mounts: [dockerConfMount("recyclarr")], 271 - }); 272 - 273 - const qbittoolsService = await ContainerService.create("qbittools", { 274 - image: "registry.gitlab.com/alexkm/qbittools", 275 - mounts: [ 276 - { 277 - source: "/home/bas/docker/qbittorrent", 278 - target: "/qbittorrent", 279 - type: "bind", 280 - }, 281 - dataMount, 282 - ], 283 - command: [ 284 - "reannounce", 285 - "-C", 286 - "/qbittorrent/qBittorrent.conf", 287 - "-s", 288 - "https://qbittorrent.bas.sh:443", 289 - "-U", 290 - getEnv("QBITTORRENT_USERNAME"), 291 - "-P", 292 - getEnv("QBITTORRENT_PASSWORD"), 293 - ], 294 - }); 295 - 296 - const resilioSyncService = await ContainerService.create("resilio-sync", { 297 - subdomain: "sync", 298 - webPort: 8888, 299 - ports: [55555], 300 - mounts: [ 301 - dockerConfMount("resilio-sync"), 302 - { 303 - source: "/home/bas/data/media/sync", 304 - target: "/sync", 305 - type: "bind", 306 - bindOptions: { 307 - propagation: "rshared", 308 - }, 309 - }, 310 - ], 311 - }); 312 - 313 - const syncthingService = await ContainerService.create("syncthing", { 314 - webPort: 8384, 315 - subdomain: "syncthing", 316 - ports: [22000, 21027], 317 - mounts: [ 318 - dockerConfMount("syncthing"), 319 - { 320 - source: "/home/bas/data/media/sync", 321 - target: "/sync", 322 - type: "bind", 323 - bindOptions: { 324 - propagation: "rshared", 325 - }, 326 - }, 327 - ], 328 - }); 329 - 330 - const mkvtoolnixService = await ContainerService.create("mkvtoolnix", { 331 - image: "jlesage/mkvtoolnix", 332 - webPort: 5800, 333 - mounts: [dockerConfMount("mkvtoolnix"), dataMount], 334 - envs: [ 335 - `VNC_PASSWORD=${getEnv("VNC_PASSWORD")}`, 336 - "DARK_MODE=true", 337 - "APP_NICENESS=10", 338 - "KEEP_APP_RUNNING=1", 339 - "ENABLE_CJK_FONT=1", 340 - ], 341 - }); 342 - 343 - const mkvMuxingBatchService = await ContainerService.create("mkv-batch", { 344 - image: "jlesage/mkv-muxing-batch-gui", 345 - webPort: 5800, 346 - subdomain: "mkv-batch", 347 - mounts: [dockerConfMount("mkv-batch"), dataMount], 348 - envs: [ 349 - `VNC_PASSWORD=${getEnv("VNC_PASSWORD")}`, 350 - "DARK_MODE=true", 351 - "APP_NICENESS=10", 352 - "KEEP_APP_RUNNING=1", 353 - "ENABLE_CJK_FONT=1", 354 - ], 355 - }); 356 - 357 - const prometheusService = await ContainerService.create("prometheus", { 358 - image: "prom/prometheus", 359 - webPort: 9090, 360 - mounts: [dockerConfMount("prometheus", "/etc/prometheus")], 361 - volumes: [ 362 - { 363 - volumeName: "prometheus", 364 - containerPath: "/prometheus", 365 - }, 366 - ], 367 - command: [ 368 - "--config.file=/etc/prometheus/prometheus.yml", 369 - "--storage.tsdb.path=/prometheus", 370 - "--web.console.libraries=/etc/prometheus/console_libraries", 371 - "--web.console.templates=/etc/prometheus/consoles", 372 - ], 373 - middlewares: ["auth"], 374 - }); 375 - 376 - const grafanaService = await ContainerService.create("grafana", { 377 - image: "grafana/grafana-oss", 378 - webPort: 3000, 379 - mounts: [dockerConfMount("grafana", "/var/lib/grafana")], 380 - envs: ["GF_INSTALL_PLUGINS=grafana-piechart-panel"], 381 - extraContainerOptions: { 382 - user: "1000:1000", 383 - }, 384 - }); 385 - 386 - const scrutinyService = await ContainerService.create("scrutiny", { 387 - image: "ghcr.io/analogj/scrutiny:master-omnibus", 388 - webPort: 8080, 389 - mounts: [ 390 - dockerConfMount("scrutiny/config", "/opt/scrutiny/config"), 391 - dockerConfMount("scrutiny/influxdb", "/opt/scrutiny/influxdb"), 392 - { 393 - source: "/run/udev", 394 - target: "/run/udev", 395 - type: "bind", 396 - readOnly: true, 397 - }, 398 - ], 399 - envs: ["COLLECTOR_CRON_SCHEDULE=0 * * * *"], 400 - extraContainerOptions: { 401 - capabilities: { 402 - adds: ["SYS_RAWIO", "SYS_ADMIN"], 403 - }, 404 - devices: [ 405 - "sda", 406 - "sdb", 407 - "sdc", 408 - "sdd", 409 - "sde", 410 - "sdf", 411 - "sdg", 412 - "sdh", 413 - "sdi", 414 - "sdj", 415 - "nvme0", 416 - "nvme1", 417 - ].map((i) => ({ 418 - containerPath: `/dev/${i}`, 419 - hostPath: `/dev/${i}`, 420 - permissions: "r", 421 - })), 422 - }, 423 - middlewares: ["auth"], 424 - }); 1 + import "./services";
-239
src/service.ts
··· 1 - import * as pulumi from "@pulumi/pulumi"; 2 - import * as docker from "@pulumi/docker"; 3 - import { getEnv } from "./env"; 4 - 5 - const convertLabels = (labels: Args["labels"]) => 6 - labels && 7 - Object.entries(labels).map(([label, value]) => ({ 8 - label, 9 - value, 10 - })); 11 - 12 - const convertPorts = (ports?: Args["ports"]) => { 13 - return ports?.map((port) => { 14 - if (typeof port === "number") { 15 - return { 16 - internal: port, 17 - external: port, 18 - }; 19 - } 20 - 21 - const [internal, external] = port.split(":"); 22 - return { 23 - internal: parseInt(internal, 10), 24 - external: parseInt(external, 10), 25 - }; 26 - }); 27 - }; 28 - 29 - type Registry = "ghcr.io" | "registry.gitlab.com"; 30 - 31 - const getToken = async (registry: Registry, imageName: string) => { 32 - let url; 33 - 34 - if (registry === "ghcr.io") { 35 - url = `https://ghcr.io/token?scope=repository:${imageName}:pull`; 36 - } else { 37 - url = `https://gitlab.com/jwt/auth?service=container_registry&scope=repository:${imageName}:pull`; 38 - } 39 - 40 - const response = await fetch(url); 41 - 42 - if (!response.ok) { 43 - throw new Error( 44 - `Failed to fetch token for ${imageName}, status: ${response.status}, body: ${await response.text()}`, 45 - ); 46 - } 47 - 48 - return response.json().then(({ token }) => token); 49 - }; 50 - 51 - const getLatestImageName = async (image: string) => { 52 - const match = image.match( 53 - /^(?:(?<registry>ghcr\.io|registry\.gitlab\.com)\/)?(?<name>(?:(?!:).)+)(?::(?<tag>.+))?/, 54 - ); 55 - 56 - if (!match?.groups) { 57 - throw new Error(`Failed to parse image: ${image}`); 58 - } 59 - 60 - const registry = match.groups.registry as Registry; 61 - const tag = match.groups.tag || "latest"; 62 - const name = match.groups.name; 63 - 64 - let url; 65 - let headers; 66 - 67 - if (registry) { 68 - const token = await getToken(registry, name); 69 - 70 - headers = { 71 - Authorization: `Bearer ${token}`, 72 - Accept: "application/vnd.oci.image.index.v1+json", 73 - }; 74 - url = `https://${registry}/v2/${name}/manifests/${tag}`; 75 - } else if (name.includes("/")) { 76 - url = `https://hub.docker.com/v2/repositories/${name}/tags/${tag}`; 77 - } else { 78 - url = `https://hub.docker.com/v2/repositories/library/${name}/tags/${tag}`; 79 - } 80 - 81 - const response = await fetch(url, { headers }); 82 - 83 - if (!response.ok) { 84 - throw new Error( 85 - `Failed to fetch tags for ${image}, status: ${response.status}, body: ${await response.text()}`, 86 - ); 87 - } 88 - 89 - const tags = await response.json(); 90 - const digest = (tags?.manifests ?? tags?.images)?.find( 91 - (image: any) => 92 - (image.os === "linux" || !image.os) && 93 - (image.architecture === "amd64" || 94 - image.platform?.architecture === "amd64"), 95 - )?.digest; 96 - 97 - if (!digest) { 98 - throw new Error( 99 - `Failed to find latest digest for ${image}, tags: ${JSON.stringify(tags, null, 2)}`, 100 - ); 101 - } 102 - 103 - if (registry) { 104 - return `${registry}/${name}@${digest}`; 105 - } else { 106 - return `${name}@${digest}`; 107 - } 108 - }; 109 - 110 - type AtLeast<T, K extends keyof T> = Pick<T, K> & Partial<Omit<T, K>>; 111 - 112 - type Args = AtLeast< 113 - { 114 - image: string; 115 - subdomain: string; 116 - hostRule: string; 117 - webPort: number; 118 - command: string[]; 119 - middlewares: string[]; 120 - labels: Record<string, string>; 121 - envs: string[]; 122 - mounts: docker.types.input.ContainerMount[]; 123 - volumes: docker.types.input.ContainerVolume[]; 124 - ports: (`${number}:${number}` | number)[]; 125 - networkMode: pulumi.Input<string>; 126 - aliases: string[]; 127 - extraContainerOptions: Partial<docker.ContainerArgs>; 128 - }, 129 - "image" 130 - >; 131 - 132 - // const network = new docker.Network("haring", { 133 - // name: "haring", 134 - // driver: "bridge", 135 - // }); 136 - 137 - export class ContainerService extends pulumi.ComponentResource { 138 - public container: docker.Container; 139 - 140 - public image: docker.RemoteImage; 141 - 142 - static async create( 143 - name: string, 144 - args: Partial<Args>, 145 - opts?: pulumi.ComponentResourceOptions, 146 - ) { 147 - const fullArgs: Args = { 148 - ...args, 149 - image: await getLatestImageName(args.image || `linuxserver/${name}`), 150 - }; 151 - 152 - return new ContainerService(name, fullArgs, opts); 153 - } 154 - 155 - constructor( 156 - name: string, 157 - args: Args, 158 - opts?: pulumi.ComponentResourceOptions, 159 - ) { 160 - super("bas:docker:ContainerService", name, args, opts); 161 - 162 - this.image = new docker.RemoteImage( 163 - `${name}`, 164 - { 165 - name: args.image, 166 - keepLocally: true, 167 - }, 168 - { 169 - parent: this, 170 - }, 171 - ); 172 - 173 - let labels = {}; 174 - let host; 175 - 176 - if (args.webPort) { 177 - host = args.hostRule || `${args.subdomain || name}.bas.sh`; 178 - 179 - labels = { 180 - "traefik.enable": "true", 181 - [`traefik.http.services.${name}.loadbalancer.server.port`]: 182 - args.webPort.toString(), 183 - [`traefik.http.routers.${name}.rule`]: `Host(\`${host}\`)`, 184 - [`traefik.http.routers.${name}.entrypoints`]: "https", 185 - [`traefik.http.routers.${name}.middlewares`]: [ 186 - "cloudflarewarp", 187 - ...(args.middlewares || []), 188 - ].join(","), 189 - }; 190 - } 191 - 192 - labels = { 193 - ...labels, 194 - ...args.labels, 195 - }; 196 - 197 - const envs = [ 198 - `PUID=${getEnv("PUID")}`, 199 - `PGID=${getEnv("PGID")}`, 200 - `TZ=${getEnv("TZ")}`, 201 - ...(args.envs || []), 202 - ]; 203 - 204 - this.container = new docker.Container( 205 - name, 206 - { 207 - image: this.image.imageId, 208 - name, 209 - command: args.command, 210 - restart: "always", 211 - labels: convertLabels(labels), 212 - envs, 213 - ports: convertPorts(args.ports), 214 - mounts: args.mounts, 215 - volumes: args.volumes, 216 - networkMode: args.networkMode || "bridge", 217 - // networksAdvanced: [ 218 - // { 219 - // name: network.name, 220 - // ...(args.aliases && { 221 - // aliases: args.aliases, 222 - // }), 223 - // }, 224 - // ], 225 - ...args.extraContainerOptions, 226 - }, 227 - { 228 - parent: this, 229 - deleteBeforeReplace: true, 230 - replaceOnChanges: ["mounts", "volumes"], 231 - }, 232 - ); 233 - 234 - this.registerOutputs({ 235 - container: this.container, 236 - image: this.image, 237 - }); 238 - } 239 - }
+2
src/services/index.ts
··· 1 + import "./minecraft"; 2 + import "./other";
+64
src/services/kaneelnas.ts
··· 1 + import { getEnv } from "~lib/env"; 2 + import { mount } from "~lib/service/mounts"; 3 + import { kaneelnasDockerProvider } from "~lib/service/providers"; 4 + import { ContainerService } from "~lib/service/service"; 5 + 6 + const KANEELNAS_DOCKER = "/volume1/docker/bas"; 7 + const KANEELNAS_DATA = "/volume1/data/bas"; 8 + const KANEELNAS_HOST = getEnv("KANEELNAS_HOST"); 9 + 10 + const kaneelnasConnection = { 11 + host: KANEELNAS_HOST, 12 + user: getEnv("USERNAME"), 13 + }; 14 + 15 + const kaneelnasQbittorrentService = new ContainerService( 16 + "qbittorrent-kaneelnas", 17 + { 18 + image: "lscr.io/linuxserver/qbittorrent:5.1.2", 19 + name: "qbittorrent-bas", 20 + // servicePort: 8080, 21 + // ports: [8450, 8451, "8451/udp"], 22 + envs: { 23 + WEBUI_PORT: 8450, 24 + TORRENTING_PORT: 8451, 25 + DOCKER_MODS: "ghcr.io/vuetorrent/vuetorrent-lsio-mod:latest", 26 + PUID: 1027, 27 + PGID: 100, 28 + }, 29 + mounts: [ 30 + mount(`${KANEELNAS_DOCKER}/qbittorrent`, "/config", { 31 + propagation: "private", 32 + }), 33 + mount(`${KANEELNAS_DATA}/torrents-kaneelnas`, "/downloads", { 34 + propagation: "private", 35 + }), 36 + mount(`${KANEELNAS_DATA}/plex`, "/plex", { 37 + propagation: "private", 38 + }), 39 + ], 40 + networkMode: "host", 41 + commandConnection: kaneelnasConnection, 42 + destroyGraceSeconds: 60, 43 + }, 44 + { 45 + provider: kaneelnasDockerProvider, 46 + ignoreChanges: ["ports"], 47 + }, 48 + ); 49 + 50 + const kaneelnasWhoamiService = new ContainerService( 51 + "whoami-kaneelnas", 52 + { 53 + name: "whoami-bas", 54 + image: "ghcr.io/traefik/whoami", 55 + // servicePort: 80, 56 + ports: ["8452:80"], 57 + networkMode: "bridge", 58 + commandConnection: kaneelnasConnection, 59 + }, 60 + { 61 + provider: kaneelnasDockerProvider, 62 + ignoreChanges: ["ports"], 63 + }, 64 + );
+4
src/services/minecraft/index.ts
··· 1 + import "./servers"; 2 + import "./velocity"; 3 + import "./rcon"; 4 + import "./web";
+19
src/services/minecraft/rcon.ts
··· 1 + import { getEnv } from "~lib/env"; 2 + import { ContainerService } from "~lib/service/service"; 3 + 4 + const rconService = new ContainerService("rcon", { 5 + image: "itzg/rcon", 6 + servicePort: 4326, 7 + otherServicePorts: { 8 + "ws.rcon": 4327, 9 + }, 10 + envs: { 11 + RWA_USERNAME: "bas", 12 + RWA_PASSWORD: getEnv("RCON_PASSWORD"), 13 + RWA_ADMIN: true, 14 + RWA_RCON_HOST: "minecraft-akio", 15 + RWA_RCON_PASSWORD: getEnv("RCON_PASSWORD"), 16 + RWA_WEBSOCKET_URL: "ws://ws.rcon.bas.sh", 17 + RWA_WEBSOCKET_URL_SSL: "wss://ws.rcon.bas.sh", 18 + }, 19 + });
+498
src/services/minecraft/servers/akio.ts
··· 1 + import { nvmeMount, mount } from "~lib/service/mounts"; 2 + import { ContainerService } from "~lib/service/service"; 3 + import { getEnv } from "~lib/env"; 4 + 5 + const minecraftAkioService = new ContainerService( 6 + "minecraft-akio", 7 + { 8 + image: "itzg/minecraft-server:java24-graalvm", 9 + servicePort: 8804, // Plan, TODO: put behind auth (without also putting otherServicePorts behind auth) 10 + subdomain: "akio", 11 + ports: [25564, 25500, 7091, "24454/udp"], 12 + otherServicePorts: { 13 + "polymer-akio": 25500, 14 + "audio-akio": 8080, 15 + // "map.akio": 8123, 16 + map: 8100, 17 + }, 18 + mounts: [nvmeMount("minecraft-akio", "/data"), mount("/dev/hugepages")], 19 + envs: { 20 + EULA: true, 21 + SERVER_PORT: 25564, 22 + TYPE: "FABRIC", 23 + VERSION: "1.21.5", 24 + CF_API_KEY: getEnv("CURSEFORGE_API_KEY"), 25 + CF_PARALLEL_DOWNLOADS: 16, 26 + // VERSION_FROM_MODRINTH_PROJECTS: true, 27 + // CURSEFORGE_FILES: "carpet", 28 + MODRINTH_PROJECTS: [ 29 + // libraries 30 + "fabric-api", 31 + "yacl", 32 + "forge-config-api-port", 33 + "cloth-config", 34 + "modmenu", 35 + "cristel-lib", 36 + "silk", 37 + "loot-table-modifier", 38 + "lithostitched", 39 + 40 + // world rendering 41 + "c2me-fabric", 42 + "distanthorizons", 43 + 44 + // worldgen/structures 45 + // "terralith" // add on world reset (and/or "tectonic" maybe, which has better compat with clifftree) 46 + // "tectonic", 47 + // "geophilic", // not (really) compatible with clifftree 48 + // "wwoo", // not compatible with clifftree 49 + "clifftree", 50 + "towns-and-towers", 51 + "ct-overhaul-village", 52 + "sparsestructures", 53 + "worldgen-patches", 54 + "cliff-face", 55 + "dungeons-and-taverns", 56 + "dungeons-and-taverns-swamp-hut-overhaul", 57 + "dungeons-and-taverns-desert-temple-overhaul", 58 + "dungeons-and-taverns-ancient-city-overhaul", 59 + "dungeons-and-taverns-pillager-outpost-overhaul", 60 + // "datapack:mushrooms-deco", 61 + // Replace below three with regular katters-structures maybe or keep separate for modularity? 62 + "katters-structures-only-ambient", 63 + "katters-structures-only-village", 64 + "katters-structures-only-dungeon", 65 + "explorify", 66 + // "mes-moogs-end-structures", 67 + "repurposed-structures-fabric", 68 + "hearths", 69 + "structory", 70 + "structory-towers", 71 + "hopo-better-mineshaft", 72 + "hopo-better-ruined-portals", 73 + "hopo-better-underwater-ruins", 74 + // "nightosphere", // add when regenerating nether 75 + 76 + // performance 77 + "lithium", 78 + "scalablelux", 79 + "ferrite-core", 80 + "noisium", 81 + "servercore", 82 + "spark", 83 + "clumps", // does ServerCore already cover this? 84 + "alternate-current", 85 + "lmd", 86 + // "sepals", // TODO: only for 1.12.6 87 + // "moonrise-opt", 88 + // "betterview", 89 + 90 + // admin stuff 91 + "plan", 92 + "vanilla-refresh", 93 + "axiom", 94 + "vanish", 95 + "invview", 96 + "better-fabric-console", 97 + "configured", // TODO: configure? 98 + "nbt-copy", 99 + "im-fast", 100 + "stackdeobf", 101 + "codecium", 102 + // "chunky", 103 + // "chunky-player-pause", 104 + "maintenancemode", 105 + "patched", 106 + "entity-information", 107 + "simple-server-restart", 108 + // "worldgen-devtools", 109 + "noconsolespam", 110 + // "notenoughcrashes", 111 + "worldedit", 112 + // "axis", 113 + "no-dim", 114 + "pandaantidupe", 115 + "pandaantipermanentblockbreak", 116 + "anti-xray", 117 + // "mod/otel-instrumentation-extension", // TODO: read https://modrinth.com/mod/otel-instrumentation-extension 118 + "fabricexporter", 119 + "journeymap", 120 + "holodisplays", 121 + "structure-remover", 122 + // "karns-useful-command", // incompatible with player-ladder due to ride command? 123 + "enchantment-disabler", 124 + "dimension-lock_server-side", 125 + "first-join-message", 126 + "melius-worldmanager", 127 + "simple-registry-aliases", 128 + "ledger", 129 + 130 + // carpet stuff 131 + // "carpet", // not available for 1.21.5 on modrinth for some reason 132 + // "yaca", 133 + 134 + // networking 135 + "no-chat-reports", 136 + "viafabric", 137 + "viabackwards", 138 + 139 + // polymer/custom stuff 140 + "vestigate", 141 + "polymer", 142 + "polydex", 143 + "polydecorations", 144 + "polysit", 145 + "danse", 146 + "glide-away", 147 + "filament", 148 + "tsa-decorations", 149 + "tsa-stone", 150 + "tsa-planks", 151 + "tsa-concrete", 152 + "serverbacksnow", 153 + "trinkets-polymer", 154 + "illager-expansion-polymer", 155 + "extended-drawers", 156 + "extended-drawers-polymer", 157 + "spiders-2.0-polymer", 158 + "toms-mobs", 159 + "nice-mobs", 160 + "borukva-food", 161 + "borukva-food-exotic", 162 + "polychess", 163 + "copperwrench", 164 + "mining-helmet", 165 + "copper-horn", 166 + "morefurnaces", 167 + // "datapack:clucking-ducks", // TODO: add resource pack? // also incompatible with clifftree? 168 + "datapack:phantomcatcher", 169 + "datapack:gardeners-dream", 170 + "datapack:banner-bedsheets", 171 + "datapack:banner-flags", 172 + "faling", 173 + // "better-babies", // kinda ugly 174 + "visual-jukebox", 175 + "baby-fat-polymer", 176 + // "polyfactory", 177 + // "server-cosmetics", // Caused by: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Critical injection failure: @Redirect annotation on modifyHeadSlotItem could not find any targets matching 'Lnet/minecraft/class_1309;method_30120(Ljava/util/List;Lnet/minecraft/class_1304;Lnet/minecraft/class_1799;)V' in net/minecraft/class_1309. Using refmap servercosmetics-refmap.json 178 + "puddles", 179 + "datapack:shulker-preview-datapack", // manually update resource pack for Polymer 180 + "morecatvariants", 181 + // "friends-and-foes-polymer", // TODO: 1.21.6 182 + // "mini-vfx", // TODO: 1.21.7 183 + "brewery", 184 + "polynutrition", 185 + 186 + // enchantments 187 + "enchantments-encore", 188 + "enchantment-lore", 189 + "ly-soulbound-enchantment", 190 + "datapack:skizzs-enchanted-boats-(unofficial)", 191 + "kings-vein-miner", 192 + "enchantable-mace", 193 + "eposs-unlimited-enchantments", 194 + "datapack:ev-enchantable-hats", 195 + 196 + // fixes 197 + // "debugify", 198 + "view-distance-fix", 199 + "rail-placement-fix", 200 + "disconnect-packet-fix", 201 + // "whiteout", // incompatibilty with Lithium because it depends on older version. TODO: try again with 1.21.6 202 + // "lmft", 203 + "no-kebab", 204 + "dragon-movement-fix", 205 + "shieldstun", 206 + // "loveheartsrestored", 207 + 208 + // fun 209 + // "camera-obscura", 210 + "player-ladder", 211 + "image2map", 212 + "book2map", 213 + "gone-fishing", 214 + "ly-dynamite", 215 + "micro-fighters", 216 + "leashable-players", 217 + "head-items", 218 + "minechess", // TODO: figure out how to remove chessboard lmao 219 + "just-player-heads", // TODO: find alternative that allows only dropping player heads for PVP 220 + "emotes", 221 + "more-stands", // kinda covered by Vanilla Refresh? 222 + // "players-burn-in-sunlight", 223 + "eat-bottle", 224 + "foxglow", 225 + // "nice-village-names", 226 + "blockboy-arcade", 227 + "bounty-hunt", 228 + "pandaarchaeology", 229 + "eg-invisible-frames", 230 + "stop-drop-n-roll", 231 + // "kiss-fabric", 232 + // "showcase:1.1.0+mc1.21.5", // TODO: update when 1.21.6 (or don't since 2.2.0 seems broken) 233 + // "copperfire", // TODO: add when 1.21.7/8 234 + "disguiseheads", 235 + 236 + // gameplay 237 + "universal-graves", 238 + "forgiving-void", 239 + "better-nether-map", 240 + "linkart-refabricated", 241 + "rail-destinations", 242 + "ly-recall-potion", 243 + "camp-fires-cook-mobs", 244 + "healing-campfire", 245 + "audaki-cart-engine", 246 + "warping-wonders", 247 + "nice-wandering-trader-trades", 248 + "datapack:attract-villagers", 249 + "datapack:toolbag", 250 + "village-hero-plus", 251 + "sleep-warp-updated", 252 + "regenerative-sleep", 253 + "rmes-campfire-leather", 254 + "skippy-pearls", 255 + // "dragonkind-evolved", // later 256 + "soul-sight", 257 + "natural-charcoal", 258 + // "deaths-door", // Check incompstibilities 259 + "useful-mobs", 260 + // "multi-mine", // seems to leave mining visuals behind for polydecorations/polymer stuff 261 + "copper-item-pipes", 262 + "greater-wolves", 263 + "improved-weather", 264 + "improved-maps", 265 + "primitive-flaming", 266 + "colorful-lanterns", 267 + "colorful-lamp", 268 + "extract-poison", 269 + "fish-on-the-line", 270 + "economical-villager-trading", 271 + // "panda-plushies", 272 + // "panda-plushie-polymer", // requires polymer 0.13.3 273 + 274 + // useful 275 + "inventory-essentials", 276 + "inventory-sorting", 277 + "inventory-management", 278 + "inv-restore", 279 + "crafting-tweaks", 280 + "kleeslabs", // break only half of the slab you're looking at 281 + "villager-death-messages", 282 + 283 + // generic server stuff 284 + "styled-chat", 285 + "styledplayerlist", 286 + "styled-nicknames", 287 + // "customnametags", // probably largely already covered by styled-nicknames? 288 + "sdlink", // discord sync/bridge 289 + "essential-commands", 290 + "luckperms", 291 + "mods-command", 292 + "uuid-command", 293 + "compact-help-command", 294 + "server-chat-log-history", 295 + // "minimotd", 296 + 297 + // voice chat 298 + "simple-voice-chat", 299 + "voice-chat-interaction", 300 + // "enhanced-groups", 301 + "simple-voice-chat-group-msg", 302 + "audioplayer", 303 + 304 + // QoL 305 + "a-minor-convenience", 306 + "double-doors", 307 + "smaller-nether-portals", 308 + "nice-horse-stats", 309 + "nice-swimming-mounts", 310 + "move-boats", 311 + "move-minecarts", 312 + "rightclickharvest", 313 + "stretchy-leash", 314 + "leadrecipebackport", 315 + "more-buttons-data-pack", 316 + "witches-drop-blaze-powder", 317 + "datapack:hintful-advancements", 318 + "datapack:hintful-audio-cues", 319 + "monsters-in-the-closet", 320 + "diversity-better-bundle", 321 + "no-offline-time-passage(servers-only)", 322 + "crowmap", 323 + "thorny-bush-protection", 324 + "burnable-cobwebs", 325 + "saddle-crafting-backport", 326 + "rain-delay", 327 + // "unlock-all-recipes", // covered by just enough book? 328 + "logical-efficient-tools", 329 + "through-the-lily-pads-gently", 330 + "pretty-beaches", 331 + "pandablockname", 332 + "pandanerfphantoms", 333 + "beaconsaturation", 334 + "copper-grates-bubble", 335 + "vanilla-pings", 336 + "calcmod", 337 + "datapack:shulker-boxes-names", 338 + "purpurpacks-one-step-dyed-shulker-boxes", 339 + "petprotect", 340 + "sturdy-vehicles", 341 + "crops-love-rain", 342 + "jsst", 343 + "leaves-be-gone", 344 + "improved-signs", 345 + "netherportalfix", 346 + 347 + // decorative/aesthetic 348 + "boids", 349 + "nocturnal-bats", 350 + "betterwalls", 351 + "nemos-blooming-blossom", 352 + // "fairy-rings", 353 + "paleworldfx", 354 + 355 + // Bluemap 356 + // "bluemap", 357 + // "bluemap-polymer-patch", 358 + // "bmarker", 359 + // "bluemap-offline-player-markers-(fabric)", 360 + // "bluemap-sign-markers", 361 + 362 + // needs optional client mod 363 + "trashslot", 364 + "appleskin", 365 + // "better-stats", 366 + "skinshuffle", 367 + "skinrestorer", 368 + "xaeros-map-server-utils", 369 + "do-a-barrel-roll", 370 + "rei", 371 + "wthit", 372 + "jade", 373 + "justenoughbook", 374 + // "servux", 375 + 376 + // -- FUTURE BUT CURRENTLY BROKEN MODS -- 377 + // compatibility issues with other mods 378 + // "beautified-chat-server", // using Styled Chat instead 379 + // "sswaystones", // covered by Warping Wonders 380 + // "echo-compass", // covered by Warping Wonders 381 + // "default-arms", // covered by Vanilla Refresh 382 + // "veinminer", // covered by King's Vein Miner 383 + // "veinminer-enchantment", // covered by King's Vein Miner 384 + // "mc-258859", // handled by worldgen-patches (which also does snow under trees) 385 + 386 + // not marked as server-only? 387 + // "goat-expansion", 388 + // "firefly-in-a-bottle", 389 + 390 + // not updated to 1.21.5 391 + // "headfix", 392 + // "improved-village-placement", 393 + // "datapack:navigable-rivers", 394 + // "datapack:cliffs-and-coves", // probably not compatible with clifftree 395 + // "underground-rivers", 396 + // "pingspam", 397 + // "datapack:doorbells", 398 + // "datapack:gurkis-texture-variations", 399 + // "datapack:mob-wrangler", 400 + // "faster-random", 401 + // "astral-plane-dimension", 402 + // "trimmable-tools", 403 + // "dyeable-shulkers" 404 + 405 + // errors 406 + // "server-chat-sync", 407 + // "longer-chat-history", 408 + // "streamotes", // covered by Chat Emotes? 409 + // "hammer-mining-enchantment", 410 + // "mod-loading-screen", 411 + 412 + // performance? 413 + // "datapack:chest-bubbles", 414 + // "datapack:golf_ball", 415 + // "chunk-debug", 416 + // "ksyxis", // doesn't support Java 24 it seems https://github.com/VidTu/Ksyxis/issues/70 417 + // "minecartsloadchunks", 418 + // "call-of-the-king", 419 + // "neruina", 420 + // "velocity-command", 421 + // "launch-command", 422 + // "tt20", 423 + 424 + // idk/look into 425 + // "server-chat-heads", 426 + // "spawn-animations", 427 + // "spawn-animations-compats", 428 + // "midnightlib", // only for spawn-animations 429 + // "mrshulker", 430 + // "right-click-chest-boat", 431 + // "crossbow-enchants", 432 + // "datapack:colored-axolotl-buckets", 433 + // "datapack:better_frost_walker", 434 + // "datapack:better-multishot", 435 + // "suggestion-tweaker", // wait until https://github.com/VelizarBG/suggestion-tweaker/issues/11 is fixed 436 + // "better-suggestions", 437 + // "stylish-stiles", // TODO: check if only server-side? 438 + // "all-death-messages", 439 + 440 + // meh 441 + // "name-tag-tweaks", 442 + // "datapack:talons-freecam", 443 + // "datapack:talons-jetpack", 444 + // "realistic-health", // find alternative without potion effects 445 + // "datapack:minecraft-ost-music-discs", // resource pack for this is 900MB so can't really do that through Polymer 446 + // "recipe-commands", 447 + ], 448 + MODRINTH_DOWNLOAD_DEPENDENCIES: "required", 449 + MODRINTH_ALLOWED_VERSION_TYPE: "alpha", 450 + PLAN_DATA_GATHERING_ACCEPT_GEOLITE2_EULA: true, // y dis no work (https://github.com/plan-player-analytics/Plan/commit/24a8c75b67986e90acfc5abeed29328d8cc9407a) 451 + MEMORY: "32G", 452 + USE_MEOWICE_FLAGS: true, 453 + USE_MEOWICE_GRAALVM_FLAGS: true, 454 + // JVM_XX_OPTS: 455 + // // "-XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m -Xlog:gc+init", 456 + // "-XX:+UseZGC -XX:+AlwaysPreTouch -XX:+UseStringDeduplication -XX:+UseTransparentHugePages -XX:+EnableDynamicAgentLoading", 457 + // JVM_OPTS: "--enable-preview --enable-native-access=ALL-UNNAMED", 458 + ENABLE_ROLLING_LOGS: true, 459 + ENABLE_JMX: true, 460 + JMX_HOST: "akio.bas.sh", 461 + LOG_TIMESTAMP: true, 462 + // "STOP_SERVER_ANNOUNCE_DELAY=10", 463 + SERVER_HOST: "haring.bas.sh", 464 + DUMP_SERVER_PROPERTIES: true, 465 + MOTD: "\u00A77- \u00A7fakio's backyard❀\u00A7r\n \u00A7euwu", 466 + DIFFICULTY: "normal", 467 + OPS: "basw", 468 + ICON: "https://static-cdn.jtvnw.net/jtv_user_pictures/bafe75f4-5f61-45dd-8f40-44faa9e795fa-profile_image-300x300.png", 469 + OVERRIDE_ICON: true, 470 + ENABLE_QUERY: true, 471 + MAX_PLAYERS: 69, 472 + FORCE_GAMEMODE: false, 473 + ENABLE_COMMAND_BLOCK: true, 474 + MAX_BUILD_HEIGHT: 1024, 475 + VIEW_DISTANCE: 16, 476 + SERVER_NAME: "akio's backyard", 477 + PLAYER_IDLE_TIMEOUT: 0, 478 + SIMULATION_DISTANCE: 8, 479 + SPAWN_PROTECTION: 1, 480 + SYNC_CHUNK_WRITES: false, 481 + EXEC_DIRECTLY: true, 482 + ENFORCE_SECURE_PROFILE: false, 483 + BROADCAST_CONSOLE_TO_OPS: false, 484 + BROADCAST_RCON_TO_OPS: false, 485 + ENABLE_WHITELIST: false, 486 + RCON_PASSWORD: getEnv("RCON_PASSWORD"), 487 + }, 488 + capabilities: ["SYS_ADMIN"], 489 + stdinOpen: true, 490 + tty: true, 491 + destroyGraceSeconds: 60, 492 + // stopSignal: "SIGINT", 493 + }, 494 + { 495 + // ignoreChanges: (await mcHasOnlinePlayers("minecraft-akio")) ? ["*"] : [], 496 + ignoreChanges: ["ports"], 497 + }, 498 + );
+64
src/services/minecraft/servers/frog.ts
··· 1 + import { nvmeMount } from "~lib/service/mounts"; 2 + import { ContainerService } from "~lib/service/service"; 3 + import { getEnv } from "~lib/env"; 4 + 5 + const minecraftService = new ContainerService( 6 + "minecraft", 7 + { 8 + enabled: false, 9 + image: "itzg/minecraft-server:java21-jdk", 10 + servicePort: 8804, 11 + subdomain: "mc", 12 + ports: [25565, 7091, 24454], 13 + mounts: [nvmeMount("minecraft", "/data")], 14 + envs: { 15 + EULA: true, 16 + // "TYPE=MODRINTH", 17 + // "MODRINTH_MODPACK=6p1xQ7wU", 18 + // "MODRINTH_DEFAULT_EXCLUDE_INCLUDES=", 19 + TYPE: "AUTO_CURSEFORGE", 20 + CF_API_KEY: getEnv("CURSEFORGE_API_KEY"), 21 + CF_SLUG: "bcg", 22 + CF_PARALLEL_DOWNLOADS: 16, 23 + CF_EXCLUDE_INCLUDE_FILE: "", 24 + CURSEFORGE_FILES: 508727, 25 + PLAN_DATA_GATHERING_ACCEPT_GEOLITE2_EULA: true, // y dis no work (https://github.com/plan-player-analytics/Plan/commit/24a8c75b67986e90acfc5abeed29328d8cc9407a) 26 + MEMORY: "16G", 27 + JVM_XX_OPTS: 28 + "-XX:+UseZGC -XX:+ZGenerational -XX:AllocatePrefetchStyle=1 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m -Xlog:gc+init", 29 + ENABLE_ROLLING_LOGS: true, 30 + ENABLE_JMX: true, 31 + JMX_HOST: "mc.bas.sh", 32 + LOG_TIMESTAMP: true, 33 + // "STOP_SERVER_ANNOUNCE_DELAY=10", 34 + SERVER_HOST: "haring.bas.sh", 35 + DUMP_SERVER_PROPERTIES: true, 36 + MOTD: " \u00A7f\u00A7l/人◕ ‿‿ ◕人\\u00A7r\n \u00A7a%MODPACK_NAME%\u00A7r \u00A7cversion \u00A7a%MODPACK_VERSION%", 37 + DIFFICULTY: "normal", 38 + OPS: "basw", 39 + ICON: "https://i.bas.sh/kyubey.jpg", 40 + OVERRIDE_ICON: true, 41 + ENABLE_QUERY: true, 42 + MAX_PLAYERS: 100, 43 + FORCE_GAMEMODE: true, 44 + ENABLE_COMMAND_BLOCK: true, 45 + MAX_BUILD_HEIGHT: 1024, 46 + VIEW_DISTANCE: 32, 47 + SERVER_NAME: "/人◕ ‿‿ ◕人\", 48 + PLAYER_IDLE_TIMEOUT: 0, 49 + SIMULATION_DISTANCE: 12, 50 + SPAWN_PROTECTION: 0, 51 + SYNC_CHUNK_WRITES: false, 52 + EXEC_DIRECTLY: true, 53 + RCON_PASSWORD: getEnv("RCON_PASSWORD"), 54 + }, 55 + capabilities: ["SYS_ADMIN"], 56 + stdinOpen: true, 57 + tty: true, 58 + destroyGraceSeconds: 60, 59 + // stopSignal: "SIGINT", 60 + }, 61 + { 62 + // ignoreChanges: (await mcHasOnlinePlayers("minecraft")) ? ["*"] : [], 63 + }, 64 + );
+5
src/services/minecraft/servers/index.ts
··· 1 + import "./akio"; 2 + import "./frog"; 3 + import "./meow"; 4 + import "./teena"; 5 + import "./mau";
+446
src/services/minecraft/servers/mau.ts
··· 1 + import { nvmeMount, mount } from "~lib/service/mounts"; 2 + import { ContainerService } from "~lib/service/service"; 3 + import { getEnv } from "~lib/env"; 4 + 5 + const minecraftMauService = new ContainerService( 6 + "minecraft-mau", 7 + { 8 + image: "itzg/minecraft-server:java24-graalvm", 9 + servicePort: 8804, // Plan 10 + subdomain: "mau", 11 + ports: [25563, "24453/udp"], 12 + otherServicePorts: { 13 + "polymer-mau": 25500, 14 + "audio-mau": 8080, 15 + }, 16 + mounts: [nvmeMount("minecraft-mau", "/data"), mount("/dev/hugepages")], 17 + envs: { 18 + EULA: true, 19 + SERVER_PORT: 25563, 20 + TYPE: "FABRIC", 21 + VERSION: "1.21.8", 22 + FABRIC_LOADER_VERSION: "0.17.2", 23 + CF_API_KEY: getEnv("CURSEFORGE_API_KEY"), 24 + CF_PARALLEL_DOWNLOADS: 16, 25 + // CURSEFORGE_FILES: "carpet", 26 + MODS: [ 27 + "https://github.com/DrexHD/remove-dialog-warning/releases/download/1.2.0/remove-dialog-warning-1.2.0.jar", 28 + ], 29 + MODRINTH_PROJECTS: [ 30 + // libraries 31 + "fabric-api", 32 + // "yacl", 33 + // "forge-config-api-port", 34 + // "cloth-config", 35 + // "modmenu", 36 + // "cristel-lib", 37 + // "silk", 38 + // "loot-table-modifier", 39 + "lithostitched", 40 + 41 + // world rendering 42 + "c2me-fabric", 43 + // "distanthorizons", 44 + 45 + // worldgen/structures 46 + // "tectonic", 47 + // "geophilic", // incompatible with clifftree? 48 + "clifftree", 49 + // "ct-overhaul-village", 50 + // "sparsestructures", 51 + // "worldgen-patches", 52 + "mc-258859:x688NRQ5", 53 + "cliff-face:bG1RvM4K", 54 + 55 + // performance 56 + "lithium", 57 + "scalablelux", 58 + "ferrite-core", 59 + // "noisium:V9mMIy0f", 60 + "servercore", 61 + "spark", 62 + "clumps", // does ServerCore already cover this? 63 + "alternate-current", 64 + "lmd", 65 + // "sepals", 66 + // "moonrise-opt", 67 + // "betterview", 68 + 69 + // admin stuff 70 + "plan", 71 + "vanilla-refresh", 72 + // "axiom", 73 + "vanish", 74 + "invview", 75 + "better-fabric-console", 76 + "configured", // TODO: configure? 77 + "nbt-copy", 78 + "im-fast", 79 + "stackdeobf", 80 + // "codecium", 81 + // "chunky", 82 + // "chunky-player-pause", 83 + "maintenancemode", 84 + // "patched", 85 + "entity-information", 86 + // "worldgen-devtools", 87 + // "noconsolespam", 88 + "notenoughcrashes", 89 + // "worldedit", 90 + // "axis", 91 + // "pandaantidupe", 92 + // "pandaantipermanentblockbreak", 93 + // "anti-xray", 94 + "holodisplays", 95 + "structure-remover", 96 + // "karns-useful-command", // incompatible with player-ladder due to ride command? 97 + "melius-worldmanager", 98 + "simple-registry-aliases", 99 + "ledger", 100 + 101 + // networking 102 + "no-chat-reports", 103 + // "viafabric", 104 + // "viabackwards", 105 + 106 + // polymer/custom stuff 107 + // "vestigate", 108 + "polymer", 109 + "polydex", 110 + // "polydecorations", 111 + // "polysit:RxruJi0u", // TODO: check for 1.21.8 112 + "danse:pWwZ8qAr", // 2.2.7 broken 113 + "glide-away", 114 + "filament", 115 + // "tsa-decorations", 116 + // "tsa-stone", 117 + // "tsa-planks", 118 + // "tsa-concrete", 119 + // "serverbacksnow", 120 + // "trinkets-polymer", 121 + // "illager-expansion-polymer", 122 + // "extended-drawers", 123 + // "extended-drawers-polymer", 124 + // "spiders-2.0-polymer", 125 + // "toms-mobs", 126 + // "nice-mobs", 127 + // "borukva-food", 128 + // "borukva-food-exotic", 129 + // "polychess", 130 + // "copperwrench", 131 + // "mining-helmet", 132 + // "copper-horn", 133 + // "morefurnaces", 134 + // "datapack:clucking-ducks", // TODO: add resource pack? // also incompatible with clifftree? 135 + // "datapack:phantomcatcher", 136 + // "datapack:gardeners-dream", 137 + // "datapack:banner-bedsheets", 138 + // "datapack:banner-flags", 139 + // "faling", 140 + "visual-jukebox", 141 + "baby-fat-polymer", 142 + // "polyfactory", 143 + // "server-cosmetics", // Caused by: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Critical injection failure: @Redirect annotation on modifyHeadSlotItem could not find any targets matching 'Lnet/minecraft/class_1309;method_30120(Ljava/util/List;Lnet/minecraft/class_1304;Lnet/minecraft/class_1799;)V' in net/minecraft/class_1309. Using refmap servercosmetics-refmap.json 144 + // "puddles", 145 + "datapack:shulker-preview-datapack:KKqVUgbk", // manually update resource pack for Polymer 146 + "morecatvariants", 147 + // "friends-and-foes-polymer", // TODO: 1.21.6 148 + // "mini-vfx", // TODO: 1.21.7 149 + 150 + // enchantments 151 + // "enchantments-encore", 152 + "enchantment-lore", 153 + // "ly-soulbound-enchantment", 154 + // "datapack:skizzs-enchanted-boats-(unofficial)", 155 + // "kings-vein-miner", 156 + // "enchantable-mace", 157 + // "eposs-unlimited-enchantments", 158 + // "datapack:ev-enchantable-hats", 159 + 160 + // fixes 161 + "debugify", 162 + "view-distance-fix", 163 + "rail-placement-fix", 164 + "disconnect-packet-fix", 165 + "whiteout", 166 + // "lmft", 167 + // "no-kebab", 168 + "dragon-movement-fix", 169 + // "shieldstun:678biGSY", 170 + // "loveheartsrestored", 171 + 172 + // fun 173 + // "camera-obscura", 174 + // "player-ladder", 175 + "image2map", 176 + // "book2map", 177 + // "gone-fishing", 178 + // "ly-dynamite", 179 + // "micro-fighters", 180 + "leashable-players:JzumAPZJ", 181 + "head-items:Vzcaj9D4", 182 + // "minechess", // TODO: figure out how to remove chessboard lmao 183 + // "just-player-heads", // TODO: find alternative that allows only dropping player heads for PVP 184 + // "emotes", 185 + // "more-stands", // kinda covered by Vanilla Refresh? 186 + // "players-burn-in-sunlight", 187 + "eat-bottle", 188 + // "foxglow", 189 + "blockboy-arcade", 190 + "pandaarchaeology", 191 + "eg-invisible-frames", 192 + // "stop-drop-n-roll", 193 + // "kiss-fabric", 194 + // "showcase", 195 + "copperfire", 196 + "thgw", 197 + "snowball-and-egg-knockback", 198 + 199 + // gameplay 200 + // "universal-graves", 201 + "forgiving-void", 202 + "better-nether-map", 203 + // "linkart-refabricated", 204 + // "rail-destinations", 205 + // "ly-recall-potion", 206 + "camp-fires-cook-mobs", 207 + // "healing-campfire", 208 + "soothing-campfires", 209 + "audaki-cart-engine", 210 + // "warping-wonders", 211 + "village-hero-plus", 212 + "sleep-warp-updated", 213 + "regenerative-sleep:DvpEyBfN", 214 + "rmes-campfire-leather", 215 + "skippy-pearls", 216 + // "dragonkind-evolved", // later 217 + // "soul-sight", 218 + "natural-charcoal", 219 + // "deaths-door", // Check incompstibilities 220 + "useful-mobs", 221 + // "multi-mine", // seems to leave mining visuals behind for polydecorations/polymer stuff 222 + "greater-wolves", 223 + "improved-weather", 224 + // "improved-maps", 225 + // "primitive-flaming", 226 + "colorful-lanterns", 227 + "extract-poison", 228 + "fish-on-the-line", 229 + "economical-villager-trading", 230 + 231 + // useful 232 + "inventory-essentials", 233 + "inventory-sorting", 234 + "inventory-management", 235 + "inv-restore:E1od7pej", 236 + "crafting-tweaks", 237 + "kleeslabs", // break only half of the slab you're looking at 238 + "villager-death-messages", 239 + 240 + // generic server stuff 241 + "styled-chat", 242 + "styledplayerlist", 243 + "styled-nicknames", 244 + // "customnametags", // probably largely already covered by styled-nicknames? 245 + // "sdlink", 246 + "essential-commands", 247 + // "fuji", 248 + "luckperms", 249 + "mods-command", 250 + "uuid-command", 251 + "compact-help-command", 252 + // "server-chat-log-history", 253 + 254 + // voice chat 255 + "simple-voice-chat", 256 + "voice-chat-interaction", 257 + // "enhanced-groups", 258 + // "simple-voice-chat-group-msg", 259 + "audioplayer", 260 + 261 + // QoL 262 + "a-minor-convenience", 263 + "double-doors", 264 + "nice-swimming-mounts", 265 + // "stretchy-leash", 266 + "pandaleadbreak", 267 + "more-buttons-data-pack", 268 + // "witches-drop-blaze-powder", 269 + // "datapack:hintful-advancements", 270 + // "datapack:hintful-audio-cues", 271 + // "monsters-in-the-closet", 272 + "no-offline-time-passage(servers-only):U6W9oFs1", 273 + "thorny-bush-protection", 274 + // "burnable-cobwebs", 275 + "rain-delay:QL6HdUJ5", 276 + // "unlock-all-recipes", // covered by just enough book? 277 + "logical-efficient-tools", 278 + "through-the-lily-pads-gently", 279 + "pretty-beaches", 280 + "pandablockname", 281 + "pandanerfphantoms", 282 + "beaconsaturation", 283 + // "copper-grates-bubble", 284 + "vanilla-pings", 285 + // "calcmod", 286 + "datapack:shulker-boxes-names", 287 + "purpurpacks-one-step-dyed-shulker-boxes", 288 + // "petprotect", 289 + "sturdy-vehicles", 290 + "crops-love-rain", 291 + // "jsst", 292 + // "leaves-be-gone", 293 + "improved-signs", 294 + "netherportalfix", 295 + "village-bell-recipe", 296 + 297 + // decorative/aesthetic 298 + "boids", 299 + "nocturnal-bats", 300 + "betterwalls", 301 + // "nemos-blooming-blossom", 302 + // "fairy-rings", 303 + "paleworldfx:VGhNpydN", // 1.1.9 is broken? 304 + 305 + // Bluemap 306 + // "bluemap", 307 + // "bluemap-polymer-patch", 308 + // "bmarker", 309 + // "bluemap-offline-player-markers-(fabric)", 310 + // "bluemap-sign-markers", 311 + 312 + // needs optional client mod 313 + "trashslot", 314 + "appleskin", 315 + // "better-stats", 316 + // "skinshuffle", 317 + // "skinrestorer", 318 + "xaeros-map-server-utils", 319 + "do-a-barrel-roll", 320 + "rei", 321 + "wthit", 322 + "jade", 323 + // "justenoughbook", 324 + "servux", 325 + 326 + // -- FUTURE BUT CURRENTLY BROKEN MODS -- 327 + // compatibility issues with other mods 328 + // "beautified-chat-server", // using Styled Chat instead 329 + // "sswaystones", // covered by Warping Wonders 330 + // "echo-compass", // covered by Warping Wonders 331 + // "default-arms", // covered by Vanilla Refresh 332 + // "veinminer", // covered by King's Vein Miner 333 + // "veinminer-enchantment", // covered by King's Vein Miner 334 + // "mc-258859", // handled by worldgen-patches (which also does snow under trees) 335 + 336 + // not marked as server-only? 337 + // "goat-expansion", 338 + // "firefly-in-a-bottle", 339 + // "better-frost-walker", 340 + 341 + // not updated to 1.21.5 342 + // "headfix", 343 + // "improved-village-placement", 344 + // "datapack:navigable-rivers", 345 + // "datapack:cliffs-and-coves", // probably not compatible with clifftree 346 + // "underground-rivers", 347 + // "pingspam", 348 + // "datapack:doorbells", 349 + // "datapack:gurkis-texture-variations", 350 + // "datapack:mob-wrangler", 351 + // "faster-random", 352 + // "astral-plane-dimension", 353 + // "trimmable-tools", 354 + // "dyeable-shulkers" 355 + 356 + // errors 357 + // "server-chat-sync", 358 + // "longer-chat-history", 359 + // "streamotes", // covered by Chat Emotes? 360 + // "hammer-mining-enchantment", 361 + // "mod-loading-screen", 362 + 363 + // performance? 364 + // "datapack:chest-bubbles", 365 + // "datapack:golf_ball", 366 + // "chunk-debug", 367 + // "ksyxis", // doesn't support Java 24 it seems https://github.com/VidTu/Ksyxis/issues/70 368 + // "minecartsloadchunks", 369 + // "call-of-the-king", 370 + // "neruina", 371 + // "velocity-command", 372 + // "launch-command", 373 + // "tt20", 374 + 375 + // idk/look into 376 + // "server-chat-heads", 377 + // "spawn-animations", 378 + // "spawn-animations-compats", 379 + // "midnightlib", // only for spawn-animations 380 + // "mrshulker", 381 + // "right-click-chest-boat", 382 + // "crossbow-enchants", 383 + // "datapack:colored-axolotl-buckets", 384 + // "datapack:better_frost_walker", 385 + // "datapack:better-multishot", 386 + // "suggestion-tweaker", 387 + // "better-suggestions", 388 + // "stylish-stiles", // TODO: check if only server-side? 389 + // "all-death-messages", 390 + 391 + // meh 392 + // "name-tag-tweaks", 393 + // "datapack:talons-freecam", 394 + // "datapack:talons-jetpack", 395 + // "realistic-health", // find alternative without potion effects 396 + // "datapack:minecraft-ost-music-discs", // resource pack for this is 900MB so can't really do that through Polymer 397 + // "recipe-commands", 398 + ], 399 + MODRINTH_DOWNLOAD_DEPENDENCIES: "required", 400 + MODRINTH_ALLOWED_VERSION_TYPE: "alpha", 401 + PLAN_DATA_GATHERING_ACCEPT_GEOLITE2_EULA: true, // y dis no work (https://github.com/plan-player-analytics/Plan/commit/24a8c75b67986e90acfc5abeed29328d8cc9407a) 402 + MEMORY: "32G", 403 + USE_MEOWICE_FLAGS: true, 404 + USE_MEOWICE_GRAALVM_FLAGS: true, 405 + // JVM_XX_OPTS: 406 + // // "-XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m -Xlog:gc+init", 407 + // "-XX:+UseZGC -XX:+AlwaysPreTouch -XX:+UseStringDeduplication -XX:+UseTransparentHugePages -XX:+EnableDynamicAgentLoading", 408 + // JVM_OPTS: "--enable-preview --enable-native-access=ALL-UNNAMED", 409 + ENABLE_ROLLING_LOGS: true, 410 + LOG_TIMESTAMP: true, 411 + SERVER_HOST: "haring.bas.sh", 412 + DUMP_SERVER_PROPERTIES: true, 413 + MOTD: "\u00a7l \u00a7f \u2728 mau's dream realm \u00a73\ud83d\udca4\u00a7r\n\u00a7l \u00a77 \ua700(^. .^\ua700 )\ua706\u0a6d", 414 + DIFFICULTY: "normal", 415 + OPS: ["basw", "akioflower"], 416 + ICON: "https://static-cdn.jtvnw.net/jtv_user_pictures/3d0e0eb0-6c1d-48b6-a27e-e74737322ca2-profile_image-300x300.png", 417 + OVERRIDE_ICON: true, 418 + MAX_PLAYERS: 69, 419 + FORCE_GAMEMODE: false, 420 + ENABLE_COMMAND_BLOCK: true, 421 + MAX_BUILD_HEIGHT: 1024, 422 + VIEW_DISTANCE: 16, 423 + SERVER_NAME: "mau's nap realm", 424 + PLAYER_IDLE_TIMEOUT: 0, 425 + SIMULATION_DISTANCE: 8, 426 + SPAWN_PROTECTION: 0, 427 + SYNC_CHUNK_WRITES: false, 428 + EXEC_DIRECTLY: true, 429 + ENFORCE_SECURE_PROFILE: false, 430 + BROADCAST_CONSOLE_TO_OPS: false, 431 + BROADCAST_RCON_TO_OPS: false, 432 + ENABLE_WHITELIST: true, 433 + WHITELIST: ["basw", "akioflower", "mausleeps"], 434 + RCON_PASSWORD: getEnv("RCON_PASSWORD"), 435 + }, 436 + capabilities: ["SYS_ADMIN"], 437 + stdinOpen: true, 438 + tty: true, 439 + destroyGraceSeconds: 60, 440 + // stopSignal: "SIGINT", 441 + }, 442 + { 443 + // ignoreChanges: (await mcHasOnlinePlayers("minecraft-mau")) ? ["*"] : [], 444 + ignoreChanges: ["ports"], 445 + }, 446 + );
+446
src/services/minecraft/servers/meow.ts
··· 1 + import { nvmeMount, mount } from "~lib/service/mounts"; 2 + import { ContainerService } from "~lib/service/service"; 3 + import { getEnv } from "~lib/env"; 4 + 5 + const minecraftMeow = new ContainerService( 6 + "minecraft-meow", 7 + { 8 + enabled: false, 9 + image: "itzg/minecraft-server:java24-graalvm", 10 + // servicePort: 8804, // Plan 11 + // subdomain: "meowmeowmeow", 12 + ports: [25569, "24459/udp"], 13 + otherServicePorts: { 14 + "polymer-meow": 25500, 15 + "audio-meow": 8080, 16 + // map: 8100, 17 + }, 18 + mounts: [nvmeMount("minecraft-meow", "/data"), mount("/dev/hugepages")], 19 + envs: { 20 + EULA: true, 21 + SERVER_PORT: 25569, 22 + TYPE: "FABRIC", 23 + VERSION: "1.21.6", 24 + CF_API_KEY: getEnv("CURSEFORGE_API_KEY"), 25 + CF_PARALLEL_DOWNLOADS: 16, 26 + // CURSEFORGE_FILES: "carpet", 27 + MODRINTH_PROJECTS: [ 28 + // libraries 29 + "fabric-api", 30 + "yacl", 31 + "forge-config-api-port", 32 + "cloth-config", 33 + "modmenu", 34 + "cristel-lib", 35 + "silk", 36 + // "loot-table-modifier", 37 + "lithostitched", 38 + 39 + // world rendering 40 + "c2me-fabric", 41 + // "distanthorizons", 42 + 43 + // worldgen/structures 44 + "tectonic", 45 + "geophilic", // not (really) compatible with clifftree? 46 + "clifftree", 47 + "towns-and-towers", 48 + // "ct-overhaul-village", 49 + // "sparsestructures", 50 + "worldgen-patches", 51 + "cliff-face", 52 + "dungeons-and-taverns", 53 + "dungeons-and-taverns-swamp-hut-overhaul", 54 + "dungeons-and-taverns-desert-temple-overhaul", 55 + "dungeons-and-taverns-ancient-city-overhaul", 56 + "dungeons-and-taverns-pillager-outpost-overhaul", 57 + // "datapack:mushrooms-deco", 58 + // Replace below three with regular katters-structures maybe or keep separate for modularity? 59 + // "katters-structures-only-ambient", 60 + // "katters-structures-only-village", 61 + // "katters-structures-only-dungeon", 62 + "explorify", 63 + "repurposed-structures-fabric", 64 + "hearths", 65 + "structory", 66 + "structory-towers", 67 + "hopo-better-mineshaft", 68 + "hopo-better-ruined-portals", 69 + "hopo-better-underwater-ruins", 70 + 71 + // performance 72 + "lithium", 73 + "scalablelux", 74 + "ferrite-core", 75 + "noisium", 76 + "servercore", 77 + "spark", 78 + "clumps", // does ServerCore already cover this? 79 + "alternate-current", 80 + "lmd", 81 + // "sepals", 82 + 83 + // admin stuff 84 + "plan", 85 + "vanilla-refresh", 86 + "axiom", 87 + "vanish", 88 + "invview", 89 + // "better-fabric-console", 90 + // "configured", // TODO: configure? 91 + "nbt-copy", 92 + // "im-fast", 93 + "stackdeobf", 94 + // "codecium", 95 + // "chunky", 96 + // "chunky-player-pause", 97 + "maintenancemode", 98 + "patched", 99 + "entity-information", 100 + // "simple-server-restart", 101 + // "noconsolespam", 102 + "notenoughcrashes", 103 + "worldedit", 104 + // "no-dim", 105 + "pandaantidupe", 106 + "pandaantipermanentblockbreak", 107 + "anti-xray", 108 + "fabricexporter", 109 + "journeymap", 110 + "holodisplays", 111 + // "structure-remover", 112 + // "enchantment-disabler", 113 + // "dimension-lock_server-side", 114 + "first-join-message", 115 + "melius-worldmanager", 116 + "simple-registry-aliases", 117 + "ledger", 118 + 119 + // carpet stuff 120 + // "carpet", // not available for 1.21.5 on modrinth for some reason 121 + // "yaca", 122 + 123 + // networking 124 + "no-chat-reports:Fabric-1.21.6-v2.13.0", 125 + "viafabric", 126 + "viabackwards", 127 + 128 + // polymer/custom stuff 129 + // "vestigate", 130 + "polydex", 131 + "polydecorations", 132 + // "polysit", 133 + "danse", 134 + "glide-away", 135 + "filament:IPRSmIFK", 136 + "tsa-stone", 137 + "tsa-planks", 138 + "tsa-concrete", 139 + "serverbacksnow", 140 + "trinkets-polymer", 141 + "illager-expansion-polymer", 142 + "extended-drawers", 143 + "extended-drawers-polymer", 144 + "spiders-2.0-polymer", 145 + "toms-mobs", 146 + "nice-mobs", 147 + // "borukva-food", 148 + // "borukva-food-exotic", 149 + // "copperwrench", 150 + // "mining-helmet", 151 + // "copper-horn", 152 + "morefurnaces", 153 + "datapack:phantomcatcher", 154 + "datapack:gardeners-dream", 155 + "datapack:banner-bedsheets", 156 + "datapack:banner-flags", 157 + "faling", 158 + "better-babies", 159 + "visual-jukebox", 160 + "baby-fat-polymer", 161 + // "puddles", 162 + "datapack:shulker-preview-datapack", // manually update resource pack for Polymer 163 + "morecatvariants", 164 + 165 + // enchantments 166 + "enchantments-encore", 167 + "enchantment-lore", 168 + "ly-soulbound-enchantment", 169 + // "datapack:skizzs-enchanted-boats-(unofficial)", 170 + // "kings-vein-miner", 171 + "enchantable-mace", 172 + // "eposs-unlimited-enchantments", 173 + // "datapack:ev-enchantable-hats", 174 + 175 + // fixes 176 + // "debugify", 177 + "view-distance-fix", 178 + "rail-placement-fix", 179 + "disconnect-packet-fix", 180 + "whiteout", 181 + // "no-kebab", 182 + "dragon-movement-fix", 183 + "shieldstun", 184 + "loveheartsrestored", 185 + 186 + // fun 187 + // "camera-obscura", 188 + // "player-ladder", 189 + "image2map", 190 + "book2map", 191 + "gone-fishing", 192 + "ly-dynamite", 193 + "micro-fighters", 194 + // "leashable-players", 195 + "head-items", 196 + "minechess", // TODO: figure out how to remove chessboard lmao 197 + "just-player-heads", // TODO: find alternative that allows only dropping player heads for PVP 198 + // "emotes", 199 + "more-stands", // kinda covered by Vanilla Refresh? 200 + // "eat-bottle", 201 + // "foxglow", 202 + "blockboy-arcade", 203 + "bounty-hunt", 204 + "pandaarchaeology", 205 + // "eg-invisible-frames", 206 + // "stop-drop-n-roll", 207 + "kiss-fabric", 208 + "showcase:2.1.0+1.21.6", 209 + 210 + // gameplay 211 + "universal-graves", 212 + "forgiving-void", 213 + "better-nether-map", 214 + // "linkart-refabricated", 215 + // "rail-destinations", 216 + "ly-recall-potion", 217 + "camp-fires-cook-mobs", 218 + "healing-campfire", 219 + "audaki-cart-engine", 220 + "warping-wonders", 221 + // "nice-wandering-trader-trades", 222 + "datapack:attract-villagers", 223 + "datapack:toolbag", 224 + // "village-hero-plus", 225 + "sleep-warp-updated", 226 + "regenerative-sleep", 227 + "rmes-campfire-leather", 228 + "skippy-pearls", 229 + // "soul-sight", 230 + "natural-charcoal", 231 + // "useful-mobs", 232 + "copper-item-pipes", 233 + "greater-wolves", 234 + "improved-weather", 235 + "improved-maps", 236 + // "primitive-flaming", 237 + "colorful-lanterns", 238 + "extract-poison", 239 + "fish-on-the-line", 240 + 241 + // useful 242 + "inventory-essentials", 243 + "inventory-sorting", 244 + "inventory-management", 245 + "inv-restore", 246 + "crafting-tweaks", 247 + "kleeslabs", // break only half of the slab you're looking at 248 + "villager-death-messages", 249 + 250 + // generic server stuff 251 + "styled-chat", 252 + "styledplayerlist", 253 + "styled-nicknames", 254 + // "sdlink", // discord sync/bridge 255 + "essential-commands", 256 + "luckperms", 257 + // "mods-command", 258 + "uuid-command", 259 + "compact-help-command", 260 + // "server-chat-log-history", 261 + 262 + // voice chat 263 + "simple-voice-chat", 264 + "voice-chat-interaction", 265 + "audioplayer", 266 + 267 + // QoL 268 + "a-minor-convenience", 269 + "double-doors", 270 + "smaller-nether-portals", 271 + // "nice-horse-stats", 272 + "nice-swimming-mounts", 273 + "move-boats", 274 + "move-minecarts", 275 + "rightclickharvest", 276 + // "stretchy-leash", 277 + // "more-buttons-data-pack", 278 + // "witches-drop-blaze-powder", 279 + // "datapack:hintful-advancements", 280 + // "datapack:hintful-audio-cues", 281 + // "monsters-in-the-closet", 282 + "diversity-better-bundle", 283 + // "no-offline-time-passage(servers-only)", 284 + // "crowmap", 285 + "thorny-bush-protection", 286 + // "burnable-cobwebs", 287 + "rain-delay", 288 + // "unlock-all-recipes", // covered by jush enough book? 289 + "logical-efficient-tools", 290 + // "through-the-lily-pads-gently", 291 + "pretty-beaches", 292 + "pandablockname", 293 + "pandanerfphantoms", 294 + "beaconsaturation", 295 + "copper-grates-bubble", 296 + "vanilla-pings", 297 + "calcmod", 298 + "datapack:shulker-boxes-names", 299 + "purpurpacks-one-step-dyed-shulker-boxes", 300 + "petprotect", 301 + "sturdy-vehicles", 302 + "crops-love-rain", 303 + "leaves-be-gone", 304 + "improved-signs", 305 + "netherportalfix", 306 + 307 + // decorative/aesthetic 308 + "boids", 309 + "nocturnal-bats", 310 + // "betterwalls", 311 + // "nemos-blooming-blossom", 312 + "paleworldfx", 313 + 314 + // needs optional client mod 315 + "trashslot", 316 + "appleskin", 317 + "better-stats", 318 + "skinshuffle", 319 + "skinrestorer", 320 + "xaeros-map-server-utils", 321 + // "do-a-barrel-roll", 322 + // "rei", 323 + "wthit", 324 + "jade", 325 + "justenoughbook", 326 + "servux", 327 + 328 + // polymer at the very bottom to test if override works this way 329 + "polymer:kNDC3Dwc", // override doesn't seem to work?? 330 + // -- FUTURE BUT CURRENTLY BROKEN MODS -- 331 + // compatibility issues with other mods 332 + // "beautified-chat-server", // using Styled Chat instead 333 + // "sswaystones", // covered by Warping Wonders 334 + // "echo-compass", // covered by Warping Wonders 335 + // "default-arms", // covered by Vanilla Refresh 336 + // "veinminer", // covered by King's Vein Miner 337 + // "veinminer-enchantment", // covered by King's Vein Miner 338 + // "mc-258859", // handled by worldgen-patches (which also does snow under trees) 339 + 340 + // not updated to 1.21.5 341 + // "headfix", 342 + // "improved-village-placement", 343 + // "datapack:navigable-rivers", 344 + // "datapack:cliffs-and-coves", // probably not compatible with clifftree 345 + // "underground-rivers", 346 + // "pingspam", 347 + // "datapack:doorbells", 348 + // "datapack:gurkis-texture-variations", 349 + // "datapack:mob-wrangler", 350 + // "faster-random", 351 + // "astral-plane-dimension", 352 + // "trimmable-tools", 353 + // "dyeable-shulkers" 354 + 355 + // errors 356 + // "server-chat-sync", 357 + // "longer-chat-history", 358 + // "streamotes", // covered by Chat Emotes? 359 + // "hammer-mining-enchantment", 360 + // "mod-loading-screen", 361 + 362 + // performance? 363 + // "datapack:chest-bubbles", 364 + // "datapack:golf_ball", 365 + // "chunk-debug", 366 + // "ksyxis", // doesn't support Java 24 it seems https://github.com/VidTu/Ksyxis/issues/70 367 + // "minecartsloadchunks", 368 + // "call-of-the-king", 369 + // "neruina", 370 + // "velocity-command", 371 + // "launch-command", 372 + // "tt20", 373 + 374 + // idk/look into 375 + // "server-chat-heads", 376 + // "spawn-animations", 377 + // "spawn-animations-compats", 378 + // "midnightlib", // only for spawn-animations 379 + // "mrshulker", 380 + // "right-click-chest-boat", 381 + // "crossbow-enchants", 382 + // "datapack:colored-axolotl-buckets", 383 + // "datapack:better_frost_walker", 384 + // "datapack:better-multishot", 385 + // "suggestion-tweaker", 386 + // "better-suggestions", 387 + // "stylish-stiles", // TODO: check if only server-side? 388 + // "all-death-messages", 389 + 390 + // meh 391 + // "name-tag-tweaks", 392 + // "datapack:talons-freecam", 393 + // "datapack:talons-jetpack", 394 + // "realistic-health", // find alternative without potion effects 395 + //"datapack:minecraft-ost-music-discs", // resource pack for this is 900MB so can't really do that through Polymer 396 + // "recipe-commands", 397 + ], 398 + MODRINTH_DOWNLOAD_DEPENDENCIES: "required", 399 + MODRINTH_ALLOWED_VERSION_TYPE: "alpha", 400 + PLAN_DATA_GATHERING_ACCEPT_GEOLITE2_EULA: true, // y dis no work (https://github.com/plan-player-analytics/Plan/commit/24a8c75b67986e90acfc5abeed29328d8cc9407a) 401 + MEMORY: "16G", 402 + JVM_XX_OPTS: 403 + // "-XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m -Xlog:gc+init", 404 + "-XX:+UseZGC -XX:+AlwaysPreTouch -XX:+UseStringDeduplication -XX:+UseTransparentHugePages -XX:+EnableDynamicAgentLoading", 405 + JVM_OPTS: "--enable-preview --enable-native-access=ALL-UNNAMED", 406 + ENABLE_ROLLING_LOGS: true, 407 + // ENABLE_JMX: true, 408 + // JMX_HOST: "meow.bas.sh", 409 + LOG_TIMESTAMP: true, 410 + // "STOP_SERVER_ANNOUNCE_DELAY=10", 411 + SERVER_HOST: "haring.bas.sh", 412 + DUMP_SERVER_PROPERTIES: true, 413 + MOTD: "\u00a7r \u00a7bmeow meow meow\u00a7r\n\u00a7l \u00a7c \u2764 \u00a7l:3", 414 + DIFFICULTY: "normal", 415 + OPS: ["basw"], 416 + ICON: "icon.jpg", 417 + OVERRIDE_ICON: true, 418 + ENABLE_QUERY: true, 419 + MAX_PLAYERS: 69, 420 + FORCE_GAMEMODE: false, 421 + ENABLE_COMMAND_BLOCK: true, 422 + MAX_BUILD_HEIGHT: 1024, 423 + VIEW_DISTANCE: 16, 424 + SERVER_NAME: "meow meow meow :3", 425 + PLAYER_IDLE_TIMEOUT: 0, 426 + SIMULATION_DISTANCE: 8, 427 + SPAWN_PROTECTION: 0, 428 + SYNC_CHUNK_WRITES: false, 429 + EXEC_DIRECTLY: true, 430 + ENFORCE_SECURE_PROFILE: false, 431 + BROADCAST_CONSOLE_TO_OPS: false, 432 + BROADCAST_RCON_TO_OPS: false, 433 + ENABLE_WHITELIST: true, 434 + WHITELIST: ["basw", "PingwinWMeloniku", "MmeowChanNUwU"], 435 + RCON_PASSWORD: getEnv("RCON_PASSWORD"), 436 + }, 437 + capabilities: ["SYS_ADMIN"], 438 + stdinOpen: true, 439 + tty: true, 440 + destroyGraceSeconds: 60, 441 + // stopSignal: "SIGINT", 442 + }, 443 + { 444 + // ignoreChanges: (await mcHasOnlinePlayers("minecraft-meow")) ? ["*"] : [], 445 + }, 446 + );
+166
src/services/minecraft/servers/teena.ts
··· 1 + import { nvmeMount, ssdcacheMount, mount } from "~lib/service/mounts"; 2 + import { ContainerService } from "~lib/service/service"; 3 + import { getEnv } from "~lib/env"; 4 + 5 + const minecraftTeenaService = new ContainerService( 6 + "minecraft-teena", 7 + { 8 + enabled: false, 9 + // image: "itzg/minecraft-server:java24-graalvm", 10 + image: "itzg/minecraft-server", 11 + // servicePort: 8804, 12 + servicePort: 80, 13 + subdomain: "gigasigmas", 14 + ports: [25566, "24455/udp"], 15 + otherServicePorts: { 16 + // "polymer-sigmas": 25567, 17 + // // "map.akio": 8123, 18 + // map: 8100, 19 + }, 20 + mounts: [ 21 + nvmeMount("minecraft-teena", "/data"), 22 + ssdcacheMount("sync/minecraft", "/sync"), 23 + mount("/dev/hugepages"), 24 + ], 25 + envs: { 26 + EULA: true, 27 + SERVER_PORT: 25566, 28 + LEVEL: "skibidisigmy", 29 + TYPE: "AUTO_CURSEFORGE", 30 + CF_MODPACK_ZIP: "/sync/Jedziemy w bieszczady.zip", 31 + CF_API_KEY: getEnv("CURSEFORGE_API_KEY"), 32 + CF_PARALLEL_DOWNLOADS: 16, 33 + CF_SLUG: "jedziemy_w_bieszczady", 34 + CURSEFORGE_FILES: [ 35 + "alternate-current", 36 + "distant-horizons", 37 + "servercore", 38 + "vanishmod", 39 + "fullstack-watchdog", 40 + "modernfix", 41 + "canary", 42 + "better-chunk-loading-forge-fabric", 43 + "connectivity", 44 + "chunk-sending-forge-fabric", 45 + "cupboard", 46 + "leaky", 47 + "almanac-lib", 48 + "let-me-despawn", 49 + "alltheleaks", 50 + // "recipe-essentials-forge-fabric", 51 + "no-chat-reports", 52 + // "attributefix", 53 + // "structure-essentials-forge-fabric", 54 + "mixintrace-resmithed", 55 + "placebo", 56 + "fastsuite", 57 + // "kubejs", 58 + // "chunky-pregenerator-forge", 59 + "noisium", 60 + // "placebo", 61 + // "architectury-api", 62 + // "rhino", 63 + // once itzg adds support 64 + // "fabric:axiomtool" 65 + // "fabric:c2me" 66 + "craterlib", 67 + "simple-discord-link-bot-forge-fabric-spigot", 68 + "im-fast", 69 + "modlistobserver", 70 + "inv-view-forge", 71 + ], 72 + CF_EXCLUDE_MODS: ["itemphysic-lite", "blur-forge"], 73 + CF_FORCE_SYNCHRONIZE: true, 74 + // CF_FORCE_INCLUDE_MODS: "appleskin", 75 + CF_EXCLUDE_INCLUDE_FILE: "", 76 + MODRINTH_PROJECTS: [ 77 + // "plan", 78 + // "memoryleakfix", 79 + // "chunky-player-pause", 80 + // "inv-view-forge", 81 + // // world rendering 82 + // "c2me-fabric", 83 + // // performance 84 + // "lithium", 85 + // "scalablelux", 86 + // "ferrite-core", 87 + // "noisium", 88 + // "spark", 89 + // "pandaantidupe", 90 + // "clumps", // does ServerCore already cover this? 91 + // "alternate-current", 92 + // "lmd", 93 + // 94 + // // admin stuff 95 + // "vanilla-refresh", 96 + // "axiom", 97 + // "invview", 98 + // "better-fabric-console", 99 + // "configured", // TODO: configure 100 + // "nbt-copy", 101 + // "too-fast", 102 + // "stackdeobf", 103 + // "codecium", 104 + // "chunky", 105 + // "chunky-player-pause", 106 + // "maintenancemode", 107 + // "patched", 108 + // "entity-information", 109 + // "simple-server-restart", 110 + // "worldgen-devtools", 111 + // "noconsolespam", 112 + // 113 + // // networking 114 + // "no-chat-reports", 115 + // "viafabric", 116 + // "viabackwards", 117 + ], 118 + MODRINTH_DOWNLOAD_DEPENDENCIES: "required", 119 + MODRINTH_ALLOWED_VERSION_TYPE: "alpha", 120 + PLAN_DATA_GATHERING_ACCEPT_GEOLITE2_EULA: true, // y dis no work (https://github.com/plan-player-analytics/Plan/commit/24a8c75b67986e90acfc5abeed29328d8cc9407a) 121 + MEMORY: "16G", 122 + JVM_XX_OPTS: 123 + // "-XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m -Xlog:gc+init", 124 + "-XX:+UseZGC -XX:+AlwaysPreTouch -XX:+UseStringDeduplication -XX:+UseTransparentHugePages", 125 + ENABLE_ROLLING_LOGS: true, 126 + ENABLE_JMX: true, 127 + JMX_HOST: "gigasigmas.bas.sh", 128 + LOG_TIMESTAMP: true, 129 + STOP_SERVER_ANNOUNCE_DELAY: 10, 130 + SERVER_HOST: "haring.bas.sh", 131 + DUMP_SERVER_PROPERTIES: true, 132 + MOTD: "\u00a7r \u00a74\u00a7l\u00a7nGIGA\u00a7r\n\u00a74\u00a7l \u00a76Sigmas", 133 + DIFFICULTY: "normal", 134 + OPS: ["basw", "PingwinWMeloniku"], 135 + ICON: "icon.jpg", 136 + OVERRIDE_ICON: true, 137 + ENABLE_QUERY: true, 138 + MAX_PLAYERS: 69, 139 + FORCE_GAMEMODE: false, 140 + ENABLE_COMMAND_BLOCK: true, 141 + MAX_BUILD_HEIGHT: 1024, 142 + VIEW_DISTANCE: 16, 143 + SERVER_NAME: "GigaSigmas", 144 + PLAYER_IDLE_TIMEOUT: 0, 145 + SIMULATION_DISTANCE: 8, 146 + SPAWN_PROTECTION: 0, 147 + SYNC_CHUNK_WRITES: false, 148 + EXEC_DIRECTLY: true, 149 + ENFORCE_SECURE_PROFILE: false, 150 + BROADCAST_CONSOLE_TO_OPS: false, 151 + BROADCAST_RCON_TO_OPS: false, 152 + ENABLE_WHITELIST: true, 153 + WHITELIST: ["basw", "PingwinWMeloniku"], 154 + ALLOW_FLIGHT: true, 155 + RCON_PASSWORD: getEnv("RCON_PASSWORD"), 156 + }, 157 + capabilities: ["SYS_ADMIN"], 158 + stdinOpen: true, 159 + tty: true, 160 + destroyGraceSeconds: 60, 161 + // stopSignal: "SIGINT", 162 + }, 163 + { 164 + // ignoreChanges: (await mcHasOnlinePlayers("minecraft-teena")) ? ["*"] : [], 165 + }, 166 + );
+30
src/services/minecraft/util.ts
··· 1 + import { ContainerService } from "~lib/service/service"; 2 + 3 + export async function mcHasOnlinePlayers(container: string) { 4 + let listPlayersCmd; 5 + 6 + try { 7 + listPlayersCmd = await ContainerService.remoteRun({ 8 + command: `docker exec ${container} rcon-cli list`, 9 + }); 10 + } catch (e) { 11 + // console.log(e instanceof Error ? e.message : "Unknown error"); 12 + return false; 13 + } 14 + 15 + const output = listPlayersCmd.stdout; 16 + 17 + if (output && output.includes(" players online")) { 18 + if (output.includes(" 0 of a max of ")) { 19 + console.log("no players online"); 20 + return false; 21 + } else { 22 + console.log("players online"); 23 + return true; 24 + } 25 + } else { 26 + console.log("assuming no players online"); 27 + return false; 28 + // throw new Error(`Failed to parse Minecraft output:\n${output}`); 29 + } 30 + }
+3
src/services/minecraft/velocity.ts
··· 1 + import { ContainerService } from "~lib/service/service"; 2 + 3 + // const velocityService = new ContainerService()
+17
src/services/minecraft/web.ts
··· 1 + import { ssdcacheMount } from "~lib/service/mounts"; 2 + import { ContainerService } from "~lib/service/service"; 3 + 4 + const mcWebService = new ContainerService("mc-web", { 5 + enabled: false, 6 + image: "caddy", 7 + servicePort: 80, 8 + subdomain: "mc", 9 + mounts: [ssdcacheMount("web/mc", "/var/www")], 10 + command: [ 11 + "caddy", 12 + "file-server", 13 + "--root=/var/www", 14 + "--domain=mc.bas.sh", 15 + "--listen=:80", 16 + ], 17 + });
+914
src/services/other.ts
··· 1 + import * as docker from "@pulumi/docker"; 2 + import { ContainerService } from "~lib/service/service"; 3 + import { 4 + dockerSocket, 5 + confMount, 6 + mount, 7 + ssdcacheMount, 8 + gitMount, 9 + nvmeMount, 10 + dataMount, 11 + } from "~lib/service/mounts"; 12 + import { interpolate, unsecret } from "@pulumi/pulumi"; 13 + import { getEnv } from "~lib/env"; 14 + import { haringDockerProvider } from "~lib/service/providers"; 15 + import { kaneelnasDockerProvider } from "~lib/service/providers"; 16 + 17 + const traefikVolume = new docker.Volume( 18 + "traefik", 19 + { name: "traefik" }, 20 + { 21 + retainOnDelete: true, 22 + provider: haringDockerProvider, 23 + }, 24 + ); 25 + 26 + const traefikService = new ContainerService("traefik", { 27 + image: "traefik", 28 + servicePort: 8080, 29 + volumes: [ 30 + { 31 + volumeName: traefikVolume.name, 32 + containerPath: "/etc/traefik", 33 + }, 34 + ], 35 + mounts: [dockerSocket], 36 + ports: [80, 443, "443/udp"], 37 + envs: { 38 + CF_API_EMAIL: getEnv("EMAIL"), 39 + CF_API_KEY: getEnv("CLOUDFLARE_API_KEY"), 40 + }, 41 + command: [ 42 + "--api", 43 + 44 + "--providers.docker.exposedbydefault=false", 45 + "--providers.docker.network=haring", 46 + 47 + "--serverstransport.insecureskipverify", 48 + 49 + "--entrypoints.http.address=[::]:80", 50 + "--entrypoints.https.address=[::]:443", 51 + // "--entrypoints.http.address=0.0.0.0:80", 52 + // "--entrypoints.https.address=0.0.0.0:443", 53 + "--entrypoints.https.http3", 54 + "--entrypoints.https.http.tls=true", 55 + "--entrypoints.https.http.tls.certresolver=cloudflare", 56 + "--entrypoints.https.http.tls.domains[0].main=bas.sh", 57 + "--entrypoints.https.http.tls.domains[0].sans=*.bas.sh", 58 + 59 + "--certificatesresolvers.cloudflare.acme.dnschallenge=true", 60 + "--certificatesresolvers.cloudflare.acme.dnschallenge.provider=cloudflare", 61 + // "--certificatesresolvers.cloudflare.acme.dnschallenge.resolvers=1.1.1.1:53,8.8.8.8:53", 62 + "--certificatesresolvers.cloudflare.acme.dnschallenge.resolvers=8.8.8.8:53", 63 + "--certificatesresolvers.cloudflare.acme.storage=/etc/traefik/acme.json", 64 + `--certificatesresolvers.cloudflare.acme.email=${getEnv("EMAIL")}`, 65 + 66 + "--experimental.plugins.cloudflare.modulename=github.com/agence-gaya/traefik-plugin-cloudflare", 67 + "--experimental.plugins.cloudflare.version=v1.2.0", 68 + "--experimental.plugins.staticresponse.modulename=github.com/jdel/staticresponse", 69 + "--experimental.plugins.staticresponse.version=v0.0.1", 70 + 71 + "--metrics.prometheus=true", 72 + "--metrics.prometheus.addEntryPointsLabels=true", 73 + "--metrics.prometheus.addServicesLabels=true", 74 + "--metrics.prometheus.addRoutersLabels=true", 75 + "--metrics.prometheus.buckets=0.1,0.3,1.2,5.0", 76 + "--metrics.prometheus.manualRouting=true", 77 + 78 + // "--metrics.otlp=true", 79 + // `--metrics.otlp.address=`, 80 + ], 81 + labels: { 82 + "traefik.http.middlewares.httpsredirect.redirectscheme.scheme": "https", 83 + "traefik.http.middlewares.httpsredirect.redirectscheme.permanent": "true", 84 + 85 + "traefik.http.middlewares.auth.basicauth.users": 86 + "bas:$2y$05$XUkzwNnxl2sdNIMqrqspsulGw6fbj1smtwk7bMClLiDIsrR3EatOG", 87 + 88 + "traefik.http.middlewares.cloudflare.plugin.cloudflare.allowedCIDRs": 89 + "0.0.0.0/0,::/0", 90 + "traefik.http.middlewares.cloudflare.plugin.cloudflare.refreshInterval": 91 + "24h", 92 + "traefik.http.middlewares.cloudflare.plugin.cloudflare.debug": "true", 93 + 94 + "traefik.http.middlewares.teena.plugin.staticresponse.statuscode": "200", 95 + "traefik.http.middlewares.teena.plugin.staticresponse.body": 96 + "teena is cute :3", 97 + 98 + "traefik.http.middlewares.mau.plugin.staticresponse.statuscode": "200", 99 + "traefik.http.middlewares.mau.plugin.staticresponse.body": ":3", 100 + 101 + "traefik.http.middlewares.owo.plugin.staticresponse.statuscode": "200", 102 + "traefik.http.middlewares.owo.plugin.staticresponse.body": "what's this?", 103 + 104 + "traefik.http.routers.httpsredirect.rule": "HostRegexp(`.+`)", 105 + "traefik.http.routers.httpsredirect.entrypoints": "http", 106 + "traefik.http.routers.httpsredirect.middlewares": "httpsredirect", 107 + 108 + "traefik.http.routers.traefik.service": "api@internal", 109 + "traefik.http.routers.traefik.middlewares": "auth", 110 + 111 + "traefik.http.routers.metrics.service": "prometheus@internal", 112 + "traefik.http.routers.metrics.rule": "Host(`metrics.bas.sh`)", 113 + "traefik.http.routers.metrics.entrypoints": "https", 114 + "traefik.http.routers.metrics.middlewares": "auth", 115 + 116 + "traefik.http.routers.teena.rule": 117 + "HostRegexp(`^((giga|sigmas?)|gigasigmas?|teena|martyna|a(wa){2,4}|(mi){2,6}|(meow){1,3}).bas.sh$`)", 118 + "traefik.http.routers.teena.entrypoints": "https", 119 + "traefik.http.routers.teena.middlewares": "teena", 120 + 121 + "traefik.http.routers.mau.rule": 122 + "HostRegexp(`^mau(sleeps|craft)?.bas.sh$`)", 123 + "traefik.http.routers.mau.entrypoints": "https", 124 + "traefik.http.routers.mau.middlewares": "mau", 125 + 126 + "traefik.http.routers.owo.rule": "HostRegexp(`^owo.bas.sh$`)", 127 + "traefik.http.routers.owo.entrypoints": "https", 128 + "traefik.http.routers.owo.middlewares": "owo", 129 + }, 130 + }); 131 + 132 + const whoamiService = new ContainerService("whoami", { 133 + image: "traefik/whoami", 134 + servicePort: 80, 135 + }); 136 + 137 + const wireguardProtonService = new ContainerService( 138 + "wireguard-proton", 139 + { 140 + image: "lscr.io/linuxserver/wireguard", 141 + // ports: [32400, "51820/udp"], 142 + ports: [32400, 32401, "51820/udp", "127.0.0.1:8889:8888"], 143 + mounts: [confMount("wireguard-proton"), mount("/lib/modules")], 144 + // envs: ["PEERS=2"], 145 + privileged: true, 146 + capabilities: ["NET_ADMIN", "SYS_MODULE"], 147 + sysctls: { "net.ipv4.conf.all.src_valid_mark": "1" }, 148 + healthcheck: { 149 + tests: ["CMD", "/usr/bin/curl", "-sS", "icanhazip.com"], 150 + interval: "20s", 151 + retries: 3, 152 + timeout: "10s", 153 + }, 154 + }, 155 + { 156 + ignoreChanges: ["ports"], 157 + }, 158 + ); 159 + 160 + const wireguardMullvadService = new ContainerService( 161 + "wireguard-mullvad", 162 + { 163 + enabled: false, 164 + image: "lscr.io/linuxserver/wireguard", 165 + // ports: [8888], 166 + mounts: [confMount("wireguard-mullvad"), mount("/lib/modules")], 167 + // envs: ["PEERS=2"], 168 + privileged: true, 169 + capabilities: ["NET_ADMIN", "SYS_MODULE"], 170 + sysctls: { "net.ipv4.conf.all.src_valid_mark": "1" }, 171 + healthcheck: { 172 + tests: ["CMD", "/usr/bin/curl", "-sS", "icanhazip.com"], 173 + interval: "20s", 174 + retries: 3, 175 + timeout: "10s", 176 + }, 177 + }, 178 + { 179 + ignoreChanges: ["ports"], 180 + }, 181 + ); 182 + 183 + if (wireguardMullvadService.container || wireguardProtonService.container) { 184 + const tinyproxyService = new ContainerService( 185 + "tinyproxy", 186 + { 187 + image: "kalaksi/tinyproxy", 188 + envs: { 189 + LOG_LEVEL: "Info", 190 + TINYPROXY_UID: 1000, 191 + TINYPROXY_GID: 1000, 192 + }, 193 + networkMode: interpolate`container:${(wireguardMullvadService.container ?? wireguardProtonService.container)?.id}`, 194 + }, 195 + { 196 + ignoreChanges: ["ports"], 197 + }, 198 + ); 199 + } 200 + 201 + if (wireguardProtonService.container) { 202 + const plexService = new ContainerService( 203 + "plex", 204 + { 205 + servicePort: 32400, 206 + mounts: [confMount("plex"), ssdcacheMount(), gitMount], 207 + networkMode: interpolate`container:${wireguardProtonService.container?.id}`, 208 + }, 209 + { 210 + ignoreChanges: ["ports"], 211 + }, 212 + ); 213 + } 214 + 215 + const syncloungeService = new ContainerService("synclounge", { 216 + servicePort: 8088, 217 + envs: { 218 + AUTH_LIST: "e3b846edd661008e79919a414fdc3b957dad97ac", 219 + }, 220 + }); 221 + 222 + // const privatePlexService = new ContainerService("plex-private", { 223 + // image: "lscr.io/linuxserver/plex", 224 + // servicePort: 32401, 225 + // mounts: [confMount("plex-private"), dataMount(), gitMount], 226 + // networkMode: interpolate`container:${wireguardProtonService.container.id}`, 227 + // envs: { 228 + // PLEX_CLAIM: "claim-a_r_rc1TpEv5yzCgfy-m", 229 + // }, 230 + // }); 231 + 232 + // const jellyfinService = new ContainerService("jellyfin", { 233 + // servicePort: 8096, 234 + // mounts: [confMount("jellyfin"), dataMount()], 235 + // envs: { 236 + // JELLYFIN_PublishedServerUrl: "https://jellyfin.bas.sh", 237 + // }, 238 + // }); 239 + 240 + // const embyService = new ContainerService("emby", { 241 + // servicePort: 8096, 242 + // mounts: [confMount("emby"), dataMount()], 243 + // envs: {}, 244 + // }); 245 + 246 + const overseerrService = new ContainerService("overseerr", { 247 + image: "lscr.io/linuxserver/overseerr:develop", 248 + servicePort: 5055, 249 + subdomain: "request", 250 + mounts: [confMount("overseerr"), ssdcacheMount()], 251 + }); 252 + 253 + const sonarrService = new ContainerService("sonarr", { 254 + servicePort: 8989, 255 + image: "lscr.io/linuxserver/sonarr:develop", 256 + mounts: [confMount("sonarr"), ssdcacheMount()], 257 + }); 258 + 259 + const radarrService = new ContainerService("radarr", { 260 + servicePort: 7878, 261 + mounts: [confMount("radarr"), ssdcacheMount()], 262 + }); 263 + 264 + const jackettService = new ContainerService("jackett", { 265 + servicePort: 9117, 266 + mounts: [confMount("jackett"), ssdcacheMount()], 267 + }); 268 + 269 + const prowlarrService = new ContainerService("prowlarr", { 270 + servicePort: 9696, 271 + mounts: [confMount("prowlarr"), ssdcacheMount()], 272 + }); 273 + 274 + const kitanaService = new ContainerService("kitana", { 275 + image: "pannal/kitana", 276 + servicePort: 31337, 277 + command: ["-P"], 278 + volumes: [ 279 + { 280 + volumeName: "kitana", 281 + containerPath: "/app/data", 282 + }, 283 + ], 284 + }); 285 + 286 + const tautulliService = new ContainerService("tautulli", { 287 + servicePort: 8181, 288 + mounts: [ 289 + confMount("tautulli"), 290 + gitMount, 291 + confMount( 292 + "plex/Library/Application Support/Plex Media Server/Logs", 293 + "/plex-logs", 294 + ), 295 + ], 296 + envs: { 297 + DOCKER_MODS: "linuxserver/mods:universal-package-install", 298 + INSTALL_PIP_PACKAGES: "-r /home/bas/git/PlexAniSync/requirements.txt", 299 + }, 300 + }); 301 + 302 + const qbittorrentService = new ContainerService("qbittorrent", { 303 + image: "lscr.io/linuxserver/qbittorrent:5.1.2", 304 + servicePort: 8080, 305 + // ports: [1337, "1337/udp"], 306 + envs: { 307 + // TORRENTING_PORT: 1337, 308 + DOCKER_MODS: "ghcr.io/vuetorrent/vuetorrent-lsio-mod:latest", 309 + }, 310 + mounts: [confMount("qbittorrent"), dataMount(), nvmeMount()], 311 + networkMode: "host", 312 + }); 313 + 314 + const qbittorrentExporterService = new ContainerService( 315 + "qbittorrent-exporter", 316 + { 317 + image: "caseyscarborough/qbittorrent-exporter", 318 + servicePort: 17871, 319 + envs: { 320 + QBITTORRENT_BASE_URL: qbittorrentService.localUrl ?? "", 321 + QBITTORRENT_USERNAME: getEnv("USERNAME"), 322 + QBITTORRENT_PASSWORD: getEnv("QBITTORRENT_PASSWORD"), 323 + }, 324 + }, 325 + ); 326 + 327 + const qbittoolsService = new ContainerService("qbittools", { 328 + enabled: true, 329 + image: "registry.gitlab.com/alexkm/qbittools", 330 + mounts: [confMount("qbittorrent", "/qbittorrent"), ssdcacheMount()], 331 + command: [ 332 + "reannounce", 333 + "-C", 334 + "/qbittorrent/qBittorrent.conf", 335 + "-s", 336 + "https://qbittorrent.bas.sh:443", 337 + "-U", 338 + getEnv("USERNAME"), 339 + "-P", 340 + getEnv("QBITTORRENT_PASSWORD"), 341 + ], 342 + }); 343 + 344 + const librespeedService = new ContainerService("librespeed", { 345 + enabled: true, 346 + image: "ghcr.io/librespeed/speedtest", 347 + servicePort: 8080, 348 + subdomain: "speedtest", 349 + otherServicePorts: { 350 + speed: 8080, 351 + }, 352 + envs: { 353 + TITLE: "Speedtest | Bas", 354 + TELEMETRY: true, 355 + ENABLE_ID_OBFUSCATION: true, 356 + REDACT_IP_ADDRESSES: true, 357 + EMAIL: getEnv("EMAIL"), 358 + PASSWORD: getEnv("LIBRESPEED_PASSWORD"), 359 + IPINFO_APIKEY: getEnv("IPINFO_APIKEY"), 360 + }, 361 + }); 362 + 363 + function caddyfile(subdomain: string) { 364 + return interpolate` 365 + http://${subdomain}.bas.sh:80 { 366 + file_server browse { 367 + } 368 + header X-Robots-Tag "noindex" 369 + basic_auth /plex/* { 370 + ${getEnv("CADDY_USERNAME")} ${Buffer.from(getEnv("CADDY_PASSWORD")).toString("base64")} 371 + } 372 + } 373 + `; 374 + } 375 + 376 + ["get", "static", "files", "f", "i"].map(async (subdomain) => { 377 + const caddyFileserverService = new ContainerService( 378 + `caddy-fileserver-${subdomain}`, 379 + { 380 + image: "caddy", 381 + servicePort: 80, 382 + subdomain, 383 + command: [ 384 + "/bin/sh", 385 + "-c", 386 + interpolate`echo '${caddyfile(subdomain)}' | caddy run --config - --adapter caddyfile`, 387 + ], 388 + mounts: [ssdcacheMount("web/files", "/var/www"), ssdcacheMount()], 389 + workingDir: "/var/www", 390 + }, 391 + ); 392 + }); 393 + 394 + const autolanguagesService = new ContainerService("autolanguages", { 395 + // image: "remirigal/plex-auto-languages", 396 + image: "journeyover/plex-auto-languages", 397 + envs: { 398 + PLEX_TOKEN: getEnv("PLEX_TOKEN"), 399 + PLEX_URL: "https://plex.bas.sh:443", 400 + UPDATE_LEVEL: "season", 401 + TRIGGER_ON_ACTIVITY: true, 402 + REFRESH_ON_SCAN: true, 403 + NOTIFICATIONS_ENABLE: true, 404 + NOTIFICATIONS_APPRISE_CONFIGS: `[{ urls: ["${getEnv("AUTO_LANGUAGES_DISCORD_WEBHOOK")}"], events: ["play_or_activity", "scheduler"] }]`, 405 + }, 406 + }); 407 + 408 + const theloungeService = new ContainerService("thelounge", { 409 + servicePort: 9000, 410 + subdomain: "irc", 411 + mounts: [confMount("thelounge")], 412 + }); 413 + 414 + const autobrrService = new ContainerService("autobrr", { 415 + image: "ghcr.io/autobrr/autobrr", 416 + servicePort: 7474, 417 + mounts: [confMount("autobrr")], 418 + }); 419 + 420 + const ankiService = new ContainerService("anki", { 421 + image: "ankicommunity/anki-sync-server:latest-develop", 422 + servicePort: 27701, 423 + envs: { 424 + ANKISYNCD_AUTH_DB_PATH: "/app/data/auth.db", 425 + ANKISYNCD_DATA_ROOT: "/app/data/collections", 426 + ANKISYNCD_SESSION_DB_PATH: "/app/data/session.db", 427 + }, 428 + mounts: [confMount("anki", "/app/data")], 429 + }); 430 + 431 + const sabnzbdService = new ContainerService("sabnzbd", { 432 + servicePort: 8080, 433 + mounts: [confMount("sabnzbd"), ssdcacheMount()], 434 + }); 435 + 436 + const recyclarrService = new ContainerService("recyclarr", { 437 + image: "recyclarr/recyclarr", 438 + mounts: [confMount("recyclarr")], 439 + }); 440 + 441 + const resilioSyncService = new ContainerService("resilio-sync", { 442 + enabled: true, 443 + subdomain: "sync", 444 + servicePort: 8888, 445 + // ports: [55555, "55555/udp"], 446 + networkMode: "host", 447 + mounts: [ 448 + confMount("resilio-sync"), 449 + ssdcacheMount(), 450 + ssdcacheMount("sync", "/sync"), 451 + ], 452 + }); 453 + 454 + // const syncthingService = new ContainerService("syncthing", { 455 + // servicePort: 8384, 456 + // subdomain: "syncthing", 457 + // ports: [22000, 21027], 458 + // mounts: [ 459 + // confMount("syncthing"), 460 + // { 461 + // source: "/home/bas/data/sync", 462 + // target: "/sync", 463 + // type: "bind", 464 + // bindOptions: { 465 + // propagation: "rshared", 466 + // }, 467 + // }, 468 + // ], 469 + // }); 470 + 471 + const mkvtoolnixService = new ContainerService("mkvtoolnix", { 472 + image: "jlesage/mkvtoolnix", 473 + servicePort: 5800, 474 + mounts: [confMount("mkvtoolnix"), ssdcacheMount()], 475 + envs: { 476 + VNC_PASSWORD: getEnv("VNC_PASSWORD"), 477 + DARK_MODE: true, 478 + APP_NICENESS: 10, 479 + KEEP_APP_RUNNING: 1, 480 + ENABLE_CJK_FONT: 1, 481 + }, 482 + }); 483 + 484 + const mkvMuxingBatchService = new ContainerService("mkv-batch", { 485 + image: "jlesage/mkv-muxing-batch-gui", 486 + servicePort: 5800, 487 + subdomain: "mkv-batch", 488 + mounts: [confMount("mkv-batch"), ssdcacheMount()], 489 + envs: { 490 + VNC_PASSWORD: getEnv("VNC_PASSWORD"), 491 + DARK_MODE: true, 492 + APP_NICENESS: 10, 493 + KEEP_APP_RUNNING: 1, 494 + ENABLE_CJK_FONT: 1, 495 + }, 496 + }); 497 + 498 + // const losslesscutService = new ContainerService("losslesscut", { 499 + // image: "outlyernet/losslesscut", 500 + // servicePort: 8080, 501 + // mounts: [confMount("losslesscut"), dataMount()], 502 + // }); 503 + 504 + const prometheusService = new ContainerService("prometheus", { 505 + image: "prom/prometheus", 506 + servicePort: 9090, 507 + mounts: [confMount("prometheus", "/etc/prometheus")], 508 + volumes: [ 509 + { 510 + volumeName: "prometheus", 511 + containerPath: "/prometheus", 512 + }, 513 + ], 514 + command: [ 515 + "--config.file=/etc/prometheus/prometheus.yml", 516 + "--storage.tsdb.path=/prometheus", 517 + "--web.console.libraries=/etc/prometheus/console_libraries", 518 + "--web.console.templates=/etc/prometheus/consoles", 519 + ], 520 + middlewares: ["auth"], 521 + }); 522 + 523 + const grafanaService = new ContainerService("grafana", { 524 + image: "grafana/grafana-oss", 525 + servicePort: 3000, 526 + mounts: [confMount("grafana", "/var/lib/grafana")], 527 + envs: { 528 + GF_INSTALL_PLUGINS: "grafana-piechart-panel", 529 + }, 530 + user: "1000:1000", 531 + }); 532 + 533 + // const signozService = new ContainerService("signoz", { 534 + // image: "signoz/otel-collector", 535 + // servicePort: 4317, 536 + // mounts: [ 537 + // confMount("signoz", "/etc/signoz"), 538 + // mount("/var/lib/signoz", "/var/lib/signoz", { propagation: "rslave" }), 539 + // ], 540 + // }); 541 + 542 + const scrutinyService = new ContainerService("scrutiny", { 543 + image: "ghcr.io/analogj/scrutiny:master-omnibus", 544 + servicePort: 8080, 545 + mounts: [ 546 + confMount("scrutiny/config", "/opt/scrutiny/config"), 547 + confMount("scrutiny/influxdb", "/opt/scrutiny/influxdb"), 548 + mount("/run/udev", "/run/udev", { readOnly: true }), 549 + ], 550 + envs: { 551 + COLLECTOR_CRON_SCHEDULE: "0 * * * *", 552 + }, 553 + capabilities: ["SYS_RAWIO", "SYS_ADMIN"], 554 + devices: [ 555 + "sda", 556 + "sdb", 557 + "sdc", 558 + "sdd", 559 + "sde", 560 + "sdf", 561 + "sdg", 562 + "sdh", 563 + "sdi", 564 + "sdj", 565 + "nvme0", 566 + "nvme1", 567 + ].map((i) => ({ 568 + containerPath: `/dev/${i}`, 569 + hostPath: `/dev/${i}`, 570 + permissions: "r", 571 + })), 572 + middlewares: ["auth"], 573 + }); 574 + 575 + const pixivPublicToPrivateService = new ContainerService( 576 + "pixiv-public-to-private", 577 + { 578 + image: "ghcr.io/tomacheese/pixiv-public-to-private", 579 + mounts: [confMount("pixiv-public-to-private", "/data")], 580 + }, 581 + ); 582 + 583 + const jdownloaderService = new ContainerService("jdownloader", { 584 + enabled: false, 585 + image: "jlesage/jdownloader-2", 586 + servicePort: 5800, 587 + ports: [3129, 5800], 588 + mounts: [confMount("jdownloader"), ssdcacheMount("downloads", "/output")], 589 + envs: { 590 + KEEP_APP_RUNNING: 1, 591 + DARK_MODE: 1, 592 + WEB_AUDIO: 1, 593 + ENABLE_CJK_FONT: 1, 594 + MYJDOWNLOADER_EMAIL: getEnv("EMAIL"), 595 + MYJDOWNLOADER_PASSWORD: getEnv("JDOWNLOADER_PASSWORD"), 596 + MYJDOWNLOADER_DEVICE_NAME: "Haring", 597 + }, 598 + middlewares: ["auth"], 599 + }); 600 + 601 + const tailscaleVolume = new docker.Volume( 602 + "tailscale", 603 + { name: "tailscale" }, 604 + { 605 + retainOnDelete: true, 606 + provider: haringDockerProvider, 607 + }, 608 + ); 609 + 610 + const tailscaleService = new ContainerService("tailscale", { 611 + image: "tailscale/tailscale", 612 + servicePort: 8080, 613 + volumes: [ 614 + { 615 + volumeName: tailscaleVolume.name, 616 + containerPath: "/var/lib/tailscale", 617 + }, 618 + ], 619 + mounts: [mount("/lib/modules")], 620 + envs: { 621 + TS_ACCEPT_DNS: false, 622 + TS_AUTHKEY: getEnv("TAILSCALE_AUTH_KEY"), 623 + TS_HOSTNAME: "haring-docker", 624 + TS_ENABLE_HEALTH_CHECK: true, 625 + TS_USERSPACE: true, 626 + TS_EXTRA_ARGS: "--advertise-exit-node --advertise-tags=tag:container", 627 + TS_STATE_DIR: "/var/lib/tailscale", 628 + }, 629 + // networkMode: "host", 630 + // devices: [{ hostPath: "/dev/net/tun", containerPath: "/dev/net/tun" }], 631 + capabilities: ["NET_ADMIN", "SYS_MODULE"], 632 + privileged: true, 633 + }); 634 + 635 + const bazarrService = new ContainerService("bazarr", { 636 + enabled: false, 637 + servicePort: 6767, 638 + mounts: [confMount("bazarr"), ssdcacheMount()], 639 + }); 640 + 641 + const netdataService = new ContainerService("netdata", { 642 + image: "netdata/netdata", 643 + servicePort: 19999, 644 + mounts: [ 645 + confMount("netdata/config", "/etc/netdata"), 646 + confMount("netdata/lib", "/var/lib/netdata"), 647 + confMount("netdata/cache", "/var/cache/netdata"), 648 + mount("/", "/host/root", { propagation: "rslave", readOnly: true }), 649 + mount("/etc/passwd", "/host/etc/passwd", { readOnly: true }), 650 + mount("/etc/group", "/host/etc/group", { readOnly: true }), 651 + mount("/etc/localtime", "/host/etc/localtime", { readOnly: true }), 652 + mount("/proc", "/host/proc", { readOnly: true }), 653 + mount("/sys", "/host/sys", { readOnly: true }), 654 + mount("/etc/os-release", "/host/etc/os-release", { readOnly: true }), 655 + mount("/var/log", "/host/var/log", { readOnly: true }), 656 + mount("/run/dbus", "/host/run/dbus", { readOnly: true }), 657 + dockerSocket, 658 + ], 659 + capabilities: ["SYS_PTRACE", "SYS_ADMIN"], 660 + securityOpts: ["apparmor:unconfined"], 661 + networkMode: "host", 662 + }); 663 + 664 + const chromiumService = new ContainerService("chromium", { 665 + enabled: false, 666 + servicePort: 3000, 667 + envs: { 668 + CUSTOM_USER: getEnv("USERNAME"), 669 + PASSWORD: getEnv("VNC_PASSWORD"), 670 + }, 671 + }); 672 + 673 + const blueskyService = new ContainerService("bluesky", { 674 + enabled: false, 675 + image: "ghcr.io/brw/social-app", 676 + servicePort: 8100, 677 + envs: { 678 + ATP_PDS_HOST: "https://public.api.bsky.app", 679 + }, 680 + command: ["bskyweb", "serve"], 681 + middlewares: ["auth"], 682 + }); 683 + 684 + const beszelSocket = mount("/var/run/beszel_socket", "/beszel_socket"); 685 + 686 + const beszelService = new ContainerService("beszel", { 687 + enabled: false, 688 + image: "henrygd/beszel", 689 + servicePort: 8090, 690 + mounts: [confMount("beszel", "/beszel_data"), beszelSocket], 691 + healthcheck: { 692 + tests: ["CMD", "/beszel", "health", "--url", "http://localhost:8090"], 693 + startPeriod: "5s", 694 + interval: "1m0s", 695 + }, 696 + }); 697 + 698 + const beszelAgentService = new ContainerService("beszel-agent", { 699 + enabled: false, 700 + image: "henrygd/beszel-agent", 701 + networkMode: "host", 702 + mounts: [beszelSocket, dockerSocket], 703 + envs: { 704 + LISTEN: "/beszel_socket/beszel.sock", 705 + KEY: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILQa/BKc2uJ0vlog1Cwr2H13Gh3y20eWVL41iwZl+Cyt", 706 + }, 707 + healthcheck: { 708 + tests: ["CMD", "/agent", "health"], 709 + startPeriod: "5s", 710 + interval: "1m0s", 711 + }, 712 + }); 713 + 714 + const sist2Service = new ContainerService("sist2", { 715 + enabled: false, 716 + image: "sist2app/sist2:x64-linux", 717 + servicePort: 8080, 718 + otherServicePorts: { "sist2-web": 4090 }, 719 + mounts: [ 720 + confMount("sist2", "/sist2-admin"), 721 + ssdcacheMount("content/audios", "/host"), 722 + ], 723 + workingDir: "/root/sist2-admin", 724 + entrypoints: ["python3"], 725 + command: ["/root/sist2-admin/sist2_admin/app.py"], 726 + middlewares: ["auth"], 727 + }); 728 + 729 + if (sist2Service.container) { 730 + const elasticsearchService = new ContainerService("elasticsearch", { 731 + image: "elasticsearch:7.17.28", 732 + ports: ["127.0.0.1:9200:9200", "127.0.0.1:9300:9300"], 733 + mounts: [confMount("elasticsearch", "/usr/share/elasticsearch/data")], 734 + envs: { "discovery.type": "single-node" }, 735 + }); 736 + } 737 + 738 + const maintainerrService = new ContainerService("maintainerr", { 739 + enabled: false, 740 + image: "ghcr.io/jorenn92/maintainerr", 741 + servicePort: 6246, 742 + mounts: [confMount("maintainerr", "/opt/data")], 743 + middlewares: ["auth"], 744 + }); 745 + 746 + const dnsmasqService = new ContainerService("dnsmasq", { 747 + enabled: false, 748 + image: "jpillora/dnsmasq", 749 + ports: ["127.0.0.1:53:5353/udp"], 750 + mounts: [confMount("dnsmasq", "/etc/")], 751 + capabilities: ["NET_ADMIN"], 752 + }); 753 + 754 + const nextCloudService = new ContainerService("nextcloud", { 755 + servicePort: 443, 756 + mounts: [ 757 + confMount("nextcloud"), 758 + confMount("nextcloud-data", "/data"), 759 + ssdcacheMount("", "/mnt/data"), 760 + ], 761 + envs: { 762 + DOCKER_MODS: 763 + "linuxserver/mods:nextcloud-notify-push|linuxserver/mods:nextcloud-mediadc", 764 + DATABASE_URL: interpolate`postgres://postgres:${getEnv("POSTGRES_PASSWORD")}@postgres/nextcloud`, 765 + DATABASE_PREFIX: "oc_", 766 + REDIS_URL: interpolate`redis://default:${getEnv("VALKEY_PASSWORD")}@valkey`, 767 + NEXTCLOUD_URL: "https://nextcloud.bas.sh", 768 + }, 769 + }); 770 + 771 + const valkeyService = new ContainerService("valkey", { 772 + image: "valkey/valkey", 773 + command: [interpolate`--requirepass ${getEnv("VALKEY_PASSWORD")}`], 774 + }); 775 + 776 + const postgresService = new ContainerService("postgres", { 777 + image: "postgres", 778 + mounts: [confMount("postgres", "/var/lib/postgresql/data")], 779 + envs: { 780 + POSTGRES_PASSWORD: getEnv("POSTGRES_PASSWORD"), 781 + POSTGRES_DB: "nextcloud", 782 + }, 783 + }); 784 + 785 + const stashService = new ContainerService("stash", { 786 + image: "stashapp/stash", 787 + servicePort: 9999, 788 + mounts: [ 789 + confMount("stash", "/root/.stash"), 790 + ssdcacheMount("", "/data"), 791 + gitMount, 792 + mount("/etc/localtime", "/etc/localtime", { readOnly: true }), 793 + ], 794 + middlewares: ["auth"], 795 + cpuShares: 128, 796 + }); 797 + 798 + const fileStashService = new ContainerService("filestash", { 799 + image: "machines/filestash", 800 + servicePort: 8334, 801 + mounts: [confMount("filestash", "/app/data/state"), ssdcacheMount()], 802 + envs: { 803 + APPLICATION_URL: "filestash.bas.sh", 804 + CANARY: true, 805 + }, 806 + }); 807 + 808 + const spacedriveService = new ContainerService("spacedrive", { 809 + enabled: false, 810 + image: "ghcr.io/spacedriveapp/spacedrive/server", 811 + servicePort: 8080, 812 + mounts: [confMount("spacedrive", "/var/spacedrive"), ssdcacheMount()], 813 + envs: { 814 + SD_AUTH: interpolate`${getEnv("USERNAME")}:${getEnv("SPACEDRIVE_PASSWORD")}`, 815 + }, 816 + }); 817 + 818 + const blockheadsService = new ContainerService("blockheads", { 819 + enabled: false, 820 + image: "theblockheads/server:development", 821 + servicePort: 15151, 822 + ports: [15151, "15151/udp"], 823 + mounts: [ 824 + confMount("blockheads/config", "/blockheads"), 825 + confMount( 826 + "blockheads/worlds", 827 + "/root/GNUstep/Library/ApplicationSupport/TheBlockheads/saves", 828 + ), 829 + ], 830 + envs: { 831 + WORLD_NAME: "bmc", 832 + WORLD_ID: "bmc", 833 + // WORLD_OWNER: "", 834 + MAX_PLAYERS: 32, 835 + SAVE_DELAY: 1, 836 + WORLD_OWNER: "bas", 837 + SERVER_PORT: 15151, 838 + }, 839 + }); 840 + 841 + const glancesService = new ContainerService("glances", { 842 + enabled: false, 843 + image: "nicolargo/glances", 844 + servicePort: 61208, 845 + ports: [61209], 846 + mounts: [dockerSocket], 847 + pidMode: "host", 848 + envs: { 849 + GLANCES_OPT: "-w", 850 + }, 851 + middlewares: ["auth"], 852 + }); 853 + 854 + const kopiaService = new ContainerService("kopia", { 855 + enabled: false, 856 + image: "kopia/kopia", 857 + servicePort: 51515, 858 + hostname: "Bas", 859 + envs: { 860 + USER: getEnv("USERNAME"), 861 + KOPIA_PASSWORD: getEnv("KOPIA_PASSWORD"), 862 + }, 863 + mounts: [ 864 + confMount("kopia", "/app"), 865 + dataMount("kopia", "/repository"), 866 + mount("/tmp/kopia", "/tmp"), 867 + mount("/home/bas/.config/rclone", "/app/rclone"), 868 + ], 869 + command: [ 870 + "server", 871 + "start", 872 + "--disable-csrf-token-checks", 873 + "--insecure", 874 + "--address=0.0.0.0:51515", 875 + `--server-username=${getEnv("USERNAME")}`, 876 + interpolate`--server-password=${getEnv("KOPIA_PASSWORD")}`, 877 + ], 878 + }); 879 + 880 + const sftpgoService = new ContainerService("sftpgo", { 881 + image: "drakkan/sftpgo:plugins", 882 + servicePort: 8080, 883 + ports: [2022], 884 + mounts: [ 885 + confMount("sftpgo", "/var/lib/sftpgo"), 886 + ssdcacheMount("sftpgo", "/srv/sftpgo"), 887 + ssdcacheMount("", "/srv/data"), 888 + ], 889 + envs: { 890 + SFTPGO_GRACE_TIME: 60, 891 + }, 892 + stopTimeout: 60, 893 + }); 894 + 895 + const redroidService = new ContainerService("redroid", { 896 + enabled: false, // seems to break my entire server's networking setup somehow? 897 + image: "redroid/redroid:12.0.0_64only-latest", 898 + privileged: true, 899 + ports: ["100.93.167.100:5555:5555"], 900 + mounts: [ 901 + confMount("redroid", "/data"), 902 + ssdcacheMount("redroid", "/storage/emulated/0/NAS"), 903 + ], 904 + command: [ 905 + "androidboot.redroid_width=1080", 906 + "androidboot.redroid_height=1920", 907 + "androidboot.redroid_dpi=480", 908 + "androidboot.use_memfd=true", 909 + "ro.secure=0", 910 + ], 911 + networkMode: "bridge", 912 + }); 913 + 914 + // TODO: try https://github.com/m1k1o/neko
+14 -7
tsconfig.json
··· 1 1 { 2 2 "compilerOptions": { 3 3 "strict": true, 4 - "target": "esnext", 5 - "module": "esnext", 6 - "moduleResolution": "node", 4 + "target": "ESNext", 5 + "module": "ESNext", 6 + "moduleResolution": "Node", 7 7 "experimentalDecorators": true, 8 8 "pretty": true, 9 9 "noFallthroughCasesInSwitch": true, 10 10 "noImplicitReturns": true, 11 - "forceConsistentCasingInFileNames": true 11 + "forceConsistentCasingInFileNames": true, 12 + "noUnusedLocals": false, 13 + "skipLibCheck": true, 14 + "esModuleInterop": true, 15 + // "exactOptionalPropertyTypes": true, 16 + "baseUrl": ".", 17 + "paths": { 18 + "~lib/*": ["lib/*"], 19 + "~src/*": ["src/*"] 20 + } 12 21 }, 13 - "include": [ 14 - "src/**/*" 15 - ], 22 + "include": ["src/**/*", "lib/**/*", "eslint.config.ts"] 16 23 }