commit cc2ebc37d8284b17b86398850e2515eec904a956
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 13 Jul 2026 14:25:29 +0300
Bump the dependencies group with 2 updates (#74)
Bumps the dependencies group with 2 updates: [@sentry/node](https://github.com/getsentry/sentry-javascript) and [prettier](https://github.com/prettier/prettier).
Updates `@sentry/node` from 10.63.0 to 10.64.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.63.0...10.64.0)
Updates `prettier` from 3.9.4 to 3.9.5
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.4...3.9.5)
---
updated-dependencies:
- dependency-name: "@sentry/node"
dependency-version: 10.64.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: dependencies
- dependency-name: prettier
dependency-version: 3.9.5
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dependencies
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Diffstat:
46 files changed, 3151 insertions(+), 0 deletions(-)
diff --git a/.dockerignore b/.dockerignore
@@ -0,0 +1,12 @@
+Dockerfile*
+docker-compose*
+.git
+.gitignore
+README.me
+LICENSE
+.env.example
+.github
+CONTRIBUTING.md
+.prettierignore
+eslint.config.js
+prettier.config.js
+\ No newline at end of file
diff --git a/.env.example b/.env.example
@@ -0,0 +1,8 @@
+NODE_ENV="production"
+APP_ID=""
+PRIVATE_KEY_PATH="./data/private-key.pem"
+DB_PATH="./data/reviewbot.db"
+WEBHOOK_SECRET=""
+SENTRY=""
+PORT="3000"
+INSTALLATION_ID=""
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
@@ -0,0 +1 @@
+* @iostpa
+\ No newline at end of file
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
@@ -0,0 +1,28 @@
+version: 2
+
+updates:
+ - package-ecosystem: "npm" # See documentation for possible values
+ target-branch: "main"
+ directory: "/" # Location of package manifests
+ schedule:
+ interval: "daily"
+ groups:
+ dependencies:
+ applies-to: version-updates
+ patterns:
+ - "*"
+ cooldown:
+ semver-major-days: 5 # Waits 5 days before updating major versions
+ semver-minor-days: 3 # Waits 3 days before updating minor versions
+ semver-patch-days: 2 # Waits 2 days before updating patch versions
+
+ - package-ecosystem: "github-actions"
+ target-branch: "main"
+ directory: "/.github/workflows"
+ schedule:
+ interval: "daily"
+ groups:
+ dependencies:
+ applies-to: version-updates
+ patterns:
+ - "*"
diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml
@@ -0,0 +1,37 @@
+name: Publish Release Docker Image
+
+on:
+ release:
+ types: [published]
+
+jobs:
+ Deploy:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+ id-token: write
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v7
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v4
+ - name: Login to ghcr.io
+ uses: docker/login-action@v4
+ with:
+ registry: ghcr.io
+ username: ${{ github.repository_owner }}
+ password: ${{ secrets.MAIN_TOKEN }}
+ - name: Extract metadata (tags, labels) for Docker
+ id: meta
+ uses: docker/metadata-action@v6
+ with:
+ images: ghcr.io/${{ github.repository }}
+ - name: Build and Push Docker Image
+ uses: docker/build-push-action@v7
+ with:
+ context: .
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+\ No newline at end of file
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
@@ -0,0 +1,37 @@
+name: Publish Docker Image
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - "src/*"
+ - "pnpm-lock.yaml"
+ - "package.json"
+ - "Dockerfile"
+
+jobs:
+ Deploy:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v7
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v4
+ - name: Login to ghcr.io
+ uses: docker/login-action@v4
+ with:
+ registry: ghcr.io
+ username: ${{ github.repository_owner }}
+ password: ${{ secrets.MAIN_TOKEN }}
+ - name: Build and Push Docker Image
+ uses: docker/build-push-action@v7
+ with:
+ context: .
+ push: true
+ tags: |
+ ghcr.io/${{ github.repository_owner }}/reviewbot:latest
+\ No newline at end of file
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1,28 @@
+# Logs
+logs
+.env
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+private-key.pem
+data
diff --git a/.prettierignore b/.prettierignore
@@ -0,0 +1 @@
+src/message
+\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
@@ -0,0 +1,32 @@
+## Contributing
+
+[fork]: https://github.com/iostpa/reviewbot/fork
+[pr]: https://github.com/iostpa/reviewbot/compare
+[style]: https://standardjs.com/rules.html
+
+Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great.
+
+Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE).
+
+## Submitting a pull request
+
+1. [Fork][fork] and clone the repository
+1. Install the dependencies: `bun install`
+1. Make sure the linter passes on your machine: `bun run lint`. If you want it to fix most/all errors then use `bun run lint --fix`.
+1. Create a new branch: `git checkout -b my-branch-name`
+1. Make your change, and make sure the linter is still happy
+1. Push to your fork and [submit a pull request][pr]
+1. Pat your self on the back and wait for your pull request to be reviewed and merged.
+
+Here are a few things you can do that will increase the likelihood of your pull request being accepted:
+
+- Follow the [style guide][style].
+- Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as separate pull requests.
+- Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).
+- Follow the [Semantic Versioning](https://semver.org/) rules.
+
+## Resources
+
+- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/)
+- [Using Pull Requests](https://help.github.com/articles/about-pull-requests/)
+- [GitHub Help](https://help.github.com)
diff --git a/Dockerfile b/Dockerfile
@@ -0,0 +1,6 @@
+FROM ghcr.io/pnpm/pnpm:11
+RUN pnpm runtime set node 24 -g
+WORKDIR /app
+COPY . .
+RUN pnpm install --frozen-lockfile
+CMD ["pnpm", "run", "server"]
+\ No newline at end of file
diff --git a/LICENSE b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 iostpa
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
@@ -0,0 +1,34 @@
+# is-a.dev reviewbot
+
+This is the source code of the is-a.dev reviewbot! The bot uses [octokit.js](https://github.com/octokit/octokit.js) as the library.
+
+## Requirements
+
+- pnpm and Node.js
+- A GitHub App subscribed to **Pull Request**, **Workflow job** and **Workflow run** events with the following permissions:
+ - Pull requests: Read & write
+ - Metadata: Read-only
+ - Actions: Read-only
+- (For local development) A tunnel to expose your local server to the internet (e.g. [smee](https://smee.io/), [ngrok](https://ngrok.com/))
+- Your GitHub App Webhook must be configured to receive events at a URL that is accessible from the internet.
+
+## Setup
+
+### Manual
+1. Clone this repository.
+2. Create a `.env` file similar to `.env.example` and set actual values.
+3. Install dependencies with `pnpm`.
+4. Start the server with `pnpm run server`.
+5. Ensure your server is reachable from the internet.
+ - If you're using `smee`, run `smee -u <smee_url> -t http://localhost:3000/api/webhook`.
+6. Ensure your GitHub App includes at least one repository on its installations.
+
+### Docker
+1. Clone this repository.
+2. Add the private-key.pem file to the same directory.
+3. Create a `.env` file similar to `.env.example` and set actual values.
+4. Run `sudo docker compose up -d`
+
+## Contributing
+
+Any contribution to the is-a.dev reviewbot is welcomed! If you have any suggestions or fixes that you want to make feel free to make a pull request or make a GitHub issue! To get it resolved faster you can contact me.
diff --git a/docker-compose.yml b/docker-compose.yml
@@ -0,0 +1,9 @@
+services:
+ reviewbot:
+ image: ghcr.io/iostpa/reviewbot:latest
+ restart: always
+ env_file: ".env"
+ ports:
+ - "3000:3000"
+ volumes:
+ - ./data:/app/data
+\ No newline at end of file
diff --git a/eslint.config.js b/eslint.config.js
@@ -0,0 +1,19 @@
+import js from "@eslint/js";
+import globals from "globals";
+import { defineConfig } from "eslint/config";
+
+export default defineConfig([
+ {
+ files: ["**/*.{js,mjs,cjs}"],
+ plugins: { js },
+ extends: ["js/recommended"],
+ languageOptions: { globals: globals.node },
+ rules: {
+ "consistent-return": 2,
+ "indent" : [1, 4],
+ "no-else-return" : 1,
+ "semi" : [1, "always"],
+ "space-unary-ops" : 2
+ }
+ },
+]);
diff --git a/package.json b/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "reviewbot",
+ "private": true,
+ "version": "1.6.1",
+ "type": "module",
+ "description": "An app to assist in the review process of is-a-dev",
+ "author": "iostpa",
+ "scripts": {
+ "server": "node src",
+ "lint": "eslint src",
+ "prettier": "pnx prettier src --write"
+ },
+ "devDependencies": {
+ "@eslint/js": "^10.0.1",
+ "eslint": "^10.6.0",
+ "globals": "^17.7.0",
+ "prettier": "3.9.5",
+ "smee-client": "^5.0.0"
+ },
+ "dependencies": {
+ "@fastify/middie": "^9.3.3",
+ "@octokit/auth-app": "^8.2.0",
+ "@octokit/core": "^7.0.6",
+ "@octokit/webhooks": "^14.2.0",
+ "@sentry/node": "^10.64.0",
+ "better-sqlite3": "^12.11.1",
+ "cron": "^4.4.0",
+ "dotenv": "^17.4.2",
+ "fastify": "^5.10.0",
+ "mariadb": "^3.5.3",
+ "octokit": "^5.0.5"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
@@ -0,0 +1,1959 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@fastify/middie':
+ specifier: ^9.3.3
+ version: 9.3.3
+ '@octokit/auth-app':
+ specifier: ^8.2.0
+ version: 8.2.0
+ '@octokit/core':
+ specifier: ^7.0.6
+ version: 7.0.6
+ '@octokit/webhooks':
+ specifier: ^14.2.0
+ version: 14.2.0
+ '@sentry/node':
+ specifier: ^10.64.0
+ version: 10.64.0(@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1))
+ better-sqlite3:
+ specifier: ^12.11.1
+ version: 12.11.1
+ cron:
+ specifier: ^4.4.0
+ version: 4.4.0
+ dotenv:
+ specifier: ^17.4.2
+ version: 17.4.2
+ fastify:
+ specifier: ^5.10.0
+ version: 5.10.0
+ mariadb:
+ specifier: ^3.5.3
+ version: 3.5.3
+ octokit:
+ specifier: ^5.0.5
+ version: 5.0.5
+ devDependencies:
+ '@eslint/js':
+ specifier: ^10.0.1
+ version: 10.0.1(eslint@10.6.0)
+ eslint:
+ specifier: ^10.6.0
+ version: 10.6.0
+ globals:
+ specifier: ^17.7.0
+ version: 17.7.0
+ prettier:
+ specifier: 3.9.5
+ version: 3.9.5
+ smee-client:
+ specifier: ^5.0.0
+ version: 5.0.0
+
+packages:
+
+ '@apm-js-collab/code-transformer-bundler-plugins@0.5.0':
+ resolution: {integrity: sha512-YxLBY5nGlurL7QeJLq6e5g0ouBpAp0pwgyA/5rHXEXwhiPLn9ZHbT+Y2LlP90GT872cSocfjWRYu/fnpuBudNQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@apm-js-collab/code-transformer@0.15.0':
+ resolution: {integrity: sha512-XmXYVs8CzJ1Aj79noVbn2weUO/XWtRyURpGqx7aU7DOXlUQhR0WKOQNF0okh7PCeY37vxf7kU3v57OAkEPm3ww==}
+ hasBin: true
+
+ '@apm-js-collab/tracing-hooks@0.10.1':
+ resolution: {integrity: sha512-w2OWXR7FWrKqSziuE9+QclaZrStxO/8+OwbXM635s/zs0Eez1Qo3ivSPdB2WsaPY/iznKTytONPx/PitD7IXcA==}
+
+ '@eslint-community/eslint-utils@4.9.1':
+ resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.23.5':
+ resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/config-helpers@0.6.0':
+ resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/core@1.2.1':
+ resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/js@10.0.1':
+ resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+ peerDependencies:
+ eslint: ^10.0.0
+ peerDependenciesMeta:
+ eslint:
+ optional: true
+
+ '@eslint/object-schema@3.0.5':
+ resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@eslint/plugin-kit@0.7.2':
+ resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ '@fastify/ajv-compiler@4.0.5':
+ resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==}
+
+ '@fastify/error@4.2.0':
+ resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==}
+
+ '@fastify/fast-json-stringify-compiler@5.1.0':
+ resolution: {integrity: sha512-PxcYtKLbQ8Z+yApiqjK8FwxIwvEj38k2OiLc17u8dkJSlmfi2wHHPaSnaoqBPQqtvF8YVsDgDpP2snDCfFrpfw==}
+
+ '@fastify/forwarded@3.0.1':
+ resolution: {integrity: sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==}
+
+ '@fastify/merge-json-schemas@0.2.1':
+ resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==}
+
+ '@fastify/middie@9.3.3':
+ resolution: {integrity: sha512-N2VRS+sfw/lxA/uLD6TvBpvfPfOV/RdYzM7ctAB58Cn2TAYxbRd8+JLFhNhMJoXlSbgChXYUnkn3hPU/JdA4Pg==}
+
+ '@fastify/proxy-addr@5.1.0':
+ resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==}
+
+ '@humanfs/core@0.19.2':
+ resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.8':
+ resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/types@0.15.0':
+ resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@octokit/app@16.1.2':
+ resolution: {integrity: sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==}
+ engines: {node: '>= 20'}
+
+ '@octokit/auth-app@8.2.0':
+ resolution: {integrity: sha512-vVjdtQQwomrZ4V46B9LaCsxsySxGoHsyw6IYBov/TqJVROrlYdyNgw5q6tQbB7KZt53v1l1W53RiqTvpzL907g==}
+ engines: {node: '>= 20'}
+
+ '@octokit/auth-oauth-app@9.0.3':
+ resolution: {integrity: sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==}
+ engines: {node: '>= 20'}
+
+ '@octokit/auth-oauth-device@8.0.3':
+ resolution: {integrity: sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==}
+ engines: {node: '>= 20'}
+
+ '@octokit/auth-oauth-user@6.0.2':
+ resolution: {integrity: sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==}
+ engines: {node: '>= 20'}
+
+ '@octokit/auth-token@6.0.0':
+ resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==}
+ engines: {node: '>= 20'}
+
+ '@octokit/auth-unauthenticated@7.0.3':
+ resolution: {integrity: sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==}
+ engines: {node: '>= 20'}
+
+ '@octokit/core@7.0.6':
+ resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==}
+ engines: {node: '>= 20'}
+
+ '@octokit/endpoint@11.0.3':
+ resolution: {integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==}
+ engines: {node: '>= 20'}
+
+ '@octokit/graphql@9.0.3':
+ resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==}
+ engines: {node: '>= 20'}
+
+ '@octokit/oauth-app@8.0.3':
+ resolution: {integrity: sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==}
+ engines: {node: '>= 20'}
+
+ '@octokit/oauth-authorization-url@8.0.0':
+ resolution: {integrity: sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ==}
+ engines: {node: '>= 20'}
+
+ '@octokit/oauth-methods@6.0.2':
+ resolution: {integrity: sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==}
+ engines: {node: '>= 20'}
+
+ '@octokit/openapi-types@27.0.0':
+ resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==}
+
+ '@octokit/openapi-webhooks-types@12.1.0':
+ resolution: {integrity: sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==}
+
+ '@octokit/plugin-paginate-graphql@6.0.0':
+ resolution: {integrity: sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ==}
+ engines: {node: '>= 20'}
+ peerDependencies:
+ '@octokit/core': '>=6'
+
+ '@octokit/plugin-paginate-rest@14.0.0':
+ resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==}
+ engines: {node: '>= 20'}
+ peerDependencies:
+ '@octokit/core': '>=6'
+
+ '@octokit/plugin-rest-endpoint-methods@17.0.0':
+ resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==}
+ engines: {node: '>= 20'}
+ peerDependencies:
+ '@octokit/core': '>=6'
+
+ '@octokit/plugin-retry@8.1.0':
+ resolution: {integrity: sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==}
+ engines: {node: '>= 20'}
+ peerDependencies:
+ '@octokit/core': '>=7'
+
+ '@octokit/plugin-throttling@11.0.3':
+ resolution: {integrity: sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==}
+ engines: {node: '>= 20'}
+ peerDependencies:
+ '@octokit/core': ^7.0.0
+
+ '@octokit/request-error@7.1.0':
+ resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==}
+ engines: {node: '>= 20'}
+
+ '@octokit/request@10.0.10':
+ resolution: {integrity: sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w==}
+ engines: {node: '>= 20'}
+
+ '@octokit/types@16.0.0':
+ resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==}
+
+ '@octokit/webhooks-methods@6.0.0':
+ resolution: {integrity: sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==}
+ engines: {node: '>= 20'}
+
+ '@octokit/webhooks@14.2.0':
+ resolution: {integrity: sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==}
+ engines: {node: '>= 20'}
+
+ '@opentelemetry/api-logs@0.220.0':
+ resolution: {integrity: sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w==}
+ engines: {node: '>=8.0.0'}
+
+ '@opentelemetry/api@1.9.1':
+ resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==}
+ engines: {node: '>=8.0.0'}
+
+ '@opentelemetry/core@2.9.0':
+ resolution: {integrity: sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==}
+ engines: {node: ^18.19.0 || >=20.6.0}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/instrumentation@0.220.0':
+ resolution: {integrity: sha512-xQx3E2WxP1mDvKzxLxX+CTCtNLa560YJZ3087qYHerl2YmiKpv7AH+dAy7vmx+eVrZ5BwhfWUAVoKOoxCNHcpw==}
+ engines: {node: ^18.19.0 || >=20.6.0}
+ peerDependencies:
+ '@opentelemetry/api': ^1.3.0
+
+ '@opentelemetry/resources@2.9.0':
+ resolution: {integrity: sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==}
+ engines: {node: ^18.19.0 || >=20.6.0}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
+
+ '@opentelemetry/sdk-trace-base@2.9.0':
+ resolution: {integrity: sha512-cp9zmTl62R8PJrpvFcmc8N2JQU/xfa0S+61q511Nji+QxCfZ8Ifvg7H27G8cANe4crg4RTrWsVvanHiXjSp6ag==}
+ engines: {node: ^18.19.0 || >=20.6.0}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
+
+ '@opentelemetry/sdk-trace@2.9.0':
+ resolution: {integrity: sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw==}
+ engines: {node: ^18.19.0 || >=20.6.0}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.3.0 <1.10.0'
+
+ '@opentelemetry/semantic-conventions@1.43.0':
+ resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==}
+ engines: {node: '>=14'}
+
+ '@pinojs/redact@0.4.0':
+ resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==}
+
+ '@sentry/conventions@0.15.1':
+ resolution: {integrity: sha512-ZLP8bRdMON3prWE2tJyImuYscCxdcJeIPIhrOs/rgyFm3C1nCh1B6gdvPj3AZ5zW08oSFFCsq7T+tYEW3h8MNA==}
+ engines: {node: '>=14'}
+
+ '@sentry/core@10.64.0':
+ resolution: {integrity: sha512-HjojJcXD1l2qZ1AXje2s0XY/nYsaUt00wsM1HMBImA8vAClyPisFE/CC0/UD6pEvsGFhVgi8Dcxo7EN41uyeFw==}
+ engines: {node: '>=18'}
+
+ '@sentry/node-core@10.64.0':
+ resolution: {integrity: sha512-dcma5uEWl0SXywY4vzrlOwuz4NBPyPhrzqL1NjlU6Di/OVbyYAZJPCwsR8XYDz73PGc5sU3qKSRoXWX56Ip0wA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.9.0
+ '@opentelemetry/core': ^1.30.1 || ^2.1.0
+ '@opentelemetry/exporter-trace-otlp-http': '>=0.57.0 <1'
+ '@opentelemetry/instrumentation': '>=0.57.1 <1'
+ '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@opentelemetry/core':
+ optional: true
+ '@opentelemetry/exporter-trace-otlp-http':
+ optional: true
+ '@opentelemetry/instrumentation':
+ optional: true
+ '@opentelemetry/sdk-trace-base':
+ optional: true
+
+ '@sentry/node@10.64.0':
+ resolution: {integrity: sha512-rhNZ3CTqwdTQHo9Zd+NsoLyW69VIzbMcGMRX9y8W1A6runT4YH/MDhmT0U9oWfNZKN8ngqR/gfVMTnlYVQliCA==}
+ engines: {node: '>=18'}
+
+ '@sentry/opentelemetry@10.64.0':
+ resolution: {integrity: sha512-hXw8dwSSA9/9r3VGy0PO2SJp7g5/yH2+7Bak60EkOT21AT1BwFnVEsVQyZb+UHjG7UWne/jDbwdWPSUm/rtovw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@opentelemetry/api': ^1.9.0
+ '@opentelemetry/core': ^1.30.1 || ^2.1.0
+ '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0
+
+ '@sentry/server-utils@10.64.0':
+ resolution: {integrity: sha512-d568Jhn3WBfm07dsdPsLh0q+qRj71xZEDZFsA33kizD0UuSCR8axtc2YW6aKdPhtuqgm9tHjSX35Q9vK/XmujA==}
+ engines: {node: '>=18'}
+
+ '@types/aws-lambda@8.10.162':
+ resolution: {integrity: sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==}
+
+ '@types/esrecurse@4.3.1':
+ resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==}
+
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+
+ '@types/geojson@7946.0.16':
+ resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/luxon@3.7.2':
+ resolution: {integrity: sha512-gW+Oib+vUtGJBtNC8V9Reww0oIpusw+4m81uncg9REGZAJfqOQHfo/nkabnc7w0QReXyPqjrbWMJk6NuAkiX3Q==}
+
+ '@types/node@26.0.1':
+ resolution: {integrity: sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==}
+
+ abstract-logging@2.0.1:
+ resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.17.0:
+ resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv@6.15.0:
+ resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
+
+ ajv@8.20.0:
+ resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
+
+ astring@1.9.0:
+ resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
+ hasBin: true
+
+ atomic-sleep@1.0.0:
+ resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
+ engines: {node: '>=8.0.0'}
+
+ avvio@9.2.0:
+ resolution: {integrity: sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==}
+
+ balanced-match@4.0.4:
+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+ engines: {node: 18 || 20 || >=22}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ before-after-hook@4.0.0:
+ resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==}
+
+ better-sqlite3@12.11.1:
+ resolution: {integrity: sha512-dq9AtApgg5PGFtBzPFSBl3HZQjHok5gaQCM6zh2Yk0aSmDCs1CbnVI8/HgASQkNKsWFpseIO9beg5xxpYhbIfA==}
+ engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x || 26.x}
+
+ bindings@1.5.0:
+ resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
+
+ bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
+ bottleneck@2.19.5:
+ resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==}
+
+ brace-expansion@5.0.6:
+ resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==}
+ engines: {node: 18 || 20 || >=22}
+
+ buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
+ chownr@1.1.4:
+ resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
+
+ cjs-module-lexer@2.2.0:
+ resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==}
+
+ content-type@2.0.0:
+ resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==}
+ engines: {node: '>=18'}
+
+ cookie@1.1.1:
+ resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
+ engines: {node: '>=18'}
+
+ cron@4.4.0:
+ resolution: {integrity: sha512-fkdfq+b+AHI4cKdhZlppHveI/mgz2qpiYxcm+t5E5TsxX7QrLS1VE0+7GENEk9z0EeGPcpSciGv6ez24duWhwQ==}
+ engines: {node: '>=18.x'}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decompress-response@6.0.0:
+ resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
+ engines: {node: '>=10'}
+
+ deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ denque@2.1.0:
+ resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
+ engines: {node: '>=0.10'}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ dotenv@17.4.2:
+ resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==}
+ engines: {node: '>=12'}
+
+ end-of-stream@1.4.5:
+ resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+
+ es-module-lexer@2.3.1:
+ resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eslint-scope@9.1.2:
+ resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@5.0.1:
+ resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ eslint@10.6.0:
+ resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@11.2.0:
+ resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ esquery@1.7.0:
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ eventsource-parser@3.1.0:
+ resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==}
+ engines: {node: '>=18.0.0'}
+
+ eventsource@4.1.0:
+ resolution: {integrity: sha512-2GuF51iuHX6A9xdTccMTsNb7VO0lHZihApxhvQzJB5A03DvHDd2FQepodbMaztPBmBcE/ox7o2gqaxGhYB9LhQ==}
+ engines: {node: '>=20.0.0'}
+
+ expand-template@2.0.3:
+ resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
+ engines: {node: '>=6'}
+
+ fast-decode-uri-component@1.0.1:
+ resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-json-stringify@7.0.0:
+ resolution: {integrity: sha512-YV53BAbR3Qwq37wfD1oZ97YJ0nYj6CwfzKXQ38ock9XxI2EnLOdl5psKms6Evook6ACckytZJOaKY0ThmIi1uw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fast-querystring@1.1.2:
+ resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==}
+
+ fast-uri@3.1.3:
+ resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==}
+
+ fastify-plugin@6.0.0:
+ resolution: {integrity: sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==}
+
+ fastify@5.10.0:
+ resolution: {integrity: sha512-A9L0ziuWGQHgEEVgF3davQ9vbD93IuX+lo2IsxapQmu5b/Y/ynn9m9K5JHt9dvyJXOFc5iN0Zk5GHEOqnzhWjg==}
+
+ fastq@1.20.1:
+ resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ file-uri-to-path@1.0.0:
+ resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
+
+ find-my-way@9.6.0:
+ resolution: {integrity: sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ==}
+ engines: {node: '>=20'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.4.2:
+ resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==}
+
+ fs-constants@1.0.0:
+ resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
+
+ github-from-package@0.0.0:
+ resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ globals@17.7.0:
+ resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==}
+ engines: {node: '>=18'}
+
+ iconv-lite@0.7.2:
+ resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ import-in-the-middle@3.3.1:
+ resolution: {integrity: sha512-0rymlHSFLwZ0ixx8DaQkoIyZojJPY2a0K2nEYslhKJ6jIYO/m0IcCb7iQsFPmS7WmKwISZiIrv5Icstrw/CmqA==}
+ engines: {node: '>=18'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+ ipaddr.js@2.4.0:
+ resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==}
+ engines: {node: '>= 10'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-schema-ref-resolver@3.0.0:
+ resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json-with-bigint@3.5.8:
+ resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ light-my-request@6.6.0:
+ resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lru-cache@11.5.1:
+ resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==}
+ engines: {node: 20 || >=22}
+
+ luxon@3.7.2:
+ resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==}
+ engines: {node: '>=12'}
+
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+ mariadb@3.5.3:
+ resolution: {integrity: sha512-i053Kc0MgdUv/hu9mCyq67TYfPXFj3/MV8I7ZW5wvJNixIyXC0VztMPUjIVj/449nQo+BsxFD4Fdk/sA/uqKPQ==}
+ engines: {node: '>= 20.0.0'}
+
+ meriyah@6.1.4:
+ resolution: {integrity: sha512-Sz8FzjzI0kN13GK/6MVEsVzMZEPvOhnmmI1lU5+/1cGOiK3QUahntrNNtdVeihrO7t9JpoH75iMNXg6R6uWflQ==}
+ engines: {node: '>=18.0.0'}
+
+ mimic-response@3.1.0:
+ resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
+ engines: {node: '>=10'}
+
+ minimatch@10.2.5:
+ resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
+ engines: {node: 18 || 20 || >=22}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ mkdirp-classic@0.5.3:
+ resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
+
+ module-details-from-path@1.0.4:
+ resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ napi-build-utils@2.0.0:
+ resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==}
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ node-abi@3.92.0:
+ resolution: {integrity: sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==}
+ engines: {node: '>=10'}
+
+ octokit@5.0.5:
+ resolution: {integrity: sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw==}
+ engines: {node: '>= 20'}
+
+ on-exit-leak-free@2.1.2:
+ resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
+ engines: {node: '>=14.0.0'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-to-regexp@8.4.2:
+ resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}
+
+ pino-abstract-transport@3.0.0:
+ resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==}
+
+ pino-std-serializers@7.1.0:
+ resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==}
+
+ pino@10.3.1:
+ resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==}
+ hasBin: true
+
+ prebuild-install@7.1.3:
+ resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==}
+ engines: {node: '>=10'}
+ deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
+ hasBin: true
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ prettier@3.9.5:
+ resolution: {integrity: sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ process-warning@4.0.1:
+ resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==}
+
+ process-warning@5.0.0:
+ resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==}
+
+ pump@3.0.4:
+ resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ quick-format-unescaped@4.0.4:
+ resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+
+ rc@1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ real-require@0.2.0:
+ resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
+ engines: {node: '>= 12.13.0'}
+
+ real-require@1.0.0:
+ resolution: {integrity: sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ require-in-the-middle@8.0.1:
+ resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==}
+ engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'}
+
+ ret@0.5.0:
+ resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==}
+ engines: {node: '>=10'}
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-regex2@5.1.1:
+ resolution: {integrity: sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==}
+ hasBin: true
+
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ secure-json-parse@4.1.0:
+ resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==}
+
+ semifies@1.0.0:
+ resolution: {integrity: sha512-xXR3KGeoxTNWPD4aBvL5NUpMTT7WMANr3EWnaS190QVkY52lqqcVRD7Q05UVbBhiWDGWMlJEUam9m7uFFGVScw==}
+
+ semver@7.8.5:
+ resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ set-cookie-parser@2.7.2:
+ resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ simple-concat@1.0.1:
+ resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
+
+ simple-get@4.0.1:
+ resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
+
+ smee-client@5.0.0:
+ resolution: {integrity: sha512-OYL8xPr1Tc0iqGohTGqHO/qEvUrPktK0a2Qcb0Uuj+j4KLnH5bsOhOlmpnmdh4zgzL3OwTfodcmkg5fVgiMUHw==}
+ engines: {node: ^20.18 || >= 22}
+ hasBin: true
+
+ sonic-boom@4.2.1:
+ resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-json-comments@2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+
+ tar-fs@2.1.5:
+ resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==}
+
+ tar-stream@2.2.0:
+ resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
+ engines: {node: '>=6'}
+
+ thread-stream@4.2.0:
+ resolution: {integrity: sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==}
+ engines: {node: '>=20'}
+
+ toad-cache@3.7.1:
+ resolution: {integrity: sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==}
+ engines: {node: '>=20'}
+
+ toad-cache@3.7.4:
+ resolution: {integrity: sha512-m1TdR/rvT7kgGJZhspNtXdsdYk0fddFpJJFlG5s+UkPFo6lkLoZ3YLOaovPYjq1R75NP5JfeTlSHaOsE09peCg==}
+ engines: {node: '>=20'}
+
+ tunnel-agent@0.6.0:
+ resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ undici-types@8.3.0:
+ resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==}
+
+ undici@7.28.0:
+ resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==}
+ engines: {node: '>=20.18.1'}
+
+ universal-github-app-jwt@2.2.2:
+ resolution: {integrity: sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==}
+
+ universal-user-agent@7.0.3:
+ resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==}
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+snapshots:
+
+ '@apm-js-collab/code-transformer-bundler-plugins@0.5.0':
+ dependencies:
+ '@apm-js-collab/code-transformer': 0.15.0
+ es-module-lexer: 2.3.1
+ magic-string: 0.30.21
+ module-details-from-path: 1.0.4
+
+ '@apm-js-collab/code-transformer@0.15.0':
+ dependencies:
+ '@types/estree': 1.0.9
+ astring: 1.9.0
+ esquery: 1.7.0
+ meriyah: 6.1.4
+ semifies: 1.0.0
+ source-map: 0.6.1
+
+ '@apm-js-collab/tracing-hooks@0.10.1':
+ dependencies:
+ '@apm-js-collab/code-transformer': 0.15.0
+ debug: 4.4.3
+ module-details-from-path: 1.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint-community/eslint-utils@4.9.1(eslint@10.6.0)':
+ dependencies:
+ eslint: 10.6.0
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.2': {}
+
+ '@eslint/config-array@0.23.5':
+ dependencies:
+ '@eslint/object-schema': 3.0.5
+ debug: 4.4.3
+ minimatch: 10.2.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.6.0':
+ dependencies:
+ '@eslint/core': 1.2.1
+
+ '@eslint/core@1.2.1':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/js@10.0.1(eslint@10.6.0)':
+ optionalDependencies:
+ eslint: 10.6.0
+
+ '@eslint/object-schema@3.0.5': {}
+
+ '@eslint/plugin-kit@0.7.2':
+ dependencies:
+ '@eslint/core': 1.2.1
+ levn: 0.4.1
+
+ '@fastify/ajv-compiler@4.0.5':
+ dependencies:
+ ajv: 8.20.0
+ ajv-formats: 3.0.1(ajv@8.20.0)
+ fast-uri: 3.1.3
+
+ '@fastify/error@4.2.0': {}
+
+ '@fastify/fast-json-stringify-compiler@5.1.0':
+ dependencies:
+ fast-json-stringify: 7.0.0
+
+ '@fastify/forwarded@3.0.1': {}
+
+ '@fastify/merge-json-schemas@0.2.1':
+ dependencies:
+ dequal: 2.0.3
+
+ '@fastify/middie@9.3.3':
+ dependencies:
+ '@fastify/error': 4.2.0
+ fastify-plugin: 6.0.0
+ find-my-way: 9.6.0
+ path-to-regexp: 8.4.2
+ reusify: 1.1.0
+
+ '@fastify/proxy-addr@5.1.0':
+ dependencies:
+ '@fastify/forwarded': 3.0.1
+ ipaddr.js: 2.4.0
+
+ '@humanfs/core@0.19.2':
+ dependencies:
+ '@humanfs/types': 0.15.0
+
+ '@humanfs/node@0.16.8':
+ dependencies:
+ '@humanfs/core': 0.19.2
+ '@humanfs/types': 0.15.0
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanfs/types@0.15.0': {}
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@octokit/app@16.1.2':
+ dependencies:
+ '@octokit/auth-app': 8.2.0
+ '@octokit/auth-unauthenticated': 7.0.3
+ '@octokit/core': 7.0.6
+ '@octokit/oauth-app': 8.0.3
+ '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6)
+ '@octokit/types': 16.0.0
+ '@octokit/webhooks': 14.2.0
+
+ '@octokit/auth-app@8.2.0':
+ dependencies:
+ '@octokit/auth-oauth-app': 9.0.3
+ '@octokit/auth-oauth-user': 6.0.2
+ '@octokit/request': 10.0.10
+ '@octokit/request-error': 7.1.0
+ '@octokit/types': 16.0.0
+ toad-cache: 3.7.1
+ universal-github-app-jwt: 2.2.2
+ universal-user-agent: 7.0.3
+
+ '@octokit/auth-oauth-app@9.0.3':
+ dependencies:
+ '@octokit/auth-oauth-device': 8.0.3
+ '@octokit/auth-oauth-user': 6.0.2
+ '@octokit/request': 10.0.10
+ '@octokit/types': 16.0.0
+ universal-user-agent: 7.0.3
+
+ '@octokit/auth-oauth-device@8.0.3':
+ dependencies:
+ '@octokit/oauth-methods': 6.0.2
+ '@octokit/request': 10.0.10
+ '@octokit/types': 16.0.0
+ universal-user-agent: 7.0.3
+
+ '@octokit/auth-oauth-user@6.0.2':
+ dependencies:
+ '@octokit/auth-oauth-device': 8.0.3
+ '@octokit/oauth-methods': 6.0.2
+ '@octokit/request': 10.0.10
+ '@octokit/types': 16.0.0
+ universal-user-agent: 7.0.3
+
+ '@octokit/auth-token@6.0.0': {}
+
+ '@octokit/auth-unauthenticated@7.0.3':
+ dependencies:
+ '@octokit/request-error': 7.1.0
+ '@octokit/types': 16.0.0
+
+ '@octokit/core@7.0.6':
+ dependencies:
+ '@octokit/auth-token': 6.0.0
+ '@octokit/graphql': 9.0.3
+ '@octokit/request': 10.0.10
+ '@octokit/request-error': 7.1.0
+ '@octokit/types': 16.0.0
+ before-after-hook: 4.0.0
+ universal-user-agent: 7.0.3
+
+ '@octokit/endpoint@11.0.3':
+ dependencies:
+ '@octokit/types': 16.0.0
+ universal-user-agent: 7.0.3
+
+ '@octokit/graphql@9.0.3':
+ dependencies:
+ '@octokit/request': 10.0.10
+ '@octokit/types': 16.0.0
+ universal-user-agent: 7.0.3
+
+ '@octokit/oauth-app@8.0.3':
+ dependencies:
+ '@octokit/auth-oauth-app': 9.0.3
+ '@octokit/auth-oauth-user': 6.0.2
+ '@octokit/auth-unauthenticated': 7.0.3
+ '@octokit/core': 7.0.6
+ '@octokit/oauth-authorization-url': 8.0.0
+ '@octokit/oauth-methods': 6.0.2
+ '@types/aws-lambda': 8.10.162
+ universal-user-agent: 7.0.3
+
+ '@octokit/oauth-authorization-url@8.0.0': {}
+
+ '@octokit/oauth-methods@6.0.2':
+ dependencies:
+ '@octokit/oauth-authorization-url': 8.0.0
+ '@octokit/request': 10.0.10
+ '@octokit/request-error': 7.1.0
+ '@octokit/types': 16.0.0
+
+ '@octokit/openapi-types@27.0.0': {}
+
+ '@octokit/openapi-webhooks-types@12.1.0': {}
+
+ '@octokit/plugin-paginate-graphql@6.0.0(@octokit/core@7.0.6)':
+ dependencies:
+ '@octokit/core': 7.0.6
+
+ '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)':
+ dependencies:
+ '@octokit/core': 7.0.6
+ '@octokit/types': 16.0.0
+
+ '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)':
+ dependencies:
+ '@octokit/core': 7.0.6
+ '@octokit/types': 16.0.0
+
+ '@octokit/plugin-retry@8.1.0(@octokit/core@7.0.6)':
+ dependencies:
+ '@octokit/core': 7.0.6
+ '@octokit/request-error': 7.1.0
+ '@octokit/types': 16.0.0
+ bottleneck: 2.19.5
+
+ '@octokit/plugin-throttling@11.0.3(@octokit/core@7.0.6)':
+ dependencies:
+ '@octokit/core': 7.0.6
+ '@octokit/types': 16.0.0
+ bottleneck: 2.19.5
+
+ '@octokit/request-error@7.1.0':
+ dependencies:
+ '@octokit/types': 16.0.0
+
+ '@octokit/request@10.0.10':
+ dependencies:
+ '@octokit/endpoint': 11.0.3
+ '@octokit/request-error': 7.1.0
+ '@octokit/types': 16.0.0
+ content-type: 2.0.0
+ json-with-bigint: 3.5.8
+ universal-user-agent: 7.0.3
+
+ '@octokit/types@16.0.0':
+ dependencies:
+ '@octokit/openapi-types': 27.0.0
+
+ '@octokit/webhooks-methods@6.0.0': {}
+
+ '@octokit/webhooks@14.2.0':
+ dependencies:
+ '@octokit/openapi-webhooks-types': 12.1.0
+ '@octokit/request-error': 7.1.0
+ '@octokit/webhooks-methods': 6.0.0
+
+ '@opentelemetry/api-logs@0.220.0':
+ dependencies:
+ '@opentelemetry/api': 1.9.1
+
+ '@opentelemetry/api@1.9.1': {}
+
+ '@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1)':
+ dependencies:
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/semantic-conventions': 1.43.0
+
+ '@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1)':
+ dependencies:
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/api-logs': 0.220.0
+ import-in-the-middle: 3.3.1
+ require-in-the-middle: 8.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@opentelemetry/resources@2.9.0(@opentelemetry/api@1.9.1)':
+ dependencies:
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/semantic-conventions': 1.43.0
+
+ '@opentelemetry/sdk-trace-base@2.9.0(@opentelemetry/api@1.9.1)':
+ dependencies:
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/sdk-trace': 2.9.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/semantic-conventions': 1.43.0
+
+ '@opentelemetry/sdk-trace@2.9.0(@opentelemetry/api@1.9.1)':
+ dependencies:
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/semantic-conventions': 1.43.0
+
+ '@opentelemetry/semantic-conventions@1.43.0': {}
+
+ '@pinojs/redact@0.4.0': {}
+
+ '@sentry/conventions@0.15.1': {}
+
+ '@sentry/core@10.64.0':
+ dependencies:
+ '@sentry/conventions': 0.15.1
+
+ '@sentry/node-core@10.64.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.9.0(@opentelemetry/api@1.9.1))':
+ dependencies:
+ '@sentry/conventions': 0.15.1
+ '@sentry/core': 10.64.0
+ '@sentry/opentelemetry': 10.64.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.9.0(@opentelemetry/api@1.9.1))
+ import-in-the-middle: 3.3.1
+ optionalDependencies:
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/sdk-trace-base': 2.9.0(@opentelemetry/api@1.9.1)
+
+ '@sentry/node@10.64.0(@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1))':
+ dependencies:
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/sdk-trace-base': 2.9.0(@opentelemetry/api@1.9.1)
+ '@sentry/conventions': 0.15.1
+ '@sentry/core': 10.64.0
+ '@sentry/node-core': 10.64.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.9.0(@opentelemetry/api@1.9.1))
+ '@sentry/opentelemetry': 10.64.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.9.0(@opentelemetry/api@1.9.1))
+ '@sentry/server-utils': 10.64.0
+ import-in-the-middle: 3.3.1
+ transitivePeerDependencies:
+ - '@opentelemetry/core'
+ - '@opentelemetry/exporter-trace-otlp-http'
+ - supports-color
+
+ '@sentry/opentelemetry@10.64.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.9.0(@opentelemetry/api@1.9.1))':
+ dependencies:
+ '@opentelemetry/api': 1.9.1
+ '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1)
+ '@opentelemetry/sdk-trace-base': 2.9.0(@opentelemetry/api@1.9.1)
+ '@sentry/conventions': 0.15.1
+ '@sentry/core': 10.64.0
+
+ '@sentry/server-utils@10.64.0':
+ dependencies:
+ '@apm-js-collab/code-transformer': 0.15.0
+ '@apm-js-collab/code-transformer-bundler-plugins': 0.5.0
+ '@apm-js-collab/tracing-hooks': 0.10.1
+ '@sentry/conventions': 0.15.1
+ '@sentry/core': 10.64.0
+ magic-string: 0.30.21
+ transitivePeerDependencies:
+ - supports-color
+
+ '@types/aws-lambda@8.10.162': {}
+
+ '@types/esrecurse@4.3.1': {}
+
+ '@types/estree@1.0.9': {}
+
+ '@types/geojson@7946.0.16': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/luxon@3.7.2': {}
+
+ '@types/node@26.0.1':
+ dependencies:
+ undici-types: 8.3.0
+
+ abstract-logging@2.0.1: {}
+
+ acorn-jsx@5.3.2(acorn@8.17.0):
+ dependencies:
+ acorn: 8.17.0
+
+ acorn@8.17.0: {}
+
+ ajv-formats@3.0.1(ajv@8.20.0):
+ optionalDependencies:
+ ajv: 8.20.0
+
+ ajv@6.15.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ajv@8.20.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ astring@1.9.0: {}
+
+ atomic-sleep@1.0.0: {}
+
+ avvio@9.2.0:
+ dependencies:
+ '@fastify/error': 4.2.0
+ fastq: 1.20.1
+
+ balanced-match@4.0.4: {}
+
+ base64-js@1.5.1: {}
+
+ before-after-hook@4.0.0: {}
+
+ better-sqlite3@12.11.1:
+ dependencies:
+ bindings: 1.5.0
+ prebuild-install: 7.1.3
+
+ bindings@1.5.0:
+ dependencies:
+ file-uri-to-path: 1.0.0
+
+ bl@4.1.0:
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ bottleneck@2.19.5: {}
+
+ brace-expansion@5.0.6:
+ dependencies:
+ balanced-match: 4.0.4
+
+ buffer@5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ chownr@1.1.4: {}
+
+ cjs-module-lexer@2.2.0: {}
+
+ content-type@2.0.0: {}
+
+ cookie@1.1.1: {}
+
+ cron@4.4.0:
+ dependencies:
+ '@types/luxon': 3.7.2
+ luxon: 3.7.2
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ decompress-response@6.0.0:
+ dependencies:
+ mimic-response: 3.1.0
+
+ deep-extend@0.6.0: {}
+
+ deep-is@0.1.4: {}
+
+ denque@2.1.0: {}
+
+ dequal@2.0.3: {}
+
+ detect-libc@2.1.2: {}
+
+ dotenv@17.4.2: {}
+
+ end-of-stream@1.4.5:
+ dependencies:
+ once: 1.4.0
+
+ es-module-lexer@2.3.1: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ eslint-scope@9.1.2:
+ dependencies:
+ '@types/esrecurse': 4.3.1
+ '@types/estree': 1.0.9
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@5.0.1: {}
+
+ eslint@10.6.0:
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@10.6.0)
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.23.5
+ '@eslint/config-helpers': 0.6.0
+ '@eslint/core': 1.2.1
+ '@eslint/plugin-kit': 0.7.2
+ '@humanfs/node': 0.16.8
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.9
+ ajv: 6.15.0
+ cross-spawn: 7.0.6
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ eslint-scope: 9.1.2
+ eslint-visitor-keys: 5.0.1
+ espree: 11.2.0
+ esquery: 1.7.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ minimatch: 10.2.5
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@11.2.0:
+ dependencies:
+ acorn: 8.17.0
+ acorn-jsx: 5.3.2(acorn@8.17.0)
+ eslint-visitor-keys: 5.0.1
+
+ esquery@1.7.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ esutils@2.0.3: {}
+
+ eventsource-parser@3.1.0: {}
+
+ eventsource@4.1.0:
+ dependencies:
+ eventsource-parser: 3.1.0
+
+ expand-template@2.0.3: {}
+
+ fast-decode-uri-component@1.0.1: {}
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-json-stringify@7.0.0:
+ dependencies:
+ '@fastify/merge-json-schemas': 0.2.1
+ ajv: 8.20.0
+ ajv-formats: 3.0.1(ajv@8.20.0)
+ fast-uri: 3.1.3
+ json-schema-ref-resolver: 3.0.0
+ rfdc: 1.4.1
+
+ fast-levenshtein@2.0.6: {}
+
+ fast-querystring@1.1.2:
+ dependencies:
+ fast-decode-uri-component: 1.0.1
+
+ fast-uri@3.1.3: {}
+
+ fastify-plugin@6.0.0: {}
+
+ fastify@5.10.0:
+ dependencies:
+ '@fastify/ajv-compiler': 4.0.5
+ '@fastify/error': 4.2.0
+ '@fastify/fast-json-stringify-compiler': 5.1.0
+ '@fastify/proxy-addr': 5.1.0
+ abstract-logging: 2.0.1
+ avvio: 9.2.0
+ fast-json-stringify: 7.0.0
+ find-my-way: 9.6.0
+ light-my-request: 6.6.0
+ pino: 10.3.1
+ process-warning: 5.0.0
+ rfdc: 1.4.1
+ secure-json-parse: 4.1.0
+ semver: 7.8.5
+ toad-cache: 3.7.4
+
+ fastq@1.20.1:
+ dependencies:
+ reusify: 1.1.0
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ file-uri-to-path@1.0.0: {}
+
+ find-my-way@9.6.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-querystring: 1.1.2
+ safe-regex2: 5.1.1
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.4.2
+ keyv: 4.5.4
+
+ flatted@3.4.2: {}
+
+ fs-constants@1.0.0: {}
+
+ github-from-package@0.0.0: {}
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ globals@17.7.0: {}
+
+ iconv-lite@0.7.2:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ieee754@1.2.1: {}
+
+ ignore@5.3.2: {}
+
+ import-in-the-middle@3.3.1:
+ dependencies:
+ cjs-module-lexer: 2.2.0
+ es-module-lexer: 2.3.1
+ module-details-from-path: 1.0.4
+
+ imurmurhash@0.1.4: {}
+
+ inherits@2.0.4: {}
+
+ ini@1.3.8: {}
+
+ ipaddr.js@2.4.0: {}
+
+ is-extglob@2.1.1: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ isexe@2.0.0: {}
+
+ json-buffer@3.0.1: {}
+
+ json-schema-ref-resolver@3.0.0:
+ dependencies:
+ dequal: 2.0.3
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json-with-bigint@3.5.8: {}
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ light-my-request@6.6.0:
+ dependencies:
+ cookie: 1.1.1
+ process-warning: 4.0.1
+ set-cookie-parser: 2.7.2
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lru-cache@11.5.1: {}
+
+ luxon@3.7.2: {}
+
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ mariadb@3.5.3:
+ dependencies:
+ '@types/geojson': 7946.0.16
+ '@types/node': 26.0.1
+ denque: 2.1.0
+ iconv-lite: 0.7.2
+ lru-cache: 11.5.1
+
+ meriyah@6.1.4: {}
+
+ mimic-response@3.1.0: {}
+
+ minimatch@10.2.5:
+ dependencies:
+ brace-expansion: 5.0.6
+
+ minimist@1.2.8: {}
+
+ mkdirp-classic@0.5.3: {}
+
+ module-details-from-path@1.0.4: {}
+
+ ms@2.1.3: {}
+
+ napi-build-utils@2.0.0: {}
+
+ natural-compare@1.4.0: {}
+
+ node-abi@3.92.0:
+ dependencies:
+ semver: 7.8.5
+
+ octokit@5.0.5:
+ dependencies:
+ '@octokit/app': 16.1.2
+ '@octokit/core': 7.0.6
+ '@octokit/oauth-app': 8.0.3
+ '@octokit/plugin-paginate-graphql': 6.0.0(@octokit/core@7.0.6)
+ '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6)
+ '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6)
+ '@octokit/plugin-retry': 8.1.0(@octokit/core@7.0.6)
+ '@octokit/plugin-throttling': 11.0.3(@octokit/core@7.0.6)
+ '@octokit/request-error': 7.1.0
+ '@octokit/types': 16.0.0
+ '@octokit/webhooks': 14.2.0
+
+ on-exit-leak-free@2.1.2: {}
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ path-exists@4.0.0: {}
+
+ path-key@3.1.1: {}
+
+ path-to-regexp@8.4.2: {}
+
+ pino-abstract-transport@3.0.0:
+ dependencies:
+ split2: 4.2.0
+
+ pino-std-serializers@7.1.0: {}
+
+ pino@10.3.1:
+ dependencies:
+ '@pinojs/redact': 0.4.0
+ atomic-sleep: 1.0.0
+ on-exit-leak-free: 2.1.2
+ pino-abstract-transport: 3.0.0
+ pino-std-serializers: 7.1.0
+ process-warning: 5.0.0
+ quick-format-unescaped: 4.0.4
+ real-require: 0.2.0
+ safe-stable-stringify: 2.5.0
+ sonic-boom: 4.2.1
+ thread-stream: 4.2.0
+
+ prebuild-install@7.1.3:
+ dependencies:
+ detect-libc: 2.1.2
+ expand-template: 2.0.3
+ github-from-package: 0.0.0
+ minimist: 1.2.8
+ mkdirp-classic: 0.5.3
+ napi-build-utils: 2.0.0
+ node-abi: 3.92.0
+ pump: 3.0.4
+ rc: 1.2.8
+ simple-get: 4.0.1
+ tar-fs: 2.1.5
+ tunnel-agent: 0.6.0
+
+ prelude-ls@1.2.1: {}
+
+ prettier@3.9.5: {}
+
+ process-warning@4.0.1: {}
+
+ process-warning@5.0.0: {}
+
+ pump@3.0.4:
+ dependencies:
+ end-of-stream: 1.4.5
+ once: 1.4.0
+
+ punycode@2.3.1: {}
+
+ quick-format-unescaped@4.0.4: {}
+
+ rc@1.2.8:
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.8
+ strip-json-comments: 2.0.1
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ real-require@0.2.0: {}
+
+ real-require@1.0.0: {}
+
+ require-from-string@2.0.2: {}
+
+ require-in-the-middle@8.0.1:
+ dependencies:
+ debug: 4.4.3
+ module-details-from-path: 1.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ ret@0.5.0: {}
+
+ reusify@1.1.0: {}
+
+ rfdc@1.4.1: {}
+
+ safe-buffer@5.2.1: {}
+
+ safe-regex2@5.1.1:
+ dependencies:
+ ret: 0.5.0
+
+ safe-stable-stringify@2.5.0: {}
+
+ safer-buffer@2.1.2: {}
+
+ secure-json-parse@4.1.0: {}
+
+ semifies@1.0.0: {}
+
+ semver@7.8.5: {}
+
+ set-cookie-parser@2.7.2: {}
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ simple-concat@1.0.1: {}
+
+ simple-get@4.0.1:
+ dependencies:
+ decompress-response: 6.0.0
+ once: 1.4.0
+ simple-concat: 1.0.1
+
+ smee-client@5.0.0:
+ dependencies:
+ eventsource: 4.1.0
+ undici: 7.28.0
+
+ sonic-boom@4.2.1:
+ dependencies:
+ atomic-sleep: 1.0.0
+
+ source-map@0.6.1: {}
+
+ split2@4.2.0: {}
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-json-comments@2.0.1: {}
+
+ tar-fs@2.1.5:
+ dependencies:
+ chownr: 1.1.4
+ mkdirp-classic: 0.5.3
+ pump: 3.0.4
+ tar-stream: 2.2.0
+
+ tar-stream@2.2.0:
+ dependencies:
+ bl: 4.1.0
+ end-of-stream: 1.4.5
+ fs-constants: 1.0.0
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ thread-stream@4.2.0:
+ dependencies:
+ real-require: 1.0.0
+
+ toad-cache@3.7.1: {}
+
+ toad-cache@3.7.4: {}
+
+ tunnel-agent@0.6.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ undici-types@8.3.0: {}
+
+ undici@7.28.0: {}
+
+ universal-github-app-jwt@2.2.2: {}
+
+ universal-user-agent@7.0.3: {}
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ util-deprecate@1.0.2: {}
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ word-wrap@1.2.5: {}
+
+ wrappy@1.0.2: {}
+
+ yocto-queue@0.1.0: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
@@ -0,0 +1,2 @@
+allowBuilds:
+ better-sqlite3: true
diff --git a/prettier.config.js b/prettier.config.js
@@ -0,0 +1,12 @@
+/**
+ * @see https://prettier.io/docs/configuration
+ * @type {import("prettier").Config}
+ */
+const config = {
+ trailingComma: 'es5',
+ semi: true,
+ tabWidth: 4,
+ singleQuote: true,
+};
+
+export default config;
diff --git a/src/index.js b/src/index.js
@@ -0,0 +1,275 @@
+import * as Sentry from '@sentry/node';
+import fs from 'fs';
+import path from 'path';
+import dotenv from 'dotenv';
+import middie from '@fastify/middie';
+import Fastify from 'fastify';
+import Database from 'better-sqlite3';
+
+import { App } from 'octokit';
+import { createNodeMiddleware } from '@octokit/webhooks';
+import { CronJob } from 'cron';
+
+import { getNumberOfDays } from './tools/numberofdays.js';
+
+import { unlabeled } from './webhooks/unlabeled.js';
+import { opened } from './webhooks/opened.js';
+import { closed } from './webhooks/closed.js';
+import { labeled } from './webhooks/labeled.js';
+
+// Load environment variables from .env file
+dotenv.config();
+
+// Set configured values
+const sentryDsn = process.env.SENTRY;
+const appId = process.env.APP_ID;
+const installationId = process.env.INSTALLATION_ID;
+const privateKey = fs.readFileSync(
+ path.resolve(process.env.PRIVATE_KEY_PATH),
+ 'utf8'
+);
+const secret = process.env.WEBHOOK_SECRET;
+export const numberOfDays = 3;
+
+Sentry.init({
+ dsn: sentryDsn,
+ // Tracing
+ tracesSampleRate: 1.0, // Capture 100% of the transactions
+ // Enable logs to be sent to Sentry
+ enableLogs: true,
+});
+
+// Database
+
+export const db = new Database(process.env.DB_PATH);
+
+/*db.exec(`
+ CREATE TABLE LIST (
+ username TEXT NOT NULL,
+ prnumber TEXT NOT NULL,
+ time TEXT NOT NULL,
+ repoowner TEXT NOT NULL,
+ repo TEXT NOT NULL
+ );
+`);*/
+
+// Create an authenticated Octokit client authenticated as a GitHub App
+const app = new App({
+ appId,
+ privateKey,
+ webhooks: {
+ secret,
+ },
+});
+
+const appOctokit = await app.getInstallationOctokit(installationId);
+
+/*
+saving this for incase
+
+const installationOctokit = new Octokit({
+ authStrategy: createAppAuth,
+ auth: {
+ appId,
+ privateKey,
+ installationId,
+ },
+});
+*/
+
+// Get & log the authenticated app's name
+const { data } = await app.octokit.request('/app');
+
+// https://github.com/octokit/core.js#logging
+app.octokit.log.debug(`Authenticated as '${data.name}'`);
+
+// Check if a low priority pull request has been in the database for over 3 days
+let job = new CronJob(
+ '0 * * * *', // cronTime 0 * * * *
+ async function () {
+ let date = new Date();
+ try {
+ let res = await db.prepare(`SELECT * FROM LIST`).all();
+ let resJson = JSON.stringify(res);
+ if (resJson !== '[]') {
+ let parsed = JSON.parse(resJson);
+ for (let i in parsed) {
+ if (getNumberOfDays(parsed[i].time, date) >= numberOfDays) {
+ await db
+ .prepare(`DELETE FROM LIST WHERE time = ?`)
+ .run(parsed[i].time);
+ await appOctokit.request(
+ 'DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}',
+ {
+ owner: parsed[i].repoowner,
+ repo: parsed[i].repo,
+ issue_number: parsed[i].prnumber,
+ name: 'status: low priority',
+ }
+ );
+ console.log(
+ `Removed #${parsed[i].prnumber} from the database since it has existed for 3 or more days.`
+ );
+ }
+ }
+ } else if (resJson === '[]') {
+ return;
+ }
+ } catch (error) {
+ Sentry.captureException(error);
+ fastify.log.error(error);
+ if (error.response) {
+ console.error(
+ `Error! Status: ${error.response.status}. Message: ${error.response.data.message}`
+ );
+ } else {
+ console.error(error);
+ }
+ }
+ }, // onTick
+ null, // onComplete
+ true, // start
+ 'Europe/Bucharest' // timeZone
+);
+
+app.webhooks.on('pull_request.opened', async ({ payload }) => {
+ try {
+ await opened(
+ appOctokit,
+ payload.repository.owner.login,
+ payload.repository.name,
+ payload.repository.full_name,
+ payload.pull_request.number,
+ payload.pull_request.updated_at,
+ payload.pull_request.user.login,
+ payload.pull_request.draft
+ );
+ } catch (error) {
+ Sentry.captureException(error);
+ fastify.log.error(error);
+ if (error.response) {
+ console.error(
+ `Error! Status: ${error.response.status}. Message: ${error.response.data.message}`
+ );
+ } else {
+ console.error(error);
+ }
+ }
+});
+
+// https://github.com/octokit/webhooks.js/?tab=readme-ov-file#webhook-events
+app.webhooks.on('pull_request.closed', async ({ payload }) => {
+ console.log(
+ `Received a closed pull request event for #${payload.pull_request.number} on https://github.com/${payload.repository.full_name}`
+ );
+ try {
+ await closed(
+ appOctokit,
+ payload.pull_request.merged,
+ payload.repository.owner.login,
+ payload.repository.name,
+ payload.repository.full_name,
+ payload.pull_request.number,
+ payload.pull_request.user.login,
+ payload.sender.login
+ );
+ } catch (error) {
+ Sentry.captureException(error);
+ fastify.log.error(error);
+ if (error.response) {
+ console.error(
+ `Error! Status: ${error.response.status}. Message: ${error.response.data.message}`
+ );
+ } else {
+ console.error(error);
+ }
+ }
+});
+
+// Label system
+app.webhooks.on('pull_request.labeled', async ({ payload }) => {
+ try {
+ await labeled(
+ appOctokit,
+ payload.label.name,
+ payload.repository.owner.login,
+ payload.repository.name,
+ payload.repository.full_name,
+ payload.pull_request.number,
+ payload.pull_request.updated_at,
+ payload.pull_request.user.login
+ );
+ } catch (error) {
+ Sentry.captureException(error);
+ fastify.log.error(error);
+ if (error.response) {
+ console.error(
+ `Error! Status: ${error.response.status}. Message: ${error.response.data.message}`
+ );
+ } else {
+ console.error(error);
+ }
+ }
+});
+
+app.webhooks.on('pull_request.unlabeled', async ({ payload }) => {
+ try {
+ await unlabeled(
+ payload.label.name,
+ payload.pull_request.user.login,
+ payload.pull_request.number,
+ payload.repository.full_name
+ );
+ } catch (error) {
+ Sentry.captureException(error);
+ fastify.log.error(error);
+ if (error.response) {
+ console.error(
+ `Error! Status: ${error.response.status}. Message: ${error.response.data.message}`
+ );
+ } else {
+ console.error(error);
+ }
+ }
+});
+
+// Handle errors
+app.webhooks.onError((error) => {
+ Sentry.captureException(error);
+ fastify.log.error(error);
+ if (error.name === 'AggregateError') {
+ // Log Secret verification errors
+ console.log(`Error processing request: ${error.event}`);
+ } else {
+ console.log(error);
+ }
+});
+
+// Launch a web server to listen for GitHub webhooks
+const port = process.env.PORT || 3000;
+const host = process.env.NODE_ENV === 'production' ? '0.0.0.0' : 'localhost';
+const webhookPath = '/api/webhook';
+const localWebhookUrl = `http://${host}:${port}${webhookPath}`;
+
+// https://github.com/octokit/webhooks.js/#createnodemiddleware
+const middleware = createNodeMiddleware(app.webhooks, { path: webhookPath });
+
+const fastify = Fastify({
+ logger: false,
+});
+await fastify.register(middie);
+fastify.use(middleware);
+
+await fastify.listen({ port, host });
+
+console.log(`Server is listening for events at: ${localWebhookUrl}`);
+console.log('Press Ctrl + C to quit.');
+
+/*
+Standard node http server (use "import http from 'http' if you want to use this instead of Fastify")
+
+http.createServer(middleware).listen(port, () => {
+ console.log(`Server is listening for events at: ${localWebhookUrl}`)
+ console.log('Press Ctrl + C to quit.')
+})
+*/
diff --git a/src/message/draft.md b/src/message/draft.md
@@ -0,0 +1,14 @@
+> [!NOTE]
+> Please be aware that you put the pull request on draft mode when you created the pull request. If this isn't intentional, please scroll down until you find the "Ready for review" button and click it. We recommend not opening draft pull requests since we usually ignore it until it's no longer on draft mode.
+
+# Hi there! :wave:
+
+You've successfully made a pull request! Here are some steps to do while waiting for a maintainer to review the pull request:
+
+1. Check if the checks have failed or passed. You should see the status at the bottom of the pull request or a icon next to the commit ID. You can click on the 3 dots next to the "CI / Tests" check then click "View details", it will show you the logs of the tests.
+2. Check if the filename, file format, and records are valid. If you don't know if it's valid, please read [this part](https://docs.is-a.dev/domain-structure) of the documentation and use a JSON validator/formatter, like [jsonlint](https://jsonlint.com). Make sure that the file is in the `domains` directory and not somewhere else in the repository.
+3. Please make sure that you've filled out the pull request template. It is generally not a good idea to overwrite the pull request template with something else unless you know what you are doing. Make sure to add either a publicly available preview of your website or a screenshot of it.
+4. Please wait patiently. Pull requests may take between a couple hours to 3 days. All of the maintainer team are volunteers and try to review the pull requests in their spare time. If you want a chance of getting your pull request merged faster then send your pull request number **once** in the `#pull-requests` channel in our [Discord server](https://discord.gg/is-a-dev-830872854677422150) and wait patiently.
+5. Please note that mentioning maintainers in pull requests without it being reviewed could lead to you getting marked as "low priority"; this also applies to pinging the maintainers in the Discord server or messaging the maintainers in private to review the pull request.
+
+Note: if you've opened this pull request while there is a high number of other open pull requests, your wait time will be longer than usual. Please be patient!
+\ No newline at end of file
diff --git a/src/message/invalidnolabel.md b/src/message/invalidnolabel.md
@@ -0,0 +1,5 @@
+# Invalid Pull Request
+
+This pull request is invalid. Unfortunately the reviewer didn't specify what is wrong with the pull request.
+
+If you need any help, please create an issue or ask our team in the [Discord server](https://discord.gg/is-a-dev-830872854677422150)
+\ No newline at end of file
diff --git a/src/message/label/abuse-risk.md b/src/message/label/abuse-risk.md
@@ -0,0 +1,2 @@
+### Abuse Risk
+We believe this pull request risks the abuse of our service. One possible reason we might have reached this conclusion is that there is a risk of malware or malicious content on your website, or other security issues. Another possible reason is that you are hosting copyright infringing material; please ensure that all content on your website respects copyright laws. Piracy and infringing on third-party rights is prohibited per our [Terms of Service](https://is-a.dev/terms).
+\ No newline at end of file
diff --git a/src/message/label/commercial-usage.md b/src/message/label/commercial-usage.md
@@ -0,0 +1,2 @@
+### Commercial Usage
+It is explicitly stated in our [Terms of Service](https://is-a.dev/terms) that we **prohibit** using our subdomains for commercial, for-profit or political purposes. Your website violates our Terms of Service.
+\ No newline at end of file
diff --git a/src/message/label/impersonation.md b/src/message/label/impersonation.md
@@ -0,0 +1,2 @@
+### Impersonation
+Impersonation is explicitly prohibited in our [Terms of Service](https://is-a.dev/terms). Your website is violating this rule by impersonating or misrepresenting a person or entity.
+\ No newline at end of file
diff --git a/src/message/label/inaccessible-website.md b/src/message/label/inaccessible-website.md
@@ -0,0 +1,2 @@
+### Inaccessible Website
+Your website is inaccessible. This means that at the time of review, the responsible maintainer was unable to access your website and was met with an error. If it is not possible for it to be accessible immediately via a link, it is *mandatory* to provide a **preview** of your website in image or video form.
+\ No newline at end of file
diff --git a/src/message/label/incompatible-records.md b/src/message/label/incompatible-records.md
@@ -0,0 +1,4 @@
+### Incompatible Records
+You are attempting to combine records which are incompatible with each other. This may be:
+- Attempting to combine CNAME with MX or TXT records. This is not possible unless you [proxy your subdomain](https://docs.is-a.dev/domain-structure/#-proxied-optional).
+- Attempting to combine any records excluding DS records with NS records. This is also possible. Note that you may not create nested subdomains of a root subdomain with NS records!
diff --git a/src/message/label/incomplete-pr.md b/src/message/label/incomplete-pr.md
@@ -0,0 +1,2 @@
+### Incomplete PR
+Your pull request is incomplete. This means that you have not filled out the PR template, which includes completing the requirements form, agreeing to our [Terms of Service](https://is-a.dev/terms), and providing a preview of your website if applicable, all of which are **mandatory**. You can find the PR template [here](https://github.com/is-a-dev/register/blob/main/.github/PULL_REQUEST_TEMPLATE.md).
diff --git a/src/message/label/incomplete-website.md b/src/message/label/incomplete-website.md
@@ -0,0 +1,4 @@
+### Incomplete Website
+This website is incomplete and has either little to no content or has placeholder text and links; please either add more content or replace the placeholder text and links. Please note that said additional content must be related to software development and must comply with our [Terms of Service](https://is-a.dev/terms).
+
+Additionally, note that we do not have very high standards for a "complete" website. Using a URL record to redirect to your GitHub account page, for example, is totally acceptable as complete and related to software development.
+\ No newline at end of file
diff --git a/src/message/label/invalid-file.md b/src/message/label/invalid-file.md
@@ -0,0 +1,2 @@
+### Invalid File
+Your file and its format is invalid and fails checks. Check that your file is in the correct directory, has a valid filename, and is valid JSON. For more information, read [our documentation on file structure](https://docs.is-a.dev/domain-structure).
+\ No newline at end of file
diff --git a/src/message/label/invalid-records.md b/src/message/label/invalid-records.md
@@ -0,0 +1,2 @@
+### Invalid Records
+One or more of your records are *invalid*. Please see [our documentation on records](https://docs.is-a.dev/domain-structure/#-records-required).
+\ No newline at end of file
diff --git a/src/message/label/invalid-social.md b/src/message/label/invalid-social.md
@@ -0,0 +1,2 @@
+### Invalid Social
+One or more of the social handles you've provided in your file(s) are invalid. Common examples include the mistake of using a GitHub noreply email or providing an account that doesn't exist, such as a nonexistent Twitter account.
+\ No newline at end of file
diff --git a/src/message/label/lowpriority.md b/src/message/label/lowpriority.md
@@ -0,0 +1,4 @@
+## Low Priority
+This pull request has been marked as "low priority" by a maintainer. This means that maintainers will prioritise reviewing and merging other pull requests over this one. As such, you will have to wait a longer period of time than others in waiting for a PR review.
+
+**Why has my pull request been marked as low priority**? The most likely reason is that you were trying to get maintainers to review and merge your PR by pinging/mentioning them (perhaps even repeatedly) on Discord or another platform. We do not appreciate this type of behavior; we (the maintainers) are volunteers, and we try our best to keep up with and review PRs *at our own pace*. Please be considerate and wait patiently for a review without bugging maintainers the next time you make a pull request.
+\ No newline at end of file
diff --git a/src/message/label/merge-conflict.md b/src/message/label/merge-conflict.md
@@ -0,0 +1,2 @@
+### Merge Conflict
+Your pull request has a merge conflict. Please either resolve them locally or redo the pull request.
+\ No newline at end of file
diff --git a/src/message/label/needs-preview.md b/src/message/label/needs-preview.md
@@ -0,0 +1,2 @@
+### Needs Preview
+It is **mandatory** to provide a preview of your website in the form of an image or a link that is accessible over HTTP(S).
+\ No newline at end of file
diff --git a/src/message/label/not-dev-related.md b/src/message/label/not-dev-related.md
@@ -0,0 +1,6 @@
+### Not Related to Software Development
+All root subdomains *must be related to software development*. This page does not appear to comply with this. Note that you may use a **nested** subdomain for practically anything, including something unrelated to software development (as long as it complies with our [Terms of Service](https://is-a.dev/terms)).
+
+A nested subdomain is a subdomain of a subdomain; e.g. `foo.bar.is-a.dev` instead of a root subdomain (`bar.is-a.dev`).
+
+You may not register a nested subdomain without owning and registering the root subdomain it is nested under.
+\ No newline at end of file
diff --git a/src/message/label/nsfw.md b/src/message/label/nsfw.md
@@ -0,0 +1,2 @@
+### NSFW
+Your webpage contains NSFW ("Not Safe For Work") content. This usually refers to pornography, gore, or other disturbing content not suitable for children. This is explicitly prohibited in our [Terms of Service](https://is-a.dev/terms).
+\ No newline at end of file
diff --git a/src/message/label/other.md b/src/message/label/other.md
@@ -0,0 +1,2 @@
+### Other
+The maintainer has a different reason as to why the pull request is invalid. Please read the maintainer's comment if you haven't done that already.
+\ No newline at end of file
diff --git a/src/message/label/tos-non-compliant.md b/src/message/label/tos-non-compliant.md
@@ -0,0 +1,2 @@
+## Not compliant to the ToS (Terms of Service)
+Your website does not comply to the [ToS](https://is-a.dev/terms). Please read the ToS to make sure the website is compliant.
+\ No newline at end of file
diff --git a/src/message/label/unauthorized.md b/src/message/label/unauthorized.md
@@ -0,0 +1,4 @@
+### Unauthorised
+You are not authorised to modify the subdomain(s) in this pull request! You are either attempting to modify a subdomain which another user owns, or attempting to register a *nested subdomain* without having registered the root subdomain first.
+
+If it is the latter scenario, please first register the root subdomain, `example.is-a.dev`, where the nested subdomain you are attempting to register here is `foo.example.is-a.dev`.
+\ No newline at end of file
diff --git a/src/message/merged.md b/src/message/merged.md
@@ -0,0 +1,36 @@
+# Pull Request Merged :tada:
+
+## What's next?
+
+Just follow the steps below and you can start using your domain!
+
+### GitHub Pages
+
+1. Navigate to your GitHub Pages repository that you want to connect with your is-a.dev domain.
+2. Click on the Settings tab.
+3. Click on the Pages link in the sidebar.
+4. In the custom domain option, enter the domain you registered.
+5. Check the Enforce HTTPS checkbox.
+6. Give your domain some time (~24 hours) for the changes to propagate.
+7. Enjoy your domain!
+
+### Vercel
+
+You may have to verify the domain so that you can successfully add the domain to your Vercel website; if you have done that already, the domain should already be connected! If it hasn't, go to the "Domains" section in your project's dashboard and click on "Refresh" to see if it works. If you need to verify the domain with Vercel then please follow our Vercel guide [here](https://docs.is-a.dev/guides/vercel/#creating-the-domain).
+
+### Cloudflare Pages
+
+If you haven't done this by now, you need to add the is-a.dev domain to your Cloudflare Pages website. To do so, navigate to your settings for the website, click on "Custom domains", **click on "Add a custom domain" instead of the other option as it will make you use NS records so that the domain can be on Cloudflare DNS**, add the is-a.dev domain that you got and you are done!
+
+### Other hosting providers
+
+Just make sure you have added the domain to your website. Try to see if there is a guide for your hosting provider at [our documentation](https://docs.is-a.dev/) to see how you can configure it. It's also a good idea to see your hosting providers' documentation to see how you can add a custom domain.
+
+### Webserver (like NGINX, Caddy, Apache and etc.)
+
+You have to add these in your webserver config by yourself. If you don't know how to add a domain to your webserver then either use a different method of hosting your website or search on a search engine on how to use the said webserver.
+
+Need help with your domain? If you have some trouble setting up your domain, please create an issue or ask in the [Discord server](https://discord.gg/is-a-dev-830872854677422150) and we will try and help you as soon as possible!
+Made a mistake in the records? Don't worry, you can create a new pull request to correct your mistakes.
+
+Thanks for reading the message and thank you for using is-a.dev! :heart:
+\ No newline at end of file
diff --git a/src/message/opened.md b/src/message/opened.md
@@ -0,0 +1,11 @@
+# Hi there! :wave:
+
+You've successfully made a pull request! Here are some steps to do while waiting for a maintainer to review the pull request:
+
+1. Check if the checks have failed or passed. You should see the status at the bottom of the pull request or a icon next to the commit ID. You can click on the 3 dots next to the "CI / Tests" check then click "View details", it will show you the logs of the tests.
+2. Check if the filename, file format, and records are valid. If you don't know if it's valid, please read [this part](https://docs.is-a.dev/domain-structure) of the documentation and use a JSON validator/formatter, like [jsonlint](https://jsonlint.com). Make sure that the file is in the `domains` directory and not somewhere else in the repository.
+3. Please make sure that you've filled out the pull request template. It is generally not a good idea to overwrite the pull request template with something else unless you know what you are doing. Make sure to add either a publicly available preview of your website or a screenshot of it.
+4. Please wait patiently. Pull requests may take between a couple hours to 3 days. All of the maintainer team are volunteers and try to review the pull requests in their spare time. If you want a chance of getting your pull request merged faster then send your pull request number **once** in the `#pull-requests` channel in our [Discord server](https://discord.gg/is-a-dev-830872854677422150) and wait patiently.
+5. Please note that mentioning maintainers in pull requests without it being reviewed could lead to you getting marked as "low priority"; this also applies to pinging the maintainers in the Discord server or messaging the maintainers in private to review the pull request.
+
+Note: if you've opened this pull request while there is a high number of other open pull requests, your wait time will be longer than usual. Please be patient!
+\ No newline at end of file
diff --git a/src/tools/numberofdays.js b/src/tools/numberofdays.js
@@ -0,0 +1,22 @@
+/**
+ * Calculates the number of days between two dates.
+ *
+ * @param {string | Date} start - The start date.
+ * @param {string | Date} end - The end date.
+ * @returns {number} The number of days between the dates.
+ */
+export function getNumberOfDays(start, end) {
+ const date1 = new Date(start);
+ const date2 = new Date(end);
+
+ // One day in milliseconds
+ const oneDay = 1000 * 60 * 60 * 24;
+
+ // Calculating the time difference between two dates
+ const diffInTime = date2.getTime() - date1.getTime();
+
+ // Calculating the number of days between two dates
+ const diffInDays = Math.round(diffInTime / oneDay);
+
+ return diffInDays;
+}
diff --git a/src/webhooks/closed.js b/src/webhooks/closed.js
@@ -0,0 +1,118 @@
+import fs from 'fs';
+import path from 'path';
+
+import { db } from '../index.js';
+
+const ignoreLabels = ['maintainer'];
+const mergedPRs = fs.readFileSync(
+ path.join(import.meta.dirname, '../message/merged.md'),
+ 'utf8'
+);
+const unremovableLabels = [
+ 'maintainer',
+ 'ci: bypass-owner-check',
+ 'no-stale',
+ 'r: william',
+];
+const reviewerUsernames = [
+ 'DEV-DIBSTER',
+ 'dragsbruh',
+ 'iostpa',
+ 'notamitgamer',
+ 'omsenjalia',
+ 'orangci',
+ 'satr14washere',
+ 'Stef-00012',
+ 'STICKnoLOGIC',
+ 'wdhdev',
+ 'Yunexiz',
+];
+
+export async function closed(
+ appOctokit,
+ prMerged,
+ repoOwner,
+ repoName,
+ repoFullName,
+ prNumber,
+ prUsername,
+ prSender
+) {
+ if (prMerged === true) {
+ const labels = await appOctokit.rest.issues.listLabelsOnIssue({
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ });
+ const allLabels = labels.data.map((label) => label.name);
+ if (ignoreLabels.some((label) => allLabels.includes(label))) {
+ return;
+ }
+ await appOctokit.rest.issues.createComment({
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ body: mergedPRs,
+ });
+ console.log(
+ `Sent a merged message to #${prNumber} on https://github.com/${repoFullName}`
+ );
+
+ // remove almost all labels if there are any
+ const listOfLabels = [];
+ const data = await appOctokit.request(
+ 'GET /repos/{owner}/{repo}/pulls/{pull_number}',
+ {
+ owner: repoOwner,
+ repo: repoName,
+ pull_number: prNumber,
+ }
+ );
+
+ const labelData = data.data.labels;
+ for (let i in labelData) {
+ if (labelData[i].name) {
+ listOfLabels.push(labelData[i].name);
+ }
+ }
+
+ for (let i in listOfLabels) {
+ if (!unremovableLabels.includes(listOfLabels[i])) {
+ await appOctokit.request(
+ 'DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}',
+ {
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ name: listOfLabels[i],
+ }
+ );
+ }
+ }
+ } else {
+ let res = await db
+ .prepare(`SELECT * FROM LIST WHERE username = ?;`)
+ .get(prUsername);
+ if (res !== undefined) {
+ let resJson = JSON.stringify(res);
+ let parsed = JSON.parse(resJson);
+ if (reviewerUsernames.includes(prSender)) {
+ await db
+ .prepare(`DELETE FROM LIST WHERE username = ?;`)
+ .run(parsed.username);
+ await appOctokit.request(
+ 'DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}',
+ {
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ name: 'status: low priority',
+ }
+ );
+ console.log(
+ `Removed #${prNumber} from https://github.com/${repoFullName} from the low priority database as well as the label.`
+ );
+ }
+ }
+ }
+}
diff --git a/src/webhooks/labeled.js b/src/webhooks/labeled.js
@@ -0,0 +1,169 @@
+import fs from 'fs';
+import path from 'path';
+
+import { db } from '../index.js';
+
+const reasonLabels = [
+ 'reason: abuse risk',
+ 'reason: commercial usage',
+ 'reason: impersonation',
+ 'reason: inaccessible website',
+ 'reason: incomplete pr',
+ 'reason: incomplete website',
+ 'reason: invalid file',
+ 'reason: invalid records',
+ 'reason: invalid social',
+ 'reason: merge conflict',
+ 'reason: not dev related',
+ 'reason: nsfw',
+ 'reason: other',
+ 'reason: unauthorized',
+ 'reason: incompatible records',
+ 'reason: tos non-compliant',
+];
+const lowPriorityMessage = fs.readFileSync(
+ path.join(import.meta.dirname, '../message/label/lowpriority.md'),
+ 'utf8'
+);
+
+export async function labeled(
+ appOctokit,
+ prLabelName,
+ repoOwner,
+ repoName,
+ repoFullName,
+ prNumber,
+ prUpdatedAt,
+ prUsername
+) {
+ let denied, invalid, lowpriority;
+ if (prLabelName === 'status: denied') {
+ denied = true;
+ } else if (prLabelName === 'status: invalid') {
+ invalid = true;
+ } else if (prLabelName === 'status: low priority') {
+ lowpriority = true;
+ }
+
+ if (denied === true || invalid === true) {
+ const listOfLabels = [];
+ // timeout so that it creates a little time window for the maintainer to add the rest of the labels
+ await new Promise((resolve) => setTimeout(resolve, 5000));
+ const data = await appOctokit.request(
+ 'GET /repos/{owner}/{repo}/pulls/{pull_number}',
+ {
+ owner: repoOwner,
+ repo: repoName,
+ pull_number: prNumber,
+ }
+ );
+ const labelData = data.data.labels;
+ for (let i in labelData) {
+ if (labelData[i].name) {
+ listOfLabels.push(labelData[i].name);
+ }
+ }
+
+ // start adding the messages
+ const allMessages = [];
+ for (let i in listOfLabels) {
+ if (reasonLabels.includes(listOfLabels[i])) {
+ let initialReason = listOfLabels[i]
+ .toString()
+ .replace(/reason:\s/i, '');
+ let finalReason = initialReason.replace(/\s+/g, '-');
+ let message = fs.readFileSync(
+ path.join(
+ import.meta.dirname,
+ `../message/label/${finalReason}.md`
+ ),
+ 'utf8'
+ );
+ allMessages.push(message);
+ } else if (listOfLabels[i] === 'status: needs preview') {
+ let message = fs.readFileSync(
+ path.join(
+ import.meta.dirname,
+ `../message/label/needs-preview.md`
+ ),
+ 'utf8'
+ );
+ allMessages.push(message);
+ }
+ }
+
+ const labelMessages = allMessages.join('\n\n');
+ let body;
+ if (!labelMessages.length) {
+ body = fs.readFileSync(
+ path.join(import.meta.dirname, `../message/invalidnolabel.md`),
+ 'utf8'
+ );
+ } else {
+ body = `
+# Invalid Pull Request
+
+This pull request is invalid due to the following reason(s):
+
+---
+${labelMessages}
+
+---
+
+If you need any help, please create an issue or ask our team in the [Discord server](https://discord.gg/is-a-dev-830872854677422150)
+
+`;
+ }
+ await appOctokit.rest.issues.createComment({
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ body: body,
+ });
+ console.log(
+ `Sent reason messages at #${prNumber} from https://github.com/${repoFullName}`
+ );
+ if (denied === true) {
+ await appOctokit.request(
+ 'PATCH /repos/{owner}/{repo}/pulls/{pull_number}',
+ {
+ owner: repoOwner,
+ repo: repoName,
+ pull_number: prNumber,
+ state: 'closed',
+ }
+ );
+ console.log(
+ `Closed pull request at #${prNumber} from https://github.com/${repoFullName}`
+ );
+ }
+ } else if (lowpriority === true) {
+ let res = await db
+ .prepare(`SELECT * FROM LIST WHERE username = ?;`)
+ .get(prUsername);
+ let resString = JSON.stringify(res);
+ if (resString === undefined) {
+ await appOctokit.rest.issues.createComment({
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ body: lowPriorityMessage,
+ });
+ console.log(
+ `Sent low priority message to #${prNumber} from https://github.com/${repoFullName}`
+ );
+ await db
+ .prepare(`INSERT INTO LIST VALUES (?, ?, ?, ?, ?);`)
+ .run(
+ prUsername,
+ `${prNumber}`,
+ prUpdatedAt,
+ repoOwner,
+ repoName
+ );
+ console.log(
+ `Logged #${prNumber} from https://github.com/${repoFullName} to the low priority database.`
+ );
+ }
+ }
+}
diff --git a/src/webhooks/opened.js b/src/webhooks/opened.js
@@ -0,0 +1,130 @@
+import fs from 'fs';
+import path from 'path';
+
+import { db, numberOfDays } from '../index.js';
+import { getNumberOfDays } from '../tools/numberofdays.js';
+
+const ignoreLabels = ['maintainer'];
+const newPRs = fs.readFileSync(
+ path.join(import.meta.dirname, '../message/opened.md'),
+ 'utf8'
+);
+const draftPRs = fs.readFileSync(
+ path.join(import.meta.dirname, '../message/draft.md'),
+ 'utf8'
+);
+
+// https://docs.github.com/en/webhooks/webhook-events-and-payloads#pull_request
+export async function opened(
+ appOctokit,
+ repoOwner,
+ repoName,
+ repoFullName,
+ prNumber,
+ prCreatedAt,
+ prUsername,
+ prDraft
+) {
+ console.log(
+ `Received a open pull request event for #${prNumber} on https://github.com/${repoFullName}`
+ );
+ const labels = await appOctokit.rest.issues.listLabelsOnIssue({
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ });
+ const allLabels = labels.data.map((label) => label.name);
+ if (ignoreLabels.some((label) => allLabels.includes(label))) {
+ console.log(
+ `#${prNumber} from https://github.com/${repoFullName} is by a maintainer, skipping pull request.`
+ );
+ return;
+ }
+ if (prDraft === true) {
+ await appOctokit.rest.issues.createComment({
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ body: draftPRs,
+ });
+ console.log(
+ `Sent a draft message to #${prNumber} on https://github.com/${repoFullName}`
+ );
+ } else {
+ await appOctokit.rest.issues.createComment({
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ body: newPRs,
+ });
+ console.log(
+ `Sent a opened message to #${prNumber} on https://github.com/${repoFullName}`
+ );
+ }
+ // low priority check
+ let res = await db
+ .prepare(`SELECT * FROM LIST WHERE username = ?;`)
+ .get(prUsername);
+ if (res !== undefined) {
+ let resJson = JSON.stringify(res);
+ let parsed = JSON.parse(resJson);
+ let date = new Date();
+ if (
+ parsed.username === prUsername &&
+ getNumberOfDays(parsed.time, date) <= numberOfDays
+ ) {
+ let lowPriority = `
+# Low priority
+
+You're attempting to create a new pull request to bypass the low priority label placed on your previous pull request, #${parsed.prnumber}. Unfortunately, we've noticed this attempt, and we're applying the label you were trying to escape on this pull request, too.
+
+If you think this is a mistake then please contact [iostpa](https://github.com/iostpa).
+ `;
+ await appOctokit.request(
+ 'POST /repos/{owner}/{repo}/issues/{issue_number}/labels',
+ {
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ labels: ['status: low priority'],
+ }
+ );
+ await appOctokit.rest.issues.createComment({
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ body: lowPriority,
+ });
+ await db
+ .prepare(`UPDATE LIST SET prnumber = ? WHERE prnumber = ?;`)
+ .run(`${prNumber}`, `${parsed.prnumber}`);
+ await db
+ .prepare(`UPDATE LIST SET time = ? WHERE prnumber = ?;`)
+ .run(prCreatedAt, `${prNumber}`);
+ console.log(
+ `Auto-added, replaced with new PR number and sent low priority message to #${prNumber} on https://github.com/${repoFullName} because it was found in the database.`
+ );
+ } else if (
+ parsed.username === prUsername &&
+ getNumberOfDays(parsed.time, date) >= numberOfDays
+ ) {
+ await appOctokit.request(
+ 'DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}',
+ {
+ owner: repoOwner,
+ repo: repoName,
+ issue_number: prNumber,
+ name: 'status: low priority',
+ }
+ );
+ await db
+ .prepare(`DELETE FROM LIST WHERE username = ?;`)
+ .run(parsed.username);
+ console.log(
+ `Removed #${prNumber} from https://github.com/${repoFullName} from the low priority database as well as the label.`
+ );
+ }
+ } else if (res === undefined) {
+ return;
+ }
+}
diff --git a/src/webhooks/unlabeled.js b/src/webhooks/unlabeled.js
@@ -0,0 +1,17 @@
+import { db } from '../index.js';
+
+export async function unlabeled(labelName, username, prNumber, repoFullName) {
+ if (labelName === 'status: low priority') {
+ let res = await db
+ .prepare(`SELECT * FROM LIST WHERE username = ?;`)
+ .get(username);
+ if (res !== undefined) {
+ await db
+ .prepare(`DELETE FROM LIST WHERE username = ?;`)
+ .run(username);
+ console.log(
+ `Removed #${prNumber} from https://github.com/${repoFullName} from the low priority database.`
+ );
+ }
+ }
+}