diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index f6b9bb4..0000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -*.test.ts -migrations/ \ No newline at end of file diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index d0d17be..0000000 --- a/.eslintrc +++ /dev/null @@ -1,55 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "env": { - "node": true, - "es6": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "globals": {}, - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "settings": { - "react": { - "version": "detect" - } - }, - "plugins": ["@typescript-eslint"], - "rules": { - "no-console": "off", - "no-empty": "off", - "require-atomic-updates": "off", - "curly": ["error", "all"], - "@typescript-eslint/explicit-member-accessibility": "off", - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-use-before-define": [ - "error", - { "functions": false } - ], - "@typescript-eslint/no-parameter-properties": "off", - "@typescript-eslint/no-extraneous-class": "error", - "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/no-unnecessary-qualifier": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/prefer-function-type": "error", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/ban-types": "off", - "@typescript-eslint/no-unused-vars": [ - "error", - { - "varsIgnorePattern": "(^_|[iI]gnored)", - "argsIgnorePattern": "(^_|[iI]gnored)", - "ignoreRestSiblings": true - } - ] - } -} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a895497..7c28e90 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -30,7 +30,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v3 with: - node-version: 18.x + node-version-file: '.nvmrc' cache: pnpm - name: pnpm install diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index 3c173e1..6874dd9 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -35,7 +35,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v3 with: - node-version: 18.x + node-version-file: '.nvmrc' cache: pnpm - name: Install diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b82bf6f..dc35644 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -30,7 +30,7 @@ jobs: if: steps.check.outputs.changed == 'true' uses: actions/setup-node@v3 with: - node-version: 18.x + node-version-file: '.nvmrc' registry-url: https://registry.npmjs.org/ - name: Install diff --git a/.gitignore b/.gitignore index 0d16bc3..0e3b0e3 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ ca.key .brackets.json .npmrc npm-debug.log -.nvmrc yarn-error.log coverage/ dim-api-types/*.js diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..209e3ef --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +20 diff --git a/api/db/apps-queries.test.ts b/api/db/apps-queries.test.ts index 9341904..28d8f83 100644 --- a/api/db/apps-queries.test.ts +++ b/api/db/apps-queries.test.ts @@ -1,3 +1,4 @@ +import { DatabaseError } from 'pg'; import { v4 as uuid } from 'uuid'; import { ApiApp } from '../shapes/app.js'; import { getAllApps, getAppById, insertApp } from './apps-queries.js'; @@ -32,7 +33,10 @@ it('cannot create a new app with the same name as an existing one', async () => try { await insertApp(client, app); } catch (e) { - expect(e.code).toBe('23505'); + if (!(e instanceof DatabaseError)) { + fail('should have thrown a DatabaseError'); + } + expect((e).code).toBe('23505'); } }); }); diff --git a/api/db/apps-queries.ts b/api/db/apps-queries.ts index 54e18a1..5fecc7f 100644 --- a/api/db/apps-queries.ts +++ b/api/db/apps-queries.ts @@ -1,54 +1,42 @@ import { ClientBase, QueryResult } from 'pg'; import { ApiApp } from '../shapes/app.js'; -import { camelize } from '../utils.js'; +import { camelize, KeysToSnakeCase, TypesForKeys } from '../utils.js'; /** * Get all registered apps. */ export async function getAllApps(client: ClientBase): Promise { - try { - const results = await client.query({ - name: 'get_all_apps', - text: 'SELECT * FROM apps', - }); - return results.rows.map((row) => camelize(row)); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + const results = await client.query>({ + name: 'get_all_apps', + text: 'SELECT * FROM apps', + }); + return results.rows.map((row) => camelize(row)); } /** * Get an app by its ID. */ export async function getAppById(client: ClientBase, id: string): Promise { - try { - const results = await client.query({ - name: 'get_apps', - text: 'SELECT * FROM apps where id = $1', - values: [id], - }); - if (results.rows.length > 0) { - return camelize(results.rows[0]); - } else { - return null; - } - } catch (e) { - throw new Error(e.name + ': ' + e.message); + const results = await client.query>({ + name: 'get_apps', + text: 'SELECT * FROM apps where id = $1', + values: [id], + }); + if (results.rows.length > 0) { + return camelize(results.rows[0]); + } else { + return null; } } /** * Insert a new app into the list of registered apps. */ -export async function insertApp(client: ClientBase, app: ApiApp): Promise> { - try { - return client.query({ - name: 'insert_app', - text: `insert into apps (id, bungie_api_key, dim_api_key, origin) +export async function insertApp(client: ClientBase, app: ApiApp): Promise { + return client.query>({ + name: 'insert_app', + text: `insert into apps (id, bungie_api_key, dim_api_key, origin) values ($1, $2, $3, $4)`, - values: [app.id, app.bungieApiKey, app.dimApiKey, app.origin], - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + values: [app.id, app.bungieApiKey, app.dimApiKey, app.origin], + }); } diff --git a/api/db/index.test.ts b/api/db/index.test.ts index 6c098fb..1a78f5f 100644 --- a/api/db/index.test.ts +++ b/api/db/index.test.ts @@ -10,6 +10,11 @@ beforeEach(async () => { )`); }); +interface TransactionTestRow { + id: number; + test: string; +} + afterAll(async () => { try { await pool.query(`DROP TABLE transaction_test`); @@ -28,10 +33,10 @@ describe('transaction', () => { }); fail('should have thrown an error'); } catch (e) { - expect(e.message).toBe('oops'); + expect((e as Error).message).toBe('oops'); } - const result = await pool.query('select * from transaction_test'); + const result = await pool.query('select * from transaction_test'); expect(result.rows.length).toBe(1); expect(result.rows[0].id).toBe(1); }); @@ -41,7 +46,7 @@ describe('transaction', () => { await client.query("insert into transaction_test (id, test) values (3, 'testing commits')"); }); - const result = await pool.query('select * from transaction_test'); + const result = await pool.query('select * from transaction_test'); expect(result.rows.length).toBe(1); expect(result.rows[0].test).toBe('testing commits'); }); @@ -61,7 +66,9 @@ describe('readTransaction', () => { // Now request that info from our original client. // should be read-committed, so we shouldn't see that update - const result = await client.query('select * from transaction_test where id = 1'); + const result = await client.query( + 'select * from transaction_test where id = 1', + ); expect(result.rows[0].test).toBe('testing'); // Commit the update @@ -74,12 +81,16 @@ describe('readTransaction', () => { } // once that other transaction commits, we'll see its update - const result = await client.query('select * from transaction_test where id = 1'); + const result = await client.query( + 'select * from transaction_test where id = 1', + ); expect(result.rows[0].test).toBe('updated'); }); // outside, we should still see the transactional update - const result = await pool.query('select * from transaction_test where id = 1'); + const result = await pool.query( + 'select * from transaction_test where id = 1', + ); expect(result.rows[0].test).toBe('updated'); }); }); diff --git a/api/db/index.ts b/api/db/index.ts index f0628cb..b54a37c 100644 --- a/api/db/index.ts +++ b/api/db/index.ts @@ -21,7 +21,7 @@ pool.on('acquire', () => { }); pool.on('error', (e: Error) => { metrics.increment('db.pool.error.count'); - metrics.increment('db.pool.error.' + e.name + '.count'); + metrics.increment(`db.pool.error.${ e.name }.count`); }); pool.on('remove', () => { metrics.increment('db.pool.remove.count'); @@ -66,10 +66,10 @@ export async function readTransaction(fn: (client: ClientBase) => Promise) const client = await pool.connect(); try { // We used to wrap multiple reads in a transaction but I'm not sure it matters all that much. - //await client.query('BEGIN'); + // await client.query('BEGIN'); return await fn(client); } finally { - //await client.query('ROLLBACK'); + // await client.query('ROLLBACK'); client.release(); } } diff --git a/api/db/item-annotations-queries.ts b/api/db/item-annotations-queries.ts index 03ee3f3..0c0f912 100644 --- a/api/db/item-annotations-queries.ts +++ b/api/db/item-annotations-queries.ts @@ -3,6 +3,14 @@ import { metrics } from '../metrics/index.js'; import { DestinyVersion } from '../shapes/general.js'; import { ItemAnnotation, TagValue, TagVariant } from '../shapes/item-annotations.js'; +interface ItemAnnotationRow { + inventory_item_id: string; + tag: TagValue | null; + notes: string | null; + variant: TagVariant | null; + crafted_date: Date | null; +} + /** * Get all of the item annotations for a particular platform_membership_id and destiny_version. */ @@ -12,16 +20,12 @@ export async function getItemAnnotationsForProfile( platformMembershipId: string, destinyVersion: DestinyVersion, ): Promise { - try { - const results = await client.query({ - name: 'get_item_annotations', - text: 'SELECT inventory_item_id, tag, notes, variant, crafted_date FROM item_annotations WHERE membership_id = $1 and platform_membership_id = $2 and destiny_version = $3', - values: [bungieMembershipId, platformMembershipId, destinyVersion], - }); - return results.rows.map(convertItemAnnotation); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + const results = await client.query({ + name: 'get_item_annotations', + text: 'SELECT inventory_item_id, tag, notes, variant, crafted_date FROM item_annotations WHERE membership_id = $1 and platform_membership_id = $2 and destiny_version = $3', + values: [bungieMembershipId, platformMembershipId, destinyVersion], + }); + return results.rows.map(convertItemAnnotation); } /** @@ -37,24 +41,22 @@ export async function getAllItemAnnotationsForUser( annotation: ItemAnnotation; }[] > { - try { - // TODO: this isn't indexed! - const results = await client.query({ - name: 'get_all_item_annotations', - text: 'SELECT platform_membership_id, destiny_version, inventory_item_id, tag, notes, variant, crafted_date FROM item_annotations WHERE membership_id = $1', - values: [bungieMembershipId], - }); - return results.rows.map((row) => ({ - platformMembershipId: row.platform_membership_id, - destinyVersion: row.destiny_version, - annotation: convertItemAnnotation(row), - })); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + // TODO: this isn't indexed! + const results = await client.query< + ItemAnnotationRow & { platform_membership_id: string; destiny_version: DestinyVersion } + >({ + name: 'get_all_item_annotations', + text: 'SELECT platform_membership_id, destiny_version, inventory_item_id, tag, notes, variant, crafted_date FROM item_annotations WHERE membership_id = $1', + values: [bungieMembershipId], + }); + return results.rows.map((row) => ({ + platformMembershipId: row.platform_membership_id, + destinyVersion: row.destiny_version, + annotation: convertItemAnnotation(row), + })); } -function convertItemAnnotation(row: any): ItemAnnotation { +function convertItemAnnotation(row: ItemAnnotationRow): ItemAnnotation { const result: ItemAnnotation = { id: row.inventory_item_id, }; @@ -83,7 +85,7 @@ export async function updateItemAnnotation( platformMembershipId: string, destinyVersion: DestinyVersion, itemAnnotation: ItemAnnotation, -): Promise> { +): Promise { const tagValue = clearValue(itemAnnotation.tag); // Variant will only be set when tag is set and only for "keep" values const variant = variantValue(tagValue, itemAnnotation.v); @@ -92,37 +94,32 @@ export async function updateItemAnnotation( if (tagValue === 'clear' && notesValue === 'clear') { return deleteItemAnnotation(client, bungieMembershipId, itemAnnotation.id); } - - try { - const response = await client.query({ - name: 'upsert_item_annotation', - text: `insert INTO item_annotations (membership_id, platform_membership_id, destiny_version, inventory_item_id, tag, notes, variant, crafted_date, created_by, last_updated_by) + const response = await client.query({ + name: 'upsert_item_annotation', + text: `insert INTO item_annotations (membership_id, platform_membership_id, destiny_version, inventory_item_id, tag, notes, variant, crafted_date, created_by, last_updated_by) values ($1, $2, $3, $4, (CASE WHEN $5 = 'clear'::item_tag THEN NULL ELSE $5 END)::item_tag, (CASE WHEN $6 = 'clear' THEN NULL ELSE $6 END), $9, $8, $7, $7) on conflict (membership_id, inventory_item_id) do update set (tag, notes, variant, last_updated_at, last_updated_by) = ((CASE WHEN $5 = 'clear' THEN NULL WHEN $5 IS NULL THEN item_annotations.tag ELSE $5 END), (CASE WHEN $6 = 'clear' THEN NULL WHEN $6 IS NULL THEN item_annotations.notes ELSE $6 END), (CASE WHEN $9 = 0 THEN NULL WHEN $9 IS NULL THEN item_annotations.variant ELSE $9 END), current_timestamp, $7)`, - values: [ - bungieMembershipId, - platformMembershipId, - destinyVersion, - itemAnnotation.id, - tagValue, - notesValue, - appId, - itemAnnotation.craftedDate ? new Date(itemAnnotation.craftedDate * 1000) : null, - variant, - ], - }); + values: [ + bungieMembershipId, + platformMembershipId, + destinyVersion, + itemAnnotation.id, + tagValue, + notesValue, + appId, + itemAnnotation.craftedDate ? new Date(itemAnnotation.craftedDate * 1000) : null, + variant, + ], + }); - if (response.rowCount < 1) { - // This should never happen! - metrics.increment('db.itemAnnotations.noRowUpdated.count', 1); - throw new Error('tags - No row was updated'); - } - - return response; - } catch (e) { - throw new Error(e.name + ': ' + e.message); + if (response.rowCount! < 1) { + // This should never happen! + metrics.increment('db.itemAnnotations.noRowUpdated.count', 1); + throw new Error('tags - No row was updated'); } + + return response; } /** @@ -167,16 +164,12 @@ export async function deleteItemAnnotation( client: ClientBase, bungieMembershipId: number, inventoryItemId: string, -): Promise> { - try { - return client.query({ - name: 'delete_item_annotation', - text: `delete from item_annotations where membership_id = $1 and inventory_item_id = $2`, - values: [bungieMembershipId, inventoryItemId], - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } +): Promise { + return client.query({ + name: 'delete_item_annotation', + text: `delete from item_annotations where membership_id = $1 and inventory_item_id = $2`, + values: [bungieMembershipId, inventoryItemId], + }); } /** @@ -186,16 +179,12 @@ export async function deleteItemAnnotationList( client: ClientBase, bungieMembershipId: number, inventoryItemIds: string[], -): Promise> { - try { - return client.query({ - name: 'delete_item_annotation_list', - text: `delete from item_annotations where membership_id = $1 and inventory_item_id::bigint = ANY($2::bigint[])`, - values: [bungieMembershipId, inventoryItemIds], - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } +): Promise { + return client.query({ + name: 'delete_item_annotation_list', + text: `delete from item_annotations where membership_id = $1 and inventory_item_id::bigint = ANY($2::bigint[])`, + values: [bungieMembershipId, inventoryItemIds], + }); } /** @@ -204,14 +193,10 @@ export async function deleteItemAnnotationList( export async function deleteAllItemAnnotations( client: ClientBase, bungieMembershipId: number, -): Promise> { - try { - return client.query({ - name: 'delete_all_item_annotations', - text: `delete from item_annotations where membership_id = $1`, - values: [bungieMembershipId], - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } +): Promise { + return client.query({ + name: 'delete_all_item_annotations', + text: `delete from item_annotations where membership_id = $1`, + values: [bungieMembershipId], + }); } diff --git a/api/db/item-hash-tags-queries.ts b/api/db/item-hash-tags-queries.ts index dfe2e14..e04a601 100644 --- a/api/db/item-hash-tags-queries.ts +++ b/api/db/item-hash-tags-queries.ts @@ -1,6 +1,12 @@ import { ClientBase, QueryResult } from 'pg'; import { metrics } from '../metrics/index.js'; -import { ItemHashTag } from '../shapes/item-annotations.js'; +import { ItemHashTag, TagValue } from '../shapes/item-annotations.js'; + +interface ItemHashTagRow { + item_hash: string; + tag: TagValue | null; + notes: string | null; +} /** * Get all of the hash tags for a particular platform_membership_id and destiny_version. @@ -9,19 +15,15 @@ export async function getItemHashTagsForProfile( client: ClientBase, bungieMembershipId: number, ): Promise { - try { - const results = await client.query({ - name: 'get_item_hash_tags', - text: 'SELECT item_hash, tag, notes FROM item_hash_tags WHERE membership_id = $1', - values: [bungieMembershipId], - }); - return results.rows.map(convertItemHashTag); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + const results = await client.query({ + name: 'get_item_hash_tags', + text: 'SELECT item_hash, tag, notes FROM item_hash_tags WHERE membership_id = $1', + values: [bungieMembershipId], + }); + return results.rows.map(convertItemHashTag); } -function convertItemHashTag(row: any): ItemHashTag { +function convertItemHashTag(row: ItemHashTagRow): ItemHashTag { const result: ItemHashTag = { hash: parseInt(row.item_hash, 10), }; @@ -42,7 +44,7 @@ export async function updateItemHashTag( appId: string, bungieMembershipId: number, itemHashTag: ItemHashTag, -): Promise> { +): Promise { const tagValue = clearValue(itemHashTag.tag); const notesValue = clearValue(itemHashTag.notes); @@ -50,26 +52,22 @@ export async function updateItemHashTag( return deleteItemHashTag(client, bungieMembershipId, itemHashTag.hash); } - try { - const response = await client.query({ - name: 'upsert_hash_tag', - text: `insert INTO item_hash_tags (membership_id, item_hash, tag, notes, created_by, last_updated_by) + const response = await client.query({ + name: 'upsert_hash_tag', + text: `insert INTO item_hash_tags (membership_id, item_hash, tag, notes, created_by, last_updated_by) values ($1, $2, (CASE WHEN $3 = 'clear'::item_tag THEN NULL ELSE $3 END)::item_tag, (CASE WHEN $4 = 'clear' THEN NULL ELSE $4 END), $5, $5) on conflict (membership_id, item_hash) do update set (tag, notes, last_updated_at, last_updated_by) = ((CASE WHEN $3 = 'clear' THEN NULL WHEN $3 IS NULL THEN item_hash_tags.tag ELSE $3 END), (CASE WHEN $4 = 'clear' THEN NULL WHEN $4 IS NULL THEN item_hash_tags.notes ELSE $4 END), current_timestamp, $5)`, - values: [bungieMembershipId, itemHashTag.hash, tagValue, notesValue, appId], - }); - - if (response.rowCount < 1) { - // This should never happen! - metrics.increment('db.itemHashTags.noRowUpdated.count', 1); - throw new Error('hash tags - No row was updated'); - } + values: [bungieMembershipId, itemHashTag.hash, tagValue, notesValue, appId], + }); - return response; - } catch (e) { - throw new Error(e.name + ': ' + e.message); + if (response.rowCount! < 1) { + // This should never happen! + metrics.increment('db.itemHashTags.noRowUpdated.count', 1); + throw new Error('hash tags - No row was updated'); } + + return response; } /** @@ -94,16 +92,12 @@ export async function deleteItemHashTag( client: ClientBase, bungieMembershipId: number, itemHash: number, -): Promise> { - try { - return client.query({ - name: 'delete_item_hash_tag', - text: `delete from item_hash_tags where membership_id = $1 and item_hash = $2`, - values: [bungieMembershipId, itemHash], - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } +): Promise { + return client.query({ + name: 'delete_item_hash_tag', + text: `delete from item_hash_tags where membership_id = $1 and item_hash = $2`, + values: [bungieMembershipId, itemHash], + }); } /** @@ -112,14 +106,10 @@ export async function deleteItemHashTag( export async function deleteAllItemHashTags( client: ClientBase, bungieMembershipId: number, -): Promise> { - try { - return client.query({ - name: 'delete_all_item_hash_tags', - text: `delete from item_hash_tags where membership_id = $1`, - values: [bungieMembershipId], - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } +): Promise { + return client.query({ + name: 'delete_all_item_hash_tags', + text: `delete from item_hash_tags where membership_id = $1`, + values: [bungieMembershipId], + }); } diff --git a/api/db/loadout-share-queries.test.ts b/api/db/loadout-share-queries.test.ts index 1454a1e..1ef38b9 100644 --- a/api/db/loadout-share-queries.test.ts +++ b/api/db/loadout-share-queries.test.ts @@ -78,7 +78,7 @@ it('rejects multiple shares with the same ID', async () => { loadout, ); fail('Expected this to throw an error'); - } catch (e) {} + } catch {} }); }); diff --git a/api/db/loadout-share-queries.ts b/api/db/loadout-share-queries.ts index 7bcac77..cc73425 100644 --- a/api/db/loadout-share-queries.ts +++ b/api/db/loadout-share-queries.ts @@ -1,7 +1,7 @@ import { ClientBase, QueryResult } from 'pg'; import { metrics } from '../metrics/index.js'; import { Loadout } from '../shapes/loadouts.js'; -import { cleanItem, convertLoadout } from './loadouts-queries.js'; +import { cleanItem, convertLoadout, LoadoutRow } from './loadouts-queries.js'; /** * Get a specific loadout share by its share ID. @@ -10,19 +10,15 @@ export async function getLoadoutShare( client: ClientBase, shareId: string, ): Promise { - try { - const results = await client.query({ - name: 'get_loadout_share', - text: 'SELECT id, name, notes, class_type, emblem_hash, clear_space, items, parameters, created_at FROM loadout_shares WHERE id = $1', - values: [shareId], - }); - if (results.rowCount === 1) { - return convertLoadout(results.rows[0]); - } else { - return undefined; - } - } catch (e) { - throw new Error(e.name + ': ' + e.message); + const results = await client.query({ + name: 'get_loadout_share', + text: 'SELECT id, name, notes, class_type, emblem_hash, clear_space, items, parameters, created_at FROM loadout_shares WHERE id = $1', + values: [shareId], + }); + if (results.rowCount === 1) { + return convertLoadout(results.rows[0]); + } else { + return undefined; } } @@ -36,61 +32,53 @@ export async function addLoadoutShare( platformMembershipId: string, shareId: string, loadout: Loadout, -): Promise> { - try { - const response = await client.query({ - name: 'add_loadout_share', - text: `insert into loadout_shares (id, membership_id, platform_membership_id, name, notes, class_type, emblem_hash, clear_space, items, parameters, created_by) +): Promise { + const response = await client.query({ + name: 'add_loadout_share', + text: `insert into loadout_shares (id, membership_id, platform_membership_id, name, notes, class_type, emblem_hash, clear_space, items, parameters, created_by) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)`, - values: [ - shareId, - bungieMembershipId, - platformMembershipId, - loadout.name, - loadout.notes, - loadout.classType, - loadout.emblemHash || null, - loadout.clearSpace, - { - equipped: loadout.equipped.map(cleanItem), - unequipped: loadout.unequipped.map(cleanItem), - }, - loadout.parameters, - appId, - ], - }); + values: [ + shareId, + bungieMembershipId, + platformMembershipId, + loadout.name, + loadout.notes, + loadout.classType, + loadout.emblemHash || null, + loadout.clearSpace, + { + equipped: loadout.equipped.map(cleanItem), + unequipped: loadout.unequipped.map(cleanItem), + }, + loadout.parameters, + appId, + ], + }); - if (response.rowCount < 1) { - // This should never happen! - metrics.increment('db.loadoutShares.noRowUpdated.count', 1); - throw new Error('loadout share - No row was updated'); - } - - return response; - } catch (e) { - throw new Error(e.name + ': ' + e.message); + if (response.rowCount! < 1) { + // This should never happen! + metrics.increment('db.loadoutShares.noRowUpdated.count', 1); + throw new Error('loadout share - No row was updated'); } + + return response; } /** * Touch the last_accessed_at and visits fields to keep track of access. */ -export async function recordAccess(client: ClientBase, shareId: string): Promise> { - try { - const response = await client.query({ - name: 'loadout_share_record_access', - text: `update loadout_shares set last_accessed_at = current_timestamp, visits = visits + 1 where id = $1`, - values: [shareId], - }); +export async function recordAccess(client: ClientBase, shareId: string): Promise { + const response = await client.query({ + name: 'loadout_share_record_access', + text: `update loadout_shares set last_accessed_at = current_timestamp, visits = visits + 1 where id = $1`, + values: [shareId], + }); - if (response.rowCount < 1) { - // This should never happen! - metrics.increment('db.loadoutShares.noRowUpdated.count', 1); - throw new Error('loadout share - No row was updated'); - } - - return response; - } catch (e) { - throw new Error(e.name + ': ' + e.message); + if (response.rowCount! < 1) { + // This should never happen! + metrics.increment('db.loadoutShares.noRowUpdated.count', 1); + throw new Error('loadout share - No row was updated'); } + + return response; } diff --git a/api/db/loadouts-queries.test.ts b/api/db/loadouts-queries.test.ts index 7785585..6e5608c 100644 --- a/api/db/loadouts-queries.test.ts +++ b/api/db/loadouts-queries.test.ts @@ -62,8 +62,8 @@ it('can record a loadout', async () => { expect(firstLoadout.lastUpdatedAt).toBeDefined(); delete firstLoadout.lastUpdatedAt; expect(firstLoadout.unequipped.length).toBe(1); - expect(firstLoadout.unequipped[0]['fizbuzz']).toBeUndefined(); - firstLoadout.unequipped[0]['fizbuzz'] = 11; + expect((firstLoadout.unequipped[0] as { fizbuzz?: number }).fizbuzz).toBeUndefined(); + (firstLoadout.unequipped[0] as { fizbuzz?: number }).fizbuzz = 11; expect(firstLoadout).toEqual(loadout); }); }); @@ -96,7 +96,8 @@ it('can delete a loadout', async () => { await transaction(async (client) => { await updateLoadout(client, appId, bungieMembershipId, platformMembershipId, 2, loadout); - await deleteLoadout(client, bungieMembershipId, loadout.id); + const success = await deleteLoadout(client, bungieMembershipId, loadout.id); + expect(success).toBe(true); const loadouts = await getLoadoutsForProfile( client, diff --git a/api/db/loadouts-queries.ts b/api/db/loadouts-queries.ts index 0380218..98c68a9 100644 --- a/api/db/loadouts-queries.ts +++ b/api/db/loadouts-queries.ts @@ -2,7 +2,16 @@ import { ClientBase, QueryResult } from 'pg'; import { metrics } from '../metrics/index.js'; import { DestinyVersion } from '../shapes/general.js'; import { Loadout, LoadoutItem } from '../shapes/loadouts.js'; -import { isValidItemId } from '../utils.js'; +import { isValidItemId, KeysToSnakeCase } from '../utils.js'; + +export interface LoadoutRow + extends KeysToSnakeCase< + Omit + > { + created_at: Date; + last_updated_at: Date | null; + items: { equipped: LoadoutItem[]; unequipped: LoadoutItem[] }; +} /** * Get all of the loadouts for a particular platform_membership_id and destiny_version. @@ -13,16 +22,12 @@ export async function getLoadoutsForProfile( platformMembershipId: string, destinyVersion: DestinyVersion, ): Promise { - try { - const results = await client.query({ - name: 'get_loadouts_for_platform_membership_id', - text: 'SELECT id, name, notes, class_type, emblem_hash, clear_space, items, parameters, created_at, last_updated_at FROM loadouts WHERE membership_id = $1 and platform_membership_id = $2 and destiny_version = $3', - values: [bungieMembershipId, platformMembershipId, destinyVersion], - }); - return results.rows.map(convertLoadout); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + const results = await client.query({ + name: 'get_loadouts_for_platform_membership_id', + text: 'SELECT id, name, notes, class_type, emblem_hash, clear_space, items, parameters, created_at, last_updated_at FROM loadouts WHERE membership_id = $1 and platform_membership_id = $2 and destiny_version = $3', + values: [bungieMembershipId, platformMembershipId, destinyVersion], + }); + return results.rows.map(convertLoadout); } /** @@ -38,26 +43,24 @@ export async function getAllLoadoutsForUser( loadout: Loadout; }[] > { - try { - const results = await client.query({ - name: 'get_all_loadouts_for_user', - text: 'SELECT membership_id, platform_membership_id, destiny_version, id, name, notes, class_type, emblem_hash, clear_space, items, parameters, created_at, last_updated_at FROM loadouts WHERE membership_id = $1', - values: [bungieMembershipId], - }); - return results.rows.map((row) => { - const loadout = convertLoadout(row); - return { - platformMembershipId: row.platform_membership_id, - destinyVersion: row.destiny_version, - loadout, - }; - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + const results = await client.query< + LoadoutRow & { platform_membership_id: string; destiny_version: DestinyVersion } + >({ + name: 'get_all_loadouts_for_user', + text: 'SELECT membership_id, platform_membership_id, destiny_version, id, name, notes, class_type, emblem_hash, clear_space, items, parameters, created_at, last_updated_at FROM loadouts WHERE membership_id = $1', + values: [bungieMembershipId], + }); + return results.rows.map((row) => { + const loadout = convertLoadout(row); + return { + platformMembershipId: row.platform_membership_id, + destinyVersion: row.destiny_version, + loadout, + }; + }); } -export function convertLoadout(row: any): Loadout { +export function convertLoadout(row: LoadoutRow): Loadout { const loadout: Loadout = { id: row.id, name: row.name, @@ -90,43 +93,39 @@ export async function updateLoadout( platformMembershipId: string, destinyVersion: DestinyVersion, loadout: Loadout, -): Promise> { - try { - const response = await client.query({ - name: 'upsert_loadout', - text: `insert into loadouts (id, membership_id, platform_membership_id, destiny_version, name, notes, class_type, emblem_hash, clear_space, items, parameters, created_by, last_updated_by) +): Promise { + const response = await client.query({ + name: 'upsert_loadout', + text: `insert into loadouts (id, membership_id, platform_membership_id, destiny_version, name, notes, class_type, emblem_hash, clear_space, items, parameters, created_by, last_updated_by) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $12) on conflict (membership_id, id) do update set (name, notes, class_type, emblem_hash, clear_space, items, parameters, last_updated_at, last_updated_by) = ($5, $6, $7, $8, $9, $10, $11, current_timestamp, $12)`, - values: [ - loadout.id, - bungieMembershipId, - platformMembershipId, - destinyVersion, - loadout.name, - loadout.notes, - loadout.classType, - loadout.emblemHash || null, - loadout.clearSpace, - { - equipped: loadout.equipped.map(cleanItem), - unequipped: loadout.unequipped.map(cleanItem), - }, - loadout.parameters, - appId, - ], - }); - - if (response.rowCount < 1) { - // This should never happen! - metrics.increment('db.loadouts.noRowUpdated.count', 1); - throw new Error('loadouts - No row was updated'); - } - - return response; - } catch (e) { - throw new Error(e.name + ': ' + e.message); + values: [ + loadout.id, + bungieMembershipId, + platformMembershipId, + destinyVersion, + loadout.name, + loadout.notes, + loadout.classType, + loadout.emblemHash || null, + loadout.clearSpace, + { + equipped: loadout.equipped.map(cleanItem), + unequipped: loadout.unequipped.map(cleanItem), + }, + loadout.parameters, + appId, + ], + }); + + if (response.rowCount! < 1) { + // This should never happen! + metrics.increment('db.loadouts.noRowUpdated.count', 1); + throw new Error('loadouts - No row was updated'); } + + return response; } /** @@ -171,22 +170,14 @@ export async function deleteLoadout( client: ClientBase, bungieMembershipId: number, loadoutId: string, -): Promise { - try { - const response = await client.query({ - name: 'delete_loadout', - text: `delete from loadouts where membership_id = $1 and id = $2 returning *`, - values: [bungieMembershipId, loadoutId], - }); - - if (response.rowCount < 1) { - return null; - } - - return convertLoadout(response.rows[0]); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } +): Promise { + const response = await client.query({ + name: 'delete_loadout', + text: `delete from loadouts where membership_id = $1 and id = $2`, + values: [bungieMembershipId, loadoutId], + }); + + return response.rowCount! >= 1; } /** @@ -195,14 +186,10 @@ export async function deleteLoadout( export async function deleteAllLoadouts( client: ClientBase, bungieMembershipId: number, -): Promise> { - try { - return client.query({ - name: 'delete_all_loadouts', - text: `delete from loadouts where membership_id = $1`, - values: [bungieMembershipId], - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } +): Promise { + return client.query({ + name: 'delete_all_loadouts', + text: `delete from loadouts where membership_id = $1`, + values: [bungieMembershipId], + }); } diff --git a/api/db/searches-queries.ts b/api/db/searches-queries.ts index 5411cc9..a2bcd68 100644 --- a/api/db/searches-queries.ts +++ b/api/db/searches-queries.ts @@ -4,6 +4,12 @@ import { metrics } from '../metrics/index.js'; import { ExportResponse } from '../shapes/export.js'; import { DestinyVersion } from '../shapes/general.js'; import { Search, SearchType } from '../shapes/search.js'; +import { KeysToSnakeCase } from '../utils.js'; + +interface SearchRow extends KeysToSnakeCase> { + last_updated_at: Date; + search_type: SearchType; +} /* * These "canned searches" get sent to everyone as a "starter pack" of example searches that'll show up in the recent search dropdown and autocomplete. @@ -46,22 +52,18 @@ export async function getSearchesForProfile( bungieMembershipId: number, destinyVersion: DestinyVersion, ): Promise { - try { - const results = await client.query({ - name: 'get_searches', - // TODO: order by frecency - text: 'SELECT query, saved, usage_count, search_type, last_updated_at FROM searches WHERE membership_id = $1 and destiny_version = $2 order by last_updated_at DESC, usage_count DESC LIMIT 500', - values: [bungieMembershipId, destinyVersion], - }); - return _.uniqBy( - results.rows - .map(convertSearch) - .concat(destinyVersion === 2 ? cannedSearchesForD2 : cannedSearchesForD1), - (s) => s.query, - ); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + const results = await client.query({ + name: 'get_searches', + // TODO: order by frecency + text: 'SELECT query, saved, usage_count, search_type, last_updated_at FROM searches WHERE membership_id = $1 and destiny_version = $2 order by last_updated_at DESC, usage_count DESC LIMIT 500', + values: [bungieMembershipId, destinyVersion], + }); + return _.uniqBy( + results.rows + .map(convertSearch) + .concat(destinyVersion === 2 ? cannedSearchesForD2 : cannedSearchesForD1), + (s) => s.query, + ); } /** @@ -72,22 +74,18 @@ export async function getSearchesForUser( bungieMembershipId: number, ): Promise { // TODO: this isn't indexed! - try { - const results = await client.query({ - name: 'get_all_searches', - text: 'SELECT destiny_version, query, saved, usage_count, search_type, last_updated_at FROM searches WHERE membership_id = $1', - values: [bungieMembershipId], - }); - return results.rows.map((row) => ({ - destinyVersion: row.destiny_version, - search: convertSearch(row), - })); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + const results = await client.query({ + name: 'get_all_searches', + text: 'SELECT destiny_version, query, saved, usage_count, search_type, last_updated_at FROM searches WHERE membership_id = $1', + values: [bungieMembershipId], + }); + return results.rows.map((row) => ({ + destinyVersion: row.destiny_version, + search: convertSearch(row), + })); } -function convertSearch(row: any): Search { +function convertSearch(row: SearchRow): Search { return { query: row.query, usageCount: row.usage_count, @@ -109,27 +107,23 @@ export async function updateUsedSearch( destinyVersion: DestinyVersion, query: string, type: SearchType, -): Promise> { - try { - const response = await client.query({ - name: 'upsert_search', - text: `insert INTO searches (membership_id, destiny_version, query, search_type, created_by, last_updated_by) +): Promise { + const response = await client.query({ + name: 'upsert_search', + text: `insert INTO searches (membership_id, destiny_version, query, search_type, created_by, last_updated_by) values ($1, $2, $3, $5, $4, $4) on conflict (membership_id, destiny_version, qhash) do update set (usage_count, last_used, last_updated_at, last_updated_by) = (searches.usage_count + 1, current_timestamp, current_timestamp, $4)`, - values: [bungieMembershipId, destinyVersion, query, appId, type], - }); - - if (response.rowCount < 1) { - // This should never happen! - metrics.increment('db.searches.noRowUpdated.count', 1); - throw new Error('searches - No row was updated'); - } + values: [bungieMembershipId, destinyVersion, query, appId, type], + }); - return response; - } catch (e) { - throw new Error(e.name + ': ' + e.message); + if (response.rowCount! < 1) { + // This should never happen! + metrics.increment('db.searches.noRowUpdated.count', 1); + throw new Error('searches - No row was updated'); } + + return response; } /** @@ -143,30 +137,26 @@ export async function saveSearch( query: string, type: SearchType, saved?: boolean, -): Promise> { - try { - const response = await client.query({ - name: 'save_search', - text: `UPDATE searches SET (saved, last_updated_by) = ($4, $5) WHERE membership_id = $1 AND destiny_version = $2 AND qhash = decode(md5($3), 'hex') AND query = $3`, - values: [bungieMembershipId, destinyVersion, query, saved, appId], - }); +): Promise { + const response = await client.query({ + name: 'save_search', + text: `UPDATE searches SET (saved, last_updated_by) = ($4, $5) WHERE membership_id = $1 AND destiny_version = $2 AND qhash = decode(md5($3), 'hex') AND query = $3`, + values: [bungieMembershipId, destinyVersion, query, saved, appId], + }); - if (response.rowCount < 1) { - // Someone saved a search they haven't used! - metrics.increment('db.searches.noRowUpdated.count', 1); - const insertSavedResponse = await client.query({ - name: 'insert_search_fallback', - text: `insert INTO searches (membership_id, destiny_version, query, search_type, saved, created_by, last_updated_by) + if (response.rowCount! < 1) { + // Someone saved a search they haven't used! + metrics.increment('db.searches.noRowUpdated.count', 1); + const insertSavedResponse = await client.query({ + name: 'insert_search_fallback', + text: `insert INTO searches (membership_id, destiny_version, query, search_type, saved, created_by, last_updated_by) values ($1, $2, $3, $5, true, $4, $4)`, - values: [bungieMembershipId, destinyVersion, query, appId, type], - }); - return insertSavedResponse; - } - - return response; - } catch (e) { - throw new Error(e.name + ': ' + e.message); + values: [bungieMembershipId, destinyVersion, query, appId, type], + }); + return insertSavedResponse; } + + return response; } /** * Insert a single search as part of an import. @@ -181,34 +171,30 @@ export async function importSearch( lastUsage: number, usageCount: number, type: SearchType, -): Promise> { - try { - const response = await client.query({ - name: 'insert_search', - text: `insert INTO searches (membership_id, destiny_version, query, saved, search_type, usage_count, last_used, created_by, last_updated_by) +): Promise { + const response = await client.query({ + name: 'insert_search', + text: `insert INTO searches (membership_id, destiny_version, query, saved, search_type, usage_count, last_used, created_by, last_updated_by) values ($1, $2, $3, $4, $8, $5, $6, $7, $7)`, - values: [ - bungieMembershipId, - destinyVersion, - query, - saved, - usageCount, - new Date(lastUsage), - appId, - type, - ], - }); - - if (response.rowCount < 1) { - // This should never happen! - metrics.increment('db.searches.noRowUpdated.count', 1); - throw new Error('searches - No row was updated'); - } + values: [ + bungieMembershipId, + destinyVersion, + query, + saved, + usageCount, + new Date(lastUsage), + appId, + type, + ], + }); - return response; - } catch (e) { - throw new Error(e.name + ': ' + e.message); + if (response.rowCount! < 1) { + // This should never happen! + metrics.increment('db.searches.noRowUpdated.count', 1); + throw new Error('searches - No row was updated'); } + + return response; } /** @@ -220,16 +206,12 @@ export async function deleteSearch( destinyVersion: DestinyVersion, query: string, type: SearchType, -): Promise> { - try { - return client.query({ - name: 'delete_search', - text: `delete from searches where membership_id = $1 and destiny_version = $2 and qhash = decode(md5($3), 'hex') and query = $3 and search_type = $4`, - values: [bungieMembershipId, destinyVersion, query, type], - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } +): Promise { + return client.query({ + name: 'delete_search', + text: `delete from searches where membership_id = $1 and destiny_version = $2 and qhash = decode(md5($3), 'hex') and query = $3 and search_type = $4`, + values: [bungieMembershipId, destinyVersion, query, type], + }); } /** @@ -238,14 +220,10 @@ export async function deleteSearch( export async function deleteAllSearches( client: ClientBase, bungieMembershipId: number, -): Promise> { - try { - return client.query({ - name: 'delete_all_searches', - text: `delete from searches where membership_id = $1`, - values: [bungieMembershipId], - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } +): Promise { + return client.query({ + name: 'delete_all_searches', + text: `delete from searches where membership_id = $1`, + values: [bungieMembershipId], + }); } diff --git a/api/db/settings-queries.ts b/api/db/settings-queries.ts index c39f44a..a98282f 100644 --- a/api/db/settings-queries.ts +++ b/api/db/settings-queries.ts @@ -8,16 +8,12 @@ export async function getSettings( client: ClientBase, bungieMembershipId: number, ): Promise> { - try { - const results = await client.query<{ settings: Settings }>({ - name: 'get_settings', - text: 'SELECT settings FROM settings WHERE membership_id = $1', - values: [bungieMembershipId], - }); - return results.rows.length > 0 ? results.rows[0].settings : {}; - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + const results = await client.query<{ settings: Settings }>({ + name: 'get_settings', + text: 'SELECT settings FROM settings WHERE membership_id = $1', + values: [bungieMembershipId], + }); + return results.rows.length > 0 ? results.rows[0].settings : {}; } /** @@ -28,20 +24,16 @@ export async function replaceSettings( appId: string, bungieMembershipId: number, settings: Settings, -): Promise> { - try { - const result = await client.query({ - name: 'upsert_settings', - text: `insert into settings (membership_id, settings, created_by, last_updated_by) +): Promise { + const result = await client.query({ + name: 'upsert_settings', + text: `insert into settings (membership_id, settings, created_by, last_updated_by) values ($1, $2, $3, $3) on conflict (membership_id) do update set (settings, last_updated_at, last_updated_by) = ($2, current_timestamp, $3)`, - values: [bungieMembershipId, settings, appId], - }); - return result; - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + values: [bungieMembershipId, settings, appId], + }); + return result; } /** @@ -52,19 +44,15 @@ export async function setSetting( appId: string, bungieMembershipId: number, settings: Partial, -): Promise> { - try { - return client.query({ - name: 'set_setting', - text: `insert into settings (membership_id, settings, created_by, last_updated_by) +): Promise { + return client.query({ + name: 'set_setting', + text: `insert into settings (membership_id, settings, created_by, last_updated_by) values ($1, $2, $3, $3) on conflict (membership_id) do update set (settings, last_updated_at, last_updated_by) = (settings.settings || $2, current_timestamp, $3)`, - values: [bungieMembershipId, settings, appId], - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } + values: [bungieMembershipId, settings, appId], + }); } /** @@ -73,14 +61,10 @@ do update set (settings, last_updated_at, last_updated_by) = (settings.settings export async function deleteSettings( client: ClientBase, bungieMembershipId: number, -): Promise> { - try { - return client.query({ - name: 'delete_settings', - text: `delete FROM settings WHERE membership_id = $1`, - values: [bungieMembershipId], - }); - } catch (e) { - throw new Error(e.name + ': ' + e.message); - } +): Promise { + return client.query({ + name: 'delete_settings', + text: `delete FROM settings WHERE membership_id = $1`, + values: [bungieMembershipId], + }); } diff --git a/api/db/triumphs-queries.ts b/api/db/triumphs-queries.ts index ca52ba6..e9718d4 100644 --- a/api/db/triumphs-queries.ts +++ b/api/db/triumphs-queries.ts @@ -9,7 +9,7 @@ export async function getTrackedTriumphsForProfile( bungieMembershipId: number, platformMembershipId: string, ): Promise { - const results = await client.query({ + const results = await client.query<{ record_hash: string }>({ name: 'get_tracked_triumphs', text: 'SELECT record_hash FROM tracked_triumphs WHERE membership_id = $1 and platform_membership_id = $2', values: [bungieMembershipId, platformMembershipId], @@ -29,7 +29,7 @@ export async function getAllTrackedTriumphsForUser( triumphs: number[]; }[] > { - const results = await client.query({ + const results = await client.query<{ platform_membership_id: string; record_hash: string }>({ name: 'get_all_tracked_triumphs', text: 'SELECT platform_membership_id, record_hash FROM tracked_triumphs WHERE membership_id = $1', values: [bungieMembershipId], @@ -38,9 +38,7 @@ export async function getAllTrackedTriumphsForUser( const triumphsByAccount: { [platformMembershipId: string]: number[] } = {}; for (const row of results.rows) { - triumphsByAccount[row.platform_membership_id] = - triumphsByAccount[row.platform_membership_id] || []; - triumphsByAccount[row.platform_membership_id].push(parseInt(row.record_hash, 10)); + (triumphsByAccount[row.platform_membership_id] ||= []).push(parseInt(row.record_hash, 10)); } return Object.entries(triumphsByAccount).map(([platformMembershipId, triumphs]) => ({ @@ -58,7 +56,7 @@ export async function trackTriumph( bungieMembershipId: number, platformMembershipId: string, recordHash: number, -): Promise> { +): Promise { const response = await client.query({ name: 'insert_tracked_triumph', text: `insert INTO tracked_triumphs (membership_id, platform_membership_id, record_hash, created_by) @@ -78,14 +76,14 @@ export async function unTrackTriumph( bungieMembershipId: number, platformMembershipId: string, recordHash: number, -): Promise> { +): Promise { const response = await client.query({ name: 'delete_tracked_triumph', text: `delete from tracked_triumphs where membership_id = $1 and platform_membership_id = $2 and record_hash = $3`, values: [bungieMembershipId, platformMembershipId, recordHash], }); - if (response.rowCount < 1) { + if (response.rowCount! < 1) { // This should never happen but it's OK metrics.increment('db.triumphs.noRowDeleted.count', 1); } @@ -99,7 +97,7 @@ export async function unTrackTriumph( export async function deleteAllTrackedTriumphs( client: ClientBase, bungieMembershipId: number, -): Promise> { +): Promise { return client.query({ name: 'delete_all_tracked_triumphs', text: `delete from tracked_triumphs where membership_id = $1`, diff --git a/api/dim-gg/loadout-share-view.ts b/api/dim-gg/loadout-share-view.ts index 8224593..169a2e0 100644 --- a/api/dim-gg/loadout-share-view.ts +++ b/api/dim-gg/loadout-share-view.ts @@ -21,7 +21,7 @@ export const loadoutShareViewHandler = asyncHandler(async (req, res) => { if (!loadout) { // Instruct CF to cache for 15 minutes res.set('Cache-Control', 'max-age=900'); - res.status(404).sendFile(path.join(__dirname + '/views/loadout404.html')); + res.status(404).sendFile(path.join(`${__dirname }/views/loadout404.html`)); return; } @@ -52,7 +52,7 @@ export const loadoutShareViewHandler = asyncHandler(async (req, res) => { const description = loadout.notes ? loadout.notes.length > 197 - ? loadout.notes.substring(0, 197) + '...' + ? `${loadout.notes.substring(0, 197) }...` : loadout.notes : 'Destiny 2 loadout settings shared from DIM'; diff --git a/api/index.ts b/api/index.ts index 56d495f..05262c0 100644 --- a/api/index.ts +++ b/api/index.ts @@ -53,28 +53,28 @@ switch (process.env.VHOST) { vhost('beta.dim.gg', (req, res) => { // Instruct CF to cache for 15 minutes res.set('Cache-Control', 'max-age=900'); - res.redirect('https://beta.destinyitemmanager.com' + req.originalUrl); + res.redirect(`https://beta.destinyitemmanager.com${req.originalUrl}`); }), ); app.use( vhost('app.dim.gg', (req, res) => { // Instruct CF to cache for 15 minutes res.set('Cache-Control', 'max-age=900'); - res.redirect('https://app.destinyitemmanager.com' + req.originalUrl); + res.redirect(`https://app.destinyitemmanager.com${req.originalUrl}`); }), ); app.use( vhost('pr.dim.gg', (req, res) => { // Instruct CF to cache for 15 minutes res.set('Cache-Control', 'max-age=900'); - res.redirect('https://pr.destinyitemmanager.com' + req.originalUrl); + res.redirect(`https://pr.destinyitemmanager.com${req.originalUrl}`); }), ); app.use( vhost('guide.dim.gg', (req, res) => { // Instruct CF to cache for 15 minutes res.set('Cache-Control', 'max-age=900'); - res.redirect('https://github.com/DestinyItemManager/DIM/wiki' + req.originalUrl); + res.redirect(`https://github.com/DestinyItemManager/DIM/wiki${req.originalUrl}`); }), ); } diff --git a/api/metrics/express.ts b/api/metrics/express.ts index 7eca2dd..034f267 100644 --- a/api/metrics/express.ts +++ b/api/metrics/express.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ import { Request, RequestHandler } from 'express'; import { StatsD } from 'hot-shots'; @@ -20,11 +22,11 @@ export default function expressStatsd({ // Status Code const statusCode = res.statusCode || 'unknown_status'; - client.increment(prefix + '.response_code.' + routeName + '.' + statusCode); + client.increment(`${prefix}.response_code.${routeName}.${statusCode}`); // Response Time const duration = performance.now() - startTime; - client.timing(prefix + '.response_time.' + routeName, duration); + client.timing(`${prefix}.response_time.${routeName}`, duration); cleanup(); } @@ -58,10 +60,11 @@ function sanitize(routeName: string) { // Extracts a route name from the request or response and sets it for use by the statsd middleware export function getRouteNameForStats(req: Request) { - if (req.route?.path) { - let routeName = req.route.path; + const route = req.route; + if (route?.path) { + let routeName: string & { source?: string } = route.path; if (Object.prototype.toString.call(routeName) === '[object RegExp]') { - routeName = routeName.source; + routeName = routeName.source!; } if (req.baseUrl) { @@ -72,9 +75,9 @@ export function getRouteNameForStats(req: Request) { const sanitizedRoute = sanitize(routeName); if (sanitizedRoute !== '') { - return req.method + '_' + sanitizedRoute; + return `${req.method}_${sanitizedRoute}`; } } - return req.method + '_unknown_express_route'; //req.method + '_' + sanitize(req.path); + return `${req.method}_unknown_express_route`; // req.method + '_' + sanitize(req.path); } diff --git a/api/metrics/index.ts b/api/metrics/index.ts index e36781b..7636591 100644 --- a/api/metrics/index.ts +++ b/api/metrics/index.ts @@ -4,6 +4,6 @@ export const metrics = new StatsD({ prefix: 'dim-api.', host: process.env.GRAPHITE_SERVICE_HOST || 'localhost', port: process.env.GRAPHITE_SERVICE_PORT_STATSD - ? parseInt(process.env.GRAPHITE_SERVICE_PORT_STATSD) + ? parseInt(process.env.GRAPHITE_SERVICE_PORT_STATSD, 10) : 31202, }); diff --git a/api/routes/auth-token.ts b/api/routes/auth-token.ts index 6c51d39..bbe019b 100644 --- a/api/routes/auth-token.ts +++ b/api/routes/auth-token.ts @@ -7,6 +7,7 @@ import { AuthTokenRequest, AuthTokenResponse } from '../shapes/auth.js'; import jwt, { Secret, SignOptions } from 'jsonwebtoken'; import _ from 'lodash'; import { metrics } from '../metrics/index.js'; +import { ApiApp } from '../shapes/app.js'; import { badRequest } from '../utils.js'; const TOKEN_EXPIRES_IN = 30 * 24 * 60 * 60; // 30 days @@ -15,7 +16,7 @@ const signJwt = util.promisify { const { bungieAccessToken, membershipId } = req.body as AuthTokenRequest; - const apiApp = req.dimApp; + const apiApp = req.dimApp as ApiApp; if (!bungieAccessToken) { badRequest(res, 'No bungieAccessToken provided'); @@ -41,8 +42,8 @@ export const authTokenHandler = asyncHandler(async (req, res) => { if (!bungieResponse.ok) { // TODO: try/catch - const errorBody = await bungieResponse.json(); - if (errorBody.ErrorStatus == 'WebAuthRequired') { + const errorBody = (await bungieResponse.json()) as ApiError; + if (errorBody.ErrorStatus === 'WebAuthRequired') { metrics.increment('authToken.webAuthRequired.count'); res.status(401).send({ error: 'WebAuthRequired', @@ -122,3 +123,8 @@ export const authTokenHandler = asyncHandler(async (req, res) => { throw e; } }); + +interface ApiError { + ErrorStatus: string; + Message: string; +} diff --git a/api/routes/create-app.ts b/api/routes/create-app.ts index 68ac63a..3293f44 100644 --- a/api/routes/create-app.ts +++ b/api/routes/create-app.ts @@ -1,4 +1,5 @@ import asyncHandler from 'express-async-handler'; +import { DatabaseError } from 'pg'; import { v4 as uuid } from 'uuid'; import { getAppById, insertApp } from '../db/apps-queries.js'; import { transaction } from '../db/index.js'; @@ -52,7 +53,7 @@ export const createAppHandler = asyncHandler(async (req, res) => { await insertApp(client, app); } catch (e) { // This is a unique constraint violation, so just get the app! - if (e.code == '23505') { + if (e instanceof DatabaseError && e.code === '23505') { await client.query('ROLLBACK'); app = (await getAppById(client, request.id))!; } else { diff --git a/api/routes/delete-all-data.ts b/api/routes/delete-all-data.ts index d9907be..0ada445 100644 --- a/api/routes/delete-all-data.ts +++ b/api/routes/delete-all-data.ts @@ -8,12 +8,13 @@ import { deleteAllSearches } from '../db/searches-queries.js'; import { deleteSettings } from '../db/settings-queries.js'; import { deleteAllTrackedTriumphs } from '../db/triumphs-queries.js'; import { DeleteAllResponse } from '../shapes/delete-all.js'; +import { UserInfo } from '../shapes/user.js'; /** * Delete My Data - this allows a user to wipe all their data from DIM storage. */ export const deleteAllDataHandler = asyncHandler(async (req, res) => { - const { bungieMembershipId } = req.user; + const { bungieMembershipId } = req.user as UserInfo; const result = await transaction(async (client) => { const deleted = await deleteAllData(client, bungieMembershipId); @@ -31,11 +32,11 @@ export async function deleteAllData( bungieMembershipId: number, ): Promise { return { - settings: (await deleteSettings(client, bungieMembershipId)).rowCount, - loadouts: (await deleteAllLoadouts(client, bungieMembershipId)).rowCount, - tags: (await deleteAllItemAnnotations(client, bungieMembershipId)).rowCount, - itemHashTags: (await deleteAllItemHashTags(client, bungieMembershipId)).rowCount, - triumphs: (await deleteAllTrackedTriumphs(client, bungieMembershipId)).rowCount, - searches: (await deleteAllSearches(client, bungieMembershipId)).rowCount, + settings: (await deleteSettings(client, bungieMembershipId)).rowCount!, + loadouts: (await deleteAllLoadouts(client, bungieMembershipId)).rowCount!, + tags: (await deleteAllItemAnnotations(client, bungieMembershipId)).rowCount!, + itemHashTags: (await deleteAllItemHashTags(client, bungieMembershipId)).rowCount!, + triumphs: (await deleteAllTrackedTriumphs(client, bungieMembershipId)).rowCount!, + searches: (await deleteAllSearches(client, bungieMembershipId)).rowCount!, }; } diff --git a/api/routes/donate.ts b/api/routes/donate.ts index 2a5ec07..526fba3 100644 --- a/api/routes/donate.ts +++ b/api/routes/donate.ts @@ -15,6 +15,10 @@ export const donateHandler = asyncHandler(async (_req, res) => { } catch (e) { res.set('Cache-Control', 'max-age=60'); res.status(500); - res.send(e.message); + if (e instanceof Error) { + res.send(e.message); + } else { + res.send(`Unknown error: ${e as string}`); + } } }); diff --git a/api/routes/export.ts b/api/routes/export.ts index 303dbfa..7b56491 100644 --- a/api/routes/export.ts +++ b/api/routes/export.ts @@ -7,9 +7,10 @@ import { getSearchesForUser } from '../db/searches-queries.js'; import { getSettings } from '../db/settings-queries.js'; import { getAllTrackedTriumphsForUser } from '../db/triumphs-queries.js'; import { ExportResponse } from '../shapes/export.js'; +import { UserInfo } from '../shapes/user.js'; export const exportHandler = asyncHandler(async (req, res) => { - const { bungieMembershipId } = req.user; + const { bungieMembershipId } = req.user as UserInfo; const response = await readTransaction(async (client) => { const settings = await getSettings(client, bungieMembershipId); diff --git a/api/routes/import.ts b/api/routes/import.ts index ffdc847..7c84071 100644 --- a/api/routes/import.ts +++ b/api/routes/import.ts @@ -7,6 +7,7 @@ import { updateLoadout } from '../db/loadouts-queries.js'; import { importSearch } from '../db/searches-queries.js'; import { replaceSettings } from '../db/settings-queries.js'; import { trackTriumph } from '../db/triumphs-queries.js'; +import { ApiApp } from '../shapes/app.js'; import { ExportResponse } from '../shapes/export.js'; import { DestinyVersion } from '../shapes/general.js'; import { ImportResponse } from '../shapes/import.js'; @@ -14,12 +15,13 @@ import { ItemAnnotation } from '../shapes/item-annotations.js'; import { Loadout } from '../shapes/loadouts.js'; import { SearchType } from '../shapes/search.js'; import { defaultSettings, Settings } from '../shapes/settings.js'; +import { UserInfo } from '../shapes/user.js'; import { badRequest } from '../utils.js'; import { deleteAllData } from './delete-all-data.js'; export const importHandler = asyncHandler(async (req, res) => { - const { bungieMembershipId } = req.user; - const { id: appId } = req.dimApp; + const { bungieMembershipId } = req.user as UserInfo; + const { id: appId } = req.dimApp as ApiApp; // Support only new API exports const importData = req.body as ExportResponse; @@ -127,8 +129,8 @@ export const importHandler = asyncHandler(async (req, res) => { }); /** Produce a new object that's only the key/values of obj that are also keys in defaults and which have values different from defaults. */ -function subtractObject(obj: object | undefined, defaults: object) { - const result = {}; +function subtractObject(obj: Partial, defaults: T): T { + const result: Partial = {}; if (obj) { for (const key in defaults) { if (obj[key] !== undefined && obj[key] !== defaults[key]) { @@ -136,11 +138,11 @@ function subtractObject(obj: object | undefined, defaults: object) { } } } - return result; + return result as T; } function extractSettings(importData: ExportResponse): Settings { - return subtractObject(importData.settings, defaultSettings) as Settings; + return subtractObject(importData.settings, defaultSettings); } type PlatformLoadout = Loadout & { diff --git a/api/routes/loadout-share.ts b/api/routes/loadout-share.ts index 6f61f95..d491072 100644 --- a/api/routes/loadout-share.ts +++ b/api/routes/loadout-share.ts @@ -1,15 +1,18 @@ import crypto from 'crypto'; import asyncHandler from 'express-async-handler'; import base32 from 'hi-base32'; +import { DatabaseError } from 'pg'; import { transaction } from '../db/index.js'; import { addLoadoutShare, getLoadoutShare, recordAccess } from '../db/loadout-share-queries.js'; import { metrics } from '../metrics/index.js'; +import { ApiApp } from '../shapes/app.js'; import { GetSharedLoadoutResponse, LoadoutShareRequest, LoadoutShareResponse, } from '../shapes/loadout-share.js'; import { Loadout } from '../shapes/loadouts.js'; +import { UserInfo } from '../shapes/user.js'; import slugify from './slugify.js'; import { validateLoadout } from './update.js'; @@ -25,9 +28,9 @@ const getShareURL = (loadout: Loadout, shareId: string) => { * Save a loadout to be shared via a dim.gg link. */ export const loadoutShareHandler = asyncHandler(async (req, res) => { - const { bungieMembershipId } = req.user; - const { id: appId } = req.dimApp; - metrics.increment('loadout_share.app.' + appId, 1); + const { bungieMembershipId } = req.user as UserInfo; + const { id: appId } = req.dimApp as ApiApp; + metrics.increment(`loadout_share.app.${appId}`, 1); const request = req.body as LoadoutShareRequest; const { platformMembershipId, loadout } = request; @@ -47,7 +50,7 @@ export const loadoutShareHandler = asyncHandler(async (req, res) => { } const shareId = await transaction(async (client) => { - const attempts = 0; + let attempts = 0; // We'll make three attempts to guess a random non-colliding number while (attempts < 4) { const shareId = generateRandomShareId(); @@ -63,12 +66,13 @@ export const loadoutShareHandler = asyncHandler(async (req, res) => { return shareId; } catch (e) { // This is a unique constraint violation, generate another random share ID - if (e.code == '23505') { + if (e instanceof DatabaseError && e.code === '23505') { // try again! } else { throw e; } } + attempts++; } return 'ran-out'; }); diff --git a/api/routes/platform-info.ts b/api/routes/platform-info.ts index 1f460fc..64f1407 100644 --- a/api/routes/platform-info.ts +++ b/api/routes/platform-info.ts @@ -12,7 +12,7 @@ export const platformInfoHandler = asyncHandler(async (req, res) => { values: [flavor], }); const settings = - result.rowCount > 0 + result.rowCount! > 0 ? { ...defaultGlobalSettings, ...camelize(result.rows[0]) } : defaultGlobalSettings; diff --git a/api/routes/profile.ts b/api/routes/profile.ts index b757370..d0ed6f2 100644 --- a/api/routes/profile.ts +++ b/api/routes/profile.ts @@ -8,9 +8,11 @@ import { getSearchesForProfile } from '../db/searches-queries.js'; import { getSettings } from '../db/settings-queries.js'; import { getTrackedTriumphsForProfile } from '../db/triumphs-queries.js'; import { metrics } from '../metrics/index.js'; +import { ApiApp } from '../shapes/app.js'; import { DestinyVersion } from '../shapes/general.js'; import { ProfileResponse } from '../shapes/profile.js'; import { defaultSettings } from '../shapes/settings.js'; +import { UserInfo } from '../shapes/user.js'; import { badRequest, checkPlatformMembershipId, isValidPlatformMembershipId } from '../utils.js'; const validComponents = new Set([ @@ -23,9 +25,9 @@ const validComponents = new Set([ ]); export const profileHandler = asyncHandler(async (req, res) => { - const { bungieMembershipId, profileIds } = req.user; - const { id: appId } = req.dimApp; - metrics.increment('profile.app.' + appId, 1); + const { bungieMembershipId, profileIds } = req.user as UserInfo; + const { id: appId } = req.dimApp as ApiApp; + metrics.increment(`profile.app.${appId}`, 1); const platformMembershipId = req.query.platformMembershipId?.toString(); @@ -36,12 +38,13 @@ export const profileHandler = asyncHandler(async (req, res) => { checkPlatformMembershipId(platformMembershipId, profileIds, 'profile'); - const destinyVersion: DestinyVersion = req.query.destinyVersion - ? (parseInt(req.query.destinyVersion.toString(), 10) as DestinyVersion) - : 2; + const destinyVersion: DestinyVersion = + req.query.destinyVersion && typeof req.query.destinyVersion === 'string' + ? (parseInt(req.query.destinyVersion.toString(), 10) as DestinyVersion) + : 2; if (destinyVersion !== 1 && destinyVersion !== 2) { - badRequest(res, `destinyVersion ${destinyVersion} is not in the right format`); + badRequest(res, `destinyVersion ${destinyVersion as number} is not in the right format`); return; } @@ -70,20 +73,20 @@ export const profileHandler = asyncHandler(async (req, res) => { const storedSettings = await getSettings(client, bungieMembershipId); // Clean out deprecated settings (TODO purge from DB) - delete storedSettings['allowIdPostToDtr']; - delete storedSettings['colorA11y']; - delete storedSettings['itemDetails']; - delete storedSettings['itemPickerEquip']; - delete storedSettings['itemSort']; - delete storedSettings['loAssumeMasterwork']; - delete storedSettings['loLockItemEnergyType']; - delete storedSettings['loMinPower']; - delete storedSettings['loMinStatTotal']; - delete storedSettings['loStatSortOrder']; - delete storedSettings['loUpgradeSpendTier']; - delete storedSettings['reviewsModeSelection']; - delete storedSettings['reviewsPlatformSelectionV2']; - delete storedSettings['showReviews']; + delete (storedSettings as Record).allowIdPostToDtr; + delete (storedSettings as Record).colorA11y; + delete (storedSettings as Record).itemDetails; + delete (storedSettings as Record).itemPickerEquip; + delete (storedSettings as Record).itemSort; + delete (storedSettings as Record).loAssumeMasterwork; + delete (storedSettings as Record).loLockItemEnergyType; + delete (storedSettings as Record).loMinPower; + delete (storedSettings as Record).loMinStatTotal; + delete (storedSettings as Record).loStatSortOrder; + delete (storedSettings as Record).loUpgradeSpendTier; + delete (storedSettings as Record).reviewsModeSelection; + delete (storedSettings as Record).reviewsPlatformSelectionV2; + delete (storedSettings as Record).showReviews; response.settings = { ...defaultSettings, diff --git a/api/routes/slugify.ts b/api/routes/slugify.ts index 14c4506..d93839b 100644 --- a/api/routes/slugify.ts +++ b/api/routes/slugify.ts @@ -3,4 +3,18 @@ */ import slugify from 'slugify'; -export default slugify as unknown as typeof slugify.default; +export default slugify as unknown as (( + string: string, + options?: + | { + replacement?: string; + remove?: RegExp; + lower?: boolean; + strict?: boolean; + locale?: string; + trim?: boolean; + } + | string, +) => string) & { + extend: (args: Record) => void; +}; diff --git a/api/routes/update.ts b/api/routes/update.ts index 111a4b0..bc2ffd4 100644 --- a/api/routes/update.ts +++ b/api/routes/update.ts @@ -18,6 +18,7 @@ import { import { setSetting as setSettingInDb } from '../db/settings-queries.js'; import { trackTriumph as trackTriumphInDb, unTrackTriumph } from '../db/triumphs-queries.js'; import { metrics } from '../metrics/index.js'; +import { ApiApp } from '../shapes/app.js'; import { DestinyVersion } from '../shapes/general.js'; import { ItemAnnotation } from '../shapes/item-annotations.js'; import { Loadout } from '../shapes/loadouts.js'; @@ -32,6 +33,7 @@ import { } from '../shapes/profile.js'; import { SearchType } from '../shapes/search.js'; import { Settings } from '../shapes/settings.js'; +import { UserInfo } from '../shapes/user.js'; import { badRequest, checkPlatformMembershipId, @@ -46,9 +48,9 @@ import { * Note that you can't mix updates for multiple profiles - you'll have to make multiple requests. */ export const updateHandler = asyncHandler(async (req, res) => { - const { bungieMembershipId, profileIds } = req.user; - const { id: appId } = req.dimApp; - metrics.increment('update.app.' + appId, 1); + const { bungieMembershipId, profileIds } = req.user as UserInfo; + const { id: appId } = req.dimApp as ApiApp; + metrics.increment(`update.app.${appId}`, 1); const request = req.body as ProfileUpdateRequest; const { platformMembershipId, updates } = request; const destinyVersion = request.destinyVersion ?? 2; @@ -61,7 +63,7 @@ export const updateHandler = asyncHandler(async (req, res) => { checkPlatformMembershipId(platformMembershipId, profileIds, 'update'); if (destinyVersion !== 1 && destinyVersion !== 2) { - badRequest(res, `destinyVersion ${destinyVersion} is not in the right format`); + badRequest(res, `destinyVersion ${destinyVersion as number} is not in the right format`); return; } @@ -76,7 +78,7 @@ export const updateHandler = asyncHandler(async (req, res) => { for (const update of updates) { let result: ProfileUpdateResult; - metrics.increment('update.action.' + update.action + '.count'); + metrics.increment(`update.action.${update.action}.count`); switch (update.action) { case 'setting': @@ -153,13 +155,13 @@ export const updateHandler = asyncHandler(async (req, res) => { default: console.warn( - `Unknown action type: ${(update as any).action} from ${appId}, ${req.header( + `Unknown action type: ${(update as { action: string }).action} from ${appId}, ${req.header( 'User-Agent', )}, ${req.header('Referer')}`, ); result = { status: 'InvalidArgument', - message: `Unknown action type: ${(update as any).action}`, + message: `Unknown action type: ${(update as { action: string }).action}`, }; } results.push(result); @@ -225,14 +227,14 @@ async function updateLoadout( export function validateLoadout(metricPrefix: string, loadout: Loadout) { if (!loadout.name) { - metrics.increment(metricPrefix + '.validation.loadoutNameMissing.count'); + metrics.increment(`${metricPrefix}.validation.loadoutNameMissing.count`); return { status: 'InvalidArgument', message: 'Loadout name missing', }; } if (loadout.name.length > 120) { - metrics.increment(metricPrefix + '.validation.loadoutNameTooLong.count'); + metrics.increment(`${metricPrefix}.validation.loadoutNameTooLong.count`); return { status: 'InvalidArgument', message: 'Loadout names must be under 120 characters', @@ -240,7 +242,7 @@ export function validateLoadout(metricPrefix: string, loadout: Loadout) { } if (loadout.notes && loadout.notes.length > 2048) { - metrics.increment(metricPrefix + '.validation.loadoutNotesTooLong.count'); + metrics.increment(`${metricPrefix}.validation.loadoutNotesTooLong.count`); return { status: 'InvalidArgument', message: 'Loadout notes must be under 2048 characters', @@ -248,14 +250,14 @@ export function validateLoadout(metricPrefix: string, loadout: Loadout) { } if (!loadout.id) { - metrics.increment(metricPrefix + '.loadoutIdMissing.count'); + metrics.increment(`${metricPrefix}.loadoutIdMissing.count`); return { status: 'InvalidArgument', message: 'Loadout id missing', }; } if (loadout.id && loadout.id.length > 120) { - metrics.increment(metricPrefix + '.validation.loadoutIdTooLong.count'); + metrics.increment(`${metricPrefix}.validation.loadoutIdTooLong.count`); return { status: 'InvalidArgument', message: 'Loadout ids must be under 120 characters', @@ -263,21 +265,21 @@ export function validateLoadout(metricPrefix: string, loadout: Loadout) { } if (!Number.isFinite(loadout.classType)) { - metrics.increment(metricPrefix + '.validation.classTypeMissing.count'); + metrics.increment(`${metricPrefix}.validation.classTypeMissing.count`); return { status: 'InvalidArgument', message: 'Loadout class type missing or malformed', }; } if (loadout.classType < 0 || loadout.classType > 3) { - metrics.increment(metricPrefix + '.validation.classTypeOutOfRange.count'); + metrics.increment(`${metricPrefix}.validation.classTypeOutOfRange.count`); return { status: 'InvalidArgument', message: 'Loadout class type out of range', }; } if ([...loadout.equipped, ...loadout.unequipped].some((i) => i.id && !isValidItemId(i.id))) { - metrics.increment(metricPrefix + '.validation.itemIdFormat.count'); + metrics.increment(`${metricPrefix}.validation.itemIdFormat.count`); return { status: 'InvalidArgument', message: 'Item ID is invalid', @@ -295,7 +297,7 @@ async function deleteLoadout( const start = new Date(); const loadout = await deleteLoadoutInDb(client, bungieMembershipId, loadoutId); metrics.timing('update.deleteLoadout', start); - if (loadout == null) { + if (loadout === null) { return { status: 'NotFound', message: 'No loadout found with that ID' }; } diff --git a/api/server.test.ts b/api/server.test.ts index 8d2bb01..e67e8c4 100644 --- a/api/server.test.ts +++ b/api/server.test.ts @@ -1,6 +1,5 @@ import { readFile } from 'fs'; import { sign } from 'jsonwebtoken'; -import _ from 'lodash'; import { makeFetch } from 'supertest-fetch'; import { promisify } from 'util'; import { v4 as uuid } from 'uuid'; @@ -8,6 +7,7 @@ import { refreshApps } from './apps/index.js'; import { closeDbPool } from './db/index.js'; import { app } from './server.js'; import { ApiApp } from './shapes/app.js'; +import { DeleteAllResponse } from './shapes/delete-all.js'; import { ExportResponse } from './shapes/export.js'; import { PlatformInfoResponse } from './shapes/global-settings.js'; import { ImportResponse } from './shapes/import.js'; @@ -161,9 +161,11 @@ describe('profile', () => { }); it('can delete all data with /delete_all_data', async () => { - const response = await postRequestAuthed('/delete_all_data').expect(200); + const response = (await postRequestAuthed('/delete_all_data') + .expect(200) + .json()) as DeleteAllResponse; - expect((await response.json()).deleted).toEqual({ + expect(response.deleted).toEqual({ itemHashTags: 71, loadouts: 37, searches: 205, @@ -175,7 +177,7 @@ describe('profile', () => { // Now re-export and make sure it's all gone const exportResponse = (await getRequestAuthed('/export').expect(200).json()) as ExportResponse; - expect(_.size(exportResponse.settings)).toBe(0); + expect(Object.keys(exportResponse.settings).length).toBe(0); expect(exportResponse.loadouts.length).toBe(0); expect(exportResponse.tags.length).toBe(0); }); @@ -274,7 +276,7 @@ describe('loadouts', () => { expect(resultLoadout.clearSpace).toBe(loadout.clearSpace); expect(resultLoadout.equipped).toEqual(loadout.equipped); // This property should have been stripped - expect((resultLoadout.unequipped[0] as any).fizbuzz).toBeUndefined(); + expect((resultLoadout.unequipped[0] as { fizbuzz?: string }).fizbuzz).toBeUndefined(); }); it('can update a loadout', async () => { diff --git a/api/server.ts b/api/server.ts index f003273..1e3f274 100644 --- a/api/server.ts +++ b/api/server.ts @@ -1,7 +1,8 @@ import * as Sentry from '@sentry/node'; import cors from 'cors'; -import express from 'express'; +import express, { ErrorRequestHandler } from 'express'; import { expressjwt as jwt } from 'express-jwt'; +import { JwtPayload } from 'jsonwebtoken'; import { apiKey, isAppOrigin } from './apps/index.js'; import expressStatsd from './metrics/express.js'; import { metrics } from './metrics/index.js'; @@ -15,6 +16,8 @@ import { getLoadoutShareHandler, loadoutShareHandler } from './routes/loadout-sh import { platformInfoHandler } from './routes/platform-info.js'; import { profileHandler } from './routes/profile.js'; import { updateHandler } from './routes/update.js'; +import { ApiApp } from './shapes/app.js'; +import { UserInfo } from './shapes/user.js'; export const app = express(); @@ -67,8 +70,9 @@ app.use(apiKeyCors); // Validate that the API key in the header is valid for this origin. app.use((req, res, next) => { - if (req.dimApp && req.headers.origin && req.dimApp.origin !== req.headers.origin) { - console.warn('OriginMismatch', req.dimApp?.id, req.dimApp?.origin, req.headers.origin); + const dimApp = req.dimApp as ApiApp | undefined; + if (dimApp && req.headers.origin && dimApp.origin !== req.headers.origin) { + console.warn('OriginMismatch', dimApp?.id, dimApp?.origin, req.headers.origin); metrics.increment('apiKey.wrongOrigin.count'); // TODO: sentry res.status(401).send({ @@ -104,19 +108,20 @@ app.use((req, _, next) => { console.error('JWT expected', req.path); next(new Error('Expected JWT info')); } else { - if (req.jwt.exp) { + const jwt = req.jwt as JwtPayload & { profileIds?: string[] }; + if (jwt.exp) { const nowSecs = Date.now() / 1000; - if (req.jwt.exp > nowSecs) { - metrics.timing('authToken.age', req.jwt.exp - nowSecs); + if (jwt.exp > nowSecs) { + metrics.timing('authToken.age', jwt.exp - nowSecs); } else { metrics.increment('authToken.expired.count'); } } req.user = { - bungieMembershipId: parseInt(req.jwt.sub!, 10), - dimApiKey: req.jwt.iss!, - profileIds: req.jwt['profileIds'] ?? [], + bungieMembershipId: parseInt(jwt.sub!, 10), + dimApiKey: jwt.iss!, + profileIds: jwt.profileIds ?? [], }; next(); } @@ -124,8 +129,10 @@ app.use((req, _, next) => { // Validate that the auth token and the API key in the header match. app.use((req, res, next) => { - if (req.dimApp && req.dimApp.dimApiKey !== req.jwt.iss) { - console.warn('ApiKeyMismatch', req.dimApp?.id, req.dimApp?.dimApiKey, req.jwt.iss); + const dimApp = req.dimApp as ApiApp | undefined; + const jwt = req.jwt as JwtPayload & { profileIds?: string[] }; + if (dimApp && dimApp.dimApiKey !== jwt.iss) { + console.warn('ApiKeyMismatch', dimApp?.id, dimApp?.dimApiKey, jwt.iss); metrics.increment('apiKey.mismatch.count'); res.status(401).send({ error: 'ApiKeyMismatch', @@ -151,28 +158,33 @@ app.post('/delete_all_data', deleteAllDataHandler); // Share a loadout app.post('/loadout_share', loadoutShareHandler); -app.use((err: Error, req, res, _next) => { +const errorHandler: ErrorRequestHandler = (err, req, res, _next) => { + const dimApp = req.dimApp as ApiApp | undefined; + const user = req.user as UserInfo | undefined; Sentry.captureException(err); // Allow any origin to see the response res.header('Access-Control-Allow-Origin', '*'); - if (err.name === 'UnauthorizedError') { - console.warn('Unauthorized', req.dimApp?.id, req.originalUrl, err); + if (err instanceof Error && err.name === 'UnauthorizedError') { + console.warn('Unauthorized', dimApp?.id, req.originalUrl, err); res.status(401).send({ error: err.name, message: err.message, }); } else { + const e = err instanceof Error ? err : new Error(`${err}`); + console.error( 'ServerError', - req.dimApp?.id, + dimApp?.id, req.method, req.originalUrl, - req.user?.bungieMembershipId, + user?.bungieMembershipId, err, ); res.status(500).send({ - error: err.name, - message: err.message, + error: e.name, + message: e.message, }); } -}); +}; +app.use(errorHandler); diff --git a/api/shapes/loadouts.ts b/api/shapes/loadouts.ts index 0dfe311..76a18fe 100644 --- a/api/shapes/loadouts.ts +++ b/api/shapes/loadouts.ts @@ -198,12 +198,12 @@ export interface LoadoutParameters { */ export const defaultLoadoutParameters: LoadoutParameters = { statConstraints: [ - { statHash: 2996146975 }, //Mobility - { statHash: 392767087 }, //Resilience - { statHash: 1943323491 }, //Recovery - { statHash: 1735777505 }, //Discipline - { statHash: 144602215 }, //Intellect - { statHash: 4244567218 }, //Strength + { statHash: 2996146975 }, // Mobility + { statHash: 392767087 }, // Resilience + { statHash: 1943323491 }, // Recovery + { statHash: 1735777505 }, // Discipline + { statHash: 144602215 }, // Intellect + { statHash: 4244567218 }, // Strength ], mods: [], assumeArmorMasterwork: AssumeArmorMasterwork.None, diff --git a/api/tsconfig.eslint.json b/api/tsconfig.eslint.json new file mode 100644 index 0000000..b6b017c --- /dev/null +++ b/api/tsconfig.eslint.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "noEmit": true + }, + "extends": "./tsconfig.json", + "exclude": ["node_modules", "dist"], + "include": ["**/*.ts", "**/*.js", "**/*.cjs", "**/*.mjs", "**/*.json"] +} diff --git a/api/utils.ts b/api/utils.ts index c5215e7..acbb2ea 100644 --- a/api/utils.ts +++ b/api/utils.ts @@ -2,7 +2,100 @@ import { Response } from 'express'; import _ from 'lodash'; import { metrics } from './metrics/index.js'; -export function camelize(data: object) { +/** + * This is a utility function to extract the types of a subset of value types + * from an object based on an ordered set of keys. It's useful for typing a + * postgres insert. + * @example + * type MyArgsList = TypesForKeys<{a: string, b: number, c: boolean}, ['a', 'c']>; + */ +export type TypesForKeys, K extends (keyof T)[]> = { + [Index in keyof K]: T[K[Index]]; +}; + +/** Convert a snake_case string to camelCase */ +type CamelCase = S extends `${infer P1}_${infer P2}${infer P3}` + ? `${Lowercase}${Uppercase}${CamelCase}` + : Lowercase; + +/** + * Convert an object to a new object with snake_case keys replaced with camelCase. + */ +export type KeysToCamelCase = { + // eslint-disable-next-line @typescript-eslint/no-empty-object-type + [K in keyof T as CamelCase]: T[K] extends {} ? KeysToCamelCase : T[K]; +}; + +type UpperCaseLetters = + | 'A' + | 'B' + | 'C' + | 'D' + | 'E' + | 'F' + | 'G' + | 'H' + | 'I' + | 'J' + | 'K' + | 'L' + | 'M' + | 'N' + | 'O' + | 'P' + | 'Q' + | 'R' + | 'S' + | 'T' + | 'U' + | 'V' + | 'W' + | 'X' + | 'Y' + | 'Z' + | '0' + | '1' + | '2' + | '3' + | '4' + | '5' + | '6' + | '7' + | '8' + | '9'; + +type SnakeCaseSeq = S extends `${infer P1}${infer P2}` + ? P1 extends UpperCaseLetters + ? `_${Lowercase}${SnakeCaseSeq}` + : `${P1}${SnakeCaseSeq}` + : Lowercase; + +/** + * Convert a camelCase string to snake_case + */ +export type SnakeCase = S extends `${infer P1}${infer P2}` + ? `${Lowercase}${SnakeCaseSeq}` + : Lowercase; + +type ObjectToSnakeCase = { + [K in keyof T as SnakeCase]: T[K] extends Record + ? KeysToSnakeCase + : T[K]; +}; + +/** + * Convert an object to a new object with camelCase keys replaced with snake_case. + */ +export type KeysToSnakeCase = { + [K in keyof T as SnakeCase]: T[K] extends any[] + ? KeysToSnakeCase[] + : ObjectToSnakeCase; +}; + +/** + * Convert an object to a new object with snake_case keys replaced with camelCase. + */ +export function camelize(data: KeysToSnakeCase): T { return _.mapKeys(data, (_value, key) => _.camelCase(key)) as T; } @@ -43,14 +136,13 @@ export function checkPlatformMembershipId( if (platformMembershipId) { if (profileIds.length) { metrics.increment( - metricsPrefix + - '.profileIds.' + - (profileIds.includes(platformMembershipId) ? 'match' : 'noMatch') + - '.count', + `${metricsPrefix}.profileIds.${ + profileIds.includes(platformMembershipId) ? 'match' : 'noMatch' + }.count`, 1, ); } else { - metrics.increment(metricsPrefix + '.profileIds.missing.count', 1); + metrics.increment(`${metricsPrefix}.profileIds.missing.count`, 1); } } } diff --git a/build-dim-api-types.sh b/build-dim-api-types.sh index 8e602b1..1697770 100755 --- a/build-dim-api-types.sh +++ b/build-dim-api-types.sh @@ -3,6 +3,7 @@ shopt -s extglob # Prepare the generated source directory rm -f dim-api-types/*.js +rm -f dim-api-types/*.cjs rm -f dim-api-types/*.ts rm -f api/shapes/index.ts rm -rf dim-api-types/esm diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..79f6f2e --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,229 @@ +import eslint from '@eslint/js'; +import * as regexpPlugin from 'eslint-plugin-regexp'; +import sonarjs from 'eslint-plugin-sonarjs'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; + +// TODO: different configs for JS vs TS +export default tseslint.config( + { name: 'eslint/recommended', ...eslint.configs.recommended }, + ...tseslint.configs.recommendedTypeChecked, + { + name: 'typescript-eslint/parser-options', + languageOptions: { + parserOptions: { + project: './api/tsconfig.eslint.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + ...tseslint.configs.stylisticTypeChecked, + regexpPlugin.configs['flat/recommended'], + { name: 'sonarjs/recommended', ...sonarjs.configs.recommended }, + { + name: 'global ignores', + ignores: ['*.test.ts', '*/migrations/*'], + }, + { + name: 'dim-api-custom', + languageOptions: { + ecmaVersion: 'latest', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + sourceType: 'module', + globals: { + ...globals.node, + }, + }, + linterOptions: { + reportUnusedDisableDirectives: true, + }, + rules: { + 'no-console': 'off', + 'no-empty': 'off', + 'require-atomic-updates': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + varsIgnorePattern: '(^_|[iI]gnored)', + argsIgnorePattern: '(^_|[iI]gnored)', + ignoreRestSiblings: true, + }, + ], + 'no-restricted-properties': [ + 1, + { + object: '_', + property: 'forEach', + message: 'Please use a for in loop.', + }, + { + object: '_', + property: 'filter', + message: 'Please use the native js filter.', + }, + { + object: '_', + property: 'map', + message: 'Please use the native js map.', + }, + { + object: '_', + property: 'uniq', + message: 'Please use Array.from(new Set(foo)) or [...new Set(foo)] instead.', + }, + { + object: '_', + property: 'forIn', + message: 'Please use Object.values or Object.entries instead', + }, + { + object: '_', + property: 'noop', + message: + 'Import noop directly instead of using it through _.noop, to satisfy the unbound-method lint', + }, + { + object: '_', + property: 'groupBy', + message: 'Use Object.groupBy or Map.groupBy instead.', + }, + { + object: '_', + property: 'cloneDeep', + message: 'Use structuredClone instead.', + }, + ], + 'no-restricted-syntax': [ + 'error', + { + selector: 'TSEnumDeclaration:not([const=true])', + message: 'Please only use `const enum`s.', + }, + ], + // TODO: Switch to @stylistic/eslint-plugin-js for this one rule + 'spaced-comment': [ + 'error', + 'always', + { exceptions: ['@__INLINE__'], block: { balanced: true } }, + ], + 'arrow-body-style': ['error', 'as-needed'], + curly: ['error', 'all'], + eqeqeq: ['error', 'always'], + 'no-return-await': 'off', + '@typescript-eslint/return-await': ['error', 'in-try-catch'], + 'prefer-regex-literals': 'error', + 'prefer-promise-reject-errors': 'error', + 'prefer-spread': 'error', + radix: 'error', + yoda: 'error', + 'prefer-template': 'error', + 'class-methods-use-this': ['error', { exceptMethods: ['render'] }], + 'no-unmodified-loop-condition': 'error', + 'no-unreachable-loop': 'error', + 'no-unused-private-class-members': 'error', + 'func-name-matching': 'error', + 'logical-assignment-operators': 'error', + 'no-lonely-if': 'error', + 'no-unneeded-ternary': 'error', + 'no-useless-call': 'error', + 'no-useless-concat': 'error', + 'no-useless-rename': 'error', + '@typescript-eslint/await-thenable': 'error', + '@typescript-eslint/no-misused-promises': [ + 'error', + { + checksVoidReturn: false, + }, + ], + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/explicit-member-accessibility': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/method-signature-style': 'error', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-use-before-define': ['error', { functions: false }], + '@typescript-eslint/no-parameter-properties': 'off', + '@typescript-eslint/no-extraneous-class': 'error', + '@typescript-eslint/no-this-alias': 'error', + '@typescript-eslint/no-unnecessary-type-constraint': 'error', + '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error', + '@typescript-eslint/no-unnecessary-qualifier': 'error', + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + '@typescript-eslint/no-unnecessary-type-arguments': 'error', + '@typescript-eslint/prefer-function-type': 'error', + '@typescript-eslint/prefer-for-of': 'error', + '@typescript-eslint/prefer-optional-chain': 'error', + '@typescript-eslint/prefer-as-const': 'error', + '@typescript-eslint/prefer-reduce-type-parameter': 'error', + '@typescript-eslint/prefer-includes': 'error', + '@typescript-eslint/prefer-string-starts-ends-with': 'error', + '@typescript-eslint/prefer-ts-expect-error': 'error', + '@typescript-eslint/prefer-regexp-exec': 'off', + '@typescript-eslint/array-type': 'error', + '@typescript-eslint/no-non-null-asserted-optional-chain': 'error', + '@typescript-eslint/unified-signatures': 'error', + '@typescript-eslint/no-base-to-string': 'error', + '@typescript-eslint/non-nullable-type-assertion-style': 'error', + '@typescript-eslint/switch-exhaustiveness-check': 'error', + '@typescript-eslint/consistent-type-definitions': 'error', + '@typescript-eslint/consistent-generic-constructors': 'error', + '@typescript-eslint/no-duplicate-enum-values': 'error', + '@typescript-eslint/only-throw-error': 'error', + '@typescript-eslint/no-unused-expressions': [ + 'error', + { allowShortCircuit: true, allowTernary: true }, + ], + '@typescript-eslint/no-for-in-array': 'error', + '@typescript-eslint/consistent-indexed-object-style': 'off', + '@typescript-eslint/no-floating-promises': 'off', + '@typescript-eslint/require-await': 'off', + '@typescript-eslint/no-unsafe-enum-comparison': 'off', + '@typescript-eslint/prefer-nullish-coalescing': [ + 'off', + { + ignoreConditionalTests: true, + ignoreTernaryTests: false, + ignoreMixedLogicalExpressions: true, + ignorePrimitives: { + boolean: true, + number: false, + string: true, + }, + }, + ], + '@typescript-eslint/no-unsafe-argument': 'error', + '@typescript-eslint/no-unsafe-assignment': 'error', + '@typescript-eslint/no-unsafe-call': 'error', + '@typescript-eslint/no-unsafe-member-access': 'error', + '@typescript-eslint/no-unsafe-return': 'error', + '@typescript-eslint/no-redundant-type-constituents': 'off', + 'no-implied-eval': 'off', + '@typescript-eslint/no-implied-eval': 'error', + 'sonarjs/cognitive-complexity': 'off', + 'sonarjs/no-small-switch': 'off', + 'sonarjs/no-duplicate-string': 'off', + 'sonarjs/prefer-immediate-return': 'off', + 'sonarjs/no-nested-switch': 'off', + 'sonarjs/no-nested-template-literals': 'off', + }, + }, + { + files: ['src/**/*.cjs'], + rules: { + '@typescript-eslint/no-require-imports': 'off', + }, + }, + { + name: 'tests', + files: ['**/*.test.ts'], + rules: { + // We don't want to allow importing test modules in app modules, but of course you can do it in other test modules. + 'no-restricted-imports': 'off', + }, + }, +); diff --git a/jest.config.js b/jest.config.js index 6d801d7..8c385d6 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,5 @@ import { pathsToModuleNameMapper } from 'ts-jest'; -import tsConfig from './tsconfig.json' assert { type: 'json' }; +import tsConfig from './tsconfig.json' with { type: 'json' }; export default { transform: { '\\.ts$': ['ts-jest'], diff --git a/package.json b/package.json index 1313548..0c4d635 100644 --- a/package.json +++ b/package.json @@ -15,66 +15,73 @@ "docker:build": "rm -rf dist && pnpm build:api && docker build -t destinyitemmanager/dim-api .", "docker:run": "docker run -p 3000:3000 destinyitemmanager/dim-api:latest", "docker:push": "docker push destinyitemmanager/dim-api:latest", - "lint": "eslint --fix api --ext .js,.ts", - "lint-check": "eslint api --ext .js,.ts", + "lint": "eslint --fix api", + "lint-check": "eslint api", "test": "jest --verbose --coverage api --forceExit", "test:watch": "jest --watch", "dim-api-types:build": "./build-dim-api-types.sh" }, "devDependencies": { - "@babel/core": "^7.17.8", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/preset-env": "^7.16.11", - "@babel/preset-typescript": "^7.16.7", - "@rollup/plugin-babel": "^6.0.3", - "@rollup/plugin-node-resolve": "^15.2.1", - "@sentry/cli": "^2.2.0", - "@types/cors": "^2.8.6", - "@types/express": "^4.17.1", - "@types/jest": "^29.1.2", - "@types/jsonwebtoken": "^9.0.1", - "@types/lodash": "^4.14.149", - "@types/morgan": "^1.7.37", - "@types/pg": "^8.6.0", - "@types/uuid": "^9.0.0", - "@types/vhost": "^3.0.4", - "@typescript-eslint/eslint-plugin": "^6.7.2", - "@typescript-eslint/parser": "^6.7.2", - "db-migrate": "^0.11.6", - "db-migrate-pg": "^1.0.0", - "eslint": "^8.8.0", - "eslint-config-prettier": "^9.0.0", - "jest": "^29.0.1", - "prettier": "^3.0.3", - "prettier-plugin-organize-imports": "^3.0.0", - "rollup": "^3.29.2", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/preset-env": "^7.25.4", + "@babel/preset-typescript": "^7.24.7", + "@eslint/compat": "^1.1.1", + "@eslint/js": "^9.9.1", + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-node-resolve": "^15.2.3", + "@sentry/cli": "^2.34.1", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.12", + "@types/jsonwebtoken": "^9.0.6", + "@types/lodash": "^4.17.7", + "@types/morgan": "^1.9.9", + "@types/pg": "^8.11.8", + "@types/uuid": "^9.0.8", + "@types/vhost": "3.0.7", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "db-migrate": "^0.11.14", + "db-migrate-pg": "^1.5.2", + "eslint": "^9.9.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-regexp": "^2.6.0", + "eslint-plugin-sonarjs": "^1.0.0", + "globals": "^15.9.0", + "jest": "^29.7.0", + "prettier": "^3.3.3", + "prettier-plugin-organize-imports": "^3.2.4", + "rollup": "^3.29.4", "supertest-fetch": "^2.0.0", - "ts-jest": "^29.0.3", - "ts-node": "^10.0.0", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", "ts-node-dev": "^2.0.0", - "typescript": "^5.2.2" + "tsx": "^4.19.0", + "typescript": "^5.5.4", + "typescript-eslint": "^8.3.0" }, "dependencies": { - "@godaddy/terminus": "^4.3.1", - "@sentry/node": "^7.3.0", - "@sentry/tracing": "^7.3.0", - "bungie-api-ts": "^5.0.0", + "@godaddy/terminus": "^4.12.1", + "@sentry/node": "^7.119.0", + "@sentry/tracing": "^7.114.0", + "bungie-api-ts": "^5.1.0", "cors": "^2.8.5", - "dotenv": "^16.0.1", - "ejs": "^3.1.6", - "express": "^4.17.1", - "express-async-handler": "^1.1.4", + "dotenv": "^16.4.5", + "ejs": "^3.1.10", + "express": "^4.19.2", + "express-async-handler": "^1.2.0", "express-hot-shots": "^1.0.2", - "express-jwt": "^8.2.0", + "express-jwt": "^8.4.1", "hi-base32": "^0.5.1", "hot-shots": "^10.0.0", - "jsonwebtoken": "^9.0.0", - "lodash": "^4.17.15", - "morgan": "^1.9.1", - "pg": "^8.0.0", - "slugify": "^1.6.5", - "uuid": "^9.0.0", + "jsonwebtoken": "^9.0.2", + "lodash": "^4.17.21", + "morgan": "^1.10.0", + "pg": "^8.12.0", + "slugify": "^1.6.6", + "uuid": "^9.0.1", "vhost": "^3.0.2" }, "packageManager": "pnpm@8.9.0+sha256.8f5264ad1d100da11a6add6bb8a94c6f1e913f9e9261b2a551fabefad2ec0fec" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3133208..d81839f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,37 +6,37 @@ settings: dependencies: '@godaddy/terminus': - specifier: ^4.3.1 + specifier: ^4.12.1 version: 4.12.1 '@sentry/node': - specifier: ^7.3.0 - version: 7.73.0 + specifier: ^7.119.0 + version: 7.119.0 '@sentry/tracing': - specifier: ^7.3.0 - version: 7.73.0 + specifier: ^7.114.0 + version: 7.114.0 bungie-api-ts: - specifier: ^5.0.0 - version: 5.0.0 + specifier: ^5.1.0 + version: 5.1.0 cors: specifier: ^2.8.5 version: 2.8.5 dotenv: - specifier: ^16.0.1 - version: 16.3.1 + specifier: ^16.4.5 + version: 16.4.5 ejs: - specifier: ^3.1.6 - version: 3.1.9 + specifier: ^3.1.10 + version: 3.1.10 express: - specifier: ^4.17.1 - version: 4.18.2 + specifier: ^4.19.2 + version: 4.19.2 express-async-handler: - specifier: ^1.1.4 + specifier: ^1.2.0 version: 1.2.0 express-hot-shots: specifier: ^1.0.2 version: 1.0.2 express-jwt: - specifier: ^8.2.0 + specifier: ^8.4.1 version: 8.4.1 hi-base32: specifier: ^0.5.1 @@ -45,22 +45,22 @@ dependencies: specifier: ^10.0.0 version: 10.0.0 jsonwebtoken: - specifier: ^9.0.0 + specifier: ^9.0.2 version: 9.0.2 lodash: - specifier: ^4.17.15 + specifier: ^4.17.21 version: 4.17.21 morgan: - specifier: ^1.9.1 + specifier: ^1.10.0 version: 1.10.0 pg: - specifier: ^8.0.0 - version: 8.11.3 + specifier: ^8.12.0 + version: 8.12.0 slugify: - specifier: ^1.6.5 + specifier: ^1.6.6 version: 1.6.6 uuid: - specifier: ^9.0.0 + specifier: ^9.0.1 version: 9.0.1 vhost: specifier: ^3.0.2 @@ -68,101 +68,122 @@ dependencies: devDependencies: '@babel/core': - specifier: ^7.17.8 - version: 7.23.0 + specifier: ^7.25.2 + version: 7.25.2 '@babel/plugin-transform-class-properties': - specifier: ^7.22.5 - version: 7.22.5(@babel/core@7.23.0) + specifier: ^7.25.4 + version: 7.25.4(@babel/core@7.25.2) '@babel/plugin-transform-object-rest-spread': - specifier: ^7.22.15 - version: 7.22.15(@babel/core@7.23.0) + specifier: ^7.24.7 + version: 7.24.7(@babel/core@7.25.2) '@babel/preset-env': - specifier: ^7.16.11 - version: 7.22.20(@babel/core@7.23.0) + specifier: ^7.25.4 + version: 7.25.4(@babel/core@7.25.2) '@babel/preset-typescript': - specifier: ^7.16.7 - version: 7.23.0(@babel/core@7.23.0) + specifier: ^7.24.7 + version: 7.24.7(@babel/core@7.25.2) + '@eslint/compat': + specifier: ^1.1.1 + version: 1.1.1 + '@eslint/js': + specifier: ^9.9.1 + version: 9.9.1 '@rollup/plugin-babel': - specifier: ^6.0.3 - version: 6.0.4(@babel/core@7.23.0)(rollup@3.29.4) + specifier: ^6.0.4 + version: 6.0.4(@babel/core@7.25.2)(rollup@3.29.4) '@rollup/plugin-node-resolve': - specifier: ^15.2.1 + specifier: ^15.2.3 version: 15.2.3(rollup@3.29.4) '@sentry/cli': - specifier: ^2.2.0 - version: 2.21.2 + specifier: ^2.34.1 + version: 2.34.1 '@types/cors': - specifier: ^2.8.6 - version: 2.8.14 + specifier: ^2.8.17 + version: 2.8.17 '@types/express': - specifier: ^4.17.1 - version: 4.17.19 + specifier: ^4.17.21 + version: 4.17.21 '@types/jest': - specifier: ^29.1.2 - version: 29.5.5 + specifier: ^29.5.12 + version: 29.5.12 '@types/jsonwebtoken': - specifier: ^9.0.1 - version: 9.0.3 + specifier: ^9.0.6 + version: 9.0.6 '@types/lodash': - specifier: ^4.14.149 - version: 4.14.199 + specifier: ^4.17.7 + version: 4.17.7 '@types/morgan': - specifier: ^1.7.37 - version: 1.9.6 + specifier: ^1.9.9 + version: 1.9.9 '@types/pg': - specifier: ^8.6.0 - version: 8.10.5 + specifier: ^8.11.8 + version: 8.11.8 '@types/uuid': - specifier: ^9.0.0 - version: 9.0.5 + specifier: ^9.0.8 + version: 9.0.8 '@types/vhost': - specifier: ^3.0.4 - version: 3.0.5 + specifier: 3.0.7 + version: 3.0.7 '@typescript-eslint/eslint-plugin': - specifier: ^6.7.2 - version: 6.7.5(@typescript-eslint/parser@6.7.5)(eslint@8.51.0)(typescript@5.2.2) + specifier: ^6.21.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@9.9.1)(typescript@5.5.4) '@typescript-eslint/parser': - specifier: ^6.7.2 - version: 6.7.5(eslint@8.51.0)(typescript@5.2.2) + specifier: ^6.21.0 + version: 6.21.0(eslint@9.9.1)(typescript@5.5.4) db-migrate: - specifier: ^0.11.6 + specifier: ^0.11.14 version: 0.11.14 db-migrate-pg: - specifier: ^1.0.0 + specifier: ^1.5.2 version: 1.5.2 eslint: - specifier: ^8.8.0 - version: 8.51.0 + specifier: ^9.9.1 + version: 9.9.1 eslint-config-prettier: - specifier: ^9.0.0 - version: 9.0.0(eslint@8.51.0) + specifier: ^9.1.0 + version: 9.1.0(eslint@9.9.1) + eslint-plugin-regexp: + specifier: ^2.6.0 + version: 2.6.0(eslint@9.9.1) + eslint-plugin-sonarjs: + specifier: ^1.0.0 + version: 1.0.4(eslint@9.9.1) + globals: + specifier: ^15.9.0 + version: 15.9.0 jest: - specifier: ^29.0.1 - version: 29.7.0(@types/node@20.8.4)(ts-node@10.9.1) + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.8.4)(ts-node@10.9.2) prettier: - specifier: ^3.0.3 - version: 3.0.3 + specifier: ^3.3.3 + version: 3.3.3 prettier-plugin-organize-imports: - specifier: ^3.0.0 - version: 3.2.3(prettier@3.0.3)(typescript@5.2.2) + specifier: ^3.2.4 + version: 3.2.4(prettier@3.3.3)(typescript@5.5.4) rollup: - specifier: ^3.29.2 + specifier: ^3.29.4 version: 3.29.4 supertest-fetch: specifier: ^2.0.0 version: 2.0.0 ts-jest: - specifier: ^29.0.3 - version: 29.1.1(@babel/core@7.23.0)(jest@29.7.0)(typescript@5.2.2) + specifier: ^29.2.5 + version: 29.2.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4) ts-node: - specifier: ^10.0.0 - version: 10.9.1(@types/node@20.8.4)(typescript@5.2.2) + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.8.4)(typescript@5.5.4) ts-node-dev: specifier: ^2.0.0 - version: 2.0.0(@types/node@20.8.4)(typescript@5.2.2) + version: 2.0.0(@types/node@20.8.4)(typescript@5.5.4) + tsx: + specifier: ^4.19.0 + version: 4.19.0 typescript: - specifier: ^5.2.2 - version: 5.2.2 + specifier: ^5.5.4 + version: 5.5.4 + typescript-eslint: + specifier: ^8.3.0 + version: 8.3.0(eslint@9.9.1)(typescript@5.5.4) packages: @@ -187,25 +208,33 @@ packages: chalk: 2.4.2 dev: true - /@babel/compat-data@7.22.20: - resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} + /@babel/code-frame@7.24.7: + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.0 + dev: true + + /@babel/compat-data@7.25.4: + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.23.0: - resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} + /@babel/core@7.25.2: + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helpers': 7.23.1 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 - '@babel/types': 7.23.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -225,6 +254,16 @@ packages: jsesc: 2.5.2 dev: true + /@babel/generator@7.25.6: + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.25.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -232,62 +271,84 @@ packages: '@babel/types': 7.23.0 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + /@babel/helper-annotate-as-pure@7.24.7: + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.25.6 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7: + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + /@babel/helper-compilation-targets@7.25.2: + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.22.20 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.22.1 + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + /@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/traverse': 7.25.6 semver: 6.3.1 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.0): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.25.2): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.23.0): - resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + /@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2): + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.8 @@ -295,59 +356,53 @@ packages: - supports-color dev: true - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + /@babel/helper-member-expression-to-functions@7.24.8: + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-member-expression-to-functions@7.23.0: - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 dev: true - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + /@babel/helper-module-imports@7.24.7: + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + /@babel/helper-optimise-call-expression@7.24.7: + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.25.6 dev: true /@babel/helper-plugin-utils@7.22.5: @@ -355,49 +410,57 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.0): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + /@babel/helper-plugin-utils@7.24.8: + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 dev: true - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.0): - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + /@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-wrap-function': 7.25.0 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + /@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: - '@babel/types': 7.23.0 + '@babel/core': 7.25.2 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + /@babel/helper-simple-access@7.24.7: + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + /@babel/helper-skip-transparent-expression-wrappers@7.24.7: + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true /@babel/helper-string-parser@7.22.5: @@ -405,36 +468,45 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-string-parser@7.24.8: + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-wrap-function@7.22.20: - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + /@babel/helper-validator-option@7.24.8: + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 dev: true - /@babel/helpers@7.23.1: - resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} + /@babel/helper-wrap-function@7.25.0: + resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 - '@babel/types': 7.23.0 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true + /@babel/helpers@7.25.6: + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + dev: true + /@babel/highlight@7.22.20: resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} @@ -444,6 +516,16 @@ packages: js-tokens: 4.0.0 dev: true + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: true + /@babel/parser@7.23.0: resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} @@ -452,894 +534,1010 @@ packages: '@babel/types': 7.23.0 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} + /@babel/parser@7.25.6: + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.25.6 + dev: true + + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2): + resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.0): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + /@babel/plugin-syntax-import-assertions@7.25.6(@babel/core@7.25.2): + resolution: {integrity: sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + /@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.25.2): + resolution: {integrity: sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.0): + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.25.2): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.0): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.25.2): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.0): + /@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==} + /@babel/plugin-transform-async-generator-functions@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} + /@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + /@babel/plugin-transform-class-properties@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} + /@babel/plugin-transform-classes@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) - '@babel/helper-split-export-declaration': 7.22.6 + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/traverse': 7.25.6 globals: 11.12.0 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template': 7.25.0 dev: true - /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} + /@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} + /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + /@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2): + resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + /@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} + /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} + /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} + /@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2): + resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} + /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} + /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.20 - '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} + /@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} + /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + /@babel/plugin-transform-private-methods@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.0): - resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} + /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.0): - resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + /@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + /@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2): + resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.0): - resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} + /@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.0): - resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + /@babel/plugin-transform-unicode-sets-regex@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/preset-env@7.22.20(@babel/core@7.23.0): - resolution: {integrity: sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==} + /@babel/preset-env@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.20 - '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.0) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.0) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.0) - '@babel/types': 7.23.0 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.23.0) - babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.23.0) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.23.0) - core-js-compat: 3.33.0 + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.25.6(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.25.4(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.0): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 '@babel/types': 7.23.0 esutils: 2.0.3 dev: true - /@babel/preset-typescript@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==} + /@babel/preset-typescript@7.24.7(@babel/core@7.25.2): + resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color dev: true /@babel/regjsgen@0.8.0: @@ -1362,18 +1560,24 @@ packages: '@babel/types': 7.23.0 dev: true - /@babel/traverse@7.23.0: - resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} + /@babel/template@7.25.0: + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + dev: true + + /@babel/traverse@7.25.6: + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -1389,6 +1593,15 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types@7.25.6: + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + dev: true + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -1405,29 +1618,266 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0): + /@esbuild/aix-ppc64@0.23.1: + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.23.1: + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.23.1: + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.23.1: + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.23.1: + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.23.1: + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.23.1: + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.23.1: + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.23.1: + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.23.1: + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.23.1: + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.23.1: + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.23.1: + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.23.1: + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.23.1: + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.23.1: + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.23.1: + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.23.1: + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-arm64@0.23.1: + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.23.1: + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.23.1: + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.23.1: + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.23.1: + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.23.1: + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@9.9.1): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.51.0 + eslint: 9.9.1 eslint-visitor-keys: 3.4.3 dev: true + /@eslint-community/regexpp@4.11.0: + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + /@eslint-community/regexpp@4.9.1: resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@eslint/compat@1.1.1: + resolution: {integrity: sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/config-array@0.18.0: + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/eslintrc@3.1.0: + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 + espree: 10.1.0 + globals: 14.0.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -1437,9 +1887,14 @@ packages: - supports-color dev: true - /@eslint/js@8.51.0: - resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@eslint/js@9.9.1: + resolution: {integrity: sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/object-schema@2.1.4: + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true /@godaddy/terminus@4.12.1: @@ -1448,24 +1903,14 @@ packages: stoppable: 1.1.0 dev: false - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/retry@0.3.0: + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} dev: true /@istanbuljs/load-nyc-config@1.1.0: @@ -1496,7 +1941,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core@29.7.0(ts-node@10.9.1): + /@jest/core@29.7.0(ts-node@10.9.2): resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1517,7 +1962,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.8.4)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.8.4)(ts-node@10.9.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -1667,7 +2112,7 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.19 babel-plugin-istanbul: 6.1.1 @@ -1707,6 +2152,15 @@ packages: '@jridgewell/trace-mapping': 0.3.19 dev: true + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} @@ -1717,6 +2171,11 @@ packages: engines: {node: '>=6.0.0'} dev: true + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true @@ -1728,6 +2187,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -1756,7 +2222,7 @@ packages: fastq: 1.15.0 dev: true - /@rollup/plugin-babel@6.0.4(@babel/core@7.23.0)(rollup@3.29.4): + /@rollup/plugin-babel@6.0.4(@babel/core@7.25.2)(rollup@3.29.4): resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1769,7 +2235,7 @@ packages: rollup: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.22.15 '@rollup/pluginutils': 5.0.5(rollup@3.29.4) rollup: 3.29.4 @@ -1808,18 +2274,88 @@ packages: rollup: 3.29.4 dev: true - /@sentry-internal/tracing@7.73.0: - resolution: {integrity: sha512-ig3WL/Nqp8nRQ52P205NaypGKNfIl/G+cIqge9xPW6zfRb5kJdM1YParw9GSJ1SPjEZBkBORGAML0on5H2FILw==} - engines: {node: '>=8'} - dependencies: - '@sentry/core': 7.73.0 - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 - tslib: 2.6.2 - dev: false + /@sentry-internal/tracing@7.114.0: + resolution: {integrity: sha512-dOuvfJN7G+3YqLlUY4HIjyWHaRP8vbOgF+OsE5w2l7ZEn1rMAaUbPntAR8AF9GBA6j2zWNoSo8e7GjbJxVofSg==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.114.0 + '@sentry/types': 7.114.0 + '@sentry/utils': 7.114.0 + dev: false + + /@sentry-internal/tracing@7.119.0: + resolution: {integrity: sha512-oKdFJnn+56f0DHUADlL8o9l8jTib3VDLbWQBVkjD9EprxfaCwt2m8L5ACRBdQ8hmpxCEo4I8/6traZ7qAdBUqA==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.119.0 + '@sentry/types': 7.119.0 + '@sentry/utils': 7.119.0 + dev: false + + /@sentry/cli-darwin@2.34.1: + resolution: {integrity: sha512-SqlCunwhweMDJNKVf3kabiN6FwpvCIffn2cjfaZD0zqZQ3M1tWMJ/kSA0TGfe7lWu9JloNmVm+ArcudGitvX3w==} + engines: {node: '>=10'} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@sentry/cli-linux-arm64@2.34.1: + resolution: {integrity: sha512-iSl/uNWjKbVPb6ll12SmHG9iGcC3oN8jjzdycm/mD3H/d8DLMloEiaz8lHQnsYCaPiNKwap1ThKlPvnKOU4SNg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd] + requiresBuild: true + dev: true + optional: true + + /@sentry/cli-linux-arm@2.34.1: + resolution: {integrity: sha512-CDhtFbUs16CoU10wEbxnn/pEuenFIMosTcxI7v0gWp3Wo0B2h0bOsLEk9dlT0YsqRTAldKUzef9AVX82m5Svwg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd] + requiresBuild: true + dev: true + optional: true + + /@sentry/cli-linux-i686@2.34.1: + resolution: {integrity: sha512-jq5o49pgzJFv/CQtvx4FLVO1xra22gzP76FtmvPwEhZQhJT6QduW9fpnvVDnOaY8YLzC7GAeszUV6sqZ0MZUqg==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd] + requiresBuild: true + dev: true + optional: true + + /@sentry/cli-linux-x64@2.34.1: + resolution: {integrity: sha512-O99RAkrcMErWLPRdza6HaG7kmHCx9MYFNDX6FLrAgSP3oz+X3ral1oDTIrMs4hVbPDK287ZGAqCJtk+1iOjEBg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd] + requiresBuild: true + dev: true + optional: true + + /@sentry/cli-win32-i686@2.34.1: + resolution: {integrity: sha512-yEeuneEVmExCbWlnSauhIg8wZDfKxRaou8XRfM6oPlSBu0XO5HUI3uRK5t2xT0zX8Syzh2kCZpdVE1KLavVeKA==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@sentry/cli-win32-x64@2.34.1: + resolution: {integrity: sha512-mU48VpDTwRgt7/Pf3vk/P87m4kM3XEXHHHfq9EvHCTspFF6GtMfL9njZ7+5Z+7ko852JS4kpunjZtsxmoP4/zA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@sentry/cli@2.21.2: - resolution: {integrity: sha512-X1nye89zl+QV3FSuQDGItfM51tW9PQ7ce0TtV/12DgGgTVEgnVp5uvO3wX5XauHvulQzRPzwUL3ZK+yS5bAwCw==} + /@sentry/cli@2.34.1: + resolution: {integrity: sha512-hAHvu+XH1kn1ee2NUWvuqAZenK/MrxqQzeIrIYATqF2XGjtSOr7irjAKWjd97/vXdLHA6TBnMW1wHwLcuJK2tg==} engines: {node: '>= 10'} hasBin: true requiresBuild: true @@ -1829,54 +2365,85 @@ packages: progress: 2.0.3 proxy-from-env: 1.1.0 which: 2.0.2 + optionalDependencies: + '@sentry/cli-darwin': 2.34.1 + '@sentry/cli-linux-arm': 2.34.1 + '@sentry/cli-linux-arm64': 2.34.1 + '@sentry/cli-linux-i686': 2.34.1 + '@sentry/cli-linux-x64': 2.34.1 + '@sentry/cli-win32-i686': 2.34.1 + '@sentry/cli-win32-x64': 2.34.1 transitivePeerDependencies: - encoding - supports-color dev: true - /@sentry/core@7.73.0: - resolution: {integrity: sha512-9FEz4Gq848LOgVN2OxJGYuQqxv7cIVw69VlAzWHEm3njt8mjvlTq+7UiFsGRo84+59V2FQuHxzA7vVjl90WfSg==} + /@sentry/core@7.114.0: + resolution: {integrity: sha512-YnanVlmulkjgZiVZ9BfY9k6I082n+C+LbZo52MTvx3FY6RE5iyiPMpaOh67oXEZRWcYQEGm+bKruRxLVP6RlbA==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 - tslib: 2.6.2 + '@sentry/types': 7.114.0 + '@sentry/utils': 7.114.0 dev: false - /@sentry/node@7.73.0: - resolution: {integrity: sha512-i50bRfmgkRRx0XXUbg9jGD/RuznDJxJXc4rBILhoJuhl+BjRIaoXA3ayplfJn8JLZxsNh75uJaCq4IUK70SORw==} + /@sentry/core@7.119.0: + resolution: {integrity: sha512-CS2kUv9rAJJEjiRat6wle3JATHypB0SyD7pt4cpX5y0dN5dZ1JrF57oLHRMnga9fxRivydHz7tMTuBhSSwhzjw==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.73.0 - '@sentry/core': 7.73.0 - '@sentry/types': 7.73.0 - '@sentry/utils': 7.73.0 - cookie: 0.5.0 - https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color + '@sentry/types': 7.119.0 + '@sentry/utils': 7.119.0 + dev: false + + /@sentry/integrations@7.119.0: + resolution: {integrity: sha512-OHShvtsRW0A+ZL/ZbMnMqDEtJddPasndjq+1aQXw40mN+zeP7At/V1yPZyFaURy86iX7Ucxw5BtmzuNy7hLyTA==} + engines: {node: '>=8'} + dependencies: + '@sentry/core': 7.119.0 + '@sentry/types': 7.119.0 + '@sentry/utils': 7.119.0 + localforage: 1.10.0 + dev: false + + /@sentry/node@7.119.0: + resolution: {integrity: sha512-9PFzN8xS6U0oZCflpVxS2SSIsHkCaj7qYBlsvHj4CTGWfao9ImwrU6+smy4qoG6oxwPfoVb5pOOMb4WpWOvXcQ==} + engines: {node: '>=8'} + dependencies: + '@sentry-internal/tracing': 7.119.0 + '@sentry/core': 7.119.0 + '@sentry/integrations': 7.119.0 + '@sentry/types': 7.119.0 + '@sentry/utils': 7.119.0 dev: false - /@sentry/tracing@7.73.0: - resolution: {integrity: sha512-LOQR6Hkc8ZoflCXWtMlxTbCBEwv0MSOr3vesnRsmlFG8TW1YUIneU+wKnVxToWAZ8fq+6ubclnuIUKHfqTk/Tg==} + /@sentry/tracing@7.114.0: + resolution: {integrity: sha512-eldEYGADReZ4jWdN5u35yxLUSTOvjsiZAYd4KBEpf+Ii65n7g/kYOKAjNl7tHbrEG1EsMW4nDPWStUMk1w+tfg==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.73.0 + '@sentry-internal/tracing': 7.114.0 + dev: false + + /@sentry/types@7.114.0: + resolution: {integrity: sha512-tsqkkyL3eJtptmPtT0m9W/bPLkU7ILY7nvwpi1hahA5jrM7ppoU0IMaQWAgTD+U3rzFH40IdXNBFb8Gnqcva4w==} + engines: {node: '>=8'} + dev: false + + /@sentry/types@7.119.0: + resolution: {integrity: sha512-27qQbutDBPKGbuJHROxhIWc1i0HJaGLA90tjMu11wt0E4UNxXRX+UQl4Twu68v4EV3CPvQcEpQfgsViYcXmq+w==} + engines: {node: '>=8'} dev: false - /@sentry/types@7.73.0: - resolution: {integrity: sha512-/v8++bly8jW7r4cP2wswYiiVpn7eLLcqwnfPUMeCQze4zj3F3nTRIKc9BGHzU0V+fhHa3RwRC2ksqTGq1oJMDg==} + /@sentry/utils@7.114.0: + resolution: {integrity: sha512-319N90McVpupQ6vws4+tfCy/03AdtsU0MurIE4+W5cubHME08HtiEWlfacvAxX+yuKFhvdsO4K4BB/dj54ideg==} engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.114.0 dev: false - /@sentry/utils@7.73.0: - resolution: {integrity: sha512-h3ZK/qpf4k76FhJV9uiSbvMz3V/0Ovy94C+5/9UgPMVCJXFmVsdw8n/dwANJ7LupVPfYP23xFGgebDMFlK1/2w==} + /@sentry/utils@7.119.0: + resolution: {integrity: sha512-ZwyXexWn2ZIe2bBoYnXJVPc2esCSbKpdc6+0WJa8eutXfHq3FRKg4ohkfCBpfxljQGEfP1+kfin945lA21Ka+A==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.73.0 - tslib: 2.6.2 + '@sentry/types': 7.119.0 dev: false /@sinclair/typebox@0.27.8: @@ -1953,8 +2520,8 @@ packages: '@types/node': 20.8.4 dev: true - /@types/cors@2.8.14: - resolution: {integrity: sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==} + /@types/cors@2.8.17: + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} dependencies: '@types/node': 20.8.4 dev: true @@ -1972,8 +2539,8 @@ packages: '@types/send': 0.17.2 dev: true - /@types/express@4.17.19: - resolution: {integrity: sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg==} + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} dependencies: '@types/body-parser': 1.19.3 '@types/express-serve-static-core': 4.17.37 @@ -2007,8 +2574,8 @@ packages: '@types/istanbul-lib-report': 3.0.1 dev: true - /@types/jest@29.5.5: - resolution: {integrity: sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==} + /@types/jest@29.5.12: + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 @@ -2018,13 +2585,13 @@ packages: resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} dev: true - /@types/jsonwebtoken@9.0.3: - resolution: {integrity: sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==} + /@types/jsonwebtoken@9.0.6: + resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} dependencies: '@types/node': 20.8.4 - /@types/lodash@4.14.199: - resolution: {integrity: sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==} + /@types/lodash@4.17.7: + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} dev: true /@types/mime@1.3.3: @@ -2035,8 +2602,8 @@ packages: resolution: {integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ==} dev: true - /@types/morgan@1.9.6: - resolution: {integrity: sha512-xfKogz5WcKww2DAiVT9zxMgrqQt+Shq8tDVeLT+otoj6dJnkRkyJxMF51mHtUc3JCPKGk5x1EBU0buuGpfftlQ==} + /@types/morgan@1.9.9: + resolution: {integrity: sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==} dependencies: '@types/node': 20.8.4 dev: true @@ -2046,8 +2613,8 @@ packages: dependencies: undici-types: 5.25.3 - /@types/pg@8.10.5: - resolution: {integrity: sha512-GS3ebGcSJQqKSnq4/WnSH1XQvx0vTDLEmqLENk7onKvTnry9BWPsZiZeUMJlEPw+5bCQDzfxZFhxlUztpNCKgQ==} + /@types/pg@8.11.8: + resolution: {integrity: sha512-IqpCf8/569txXN/HoP5i1LjXfKZWL76Yr2R77xgeIICUbAYHeoaEZFhYHo2uDftecLWrTJUq63JvQu8q3lnDyA==} dependencies: '@types/node': 20.8.4 pg-protocol: 1.6.0 @@ -2097,14 +2664,14 @@ packages: resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} dev: true - /@types/uuid@9.0.5: - resolution: {integrity: sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ==} + /@types/uuid@9.0.8: + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} dev: true - /@types/vhost@3.0.5: - resolution: {integrity: sha512-4kWsLR9Gq2iagZbTn0XFJEnUn2jjyeBpX4YnfQ4riR+a8LSXQxjXm6tcV+/abCqST0wW3I590NE5IOPf9waxbg==} + /@types/vhost@3.0.7: + resolution: {integrity: sha512-jaaWBLRsRk1fU8Plve1L1D7m5Et7pqNeh+YttSxE7ea9ZNKa0xpXTmWJRXUdeutvkk4pkyk0blmdRPZuscudeg==} dependencies: - '@types/express': 4.17.19 + '@types/express': 4.17.21 dev: true /@types/yargs-parser@21.0.1: @@ -2117,8 +2684,8 @@ packages: '@types/yargs-parser': 21.0.1 dev: true - /@typescript-eslint/eslint-plugin@6.7.5(@typescript-eslint/parser@6.7.5)(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==} + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@9.9.1)(typescript@5.5.4): + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -2129,25 +2696,52 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 6.7.5(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.7.5 - '@typescript-eslint/type-utils': 6.7.5(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.5(eslint@8.51.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.5 + '@typescript-eslint/parser': 6.21.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/utils': 6.21.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 - eslint: 8.51.0 + eslint: 9.9.1 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.0.3(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/eslint-plugin@8.3.0(@typescript-eslint/parser@8.3.0)(eslint@9.9.1)(typescript@5.5.4): + resolution: {integrity: sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.3.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/type-utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.3.0 + eslint: 9.9.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.7.5(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-bIZVSGx2UME/lmhLcjdVc7ePBwn7CLqKarUBL4me1C5feOd663liTGjMBGVcGr+BhnSLeP4SgwdvNnnkbIdkCw==} + /@typescript-eslint/parser@6.21.0(eslint@9.9.1)(typescript@5.5.4): + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2156,27 +2750,56 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.7.5 - '@typescript-eslint/types': 6.7.5 - '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.5 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4 + eslint: 9.9.1 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@8.3.0(eslint@9.9.1)(typescript@5.5.4): + resolution: {integrity: sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.3.0 debug: 4.3.4 - eslint: 8.51.0 - typescript: 5.2.2 + eslint: 9.9.1 + typescript: 5.5.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.7.5: - resolution: {integrity: sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==} + /@typescript-eslint/scope-manager@6.21.0: + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.7.5 - '@typescript-eslint/visitor-keys': 6.7.5 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/type-utils@6.7.5(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==} + /@typescript-eslint/scope-manager@8.3.0: + resolution: {integrity: sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/visitor-keys': 8.3.0 + dev: true + + /@typescript-eslint/type-utils@6.21.0(eslint@9.9.1)(typescript@5.5.4): + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2185,23 +2808,47 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.5(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + '@typescript-eslint/utils': 6.21.0(eslint@9.9.1)(typescript@5.5.4) + debug: 4.3.4 + eslint: 9.9.1 + ts-api-utils: 1.0.3(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/type-utils@8.3.0(eslint@9.9.1)(typescript@5.5.4): + resolution: {integrity: sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) debug: 4.3.4 - eslint: 8.51.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: + - eslint - supports-color dev: true - /@typescript-eslint/types@6.7.5: - resolution: {integrity: sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==} + /@typescript-eslint/types@6.21.0: + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@6.7.5(typescript@5.2.2): - resolution: {integrity: sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==} + /@typescript-eslint/types@8.3.0: + resolution: {integrity: sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4): + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -2209,42 +2856,89 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.7.5 - '@typescript-eslint/visitor-keys': 6.7.5 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 + minimatch: 9.0.3 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.0.3(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@8.3.0(typescript@5.5.4): + resolution: {integrity: sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/visitor-keys': 8.3.0 + debug: 4.3.4 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.7.5(eslint@8.51.0)(typescript@5.2.2): - resolution: {integrity: sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==} + /@typescript-eslint/utils@6.21.0(eslint@9.9.1)(typescript@5.5.4): + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) '@types/json-schema': 7.0.13 '@types/semver': 7.5.3 - '@typescript-eslint/scope-manager': 6.7.5 - '@typescript-eslint/types': 6.7.5 - '@typescript-eslint/typescript-estree': 6.7.5(typescript@5.2.2) - eslint: 8.51.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + eslint: 9.9.1 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.7.5: - resolution: {integrity: sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==} + /@typescript-eslint/utils@8.3.0(eslint@9.9.1)(typescript@5.5.4): + resolution: {integrity: sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) + '@typescript-eslint/scope-manager': 8.3.0 + '@typescript-eslint/types': 8.3.0 + '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.5.4) + eslint: 9.9.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.21.0: + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.7.5 + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@8.3.0: + resolution: {integrity: sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.3.0 eslint-visitor-keys: 3.4.3 dev: true @@ -2256,12 +2950,12 @@ packages: negotiator: 0.6.3 dev: false - /acorn-jsx@5.3.2(acorn@8.10.0): + /acorn-jsx@5.3.2(acorn@8.12.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.10.0 + acorn: 8.12.1 dev: true /acorn-walk@8.2.0: @@ -2275,6 +2969,12 @@ packages: hasBin: true dev: true + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -2282,6 +2982,7 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: true /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2371,19 +3072,18 @@ packages: /async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: false - /babel-jest@29.7.0(@babel/core@7.23.0): + /babel-jest@29.7.0(@babel/core@7.25.2): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.2 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.23.0) + babel-preset-jest: 29.6.3(@babel/core@7.25.2) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -2414,71 +3114,71 @@ packages: '@types/babel__traverse': 7.20.2 dev: true - /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.23.0): - resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.22.20 - '@babel/core': 7.23.0 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.8.4(@babel/core@7.23.0): - resolution: {integrity: sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==} + /babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) - core-js-compat: 3.33.0 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.23.0): - resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.0) + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.0): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.25.2): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.23.0): + '@babel/core': 7.25.2 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.25.2): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) dev: true /balanced-match@1.0.2: @@ -2514,8 +3214,8 @@ packages: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 @@ -2527,7 +3227,7 @@ packages: iconv-lite: 0.4.24 on-finished: 2.4.1 qs: 6.11.0 - raw-body: 2.5.1 + raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 transitivePeerDependencies: @@ -2544,7 +3244,6 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: false /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -2553,15 +3252,15 @@ packages: fill-range: 7.0.1 dev: true - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + /browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001547 - electron-to-chromium: 1.4.549 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) + caniuse-lite: 1.0.30001655 + electron-to-chromium: 1.5.13 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) dev: true /bs-logger@0.2.6: @@ -2585,17 +3284,13 @@ packages: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /buffer-writer@2.0.0: - resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} - engines: {node: '>=4'} - /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} dev: true - /bungie-api-ts@5.0.0: - resolution: {integrity: sha512-MpEP37GmYN5klyrcpFtFezFqSK4KNmiXx7yqmCV15eJim37w7d7GpjH3jgKe3XP1uruLCmzGbf56q5pRf3ktaQ==} + /bungie-api-ts@5.1.0: + resolution: {integrity: sha512-q+DCazUsgq34Q54vpHcR3WKifEPAqalTTddW4za8JxdlZF0JaNwvqNBEEa0YMPOUhbGMcJtR09dvcwjtI/ojcw==} engines: {node: '>=13.2.0'} dev: false @@ -2626,8 +3321,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001547: - resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==} + /caniuse-lite@1.0.30001655: + resolution: {integrity: sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==} dev: true /chalk@2.4.2: @@ -2725,6 +3420,11 @@ packages: engines: {node: '>=0.1.90'} dev: true + /comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + dev: true + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -2748,15 +3448,15 @@ packages: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: false - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} dev: false - /core-js-compat@3.33.0: - resolution: {integrity: sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==} + /core-js-compat@3.38.1: + resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} dependencies: - browserslist: 4.22.1 + browserslist: 4.23.3 dev: true /cors@2.8.5: @@ -2776,7 +3476,7 @@ packages: dev: true optional: true - /create-jest@29.7.0(@types/node@20.8.4)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@20.8.4)(ts-node@10.9.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2785,7 +3485,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.8.4)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.8.4)(ts-node@10.9.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -2824,7 +3524,7 @@ packages: dependencies: bluebird: 3.7.2 db-migrate-base: 2.3.1 - pg: 8.11.3 + pg: 8.12.0 semver: 7.5.4 transitivePeerDependencies: - pg-native @@ -2878,6 +3578,7 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: true /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} @@ -2939,15 +3640,8 @@ packages: path-type: 4.0.0 dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} dev: false @@ -2972,16 +3666,15 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true dependencies: jake: 10.8.7 - dev: false - /electron-to-chromium@1.4.549: - resolution: {integrity: sha512-gpXfJslSi4hYDkA0mTLEpYKRv9siAgSUgZ+UWyk+J5Cttpd1ThCVwdclzIwQSclz3hYn049+M2fgrP1WpvF8xg==} + /electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} dev: true /emittery@0.13.1: @@ -3004,11 +3697,48 @@ packages: is-arrayish: 0.2.1 dev: true + /esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} dev: true + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + dev: true + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: false @@ -3028,18 +3758,43 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-prettier@9.0.0(eslint@8.51.0): - resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + /eslint-config-prettier@9.1.0(eslint@9.9.1): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.51.0 + eslint: 9.9.1 dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint-plugin-regexp@2.6.0(eslint@9.9.1): + resolution: {integrity: sha512-FCL851+kislsTEQEMioAlpDuK5+E5vs0hi1bF8cFlPlHcEjeRhuAzEsGikXRreE+0j4WhW2uO54MqTjXtYOi3A==} + engines: {node: ^18 || >=20} + peerDependencies: + eslint: '>=8.44.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) + '@eslint-community/regexpp': 4.9.1 + comment-parser: 1.4.1 + eslint: 9.9.1 + jsdoc-type-pratt-parser: 4.1.0 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + scslre: 0.3.0 + dev: true + + /eslint-plugin-sonarjs@1.0.4(eslint@9.9.1): + resolution: {integrity: sha512-jF0eGCUsq/HzMub4ExAyD8x1oEgjOyB9XVytYGyWgSFvdiJQJp6IuP7RmtauCf06o6N/kZErh+zW4b10y1WZ+Q==} + engines: {node: '>=16'} + peerDependencies: + eslint: ^8.0.0 || ^9.0.0 + dependencies: + eslint: 9.9.1 + dev: true + + /eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -3050,40 +3805,47 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.51.0: - resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /eslint@9.9.1: + resolution: {integrity: sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) - '@eslint-community/regexpp': 4.9.1 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.51.0 - '@humanwhocodes/config-array': 0.11.11 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.18.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.9.1 '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.4 - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.0.2 + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -3096,13 +3858,13 @@ packages: - supports-color dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 dev: true /esprima@4.0.1: @@ -3190,7 +3952,7 @@ packages: resolution: {integrity: sha512-IZoZiDv2yZJAb3QrbaSATVtTCYT11OcqgFGoTN4iKVyN6NBkBkhtVIixww5fmakF0Upt5HfOxJuS6ZmJVeOtTQ==} engines: {node: '>= 8.0.0'} dependencies: - '@types/jsonwebtoken': 9.0.3 + '@types/jsonwebtoken': 9.0.6 express-unless: 2.1.3 jsonwebtoken: 9.0.2 dev: false @@ -3199,16 +3961,16 @@ packages: resolution: {integrity: sha512-wj4tLMyCVYuIIKHGt0FhCtIViBcwzWejX0EjNxveAa6dG+0XBCQhMbx+PnkLkFCxLC69qoFrxds4pIyL88inaQ==} dev: false - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1 + body-parser: 1.20.2 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.5.0 + cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 @@ -3258,6 +4020,17 @@ packages: micromatch: 4.0.5 dev: true + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true @@ -3278,11 +4051,11 @@ packages: bser: 2.1.1 dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} dependencies: - flat-cache: 3.1.1 + flat-cache: 4.0.1 dev: true /file-uri-to-path@1.0.0: @@ -3295,7 +4068,6 @@ packages: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: minimatch: 5.1.6 - dev: false /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} @@ -3342,13 +4114,12 @@ packages: path-exists: 4.0.0 dev: true - /flat-cache@3.1.1: - resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} - engines: {node: '>=12.0.0'} + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} dependencies: flatted: 3.2.9 keyv: 4.5.4 - rimraf: 3.0.2 dev: true /flatted@3.2.9: @@ -3410,6 +4181,12 @@ packages: engines: {node: '>=10'} dev: true + /get-tsconfig@4.8.0: + resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3440,11 +4217,14 @@ packages: engines: {node: '>=4'} dev: true - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + dev: true + + /globals@15.9.0: + resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + engines: {node: '>=18'} dev: true /globby@11.1.0: @@ -3529,6 +4309,7 @@ packages: debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: true /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -3547,6 +4328,15 @@ packages: engines: {node: '>= 4'} dev: true + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + dev: true + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -3675,7 +4465,7 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 '@babel/parser': 7.23.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -3688,7 +4478,7 @@ packages: resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 '@babel/parser': 7.23.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -3734,7 +4524,6 @@ packages: chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - dev: false /jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} @@ -3774,7 +4563,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.8.4)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@20.8.4)(ts-node@10.9.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3784,14 +4573,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.8.4)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@20.8.4)(ts-node@10.9.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.8.4)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.8.4)(ts-node@10.9.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -3802,7 +4591,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.8.4)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@20.8.4)(ts-node@10.9.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3814,11 +4603,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.8.4 - babel-jest: 29.7.0(@babel/core@7.23.0) + babel-jest: 29.7.0(@babel/core@7.25.2) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -3837,7 +4626,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@20.8.4)(typescript@5.2.2) + ts-node: 10.9.2(@types/node@20.8.4)(typescript@5.5.4) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -4054,15 +4843,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 '@babel/generator': 7.23.0 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.25.2) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.25.2) '@babel/types': 7.23.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -4126,7 +4915,7 @@ packages: supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@20.8.4)(ts-node@10.9.1): + /jest@29.7.0(@types/node@20.8.4)(ts-node@10.9.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -4136,10 +4925,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.8.4)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@20.8.4)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4166,6 +4955,11 @@ packages: argparse: 2.0.1 dev: true + /jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + dev: true + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -4254,10 +5048,22 @@ packages: type-check: 0.4.0 dev: true + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: false + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: false + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -4331,10 +5137,6 @@ packages: dependencies: yallist: 4.0.0 - /lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - dev: false - /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -4416,7 +5218,20 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: false + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -4458,6 +5273,7 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -4503,8 +5319,8 @@ packages: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} dev: true /normalize-path@3.0.0: @@ -4613,9 +5429,6 @@ packages: engines: {node: '>=6'} dev: true - /packet-reader@1.0.0: - resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} - /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4678,8 +5491,8 @@ packages: requiresBuild: true optional: true - /pg-connection-string@2.6.2: - resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + /pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} @@ -4690,15 +5503,19 @@ packages: engines: {node: '>=4'} dev: true - /pg-pool@3.6.1(pg@8.11.3): - resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} + /pg-pool@3.6.2(pg@8.12.0): + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} peerDependencies: pg: '>=8.0' dependencies: - pg: 8.11.3 + pg: 8.12.0 /pg-protocol@1.6.0: resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} + dev: true + + /pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} /pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -4723,8 +5540,8 @@ packages: postgres-range: 1.1.3 dev: true - /pg@8.11.3: - resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} + /pg@8.12.0: + resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==} engines: {node: '>= 8.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -4732,11 +5549,9 @@ packages: pg-native: optional: true dependencies: - buffer-writer: 2.0.0 - packet-reader: 1.0.0 - pg-connection-string: 2.6.2 - pg-pool: 3.6.1(pg@8.11.3) - pg-protocol: 1.6.0 + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.12.0) + pg-protocol: 1.6.1 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: @@ -4751,6 +5566,10 @@ packages: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + dev: true + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -4817,8 +5636,8 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-organize-imports@3.2.3(prettier@3.0.3)(typescript@5.2.2): - resolution: {integrity: sha512-KFvk8C/zGyvUaE3RvxN2MhCLwzV6OBbFSkwZ2OamCrs9ZY4i5L77jQ/w4UmUr+lqX8qbaqVq6bZZkApn+IgJSg==} + /prettier-plugin-organize-imports@3.2.4(prettier@3.3.3)(typescript@5.5.4): + resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} peerDependencies: '@volar/vue-language-plugin-pug': ^1.0.4 '@volar/vue-typescript': ^1.0.4 @@ -4830,12 +5649,12 @@ packages: '@volar/vue-typescript': optional: true dependencies: - prettier: 3.0.3 - typescript: 5.2.2 + prettier: 3.3.3 + typescript: 5.5.4 dev: true - /prettier@3.0.3: - resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + /prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true dev: true @@ -4910,8 +5729,8 @@ packages: engines: {node: '>= 0.6'} dev: false - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} dependencies: bytes: 3.1.2 @@ -4948,6 +5767,13 @@ packages: picomatch: 2.3.1 dev: true + /refa@0.12.1: + resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dependencies: + '@eslint-community/regexpp': 4.9.1 + dev: true + /regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -4969,6 +5795,14 @@ packages: '@babel/runtime': 7.23.1 dev: true + /regexp-ast-analysis@0.7.1: + resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dependencies: + '@eslint-community/regexpp': 4.9.1 + refa: 0.12.1 + dev: true + /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} @@ -5014,6 +5848,10 @@ packages: engines: {node: '>=8'} dev: true + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + /resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} @@ -5045,13 +5883,6 @@ packages: glob: 7.2.3 dev: true - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - /rollup@3.29.4: resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -5077,6 +5908,15 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + /scslre@0.3.0: + resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} + engines: {node: ^14.0.0 || >=16.0.0} + dependencies: + '@eslint-community/regexpp': 4.9.1 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + dev: true + /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -5094,6 +5934,12 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: true + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -5355,21 +6201,31 @@ packages: hasBin: true dev: true - /ts-api-utils@1.0.3(typescript@5.2.2): + /ts-api-utils@1.0.3(typescript@5.5.4): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.2.2 + typescript: 5.5.4 dev: true - /ts-jest@29.1.1(@babel/core@7.23.0)(jest@29.7.0)(typescript@5.2.2): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /ts-api-utils@1.3.0(typescript@5.5.4): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.5.4 + dev: true + + /ts-jest@29.2.5(@babel/core@7.25.2)(jest@29.7.0)(typescript@5.5.4): + resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 '@jest/types': ^29.0.0 babel-jest: ^29.0.0 esbuild: '*' @@ -5378,6 +6234,8 @@ packages: peerDependenciesMeta: '@babel/core': optional: true + '@jest/transform': + optional: true '@jest/types': optional: true babel-jest: @@ -5385,20 +6243,21 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.25.2 bs-logger: 0.2.6 + ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.8.4)(ts-node@10.9.1) + jest: 29.7.0(@types/node@20.8.4)(ts-node@10.9.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.2.2 + semver: 7.6.3 + typescript: 5.5.4 yargs-parser: 21.1.1 dev: true - /ts-node-dev@2.0.0(@types/node@20.8.4)(typescript@5.2.2): + /ts-node-dev@2.0.0(@types/node@20.8.4)(typescript@5.5.4): resolution: {integrity: sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==} engines: {node: '>=0.8.0'} hasBin: true @@ -5417,17 +6276,17 @@ packages: rimraf: 2.7.1 source-map-support: 0.5.21 tree-kill: 1.2.2 - ts-node: 10.9.1(@types/node@20.8.4)(typescript@5.2.2) + ts-node: 10.9.2(@types/node@20.8.4)(typescript@5.5.4) tsconfig: 7.0.0 - typescript: 5.2.2 + typescript: 5.5.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' dev: true - /ts-node@10.9.1(@types/node@20.8.4)(typescript@5.2.2): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + /ts-node@10.9.2(@types/node@20.8.4)(typescript@5.5.4): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -5452,7 +6311,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.2.2 + typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -5466,9 +6325,16 @@ packages: strip-json-comments: 2.0.1 dev: true - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false + /tsx@4.19.0: + resolution: {integrity: sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true /tunnel-ssh@4.1.6: resolution: {integrity: sha512-y7+x+T3F3rkx2Zov5Tk9DGfeEBVAdWU3A/91E0Dk5rrZ/VFIlpV2uhhRuaISJUdyG0N+Lcp1fXZMXz+ovPt5vA==} @@ -5496,11 +6362,6 @@ packages: engines: {node: '>=4'} dev: true - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -5514,8 +6375,26 @@ packages: mime-types: 2.1.35 dev: false - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + /typescript-eslint@8.3.0(eslint@9.9.1)(typescript@5.5.4): + resolution: {integrity: sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 8.3.0(@typescript-eslint/parser@8.3.0)(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/parser': 8.3.0(eslint@9.9.1)(typescript@5.5.4) + '@typescript-eslint/utils': 8.3.0(eslint@9.9.1)(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - eslint + - supports-color + dev: true + + /typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true dev: true @@ -5561,15 +6440,15 @@ packages: engines: {node: '>= 0.8'} dev: false - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + /update-browserslist-db@1.1.0(browserslist@4.23.3): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: 4.23.3 + escalade: 3.2.0 + picocolors: 1.0.1 dev: true /uri-js@4.4.1: diff --git a/tsconfig.dim-api-types.json b/tsconfig.dim-api-types.json index 00d6bea..3fdb581 100644 --- a/tsconfig.dim-api-types.json +++ b/tsconfig.dim-api-types.json @@ -1,11 +1,18 @@ { "compilerOptions": { "outDir": "./dim-api-types", + "strict": true, "sourceMap": false, "strictNullChecks": true, - "module": "commonjs", + "module": "CommonJS", "target": "es5", - "moduleResolution": "node", + "moduleResolution": "NodeNext", + "noUnusedLocals": true, + "noUnusedParameters": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "useUnknownInCatchVariables": true, "declaration": true, "emitDeclarationOnly": true, "esModuleInterop": true diff --git a/tsconfig.json b/tsconfig.json index 8ed5861..3daffc9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,16 +1,16 @@ { "compilerOptions": { + "strict": true, "esModuleInterop": true, "sourceMap": true, - "strictNullChecks": true, - "strictBindCallApply": true, "module": "NodeNext", - "target": "es2022", + "target": "ESNext", "moduleResolution": "NodeNext", "noUnusedLocals": true, "noUnusedParameters": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "skipLibCheck": true + "skipLibCheck": true, + "useUnknownInCatchVariables": true } }