diff --git a/.github/workflows/release-feature-branch.yaml b/.github/workflows/release-feature-branch.yaml index f00ce0dcb..99d0ad587 100644 --- a/.github/workflows/release-feature-branch.yaml +++ b/.github/workflows/release-feature-branch.yaml @@ -113,6 +113,7 @@ jobs: PG_CONNECTION_STRING: postgres://postgres:postgres@localhost:5432/drizzle MYSQL_CONNECTION_STRING: mysql://root:root@localhost:3306/drizzle PLANETSCALE_CONNECTION_STRING: ${{ secrets.PLANETSCALE_CONNECTION_STRING }} + NEON_CONNECTION_STRING: ${{ secrets.NEON_CONNECTION_STRING }} LIBSQL_URL: file:local.db run: | if [[ ${{ github.event_name }} != "push" && "${{ github.event.pull_request.head.repo.full_name }}" != "${{ github.repository }}" ]]; then diff --git a/.github/workflows/release-latest.yaml b/.github/workflows/release-latest.yaml index 181f9e65b..df0eeb323 100644 --- a/.github/workflows/release-latest.yaml +++ b/.github/workflows/release-latest.yaml @@ -116,6 +116,7 @@ jobs: PG_CONNECTION_STRING: postgres://postgres:postgres@localhost:5432/drizzle MYSQL_CONNECTION_STRING: mysql://root:root@localhost:3306/drizzle PLANETSCALE_CONNECTION_STRING: ${{ secrets.PLANETSCALE_CONNECTION_STRING }} + NEON_CONNECTION_STRING: ${{ secrets.NEON_CONNECTION_STRING }} LIBSQL_URL: file:local.db run: | if [[ "${{ matrix.package }}" == "drizzle-orm" ]]; then diff --git a/changelogs/drizzle-orm/0.29.4.md b/changelogs/drizzle-orm/0.29.4.md new file mode 100644 index 000000000..98862771f --- /dev/null +++ b/changelogs/drizzle-orm/0.29.4.md @@ -0,0 +1,85 @@ +## New Features + +### 🎉 **Neon HTTP Batch** + +For more info you can check [Neon docs](https://neon.tech/docs/serverless/serverless-driver#issue-multiple-queries-with-the-transaction-function) + +**Example** + +```ts +const batchResponse: BatchType = await db.batch([ + db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ + id: usersTable.id, + }), + db.insert(usersTable).values({ id: 2, name: 'Dan' }), + db.query.usersTable.findMany({}), + db.query.usersTable.findFirst({}), +]); +``` + +```ts +type BatchType = [ + { + id: number; + }[], + NeonHttpQueryResult, + { + id: number; + name: string; + verified: number; + invitedBy: number | null; + }[], + { + id: number; + name: string; + verified: number; + invitedBy: number | null; + } | undefined, +]; +``` + +## Improvements + +Thanks to the `database-js` and `PlanetScale` teams, we have updated the default behavior and instances of `database-js`. + +As suggested by the `database-js` core team, you should use the `Client` instance instead of `connect()`: + +```typescript +import { Client } from '@planetscale/database'; +import { drizzle } from 'drizzle-orm/planetscale-serverless'; + +// create the connection +const client = new Client({ + host: process.env['DATABASE_HOST'], + username: process.env['DATABASE_USERNAME'], + password: process.env['DATABASE_PASSWORD'], +}); + +const db = drizzle(client); +``` + +> Warning: In this version, there are no breaking changes, but starting from version `0.30.0`, you will encounter an error if you attempt to use anything other than a `Client` instance. +> +> We suggest starting to change connections to PlanetScale now to prevent any runtime errors in the future. + +Previously our docs stated to use `connect()` and only this function was can be passed to drizzle. In this realase we are adding support for `new Client()` and deprecating `connect()`, by suggesting from `database-js` team. In this release you will see a `warning` when trying to pass `connect()` function result: + +**Warning text** + +```mdx +Warning: You need to pass an instance of Client: + +import { Client } from "@planetscale/database"; + +const client = new Client({ + host: process.env["DATABASE_HOST"], + username: process.env["DATABASE_USERNAME"], + password: process.env["DATABASE_PASSWORD"], +}); + +const db = drizzle(client); + +Starting from version 0.30.0, you will encounter an error if you attempt to use anything other than a Client instance. + +Please make the necessary changes now to prevent any runtime errors in the future +``` diff --git a/drizzle-orm/package.json b/drizzle-orm/package.json index 6c525fa80..92a974548 100644 --- a/drizzle-orm/package.json +++ b/drizzle-orm/package.json @@ -1,6 +1,6 @@ { "name": "drizzle-orm", - "version": "0.29.3", + "version": "0.29.4", "description": "Drizzle ORM package for SQL databases", "type": "module", "scripts": { diff --git a/drizzle-orm/src/alias.ts b/drizzle-orm/src/alias.ts index ecbc2dc56..0711dc53d 100644 --- a/drizzle-orm/src/alias.ts +++ b/drizzle-orm/src/alias.ts @@ -2,7 +2,7 @@ import type { AnyColumn } from './column.ts'; import { Column } from './column.ts'; import { entityKind, is } from './entity.ts'; import type { Relation } from './relations.ts'; -import type { View} from './sql/sql.ts'; +import type { View } from './sql/sql.ts'; import { SQL, sql } from './sql/sql.ts'; import { Table } from './table.ts'; import { ViewBaseConfig } from './view-common.ts'; diff --git a/drizzle-orm/src/aws-data-api/pg/session.ts b/drizzle-orm/src/aws-data-api/pg/session.ts index 53519e6b9..2936786d1 100644 --- a/drizzle-orm/src/aws-data-api/pg/session.ts +++ b/drizzle-orm/src/aws-data-api/pg/session.ts @@ -9,10 +9,10 @@ import { entityKind } from '~/entity.ts'; import type { Logger } from '~/logger.ts'; import { type PgDialect, + PgPreparedQuery, PgSession, PgTransaction, type PgTransactionConfig, - PreparedQuery, type PreparedQueryConfig, type QueryResultHKT, } from '~/pg-core/index.ts'; @@ -24,7 +24,7 @@ import { getValueFromDataApi, toValueParam } from '../common/index.ts'; export type AwsDataApiClient = RDSDataClient; -export class AwsDataApiPreparedQuery extends PreparedQuery { +export class AwsDataApiPreparedQuery extends PgPreparedQuery { static readonly [entityKind]: string = 'AwsDataApiPreparedQuery'; private rawQuery: ExecuteStatementCommand; @@ -40,7 +40,7 @@ export class AwsDataApiPreparedQuery extends Prep readonly transactionId: string | undefined, private customResultMapper?: (rows: unknown[][]) => T['execute'], ) { - super(); + super({ sql: queryString, params }); this.rawQuery = new ExecuteStatementCommand({ sql: queryString, parameters: [], @@ -151,7 +151,7 @@ export class AwsDataApiSession< fields: SelectedFieldsOrdered | undefined, transactionId?: string, customResultMapper?: (rows: unknown[][]) => T['execute'], - ): PreparedQuery { + ): PgPreparedQuery { return new AwsDataApiPreparedQuery( this.client, query.sql, diff --git a/drizzle-orm/src/d1/session.ts b/drizzle-orm/src/d1/session.ts index da2040ec7..b4b865884 100644 --- a/drizzle-orm/src/d1/session.ts +++ b/drizzle-orm/src/d1/session.ts @@ -6,7 +6,7 @@ import type { Logger } from '~/logger.ts'; import { NoopLogger } from '~/logger.ts'; import type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts'; import type { PreparedQuery } from '~/session.ts'; -import { type Query, sql, fillPlaceholders } from '~/sql/sql.ts'; +import { fillPlaceholders, type Query, sql } from '~/sql/sql.ts'; import type { SQLiteAsyncDialect } from '~/sqlite-core/dialect.ts'; import { SQLiteTransaction } from '~/sqlite-core/index.ts'; import type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts'; @@ -57,7 +57,7 @@ export class SQLiteD1Session< const builtQueries: D1PreparedStatement[] = []; for (const query of queries) { - const preparedQuery = query.prepare(); + const preparedQuery = query._prepare(); const builtQuery = preparedQuery.getQuery(); preparedQueries.push(preparedQuery); if (builtQuery.params.length > 0) { @@ -154,8 +154,8 @@ export class SQLiteD1Session< // return res; } - override extractRawAllValueFromBatchResult(_result: unknown): unknown { - return (_result as D1Result).results; + override extractRawAllValueFromBatchResult(result: unknown): unknown { + return (result as D1Result).results; } override extractRawGetValueFromBatchResult(result: unknown): unknown { diff --git a/drizzle-orm/src/libsql/session.ts b/drizzle-orm/src/libsql/session.ts index 76155f041..3dae1b17a 100644 --- a/drizzle-orm/src/libsql/session.ts +++ b/drizzle-orm/src/libsql/session.ts @@ -64,7 +64,7 @@ export class LibSQLSession< const builtQueries: InStatement[] = []; for (const query of queries) { - const preparedQuery = query.prepare(); + const preparedQuery = query._prepare(); const builtQuery = preparedQuery.getQuery(); preparedQueries.push(preparedQuery); builtQueries.push({ sql: builtQuery.sql, args: builtQuery.params as InArgs }); diff --git a/drizzle-orm/src/neon-http/driver.ts b/drizzle-orm/src/neon-http/driver.ts index 7172dfd01..20afe4fc8 100644 --- a/drizzle-orm/src/neon-http/driver.ts +++ b/drizzle-orm/src/neon-http/driver.ts @@ -1,15 +1,13 @@ +import type { NeonQueryFunction } from '@neondatabase/serverless'; import { types } from '@neondatabase/serverless'; +import type { BatchItem, BatchResponse } from '~/batch.ts'; import { entityKind } from '~/entity.ts'; import type { Logger } from '~/logger.ts'; import { DefaultLogger } from '~/logger.ts'; import { PgDatabase } from '~/pg-core/db.ts'; import { PgDialect } from '~/pg-core/dialect.ts'; -import { - createTableRelationsHelpers, - extractTablesRelationalConfig, - type RelationalSchemaConfig, - type TablesRelationalConfig, -} from '~/relations.ts'; +import { createTableRelationsHelpers, extractTablesRelationalConfig } from '~/relations.ts'; +import type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts'; import type { DrizzleConfig } from '~/utils.ts'; import { type NeonHttpClient, type NeonHttpQueryResultHKT, NeonHttpSession } from './session.ts'; @@ -41,12 +39,23 @@ export class NeonHttpDriver { } } -export type NeonHttpDatabase< +export class NeonHttpDatabase< TSchema extends Record = Record, -> = PgDatabase; +> extends PgDatabase { + static readonly [entityKind]: string = 'NeonHttpDatabase'; + + /** @internal */ + declare readonly session: NeonHttpSession>; + + async batch, T extends Readonly<[U, ...U[]]>>( + batch: T, + ): Promise> { + return this.session.batch(batch) as Promise>; + } +} export function drizzle = Record>( - client: NeonHttpClient, + client: NeonQueryFunction, config: DrizzleConfig = {}, ): NeonHttpDatabase { const dialect = new PgDialect(); @@ -70,8 +79,12 @@ export function drizzle = Record; + return new NeonHttpDatabase( + dialect, + session, + schema as RelationalSchemaConfig> | undefined, + ); } diff --git a/drizzle-orm/src/neon-http/session.ts b/drizzle-orm/src/neon-http/session.ts index 9b73ab98c..2b2acb6b0 100644 --- a/drizzle-orm/src/neon-http/session.ts +++ b/drizzle-orm/src/neon-http/session.ts @@ -1,4 +1,5 @@ import type { FullQueryResults, QueryRows } from '@neondatabase/serverless'; +import type { BatchItem } from '~/batch.ts'; import { entityKind } from '~/entity.ts'; import type { Logger } from '~/logger.ts'; import { NoopLogger } from '~/logger.ts'; @@ -6,71 +7,91 @@ import type { PgDialect } from '~/pg-core/dialect.ts'; import { PgTransaction } from '~/pg-core/index.ts'; import type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts'; import type { PgTransactionConfig, PreparedQueryConfig, QueryResultHKT } from '~/pg-core/session.ts'; -import { PgSession, PreparedQuery } from '~/pg-core/session.ts'; +import { PgPreparedQuery as PgPreparedQuery, PgSession } from '~/pg-core/session.ts'; import type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts'; +import type { PreparedQuery } from '~/session.ts'; import { fillPlaceholders, type Query } from '~/sql/sql.ts'; -import { type Assume, mapResultRow } from '~/utils.ts'; +import { mapResultRow } from '~/utils.ts'; export type NeonHttpClient = { ( strings: string, params?: any[], - mode?: { arrayMode?: A; fullResults?: F }, + config?: { arrayMode?: A; fullResults?: F }, ): Promise< F extends true ? FullQueryResults : QueryRows >; + + transaction( + queries: Promise | QueryRows>[], + config?: { arrayMode?: A; fullResults?: F }, + ): Promise< + F extends true ? FullQueryResults[] : QueryRows[] + >; }; -export class NeonHttpPreparedQuery extends PreparedQuery { - static readonly [entityKind]: string = 'NeonHttpPreparedQuery'; +const rawQueryConfig = { + arrayMode: false, + fullResults: true, +} as const; +const queryConfig = { + arrayMode: true, + fullResults: true, +} as const; - private rawQuery: { arrayMode?: false; fullResults?: true }; - private query: { arrayMode?: true; fullResults?: true }; +export class NeonHttpPreparedQuery extends PgPreparedQuery { + static readonly [entityKind]: string = 'NeonHttpPreparedQuery'; constructor( private client: NeonHttpClient, - private queryString: string, - private params: unknown[], + query: Query, private logger: Logger, private fields: SelectedFieldsOrdered | undefined, - private name: string | undefined, private customResultMapper?: (rows: unknown[][]) => T['execute'], ) { - super(); - this.rawQuery = { - arrayMode: false, - fullResults: true, - }; - this.query = { arrayMode: true, fullResults: true }; + super(query); } async execute(placeholderValues: Record | undefined = {}): Promise { - const params = fillPlaceholders(this.params, placeholderValues); + const params = fillPlaceholders(this.query.params, placeholderValues); - this.logger.logQuery(this.queryString, params); + this.logger.logQuery(this.query.sql, params); + + const { fields, client, query, customResultMapper } = this; - const { fields, client, queryString, query, rawQuery, joinsNotNullableMap, customResultMapper } = this; if (!fields && !customResultMapper) { - return client(queryString, params, rawQuery); + return client(query.sql, params, rawQueryConfig); } - const result = await client(queryString, params, query); + const result = await client(query.sql, params, queryConfig); - return customResultMapper - ? customResultMapper(result.rows as unknown[][]) - : result.rows.map((row) => mapResultRow(fields!, row as unknown[], joinsNotNullableMap)); + return this.mapResult(result); + } + + override mapResult(result: unknown): unknown { + if (!this.fields && !this.customResultMapper) { + return result; + } + + const rows = (result as FullQueryResults).rows; + + if (this.customResultMapper) { + return this.customResultMapper(rows); + } + + return rows.map((row) => mapResultRow(this.fields!, row, this.joinsNotNullableMap)); } all(placeholderValues: Record | undefined = {}): Promise { - const params = fillPlaceholders(this.params, placeholderValues); - this.logger.logQuery(this.queryString, params); - return this.client(this.queryString, params, this.rawQuery).then((result) => result.rows); + const params = fillPlaceholders(this.query.params, placeholderValues); + this.logger.logQuery(this.query.sql, params); + return this.client(this.query.sql, params, rawQueryConfig).then((result) => result.rows); } values(placeholderValues: Record | undefined = {}): Promise { - const params = fillPlaceholders(this.params, placeholderValues); - this.logger.logQuery(this.queryString, params); - return this.client(this.queryString, params).then((result) => result.rows); + const params = fillPlaceholders(this.query.params, placeholderValues); + this.logger.logQuery(this.query.sql, params); + return this.client(this.query.sql, params).then((result) => result.rows); } } @@ -101,18 +122,32 @@ export class NeonHttpSession< fields: SelectedFieldsOrdered | undefined, name: string | undefined, customResultMapper?: (rows: unknown[][]) => T['execute'], - ): PreparedQuery { + ): PgPreparedQuery { return new NeonHttpPreparedQuery( this.client, - query.sql, - query.params, + query, this.logger, fields, - name, customResultMapper, ); } + async batch, T extends Readonly<[U, ...U[]]>>(queries: T) { + const preparedQueries: PreparedQuery[] = []; + const builtQueries: Promise | QueryRows>[] = []; + + for (const query of queries) { + const preparedQuery = query._prepare(); + const builtQuery = preparedQuery.getQuery(); + preparedQueries.push(preparedQuery); + builtQueries.push(this.client(builtQuery.sql, builtQuery.params)); + } + + const batchResults = await this.client.transaction(builtQueries, queryConfig); + + return batchResults.map((result, i) => preparedQueries[i]!.mapResult(result, true)); + } + // change return type to QueryRows async query(query: string, params: unknown[]): Promise> { this.logger.logQuery(query, params); @@ -159,6 +194,8 @@ export class NeonTransaction< } } +export type NeonHttpQueryResult = Omit, 'rows'> & { rows: T[] }; + export interface NeonHttpQueryResultHKT extends QueryResultHKT { - type: FullQueryResults>; + type: NeonHttpQueryResult; } diff --git a/drizzle-orm/src/neon-serverless/session.ts b/drizzle-orm/src/neon-serverless/session.ts index 891835259..e00335351 100644 --- a/drizzle-orm/src/neon-serverless/session.ts +++ b/drizzle-orm/src/neon-serverless/session.ts @@ -14,18 +14,18 @@ import type { PgDialect } from '~/pg-core/dialect.ts'; import { PgTransaction } from '~/pg-core/index.ts'; import type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts'; import type { PgTransactionConfig, PreparedQueryConfig, QueryResultHKT } from '~/pg-core/session.ts'; -import { PgSession, PreparedQuery } from '~/pg-core/session.ts'; +import { PgPreparedQuery, PgSession } from '~/pg-core/session.ts'; import type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts'; import { fillPlaceholders, type Query, sql } from '~/sql/sql.ts'; import { type Assume, mapResultRow } from '~/utils.ts'; export type NeonClient = Pool | PoolClient | Client; -export class NeonPreparedQuery extends PreparedQuery { +export class NeonPreparedQuery extends PgPreparedQuery { static readonly [entityKind]: string = 'NeonPreparedQuery'; - private rawQuery: QueryConfig; - private query: QueryArrayConfig; + private rawQueryConfig: QueryConfig; + private queryConfig: QueryArrayConfig; constructor( private client: NeonClient, @@ -36,12 +36,12 @@ export class NeonPreparedQuery extends PreparedQu name: string | undefined, private customResultMapper?: (rows: unknown[][]) => T['execute'], ) { - super(); - this.rawQuery = { + super({ sql: queryString, params }); + this.rawQueryConfig = { name, text: queryString, }; - this.query = { + this.queryConfig = { name, text: queryString, rowMode: 'array', @@ -51,9 +51,10 @@ export class NeonPreparedQuery extends PreparedQu async execute(placeholderValues: Record | undefined = {}): Promise { const params = fillPlaceholders(this.params, placeholderValues); - this.logger.logQuery(this.rawQuery.text, params); + this.logger.logQuery(this.rawQueryConfig.text, params); - const { fields, client, rawQuery, query, joinsNotNullableMap, customResultMapper } = this; + const { fields, client, rawQueryConfig: rawQuery, queryConfig: query, joinsNotNullableMap, customResultMapper } = + this; if (!fields && !customResultMapper) { return client.query(rawQuery, params); } @@ -67,14 +68,14 @@ export class NeonPreparedQuery extends PreparedQu all(placeholderValues: Record | undefined = {}): Promise { const params = fillPlaceholders(this.params, placeholderValues); - this.logger.logQuery(this.rawQuery.text, params); - return this.client.query(this.rawQuery, params).then((result) => result.rows); + this.logger.logQuery(this.rawQueryConfig.text, params); + return this.client.query(this.rawQueryConfig, params).then((result) => result.rows); } values(placeholderValues: Record | undefined = {}): Promise { const params = fillPlaceholders(this.params, placeholderValues); - this.logger.logQuery(this.rawQuery.text, params); - return this.client.query(this.query, params).then((result) => result.rows); + this.logger.logQuery(this.rawQueryConfig.text, params); + return this.client.query(this.queryConfig, params).then((result) => result.rows); } } @@ -105,7 +106,7 @@ export class NeonSession< fields: SelectedFieldsOrdered | undefined, name: string | undefined, customResultMapper?: (rows: unknown[][]) => T['execute'], - ): PreparedQuery { + ): PgPreparedQuery { return new NeonPreparedQuery(this.client, query.sql, query.params, this.logger, fields, name, customResultMapper); } diff --git a/drizzle-orm/src/node-postgres/session.ts b/drizzle-orm/src/node-postgres/session.ts index 01ad7cac8..2ae93d10f 100644 --- a/drizzle-orm/src/node-postgres/session.ts +++ b/drizzle-orm/src/node-postgres/session.ts @@ -6,7 +6,7 @@ import type { PgDialect } from '~/pg-core/dialect.ts'; import { PgTransaction } from '~/pg-core/index.ts'; import type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts'; import type { PgTransactionConfig, PreparedQueryConfig, QueryResultHKT } from '~/pg-core/session.ts'; -import { PgSession, PreparedQuery } from '~/pg-core/session.ts'; +import { PgPreparedQuery, PgSession } from '~/pg-core/session.ts'; import type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts'; import { fillPlaceholders, type Query, sql } from '~/sql/sql.ts'; import { tracer } from '~/tracing.ts'; @@ -16,11 +16,11 @@ const { Pool } = pg; export type NodePgClient = pg.Pool | PoolClient | Client; -export class NodePgPreparedQuery extends PreparedQuery { +export class NodePgPreparedQuery extends PgPreparedQuery { static readonly [entityKind]: string = 'NodePgPreparedQuery'; - private rawQuery: QueryConfig; - private query: QueryArrayConfig; + private rawQueryConfig: QueryConfig; + private queryConfig: QueryArrayConfig; constructor( private client: NodePgClient, @@ -31,12 +31,12 @@ export class NodePgPreparedQuery extends Prepared name: string | undefined, private customResultMapper?: (rows: unknown[][]) => T['execute'], ) { - super(); - this.rawQuery = { + super({ sql: queryString, params }); + this.rawQueryConfig = { name, text: queryString, }; - this.query = { + this.queryConfig = { name, text: queryString, rowMode: 'array', @@ -47,9 +47,10 @@ export class NodePgPreparedQuery extends Prepared return tracer.startActiveSpan('drizzle.execute', async () => { const params = fillPlaceholders(this.params, placeholderValues); - this.logger.logQuery(this.rawQuery.text, params); + this.logger.logQuery(this.rawQueryConfig.text, params); - const { fields, rawQuery, client, query, joinsNotNullableMap, customResultMapper } = this; + const { fields, rawQueryConfig: rawQuery, client, queryConfig: query, joinsNotNullableMap, customResultMapper } = + this; if (!fields && !customResultMapper) { return tracer.startActiveSpan('drizzle.driver.execute', async (span) => { span?.setAttributes({ @@ -81,14 +82,14 @@ export class NodePgPreparedQuery extends Prepared all(placeholderValues: Record | undefined = {}): Promise { return tracer.startActiveSpan('drizzle.execute', () => { const params = fillPlaceholders(this.params, placeholderValues); - this.logger.logQuery(this.rawQuery.text, params); + this.logger.logQuery(this.rawQueryConfig.text, params); return tracer.startActiveSpan('drizzle.driver.execute', (span) => { span?.setAttributes({ - 'drizzle.query.name': this.rawQuery.name, - 'drizzle.query.text': this.rawQuery.text, + 'drizzle.query.name': this.rawQueryConfig.name, + 'drizzle.query.text': this.rawQueryConfig.text, 'drizzle.query.params': JSON.stringify(params), }); - return this.client.query(this.rawQuery, params).then((result) => result.rows); + return this.client.query(this.rawQueryConfig, params).then((result) => result.rows); }); }); } @@ -121,7 +122,7 @@ export class NodePgSession< fields: SelectedFieldsOrdered | undefined, name: string | undefined, customResultMapper?: (rows: unknown[][]) => T['execute'], - ): PreparedQuery { + ): PgPreparedQuery { return new NodePgPreparedQuery(this.client, query.sql, query.params, this.logger, fields, name, customResultMapper); } diff --git a/drizzle-orm/src/pg-core/db.ts b/drizzle-orm/src/pg-core/db.ts index a5050ce53..86a275e7a 100644 --- a/drizzle-orm/src/pg-core/db.ts +++ b/drizzle-orm/src/pg-core/db.ts @@ -11,6 +11,7 @@ import type { PgSession, PgTransaction, PgTransactionConfig, + PreparedQueryConfig, QueryResultHKT, QueryResultKind, } from '~/pg-core/session.ts'; @@ -23,6 +24,7 @@ import { WithSubquery } from '~/subquery.ts'; import type { DrizzleTypeError } from '~/utils.ts'; import type { PgColumn } from './columns/index.ts'; import { RelationalQueryBuilder } from './query-builders/query.ts'; +import { PgRaw } from './query-builders/raw.ts'; import { PgRefreshMaterializedView } from './query-builders/refresh-materialized-view.ts'; import type { SelectedFields } from './query-builders/select.types.ts'; import type { WithSubqueryWithSelection } from './subquery.ts'; @@ -373,8 +375,20 @@ export class PgDatabase< execute = Record>( query: SQLWrapper, - ): Promise> { - return this.session.execute(query.getSQL()); + ): /* PgRaw> */ Promise> { + const sql = query.getSQL(); + const builtQuery = this.dialect.sqlToQuery(sql); + const prepared = this.session.prepareQuery }>( + builtQuery, + undefined, + undefined, + ); + return new PgRaw( + () => prepared.execute(), + sql, + builtQuery, + (result) => prepared.mapResult(result, false), + ); } transaction( diff --git a/drizzle-orm/src/pg-core/query-builders/delete.ts b/drizzle-orm/src/pg-core/query-builders/delete.ts index df22a110e..3abeef1b4 100644 --- a/drizzle-orm/src/pg-core/query-builders/delete.ts +++ b/drizzle-orm/src/pg-core/query-builders/delete.ts @@ -1,8 +1,8 @@ import { entityKind } from '~/entity.ts'; import type { PgDialect } from '~/pg-core/dialect.ts'; import type { + PgPreparedQuery, PgSession, - PreparedQuery, PreparedQueryConfig, QueryResultHKT, QueryResultKind, @@ -10,12 +10,13 @@ import type { import type { PgTable } from '~/pg-core/table.ts'; import type { SelectResultFields } from '~/query-builders/select.types.ts'; import { QueryPromise } from '~/query-promise.ts'; +import type { RunnableQuery } from '~/runnable-query.ts'; import type { Query, SQL, SQLWrapper } from '~/sql/sql.ts'; import { Table } from '~/table.ts'; import { tracer } from '~/tracing.ts'; import { orderSelectedFields } from '~/utils.ts'; -import type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts'; import type { PgColumn } from '../columns/common.ts'; +import type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts'; export type PgDeleteWithout< T extends AnyPgDeleteBase, @@ -76,7 +77,7 @@ export type PgDeleteReturning< 'returning' >; -export type PgDeletePrepare = PreparedQuery< +export type PgDeletePrepare = PgPreparedQuery< PreparedQueryConfig & { execute: T['_']['returning'] extends undefined ? QueryResultKind : T['_']['returning'][]; @@ -97,13 +98,19 @@ export interface PgDeleteBase< TReturning extends Record | undefined = undefined, TDynamic extends boolean = false, TExcludedMethods extends string = never, -> extends QueryPromise : TReturning[]> { +> extends + QueryPromise : TReturning[]>, + RunnableQuery : TReturning[], 'pg'>, + SQLWrapper +{ readonly _: { + dialect: 'pg'; readonly table: TTable; readonly queryResult: TQueryResult; readonly returning: TReturning; readonly dynamic: TDynamic; readonly excludedMethods: TExcludedMethods; + readonly result: TReturning extends undefined ? QueryResultKind : TReturning[]; }; } @@ -115,7 +122,9 @@ export class PgDeleteBase< // eslint-disable-next-line @typescript-eslint/no-unused-vars TExcludedMethods extends string = never, > extends QueryPromise : TReturning[]> - implements SQLWrapper + implements + RunnableQuery : TReturning[], 'pg'>, + SQLWrapper { static readonly [entityKind]: string = 'PgDelete'; @@ -130,35 +139,35 @@ export class PgDeleteBase< this.config = { table }; } - /** + /** * Adds a `where` clause to the query. - * + * * Calling this method will delete only those rows that fulfill a specified condition. - * + * * See docs: {@link https://orm.drizzle.team/docs/delete} - * + * * @param where the `where` clause. - * + * * @example * You can use conditional operators and `sql function` to filter the rows to be deleted. - * + * * ```ts * // Delete all cars with green color * await db.delete(cars).where(eq(cars.color, 'green')); * // or * await db.delete(cars).where(sql`${cars.color} = 'green'`) * ``` - * + * * You can logically combine conditional operators with `and()` and `or()` operators: - * + * * ```ts * // Delete all BMW cars with a green color * await db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW'))); - * + * * // Delete all cars with the green or blue color * await db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue'))); * ``` - */ + */ where(where: SQL | undefined): PgDeleteWithout { this.config.where = where; return this as any; @@ -166,18 +175,18 @@ export class PgDeleteBase< /** * Adds a `returning` clause to the query. - * + * * Calling this method will return the specified fields of the deleted rows. If no fields are specified, all fields will be returned. - * - * See docs: {@link https://orm.drizzle.team/docs/delete#delete-with-return} - * + * + * See docs: {@link https://orm.drizzle.team/docs/delete#delete-with-return} + * * @example * ```ts * // Delete all cars with the green color and return all fields * const deletedCars: Car[] = await db.delete(cars) * .where(eq(cars.color, 'green')) * .returning(); - * + * * // Delete all cars with the green color and return only their id and brand fields * const deletedCarsIdsAndBrands: { id: number, brand: string }[] = await db.delete(cars) * .where(eq(cars.color, 'green')) @@ -205,7 +214,8 @@ export class PgDeleteBase< return rest; } - private _prepare(name?: string): PgDeletePrepare { + /** @internal */ + _prepare(name?: string): PgDeletePrepare { return tracer.startActiveSpan('drizzle.prepareQuery', () => { return this.session.prepareQuery< PreparedQueryConfig & { diff --git a/drizzle-orm/src/pg-core/query-builders/insert.ts b/drizzle-orm/src/pg-core/query-builders/insert.ts index b4ec31a93..55fd0cce3 100644 --- a/drizzle-orm/src/pg-core/query-builders/insert.ts +++ b/drizzle-orm/src/pg-core/query-builders/insert.ts @@ -2,8 +2,8 @@ import { entityKind, is } from '~/entity.ts'; import type { PgDialect } from '~/pg-core/dialect.ts'; import type { IndexColumn } from '~/pg-core/indexes.ts'; import type { + PgPreparedQuery, PgSession, - PreparedQuery, PreparedQueryConfig, QueryResultHKT, QueryResultKind, @@ -11,14 +11,15 @@ import type { import type { PgTable } from '~/pg-core/table.ts'; import type { SelectResultFields } from '~/query-builders/select.types.ts'; import { QueryPromise } from '~/query-promise.ts'; +import type { RunnableQuery } from '~/runnable-query.ts'; import type { Placeholder, Query, SQLWrapper } from '~/sql/sql.ts'; import { Param, SQL, sql } from '~/sql/sql.ts'; import { Table } from '~/table.ts'; import { tracer } from '~/tracing.ts'; import { mapUpdateSet, orderSelectedFields } from '~/utils.ts'; +import type { PgColumn } from '../columns/common.ts'; import type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts'; import type { PgUpdateSetSource } from './update.ts'; -import type { PgColumn } from '../columns/common.ts'; export interface PgInsertConfig { table: TTable; @@ -102,7 +103,7 @@ export interface PgInsertOnConflictDoUpdateConfig { set: PgUpdateSetSource; } -export type PgInsertPrepare = PreparedQuery< +export type PgInsertPrepare = PgPreparedQuery< PreparedQueryConfig & { execute: T['_']['returning'] extends undefined ? QueryResultKind : T['_']['returning'][]; @@ -117,28 +118,34 @@ export type PgInsertDynamic = PgInsert< export type AnyPgInsert = PgInsertBase; +export type PgInsert< + TTable extends PgTable = PgTable, + TQueryResult extends QueryResultHKT = QueryResultHKT, + TReturning extends Record | undefined = Record | undefined, +> = PgInsertBase; + export interface PgInsertBase< TTable extends PgTable, TQueryResult extends QueryResultHKT, TReturning extends Record | undefined = undefined, TDynamic extends boolean = false, TExcludedMethods extends string = never, -> extends QueryPromise : TReturning[]>, SQLWrapper { +> extends + QueryPromise : TReturning[]>, + RunnableQuery : TReturning[], 'pg'>, + SQLWrapper +{ readonly _: { + readonly dialect: 'pg'; readonly table: TTable; readonly queryResult: TQueryResult; readonly returning: TReturning; readonly dynamic: TDynamic; readonly excludedMethods: TExcludedMethods; + readonly result: TReturning extends undefined ? QueryResultKind : TReturning[]; }; } -export type PgInsert< - TTable extends PgTable = PgTable, - TQueryResult extends QueryResultHKT = QueryResultHKT, - TReturning extends Record | undefined = Record | undefined, -> = PgInsertBase; - export class PgInsertBase< TTable extends PgTable, TQueryResult extends QueryResultHKT, @@ -148,7 +155,9 @@ export class PgInsertBase< // eslint-disable-next-line @typescript-eslint/no-unused-vars TExcludedMethods extends string = never, > extends QueryPromise : TReturning[]> - implements SQLWrapper + implements + RunnableQuery : TReturning[], 'pg'>, + SQLWrapper { static readonly [entityKind]: string = 'PgInsert'; @@ -166,18 +175,18 @@ export class PgInsertBase< /** * Adds a `returning` clause to the query. - * + * * Calling this method will return the specified fields of the inserted rows. If no fields are specified, all fields will be returned. - * + * * See docs: {@link https://orm.drizzle.team/docs/insert#insert-returning} - * + * * @example * ```ts * // Insert one row and return all fields * const insertedCar: Car[] = await db.insert(cars) * .values({ brand: 'BMW' }) * .returning(); - * + * * // Insert one row and return only the id * const insertedCarId: { id: number }[] = await db.insert(cars) * .values({ brand: 'BMW' }) @@ -197,20 +206,20 @@ export class PgInsertBase< /** * Adds an `on conflict do nothing` clause to the query. - * + * * Calling this method simply avoids inserting a row as its alternative action. - * + * * See docs: {@link https://orm.drizzle.team/docs/insert#on-conflict-do-nothing} - * + * * @param config The `target` and `where` clauses. - * + * * @example * ```ts * // Insert one row and cancel the insert if there's a conflict * await db.insert(cars) * .values({ id: 1, brand: 'BMW' }) * .onConflictDoNothing(); - * + * * // Explicitly specify conflict target * await db.insert(cars) * .values({ id: 1, brand: 'BMW' }) @@ -234,26 +243,25 @@ export class PgInsertBase< return this as any; } - /** * Adds an `on conflict do update` clause to the query. - * + * * Calling this method will update the existing row that conflicts with the row proposed for insertion as its alternative action. - * - * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts} - * + * + * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts} + * * @param config The `target`, `set` and `where` clauses. - * + * * @example * ```ts * // Update the row if there's a conflict * await db.insert(cars) * .values({ id: 1, brand: 'BMW' }) - * .onConflictDoUpdate({ - * target: cars.id, - * set: { brand: 'Porsche' } + * .onConflictDoUpdate({ + * target: cars.id, + * set: { brand: 'Porsche' } * }); - * + * * // Upsert with 'where' clause * await db.insert(cars) * .values({ id: 1, brand: 'BMW' }) @@ -287,7 +295,8 @@ export class PgInsertBase< return rest; } - private _prepare(name?: string): PgInsertPrepare { + /** @internal */ + _prepare(name?: string): PgInsertPrepare { return tracer.startActiveSpan('drizzle.prepareQuery', () => { return this.session.prepareQuery< PreparedQueryConfig & { diff --git a/drizzle-orm/src/pg-core/query-builders/query.ts b/drizzle-orm/src/pg-core/query-builders/query.ts index ef352e734..a0add7acb 100644 --- a/drizzle-orm/src/pg-core/query-builders/query.ts +++ b/drizzle-orm/src/pg-core/query-builders/query.ts @@ -8,11 +8,12 @@ import { type TableRelationalConfig, type TablesRelationalConfig, } from '~/relations.ts'; -import type { Query, QueryWithTypings, SQL } from '~/sql/sql.ts'; +import type { RunnableQuery } from '~/runnable-query.ts'; +import type { Query, QueryWithTypings, SQL, SQLWrapper } from '~/sql/sql.ts'; import { tracer } from '~/tracing.ts'; import type { KnownKeysOnly } from '~/utils.ts'; import type { PgDialect } from '../dialect.ts'; -import type { PgSession, PreparedQuery, PreparedQueryConfig } from '../session.ts'; +import type { PgPreparedQuery, PgSession, PreparedQueryConfig } from '../session.ts'; import type { PgTable } from '../table.ts'; export class RelationalQueryBuilder { @@ -61,10 +62,15 @@ export class RelationalQueryBuilder extends QueryPromise { +export class PgRelationalQuery extends QueryPromise + implements RunnableQuery, SQLWrapper +{ static readonly [entityKind]: string = 'PgRelationalQuery'; - declare protected $brand: 'PgRelationalQuery'; + declare readonly _: { + readonly dialect: 'pg'; + readonly result: TResult; + }; constructor( private fullSchema: Record, @@ -80,7 +86,8 @@ export class PgRelationalQuery extends QueryPromise { super(); } - private _prepare(name?: string): PreparedQuery { + /** @internal */ + _prepare(name?: string): PgPreparedQuery { return tracer.startActiveSpan('drizzle.prepareQuery', () => { const { query, builtQuery } = this._toSQL(); @@ -101,7 +108,7 @@ export class PgRelationalQuery extends QueryPromise { }); } - prepare(name: string): PreparedQuery { + prepare(name: string): PgPreparedQuery { return this._prepare(name); } diff --git a/drizzle-orm/src/pg-core/query-builders/raw.ts b/drizzle-orm/src/pg-core/query-builders/raw.ts new file mode 100644 index 000000000..7afca3056 --- /dev/null +++ b/drizzle-orm/src/pg-core/query-builders/raw.ts @@ -0,0 +1,46 @@ +import { entityKind } from '~/entity.ts'; +import { QueryPromise } from '~/query-promise.ts'; +import type { RunnableQuery } from '~/runnable-query.ts'; +import type { PreparedQuery } from '~/session.ts'; +import type { Query, SQL, SQLWrapper } from '~/sql/sql.ts'; + +export interface PgRaw + extends QueryPromise, RunnableQuery, SQLWrapper, PreparedQuery +{} + +export class PgRaw extends QueryPromise + implements RunnableQuery, SQLWrapper, PreparedQuery +{ + static readonly [entityKind]: string = 'PgRaw'; + + declare readonly _: { + readonly dialect: 'pg'; + readonly result: TResult; + }; + + constructor( + public execute: () => Promise, + private sql: SQL, + private query: Query, + private mapBatchResult: (result: unknown) => unknown, + ) { + super(); + } + + /** @internal */ + getSQL() { + return this.sql; + } + + getQuery() { + return this.query; + } + + mapResult(result: unknown, isFromBatch?: boolean) { + return isFromBatch ? this.mapBatchResult(result) : result; + } + + _prepare(): PreparedQuery { + return this; + } +} diff --git a/drizzle-orm/src/pg-core/query-builders/refresh-materialized-view.ts b/drizzle-orm/src/pg-core/query-builders/refresh-materialized-view.ts index 3ce015793..56ae826d8 100644 --- a/drizzle-orm/src/pg-core/query-builders/refresh-materialized-view.ts +++ b/drizzle-orm/src/pg-core/query-builders/refresh-materialized-view.ts @@ -1,24 +1,34 @@ import { entityKind } from '~/entity.ts'; import type { PgDialect } from '~/pg-core/dialect.ts'; import type { + PgPreparedQuery, PgSession, - PreparedQuery, PreparedQueryConfig, QueryResultHKT, QueryResultKind, } from '~/pg-core/session.ts'; import type { PgMaterializedView } from '~/pg-core/view.ts'; import { QueryPromise } from '~/query-promise.ts'; -import type { Query, SQL } from '~/sql/sql.ts'; +import type { RunnableQuery } from '~/runnable-query.ts'; +import type { Query, SQL, SQLWrapper } from '~/sql/sql.ts'; import { tracer } from '~/tracing.ts'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface PgRefreshMaterializedView - extends QueryPromise> -{} + extends + QueryPromise>, + RunnableQuery, 'pg'>, + SQLWrapper +{ + readonly _: { + readonly dialect: 'pg'; + readonly result: QueryResultKind; + }; +} export class PgRefreshMaterializedView extends QueryPromise> + implements RunnableQuery, 'pg'>, SQLWrapper { static readonly [entityKind]: string = 'PgRefreshMaterializedView'; @@ -63,7 +73,8 @@ export class PgRefreshMaterializedView return rest; } - private _prepare(name?: string): PreparedQuery< + /** @internal */ + _prepare(name?: string): PgPreparedQuery< PreparedQueryConfig & { execute: QueryResultKind; } @@ -73,7 +84,7 @@ export class PgRefreshMaterializedView }); } - prepare(name: string): PreparedQuery< + prepare(name: string): PgPreparedQuery< PreparedQueryConfig & { execute: QueryResultKind; } diff --git a/drizzle-orm/src/pg-core/query-builders/select.ts b/drizzle-orm/src/pg-core/query-builders/select.ts index a71bd53ab..29c31a542 100644 --- a/drizzle-orm/src/pg-core/query-builders/select.ts +++ b/drizzle-orm/src/pg-core/query-builders/select.ts @@ -17,6 +17,7 @@ import type { SetOperator, } from '~/query-builders/select.types.ts'; import { QueryPromise } from '~/query-promise.ts'; +import type { RunnableQuery } from '~/runnable-query.ts'; import { SelectionProxyHandler } from '~/selection-proxy.ts'; import { SQL, View } from '~/sql/sql.ts'; import type { ColumnsSelection, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts'; @@ -141,6 +142,7 @@ export abstract class PgSelectQueryBuilderBase< static readonly [entityKind]: string = 'PgSelectQueryBuilder'; override readonly _: { + readonly dialect: 'pg'; readonly hkt: THKT; readonly tableName: TTableName; readonly selection: TSelection; @@ -269,22 +271,22 @@ export abstract class PgSelectQueryBuilderBase< /** * Executes a `left join` operation by adding another table to the current query. - * + * * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null. - * + * * See docs: {@link https://orm.drizzle.team/docs/joins#left-join} - * + * * @param table the table to join. * @param on the `on` clause. - * + * * @example - * + * * ```ts * // Select all users and their pets * const usersWithPets: { user: User; pets: Pet | null }[] = await db.select() * .from(users) * .leftJoin(pets, eq(users.id, pets.ownerId)) - * + * * // Select userId and petId * const usersIdsAndPetIds: { userId: number; petId: number | null }[] = await db.select({ * userId: users.id, @@ -298,22 +300,22 @@ export abstract class PgSelectQueryBuilderBase< /** * Executes a `right join` operation by adding another table to the current query. - * + * * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null. - * + * * See docs: {@link https://orm.drizzle.team/docs/joins#right-join} - * + * * @param table the table to join. * @param on the `on` clause. - * + * * @example - * + * * ```ts * // Select all users and their pets * const usersWithPets: { user: User | null; pets: Pet }[] = await db.select() * .from(users) * .rightJoin(pets, eq(users.id, pets.ownerId)) - * + * * // Select userId and petId * const usersIdsAndPetIds: { userId: number | null; petId: number }[] = await db.select({ * userId: users.id, @@ -327,22 +329,22 @@ export abstract class PgSelectQueryBuilderBase< /** * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values. - * + * * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs. - * + * * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join} - * + * * @param table the table to join. * @param on the `on` clause. - * + * * @example - * + * * ```ts * // Select all users and their pets * const usersWithPets: { user: User; pets: Pet }[] = await db.select() * .from(users) * .innerJoin(pets, eq(users.id, pets.ownerId)) - * + * * // Select userId and petId * const usersIdsAndPetIds: { userId: number; petId: number }[] = await db.select({ * userId: users.id, @@ -356,22 +358,22 @@ export abstract class PgSelectQueryBuilderBase< /** * Executes a `full join` operation by combining rows from two tables into a new table. - * + * * Calling this method retrieves all rows from both main and joined tables, merging rows with matching values and filling in `null` for non-matching columns. - * + * * See docs: {@link https://orm.drizzle.team/docs/joins#full-join} - * + * * @param table the table to join. * @param on the `on` clause. - * + * * @example - * + * * ```ts * // Select all users and their pets * const usersWithPets: { user: User | null; pets: Pet | null }[] = await db.select() * .from(users) * .fullJoin(pets, eq(users.id, pets.ownerId)) - * + * * // Select userId and petId * const usersIdsAndPetIds: { userId: number | null; petId: number | null }[] = await db.select({ * userId: users.id, @@ -417,13 +419,13 @@ export abstract class PgSelectQueryBuilderBase< /** * Adds `union` set operator to the query. - * + * * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#union} - * + * * @example - * + * * ```ts * // Select all unique names from customers and users tables * await db.select({ name: users.name }) @@ -433,9 +435,9 @@ export abstract class PgSelectQueryBuilderBase< * ); * // or * import { union } from 'drizzle-orm/pg-core' - * + * * await union( - * db.select({ name: users.name }).from(users), + * db.select({ name: users.name }).from(users), * db.select({ name: customers.name }).from(customers) * ); * ``` @@ -444,13 +446,13 @@ export abstract class PgSelectQueryBuilderBase< /** * Adds `union all` set operator to the query. - * + * * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all} - * + * * @example - * + * * ```ts * // Select all transaction ids from both online and in-store sales * await db.select({ transaction: onlineSales.transactionId }) @@ -460,7 +462,7 @@ export abstract class PgSelectQueryBuilderBase< * ); * // or * import { unionAll } from 'drizzle-orm/pg-core' - * + * * await unionAll( * db.select({ transaction: onlineSales.transactionId }).from(onlineSales), * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales) @@ -471,13 +473,13 @@ export abstract class PgSelectQueryBuilderBase< /** * Adds `intersect` set operator to the query. - * + * * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect} - * + * * @example - * + * * ```ts * // Select course names that are offered in both departments A and B * await db.select({ courseName: depA.courseName }) @@ -487,7 +489,7 @@ export abstract class PgSelectQueryBuilderBase< * ); * // or * import { intersect } from 'drizzle-orm/pg-core' - * + * * await intersect( * db.select({ courseName: depA.courseName }).from(depA), * db.select({ courseName: depB.courseName }).from(depB) @@ -495,33 +497,33 @@ export abstract class PgSelectQueryBuilderBase< * ``` */ intersect = this.createSetOperator('intersect', false); - + /** * Adds `intersect all` set operator to the query. - * + * * Calling this method will retain only the rows that are present in both result sets including all duplicates. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect-all} - * + * * @example - * + * * ```ts * // Select all products and quantities that are ordered by both regular and VIP customers - * await db.select({ - * productId: regularCustomerOrders.productId, + * await db.select({ + * productId: regularCustomerOrders.productId, * quantityOrdered: regularCustomerOrders.quantityOrdered * }) * .from(regularCustomerOrders) * .intersectAll( - * db.select({ - * productId: vipCustomerOrders.productId, - * quantityOrdered: vipCustomerOrders.quantityOrdered + * db.select({ + * productId: vipCustomerOrders.productId, + * quantityOrdered: vipCustomerOrders.quantityOrdered * }) * .from(vipCustomerOrders) * ); * // or * import { intersectAll } from 'drizzle-orm/pg-core' - * + * * await intersectAll( * db.select({ * productId: regularCustomerOrders.productId, @@ -540,13 +542,13 @@ export abstract class PgSelectQueryBuilderBase< /** * Adds `except` set operator to the query. - * + * * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#except} - * + * * @example - * + * * ```ts * // Select all courses offered in department A but not in department B * await db.select({ courseName: depA.courseName }) @@ -556,7 +558,7 @@ export abstract class PgSelectQueryBuilderBase< * ); * // or * import { except } from 'drizzle-orm/pg-core' - * + * * await except( * db.select({ courseName: depA.courseName }).from(depA), * db.select({ courseName: depB.courseName }).from(depB) @@ -567,13 +569,13 @@ export abstract class PgSelectQueryBuilderBase< /** * Adds `except all` set operator to the query. - * + * * Calling this method will retrieve all rows from the left query, except for the rows that are present in the result set of the right query. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#except-all} - * + * * @example - * + * * ```ts * // Select all products that are ordered by regular customers but not by VIP customers * await db.select({ @@ -590,7 +592,7 @@ export abstract class PgSelectQueryBuilderBase< * ); * // or * import { exceptAll } from 'drizzle-orm/pg-core' - * + * * await exceptAll( * db.select({ * productId: regularCustomerOrders.productId, @@ -618,35 +620,35 @@ export abstract class PgSelectQueryBuilderBase< return this as any; } - /** + /** * Adds a `where` clause to the query. - * + * * Calling this method will select only those rows that fulfill a specified condition. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#filtering} - * + * * @param where the `where` clause. - * + * * @example * You can use conditional operators and `sql function` to filter the rows to be selected. - * + * * ```ts * // Select all cars with green color * await db.select().from(cars).where(eq(cars.color, 'green')); * // or * await db.select().from(cars).where(sql`${cars.color} = 'green'`) * ``` - * + * * You can logically combine conditional operators with `and()` and `or()` operators: - * + * * ```ts * // Select all BMW cars with a green color * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW'))); - * + * * // Select all cars with the green or blue color * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue'))); * ``` - */ + */ where( where: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined, ): PgSelectWithout { @@ -664,15 +666,15 @@ export abstract class PgSelectQueryBuilderBase< /** * Adds a `having` clause to the query. - * + * * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#aggregations} - * + * * @param having the `having` clause. - * + * * @example - * + * * ```ts * // Select all brands with more than one car * await db.select({ @@ -701,13 +703,13 @@ export abstract class PgSelectQueryBuilderBase< /** * Adds a `group by` clause to the query. - * + * * Calling this method will group rows that have the same values into summary rows, often used for aggregation purposes. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#aggregations} * * @example - * + * * ```ts * // Group and count people by their last names * await db.select({ @@ -743,9 +745,9 @@ export abstract class PgSelectQueryBuilderBase< /** * Adds an `order by` clause to the query. - * + * * Calling this method will sort the result-set in ascending or descending order. By default, the sort order is ascending. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#order-by} * * @example @@ -754,13 +756,13 @@ export abstract class PgSelectQueryBuilderBase< * // Select cars ordered by year * await db.select().from(cars).orderBy(cars.year); * ``` - * + * * You can specify whether results are in ascending or descending order with the `asc()` and `desc()` operators. - * + * * ```ts * // Select cars ordered by year in descending order * await db.select().from(cars).orderBy(desc(cars.year)); - * + * * // Select cars ordered by year and price * await db.select().from(cars).orderBy(asc(cars.year), desc(cars.price)); * ``` @@ -803,13 +805,13 @@ export abstract class PgSelectQueryBuilderBase< /** * Adds a `limit` clause to the query. - * + * * Calling this method will set the maximum number of rows that will be returned by this query. * * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset} - * + * * @param limit the `limit` clause. - * + * * @example * * ```ts @@ -828,13 +830,13 @@ export abstract class PgSelectQueryBuilderBase< /** * Adds an `offset` clause to the query. - * + * * Calling this method will skip a number of rows when returning results from this query. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset} - * + * * @param offset the `offset` clause. - * + * * @example * * ```ts @@ -853,11 +855,11 @@ export abstract class PgSelectQueryBuilderBase< /** * Adds a `for` clause to the query. - * + * * Calling this method will specify a lock strength for this query that controls how strictly it acquires exclusive access to the rows being queried. - * + * * See docs: {@link https://www.postgresql.org/docs/current/sql-select.html#SQL-FOR-UPDATE-SHARE} - * + * * @param strength the lock strength. * @param config the lock configuration. */ @@ -920,7 +922,8 @@ export interface PgSelectBase< TResult, TSelectedFields >, - QueryPromise + QueryPromise, + SQLWrapper {} export class PgSelectBase< @@ -943,10 +946,11 @@ export class PgSelectBase< TExcludedMethods, TResult, TSelectedFields -> { +> implements RunnableQuery, SQLWrapper { static readonly [entityKind]: string = 'PgSelect'; - private _prepare(name?: string): PgSelectPrepare { + /** @internal */ + _prepare(name?: string): PgSelectPrepare { const { session, config, dialect, joinsNotNullableMap } = this; if (!session) { throw new Error('Cannot execute a query on a query builder. Please use a database instance instead.'); @@ -1012,19 +1016,19 @@ const getPgSetOperators = () => ({ /** * Adds `union` set operator to the query. - * + * * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#union} - * + * * @example - * + * * ```ts * // Select all unique names from customers and users tables * import { union } from 'drizzle-orm/pg-core' - * + * * await union( - * db.select({ name: users.name }).from(users), + * db.select({ name: users.name }).from(users), * db.select({ name: customers.name }).from(customers) * ); * // or @@ -1039,17 +1043,17 @@ export const union = createSetOperator('union', false); /** * Adds `union all` set operator to the query. - * + * * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all} - * + * * @example - * + * * ```ts * // Select all transaction ids from both online and in-store sales * import { unionAll } from 'drizzle-orm/pg-core' - * + * * await unionAll( * db.select({ transaction: onlineSales.transactionId }).from(onlineSales), * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales) @@ -1066,17 +1070,17 @@ export const unionAll = createSetOperator('union', true); /** * Adds `intersect` set operator to the query. - * + * * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect} - * + * * @example - * + * * ```ts * // Select course names that are offered in both departments A and B * import { intersect } from 'drizzle-orm/pg-core' - * + * * await intersect( * db.select({ courseName: depA.courseName }).from(depA), * db.select({ courseName: depB.courseName }).from(depB) @@ -1093,17 +1097,17 @@ export const intersect = createSetOperator('intersect', false); /** * Adds `intersect all` set operator to the query. - * + * * Calling this method will retain only the rows that are present in both result sets including all duplicates. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect-all} - * + * * @example - * + * * ```ts * // Select all products and quantities that are ordered by both regular and VIP customers * import { intersectAll } from 'drizzle-orm/pg-core' - * + * * await intersectAll( * db.select({ * productId: regularCustomerOrders.productId, @@ -1117,15 +1121,15 @@ export const intersect = createSetOperator('intersect', false); * .from(vipCustomerOrders) * ); * // or - * await db.select({ - * productId: regularCustomerOrders.productId, + * await db.select({ + * productId: regularCustomerOrders.productId, * quantityOrdered: regularCustomerOrders.quantityOrdered * }) * .from(regularCustomerOrders) * .intersectAll( - * db.select({ - * productId: vipCustomerOrders.productId, - * quantityOrdered: vipCustomerOrders.quantityOrdered + * db.select({ + * productId: vipCustomerOrders.productId, + * quantityOrdered: vipCustomerOrders.quantityOrdered * }) * .from(vipCustomerOrders) * ); @@ -1135,17 +1139,17 @@ export const intersectAll = createSetOperator('intersect', true); /** * Adds `except` set operator to the query. - * + * * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#except} - * + * * @example - * + * * ```ts * // Select all courses offered in department A but not in department B * import { except } from 'drizzle-orm/pg-core' - * + * * await except( * db.select({ courseName: depA.courseName }).from(depA), * db.select({ courseName: depB.courseName }).from(depB) @@ -1162,17 +1166,17 @@ export const except = createSetOperator('except', false); /** * Adds `except all` set operator to the query. - * + * * Calling this method will retrieve all rows from the left query, except for the rows that are present in the result set of the right query. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#except-all} - * + * * @example - * + * * ```ts * // Select all products that are ordered by regular customers but not by VIP customers * import { exceptAll } from 'drizzle-orm/pg-core' - * + * * await exceptAll( * db.select({ * productId: regularCustomerOrders.productId, diff --git a/drizzle-orm/src/pg-core/query-builders/select.types.ts b/drizzle-orm/src/pg-core/query-builders/select.types.ts index 226a68ac2..005a2d924 100644 --- a/drizzle-orm/src/pg-core/query-builders/select.types.ts +++ b/drizzle-orm/src/pg-core/query-builders/select.types.ts @@ -24,7 +24,7 @@ import type { ColumnsSelection, Placeholder, SQL, SQLWrapper, View } from '~/sql import type { Subquery } from '~/subquery.ts'; import type { Table, UpdateTableConfig } from '~/table.ts'; import type { Assume, ValidateShape, ValueOrArray } from '~/utils.ts'; -import type { PreparedQuery, PreparedQueryConfig } from '../session.ts'; +import type { PgPreparedQuery, PreparedQueryConfig } from '../session.ts'; import type { PgSelectBase, PgSelectQueryBuilderBase } from './select.ts'; export interface PgSelectJoinConfig { @@ -241,7 +241,7 @@ export type PgSelectWithout< TResetExcluded extends true ? K : T['_']['excludedMethods'] | K >; -export type PgSelectPrepare = PreparedQuery< +export type PgSelectPrepare = PgPreparedQuery< PreparedQueryConfig & { execute: T['_']['result']; } diff --git a/drizzle-orm/src/pg-core/query-builders/update.ts b/drizzle-orm/src/pg-core/query-builders/update.ts index 87238b6d1..045e6e513 100644 --- a/drizzle-orm/src/pg-core/query-builders/update.ts +++ b/drizzle-orm/src/pg-core/query-builders/update.ts @@ -2,8 +2,8 @@ import type { GetColumnData } from '~/column.ts'; import { entityKind } from '~/entity.ts'; import type { PgDialect } from '~/pg-core/dialect.ts'; import type { + PgPreparedQuery, PgSession, - PreparedQuery, PreparedQueryConfig, QueryResultHKT, QueryResultKind, @@ -11,11 +11,12 @@ import type { import type { PgTable } from '~/pg-core/table.ts'; import type { SelectResultFields } from '~/query-builders/select.types.ts'; import { QueryPromise } from '~/query-promise.ts'; +import type { RunnableQuery } from '~/runnable-query.ts'; import type { Query, SQL, SQLWrapper } from '~/sql/sql.ts'; import { Table } from '~/table.ts'; import { mapUpdateSet, orderSelectedFields, type UpdateSet } from '~/utils.ts'; -import type { SelectedFields, SelectedFieldsOrdered } from './select.types.ts'; import type { PgColumn } from '../columns/common.ts'; +import type { SelectedFields, SelectedFieldsOrdered } from './select.types.ts'; export interface PgUpdateConfig { where?: SQL | undefined; @@ -98,7 +99,7 @@ export type PgUpdateReturning< 'returning' >; -export type PgUpdatePrepare = PreparedQuery< +export type PgUpdatePrepare = PgPreparedQuery< PreparedQueryConfig & { execute: T['_']['returning'] extends undefined ? QueryResultKind : T['_']['returning'][]; @@ -125,13 +126,19 @@ export interface PgUpdateBase< TReturning extends Record | undefined = undefined, TDynamic extends boolean = false, TExcludedMethods extends string = never, -> extends QueryPromise : TReturning[]>, SQLWrapper { +> extends + QueryPromise : TReturning[]>, + RunnableQuery : TReturning[], 'pg'>, + SQLWrapper +{ readonly _: { + readonly dialect: 'pg'; readonly table: TTable; readonly queryResult: TQueryResult; readonly returning: TReturning; readonly dynamic: TDynamic; readonly excludedMethods: TExcludedMethods; + readonly result: TReturning extends undefined ? QueryResultKind : TReturning[]; }; } @@ -144,7 +151,9 @@ export class PgUpdateBase< // eslint-disable-next-line @typescript-eslint/no-unused-vars TExcludedMethods extends string = never, > extends QueryPromise : TReturning[]> - implements SQLWrapper + implements + RunnableQuery : TReturning[], 'pg'>, + SQLWrapper { static readonly [entityKind]: string = 'PgUpdate'; @@ -162,16 +171,16 @@ export class PgUpdateBase< /** * Adds a 'where' clause to the query. - * + * * Calling this method will update only those rows that fulfill a specified condition. - * + * * See docs: {@link https://orm.drizzle.team/docs/update} - * + * * @param where the 'where' clause. - * + * * @example * You can use conditional operators and `sql function` to filter the rows to be updated. - * + * * ```ts * // Update all cars with green color * await db.update(cars).set({ color: 'red' }) @@ -180,14 +189,14 @@ export class PgUpdateBase< * await db.update(cars).set({ color: 'red' }) * .where(sql`${cars.color} = 'green'`) * ``` - * + * * You can logically combine conditional operators with `and()` and `or()` operators: - * + * * ```ts * // Update all BMW cars with a green color * await db.update(cars).set({ color: 'red' }) * .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW'))); - * + * * // Update all cars with the green or blue color * await db.update(cars).set({ color: 'red' }) * .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue'))); @@ -200,11 +209,11 @@ export class PgUpdateBase< /** * Adds a `returning` clause to the query. - * + * * Calling this method will return the specified fields of the updated rows. If no fields are specified, all fields will be returned. - * + * * See docs: {@link https://orm.drizzle.team/docs/update#update-with-returning} - * + * * @example * ```ts * // Update all cars with the green color and return all fields @@ -212,7 +221,7 @@ export class PgUpdateBase< * .set({ color: 'red' }) * .where(eq(cars.color, 'green')) * .returning(); - * + * * // Update all cars with the green color and return only their id and brand fields * const updatedCarsIdsAndBrands: { id: number, brand: string }[] = await db.update(cars) * .set({ color: 'red' }) @@ -241,7 +250,8 @@ export class PgUpdateBase< return rest; } - private _prepare(name?: string): PgUpdatePrepare { + /** @internal */ + _prepare(name?: string): PgUpdatePrepare { return this.session.prepareQuery(this.dialect.sqlToQuery(this.getSQL()), this.config.returning, name); } diff --git a/drizzle-orm/src/pg-core/session.ts b/drizzle-orm/src/pg-core/session.ts index 2b65567c6..6deeadfc0 100644 --- a/drizzle-orm/src/pg-core/session.ts +++ b/drizzle-orm/src/pg-core/session.ts @@ -1,6 +1,7 @@ import { entityKind } from '~/entity.ts'; import { TransactionRollbackError } from '~/errors.ts'; import type { TablesRelationalConfig } from '~/relations.ts'; +import type { PreparedQuery } from '~/session.ts'; import { type Query, type SQL, sql } from '~/sql/index.ts'; import { tracer } from '~/tracing.ts'; import { PgDatabase } from './db.ts'; @@ -13,7 +14,17 @@ export interface PreparedQueryConfig { values: unknown; } -export abstract class PreparedQuery { +export abstract class PgPreparedQuery implements PreparedQuery { + constructor(protected query: Query) {} + + getQuery(): Query { + return this.query; + } + + mapResult(response: unknown, _isFromBatch?: boolean): unknown { + return response; + } + static readonly [entityKind]: string = 'PgPreparedQuery'; /** @internal */ @@ -45,7 +56,7 @@ export abstract class PgSession< fields: SelectedFieldsOrdered | undefined, name: string | undefined, customResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => T['execute'], - ): PreparedQuery; + ): PgPreparedQuery; execute(query: SQL): Promise { return tracer.startActiveSpan('drizzle.operation', () => { diff --git a/drizzle-orm/src/pg-proxy/session.ts b/drizzle-orm/src/pg-proxy/session.ts index cdff2beca..289e156dd 100644 --- a/drizzle-orm/src/pg-proxy/session.ts +++ b/drizzle-orm/src/pg-proxy/session.ts @@ -5,7 +5,7 @@ import type { PgDialect } from '~/pg-core/dialect.ts'; import { PgTransaction } from '~/pg-core/index.ts'; import type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts'; import type { PgTransactionConfig, PreparedQueryConfig, QueryResultHKT } from '~/pg-core/session.ts'; -import { PgSession, PreparedQuery as PreparedQueryBase } from '~/pg-core/session.ts'; +import { PgPreparedQuery as PreparedQueryBase, PgSession } from '~/pg-core/session.ts'; import type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts'; import { fillPlaceholders, type Query } from '~/sql/sql.ts'; import { tracer } from '~/tracing.ts'; @@ -75,7 +75,7 @@ export class PreparedQuery extends PreparedQueryB private fields: SelectedFieldsOrdered | undefined, private customResultMapper?: (rows: unknown[][]) => T['execute'], ) { - super(); + super({ sql: queryString, params }); } async execute(placeholderValues: Record | undefined = {}): Promise { diff --git a/drizzle-orm/src/postgres-js/session.ts b/drizzle-orm/src/postgres-js/session.ts index f861b260f..4b4689e5c 100644 --- a/drizzle-orm/src/postgres-js/session.ts +++ b/drizzle-orm/src/postgres-js/session.ts @@ -6,24 +6,24 @@ import type { PgDialect } from '~/pg-core/dialect.ts'; import { PgTransaction } from '~/pg-core/index.ts'; import type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts'; import type { PgTransactionConfig, PreparedQueryConfig, QueryResultHKT } from '~/pg-core/session.ts'; -import { PgSession, PreparedQuery } from '~/pg-core/session.ts'; +import { PgPreparedQuery, PgSession } from '~/pg-core/session.ts'; import type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts'; import { fillPlaceholders, type Query } from '~/sql/sql.ts'; import { tracer } from '~/tracing.ts'; import { type Assume, mapResultRow } from '~/utils.ts'; -export class PostgresJsPreparedQuery extends PreparedQuery { +export class PostgresJsPreparedQuery extends PgPreparedQuery { static readonly [entityKind]: string = 'PostgresJsPreparedQuery'; constructor( private client: Sql, - private query: string, + private queryString: string, private params: unknown[], private logger: Logger, private fields: SelectedFieldsOrdered | undefined, private customResultMapper?: (rows: unknown[][]) => T['execute'], ) { - super(); + super({ sql: queryString, params }); } async execute(placeholderValues: Record | undefined = {}): Promise { @@ -31,13 +31,13 @@ export class PostgresJsPreparedQuery extends Prep const params = fillPlaceholders(this.params, placeholderValues); span?.setAttributes({ - 'drizzle.query.text': this.query, + 'drizzle.query.text': this.queryString, 'drizzle.query.params': JSON.stringify(params), }); - this.logger.logQuery(this.query, params); + this.logger.logQuery(this.queryString, params); - const { fields, query, client, joinsNotNullableMap, customResultMapper } = this; + const { fields, queryString: query, client, joinsNotNullableMap, customResultMapper } = this; if (!fields && !customResultMapper) { return tracer.startActiveSpan('drizzle.driver.execute', () => { return client.unsafe(query, params as any[]); @@ -65,16 +65,16 @@ export class PostgresJsPreparedQuery extends Prep return tracer.startActiveSpan('drizzle.execute', async (span) => { const params = fillPlaceholders(this.params, placeholderValues); span?.setAttributes({ - 'drizzle.query.text': this.query, + 'drizzle.query.text': this.queryString, 'drizzle.query.params': JSON.stringify(params), }); - this.logger.logQuery(this.query, params); + this.logger.logQuery(this.queryString, params); return tracer.startActiveSpan('drizzle.driver.execute', () => { span?.setAttributes({ - 'drizzle.query.text': this.query, + 'drizzle.query.text': this.queryString, 'drizzle.query.params': JSON.stringify(params), }); - return this.client.unsafe(this.query, params as any[]); + return this.client.unsafe(this.queryString, params as any[]); }); }); } @@ -109,7 +109,7 @@ export class PostgresJsSession< fields: SelectedFieldsOrdered | undefined, name: string | undefined, customResultMapper?: (rows: unknown[][]) => T['execute'], - ): PreparedQuery { + ): PgPreparedQuery { return new PostgresJsPreparedQuery(this.client, query.sql, query.params, this.logger, fields, customResultMapper); } diff --git a/drizzle-orm/src/runnable-query.ts b/drizzle-orm/src/runnable-query.ts index c554daae6..26b1ef6aa 100644 --- a/drizzle-orm/src/runnable-query.ts +++ b/drizzle-orm/src/runnable-query.ts @@ -7,5 +7,6 @@ export interface RunnableQuery { readonly result: T; }; - prepare(): PreparedQuery; + /** @internal */ + _prepare(): PreparedQuery; } diff --git a/drizzle-orm/src/sql/sql.ts b/drizzle-orm/src/sql/sql.ts index cad140d38..2ed161028 100644 --- a/drizzle-orm/src/sql/sql.ts +++ b/drizzle-orm/src/sql/sql.ts @@ -1,12 +1,11 @@ import { entityKind, is } from '~/entity.ts'; -import { Relation } from '~/relations.ts'; +import type { SelectedFields } from '~/operations.ts'; import { Subquery, SubqueryConfig } from '~/subquery.ts'; import { tracer } from '~/tracing.ts'; import { ViewBaseConfig } from '~/view-common.ts'; import type { AnyColumn } from '../column.ts'; import { Column } from '../column.ts'; import { Table } from '../table.ts'; -import type { SelectedFields } from '~/operations.ts'; /** * This class is used to indicate a primitive param value that is used in `sql` tag. @@ -237,9 +236,6 @@ export class SQL implements SQLWrapper { ], config); } - // if (is(chunk, Placeholder)) { - // return {sql: escapeParam} - if (isSQLWrapper(chunk)) { return this.buildQueryFromSourceParams([ new StringChunk('('), @@ -248,14 +244,6 @@ export class SQL implements SQLWrapper { ], config); } - if (is(chunk, Relation)) { - return this.buildQueryFromSourceParams([ - chunk.sourceTable, - new StringChunk('.'), - sql.identifier(chunk.fieldName), - ], config); - } - if (inlineParams) { return { sql: this.mapInlineParam(chunk, config), params: [] }; } diff --git a/drizzle-orm/src/sqlite-core/db.ts b/drizzle-orm/src/sqlite-core/db.ts index f98fea324..41227e9eb 100644 --- a/drizzle-orm/src/sqlite-core/db.ts +++ b/drizzle-orm/src/sqlite-core/db.ts @@ -57,9 +57,12 @@ export class BaseSQLiteDatabase< ? { schema: schema.schema, tableNamesMap: schema.tableNamesMap } : { schema: undefined, tableNamesMap: {} }; this.query = {} as typeof this['query']; + const query = this.query as { + [K in keyof TSchema]: RelationalQueryBuilder; + }; if (this._.schema) { for (const [tableName, columns] of Object.entries(this._.schema)) { - this.query[tableName as keyof TSchema] = new RelationalQueryBuilder( + query[tableName as keyof TSchema] = new RelationalQueryBuilder( resultKind, schema!.fullSchema, this._.schema, @@ -68,40 +71,40 @@ export class BaseSQLiteDatabase< columns, dialect, session as SQLiteSession as any, - ) as this['query'][keyof TSchema]; + ) as typeof query[keyof TSchema]; } } } /** * Creates a subquery that defines a temporary named result set as a CTE. - * + * * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#with-clause} - * + * * @param alias The alias for the subquery. - * + * * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries. - * + * * @example - * + * * ```ts * // Create a subquery with alias 'sq' and use it in the select query * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42))); - * + * * const result = await db.with(sq).select().from(sq); * ``` - * + * * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them: - * + * * ```ts * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query * const sq = db.$with('sq').as(db.select({ * name: sql`upper(${users.name})`.as('name'), * }) * .from(users)); - * + * * const result = await db.with(sq).select({ name: sq.name }).from(sq); * ``` */ @@ -124,19 +127,19 @@ export class BaseSQLiteDatabase< /** * Incorporates a previously defined CTE (using `$with`) into the main query. - * + * * This method allows the main query to reference a temporary named result set. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#with-clause} - * + * * @param queries The CTEs to incorporate into the main query. - * + * * @example - * + * * ```ts * // Define a subquery 'sq' as a CTE using $with * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42))); - * + * * // Incorporate the CTE 'sq' into the main query and select from it * const result = await db.with(sq).select().from(sq); * ``` @@ -144,6 +147,42 @@ export class BaseSQLiteDatabase< with(...queries: WithSubquery[]) { const self = this; + /** + * Creates a select query. + * + * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select. + * + * Use `.from()` method to specify which table to select from. + * + * See docs: {@link https://orm.drizzle.team/docs/select} + * + * @param fields The selection object. + * + * @example + * + * ```ts + * // Select all columns and all rows from the 'cars' table + * const allCars: Car[] = await db.select().from(cars); + * + * // Select specific columns and all rows from the 'cars' table + * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({ + * id: cars.id, + * brand: cars.brand + * }) + * .from(cars); + * ``` + * + * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns: + * + * ```ts + * // Select specific columns along with expression and all rows from the 'cars' table + * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({ + * id: cars.id, + * lowerBrand: sql`lower(${cars.brand})`, + * }) + * .from(cars); + * ``` + */ function select(): SQLiteSelectBuilder; function select( fields: TSelection, @@ -159,6 +198,31 @@ export class BaseSQLiteDatabase< }); } + /** + * Adds `distinct` expression to the select query. + * + * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns. + * + * Use `.from()` method to specify which table to select from. + * + * See docs: {@link https://orm.drizzle.team/docs/select#distinct} + * + * @param fields The selection object. + * + * @example + * + * ```ts + * // Select all unique rows from the 'cars' table + * await db.selectDistinct() + * .from(cars) + * .orderBy(cars.id, cars.brand, cars.color); + * + * // Select all unique brands from the 'cars' table + * await db.selectDistinct({ brand: cars.brand }) + * .from(cars) + * .orderBy(cars.brand); + * ``` + */ function selectDistinct(): SQLiteSelectBuilder; function selectDistinct( fields: TSelection, @@ -175,36 +239,123 @@ export class BaseSQLiteDatabase< }); } - return { select, selectDistinct }; + /** + * Creates an update query. + * + * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated. + * + * Use `.set()` method to specify which values to update. + * + * See docs: {@link https://orm.drizzle.team/docs/update} + * + * @param table The table to update. + * + * @example + * + * ```ts + * // Update all rows in the 'cars' table + * await db.update(cars).set({ color: 'red' }); + * + * // Update rows with filters and conditions + * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW')); + * + * // Update with returning clause + * const updatedCar: Car[] = await db.update(cars) + * .set({ color: 'red' }) + * .where(eq(cars.id, 1)) + * .returning(); + * ``` + */ + function update(table: TTable): SQLiteUpdateBuilder { + return new SQLiteUpdateBuilder(table, self.session, self.dialect); + } + + /** + * Creates an insert query. + * + * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert. + * + * See docs: {@link https://orm.drizzle.team/docs/insert} + * + * @param table The table to insert into. + * + * @example + * + * ```ts + * // Insert one row + * await db.insert(cars).values({ brand: 'BMW' }); + * + * // Insert multiple rows + * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]); + * + * // Insert with returning clause + * const insertedCar: Car[] = await db.insert(cars) + * .values({ brand: 'BMW' }) + * .returning(); + * ``` + */ + function insert(into: TTable): SQLiteInsertBuilder { + return new SQLiteInsertBuilder(into, self.session, self.dialect); + } + + /** + * Creates a delete query. + * + * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted. + * + * See docs: {@link https://orm.drizzle.team/docs/delete} + * + * @param table The table to delete from. + * + * @example + * + * ```ts + * // Delete all rows in the 'cars' table + * await db.delete(cars); + * + * // Delete rows with filters and conditions + * await db.delete(cars).where(eq(cars.color, 'green')); + * + * // Delete with returning clause + * const deletedCar: Car[] = await db.delete(cars) + * .where(eq(cars.id, 1)) + * .returning(); + * ``` + */ + function delete_(from: TTable): SQLiteDeleteBase { + return new SQLiteDeleteBase(from, self.session, self.dialect); + } + + return { select, selectDistinct, update, insert, delete: delete_ }; } /** * Creates a select query. - * + * * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select. - * + * * Use `.from()` method to specify which table to select from. - * + * * See docs: {@link https://orm.drizzle.team/docs/select} - * + * * @param fields The selection object. - * + * * @example - * + * * ```ts * // Select all columns and all rows from the 'cars' table * const allCars: Car[] = await db.select().from(cars); - * + * * // Select specific columns and all rows from the 'cars' table - * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({ - * id: cars.id, - * brand: cars.brand + * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({ + * id: cars.id, + * brand: cars.brand * }) * .from(cars); * ``` - * + * * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns: - * + * * ```ts * // Select specific columns along with expression and all rows from the 'cars' table * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({ @@ -224,23 +375,23 @@ export class BaseSQLiteDatabase< /** * Adds `distinct` expression to the select query. - * + * * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns. - * + * * Use `.from()` method to specify which table to select from. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#distinct} - * + * * @param fields The selection object. - * + * * @example - * + * * ```ts * // Select all unique rows from the 'cars' table * await db.selectDistinct() * .from(cars) * .orderBy(cars.id, cars.brand, cars.color); - * + * * // Select all unique brands from the 'cars' table * await db.selectDistinct({ brand: cars.brand }) * .from(cars) @@ -264,24 +415,24 @@ export class BaseSQLiteDatabase< /** * Creates an update query. - * + * * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated. - * + * * Use `.set()` method to specify which values to update. - * - * See docs: {@link https://orm.drizzle.team/docs/update} - * + * + * See docs: {@link https://orm.drizzle.team/docs/update} + * * @param table The table to update. - * + * * @example - * + * * ```ts * // Update all rows in the 'cars' table * await db.update(cars).set({ color: 'red' }); - * + * * // Update rows with filters and conditions * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW')); - * + * * // Update with returning clause * const updatedCar: Car[] = await db.update(cars) * .set({ color: 'red' }) @@ -295,22 +446,22 @@ export class BaseSQLiteDatabase< /** * Creates an insert query. - * + * * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert. - * - * See docs: {@link https://orm.drizzle.team/docs/insert} - * + * + * See docs: {@link https://orm.drizzle.team/docs/insert} + * * @param table The table to insert into. - * + * * @example - * + * * ```ts * // Insert one row * await db.insert(cars).values({ brand: 'BMW' }); - * + * * // Insert multiple rows * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]); - * + * * // Insert with returning clause * const insertedCar: Car[] = await db.insert(cars) * .values({ brand: 'BMW' }) @@ -323,22 +474,22 @@ export class BaseSQLiteDatabase< /** * Creates a delete query. - * - * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted. - * + * + * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted. + * * See docs: {@link https://orm.drizzle.team/docs/delete} - * + * * @param table The table to delete from. - * + * * @example - * + * * ```ts * // Delete all rows in the 'cars' table * await db.delete(cars); - * + * * // Delete rows with filters and conditions * await db.delete(cars).where(eq(cars.color, 'green')); - * + * * // Delete with returning clause * const deletedCar: Car[] = await db.delete(cars) * .where(eq(cars.id, 1)) diff --git a/drizzle-orm/src/sqlite-core/query-builders/delete.ts b/drizzle-orm/src/sqlite-core/query-builders/delete.ts index 2fa983c12..9e92af23f 100644 --- a/drizzle-orm/src/sqlite-core/query-builders/delete.ts +++ b/drizzle-orm/src/sqlite-core/query-builders/delete.ts @@ -7,8 +7,8 @@ import type { SQLiteDialect } from '~/sqlite-core/dialect.ts'; import type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts'; import { SQLiteTable } from '~/sqlite-core/table.ts'; import { type DrizzleTypeError, orderSelectedFields } from '~/utils.ts'; -import type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts'; import type { SQLiteColumn } from '../columns/common.ts'; +import type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts'; export type SQLiteDeleteWithout< T extends AnySQLiteDeleteBase, @@ -105,7 +105,11 @@ export interface SQLiteDeleteBase< TReturning extends Record | undefined = undefined, TDynamic extends boolean = false, TExcludedMethods extends string = never, -> extends SQLWrapper { +> extends + QueryPromise, + RunnableQuery, + SQLWrapper +{ readonly _: { dialect: 'sqlite'; readonly table: TTable; @@ -144,35 +148,35 @@ export class SQLiteDeleteBase< this.config = { table }; } - /** + /** * Adds a `where` clause to the query. - * + * * Calling this method will delete only those rows that fulfill a specified condition. - * + * * See docs: {@link https://orm.drizzle.team/docs/delete} - * + * * @param where the `where` clause. - * + * * @example * You can use conditional operators and `sql function` to filter the rows to be deleted. - * + * * ```ts * // Delete all cars with green color * db.delete(cars).where(eq(cars.color, 'green')); * // or * db.delete(cars).where(sql`${cars.color} = 'green'`) * ``` - * + * * You can logically combine conditional operators with `and()` and `or()` operators: - * + * * ```ts * // Delete all BMW cars with a green color * db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW'))); - * + * * // Delete all cars with the green or blue color * db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue'))); * ``` - */ + */ where(where: SQL | undefined): SQLiteDeleteWithout { this.config.where = where; return this as any; @@ -180,18 +184,18 @@ export class SQLiteDeleteBase< /** * Adds a `returning` clause to the query. - * + * * Calling this method will return the specified fields of the deleted rows. If no fields are specified, all fields will be returned. - * - * See docs: {@link https://orm.drizzle.team/docs/delete#delete-with-return} - * + * + * See docs: {@link https://orm.drizzle.team/docs/delete#delete-with-return} + * * @example * ```ts * // Delete all cars with the green color and return all fields * const deletedCars: Car[] = await db.delete(cars) * .where(eq(cars.color, 'green')) * .returning(); - * + * * // Delete all cars with the green color and return only their id and brand fields * const deletedCarsIdsAndBrands: { id: number, brand: string }[] = await db.delete(cars) * .where(eq(cars.color, 'green')) @@ -219,7 +223,8 @@ export class SQLiteDeleteBase< return rest; } - prepare(isOneTimeQuery?: boolean): SQLiteDeletePrepare { + /** @internal */ + _prepare(isOneTimeQuery = true): SQLiteDeletePrepare { return this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery']( this.dialect.sqlToQuery(this.getSQL()), this.config.returning, @@ -227,24 +232,28 @@ export class SQLiteDeleteBase< ) as SQLiteDeletePrepare; } + prepare(): SQLiteDeletePrepare { + return this._prepare(false); + } + run: ReturnType['run'] = (placeholderValues) => { - return this.prepare(true).run(placeholderValues); + return this._prepare().run(placeholderValues); }; all: ReturnType['all'] = (placeholderValues) => { - return this.prepare(true).all(placeholderValues); + return this._prepare().all(placeholderValues); }; get: ReturnType['get'] = (placeholderValues) => { - return this.prepare(true).get(placeholderValues); + return this._prepare().get(placeholderValues); }; values: ReturnType['values'] = (placeholderValues) => { - return this.prepare(true).values(placeholderValues); + return this._prepare().values(placeholderValues); }; override async execute(placeholderValues?: Record): Promise> { - return this.prepare(true).execute(placeholderValues) as SQLiteDeleteExecute; + return this._prepare().execute(placeholderValues) as SQLiteDeleteExecute; } $dynamic(): SQLiteDeleteDynamic { diff --git a/drizzle-orm/src/sqlite-core/query-builders/insert.ts b/drizzle-orm/src/sqlite-core/query-builders/insert.ts index 4f2e23320..43e1211bf 100644 --- a/drizzle-orm/src/sqlite-core/query-builders/insert.ts +++ b/drizzle-orm/src/sqlite-core/query-builders/insert.ts @@ -10,9 +10,9 @@ import type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.t import { SQLiteTable } from '~/sqlite-core/table.ts'; import { Table } from '~/table.ts'; import { type DrizzleTypeError, mapUpdateSet, orderSelectedFields, type Simplify } from '~/utils.ts'; +import type { SQLiteColumn } from '../columns/common.ts'; import type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts'; import type { SQLiteUpdateSetSource } from './update.ts'; -import type { SQLiteColumn } from '../columns/common.ts'; export interface SQLiteInsertConfig { table: TTable; @@ -209,18 +209,18 @@ export class SQLiteInsertBase< /** * Adds a `returning` clause to the query. - * + * * Calling this method will return the specified fields of the inserted rows. If no fields are specified, all fields will be returned. - * + * * See docs: {@link https://orm.drizzle.team/docs/insert#insert-returning} - * + * * @example * ```ts * // Insert one row and return all fields * const insertedCar: Car[] = await db.insert(cars) * .values({ brand: 'BMW' }) * .returning(); - * + * * // Insert one row and return only the id * const insertedCarId: { id: number }[] = await db.insert(cars) * .values({ brand: 'BMW' }) @@ -240,20 +240,20 @@ export class SQLiteInsertBase< /** * Adds an `on conflict do nothing` clause to the query. - * + * * Calling this method simply avoids inserting a row as its alternative action. - * + * * See docs: {@link https://orm.drizzle.team/docs/insert#on-conflict-do-nothing} - * + * * @param config The `target` and `where` clauses. - * + * * @example * ```ts * // Insert one row and cancel the insert if there's a conflict * await db.insert(cars) * .values({ id: 1, brand: 'BMW' }) * .onConflictDoNothing(); - * + * * // Explicitly specify conflict target * await db.insert(cars) * .values({ id: 1, brand: 'BMW' }) @@ -273,23 +273,23 @@ export class SQLiteInsertBase< /** * Adds an `on conflict do update` clause to the query. - * + * * Calling this method will update the existing row that conflicts with the row proposed for insertion as its alternative action. - * - * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts} - * + * + * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts} + * * @param config The `target`, `set` and `where` clauses. - * + * * @example * ```ts * // Update the row if there's a conflict * await db.insert(cars) * .values({ id: 1, brand: 'BMW' }) - * .onConflictDoUpdate({ - * target: cars.id, - * set: { brand: 'Porsche' } + * .onConflictDoUpdate({ + * target: cars.id, + * set: { brand: 'Porsche' } * }); - * + * * // Upsert with 'where' clause * await db.insert(cars) * .values({ id: 1, brand: 'BMW' }) @@ -318,7 +318,8 @@ export class SQLiteInsertBase< return rest; } - prepare(isOneTimeQuery?: boolean): SQLiteInsertPrepare { + /** @internal */ + _prepare(isOneTimeQuery = true): SQLiteInsertPrepare { return this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery']( this.dialect.sqlToQuery(this.getSQL()), this.config.returning, @@ -326,20 +327,24 @@ export class SQLiteInsertBase< ) as SQLiteInsertPrepare; } + prepare(): SQLiteInsertPrepare { + return this._prepare(false); + } + run: ReturnType['run'] = (placeholderValues) => { - return this.prepare(true).run(placeholderValues); + return this._prepare().run(placeholderValues); }; all: ReturnType['all'] = (placeholderValues) => { - return this.prepare(true).all(placeholderValues); + return this._prepare().all(placeholderValues); }; get: ReturnType['get'] = (placeholderValues) => { - return this.prepare(true).get(placeholderValues); + return this._prepare().get(placeholderValues); }; values: ReturnType['values'] = (placeholderValues) => { - return this.prepare(true).values(placeholderValues); + return this._prepare().values(placeholderValues); }; override async execute(): Promise> { diff --git a/drizzle-orm/src/sqlite-core/query-builders/query.ts b/drizzle-orm/src/sqlite-core/query-builders/query.ts index a8f04b764..1354cc055 100644 --- a/drizzle-orm/src/sqlite-core/query-builders/query.ts +++ b/drizzle-orm/src/sqlite-core/query-builders/query.ts @@ -137,10 +137,13 @@ export class SQLiteRelationalQuery exte }).sql as SQL; } - prepare(): SQLitePreparedQuery { + /** @internal */ + _prepare( + isOneTimeQuery = false, + ): SQLitePreparedQuery { const { query, builtQuery } = this._toSQL(); - return this.session.prepareQuery( + return this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery']( builtQuery, undefined, this.mode === 'first' ? 'get' : 'all', @@ -156,6 +159,10 @@ export class SQLiteRelationalQuery exte ) as SQLitePreparedQuery; } + prepare(): SQLitePreparedQuery { + return this._prepare(false); + } + private _toSQL(): { query: BuildRelationalQueryResult; builtQuery: QueryWithTypings } { const query = this.dialect.buildRelationalQuery({ fullSchema: this.fullSchema, @@ -179,9 +186,9 @@ export class SQLiteRelationalQuery exte /** @internal */ executeRaw(): TResult { if (this.mode === 'first') { - return this.prepare().get() as TResult; + return this._prepare(false).get() as TResult; } - return this.prepare().all() as TResult; + return this._prepare(false).all() as TResult; } override async execute(): Promise { diff --git a/drizzle-orm/src/sqlite-core/query-builders/raw.ts b/drizzle-orm/src/sqlite-core/query-builders/raw.ts index b5a1223e2..12932be89 100644 --- a/drizzle-orm/src/sqlite-core/query-builders/raw.ts +++ b/drizzle-orm/src/sqlite-core/query-builders/raw.ts @@ -10,7 +10,13 @@ export interface SQLiteRawConfig { action: SQLiteRawAction; } -export class SQLiteRaw extends QueryPromise implements RunnableQuery, SQLWrapper { +export interface SQLiteRaw + extends QueryPromise, RunnableQuery, SQLWrapper, PreparedQuery +{} + +export class SQLiteRaw extends QueryPromise + implements RunnableQuery, SQLWrapper, PreparedQuery +{ static readonly [entityKind]: string = 'SQLiteRaw'; declare readonly _: { @@ -22,8 +28,9 @@ export class SQLiteRaw extends QueryPromise implements Runnabl config: SQLiteRawConfig; constructor( - private cb: () => Promise, - private getSQLCb: () => SQL, + public execute: () => Promise, + /** @internal */ + public getSQL: () => SQL, action: SQLiteRawAction, private dialect: SQLiteAsyncDialect, private mapBatchResult: (result: unknown) => unknown, @@ -32,23 +39,15 @@ export class SQLiteRaw extends QueryPromise implements Runnabl this.config = { action }; } - /** @internal */ - getSQL(): SQL { - return this.getSQLCb(); + getQuery() { + return this.dialect.sqlToQuery(this.getSQL()); } - override async execute(): Promise { - return this.cb(); + mapResult(result: unknown, isFromBatch?: boolean) { + return isFromBatch ? this.mapBatchResult(result) : result; } - prepare(): PreparedQuery { - return { - getQuery: () => { - return this.dialect.sqlToQuery(this.getSQL()); - }, - mapResult: (result: unknown, isFromBatch?: boolean) => { - return isFromBatch ? this.mapBatchResult(result) : result; - }, - }; + _prepare(): PreparedQuery { + return this; } } diff --git a/drizzle-orm/src/sqlite-core/query-builders/select.ts b/drizzle-orm/src/sqlite-core/query-builders/select.ts index 47447bf0d..564170dcc 100644 --- a/drizzle-orm/src/sqlite-core/query-builders/select.ts +++ b/drizzle-orm/src/sqlite-core/query-builders/select.ts @@ -12,13 +12,15 @@ import type { } from '~/query-builders/select.types.ts'; import { QueryPromise } from '~/query-promise.ts'; import type { RunnableQuery } from '~/runnable-query.ts'; +import { SelectionProxyHandler } from '~/selection-proxy.ts'; import { SQL, View } from '~/sql/sql.ts'; -import type { ColumnsSelection, Placeholder, Query } from '~/sql/sql.ts'; +import type { ColumnsSelection, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts'; import type { SQLiteColumn } from '~/sqlite-core/columns/index.ts'; import type { SQLiteDialect } from '~/sqlite-core/dialect.ts'; import type { SQLiteSession } from '~/sqlite-core/session.ts'; import type { SubqueryWithSelection } from '~/sqlite-core/subquery.ts'; import type { SQLiteTable } from '~/sqlite-core/table.ts'; +import { Subquery, SubqueryConfig } from '~/subquery.ts'; import { Table } from '~/table.ts'; import { applyMixins, @@ -29,6 +31,7 @@ import { type ValueOrArray, } from '~/utils.ts'; import { ViewBaseConfig } from '~/view-common.ts'; +import { SQLiteViewBase } from '../view-base.ts'; import type { AnySQLiteSelect, CreateSQLiteSelectFromBuilderMode, @@ -47,9 +50,6 @@ import type { SQLiteSetOperatorExcludedMethods, SQLiteSetOperatorWithResult, } from './select.types.ts'; -import { Subquery, SubqueryConfig } from '~/subquery.ts'; -import { SQLiteViewBase } from '../view-base.ts'; -import { SelectionProxyHandler } from '~/selection-proxy.ts'; export class SQLiteSelectBuilder< TSelection extends SelectedFields | undefined, @@ -140,7 +140,7 @@ export abstract class SQLiteSelectQueryBuilderBase< static readonly [entityKind]: string = 'SQLiteSelectQueryBuilder'; override readonly _: { - dialect: 'sqlite'; + readonly dialect: 'sqlite'; readonly hkt: THKT; readonly tableName: TTableName; readonly resultType: TResultType; @@ -269,22 +269,22 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Executes a `left join` operation by adding another table to the current query. - * + * * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null. - * + * * See docs: {@link https://orm.drizzle.team/docs/joins#left-join} - * + * * @param table the table to join. * @param on the `on` clause. - * + * * @example - * + * * ```ts * // Select all users and their pets * const usersWithPets: { user: User; pets: Pet | null }[] = await db.select() * .from(users) * .leftJoin(pets, eq(users.id, pets.ownerId)) - * + * * // Select userId and petId * const usersIdsAndPetIds: { userId: number; petId: number | null }[] = await db.select({ * userId: users.id, @@ -295,25 +295,25 @@ export abstract class SQLiteSelectQueryBuilderBase< * ``` */ leftJoin = this.createJoin('left'); - + /** * Executes a `right join` operation by adding another table to the current query. - * + * * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null. - * + * * See docs: {@link https://orm.drizzle.team/docs/joins#right-join} - * + * * @param table the table to join. * @param on the `on` clause. - * + * * @example - * + * * ```ts * // Select all users and their pets * const usersWithPets: { user: User | null; pets: Pet }[] = await db.select() * .from(users) * .rightJoin(pets, eq(users.id, pets.ownerId)) - * + * * // Select userId and petId * const usersIdsAndPetIds: { userId: number | null; petId: number }[] = await db.select({ * userId: users.id, @@ -327,22 +327,22 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values. - * + * * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs. - * + * * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join} - * + * * @param table the table to join. * @param on the `on` clause. - * + * * @example - * + * * ```ts * // Select all users and their pets * const usersWithPets: { user: User; pets: Pet }[] = await db.select() * .from(users) * .innerJoin(pets, eq(users.id, pets.ownerId)) - * + * * // Select userId and petId * const usersIdsAndPetIds: { userId: number; petId: number }[] = await db.select({ * userId: users.id, @@ -356,22 +356,22 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Executes a `full join` operation by combining rows from two tables into a new table. - * + * * Calling this method retrieves all rows from both main and joined tables, merging rows with matching values and filling in `null` for non-matching columns. - * + * * See docs: {@link https://orm.drizzle.team/docs/joins#full-join} - * + * * @param table the table to join. * @param on the `on` clause. - * + * * @example - * + * * ```ts * // Select all users and their pets * const usersWithPets: { user: User | null; pets: Pet | null }[] = await db.select() * .from(users) * .fullJoin(pets, eq(users.id, pets.ownerId)) - * + * * // Select userId and petId * const usersIdsAndPetIds: { userId: number | null; petId: number | null }[] = await db.select({ * userId: users.id, @@ -417,13 +417,13 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Adds `union` set operator to the query. - * + * * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#union} - * + * * @example - * + * * ```ts * // Select all unique names from customers and users tables * await db.select({ name: users.name }) @@ -433,9 +433,9 @@ export abstract class SQLiteSelectQueryBuilderBase< * ); * // or * import { union } from 'drizzle-orm/sqlite-core' - * + * * await union( - * db.select({ name: users.name }).from(users), + * db.select({ name: users.name }).from(users), * db.select({ name: customers.name }).from(customers) * ); * ``` @@ -444,13 +444,13 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Adds `union all` set operator to the query. - * + * * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all} - * + * * @example - * + * * ```ts * // Select all transaction ids from both online and in-store sales * await db.select({ transaction: onlineSales.transactionId }) @@ -460,7 +460,7 @@ export abstract class SQLiteSelectQueryBuilderBase< * ); * // or * import { unionAll } from 'drizzle-orm/sqlite-core' - * + * * await unionAll( * db.select({ transaction: onlineSales.transactionId }).from(onlineSales), * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales) @@ -471,13 +471,13 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Adds `intersect` set operator to the query. - * + * * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect} - * + * * @example - * + * * ```ts * // Select course names that are offered in both departments A and B * await db.select({ courseName: depA.courseName }) @@ -487,7 +487,7 @@ export abstract class SQLiteSelectQueryBuilderBase< * ); * // or * import { intersect } from 'drizzle-orm/sqlite-core' - * + * * await intersect( * db.select({ courseName: depA.courseName }).from(depA), * db.select({ courseName: depB.courseName }).from(depB) @@ -498,13 +498,13 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Adds `except` set operator to the query. - * + * * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#except} - * + * * @example - * + * * ```ts * // Select all courses offered in department A but not in department B * await db.select({ courseName: depA.courseName }) @@ -514,7 +514,7 @@ export abstract class SQLiteSelectQueryBuilderBase< * ); * // or * import { except } from 'drizzle-orm/sqlite-core' - * + * * await except( * db.select({ courseName: depA.courseName }).from(depA), * db.select({ courseName: depB.courseName }).from(depB) @@ -534,35 +534,35 @@ export abstract class SQLiteSelectQueryBuilderBase< return this as any; } - /** + /** * Adds a `where` clause to the query. - * + * * Calling this method will select only those rows that fulfill a specified condition. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#filtering} - * + * * @param where the `where` clause. - * + * * @example * You can use conditional operators and `sql function` to filter the rows to be selected. - * + * * ```ts * // Select all cars with green color * await db.select().from(cars).where(eq(cars.color, 'green')); * // or * await db.select().from(cars).where(sql`${cars.color} = 'green'`) * ``` - * + * * You can logically combine conditional operators with `and()` and `or()` operators: - * + * * ```ts * // Select all BMW cars with a green color * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW'))); - * + * * // Select all cars with the green or blue color * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue'))); * ``` - */ + */ where( where: ((aliases: TSelection) => SQL | undefined) | SQL | undefined, ): SQLiteSelectWithout { @@ -580,15 +580,15 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Adds a `having` clause to the query. - * + * * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#aggregations} - * + * * @param having the `having` clause. - * + * * @example - * + * * ```ts * // Select all brands with more than one car * await db.select({ @@ -617,13 +617,13 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Adds a `group by` clause to the query. - * + * * Calling this method will group rows that have the same values into summary rows, often used for aggregation purposes. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#aggregations} * * @example - * + * * ```ts * // Group and count people by their last names * await db.select({ @@ -659,9 +659,9 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Adds an `order by` clause to the query. - * + * * Calling this method will sort the result-set in ascending or descending order. By default, the sort order is ascending. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#order-by} * * @example @@ -670,13 +670,13 @@ export abstract class SQLiteSelectQueryBuilderBase< * // Select cars ordered by year * await db.select().from(cars).orderBy(cars.year); * ``` - * + * * You can specify whether results are in ascending or descending order with the `asc()` and `desc()` operators. - * + * * ```ts * // Select cars ordered by year in descending order * await db.select().from(cars).orderBy(desc(cars.year)); - * + * * // Select cars ordered by year and price * await db.select().from(cars).orderBy(asc(cars.year), desc(cars.price)); * ``` @@ -719,13 +719,13 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Adds a `limit` clause to the query. - * + * * Calling this method will set the maximum number of rows that will be returned by this query. * * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset} - * + * * @param limit the `limit` clause. - * + * * @example * * ```ts @@ -744,13 +744,13 @@ export abstract class SQLiteSelectQueryBuilderBase< /** * Adds an `offset` clause to the query. - * + * * Calling this method will skip a number of rows when returning results from this query. - * + * * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset} - * + * * @param offset the `offset` clause. - * + * * @example * * ```ts @@ -853,10 +853,11 @@ export class SQLiteSelectBase< TExcludedMethods, TResult, TSelectedFields -> implements RunnableQuery { +> implements RunnableQuery, SQLWrapper { static readonly [entityKind]: string = 'SQLiteSelect'; - prepare(isOneTimeQuery?: boolean): SQLiteSelectPrepare { + /** @internal */ + _prepare(isOneTimeQuery = true): SQLiteSelectPrepare { if (!this.session) { throw new Error('Cannot execute a query on a query builder. Please use a database instance instead.'); } @@ -870,20 +871,24 @@ export class SQLiteSelectBase< return query as ReturnType; } + prepare(): SQLiteSelectPrepare { + return this._prepare(false); + } + run: ReturnType['run'] = (placeholderValues) => { - return this.prepare(true).run(placeholderValues); + return this._prepare().run(placeholderValues); }; all: ReturnType['all'] = (placeholderValues) => { - return this.prepare(true).all(placeholderValues); + return this._prepare().all(placeholderValues); }; get: ReturnType['get'] = (placeholderValues) => { - return this.prepare(true).get(placeholderValues); + return this._prepare().get(placeholderValues); }; values: ReturnType['values'] = (placeholderValues) => { - return this.prepare(true).values(placeholderValues); + return this._prepare().values(placeholderValues); }; async execute(): Promise> { @@ -922,19 +927,19 @@ const getSQLiteSetOperators = () => ({ /** * Adds `union` set operator to the query. - * + * * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#union} - * + * * @example - * + * * ```ts * // Select all unique names from customers and users tables * import { union } from 'drizzle-orm/sqlite-core' - * + * * await union( - * db.select({ name: users.name }).from(users), + * db.select({ name: users.name }).from(users), * db.select({ name: customers.name }).from(customers) * ); * // or @@ -949,17 +954,17 @@ export const union = createSetOperator('union', false); /** * Adds `union all` set operator to the query. - * + * * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all} - * + * * @example - * + * * ```ts * // Select all transaction ids from both online and in-store sales * import { unionAll } from 'drizzle-orm/sqlite-core' - * + * * await unionAll( * db.select({ transaction: onlineSales.transactionId }).from(onlineSales), * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales) @@ -976,17 +981,17 @@ export const unionAll = createSetOperator('union', true); /** * Adds `intersect` set operator to the query. - * + * * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect} - * + * * @example - * + * * ```ts * // Select course names that are offered in both departments A and B * import { intersect } from 'drizzle-orm/sqlite-core' - * + * * await intersect( * db.select({ courseName: depA.courseName }).from(depA), * db.select({ courseName: depB.courseName }).from(depB) @@ -1003,17 +1008,17 @@ export const intersect = createSetOperator('intersect', false); /** * Adds `except` set operator to the query. - * + * * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query. - * + * * See docs: {@link https://orm.drizzle.team/docs/set-operations#except} - * + * * @example - * + * * ```ts * // Select all courses offered in department A but not in department B * import { except } from 'drizzle-orm/sqlite-core' - * + * * await except( * db.select({ courseName: depA.courseName }).from(depA), * db.select({ courseName: depB.courseName }).from(depB) diff --git a/drizzle-orm/src/sqlite-core/query-builders/update.ts b/drizzle-orm/src/sqlite-core/query-builders/update.ts index f07a1cac6..fc101c04b 100644 --- a/drizzle-orm/src/sqlite-core/query-builders/update.ts +++ b/drizzle-orm/src/sqlite-core/query-builders/update.ts @@ -8,8 +8,8 @@ import type { SQLiteDialect } from '~/sqlite-core/dialect.ts'; import type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts'; import { SQLiteTable } from '~/sqlite-core/table.ts'; import { type DrizzleTypeError, mapUpdateSet, orderSelectedFields, type UpdateSet } from '~/utils.ts'; -import type { SelectedFields, SelectedFieldsOrdered } from './select.types.ts'; import type { SQLiteColumn } from '../columns/common.ts'; +import type { SelectedFields, SelectedFieldsOrdered } from './select.types.ts'; export interface SQLiteUpdateConfig { where?: SQL | undefined; @@ -177,16 +177,16 @@ export class SQLiteUpdateBase< /** * Adds a 'where' clause to the query. - * + * * Calling this method will update only those rows that fulfill a specified condition. - * + * * See docs: {@link https://orm.drizzle.team/docs/update} - * + * * @param where the 'where' clause. - * + * * @example * You can use conditional operators and `sql function` to filter the rows to be updated. - * + * * ```ts * // Update all cars with green color * db.update(cars).set({ color: 'red' }) @@ -195,14 +195,14 @@ export class SQLiteUpdateBase< * db.update(cars).set({ color: 'red' }) * .where(sql`${cars.color} = 'green'`) * ``` - * + * * You can logically combine conditional operators with `and()` and `or()` operators: - * + * * ```ts * // Update all BMW cars with a green color * db.update(cars).set({ color: 'red' }) * .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW'))); - * + * * // Update all cars with the green or blue color * db.update(cars).set({ color: 'red' }) * .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue'))); @@ -215,11 +215,11 @@ export class SQLiteUpdateBase< /** * Adds a `returning` clause to the query. - * + * * Calling this method will return the specified fields of the updated rows. If no fields are specified, all fields will be returned. - * + * * See docs: {@link https://orm.drizzle.team/docs/update#update-with-returning} - * + * * @example * ```ts * // Update all cars with the green color and return all fields @@ -227,7 +227,7 @@ export class SQLiteUpdateBase< * .set({ color: 'red' }) * .where(eq(cars.color, 'green')) * .returning(); - * + * * // Update all cars with the green color and return only their id and brand fields * const updatedCarsIdsAndBrands: { id: number, brand: string }[] = await db.update(cars) * .set({ color: 'red' }) @@ -256,7 +256,8 @@ export class SQLiteUpdateBase< return rest; } - prepare(isOneTimeQuery?: boolean): SQLiteUpdatePrepare { + /** @internal */ + _prepare(isOneTimeQuery = true): SQLiteUpdatePrepare { return this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery']( this.dialect.sqlToQuery(this.getSQL()), this.config.returning, @@ -264,20 +265,24 @@ export class SQLiteUpdateBase< ) as SQLiteUpdatePrepare; } + prepare(): SQLiteUpdatePrepare { + return this._prepare(false); + } + run: ReturnType['run'] = (placeholderValues) => { - return this.prepare(true).run(placeholderValues); + return this._prepare().run(placeholderValues); }; all: ReturnType['all'] = (placeholderValues) => { - return this.prepare(true).all(placeholderValues); + return this._prepare().all(placeholderValues); }; get: ReturnType['get'] = (placeholderValues) => { - return this.prepare(true).get(placeholderValues); + return this._prepare().get(placeholderValues); }; values: ReturnType['values'] = (placeholderValues) => { - return this.prepare(true).values(placeholderValues); + return this._prepare().values(placeholderValues); }; override async execute(): Promise> { diff --git a/drizzle-orm/src/vercel-postgres/session.ts b/drizzle-orm/src/vercel-postgres/session.ts index f85748b46..5ecc5ee84 100644 --- a/drizzle-orm/src/vercel-postgres/session.ts +++ b/drizzle-orm/src/vercel-postgres/session.ts @@ -12,18 +12,18 @@ import { type Logger, NoopLogger } from '~/logger.ts'; import { type PgDialect, PgTransaction } from '~/pg-core/index.ts'; import type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts'; import type { PgTransactionConfig, PreparedQueryConfig, QueryResultHKT } from '~/pg-core/session.ts'; -import { PgSession, PreparedQuery } from '~/pg-core/session.ts'; +import { PgPreparedQuery, PgSession } from '~/pg-core/session.ts'; import type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts'; import { fillPlaceholders, type Query, sql } from '~/sql/sql.ts'; import { type Assume, mapResultRow } from '~/utils.ts'; export type VercelPgClient = VercelPool | VercelClient | VercelPoolClient; -export class VercelPgPreparedQuery extends PreparedQuery { +export class VercelPgPreparedQuery extends PgPreparedQuery { static readonly [entityKind]: string = 'VercelPgPreparedQuery'; private rawQuery: QueryConfig; - private query: QueryArrayConfig; + private queryConfig: QueryArrayConfig; constructor( private client: VercelPgClient, @@ -34,12 +34,12 @@ export class VercelPgPreparedQuery extends Prepar name: string | undefined, private customResultMapper?: (rows: unknown[][]) => T['execute'], ) { - super(); + super({ sql: queryString, params }); this.rawQuery = { name, text: queryString, }; - this.query = { + this.queryConfig = { name, text: queryString, rowMode: 'array', @@ -51,7 +51,7 @@ export class VercelPgPreparedQuery extends Prepar this.logger.logQuery(this.rawQuery.text, params); - const { fields, rawQuery, client, query, joinsNotNullableMap, customResultMapper } = this; + const { fields, rawQuery, client, queryConfig: query, joinsNotNullableMap, customResultMapper } = this; if (!fields && !customResultMapper) { return client.query(rawQuery, params); } @@ -74,7 +74,7 @@ export class VercelPgPreparedQuery extends Prepar values(placeholderValues: Record | undefined = {}): Promise { const params = fillPlaceholders(this.params, placeholderValues); this.logger.logQuery(this.rawQuery.text, params); - return this.client.query(this.query, params).then((result) => result.rows); + return this.client.query(this.queryConfig, params).then((result) => result.rows); } } @@ -105,7 +105,7 @@ export class VercelPgSession< fields: SelectedFieldsOrdered | undefined, name: string | undefined, customResultMapper?: (rows: unknown[][]) => T['execute'], - ): PreparedQuery { + ): PgPreparedQuery { return new VercelPgPreparedQuery( this.client, query.sql, diff --git a/integration-tests/.env.example b/integration-tests/.env.example index 57cb64509..6a54bbdc9 100644 --- a/integration-tests/.env.example +++ b/integration-tests/.env.example @@ -1,6 +1,7 @@ PG_CONNECTION_STRING="postgres://postgres:postgres@localhost:55432/postgres" MYSQL_CONNECTION_STRING="mysql://root:mysql@127.0.0.1:33306/drizzle" PLANETSCALE_CONNECTION_STRING= +NEON_CONNECTION_STRING= LIBSQL_URL="file:local.db" LIBSQL_AUTH_TOKEN="ey..." # For Turso only AWS_DATA_API_DB= diff --git a/integration-tests/package.json b/integration-tests/package.json index ab3ffde7a..1e94881c7 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -23,6 +23,7 @@ "!tests/relational/**/*", "!tests/libsql-batch.test.ts", "!tests/d1-batch.test.ts", + "!tests/neon-http-batch.test.ts", "!tests/replicas/**/*", "!tests/imports/**/*" ], @@ -38,7 +39,7 @@ "license": "Apache-2.0", "private": true, "devDependencies": { - "@neondatabase/serverless": "0.4.24", + "@neondatabase/serverless": "0.8.1", "@originjs/vite-plugin-commonjs": "^1.0.3", "@types/axios": "^0.14.0", "@types/better-sqlite3": "^7.6.4", diff --git a/integration-tests/tests/imports/index.test.ts b/integration-tests/tests/imports/index.test.ts index f89efe00f..8efaecde7 100644 --- a/integration-tests/tests/imports/index.test.ts +++ b/integration-tests/tests/imports/index.test.ts @@ -3,6 +3,8 @@ import 'zx/globals'; import * as fs from 'fs'; import path from 'path'; +$.verbose = false; + const IMPORTS_FOLDER = 'tests/imports/files'; const folderPath = '../drizzle-orm/dist/package.json'; @@ -12,7 +14,7 @@ if (!fs.existsSync(IMPORTS_FOLDER)) { fs.mkdirSync(IMPORTS_FOLDER); } -it('dynamic imports check for cjs and mjs', async () => { +it('dynamic imports check for CommonJS', async () => { const promises: ProcessPromise[] = []; for (const [i, key] of Object.keys(pj['exports']).entries()) { const o1 = path.join('drizzle-orm', key); @@ -34,21 +36,21 @@ it('dynamic imports check for cjs and mjs', async () => { } }); -// it('dynamic imports check for mjs', async () => { -// const promises: ProcessPromise[] = []; -// for (const [i, key] of Object.keys(pj['exports']).entries()) { -// const o1 = path.join('drizzle-orm', key); -// fs.writeFileSync(`${IMPORTS_FOLDER}/imports_${i}.mjs`, 'imp'); -// fs.appendFileSync(`${IMPORTS_FOLDER}/imports_${i}.mjs`, 'ort "' + o1 + '"\n', {}); -// promises.push($`node ${IMPORTS_FOLDER}/imports_${i}.mjs`.nothrow()); -// } - -// const results = await Promise.all(promises); - -// for (const result of results) { -// expect(result.exitCode, result.message).toBe(0) -// } -// }); +it('dynamic imports check for ESM', async () => { + const promises: ProcessPromise[] = []; + for (const [i, key] of Object.keys(pj['exports']).entries()) { + const o1 = path.join('drizzle-orm', key); + fs.writeFileSync(`${IMPORTS_FOLDER}/imports_${i}.mjs`, 'imp'); + fs.appendFileSync(`${IMPORTS_FOLDER}/imports_${i}.mjs`, 'ort "' + o1 + '"\n', {}); + promises.push($`node ${IMPORTS_FOLDER}/imports_${i}.mjs`.nothrow()); + } + + const results = await Promise.all(promises); + + for (const result of results) { + expect(result.exitCode, result.message).toBe(0); + } +}); afterAll(() => { fs.rmdirSync(IMPORTS_FOLDER, { recursive: true }); diff --git a/integration-tests/tests/neon-http-batch.test.ts b/integration-tests/tests/neon-http-batch.test.ts new file mode 100644 index 000000000..9bbe40ebe --- /dev/null +++ b/integration-tests/tests/neon-http-batch.test.ts @@ -0,0 +1,549 @@ +import 'dotenv/config'; +import { neon } from '@neondatabase/serverless'; +import type { NeonQueryFunction } from '@neondatabase/serverless'; +import { eq, relations, sql } from 'drizzle-orm'; +import { drizzle } from 'drizzle-orm/neon-http'; +import type { NeonHttpDatabase, NeonHttpQueryResult } from 'drizzle-orm/neon-http'; +import { type AnyPgColumn, integer, pgTable, primaryKey, serial, text, timestamp } from 'drizzle-orm/pg-core'; +import { afterAll, beforeAll, beforeEach, expect, expectTypeOf, test } from 'vitest'; + +const ENABLE_LOGGING = false; + +export const usersTable = pgTable('users', { + id: serial('id').primaryKey(), + name: text('name').notNull(), + verified: integer('verified').notNull().default(0), + invitedBy: integer('invited_by').references((): AnyPgColumn => usersTable.id), +}); +export const usersConfig = relations(usersTable, ({ one, many }) => ({ + invitee: one(usersTable, { + fields: [usersTable.invitedBy], + references: [usersTable.id], + }), + usersToGroups: many(usersToGroupsTable), + posts: many(postsTable), +})); + +export const groupsTable = pgTable('groups', { + id: serial('id').primaryKey(), + name: text('name').notNull(), + description: text('description'), +}); +export const groupsConfig = relations(groupsTable, ({ many }) => ({ + usersToGroups: many(usersToGroupsTable), +})); + +export const usersToGroupsTable = pgTable( + 'users_to_groups', + { + id: serial('id'), + userId: integer('user_id').notNull().references(() => usersTable.id), + groupId: integer('group_id').notNull().references(() => groupsTable.id), + }, + (t) => ({ + pk: primaryKey({ columns: [t.userId, t.groupId] }), + }), +); +export const usersToGroupsConfig = relations(usersToGroupsTable, ({ one }) => ({ + group: one(groupsTable, { + fields: [usersToGroupsTable.groupId], + references: [groupsTable.id], + }), + user: one(usersTable, { + fields: [usersToGroupsTable.userId], + references: [usersTable.id], + }), +})); + +export const postsTable = pgTable('posts', { + id: serial('id').primaryKey(), + content: text('content').notNull(), + ownerId: integer('owner_id').references(() => usersTable.id), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); +export const postsConfig = relations(postsTable, ({ one, many }) => ({ + author: one(usersTable, { + fields: [postsTable.ownerId], + references: [usersTable.id], + }), + comments: many(commentsTable), +})); + +export const commentsTable = pgTable('comments', { + id: serial('id').primaryKey(), + content: text('content').notNull(), + creator: integer('creator').references(() => usersTable.id), + postId: integer('post_id').references(() => postsTable.id), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); +export const commentsConfig = relations(commentsTable, ({ one, many }) => ({ + post: one(postsTable, { + fields: [commentsTable.postId], + references: [postsTable.id], + }), + author: one(usersTable, { + fields: [commentsTable.creator], + references: [usersTable.id], + }), + likes: many(commentLikesTable), +})); + +export const commentLikesTable = pgTable('comment_likes', { + id: serial('id').primaryKey(), + creator: integer('creator').references(() => usersTable.id), + commentId: integer('comment_id').references(() => commentsTable.id), + createdAt: timestamp('created_at').notNull().defaultNow(), +}); +export const commentLikesConfig = relations(commentLikesTable, ({ one }) => ({ + comment: one(commentsTable, { + fields: [commentLikesTable.commentId], + references: [commentsTable.id], + }), + author: one(usersTable, { + fields: [commentLikesTable.creator], + references: [usersTable.id], + }), +})); + +const schema = { + usersTable, + postsTable, + commentsTable, + usersToGroupsTable, + groupsTable, + commentLikesConfig, + commentsConfig, + postsConfig, + usersToGroupsConfig, + groupsConfig, + usersConfig, +}; + +declare module 'vitest' { + export interface TestContext { + neonHttpDb: NeonHttpDatabase; + neonHttpClient: NeonQueryFunction; + } +} + +let db: NeonHttpDatabase; +let client: NeonQueryFunction; + +beforeAll(async () => { + const connectionString = process.env['NEON_CONNECTION_STRING']; + if (!connectionString) { + throw new Error('NEON_CONNECTION_STRING is not defined'); + } + + client = neon(connectionString); + db = drizzle(client, { schema, logger: ENABLE_LOGGING }); +}); + +beforeEach(async (ctx) => { + ctx.neonHttpDb = db; + ctx.neonHttpClient = client; + + await db.execute(sql`drop table if exists comment_likes`); + await db.execute(sql`drop table if exists comments`); + await db.execute(sql`drop table if exists posts`); + await db.execute(sql`drop table if exists users_to_groups`); + await db.execute(sql`drop table if exists groups`); + await db.execute(sql`drop table if exists users`); + + await db.execute( + sql` + create table users ( + id serial primary key, + name text not null, + verified int not null default 0, + invited_by int references users(id) + ) + `, + ); + await db.execute( + sql` + create table groups ( + id serial primary key, + name text not null, + description text + ) + `, + ); + await db.execute( + sql` + create table users_to_groups ( + id serial, + user_id int not null references users(id), + group_id int not null references groups(id), + primary key (user_id, group_id) + ) + `, + ); + await db.execute( + sql` + create table posts ( + id serial primary key, + content text not null, + owner_id int references users(id), + created_at timestamp not null default now() + ) + `, + ); + await db.execute( + sql` + create table comments ( + id serial primary key, + content text not null, + creator int references users(id), + post_id int references posts(id), + created_at timestamp not null default now() + ) + `, + ); + await db.execute( + sql` + create table comment_likes ( + id serial primary key, + creator int references users(id), + comment_id int references comments(id), + created_at timestamp not null default now() + ) + `, + ); +}); + +afterAll(async () => { + await db.execute(sql`drop table if exists comment_likes`); + await db.execute(sql`drop table if exists comments`); + await db.execute(sql`drop table if exists posts`); + await db.execute(sql`drop table if exists users_to_groups`); + await db.execute(sql`drop table if exists groups`); + await db.execute(sql`drop table if exists users`); +}); + +test('batch api example', async () => { + const batchResponse = await db.batch([ + db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ + id: usersTable.id, + invitedBy: usersTable.invitedBy, + }), + db.insert(usersTable).values({ id: 2, name: 'Dan' }), + db.select().from(usersTable), + ]); + + expectTypeOf(batchResponse).toEqualTypeOf<[ + { + id: number; + invitedBy: number | null; + }[], + NeonHttpQueryResult, + { + id: number; + name: string; + verified: number; + invitedBy: number | null; + }[], + ]>(); + + expect(batchResponse.length).eq(3); + + expect(batchResponse[0]).toEqual([{ + id: 1, + invitedBy: null, + }]); + + expect(batchResponse[1]).toMatchObject({ rows: [], rowCount: 1 }); + + expect(batchResponse[2]).toEqual([ + { id: 1, name: 'John', verified: 0, invitedBy: null }, + { id: 2, name: 'Dan', verified: 0, invitedBy: null }, + ]); +}); + +// batch api only relational many +test('insert + findMany', async () => { + const batchResponse = await db.batch([ + db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }), + db.insert(usersTable).values({ id: 2, name: 'Dan' }), + db.query.usersTable.findMany({}), + ]); + + expectTypeOf(batchResponse).toEqualTypeOf<[ + { + id: number; + }[], + NeonHttpQueryResult, + { + id: number; + name: string; + verified: number; + invitedBy: number | null; + }[], + ]>(); + + expect(batchResponse.length).eq(3); + + expect(batchResponse[0]).toEqual([{ + id: 1, + }]); + + expect(batchResponse[1]).toMatchObject({ rows: [], rowCount: 1 }); + + expect(batchResponse[2]).toEqual([ + { id: 1, name: 'John', verified: 0, invitedBy: null }, + { id: 2, name: 'Dan', verified: 0, invitedBy: null }, + ]); +}); + +// batch api relational many + one +test('insert + findMany + findFirst', async () => { + const batchResponse = await db.batch([ + db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }), + db.insert(usersTable).values({ id: 2, name: 'Dan' }), + db.query.usersTable.findMany({}), + db.query.usersTable.findFirst({}), + ]); + + expectTypeOf(batchResponse).toEqualTypeOf<[ + { + id: number; + }[], + NeonHttpQueryResult, + { + id: number; + name: string; + verified: number; + invitedBy: number | null; + }[], + { + id: number; + name: string; + verified: number; + invitedBy: number | null; + } | undefined, + ]>(); + + expect(batchResponse.length).eq(4); + + expect(batchResponse[0]).toEqual([{ + id: 1, + }]); + + expect(batchResponse[1]).toMatchObject({ rows: [], rowCount: 1 }); + + expect(batchResponse[2]).toEqual([ + { id: 1, name: 'John', verified: 0, invitedBy: null }, + { id: 2, name: 'Dan', verified: 0, invitedBy: null }, + ]); + + expect(batchResponse[3]).toEqual( + { id: 1, name: 'John', verified: 0, invitedBy: null }, + ); +}); + +// test('insert + db.execute', async () => { +// const batchResponse = await db.batch([ +// db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }), +// db.execute(sql`insert into users (id, name) values (2, 'Dan')`), +// ]); + +// expectTypeOf(batchResponse).toEqualTypeOf<[ +// { +// id: number; +// }[], +// FullQueryResults, +// ]>(); + +// expect(batchResponse.length).eq(2); + +// expect(batchResponse[0]).toEqual([{ +// id: 1, +// }]); + +// expect(batchResponse[1]).toMatchObject({ rowAsArray: false, rows: [], rowCount: 1 }); +// }); + +// batch api combined rqb + raw call +// test('insert + findManyWith + db.all', async () => { +// const batchResponse = await db.batch([ +// db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }), +// db.insert(usersTable).values({ id: 2, name: 'Dan' }), +// db.query.usersTable.findMany({}), +// db.execute(sql`select * from users`), +// ]); + +// expectTypeOf(batchResponse).toEqualTypeOf<[ +// { +// id: number; +// }[], +// NeonHttpQueryResult, +// { +// id: number; +// name: string; +// verified: number; +// invitedBy: number | null; +// }[], +// NeonHttpQueryResult<{ +// id: number; +// name: string; +// verified: number; +// invitedBy: number | null; +// }>, +// ]>(); + +// expect(batchResponse.length).eq(4); + +// expect(batchResponse[0]).toEqual([{ +// id: 1, +// }]); + +// expect(batchResponse[1]).toMatchObject({ rowAsArray: false, rows: [], rowCount: 1 }); + +// expect(batchResponse[2]).toEqual([ +// { id: 1, name: 'John', verified: 0, invitedBy: null }, +// { id: 2, name: 'Dan', verified: 0, invitedBy: null }, +// ]); + +// expect(batchResponse[3]).toEqual([ +// { id: 1, name: 'John', verified: 0, invited_by: null }, +// { id: 2, name: 'Dan', verified: 0, invited_by: null }, +// ]); +// }); + +// batch api for insert + update + select +test('insert + update + select + select partial', async () => { + const batchResponse = await db.batch([ + db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }), + db.update(usersTable).set({ name: 'Dan' }).where(eq(usersTable.id, 1)), + db.query.usersTable.findMany({}), + db.select().from(usersTable).where(eq(usersTable.id, 1)), + db.select({ id: usersTable.id, invitedBy: usersTable.invitedBy }).from(usersTable), + ]); + + expectTypeOf(batchResponse).toEqualTypeOf<[ + { + id: number; + }[], + NeonHttpQueryResult, + { + id: number; + name: string; + verified: number; + invitedBy: number | null; + }[], + { + id: number; + name: string; + verified: number; + invitedBy: number | null; + }[], + { + id: number; + invitedBy: number | null; + }[], + ]>(); + + expect(batchResponse.length).eq(5); + + expect(batchResponse[0]).toEqual([{ + id: 1, + }]); + + expect(batchResponse[1]).toMatchObject({ rows: [], rowCount: 1 }); + + expect(batchResponse[2]).toEqual([ + { id: 1, name: 'Dan', verified: 0, invitedBy: null }, + ]); + + expect(batchResponse[3]).toEqual([ + { id: 1, name: 'Dan', verified: 0, invitedBy: null }, + ]); + + expect(batchResponse[4]).toEqual([ + { id: 1, invitedBy: null }, + ]); +}); + +// batch api for insert + delete + select +test('insert + delete + select + select partial', async () => { + const batchResponse = await db.batch([ + db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }), + db.insert(usersTable).values({ id: 2, name: 'Dan' }), + db.delete(usersTable).where(eq(usersTable.id, 1)).returning({ id: usersTable.id, invitedBy: usersTable.invitedBy }), + db.query.usersTable.findFirst({ + columns: { + id: true, + invitedBy: true, + }, + }), + ]); + + expectTypeOf(batchResponse).toEqualTypeOf<[ + { + id: number; + }[], + NeonHttpQueryResult, + { + id: number; + invitedBy: number | null; + }[], + { + id: number; + invitedBy: number | null; + } | undefined, + ]>(); + + expect(batchResponse.length).eq(4); + + expect(batchResponse[0]).toEqual([{ + id: 1, + }]); + + expect(batchResponse[1]).toMatchObject({ rows: [], rowCount: 1 }); + + expect(batchResponse[2]).toEqual([ + { id: 1, invitedBy: null }, + ]); + + expect(batchResponse[3]).toEqual( + { id: 2, invitedBy: null }, + ); +}); + +// test('select raw', async () => { +// await db.insert(usersTable).values([{ id: 1, name: 'John' }, { id: 2, name: 'Dan' }]); +// const batchResponse = await db.batch([ +// db.execute(sql`select * from users`), +// db.execute(sql`select * from users where id = 1`), +// ]); + +// expectTypeOf(batchResponse).toEqualTypeOf<[ +// NeonHttpQueryResult<{ +// id: number; +// name: string; +// verified: number; +// invitedBy: number | null; +// }>, +// NeonHttpQueryResult<{ +// id: number; +// name: string; +// verified: number; +// invitedBy: number | null; +// }>, +// ]>(); + +// expect(batchResponse.length).eq(2); + +// expect(batchResponse[0]).toEqual([ +// { id: 1, name: 'John', verified: 0, invitedBy: null }, +// { id: 2, name: 'Dan', verified: 0, invitedBy: null }, +// ]); + +// expect(batchResponse[1]).toEqual([ +// { id: 1, name: 'John', verified: 0, invitedBy: null }, +// ]); +// }); + +// * additionally +// batch for all neon cases, just replace simple calls with batch calls +// batch for all rqb cases, just replace simple calls with batch calls diff --git a/integration-tests/tests/neon-http.test.ts b/integration-tests/tests/neon-http.test.ts index 5112fd3b1..3854f6d3a 100644 --- a/integration-tests/tests/neon-http.test.ts +++ b/integration-tests/tests/neon-http.test.ts @@ -3,7 +3,6 @@ import 'dotenv/config'; import { neon, type NeonQueryFunction } from '@neondatabase/serverless'; import type { TestFn } from 'ava'; import anyTest from 'ava'; -import Docker from 'dockerode'; import { and, arrayContained, @@ -48,7 +47,6 @@ import { uuid as pgUuid, varchar, } from 'drizzle-orm/pg-core'; -import getPort from 'get-port'; import pg from 'pg'; import { v4 as uuid } from 'uuid'; import { type Equal, Expect } from './utils.ts'; @@ -120,8 +118,6 @@ const usersMigratorTable = pgTable('users12', { }); interface Context { - docker: Docker; - pgContainer: Docker.Container; db: NeonHttpDatabase; ddlRunner: pg.Client; client: NeonQueryFunction; @@ -129,67 +125,22 @@ interface Context { const test = anyTest as TestFn; -async function createDockerDB(ctx: Context): Promise { - const docker = (ctx.docker = new Docker()); - const port = await getPort({ port: 5432 }); - const image = 'postgres:14'; - - const pullStream = await docker.pull(image); - await new Promise((resolve, reject) => - docker.modem.followProgress(pullStream, (err) => (err ? reject(err) : resolve(err))) - ); - - ctx.pgContainer = await docker.createContainer({ - Image: image, - Env: ['POSTGRES_PASSWORD=postgres', 'POSTGRES_USER=postgres', 'POSTGRES_DB=postgres'], - name: `drizzle-integration-tests-${uuid()}`, - HostConfig: { - AutoRemove: true, - PortBindings: { - '5432/tcp': [{ HostPort: `${port}` }], - }, - }, - }); - - await ctx.pgContainer.start(); - - return `postgres://postgres:postgres@localhost:${port}/postgres`; -} - test.before(async (t) => { const ctx = t.context; - const connectionString = process.env['PG_CONNECTION_STRING'] ?? (await createDockerDB(ctx)); - - const sleep = 250; - let timeLeft = 5000; - let connected = false; - let lastError: unknown | undefined; - do { - try { - ctx.client = neon(connectionString); - ctx.ddlRunner = new Client(connectionString); - await ctx.ddlRunner.connect(); - connected = true; - break; - } catch (e) { - lastError = e; - await new Promise((resolve) => setTimeout(resolve, sleep)); - timeLeft -= sleep; - } - } while (timeLeft > 0); - if (!connected) { - console.error('Cannot connect to Postgres'); - await ctx.ddlRunner?.end().catch(console.error); - await ctx.pgContainer?.stop().catch(console.error); - throw lastError; + const connectionString = process.env['NEON_CONNECTION_STRING']; + if (!connectionString) { + throw new Error('NEON_CONNECTION_STRING is not defined'); } + + ctx.client = neon(connectionString); + ctx.ddlRunner = new Client(connectionString); + await ctx.ddlRunner.connect(); ctx.db = drizzle(ctx.client, { logger: ENABLE_LOGGING }); }); test.after.always(async (t) => { const ctx = t.context; await ctx.ddlRunner?.end().catch(console.error); - await ctx.pgContainer?.stop().catch(console.error); }); test.beforeEach(async (t) => { diff --git a/integration-tests/tests/pg.test.ts b/integration-tests/tests/pg.test.ts index e67a4780b..84ace7bc8 100644 --- a/integration-tests/tests/pg.test.ts +++ b/integration-tests/tests/pg.test.ts @@ -3301,8 +3301,8 @@ test.serial('array mapping and parsing', async (t) => { numbers: integer('numbers').notNull().array(), }); - db.execute(sql`drop table if exists ${arrays}`); - db.execute(sql` + await db.execute(sql`drop table if exists ${arrays}`); + await db.execute(sql` create table ${arrays} ( id serial primary key, tags text[], diff --git a/integration-tests/tests/postgres.js.test.ts b/integration-tests/tests/postgres.js.test.ts index 50424c71d..ddc6cfce8 100644 --- a/integration-tests/tests/postgres.js.test.ts +++ b/integration-tests/tests/postgres.js.test.ts @@ -2187,8 +2187,8 @@ test.serial('array mapping and parsing', async (t) => { numbers: integer('numbers').notNull().array(), }); - db.execute(sql`drop table if exists ${arrays}`); - db.execute(sql` + await db.execute(sql`drop table if exists ${arrays}`); + await db.execute(sql` create table ${arrays} ( id serial primary key, tags text[], diff --git a/integration-tests/tests/utils.ts b/integration-tests/tests/utils.ts index 2d021a2e3..d60c99a26 100644 --- a/integration-tests/tests/utils.ts +++ b/integration-tests/tests/utils.ts @@ -2,7 +2,8 @@ // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars export function Expect() {} -export type Equal = (() => T extends X ? 1 : 2) extends (() => T extends Y ? 1 : 2) ? true : false; +export type Equal = (() => T extends X ? 1 : 2) extends (() => T extends Y ? 1 : 2) ? true + : false; export function toLocalDate(date: Date) { const localTime = new Date(date.getTime() - date.getTimezoneOffset() * 60000); diff --git a/integration-tests/vitest.config.ts b/integration-tests/vitest.config.ts index 12b7a1eb3..89909fcb5 100644 --- a/integration-tests/vitest.config.ts +++ b/integration-tests/vitest.config.ts @@ -9,6 +9,7 @@ export default defineConfig({ 'tests/relational/**/*.test.ts', 'tests/libsql-batch.test.ts', 'tests/d1-batch.test.ts', + 'tests/neon-http-batch.test.ts', 'tests/replicas/**/*', 'tests/imports/**/*', ], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 73782822d..1be0129b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -138,7 +138,7 @@ importers: version: 10.1.0 expo-sqlite: specifier: ^13.2.0 - version: 13.2.0(expo@49.0.21) + version: 13.2.0(expo@50.0.6) knex: specifier: ^2.4.2 version: 2.4.2(better-sqlite3@8.4.0)(mysql2@3.3.3)(pg@8.11.0)(sqlite3@5.1.6) @@ -171,10 +171,10 @@ importers: version: 3.12.7 vite-tsconfig-paths: specifier: ^4.2.0 - version: 4.2.0 + version: 4.2.0(typescript@5.2.2)(vite@4.3.9) vitest: specifier: ^0.31.4 - version: 0.31.4 + version: 0.31.4(@vitest/ui@0.31.4) zod: specifier: ^3.20.2 version: 3.21.4 @@ -189,7 +189,7 @@ importers: version: 0.4.1(rollup@3.27.2) '@rollup/plugin-typescript': specifier: ^11.1.0 - version: 11.1.1(rollup@3.27.2)(typescript@5.2.2) + version: 11.1.1(rollup@3.27.2)(typescript@5.3.3) '@sinclair/typebox': specifier: ^0.29.6 version: 0.29.6 @@ -225,7 +225,7 @@ importers: version: 0.4.1(rollup@3.27.2) '@rollup/plugin-typescript': specifier: ^11.1.0 - version: 11.1.1(rollup@3.27.2)(typescript@5.2.2) + version: 11.1.1(rollup@3.27.2)(typescript@5.3.3) '@sinclair/typebox': specifier: ^0.29.6 version: 0.29.6 @@ -264,7 +264,7 @@ importers: version: 0.4.1(rollup@3.20.7) '@rollup/plugin-typescript': specifier: ^11.1.0 - version: 11.1.0(rollup@3.20.7)(typescript@5.2.2) + version: 11.1.0(rollup@3.20.7)(typescript@5.3.3) '@types/node': specifier: ^18.15.10 version: 18.15.10 @@ -303,7 +303,7 @@ importers: version: 6.10.0(eslint@8.53.0)(typescript@5.2.2) '@typescript-eslint/rule-tester': specifier: ^6.10.0 - version: 6.10.0(@eslint/eslintrc@2.1.3)(eslint@8.53.0)(typescript@5.2.2) + version: 6.10.0(@eslint/eslintrc@3.0.0)(eslint@8.53.0)(typescript@5.2.2) '@typescript-eslint/utils': specifier: ^6.10.0 version: 6.10.0(eslint@8.53.0)(typescript@5.2.2) @@ -402,8 +402,8 @@ importers: version: 3.21.4 devDependencies: '@neondatabase/serverless': - specifier: 0.4.24 - version: 0.4.24 + specifier: 0.8.1 + version: 0.8.1 '@originjs/vite-plugin-commonjs': specifier: ^1.0.3 version: 1.0.3 @@ -448,7 +448,7 @@ importers: version: 4.3.9(@types/node@20.2.5) vite-tsconfig-paths: specifier: ^4.2.0 - version: 4.2.0(vite@4.3.9) + version: 4.2.0(typescript@5.2.2)(vite@4.3.9) zx: specifier: ^7.2.2 version: 7.2.2 @@ -465,7 +465,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.22 dev: true /@andrewbranch/untar.js@1.0.2: @@ -1557,20 +1557,20 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.23.6: - resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.6 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) - '@babel/helpers': 7.23.6 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.6 - '@babel/types': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) + '@babel/helpers': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -1593,9 +1593,9 @@ packages: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/trace-mapping': 0.3.22 jsesc: 2.5.2 dev: true @@ -1603,14 +1603,14 @@ packages: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@babel/helper-compilation-targets@7.23.6: @@ -1619,52 +1619,52 @@ packages: dependencies: '@babel/compat-data': 7.23.5 '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.2 + browserslist: 4.22.3 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.23.6(@babel/core@7.23.6): - resolution: {integrity: sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==} + /@babel/helper-create-class-features-plugin@7.23.10(@babel/core@7.23.9): + resolution: {integrity: sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@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.6) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 dev: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.6): + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.9): resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@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.4(@babel/core@7.23.6): - resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} + /@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.23.9): + resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 - resolve: 1.22.4 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true @@ -1691,8 +1691,8 @@ packages: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 dev: true /@babel/helper-hoist-variables@7.22.5: @@ -1706,23 +1706,23 @@ packages: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@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.6 + '@babel/types': 7.23.9 dev: true - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 @@ -1734,7 +1734,7 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@babel/helper-plugin-utils@7.22.5: @@ -1742,25 +1742,25 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.6): + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.9): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@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.6): + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.9): resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 @@ -1770,14 +1770,14 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true /@babel/helper-split-export-declaration@7.22.6: @@ -1819,17 +1819,17 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/template': 7.23.9 + '@babel/types': 7.23.9 dev: true - /@babel/helpers@7.23.6: - resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.6 - '@babel/types': 7.23.6 + '@babel/template': 7.23.9 + '@babel/traverse': 7.23.9 + '@babel/types': 7.23.9 transitivePeerDependencies: - supports-color dev: true @@ -1870,136 +1870,121 @@ packages: '@babel/types': 7.17.0 dev: true - /@babel/parser@7.23.6: - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.6): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.6): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.6) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.9) dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==} + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.9): + resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.6): + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.9): resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@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.6) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.6): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-proposal-decorators@7.23.6(@babel/core@7.23.6): - resolution: {integrity: sha512-D7Ccq9LfkBFnow3azZGJvZYgcfeqAw3I1e5LoTpj6UKIFQilh8yqXsIGcRIqbBdsPWIz+Ze7ZZfggSj62Qp+Fg==} + /@babel/plugin-proposal-decorators@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.9) dev: true - /@babel/plugin-proposal-export-default-from@7.23.3(@babel/core@7.23.6): + /@babel/plugin-proposal-export-default-from@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.23.6) - dev: true - - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.23.6): - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.23.9) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.6): + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.6): + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) dev: true - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.6): + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.9): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. @@ -2007,986 +1992,1061 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) dev: true - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.6): + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.6): + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.9): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@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.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.6): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.6): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.6): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-export-default-from@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-export-default-from@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.6): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.6): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.6): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.6): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.6): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.6): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.6): + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.6): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.9): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-async-generator-functions@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==} + /@babel/plugin-transform-async-generator-functions@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@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.6) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@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.6) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.6): - resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} + /@babel/plugin-transform-classes@7.23.8(@babel/core@7.23.9): + resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-compilation-targets': 7.23.6 '@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.6) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 dev: true - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 + '@babel/template': 7.23.9 dev: true - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.6): + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.9): resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} + /@babel/plugin-transform-modules-systemjs@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.20 dev: true - /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.6): + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.9): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.6) + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@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.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.9): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) + dev: true + + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.6): + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.9): resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) - '@babel/types': 7.23.6 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) + '@babel/types': 7.23.9 + dev: true + + /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-runtime@7.23.6(@babel/core@7.23.6): - resolution: {integrity: sha512-kF1Zg62aPseQ11orDhFRw+aPG/eynNQtI+TyY+m33qJa2cJ5EEvza2P2BNTIA9E5MyqFABHEyY6CPHwgdy9aNg==} + /@babel/plugin-transform-runtime@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.6) - babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.6) - babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.6) + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.9) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.23.9) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.9) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.6): + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.9): resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.6(@babel/core@7.23.6) + '@babel/helper-create-class-features-plugin': 7.23.10(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) dev: true - /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.6): + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.9): resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.9) '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/preset-env@7.23.6(@babel/core@7.23.6): - resolution: {integrity: sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==} + /@babel/preset-env@7.23.9(@babel/core@7.23.9): + resolution: {integrity: sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.6 + '@babel/core': 7.23.9 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.6) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.6) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.6) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.6) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.6) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.6) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.6) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.6) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-async-generator-functions': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.23.6) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.6) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.6) - '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.6) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.6) - babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.6) - babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.6) - babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.6) - core-js-compat: 3.34.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.9) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.9) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-async-generator-functions': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.9) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.9) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-systemjs': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.9) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.9) + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.9) + babel-plugin-polyfill-corejs3: 0.9.0(@babel/core@7.23.9) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.9) + core-js-compat: 3.35.1 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.6): + /@babel/preset-flow@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.9) + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.9): 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.6 + '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.6 + '@babel/types': 7.23.9 esutils: 2.0.3 dev: true + /@babel/preset-react@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.23.9) + dev: true + + /@babel/preset-typescript@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.9) + dev: true + + /@babel/register@7.23.7(@babel/core@7.23.9): + resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.9 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + dev: true + /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true @@ -2998,13 +3058,11 @@ packages: regenerator-runtime: 0.14.0 dev: true - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + /@babel/runtime@7.23.9: + resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + regenerator-runtime: 0.14.1 dev: true /@babel/template@7.22.5: @@ -3016,6 +3074,15 @@ packages: '@babel/types': 7.22.10 dev: true + /@babel/template@7.23.9: + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + dev: true + /@babel/traverse@7.17.3: resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} engines: {node: '>=6.9.0'} @@ -3034,8 +3101,8 @@ packages: - supports-color dev: true - /@babel/traverse@7.23.6: - resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 @@ -3044,8 +3111,8 @@ packages: '@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.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -3078,6 +3145,15 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + /@balena/dockerignore@1.0.2: resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} dev: false @@ -3608,6 +3684,23 @@ packages: - supports-color dev: true + /@eslint/eslintrc@3.0.0: + resolution: {integrity: sha512-R8p3jN1kdWvFRiRfgpUxZ4PMgfJJFt6NuLGDnnqLb7RKmsd5Xa0KqRMjmaqRO7e38ZbG/9zKPgDjeJeqsDofSA==} + 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.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /@eslint/js@8.50.0: resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3628,73 +3721,88 @@ packages: safe-json-stringify: 1.2.0 dev: true - /@expo/cli@0.10.16(expo-modules-autolinking@1.5.1): - resolution: {integrity: sha512-EwgnRN5AMElg0JJjFLJTPk5hYkVXxnNMLIvZBiTfGoCq+rDw6u7Mg5l2Bbm/geSHOoplaHyPZ/Wr23FAuZWehA==} + /@expo/cli@0.17.5(@react-native/babel-preset@0.73.21)(expo-modules-autolinking@1.10.3): + resolution: {integrity: sha512-9cMquL/5bBfV73CbZcWipk3KZSo8mBqdgvkoWCtEtnnlm/879ayxzMWjVIgT5yV4w+X7+N6KkBSUIIj4t9Xqew==} hasBin: true dependencies: - '@babel/runtime': 7.22.10 + '@babel/runtime': 7.23.9 '@expo/code-signing-certificates': 0.0.5 - '@expo/config': 8.1.2 - '@expo/config-plugins': 7.2.5 - '@expo/dev-server': 0.5.5 + '@expo/config': 8.5.4 + '@expo/config-plugins': 7.8.4 '@expo/devcert': 1.1.0 - '@expo/env': 0.0.5 - '@expo/json-file': 8.2.37 - '@expo/metro-config': 0.10.7 - '@expo/osascript': 2.0.33 - '@expo/package-manager': 1.1.2 - '@expo/plist': 0.0.20 - '@expo/prebuild-config': 6.2.6(expo-modules-autolinking@1.5.1) + '@expo/env': 0.2.1 + '@expo/image-utils': 0.4.1 + '@expo/json-file': 8.3.0 + '@expo/metro-config': 0.17.4(@react-native/babel-preset@0.73.21) + '@expo/osascript': 2.1.0 + '@expo/package-manager': 1.4.2 + '@expo/plist': 0.1.0 + '@expo/prebuild-config': 6.7.4(expo-modules-autolinking@1.10.3) '@expo/rudder-sdk-node': 1.1.1 '@expo/spawn-async': 1.5.0 - '@expo/xcpretty': 4.3.0 + '@expo/xcpretty': 4.3.1 + '@react-native/dev-middleware': 0.73.7 '@urql/core': 2.3.6(graphql@15.8.0) '@urql/exchange-retry': 0.3.0(graphql@15.8.0) accepts: 1.3.8 - arg: 4.1.0 + arg: 5.0.2 better-opn: 3.0.2 bplist-parser: 0.3.2 cacache: 15.3.0 chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 3.9.0 + connect: 3.7.0 debug: 4.3.4 env-editor: 0.4.2 + find-yarn-workspace-root: 2.0.0 form-data: 3.0.1 freeport-async: 2.0.0 fs-extra: 8.1.0 getenv: 1.0.0 + glob: 7.2.3 graphql: 15.8.0 graphql-tag: 2.12.6(graphql@15.8.0) https-proxy-agent: 5.0.1 internal-ip: 4.3.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 js-yaml: 3.14.1 json-schema-deref-sync: 0.13.0 - md5-file: 3.2.3 + lodash.debounce: 4.0.8 md5hex: 1.0.0 - minipass: 3.1.6 + minimatch: 3.1.2 + minipass: 3.3.6 node-fetch: 2.7.0 node-forge: 1.3.1 npm-package-arg: 7.0.0 + open: 8.4.2 ora: 3.4.0 + picomatch: 3.0.1 pretty-bytes: 5.6.0 progress: 2.0.3 prompts: 2.4.2 qrcode-terminal: 0.11.0 require-from-string: 2.0.2 requireg: 0.2.2 + resolve: 1.22.8 resolve-from: 5.0.0 - semver: 7.5.4 + resolve.exports: 2.0.2 + semver: 7.6.0 send: 0.18.0 slugify: 1.6.6 + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 structured-headers: 0.4.1 - tar: 6.1.13 + tar: 6.2.0 + temp-dir: 2.0.0 tempy: 0.7.1 terminal-link: 2.1.1 text-table: 0.2.0 url-join: 4.0.0 wrap-ansi: 7.0.0 - ws: 8.13.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ws: 8.16.0 transitivePeerDependencies: + - '@react-native/babel-preset' - bluebird - bufferutil - encoding @@ -3710,12 +3818,13 @@ packages: nullthrows: 1.1.1 dev: true - /@expo/config-plugins@7.2.5: - resolution: {integrity: sha512-w+5ccu1IxBHgyQk9CPFKLZOk8yZQEyTjbJwOzESK1eR7QwosbcsLkN1c1WWUZYiCXwORu3UTwJYll4+X2xxJhQ==} + /@expo/config-plugins@7.8.4: + resolution: {integrity: sha512-hv03HYxb/5kX8Gxv/BTI8TLc9L06WzqAfHRRXdbar4zkLcP2oTzvsLEF4/L/TIpD3rsnYa0KU42d0gWRxzPCJg==} dependencies: - '@expo/config-types': 49.0.0 - '@expo/json-file': 8.2.37 - '@expo/plist': 0.0.20 + '@expo/config-types': 50.0.0 + '@expo/fingerprint': 0.6.0 + '@expo/json-file': 8.3.0 + '@expo/plist': 0.1.0 '@expo/sdk-runtime-versions': 1.0.0 '@react-native/normalize-color': 2.1.0 chalk: 4.1.2 @@ -3724,25 +3833,26 @@ packages: getenv: 1.0.0 glob: 7.1.6 resolve-from: 5.0.0 - semver: 7.5.4 + semver: 7.6.0 slash: 3.0.0 + slugify: 1.6.6 xcode: 3.0.1 xml2js: 0.6.0 transitivePeerDependencies: - supports-color dev: true - /@expo/config-types@49.0.0: - resolution: {integrity: sha512-8eyREVi+K2acnMBe/rTIu1dOfyR2+AMnTLHlut+YpMV9OZPdeKV0Bs9BxAewGqBA2slslbQ9N39IS2CuTKpXkA==} + /@expo/config-types@50.0.0: + resolution: {integrity: sha512-0kkhIwXRT6EdFDwn+zTg9R2MZIAEYGn1MVkyRohAd+C9cXOb5RA8WLQi7vuxKF9m1SMtNAUrf0pO+ENK0+/KSw==} dev: true - /@expo/config@8.1.2: - resolution: {integrity: sha512-4e7hzPj50mQIlsrzOH6XZ36O094mPfPTIDIH4yv49bWNMc7GFLTofB/lcT+QyxiLaJuC0Wlk9yOLB8DIqmtwug==} + /@expo/config@8.5.4: + resolution: {integrity: sha512-ggOLJPHGzJSJHVBC1LzwXwR6qUn8Mw7hkc5zEKRIdhFRuIQ6s2FE4eOvP87LrNfDF7eZGa6tJQYsiHSmZKG+8Q==} dependencies: '@babel/code-frame': 7.10.4 - '@expo/config-plugins': 7.2.5 - '@expo/config-types': 49.0.0 - '@expo/json-file': 8.2.37 + '@expo/config-plugins': 7.8.4 + '@expo/config-types': 50.0.0 + '@expo/json-file': 8.3.0 getenv: 1.0.0 glob: 7.1.6 require-from-string: 2.0.2 @@ -3754,29 +3864,6 @@ packages: - supports-color dev: true - /@expo/dev-server@0.5.5: - resolution: {integrity: sha512-t0fT8xH1exwYsH5hh7bAt85VF+gXxg24qrbny2rR/iKoPTWFCd2JNQV8pvfLg51hvrywQ3YCBuT3lU1w7aZxFA==} - dependencies: - '@expo/bunyan': 4.0.0 - '@expo/metro-config': 0.10.7 - '@expo/osascript': 2.0.33 - '@expo/spawn-async': 1.5.0 - body-parser: 1.20.1 - chalk: 4.1.2 - connect: 3.7.0 - fs-extra: 9.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - node-fetch: 2.7.0 - open: 8.4.2 - resolve-from: 5.0.0 - serialize-error: 6.0.0 - temp-dir: 2.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - /@expo/devcert@1.1.0: resolution: {integrity: sha512-ghUVhNJQOCTdQckSGTHctNp/0jzvVoMMkVh+6SHn+TZj8sU15U/npXIDt8NtQp0HedlPaCgkVdMu8Sacne0aEA==} dependencies: @@ -3797,8 +3884,8 @@ packages: - supports-color dev: true - /@expo/env@0.0.5: - resolution: {integrity: sha512-UXuKAqyXfhMQC3gP0OyjXmFX08Z1fkVWiGBN7bYzfoX8LHatjeHrDtI6w5nDvd8XPxPvmqaZoEDw1lW3+dz3oQ==} + /@expo/env@0.2.1: + resolution: {integrity: sha512-deZmRS7Dvp18VM8s559dq/ZjPlV1D9vtLoLXwHmCK/JYOvtNptdKsfxcWjI7ewmo6ln2PqgNI9HRI74q6Wk2eA==} dependencies: chalk: 4.1.2 debug: 4.3.4 @@ -3809,15 +3896,29 @@ packages: - supports-color dev: true - /@expo/image-utils@0.3.22: - resolution: {integrity: sha512-uzq+RERAtkWypOFOLssFnXXqEqKjNj9eXN7e97d/EXUAojNcLDoXc0sL+F5B1I4qtlsnhX01kcpoIBBZD8wZNQ==} + /@expo/fingerprint@0.6.0: + resolution: {integrity: sha512-KfpoVRTMwMNJ/Cf5o+Ou8M/Y0EGSTqK+rbi70M2Y0K2qgWNfMJ1gm6sYO9uc8lcTr7YSYM1Rme3dk7QXhpScNA==} + hasBin: true + dependencies: + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + debug: 4.3.4 + find-up: 5.0.0 + minimatch: 3.1.2 + p-limit: 3.1.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@expo/image-utils@0.4.1: + resolution: {integrity: sha512-EZb+VHSmw+a5s2hS9qksTcWylY0FDaIAVufcxoaRS9tHIXLjW5zcKW7Rhj9dSEbZbRVy9yXXdHKa3GQdUQIOFw==} dependencies: '@expo/spawn-async': 1.5.0 chalk: 4.1.2 fs-extra: 9.0.0 getenv: 1.0.0 jimp-compact: 0.16.1 - mime: 2.6.0 node-fetch: 2.7.0 parse-png: 2.1.0 resolve-from: 5.0.0 @@ -3827,45 +3928,56 @@ packages: - encoding dev: true - /@expo/json-file@8.2.37: - resolution: {integrity: sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q==} + /@expo/json-file@8.3.0: + resolution: {integrity: sha512-yROUeXJXR5goagB8c3muFLCzLmdGOvoPpR5yDNaXrnTp4euNykr9yW0wWhJx4YVRTNOPtGBnEbbJBW+a9q+S6g==} dependencies: '@babel/code-frame': 7.10.4 json5: 2.2.3 write-file-atomic: 2.4.3 dev: true - /@expo/metro-config@0.10.7: - resolution: {integrity: sha512-uACymEiyX0447hI4unt+2cemLQkTZXKvTev936NhtsgVnql45EP0V0pzmo/0H0WlHaAGXgvOBZJl8wFqcJ3CbQ==} + /@expo/metro-config@0.17.4(@react-native/babel-preset@0.73.21): + resolution: {integrity: sha512-PxqDMuVjXQeboa6Aj8kNj4iTxIpwpfoYlF803qOjf1LE1ePlREnWNwqy65ESCBnCmekYIO5hhm1Nksa+xCvuyg==} + peerDependencies: + '@react-native/babel-preset': '*' dependencies: - '@expo/config': 8.1.2 - '@expo/env': 0.0.5 - '@expo/json-file': 8.2.37 + '@babel/core': 7.23.9 + '@babel/generator': 7.23.6 + '@babel/parser': 7.23.9 + '@babel/types': 7.23.9 + '@expo/config': 8.5.4 + '@expo/env': 0.2.1 + '@expo/json-file': 8.3.0 + '@expo/spawn-async': 1.7.2 + '@react-native/babel-preset': 0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9) + babel-preset-fbjs: 3.4.0(@babel/core@7.23.9) chalk: 4.1.2 debug: 4.3.4 find-yarn-workspace-root: 2.0.0 + fs-extra: 9.1.0 getenv: 1.0.0 + glob: 7.2.3 jsc-safe-url: 0.2.4 lightningcss: 1.19.0 - postcss: 8.4.24 + postcss: 8.4.35 resolve-from: 5.0.0 sucrase: 3.34.0 transitivePeerDependencies: - supports-color dev: true - /@expo/osascript@2.0.33: - resolution: {integrity: sha512-FQinlwHrTlJbntp8a7NAlCKedVXe06Va/0DSLXRO8lZVtgbEMrYYSUZWQNcOlNtc58c2elNph6z9dMOYwSo3JQ==} + /@expo/osascript@2.1.0: + resolution: {integrity: sha512-bOhuFnlRaS7CU33+rFFIWdcET/Vkyn1vsN8BYFwCDEF5P1fVVvYN7bFOsQLTMD3nvi35C1AGmtqUr/Wfv8Xaow==} engines: {node: '>=12'} dependencies: '@expo/spawn-async': 1.5.0 exec-async: 2.2.0 dev: true - /@expo/package-manager@1.1.2: - resolution: {integrity: sha512-JI9XzrxB0QVXysyuJ996FPCJGDCYRkbUvgG4QmMTTMFA1T+mv8YzazC3T9C1pHQUAAveVCre1+Pqv0nZXN24Xg==} + /@expo/package-manager@1.4.2: + resolution: {integrity: sha512-LKdo/6y4W7llZ6ghsg1kdx2CeH/qR/c6QI/JI8oPUvppsZoeIYjSkdflce978fAMfR8IXoi0wt0jA2w0kWpwbg==} dependencies: - '@expo/json-file': 8.2.37 + '@expo/json-file': 8.3.0 '@expo/spawn-async': 1.5.0 ansi-regex: 5.0.1 chalk: 4.1.2 @@ -3874,30 +3986,31 @@ packages: js-yaml: 3.14.1 micromatch: 4.0.5 npm-package-arg: 7.0.0 + ora: 3.4.0 split: 1.0.1 sudo-prompt: 9.1.1 dev: true - /@expo/plist@0.0.20: - resolution: {integrity: sha512-UXQ4LXCfTZ580LDHGJ5q62jSTwJFFJ1GqBu8duQMThiHKWbMJ+gajJh6rsB6EJ3aLUr9wcauxneL5LVRFxwBEA==} + /@expo/plist@0.1.0: + resolution: {integrity: sha512-xWD+8vIFif0wKyuqe3fmnmnSouXYucciZXFzS0ZD5OV9eSAS1RGQI5FaGGJ6zxJ4mpdy/4QzbLdBjnYE5vxA0g==} dependencies: '@xmldom/xmldom': 0.7.13 base64-js: 1.5.1 xmlbuilder: 14.0.0 dev: true - /@expo/prebuild-config@6.2.6(expo-modules-autolinking@1.5.1): - resolution: {integrity: sha512-uFVvDAm9dPg9p1qpnr4CVnpo2hmkZIL5FQz+VlIdXXJpe7ySh/qTGHtKWY/lWUshQkAJ0nwbKGPztGWdABns/Q==} + /@expo/prebuild-config@6.7.4(expo-modules-autolinking@1.10.3): + resolution: {integrity: sha512-x8EUdCa8DTMZ/dtEXjHAdlP+ljf6oSeSKNzhycXiHhpMSMG9jEhV28ocCwc6cKsjK5GziweEiHwvrj6+vsBlhA==} peerDependencies: expo-modules-autolinking: '>=0.8.1' dependencies: - '@expo/config': 8.1.2 - '@expo/config-plugins': 7.2.5 - '@expo/config-types': 49.0.0 - '@expo/image-utils': 0.3.22 - '@expo/json-file': 8.2.37 + '@expo/config': 8.5.4 + '@expo/config-plugins': 7.8.4 + '@expo/config-types': 50.0.0 + '@expo/image-utils': 0.4.1 + '@expo/json-file': 8.3.0 debug: 4.3.4 - expo-modules-autolinking: 1.5.1 + expo-modules-autolinking: 1.10.3 fs-extra: 9.1.0 resolve-from: 5.0.0 semver: 7.5.3 @@ -3933,8 +4046,15 @@ packages: cross-spawn: 6.0.5 dev: true - /@expo/vector-icons@13.0.0: - resolution: {integrity: sha512-TI+l71+5aSKnShYclFa14Kum+hQMZ86b95SH6tQUG3qZEmLTarvWpKwqtTwQKqvlJSJrpFiSFu3eCuZokY6zWA==} + /@expo/spawn-async@1.7.2: + resolution: {integrity: sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==} + engines: {node: '>=12'} + dependencies: + cross-spawn: 7.0.3 + dev: true + + /@expo/vector-icons@14.0.0: + resolution: {integrity: sha512-5orm59pdnBQlovhU9k4DbjMUZBHNlku7IRgFY56f7pcaaCnXq9yaLJoOQl9sMwNdFzf4gnkTyHmR5uN10mI9rA==} dev: true /@expo/websql@1.0.1: @@ -3947,8 +4067,8 @@ packages: tiny-queue: 0.2.1 dev: true - /@expo/xcpretty@4.3.0: - resolution: {integrity: sha512-whBbvHZ2Q10T5TNmN0z5NbO6C9ZDw+XUTu8h6vVMnMzQrbGexc9oaCCZfz+L3Q7TEL5vfr+9L86nY62c3Bsm+g==} + /@expo/xcpretty@4.3.1: + resolution: {integrity: sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw==} hasBin: true dependencies: '@babel/code-frame': 7.10.4 @@ -4020,6 +4140,11 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: true + /@isaacs/ttlcache@1.4.1: + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + dev: true + /@jest/schemas@29.6.3: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4027,17 +4152,6 @@ packages: '@sinclair/typebox': 0.27.8 dev: true - /@jest/types@26.6.2: - resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} - engines: {node: '>= 10.14.2'} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.10.1 - '@types/yargs': 15.0.19 - chalk: 4.1.2 - dev: true - /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -4052,6 +4166,11 @@ packages: engines: {node: '>=6.0.0'} dev: true + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} @@ -4078,6 +4197,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@libsql/client@0.1.6: resolution: {integrity: sha512-43XPfgqHqUTlPAOKqEI1SFWUbKYZrqQXQrh81oyw2QZ3ZRvAdGgnaKYHoKQNvC0nJOtVCgvT6VIJdLDORCYwGw==} dependencies: @@ -4192,6 +4318,12 @@ packages: dependencies: '@types/pg': 8.10.1 + /@neondatabase/serverless@0.8.1: + resolution: {integrity: sha512-nxZfTLbGqvDrw0W9WnQxzoPn4KC6SLjkvK4grdf6eWVMQSc24X+8udz9inZWOGu8f0O3wJAq586fCZ32r22lwg==} + dependencies: + '@types/pg': 8.6.6 + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -4251,6 +4383,116 @@ packages: /@polka/url@1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + /@react-native/assets-registry@0.73.1: + resolution: {integrity: sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg==} + engines: {node: '>=18'} + dev: true + + /@react-native/babel-plugin-codegen@0.73.4(@babel/preset-env@7.23.9): + resolution: {integrity: sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==} + engines: {node: '>=18'} + dependencies: + '@react-native/codegen': 0.73.3(@babel/preset-env@7.23.9) + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color + dev: true + + /@react-native/babel-preset@0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9): + resolution: {integrity: sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==} + engines: {node: '>=18'} + peerDependencies: + '@babel/core': '*' + dependencies: + '@babel/core': 7.23.9 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-export-default-from': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.9) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-runtime': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.9) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.9) + '@babel/template': 7.23.9 + '@react-native/babel-plugin-codegen': 0.73.4(@babel/preset-env@7.23.9) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.23.9) + react-refresh: 0.14.0 + transitivePeerDependencies: + - '@babel/preset-env' + - supports-color + dev: true + + /@react-native/codegen@0.73.3(@babel/preset-env@7.23.9): + resolution: {integrity: sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==} + engines: {node: '>=18'} + peerDependencies: + '@babel/preset-env': ^7.1.6 + dependencies: + '@babel/parser': 7.23.9 + '@babel/preset-env': 7.23.9(@babel/core@7.23.9) + flow-parser: 0.206.0 + glob: 7.2.3 + invariant: 2.2.4 + jscodeshift: 0.14.0(@babel/preset-env@7.23.9) + mkdirp: 0.5.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@react-native/debugger-frontend@0.73.3: + resolution: {integrity: sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw==} + engines: {node: '>=18'} + dev: true + + /@react-native/dev-middleware@0.73.7: + resolution: {integrity: sha512-BZXpn+qKp/dNdr4+TkZxXDttfx8YobDh8MFHsMk9usouLm22pKgFIPkGBV0X8Do4LBkFNPGtrnsKkWk/yuUXKg==} + engines: {node: '>=18'} + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.73.3 + chrome-launcher: 0.15.2 + chromium-edge-launcher: 1.0.0 + connect: 3.7.0 + debug: 2.6.9 + node-fetch: 2.7.0 + open: 7.4.2 + serve-static: 1.15.0 + temp-dir: 2.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@react-native/normalize-color@2.1.0: resolution: {integrity: sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==} dev: true @@ -4285,7 +4527,7 @@ packages: terser: 5.17.1 dev: true - /@rollup/plugin-typescript@11.1.0(rollup@3.20.7)(typescript@5.2.2): + /@rollup/plugin-typescript@11.1.0(rollup@3.20.7)(typescript@5.3.3): resolution: {integrity: sha512-86flrfE+bSHB69znnTV6kVjkncs2LBMhcTCyxWgRxLyfXfQrxg4UwlAqENnjrrxnSNS/XKCDJCl8EkdFJVHOxw==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4301,10 +4543,10 @@ packages: '@rollup/pluginutils': 5.0.2(rollup@3.20.7) resolve: 1.22.1 rollup: 3.20.7 - typescript: 5.2.2(patch_hash=wmhs4olj6eveeldp6si4l46ssq) + typescript: 5.3.3 dev: true - /@rollup/plugin-typescript@11.1.1(rollup@3.27.2)(typescript@5.2.2): + /@rollup/plugin-typescript@11.1.1(rollup@3.27.2)(typescript@5.3.3): resolution: {integrity: sha512-Ioir+x5Bejv72Lx2Zbz3/qGg7tvGbxQZALCLoJaGrkNXak/19+vKgKYJYM3i/fJxvsb23I9FuFQ8CUBEfsmBRg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4320,7 +4562,7 @@ packages: '@rollup/pluginutils': 5.0.2(rollup@3.27.2) resolve: 1.22.2 rollup: 3.27.2 - typescript: 5.2.2(patch_hash=wmhs4olj6eveeldp6si4l46ssq) + typescript: 5.3.3 dev: true /@rollup/pluginutils@5.0.2(rollup@3.20.7): @@ -4488,22 +4730,6 @@ packages: '@types/node': 20.8.7 dev: true - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true - - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - dev: true - - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 - dev: true - /@types/json-schema@7.0.13: resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} dev: true @@ -4546,6 +4772,12 @@ packages: undici-types: 5.26.5 dev: true + /@types/node@20.11.16: + resolution: {integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==} + dependencies: + undici-types: 5.26.5 + dev: true + /@types/node@20.2.5: resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==} dev: true @@ -4569,7 +4801,7 @@ packages: /@types/pg@8.6.6: resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} dependencies: - '@types/node': 20.8.7 + '@types/node': 20.2.5 pg-protocol: 1.6.0 pg-types: 2.2.0 dev: true @@ -4639,16 +4871,6 @@ packages: dependencies: '@types/node': 20.8.7 - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true - - /@types/yargs@15.0.19: - resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} - dependencies: - '@types/yargs-parser': 21.0.3 - dev: true - /@typescript-eslint/eslint-plugin@6.7.3(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2): resolution: {integrity: sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -4733,14 +4955,14 @@ packages: - supports-color dev: true - /@typescript-eslint/rule-tester@6.10.0(@eslint/eslintrc@2.1.3)(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/rule-tester@6.10.0(@eslint/eslintrc@3.0.0)(eslint@8.53.0)(typescript@5.2.2): resolution: {integrity: sha512-I0ZY+9ei73dlOuXwIYWsn/r/ue26Ygf4yEJPxeJRPI06YWDawmR1FI1dXL6ChAWVrmBQRvWep/1PxnV41zfcMA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@eslint/eslintrc': '>=2' eslint: '>=8' dependencies: - '@eslint/eslintrc': 2.1.3 + '@eslint/eslintrc': 3.0.0 '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) ajv: 6.12.6 @@ -5273,8 +5495,8 @@ packages: readable-stream: 3.6.2 optional: true - /arg@4.1.0: - resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} dev: true /argparse@1.0.10: @@ -5399,6 +5621,13 @@ packages: /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + /ast-types@0.15.2: + resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} + engines: {node: '>=4'} + dependencies: + tslib: 2.6.2 + dev: true + /ast-types@0.16.1: resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} engines: {node: '>=4'} @@ -5545,49 +5774,46 @@ packages: - debug dev: true - /babel-plugin-module-resolver@5.0.0: - resolution: {integrity: sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==} - engines: {node: '>= 16'} + /babel-core@7.0.0-bridge.0(@babel/core@7.23.9): + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - find-babel-config: 2.0.0 - glob: 8.1.0 - pkg-up: 3.1.0 - reselect: 4.1.8 - resolve: 1.22.4 + '@babel/core': 7.23.9 dev: true - /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.6): - resolution: {integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==} + /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.9): + resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.6 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.6): - resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} + /babel-plugin-polyfill-corejs3@0.9.0(@babel/core@7.23.9): + resolution: {integrity: sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.6) - core-js-compat: 3.34.0 + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) + core-js-compat: 3.35.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.6): - resolution: {integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==} + /babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.23.9): + resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.23.6 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.6) + '@babel/core': 7.23.9 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.9) transitivePeerDependencies: - supports-color dev: true @@ -5596,33 +5822,73 @@ packages: resolution: {integrity: sha512-4djr9G6fMdwQoD6LQ7hOKAm39+y12flWgovAqS1k5O8f42YQ3A1FFMyV5kKfetZuGhZO5BmNmOdRRZQ1TixtDw==} dev: true - /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.6): + /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: + resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} + dev: true + + /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.9): resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} dependencies: - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.6) + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.9) transitivePeerDependencies: - '@babel/core' dev: true - /babel-preset-expo@9.5.2(@babel/core@7.23.6): - resolution: {integrity: sha512-hU1G1TDiikuXV6UDZjPnX+WdbjbtidDiYhftMEVrZQSst45pDPVBWbM41TUKrpJMwv4FypsLzK+378gnMPRVWQ==} + /babel-preset-expo@10.0.1(@babel/core@7.23.9): + resolution: {integrity: sha512-uWIGmLfbP3dS5+8nesxaW6mQs41d4iP7X82ZwRdisB/wAhKQmuJM9Y1jQe4006uNYkw6Phf2TT03ykLVro7KuQ==} dependencies: - '@babel/plugin-proposal-decorators': 7.23.6(@babel/core@7.23.6) - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.23.6) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.6) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.6) - '@babel/preset-env': 7.23.6(@babel/core@7.23.6) - babel-plugin-module-resolver: 5.0.0 + '@babel/plugin-proposal-decorators': 7.23.9(@babel/core@7.23.9) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) + '@babel/preset-env': 7.23.9(@babel/core@7.23.9) + '@babel/preset-react': 7.23.3(@babel/core@7.23.9) + '@react-native/babel-preset': 0.73.21(@babel/core@7.23.9)(@babel/preset-env@7.23.9) babel-plugin-react-native-web: 0.18.12 - metro-react-native-babel-preset: 0.76.8(@babel/core@7.23.6) + react-refresh: 0.14.0 transitivePeerDependencies: - '@babel/core' - supports-color dev: true - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - requiresBuild: true + /babel-preset-fbjs@3.4.0(@babel/core@7.23.9): + resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.9 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.9) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.9) + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.9) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.9) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.9) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.9) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.9) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.9) + babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + requiresBuild: true /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -5690,6 +5956,7 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color + dev: false /bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} @@ -5733,15 +6000,15 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist@4.22.2: - resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + /browserslist@4.22.3: + resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001570 - electron-to-chromium: 1.4.615 + caniuse-lite: 1.0.30001585 + electron-to-chromium: 1.4.661 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.2) + update-browserslist-db: 1.0.13(browserslist@4.22.3) dev: true /buffer-alloc-unsafe@1.1.0: @@ -5828,6 +6095,7 @@ packages: /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + dev: false /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} @@ -5880,8 +6148,8 @@ packages: engines: {node: '>=14.16'} dev: true - /caniuse-lite@1.0.30001570: - resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==} + /caniuse-lite@1.0.30001585: + resolution: {integrity: sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==} dev: true /cardinal@2.1.1: @@ -5986,6 +6254,32 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + /chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true + dependencies: + '@types/node': 20.11.16 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + dev: true + + /chromium-edge-launcher@1.0.0: + resolution: {integrity: sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==} + dependencies: + '@types/node': 20.11.16 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + rimraf: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + /chunkd@2.0.1: resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} dev: true @@ -5995,6 +6289,11 @@ packages: engines: {node: '>=8'} dev: true + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + /ci-parallel-vars@1.0.1: resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} dev: true @@ -6079,6 +6378,15 @@ packages: wrap-ansi: 7.0.0 dev: true + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -6168,8 +6476,8 @@ packages: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} dev: true - /compare-versions@3.6.0: - resolution: {integrity: sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==} + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true /component-type@1.2.2: @@ -6234,6 +6542,7 @@ packages: /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + dev: false /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -6253,10 +6562,10 @@ packages: engines: {node: '>= 0.6'} dev: false - /core-js-compat@3.34.0: - resolution: {integrity: sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==} + /core-js-compat@3.35.1: + resolution: {integrity: sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==} dependencies: - browserslist: 4.22.2 + browserslist: 4.22.3 dev: true /cp-file@10.0.0: @@ -6720,8 +7029,8 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - /electron-to-chromium@1.4.615: - resolution: {integrity: sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==} + /electron-to-chromium@1.4.661: + resolution: {integrity: sha512-AFg4wDHSOk5F+zA8aR+SVIOabu7m0e7BiJnigCvPXzIGy731XENw/lmNxTySpVFtkFEy+eyt4oHhh5FF3NjQNw==} dev: true /emittery@1.0.1: @@ -7165,6 +7474,11 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -7556,123 +7870,107 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - /expo-application@5.3.1(expo@49.0.21): - resolution: {integrity: sha512-HR2+K+Hm33vLw/TfbFaHrvUbRRNRco8R+3QaCKy7eJC2LFfT05kZ15ynGaKfB5DJ/oqPV3mxXVR/EfwmE++hoA==} - peerDependencies: - expo: '*' - dependencies: - expo: 49.0.21(@babel/core@7.23.6) - dev: true - - /expo-asset@8.10.1(expo@49.0.21): - resolution: {integrity: sha512-5VMTESxgY9GBsspO/esY25SKEa7RyascVkLe/OcL1WgblNFm7xCCEEUIW8VWS1nHJQGYxpMZPr3bEfjMpdWdyA==} + /expo-asset@9.0.2(expo@50.0.6): + resolution: {integrity: sha512-PzYKME1MgUOoUvwtdzhAyXkjXOXGiSYqGKG/MsXwWr0Ef5wlBaBm2DCO9V6KYbng5tBPFu6hTjoRNil1tBOSow==} dependencies: + '@react-native/assets-registry': 0.73.1 blueimp-md5: 2.19.0 - expo-constants: 14.4.2(expo@49.0.21) - expo-file-system: 15.4.5(expo@49.0.21) + expo-constants: 15.4.5(expo@50.0.6) + expo-file-system: 16.0.6(expo@50.0.6) invariant: 2.2.4 md5-file: 3.2.3 - path-browserify: 1.0.1 - url-parse: 1.5.10 transitivePeerDependencies: - expo - supports-color dev: true - /expo-constants@14.4.2(expo@49.0.21): - resolution: {integrity: sha512-nOB122DOAjk+KrJT69lFQAoYVQGQjFHSigCPVBzVdko9S1xGsfiOH9+X5dygTsZTIlVLpQJDdmZ7ONiv3i+26w==} + /expo-constants@15.4.5(expo@50.0.6): + resolution: {integrity: sha512-1pVVjwk733hbbIjtQcvUFCme540v4gFemdNlaxM2UXKbfRCOh2hzgKN5joHMOysoXQe736TTUrRj7UaZI5Yyhg==} peerDependencies: expo: '*' dependencies: - '@expo/config': 8.1.2 - expo: 49.0.21(@babel/core@7.23.6) - uuid: 3.4.0 + '@expo/config': 8.5.4 + expo: 50.0.6(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21) transitivePeerDependencies: - supports-color dev: true - /expo-file-system@15.4.5(expo@49.0.21): - resolution: {integrity: sha512-xy61KaTaDgXhT/dllwYDHm3ch026EyO8j4eC6wSVr/yE12MMMxAC09yGwy4f7kkOs6ztGVQF5j7ldRzNLN4l0Q==} + /expo-file-system@16.0.6(expo@50.0.6): + resolution: {integrity: sha512-ATCHL7nEg2WwKeamW/SDTR9jBEqM5wncFq594ftKS5QFmhKIrX48d9jyPFGnNq+6h8AGPg4QKh2KCA4OY49L4g==} peerDependencies: expo: '*' dependencies: - expo: 49.0.21(@babel/core@7.23.6) - uuid: 3.4.0 + expo: 50.0.6(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21) dev: true - /expo-font@11.4.0(expo@49.0.21): - resolution: {integrity: sha512-nkmezCFD7gR/I6R+e3/ry18uEfF8uYrr6h+PdBJu+3dawoLOpo+wFb/RG9bHUekU1/cPanR58LR7G5MEMKHR2w==} + /expo-font@11.10.2(expo@50.0.6): + resolution: {integrity: sha512-AE0Q0LiWiVosQ/jlKUPoWoob7p3GwYM2xmLoUkuopO9RYh9NL1hZKHiMKcWBZyDG8Gww1GtBQwh7ZREST8+jjQ==} peerDependencies: expo: '*' dependencies: - expo: 49.0.21(@babel/core@7.23.6) + expo: 50.0.6(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21) fontfaceobserver: 2.3.0 dev: true - /expo-keep-awake@12.3.0(expo@49.0.21): - resolution: {integrity: sha512-ujiJg1p9EdCOYS05jh5PtUrfiZnK0yyLy+UewzqrjUqIT8eAGMQbkfOn3C3fHE7AKd5AefSMzJnS3lYZcZYHDw==} + /expo-keep-awake@12.8.2(expo@50.0.6): + resolution: {integrity: sha512-uiQdGbSX24Pt8nGbnmBtrKq6xL/Tm3+DuDRGBk/3ZE/HlizzNosGRIufIMJ/4B4FRw4dw8KU81h2RLuTjbay6g==} peerDependencies: expo: '*' dependencies: - expo: 49.0.21(@babel/core@7.23.6) + expo: 50.0.6(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21) dev: true - /expo-modules-autolinking@1.5.1: - resolution: {integrity: sha512-yt5a1VCp2BF9CrsO689PCD5oXKP14MMhnOanQMvDn4BDpURYfzAlDVGC5fZrNQKtwn/eq3bcrxIwZ7D9QjVVRg==} + /expo-modules-autolinking@1.10.3: + resolution: {integrity: sha512-pn4n2Dl4iRh/zUeiChjRIe1C7EqOw1qhccr85viQV7W6l5vgRpY0osE51ij5LKg/kJmGRcJfs12+PwbdTplbKw==} hasBin: true dependencies: - '@expo/config': 8.1.2 + '@expo/config': 8.5.4 chalk: 4.1.2 commander: 7.2.0 - fast-glob: 3.3.1 + fast-glob: 3.3.2 find-up: 5.0.0 fs-extra: 9.1.0 transitivePeerDependencies: - supports-color dev: true - /expo-modules-core@1.5.12: - resolution: {integrity: sha512-mY4wTDU458dhwk7IVxLNkePlYXjs9BTgk4NQHBUXf0LapXsvr+i711qPZaFNO4egf5qq6fQV+Yfd/KUguHstnQ==} + /expo-modules-core@1.11.8: + resolution: {integrity: sha512-rlctE3nCNLCGv3LosGQNaTuwGrr2SyQA+hOgci/0l+VRc0gFNtvl0gskph9C0tnN1jzBeb8rRZQYVj5ih1yxcA==} dependencies: - compare-versions: 3.6.0 invariant: 2.2.4 dev: true - /expo-sqlite@13.2.0(expo@49.0.21): + /expo-sqlite@13.2.0(expo@50.0.6): resolution: {integrity: sha512-TYpX+a+2oJOxzChug8+TkIob0lipl7rluCRBGXbGKG68kG4Reb6OCruRiQTJTnbGiEgnN4S+B0cT8f4ZXPUxBg==} peerDependencies: expo: '*' dependencies: '@expo/websql': 1.0.1 - expo: 49.0.21(@babel/core@7.23.6) + expo: 50.0.6(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21) dev: true - /expo@49.0.21(@babel/core@7.23.6): - resolution: {integrity: sha512-JpHL6V0yt8/fzsmkAdPdtsah+lU6Si4ac7MDklLYvzEil7HAFEsN/pf06wQ21ax4C+BL27hI6JJoD34tzXUCJA==} + /expo@50.0.6(@babel/core@7.23.9)(@react-native/babel-preset@0.73.21): + resolution: {integrity: sha512-CVg0h9bmYeTWtw4EOL0HKNL+zu84YZl5nLWRPKrcpt8jox1VQQAYmvJGMdM5gSRxq5CFNLlWGxq9O8Zvfi1SOQ==} hasBin: true dependencies: - '@babel/runtime': 7.22.10 - '@expo/cli': 0.10.16(expo-modules-autolinking@1.5.1) - '@expo/config': 8.1.2 - '@expo/config-plugins': 7.2.5 - '@expo/vector-icons': 13.0.0 - babel-preset-expo: 9.5.2(@babel/core@7.23.6) - expo-application: 5.3.1(expo@49.0.21) - expo-asset: 8.10.1(expo@49.0.21) - expo-constants: 14.4.2(expo@49.0.21) - expo-file-system: 15.4.5(expo@49.0.21) - expo-font: 11.4.0(expo@49.0.21) - expo-keep-awake: 12.3.0(expo@49.0.21) - expo-modules-autolinking: 1.5.1 - expo-modules-core: 1.5.12 + '@babel/runtime': 7.23.9 + '@expo/cli': 0.17.5(@react-native/babel-preset@0.73.21)(expo-modules-autolinking@1.10.3) + '@expo/config': 8.5.4 + '@expo/config-plugins': 7.8.4 + '@expo/metro-config': 0.17.4(@react-native/babel-preset@0.73.21) + '@expo/vector-icons': 14.0.0 + babel-preset-expo: 10.0.1(@babel/core@7.23.9) + expo-asset: 9.0.2(expo@50.0.6) + expo-file-system: 16.0.6(expo@50.0.6) + expo-font: 11.10.2(expo@50.0.6) + expo-keep-awake: 12.8.2(expo@50.0.6) + expo-modules-autolinking: 1.10.3 + expo-modules-core: 1.11.8 fbemitter: 3.0.0 - invariant: 2.2.4 - md5-file: 3.2.3 - node-fetch: 2.7.0 - pretty-format: 26.6.2 - uuid: 3.4.0 + whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: - '@babel/core' + - '@react-native/babel-preset' - bluebird - bufferutil - encoding @@ -7753,6 +8051,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 @@ -7875,12 +8184,13 @@ packages: - supports-color dev: false - /find-babel-config@2.0.0: - resolution: {integrity: sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==} - engines: {node: '>=16.0.0'} + /find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} dependencies: - json5: 2.2.3 - path-exists: 4.0.0 + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 dev: true /find-up@3.0.0: @@ -7936,6 +8246,11 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true + /flow-parser@0.206.0: + resolution: {integrity: sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==} + engines: {node: '>=0.4.0'} + dev: true + /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -8044,7 +8359,7 @@ packages: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: true /fs-minipass@2.1.0: @@ -8067,6 +8382,10 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} @@ -8233,6 +8552,7 @@ packages: /glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} + requiresBuild: true dependencies: inflight: 1.0.6 inherits: 2.0.4 @@ -8287,6 +8607,13 @@ packages: type-fest: 0.20.2 dev: true + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -8411,6 +8738,13 @@ packages: dependencies: function-bind: 1.1.1 + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /heap@0.2.7: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: true @@ -8484,6 +8818,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: false /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} @@ -8504,6 +8839,11 @@ packages: engines: {node: '>= 4'} dev: true + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + /immediate@3.3.0: resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} dev: true @@ -8670,6 +9010,12 @@ packages: has: 1.0.3 dev: true + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -8782,6 +9128,13 @@ packages: engines: {node: '>=12'} dev: true + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + /is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} @@ -8880,6 +9233,11 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + /jackspeak@2.1.0: resolution: {integrity: sha512-DiEwVPqsieUzZBNxQ2cxznmFzfg/AMgJUjYw5xl6rSmCxAQXECcbSdwcLM6Ds6T09+SBfSNCGPhYUoQ96P4h7A==} engines: {node: '>=14'} @@ -8946,6 +9304,36 @@ packages: resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} dev: true + /jscodeshift@0.14.0(@babel/preset-env@7.23.9): + resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.1.6 + dependencies: + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.9) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.9) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.9) + '@babel/preset-env': 7.23.9(@babel/core@7.23.9) + '@babel/preset-flow': 7.23.3(@babel/core@7.23.9) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.9) + '@babel/register': 7.23.7(@babel/core@7.23.9) + babel-core: 7.0.0-bridge.0(@babel/core@7.23.9) + chalk: 4.1.2 + flow-parser: 0.206.0 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + neo-async: 2.6.2 + node-dir: 0.1.17 + recast: 0.21.5 + temp: 0.8.4 + write-file-atomic: 2.4.3 + transitivePeerDependencies: + - supports-color + dev: true + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -8990,7 +9378,7 @@ packages: lodash: 4.17.21 md5: 2.2.1 memory-cache: 0.2.0 - traverse: 0.6.7 + traverse: 0.6.8 valid-url: 1.0.9 dev: true @@ -9057,6 +9445,11 @@ packages: json-buffer: 3.0.1 dev: true + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -9130,6 +9523,15 @@ packages: type-check: 0.4.0 dev: true + /lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + dependencies: + debug: 2.6.9 + marky: 1.2.5 + transitivePeerDependencies: + - supports-color + dev: true + /lightningcss-darwin-arm64@1.19.0: resolution: {integrity: sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==} engines: {node: '>= 12.0.0'} @@ -9356,6 +9758,14 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: true + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -9420,6 +9830,10 @@ packages: hasBin: true dev: true + /marky@1.2.5: + resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + dev: true + /matcher@5.0.0: resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -9464,6 +9878,7 @@ packages: /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + dev: false /mem@9.0.2: resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} @@ -9511,55 +9926,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /metro-react-native-babel-preset@0.76.8(@babel/core@7.23.6): - resolution: {integrity: sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==} - engines: {node: '>=16'} - peerDependencies: - '@babel/core': '*' - dependencies: - '@babel/core': 7.23.6 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.23.6) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.6) - '@babel/plugin-proposal-export-default-from': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.6) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.6) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.6) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.23.6) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.6) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-export-default-from': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.6) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.23.6) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.6) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.6) - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-runtime': 7.23.6(@babel/core@7.23.6) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.6) - '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.6) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.6) - '@babel/template': 7.22.15 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.23.6) - react-refresh: 0.4.3 - transitivePeerDependencies: - - supports-color - dev: true - /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -9582,12 +9948,6 @@ packages: engines: {node: '>=4'} hasBin: true - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true - /mimic-fn@1.2.0: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} @@ -9682,13 +10042,6 @@ packages: minipass: 3.3.6 optional: true - /minipass@3.1.6: - resolution: {integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: true - /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -9811,6 +10164,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} @@ -9821,6 +10180,7 @@ packages: /ncp@2.0.0: resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} hasBin: true + requiresBuild: true dev: true optional: true @@ -9829,6 +10189,10 @@ packages: engines: {node: '>= 0.6'} requiresBuild: true + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + /nested-error-stacks@2.0.1: resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==} dev: true @@ -9854,6 +10218,13 @@ packages: /node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + /node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + dependencies: + minimatch: 3.1.2 + dev: true + /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -10133,6 +10504,14 @@ packages: mimic-fn: 4.0.0 dev: false + /open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -10330,10 +10709,6 @@ packages: cross-spawn: 7.0.3 dev: true - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true - /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -10492,6 +10867,16 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -10505,6 +10890,13 @@ packages: load-json-file: 7.0.1 dev: true + /pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + dev: true + /pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: @@ -10512,13 +10904,6 @@ packages: mlly: 1.3.0 pathe: 1.1.1 - /pkg-up@3.1.0: - resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} - engines: {node: '>=8'} - dependencies: - find-up: 3.0.0 - dev: true - /plist@3.1.0: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} @@ -10569,6 +10954,15 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -10649,16 +11043,6 @@ packages: engines: {node: '>=6'} dev: true - /pretty-format@26.6.2: - resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} - engines: {node: '>= 10'} - dependencies: - '@jest/types': 26.6.2 - ansi-regex: 5.0.1 - ansi-styles: 4.3.0 - react-is: 17.0.2 - dev: true - /pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -10751,6 +11135,11 @@ packages: engines: {node: '>=6'} dev: true + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + /qrcode-terminal@0.11.0: resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==} hasBin: true @@ -10761,10 +11150,7 @@ packages: engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true + dev: false /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -10787,6 +11173,7 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 + dev: false /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} @@ -10804,8 +11191,8 @@ packages: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true - /react-refresh@0.4.3: - resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} dev: true @@ -10850,6 +11237,16 @@ packages: picomatch: 2.3.1 dev: true + /recast@0.21.5: + resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} + engines: {node: '>= 4'} + dependencies: + ast-types: 0.15.2 + esprima: 4.0.1 + source-map: 0.6.1 + tslib: 2.6.2 + dev: true + /recast@0.23.4: resolution: {integrity: sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==} engines: {node: '>= 4'} @@ -10889,10 +11286,14 @@ packages: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} dev: true + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: true + /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.22.10 + '@babel/runtime': 7.23.9 dev: true /regexp-tree@0.1.27: @@ -10957,14 +11358,6 @@ packages: resolve: 1.7.1 dev: true - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true - - /reselect@4.1.8: - resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} - dev: true - /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -10994,6 +11387,11 @@ packages: typescript: 5.2.2(patch_hash=wmhs4olj6eveeldp6si4l46ssq) dev: true + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true @@ -11021,6 +11419,15 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /resolve@1.7.1: resolution: {integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==} dependencies: @@ -11048,11 +11455,19 @@ packages: /rimraf@2.4.5: resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} hasBin: true + requiresBuild: true dependencies: glob: 6.0.4 dev: true optional: true + /rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true @@ -11178,6 +11593,14 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -11201,13 +11624,6 @@ packages: /seq-queue@0.0.5: resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - /serialize-error@6.0.0: - resolution: {integrity: sha512-3vmBkMZLQO+BR4RPHcyRGdE09XCF6cvxzk2N2qn8Er3F91cy8Qt7VvEbZBOpaL53qsBbe2cFOefU6tRY6WDelA==} - engines: {node: '>=10'} - dependencies: - type-fest: 0.12.0 - dev: true - /serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} @@ -11231,7 +11647,6 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color - dev: false /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -11247,6 +11662,13 @@ packages: /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -11510,6 +11932,13 @@ packages: /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + /stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + dependencies: + type-fest: 0.7.1 + dev: true + /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -11764,6 +12193,18 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + /tarn@3.0.2: resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} engines: {node: '>=8.0.0'} @@ -11784,6 +12225,13 @@ packages: engines: {node: '>=14.16'} dev: true + /temp@0.8.4: + resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} + engines: {node: '>=6.0.0'} + dependencies: + rimraf: 2.6.3 + dev: true + /tempy@0.3.0: resolution: {integrity: sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==} engines: {node: '>=8'} @@ -11921,8 +12369,9 @@ packages: punycode: 2.3.0 dev: true - /traverse@0.6.7: - resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} + /traverse@0.6.8: + resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} + engines: {node: '>= 0.4'} dev: true /tree-kill@1.2.2: @@ -11948,7 +12397,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /tsconfck@2.1.1: + /tsconfck@2.1.1(typescript@5.2.2): resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} engines: {node: ^14.13.1 || ^16 || >=18} hasBin: true @@ -11957,6 +12406,8 @@ packages: peerDependenciesMeta: typescript: optional: true + dependencies: + typescript: 5.2.2(patch_hash=wmhs4olj6eveeldp6si4l46ssq) dev: true /tsconfig-paths@3.14.2: @@ -12129,11 +12580,6 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - /type-fest@0.12.0: - resolution: {integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==} - engines: {node: '>=10'} - dev: true - /type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -12164,6 +12610,11 @@ packages: engines: {node: '>=8'} dev: true + /type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + dev: true + /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} @@ -12180,6 +12631,7 @@ packages: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 + dev: false /type@1.2.0: resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} @@ -12234,6 +12686,12 @@ packages: dev: true patched: true + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /ua-parser-js@1.0.37: resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} dev: true @@ -12332,18 +12790,23 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - /update-browserslist-db@1.0.13(browserslist@4.22.2): + /update-browserslist-db@1.0.13(browserslist@4.22.3): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.22.2 - escalade: 3.1.1 + browserslist: 4.22.3 + escalade: 3.1.2 picocolors: 1.0.0 dev: true @@ -12357,13 +12820,6 @@ packages: resolution: {integrity: sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==} dev: true - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true - /urlpattern-polyfill@4.0.3: resolution: {integrity: sha512-DOE84vZT2fEcl9gqCUTcnAw5ZY5Id55ikUcziSUntuEFL3pRvavg5kwDmTEUJkeCHInTlV/HexFomgYnzO5kdQ==} dev: false @@ -12392,12 +12848,6 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - /uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: true - /uuid@7.0.3: resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} hasBin: true @@ -12504,23 +12954,7 @@ packages: - terser dev: true - /vite-tsconfig-paths@4.2.0: - resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true - dependencies: - debug: 4.3.4 - globrex: 0.1.2 - tsconfck: 2.1.1 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /vite-tsconfig-paths@4.2.0(vite@4.3.9): + /vite-tsconfig-paths@4.2.0(typescript@5.2.2)(vite@4.3.9): resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} peerDependencies: vite: '*' @@ -12530,7 +12964,7 @@ packages: dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 2.1.1 + tsconfck: 2.1.1(typescript@5.2.2) vite: 4.3.9(@types/node@20.2.5) transitivePeerDependencies: - supports-color @@ -12635,71 +13069,6 @@ packages: optionalDependencies: fsevents: 2.3.3 - /vitest@0.31.4: - resolution: {integrity: sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ==} - engines: {node: '>=v14.18.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.5 - '@types/chai-subset': 1.3.3 - '@types/node': 20.8.7 - '@vitest/expect': 0.31.4 - '@vitest/runner': 0.31.4 - '@vitest/snapshot': 0.31.4 - '@vitest/spy': 0.31.4 - '@vitest/utils': 0.31.4 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - concordance: 5.0.4 - debug: 4.3.4 - local-pkg: 0.4.3 - magic-string: 0.30.0 - pathe: 1.1.1 - picocolors: 1.0.0 - std-env: 3.3.3 - strip-literal: 1.0.1 - tinybench: 2.5.0 - tinypool: 0.5.0 - vite: 4.3.9(@types/node@20.8.7) - vite-node: 0.31.4(@types/node@20.8.7) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - /vitest@0.31.4(@vitest/ui@0.31.4): resolution: {integrity: sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ==} engines: {node: '>=v14.18.0'} @@ -12847,6 +13216,11 @@ packages: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: true + /webpod@0.0.2: resolution: {integrity: sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg==} hasBin: true @@ -12856,6 +13230,15 @@ packages: resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} engines: {node: '>=6'} + /whatwg-url-without-unicode@8.0.0-3: + resolution: {integrity: sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==} + engines: {node: '>=10'} + dependencies: + buffer: 5.7.1 + punycode: 2.3.1 + webidl-conversions: 5.0.0 + dev: true + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -12994,6 +13377,19 @@ packages: bufferutil: 4.0.7 utf-8-validate: 6.0.3 + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /xcode@3.0.1: resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==} engines: {node: '>=10.0.0'}