diff --git a/packages/backend/eslint.config.mjs b/packages/backend/eslint.config.mjs new file mode 100644 index 00000000..1992297b --- /dev/null +++ b/packages/backend/eslint.config.mjs @@ -0,0 +1,21 @@ +// @ts-check + +import eslint from '@eslint/js'; +import { defineConfig } from 'eslint/config'; +import tseslint from 'typescript-eslint'; + +export default defineConfig( + eslint.configs.recommended, + tseslint.configs.recommendedTypeChecked, + { + // @see: https://typescript-eslint.io/getting-started/typed-linting/ + languageOptions: { + parserOptions: { + projectService: true, + }, + }, + rules: { + "@typescript-eslint/no-floating-promises": "error" + }, + } +); diff --git a/packages/backend/package.json b/packages/backend/package.json index 8b0659d2..16b61c4e 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -8,17 +8,21 @@ "dev:watch": "tsc-watch --preserveWatchOutput --onSuccess \"yarn dev\"", "dev": "node ./dist/index.js", "build": "tsc", - "test": "cross-env SKIP_ENV_VALIDATION=1 vitest --config ./vitest.config.ts" + "test": "cross-env SKIP_ENV_VALIDATION=1 vitest --config ./vitest.config.ts", + "lint": "eslint ." }, "devDependencies": { + "@eslint/js": "^9.39.0", "@types/argparse": "^2.0.16", "@types/micromatch": "^4.0.9", "@types/node": "^22.7.5", "cross-env": "^7.0.3", + "eslint": "^9.39.0", "json-schema-to-typescript": "^15.0.4", "tsc-watch": "^6.2.0", "tsx": "^4.19.1", - "typescript": "^5.6.2", + "typescript": "^5.9.3", + "typescript-eslint": "^8.46.2", "vitest": "^2.1.9" }, "dependencies": { diff --git a/packages/backend/src/connectionManager.ts b/packages/backend/src/connectionManager.ts index 006a3bf2..b0b9b998 100644 --- a/packages/backend/src/connectionManager.ts +++ b/packages/backend/src/connectionManager.ts @@ -65,7 +65,7 @@ export class ConnectionManager { this.worker.on('error', this.onWorkerError.bind(this)); } - public startScheduler() { + public async startScheduler() { logger.debug('Starting scheduler'); this.interval = setInterval(async () => { const thresholdDate = new Date(Date.now() - this.settings.resyncConnectionIntervalMs); @@ -114,7 +114,7 @@ export class ConnectionManager { } }, this.settings.resyncConnectionPollingIntervalMs); - this.worker.run(); + await this.worker.run(); } @@ -179,25 +179,25 @@ export class ConnectionManager { const result = await (async () => { switch (config.type) { case 'github': { - return await compileGithubConfig(config, job.data.connectionId, abortController); + return compileGithubConfig(config, job.data.connectionId, abortController); } case 'gitlab': { - return await compileGitlabConfig(config, job.data.connectionId); + return compileGitlabConfig(config, job.data.connectionId); } case 'gitea': { - return await compileGiteaConfig(config, job.data.connectionId); + return compileGiteaConfig(config, job.data.connectionId); } case 'gerrit': { - return await compileGerritConfig(config, job.data.connectionId); + return compileGerritConfig(config, job.data.connectionId); } case 'bitbucket': { - return await compileBitbucketConfig(config, job.data.connectionId); + return compileBitbucketConfig(config, job.data.connectionId); } case 'azuredevops': { - return await compileAzureDevOpsConfig(config, job.data.connectionId); + return compileAzureDevOpsConfig(config, job.data.connectionId); } case 'git': { - return await compileGenericGitHostConfig(config, job.data.connectionId); + return compileGenericGitHostConfig(config, job.data.connectionId); } } })(); @@ -269,7 +269,7 @@ export class ConnectionManager { } - private onJobCompleted = async (job: Job) => + private onJobCompleted = (job: Job) => groupmqLifecycleExceptionWrapper('onJobCompleted', logger, async () => { const logger = createJobLogger(job.id); const { connectionId, connectionName, orgId } = job.data; @@ -318,7 +318,7 @@ export class ConnectionManager { }); }); - private onJobFailed = async (job: Job) => + private onJobFailed = (job: Job) => groupmqLifecycleExceptionWrapper('onJobFailed', logger, async () => { const logger = createJobLogger(job.id); @@ -358,7 +358,7 @@ export class ConnectionManager { }); }); - private onJobStalled = async (jobId: string) => + private onJobStalled = (jobId: string) => groupmqLifecycleExceptionWrapper('onJobStalled', logger, async () => { const logger = createJobLogger(jobId); const { connection } = await this.db.connectionSyncJob.update({ @@ -384,7 +384,7 @@ export class ConnectionManager { }); }); - private async onWorkerError(error: Error) { + private onWorkerError(error: Error) { Sentry.captureException(error); logger.error(`Connection syncer worker error.`, error); } diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index fd784741..da99d391 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -56,8 +56,8 @@ const userPermissionSyncer = new UserPermissionSyncer(prisma, settings, redis); const repoIndexManager = new RepoIndexManager(prisma, settings, redis, promClient); const configManager = new ConfigManager(prisma, connectionManager, env.CONFIG_PATH); -connectionManager.startScheduler(); -repoIndexManager.startScheduler(); +await connectionManager.startScheduler(); +await repoIndexManager.startScheduler(); if (env.EXPERIMENT_EE_PERMISSION_SYNC_ENABLED === 'true' && !hasEntitlement('permission-syncing')) { logger.error('Permission syncing is not supported in current plan. Please contact team@sourcebot.dev for assistance.'); diff --git a/packages/backend/src/repoIndexManager.ts b/packages/backend/src/repoIndexManager.ts index 3b98e0e0..2a6753cb 100644 --- a/packages/backend/src/repoIndexManager.ts +++ b/packages/backend/src/repoIndexManager.ts @@ -80,7 +80,7 @@ export class RepoIndexManager { await this.scheduleCleanupJobs(); }, this.settings.reindexRepoPollingIntervalMs); - this.worker.run(); + await this.worker.run(); } private async scheduleIndexJobs() { @@ -432,7 +432,7 @@ export class RepoIndexManager { } } - private onJobCompleted = async (job: Job) => + private onJobCompleted = (job: Job) => groupmqLifecycleExceptionWrapper('onJobCompleted', logger, async () => { const logger = createJobLogger(job.data.jobId); const jobData = await this.db.repoIndexingJob.update({ @@ -484,7 +484,7 @@ export class RepoIndexManager { this.promClient.repoIndexJobSuccessTotal.inc({ repo: job.data.repoName, type: jobTypeLabel }); }); - private onJobFailed = async (job: Job) => + private onJobFailed = (job: Job) => groupmqLifecycleExceptionWrapper('onJobFailed', logger, async () => { const logger = createJobLogger(job.data.jobId); @@ -519,7 +519,7 @@ export class RepoIndexManager { } }); - private onJobStalled = async (jobId: string) => + private onJobStalled = (jobId: string) => groupmqLifecycleExceptionWrapper('onJobStalled', logger, async () => { const logger = createJobLogger(jobId); const { repo, type } = await this.db.repoIndexingJob.update({ @@ -539,7 +539,7 @@ export class RepoIndexManager { logger.error(`Job ${jobId} stalled for repo ${repo.name} (id: ${repo.id})`); }); - private async onWorkerError(error: Error) { + private onWorkerError(error: Error) { Sentry.captureException(error); logger.error(`Index syncer worker error.`, error); } diff --git a/packages/backend/src/utils.ts b/packages/backend/src/utils.ts index dd1e7dfa..b99a1848 100644 --- a/packages/backend/src/utils.ts +++ b/packages/backend/src/utils.ts @@ -259,12 +259,10 @@ const createGitCloneUrlWithToken = (cloneUrl: string, credentials: { username?: * the app. * @see: https://openpanel-dev.github.io/groupmq/api-worker/#events */ -export const groupmqLifecycleExceptionWrapper = async (name: string, logger: Logger, fn: () => Promise) => { - try { - await fn(); - } catch (error) { +export const groupmqLifecycleExceptionWrapper = (name: string, logger: Logger, fn: () => Promise) => { + fn().catch((error) => { Sentry.captureException(error); logger.error(`Exception thrown while executing lifecycle function \`${name}\`.`, error); - } + }) } diff --git a/yarn.lock b/yarn.lock index 402e6610..d4f271b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2186,6 +2186,17 @@ __metadata: languageName: node linkType: hard +"@eslint-community/eslint-utils@npm:^4.8.0": + version: 4.9.0 + resolution: "@eslint-community/eslint-utils@npm:4.9.0" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/8881e22d519326e7dba85ea915ac7a143367c805e6ba1374c987aa2fbdd09195cc51183d2da72c0e2ff388f84363e1b220fd0d19bef10c272c63455162176817 + languageName: node + linkType: hard + "@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": version: 4.12.1 resolution: "@eslint-community/regexpp@npm:4.12.1" @@ -2193,6 +2204,42 @@ __metadata: languageName: node linkType: hard +"@eslint-community/regexpp@npm:^4.12.1": + version: 4.12.2 + resolution: "@eslint-community/regexpp@npm:4.12.2" + checksum: 10c0/fddcbc66851b308478d04e302a4d771d6917a0b3740dc351513c0da9ca2eab8a1adf99f5e0aa7ab8b13fa0df005c81adeee7e63a92f3effd7d367a163b721c2d + languageName: node + linkType: hard + +"@eslint/config-array@npm:^0.21.1": + version: 0.21.1 + resolution: "@eslint/config-array@npm:0.21.1" + dependencies: + "@eslint/object-schema": "npm:^2.1.7" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10c0/2f657d4edd6ddcb920579b72e7a5b127865d4c3fb4dda24f11d5c4f445a93ca481aebdbd6bf3291c536f5d034458dbcbb298ee3b698bc6c9dd02900fe87eec3c + languageName: node + linkType: hard + +"@eslint/config-helpers@npm:^0.4.2": + version: 0.4.2 + resolution: "@eslint/config-helpers@npm:0.4.2" + dependencies: + "@eslint/core": "npm:^0.17.0" + checksum: 10c0/92efd7a527b2d17eb1a148409d71d80f9ac160b565ac73ee092252e8bf08ecd08670699f46b306b94f13d22e88ac88a612120e7847570dd7cdc72f234d50dcb4 + languageName: node + linkType: hard + +"@eslint/core@npm:^0.17.0": + version: 0.17.0 + resolution: "@eslint/core@npm:0.17.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10c0/9a580f2246633bc752298e7440dd942ec421860d1946d0801f0423830e67887e4aeba10ab9a23d281727a978eb93d053d1922a587d502942a713607f40ed704e + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^2.1.4": version: 2.1.4 resolution: "@eslint/eslintrc@npm:2.1.4" @@ -2210,7 +2257,7 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^3": +"@eslint/eslintrc@npm:^3, @eslint/eslintrc@npm:^3.3.1": version: 3.3.1 resolution: "@eslint/eslintrc@npm:3.3.1" dependencies: @@ -2234,6 +2281,30 @@ __metadata: languageName: node linkType: hard +"@eslint/js@npm:9.39.0, @eslint/js@npm:^9.39.0": + version: 9.39.0 + resolution: "@eslint/js@npm:9.39.0" + checksum: 10c0/f0ac65784932f1a5d3b9c0db12eb1ff9dcb480dbd03da1045e5da820bd97a35875fb7790f1fbe652763270b1327b770c79a9ba0396e2ad91fbd97822493e67eb + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.7": + version: 2.1.7 + resolution: "@eslint/object-schema@npm:2.1.7" + checksum: 10c0/936b6e499853d1335803f556d526c86f5fe2259ed241bc665000e1d6353828edd913feed43120d150adb75570cae162cf000b5b0dfc9596726761c36b82f4e87 + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.4.1": + version: 0.4.1 + resolution: "@eslint/plugin-kit@npm:0.4.1" + dependencies: + "@eslint/core": "npm:^0.17.0" + levn: "npm:^0.4.1" + checksum: 10c0/51600f78b798f172a9915dffb295e2ffb44840d583427bc732baf12ecb963eb841b253300e657da91d890f4b323d10a1bd12934bf293e3018d8bb66fdce5217b + languageName: node + linkType: hard + "@floating-ui/core@npm:^1.6.0": version: 1.6.9 resolution: "@floating-ui/core@npm:1.6.9" @@ -2328,6 +2399,23 @@ __metadata: languageName: node linkType: hard +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10c0/aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.7 + resolution: "@humanfs/node@npm:0.16.7" + dependencies: + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.4.0" + checksum: 10c0/9f83d3cf2cfa37383e01e3cdaead11cd426208e04c44adcdd291aa983aaf72d7d3598844d2fe9ce54896bb1bf8bd4b56883376611c8905a19c44684642823f30 + languageName: node + linkType: hard + "@humanwhocodes/config-array@npm:^0.13.0": version: 0.13.0 resolution: "@humanwhocodes/config-array@npm:0.13.0" @@ -2353,6 +2441,13 @@ __metadata: languageName: node linkType: hard +"@humanwhocodes/retry@npm:^0.4.0, @humanwhocodes/retry@npm:^0.4.2": + version: 0.4.3 + resolution: "@humanwhocodes/retry@npm:0.4.3" + checksum: 10c0/3775bb30087d4440b3f7406d5a057777d90e4b9f435af488a4923ef249e93615fb78565a85f173a186a076c7706a81d0d57d563a2624e4de2c5c9c66c486ce42 + languageName: node + linkType: hard + "@iconify/react@npm:^5.1.0": version: 5.2.0 resolution: "@iconify/react@npm:5.2.0" @@ -7774,6 +7869,7 @@ __metadata: resolution: "@sourcebot/backend@workspace:packages/backend" dependencies: "@coderabbitai/bitbucket": "npm:^1.1.3" + "@eslint/js": "npm:^9.39.0" "@gitbeaker/rest": "npm:^40.5.1" "@octokit/app": "npm:^16.1.1" "@octokit/rest": "npm:^21.0.2" @@ -7798,6 +7894,7 @@ __metadata: cross-env: "npm:^7.0.3" cross-fetch: "npm:^4.0.0" dotenv: "npm:^16.4.5" + eslint: "npm:^9.39.0" express: "npm:^4.21.2" git-url-parse: "npm:^16.1.0" gitea-js: "npm:^1.22.0" @@ -7813,7 +7910,8 @@ __metadata: simple-git: "npm:^3.27.0" tsc-watch: "npm:^6.2.0" tsx: "npm:^4.19.1" - typescript: "npm:^5.6.2" + typescript: "npm:^5.9.3" + typescript-eslint: "npm:^8.46.2" vitest: "npm:^2.1.9" zod: "npm:^3.24.3" languageName: unknown @@ -8542,6 +8640,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^1.0.6": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:^5.0.0": version: 5.0.6 resolution: "@types/express-serve-static-core@npm:5.0.6" @@ -8861,6 +8966,27 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/eslint-plugin@npm:8.46.2" + dependencies: + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.46.2" + "@typescript-eslint/type-utils": "npm:8.46.2" + "@typescript-eslint/utils": "npm:8.46.2" + "@typescript-eslint/visitor-keys": "npm:8.46.2" + graphemer: "npm:^1.4.0" + ignore: "npm:^7.0.0" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + "@typescript-eslint/parser": ^8.46.2 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/24d1257bd023525754dc130e99bad1404c46f997729a060e3764b7f80dd43edcc43767b60fd89244cba82157918609e3922e408d0f7be4223e2056c1447fb387 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/eslint-plugin@npm:^8.40.0": version: 8.40.0 resolution: "@typescript-eslint/eslint-plugin@npm:8.40.0" @@ -8882,6 +9008,22 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/parser@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/parser@npm:8.46.2" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.46.2" + "@typescript-eslint/types": "npm:8.46.2" + "@typescript-eslint/typescript-estree": "npm:8.46.2" + "@typescript-eslint/visitor-keys": "npm:8.46.2" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/9556bf8ec039c6d1751a37cf76cf70912e80dc45337731a304509309e67472c3f5b5abe6ac5021a7ae9361ea65b2e1f66b626603cecca6506a4533152a77b28f + languageName: node + linkType: hard + "@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/parser@npm:^8.40.0": version: 8.40.0 resolution: "@typescript-eslint/parser@npm:8.40.0" @@ -8911,6 +9053,19 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/project-service@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/project-service@npm:8.46.2" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.46.2" + "@typescript-eslint/types": "npm:^8.46.2" + debug: "npm:^4.3.4" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/03e87bcbca6af3f95bf54d4047a8b4d12434126c27d7312e804499a9459e1c847fe045f83fe8e3b22c3dc3925baad0aa2a1a5476d0d51f73a493dc5909a53dbf + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:8.32.1": version: 8.32.1 resolution: "@typescript-eslint/scope-manager@npm:8.32.1" @@ -8931,6 +9086,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/scope-manager@npm:8.46.2" + dependencies: + "@typescript-eslint/types": "npm:8.46.2" + "@typescript-eslint/visitor-keys": "npm:8.46.2" + checksum: 10c0/42f52ee621a3a0ef2233e7d3384d9dbd76218f5c906a9cce3152a1f55c060a3d3614c7b8fff5270bdf48e8fcc003e732d3f003f283ea6fb204d64a2f6bb3ea9c + languageName: node + linkType: hard + "@typescript-eslint/tsconfig-utils@npm:8.40.0, @typescript-eslint/tsconfig-utils@npm:^8.40.0": version: 8.40.0 resolution: "@typescript-eslint/tsconfig-utils@npm:8.40.0" @@ -8940,6 +9105,15 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/tsconfig-utils@npm:8.46.2, @typescript-eslint/tsconfig-utils@npm:^8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.46.2" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/23e34ad296347417e42234945138022fb045d180fde69941483884a38e85fa55d5449420d2a660c0ebf1794a445add2f13e171c8dd64e4e83f594e2c4e35bf4d + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:8.40.0": version: 8.40.0 resolution: "@typescript-eslint/type-utils@npm:8.40.0" @@ -8956,6 +9130,22 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/type-utils@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/type-utils@npm:8.46.2" + dependencies: + "@typescript-eslint/types": "npm:8.46.2" + "@typescript-eslint/typescript-estree": "npm:8.46.2" + "@typescript-eslint/utils": "npm:8.46.2" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/e12fc65e4b58c1ab6fe65f5486265b7afe9a9a6730e3529aca927ddfc22e5913eb28999fc83e68ea1b49097e1edbbae1f61dd724b0bb0e7586fb24ecda1d4938 + languageName: node + linkType: hard + "@typescript-eslint/types@npm:8.32.1": version: 8.32.1 resolution: "@typescript-eslint/types@npm:8.32.1" @@ -8970,6 +9160,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:8.46.2, @typescript-eslint/types@npm:^8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/types@npm:8.46.2" + checksum: 10c0/611716bae2369a1b8001c7f6cc03c5ecadfb956643cbbe27269defd28a61d43fe52eda008d7a09568b0be50c502e8292bf767b246366004283476e9a971b6fbc + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:8.32.1": version: 8.32.1 resolution: "@typescript-eslint/typescript-estree@npm:8.32.1" @@ -9008,6 +9205,26 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/typescript-estree@npm:8.46.2" + dependencies: + "@typescript-eslint/project-service": "npm:8.46.2" + "@typescript-eslint/tsconfig-utils": "npm:8.46.2" + "@typescript-eslint/types": "npm:8.46.2" + "@typescript-eslint/visitor-keys": "npm:8.46.2" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/ad7dbf352982bc6e16473ef19fc7d209fffeb147a732db8a2464e0ec33e7fbbc24ce3f23d01bdf99d503626c582a476debf4c90c527d755eeb99b863476d9f5f + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:8.40.0": version: 8.40.0 resolution: "@typescript-eslint/utils@npm:8.40.0" @@ -9023,6 +9240,21 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/utils@npm:8.46.2" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.7.0" + "@typescript-eslint/scope-manager": "npm:8.46.2" + "@typescript-eslint/types": "npm:8.46.2" + "@typescript-eslint/typescript-estree": "npm:8.46.2" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/600b70730077ed85a6e278e06771f3933cdafce242f979e4af1c1b41290bf1efb14d20823c25c38a3a792def69b18eb9410af28bb228fe86027ad7859753c62d + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:^8.18.1": version: 8.32.1 resolution: "@typescript-eslint/utils@npm:8.32.1" @@ -9058,6 +9290,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:8.46.2": + version: 8.46.2 + resolution: "@typescript-eslint/visitor-keys@npm:8.46.2" + dependencies: + "@typescript-eslint/types": "npm:8.46.2" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/2067cd9a3c90b3817242cc49b5fa77428e1b92b28e16a12f45c2b399acbba7bd17e503553e5e68924e40078477a5c247dfa12e7709c24fe11c0b17a0c8486c33 + languageName: node + linkType: hard + "@uidotdev/usehooks@npm:^2.4.1": version: 2.4.1 resolution: "@uidotdev/usehooks@npm:2.4.1" @@ -12231,6 +12473,16 @@ __metadata: languageName: node linkType: hard +"eslint-scope@npm:^8.4.0": + version: 8.4.0 + resolution: "eslint-scope@npm:8.4.0" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/407f6c600204d0f3705bd557f81bd0189e69cd7996f408f8971ab5779c0af733d1af2f1412066b40ee1588b085874fc37a2333986c6521669cdbdd36ca5058e0 + languageName: node + linkType: hard + "eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" @@ -12300,7 +12552,56 @@ __metadata: languageName: node linkType: hard -"espree@npm:^10.0.1": +"eslint@npm:^9.39.0": + version: 9.39.0 + resolution: "eslint@npm:9.39.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.8.0" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.21.1" + "@eslint/config-helpers": "npm:^0.4.2" + "@eslint/core": "npm:^0.17.0" + "@eslint/eslintrc": "npm:^3.3.1" + "@eslint/js": "npm:9.39.0" + "@eslint/plugin-kit": "npm:^0.4.1" + "@humanfs/node": "npm:^0.16.6" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@humanwhocodes/retry": "npm:^0.4.2" + "@types/estree": "npm:^1.0.6" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.6" + debug: "npm:^4.3.2" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^8.4.0" + eslint-visitor-keys: "npm:^4.2.1" + espree: "npm:^10.4.0" + esquery: "npm:^1.5.0" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^8.0.0" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true + bin: + eslint: bin/eslint.js + checksum: 10c0/4035f7a3d01b3a6026d0ade899713286ed9514e5b65afe5eb671b66834a4c211769de18d1329dadb4e0bb487ea61e6a5ba0905c2b92144b8b9a2216c1ccca3e8 + languageName: node + linkType: hard + +"espree@npm:^10.0.1, espree@npm:^10.4.0": version: 10.4.0 resolution: "espree@npm:10.4.0" dependencies: @@ -12322,7 +12623,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": +"esquery@npm:^1.4.2, esquery@npm:^1.5.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" dependencies: @@ -12694,6 +12995,15 @@ __metadata: languageName: node linkType: hard +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" + dependencies: + flat-cache: "npm:^4.0.0" + checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 + languageName: node + linkType: hard + "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -12753,6 +13063,16 @@ __metadata: languageName: node linkType: hard +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc + languageName: node + linkType: hard + "flatted@npm:^3.2.9": version: 3.3.3 resolution: "flatted@npm:3.3.3" @@ -14509,7 +14829,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.5.3, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -19891,7 +20211,22 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5, typescript@npm:^5.6.2, typescript@npm:^5.7.3": +"typescript-eslint@npm:^8.46.2": + version: 8.46.2 + resolution: "typescript-eslint@npm:8.46.2" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.46.2" + "@typescript-eslint/parser": "npm:8.46.2" + "@typescript-eslint/typescript-estree": "npm:8.46.2" + "@typescript-eslint/utils": "npm:8.46.2" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/9c1bef1887ee984e63cbf4f4321f22ed232b192597400b74220aaecd42235bccc3c7786e002d283f81e1a0812a1c6d83ea5860bffa5e87d119204ecb9db0296a + languageName: node + linkType: hard + +"typescript@npm:^5, typescript@npm:^5.7.3": version: 5.8.2 resolution: "typescript@npm:5.8.2" bin: @@ -19911,7 +20246,17 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5#optional!builtin, typescript@patch:typescript@npm%3A^5.6.2#optional!builtin, typescript@patch:typescript@npm%3A^5.7.3#optional!builtin": +"typescript@npm:^5.9.3": + version: 5.9.3 + resolution: "typescript@npm:5.9.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5#optional!builtin, typescript@patch:typescript@npm%3A^5.7.3#optional!builtin": version: 5.8.2 resolution: "typescript@patch:typescript@npm%3A5.8.2#optional!builtin::version=5.8.2&hash=5786d5" bin: @@ -19931,6 +20276,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A^5.9.3#optional!builtin": + version: 5.9.3 + resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430 + languageName: node + linkType: hard + "ua-parser-js@npm:^1.0.33": version: 1.0.40 resolution: "ua-parser-js@npm:1.0.40"