reviewbot

Source code for the is-a.dev r...
Log | Files | Refs | README | LICENSE

commit 21008063a53d8ebcb462b84346ce81fabf3f66d4
parent 7322a77ddd9166af81222569838beebde5f8a713
Author: iostpa <iostpa@iostpa.com>
Date:   Sun, 28 Jun 2026 18:05:17 +0300

v1.6.0 (#66)

* chore(): move from MariaDB to SQLite

* fix(): some unremovable labels keep getting removed

* v1.6.0
Diffstat:
M.env.example | 8++------
M.github/dependabot.yml | 6+++---
M.gitignore | 1+
Mdocker-compose.yml | 17++---------------
Mpackage.json | 9+++++----
Mpnpm-lock.yaml | 558++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Apnpm-workspace.yaml | 2++
Msrc/index.js | 37++++++++++++++++++-------------------
Msrc/webhooks/closed.js | 149++++++++++++++++++++++++++++++++++++-------------------------------------------
Msrc/webhooks/labeled.js | 49++++++++++++++++++++++---------------------------
Msrc/webhooks/opened.js | 174++++++++++++++++++++++++++++++++++++++-----------------------------------------
Msrc/webhooks/unlabeled.js | 32+++++++++++---------------------
12 files changed, 670 insertions(+), 372 deletions(-)

diff --git a/.env.example b/.env.example @@ -1,12 +1,8 @@ NODE_ENV="production" APP_ID="" -PRIVATE_KEY_PATH="private-key.pem" +PRIVATE_KEY_PATH="./data/private-key.pem" +DB_PATH="./data/reviewbot.db" WEBHOOK_SECRET="" SENTRY="" PORT="3000" INSTALLATION_ID="" -SQL_HOST="" -SQL_PORT="" -SQL_USER="" -SQL_PASSWORD="" -SQL_DB_NAME="" diff --git a/.github/dependabot.yml b/.github/dependabot.yml @@ -12,9 +12,9 @@ updates: patterns: - "*" cooldown: - semver-major-days: 14 # Waits 14 days before updating major versions - semver-minor-days: 7 # Waits 7 days before updating minor versions - semver-patch-days: 3 # Waits 3 days before updating patch versions + 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" diff --git a/.gitignore b/.gitignore @@ -25,3 +25,4 @@ dist-ssr *.sw? private-key.pem +data diff --git a/docker-compose.yml b/docker-compose.yml @@ -1,17 +1,4 @@ services: - mariadb: - ports: - - "3306:3306" - image: mariadb:12 - restart: always - volumes: - - "./database:/var/lib/mysql" - environment: - MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}" - MYSQL_DATABASE: "${MYSQL_DATABASE}" - MYSQL_USER: "${MYSQL_USER}" - MYSQL_PASSWORD: "${MYSQL_PASSWORD}" - env_file: ".db.env" reviewbot: image: ghcr.io/iostpa/reviewbot:latest restart: always @@ -19,4 +6,4 @@ services: ports: - "3000:3000" volumes: - - ./private-key.pem:/app/private-key.pem:ro # read-only- \ No newline at end of file + - ./data:/app/data+ \ No newline at end of file diff --git a/package.json b/package.json @@ -1,7 +1,7 @@ { "name": "reviewbot", "private": true, - "version": "1.5.2", + "version": "1.6.0", "type": "module", "description": "An app to assist in the review process of is-a-dev", "author": "iostpa", @@ -12,8 +12,8 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", - "eslint": "^10.4.1", - "globals": "^17.6.0", + "eslint": "^10.6.0", + "globals": "^17.7.0", "prettier": "3.8.4", "smee-client": "^5.0.0" }, @@ -22,7 +22,8 @@ "@octokit/auth-app": "^8.2.0", "@octokit/core": "^7.0.6", "@octokit/webhooks": "^14.2.0", - "@sentry/node": "^10.57.0", + "@sentry/node": "^10.62.0", + "better-sqlite3": "^12.11.1", "cron": "^4.4.0", "dotenv": "^17.4.2", "fastify": "^5.8.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml @@ -21,8 +21,11 @@ importers: specifier: ^14.2.0 version: 14.2.0 '@sentry/node': - specifier: ^10.57.0 - version: 10.57.0 + specifier: ^10.62.0 + version: 10.62.0(@opentelemetry/core@2.8.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 @@ -41,13 +44,13 @@ importers: devDependencies: '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.4.1) + version: 10.0.1(eslint@10.6.0) eslint: - specifier: ^10.4.1 - version: 10.4.1 + specifier: ^10.6.0 + version: 10.6.0 globals: - specifier: ^17.6.0 - version: 17.6.0 + specifier: ^17.7.0 + version: 17.7.0 prettier: specifier: 3.8.4 version: 3.8.4 @@ -57,6 +60,17 @@ importers: 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.0': + resolution: {integrity: sha512-2/Z3NTewJTruUkmsSnBC5bJlLNUd9keuD1OLlTEpim4FyLhm6m2Rnfv+wrFdUvFfhmH8CRdiDZBqBrn+wyaGuA==} + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -137,6 +151,9 @@ packages: 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'} @@ -252,8 +269,8 @@ packages: resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} - '@opentelemetry/core@2.7.1': - resolution: {integrity: sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==} + '@opentelemetry/core@2.8.0': + resolution: {integrity: sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -264,14 +281,14 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/resources@2.7.1': - resolution: {integrity: sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==} + '@opentelemetry/resources@2.8.0': + resolution: {integrity: sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-base@2.7.1': - resolution: {integrity: sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==} + '@opentelemetry/sdk-trace-base@2.8.0': + resolution: {integrity: sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' @@ -283,16 +300,16 @@ packages: '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} - '@sentry-internal/server-utils@10.57.0': - resolution: {integrity: sha512-Qu8ETmX/ITzteG7Im46b9HOxKKzeaIeqNvftaIlFURu1RUQdHbtGerS7QOmXzwnhuqNGNeiCQYkduB798IfRqA==} - engines: {node: '>=18'} + '@sentry/conventions@0.12.0': + resolution: {integrity: sha512-z1JQrl/1SLY+8wpzvork6vl+fpsg/oCCxM7HWWhUnI/R+OGNyoIzieQuggX3uUMY7NBtp8UWCQx6FeFazzOF9g==} + engines: {node: '>=14'} - '@sentry/core@10.57.0': - resolution: {integrity: sha512-kntItTA2kiT0YpL7encXaF6mkdZMB+y48lwj8w1wkfBpfJAC7sifdgrzLQZqmsqVNE3crg9VfufaAGA+78uFMg==} + '@sentry/core@10.62.0': + resolution: {integrity: sha512-tV69fMg2sS5DUFmQSnS7Jd5qJAp0izxwcsvBVz2ieTM9VMRi99IfOSYW9UYr3p1yfuksk41kefN5PEbeedUE+A==} engines: {node: '>=18'} - '@sentry/node-core@10.57.0': - resolution: {integrity: sha512-2v2IF6MfTiu7pimWEq2rYhZsmlwyNbs3bHUsrYFPeP/Rpa6ObDuUWPdVEzJjfyK+AqqYZYxZdV0l3+B13kTEmQ==} + '@sentry/node-core@10.62.0': + resolution: {integrity: sha512-V7rDgbxViiHU0OpcFEDp3l41IFvWTasKHfXw8SQ6yIgtZ8VpFqmz2TR5N7X85iIOmWIvK5HV0yp0eDdsly0+rA==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -300,7 +317,6 @@ packages: '@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 - '@opentelemetry/semantic-conventions': ^1.39.0 peerDependenciesMeta: '@opentelemetry/api': optional: true @@ -312,21 +328,22 @@ packages: optional: true '@opentelemetry/sdk-trace-base': optional: true - '@opentelemetry/semantic-conventions': - optional: true - '@sentry/node@10.57.0': - resolution: {integrity: sha512-7KEStrJ97wPf1fA5nU5ONeTTcIIlh7oT8OMffEVA1PXmlhFoXhcQZVzr4rM+zj9tfMWT01og5Ng/Grgh3dN+FA==} + '@sentry/node@10.62.0': + resolution: {integrity: sha512-4hoU67bJY0o3irEDMZu2UIztAOsvEqFkLXA7EUKl1LXMA3Ba1Lb32OUVqlsTypiEInSDs/BtM+aAFKojZ3P3Fw==} engines: {node: '>=18'} - '@sentry/opentelemetry@10.57.0': - resolution: {integrity: sha512-iwRz8cEK0GOISG34aJRO8GdYOk3nfpuT6dT2GDQrxw8f7JjkJKx9LPU8MaenOFa4MhY+Z02hI6NNcrbsoI3cXg==} + '@sentry/opentelemetry@10.62.0': + resolution: {integrity: sha512-nFwBgtjfwgY8P5lAuQFWfAsQW1MXxuQ6kR/HtBs+A6julqwGGS2QnQ65OCWMzz6IqDEL/pRgT1405/gU+OXU3A==} 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 - '@opentelemetry/semantic-conventions': ^1.39.0 + + '@sentry/server-utils@10.62.0': + resolution: {integrity: sha512-S5szsj6kKBhxw97b2HA98fYp/PpWXvSizlisEzb2rnL4IH6RAJ8wP05/fnth8pSywTH+gtUu+i6Wn8e8rX5HvA==} + engines: {node: '>=18'} '@types/aws-lambda@8.10.162': resolution: {integrity: sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==} @@ -343,11 +360,11 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/luxon@3.7.1': - resolution: {integrity: sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg==} + '@types/luxon@3.7.2': + resolution: {integrity: sha512-gW+Oib+vUtGJBtNC8V9Reww0oIpusw+4m81uncg9REGZAJfqOQHfo/nkabnc7w0QReXyPqjrbWMJk6NuAkiX3Q==} - '@types/node@25.9.2': - resolution: {integrity: sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==} + '@types/node@26.0.1': + resolution: {integrity: sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==} abstract-logging@2.0.1: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} @@ -362,8 +379,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true @@ -381,6 +398,10 @@ packages: 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'} @@ -392,9 +413,22 @@ packages: 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==} @@ -402,6 +436,12 @@ packages: 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==} @@ -430,6 +470,14 @@ packages: 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==} @@ -441,10 +489,20 @@ packages: 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.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -461,8 +519,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.4.1: - resolution: {integrity: sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==} + eslint@10.6.0: + resolution: {integrity: sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -499,6 +557,10 @@ packages: 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==} @@ -533,6 +595,9 @@ packages: 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'} @@ -548,30 +613,45 @@ packages: 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.6.0: - resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} + 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.0.2: - resolution: {integrity: sha512-LGLYRl0A2gtyUJb2WDliBHmk6TtlHwdDjxonacZ8QrEs/ZW+YDgNv2QAfjRQWpS8HqvNcq6GGnN6jrOa5FysDQ==} + import-in-the-middle@3.2.0: + resolution: {integrity: sha512-vR2B6HKIhaBjcZr2bLpFiJ1VbzOlRQ7aby4/gw5WPIzToLjqpfWw3VJ4sk1uDchoOODEirvO2jyrSPtUSL5CrQ==} 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'} @@ -627,23 +707,47 @@ packages: 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'} @@ -652,6 +756,9 @@ packages: 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'} @@ -685,6 +792,12 @@ packages: 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'} @@ -700,6 +813,9 @@ packages: 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'} @@ -707,6 +823,14 @@ packages: 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'} @@ -733,6 +857,9 @@ packages: 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 @@ -747,8 +874,11 @@ packages: secure-json-parse@4.1.0: resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} - semver@7.8.4: - resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} + semifies@1.0.0: + resolution: {integrity: sha512-xXR3KGeoxTNWPD4aBvL5NUpMTT7WMANr3EWnaS190QVkY52lqqcVRD7Q05UVbBhiWDGWMlJEUam9m7uFFGVScw==} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -763,6 +893,12 @@ packages: 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} @@ -771,10 +907,28 @@ packages: 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'} @@ -783,15 +937,18 @@ packages: resolution: {integrity: sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==} 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@7.24.6: - resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} - undici@7.27.2: - resolution: {integrity: sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==} + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} engines: {node: '>=20.18.1'} universal-github-app-jwt@2.2.2: @@ -803,6 +960,9 @@ packages: 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'} @@ -812,15 +972,42 @@ packages: 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: - '@eslint-community/eslint-utils@4.9.1(eslint@10.4.1)': + '@apm-js-collab/code-transformer-bundler-plugins@0.5.0': + dependencies: + '@apm-js-collab/code-transformer': 0.15.0 + es-module-lexer: 2.1.0 + 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.0': + 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.4.1 + eslint: 10.6.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -841,9 +1028,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.4.1)': + '@eslint/js@10.0.1(eslint@10.6.0)': optionalDependencies: - eslint: 10.4.1 + eslint: 10.6.0 '@eslint/object-schema@3.0.5': {} @@ -899,6 +1086,8 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@octokit/app@16.1.2': dependencies: '@octokit/auth-app': 8.2.0 @@ -1053,7 +1242,7 @@ snapshots: '@opentelemetry/api@1.9.1': {} - '@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1)': + '@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/semantic-conventions': 1.41.1 @@ -1062,69 +1251,78 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/api-logs': 0.214.0 - import-in-the-middle: 3.0.2 + import-in-the-middle: 3.2.0 require-in-the-middle: 8.0.1 transitivePeerDependencies: - supports-color - '@opentelemetry/resources@2.7.1(@opentelemetry/api@1.9.1)': + '@opentelemetry/resources@2.8.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 - '@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1)': + '@opentelemetry/sdk-trace-base@2.8.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 '@opentelemetry/semantic-conventions@1.41.1': {} '@pinojs/redact@0.4.0': {} - '@sentry-internal/server-utils@10.57.0': - dependencies: - '@sentry/core': 10.57.0 + '@sentry/conventions@0.12.0': {} - '@sentry/core@10.57.0': {} + '@sentry/core@10.62.0': {} - '@sentry/node-core@10.57.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1)': + '@sentry/node-core@10.62.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.8.0(@opentelemetry/api@1.9.1))': dependencies: - '@sentry/core': 10.57.0 - '@sentry/opentelemetry': 10.57.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1) - import-in-the-middle: 3.0.2 + '@sentry/conventions': 0.12.0 + '@sentry/core': 10.62.0 + '@sentry/opentelemetry': 10.62.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.8.0(@opentelemetry/api@1.9.1)) + import-in-the-middle: 3.2.0 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) - '@sentry/node@10.57.0': + '@sentry/node@10.62.0(@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1))': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) '@opentelemetry/instrumentation': 0.214.0(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) '@opentelemetry/semantic-conventions': 1.41.1 - '@sentry-internal/server-utils': 10.57.0 - '@sentry/core': 10.57.0 - '@sentry/node-core': 10.57.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1) - '@sentry/opentelemetry': 10.57.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1) - import-in-the-middle: 3.0.2 + '@sentry/core': 10.62.0 + '@sentry/node-core': 10.62.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.214.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.8.0(@opentelemetry/api@1.9.1)) + '@sentry/opentelemetry': 10.62.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.8.0(@opentelemetry/api@1.9.1)) + '@sentry/server-utils': 10.62.0 + import-in-the-middle: 3.2.0 transitivePeerDependencies: + - '@opentelemetry/core' - '@opentelemetry/exporter-trace-otlp-http' - supports-color - '@sentry/opentelemetry@10.57.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.41.1)': + '@sentry/opentelemetry@10.62.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.8.0(@opentelemetry/api@1.9.1))': dependencies: '@opentelemetry/api': 1.9.1 - '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/sdk-trace-base': 2.7.1(@opentelemetry/api@1.9.1) - '@opentelemetry/semantic-conventions': 1.41.1 - '@sentry/core': 10.57.0 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + '@sentry/conventions': 0.12.0 + '@sentry/core': 10.62.0 + + '@sentry/server-utils@10.62.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.0 + '@sentry/conventions': 0.12.0 + '@sentry/core': 10.62.0 + magic-string: 0.30.21 + transitivePeerDependencies: + - supports-color '@types/aws-lambda@8.10.162': {} @@ -1136,23 +1334,23 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/luxon@3.7.1': {} + '@types/luxon@3.7.2': {} - '@types/node@25.9.2': + '@types/node@26.0.1': dependencies: - undici-types: 7.24.6 + undici-types: 8.3.0 abstract-logging@2.0.1: {} - acorn-import-attributes@1.9.5(acorn@8.16.0): + acorn-import-attributes@1.9.5(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 - acorn-jsx@5.3.2(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 - acorn@8.16.0: {} + acorn@8.17.0: {} ajv-formats@3.0.1(ajv@8.20.0): optionalDependencies: @@ -1172,6 +1370,8 @@ snapshots: 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: @@ -1181,14 +1381,38 @@ snapshots: 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: {} @@ -1197,7 +1421,7 @@ snapshots: cron@4.4.0: dependencies: - '@types/luxon': 3.7.1 + '@types/luxon': 3.7.2 luxon: 3.7.2 cross-spawn@7.0.6: @@ -1210,14 +1434,28 @@ snapshots: 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.1.0: {} + escape-string-regexp@4.0.0: {} eslint-scope@9.1.2: @@ -1231,9 +1469,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.4.1: + eslint@10.6.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1) + '@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 @@ -1268,8 +1506,8 @@ snapshots: espree@11.2.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 5.0.1 esquery@1.7.0: @@ -1290,6 +1528,8 @@ snapshots: dependencies: eventsource-parser: 3.1.0 + expand-template@2.0.3: {} + fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {} @@ -1330,7 +1570,7 @@ snapshots: process-warning: 5.0.0 rfdc: 1.4.1 secure-json-parse: 4.1.0 - semver: 7.8.4 + semver: 7.8.5 toad-cache: 3.7.1 fastq@1.20.1: @@ -1341,6 +1581,8 @@ snapshots: 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 @@ -1359,27 +1601,37 @@ snapshots: 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.6.0: {} + 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.0.2: + import-in-the-middle@3.2.0: dependencies: - acorn: 8.16.0 - acorn-import-attributes: 1.9.5(acorn@8.16.0) + acorn: 8.17.0 + acorn-import-attributes: 1.9.5(acorn@8.17.0) cjs-module-lexer: 2.2.0 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: {} @@ -1427,24 +1679,42 @@ snapshots: 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': 25.9.2 + '@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 @@ -1461,6 +1731,10 @@ snapshots: 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 @@ -1504,6 +1778,21 @@ snapshots: 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.8.4: {} @@ -1512,10 +1801,28 @@ snapshots: 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: {} @@ -1535,6 +1842,8 @@ snapshots: rfdc@1.4.1: {} + safe-buffer@5.2.1: {} + safe-regex2@5.1.1: dependencies: ret: 0.5.0 @@ -1545,7 +1854,9 @@ snapshots: secure-json-parse@4.1.0: {} - semver@7.8.4: {} + semifies@1.0.0: {} + + semver@7.8.5: {} set-cookie-parser@2.7.2: {} @@ -1555,30 +1866,65 @@ snapshots: 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.27.2 + 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: {} + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - undici-types@7.24.6: {} + undici-types@8.3.0: {} - undici@7.27.2: {} + undici@7.28.0: {} universal-github-app-jwt@2.2.2: {} @@ -1588,10 +1934,14 @@ snapshots: 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/src/index.js b/src/index.js @@ -12,7 +12,7 @@ import { unlabeled } from './webhooks/unlabeled.js'; import { opened } from './webhooks/opened.js'; import { closed } from './webhooks/closed.js'; import { labeled } from './webhooks/labeled.js'; -import { createPool } from 'mariadb'; +import Database from 'better-sqlite3'; // Load environment variables from .env file dotenv.config(); @@ -37,16 +37,18 @@ Sentry.init({ }); // Database -// Following order of columns: username, prnumber, time, repoowner, repo -export const pool = createPool({ - user: process.env.SQL_USER, - password: process.env.SQL_PASSWORD, - host: process.env.SQL_HOST, - port: process.env.SQL_PORT, - database: process.env.SQL_DB_NAME, - ssl: false, - connectionLimit: 5, -}); + +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({ @@ -83,18 +85,16 @@ let job = new CronJob( '0 * * * *', // cronTime 0 * * * * async function () { let date = new Date(); - let conn; try { - conn = await pool.getConnection(); - let res = await conn.query(`SELECT * FROM LIST`); + 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 conn.query(`DELETE FROM LIST WHERE time=(?)`, [ - parsed[i].time, - ]); + await db + .prepare(`DELETE FROM LIST WHERE time = ?`) + .run(parsed[i].time); await appOctokit.request( 'DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}', { @@ -122,8 +122,6 @@ let job = new CronJob( } else { console.error(error); } - } finally { - if (conn) conn.end(); } }, // onTick null, // onComplete @@ -139,6 +137,7 @@ app.webhooks.on('pull_request.opened', async ({ payload }) => { 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 ); diff --git a/src/webhooks/closed.js b/src/webhooks/closed.js @@ -1,4 +1,4 @@ -import { pool } from '../index.js'; +import { db } from '../index.js'; import fs from 'fs'; import path from 'path'; @@ -37,96 +37,81 @@ export async function closed( prUsername, prSender ) { - let conn; - try { - if (prMerged === true) { - const labels = await appOctokit.rest.issues.listLabelsOnIssue({ + 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, - issue_number: prNumber, - }); - const allLabels = labels.data.map((label) => label.name); - if (ignoreLabels.some((label) => allLabels.includes(label))) { - return; + pull_number: prNumber, } - 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); - } + 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 (!listOfLabels.includes(unremovableLabels)) { - await appOctokit.request( - 'DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}', - { - owner: repoOwner, - repo: repoName, - issue_number: prNumber, - name: listOfLabels[i], - } - ); - } else if (listOfLabels[i] == 'status: low priority') { - return; - } else if (unremovableLabels.includes(listOfLabels[i])) { - return; - } + 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], + } + ); } - console.log( - `Removed all labels from #${prNumber} on https://github.com/${repoFullName}` - ); - } else { - conn = await pool.getConnection(); - let res = await conn.query( - `SELECT * FROM LIST WHERE username=(?)`, - [prUsername] - ); + } + } else { + let res = await db + .prepare(`SELECT * FROM LIST WHERE username = ?;`) + .get(prUsername); + if (res !== undefined) { let resJson = JSON.stringify(res); - if (resJson !== '[]') { - let parsed = JSON.parse(resJson); - if (reviewerUsernames.includes(prSender)) { - res = await conn.query( - 'DELETE FROM LIST WHERE username=(?)', - [parsed[0].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.` - ); - } + 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.` + ); } } - } finally { - if (conn) conn.end(); } } diff --git a/src/webhooks/labeled.js b/src/webhooks/labeled.js @@ -1,4 +1,4 @@ -import { pool } from '../index.js'; +import { db } from '../index.js'; import fs from 'fs'; import path from 'path'; @@ -137,37 +137,32 @@ If you need any help, please create an issue or ask our team in the [Discord ser ); } } else if (lowpriority === true) { - let conn; - try { - conn = await pool.getConnection(); - let res = await conn.query( - `SELECT * FROM LIST WHERE username=(?)`, - [prUsername] + 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}` ); - let resJson = JSON.stringify(res); - if (resJson === '[]') { - 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 conn.query('INSERT INTO LIST VALUES (?, ?, ?, ?, ?)', [ + await db + .prepare(`INSERT INTO LIST VALUES (?, ?, ?, ?, ?);`) + .run( prUsername, - prNumber, + `${prNumber}`, prUpdatedAt, repoOwner, - repoName, - ]); - console.log( - `Logged #${prNumber} from https://github.com/${repoFullName} to the low priority database.` + repoName ); - } - } finally { - if (conn) conn.end(); + 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 @@ -1,4 +1,4 @@ -import { pool, numberOfDays } from '../index.js'; +import { db, numberOfDays } from '../index.js'; import { getNumberOfDays } from '../tools/numberofdays.js'; import fs from 'fs'; import path from 'path'; @@ -27,111 +27,103 @@ export async function opened( console.log( `Received a open pull request event for #${prNumber} on https://github.com/${repoFullName}` ); - let conn; - try { - const labels = await appOctokit.rest.issues.listLabelsOnIssue({ + 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, }); - 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}` + 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'], + } ); - } else { await appOctokit.rest.issues.createComment({ owner: repoOwner, repo: repoName, issue_number: prNumber, - body: newPRs, + 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( - `Sent a opened message to #${prNumber} on https://github.com/${repoFullName}` + `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.` ); - } - // low priority check - conn = await pool.getConnection(); - let res = await conn.query(`SELECT * FROM LIST WHERE username=(?)`, [ - prUsername, - ]); - let resJson = JSON.stringify(res); - if (resJson !== '[]') { - let parsed = JSON.parse(resJson); - let date = new Date(); - if ( - parsed[0].username === prUsername && - getNumberOfDays(parsed[0].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[0].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({ + } 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, - body: lowPriority, - }); - await conn.query( - `UPDATE LIST SET prnumber=(?) WHERE prnumber=(?)`, - [prNumber, parsed[0].prnumber] - ); - await conn.query( - `UPDATE LIST SET time=(?) WHERE prnumber=(?)`, - [prCreatedAt, parsed[0].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[0].username === prUsername && - getNumberOfDays(parsed[0].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', - } - ); - res = await conn.query('DELETE FROM LIST WHERE username=(?)', [ - parsed[0].username, - ]); - console.log( - `Removed #${prNumber} from https://github.com/${repoFullName} from the low priority database as well as the label.` - ); - } - } else if (resJson === '[]') { - return; + 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.` + ); } - } finally { - if (conn) conn.end(); + } else if (res === undefined) { + return; } } diff --git a/src/webhooks/unlabeled.js b/src/webhooks/unlabeled.js @@ -1,27 +1,17 @@ -import { pool } from '../index.js'; +import { db } from '../index.js'; export async function unlabeled(labelName, username, prNumber, repoFullName) { - let conn; - try { - if (labelName === 'status: low priority') { - conn = await pool.getConnection(); - let res = await conn.query( - `SELECT * FROM LIST WHERE username=(?)`, - [username] + 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.` ); - let resJson = JSON.stringify(res); - if (resJson !== '[]') { - res = await conn.query('DELETE FROM LIST WHERE username=(?)', [ - username, - ]); - console.log( - `Removed #${prNumber} from https://github.com/${repoFullName} from the low priority database.` - ); - } else { - return; - } } - } finally { - if (conn) conn.end(); } }
© notamitgamer • Site Built: 2026-07-21 13:58:23 UTC • git-mirror commit: 1037f62 [view raw info]
Originally created with stagit • modified by notamitgamer
Forked from github.com/notamitgamer/git-mirror