diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c2b860528..aa3a897da 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -56,6 +56,26 @@ jobs: --health-timeout 5s --health-retries 10 + oracle: + image: gvenzl/oracle-free:23.9-faststart + + # Provide passwords and other environment variables to container + env: + ORACLE_RANDOM_PASSWORD: 'true' + APP_USER: dbml_test + APP_USER_PASSWORD: test + + # Forward Oracle port + ports: + - 1521:1521 + + # Provide healthcheck script options for startup + options: >- + --health-cmd healthcheck.sh + --health-interval 10s + --health-timeout 5s + --health-retries 10 + steps: - uses: actions/checkout@v3 - name: Import DDL to Postgres @@ -69,6 +89,17 @@ jobs: - name: Import DDL to MSSQL run: | sqlcmd -S localhost -U sa -P dbml.123.123 -d master -i packages/dbml-cli/__test__/db2dbml/mssql/schema.sql + # This step will install `sqlplus` command + - name: Setup Oracle Instant Client + uses: iamazeem/setup-oracle-instant-client-action@v2 + - name: Import DDL to Oracle + run: | + sqlplus -s dbml_test/test@localhost:1521/FREEPDB1 schema.sql + working-directory: packages/dbml-cli/__test__/db2dbml/oracle/ + - name: Generate SQLite database from schema + run: | + sqlite3 schema.db < schema.sql + working-directory: packages/dbml-cli/__test__/db2dbml/sqlite/ - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: diff --git a/packages/dbml-cli/__test__/db2dbml/oracle/expect-out-files/schema.dbml b/packages/dbml-cli/__test__/db2dbml/oracle/expect-out-files/schema.dbml new file mode 100644 index 000000000..5ae8acbea --- /dev/null +++ b/packages/dbml-cli/__test__/db2dbml/oracle/expect-out-files/schema.dbml @@ -0,0 +1,39 @@ +Table "TEST"."category" { + "cat_id" NUMBER [pk, not null, increment] + "cat_name" NVARCHAR2(100) [not null] + "super_cat_id" NUMBER + "created_date" TIMESTAMP(6) [default: `current_timestamp`] + Note: 'Category is stored as tree like structure' +} + +Table "TEST"."product" { + "product_id" NUMBER [pk, not null, increment] + "product_name" NVARCHAR2(510) [not null] + "current_price" FLOAT [not null] + "cat_id" NUMBER [not null] + "is_sold" NUMBER(1) + "created_date" TIMESTAMP(6) [default: `current_timestamp`] + "is_allow_all" NUMBER(1) +} + +Table "TEST"."user" { + "user_id" NUMBER [pk, not null, increment] + "username" VARCHAR2(40) [unique, not null] + "password" VARCHAR2(255) [not null] + "email" NVARCHAR2(80) [unique, not null] + "role" NUMBER [default: 0] + "created_date" TIMESTAMP(6) [default: `current_timestamp`] +} + +Table "TEST"."wishlist" { + "user_id" NUMBER [pk, not null] + "product_id" NUMBER [pk, not null] +} + +Ref "FK_CATEGORY_SUPER":"TEST"."category"."cat_id" < "TEST"."category"."super_cat_id" + +Ref "FK_PRODUCT_CATEGORY":"TEST"."category"."cat_id" < "TEST"."product"."cat_id" + +Ref "FK_WISHLIST_PRODUCT":"TEST"."product"."product_id" < "TEST"."wishlist"."product_id" + +Ref "FK_WISHLIST_USER":"TEST"."user"."user_id" < "TEST"."wishlist"."user_id" diff --git a/packages/dbml-cli/__test__/db2dbml/oracle/options.json b/packages/dbml-cli/__test__/db2dbml/oracle/options.json new file mode 100644 index 000000000..15b024848 --- /dev/null +++ b/packages/dbml-cli/__test__/db2dbml/oracle/options.json @@ -0,0 +1,8 @@ +{ + "args": [ + "oracle", + "dbml_test/test@localhost:1521/FREEPDB1", + "-o", + "./out-files/schema.dbml" + ] +} diff --git a/packages/dbml-cli/__test__/db2dbml/oracle/schema.sql b/packages/dbml-cli/__test__/db2dbml/oracle/schema.sql new file mode 100644 index 000000000..e651e9f07 --- /dev/null +++ b/packages/dbml-cli/__test__/db2dbml/oracle/schema.sql @@ -0,0 +1,45 @@ +CREATE TABLE "user" ( + "user_id" int GENERATED AS IDENTITY PRIMARY KEY, + "username" varchar2(40) UNIQUE NOT NULL, + "password" varchar2(255) NOT NULL, + "email" nvarchar2(40) UNIQUE NOT NULL, + "role" integer DEFAULT 0, + "created_date" timestamp DEFAULT current_timestamp +); + +CREATE TABLE "category" ( + "cat_id" int GENERATED AS IDENTITY PRIMARY KEY, + "cat_name" nvarchar2(50) NOT NULL, + "super_cat_id" int, + "created_date" timestamp DEFAULT current_timestamp +); + +CREATE TABLE "product" ( + "product_id" int GENERATED AS IDENTITY PRIMARY KEY, + "product_name" nvarchar2(255) NOT NULL, + "current_price" float NOT NULL, + "cat_id" int NOT NULL, + "is_sold" number(1), + "created_date" timestamp DEFAULT current_timestamp, + "is_allow_all" number(1) +); + +CREATE TABLE "wishlist" ( + "user_id" int NOT NULL, + "product_id" int NOT NULL, + PRIMARY KEY ("user_id", "product_id") +); + +CREATE INDEX "FULLTEXT_INDEX_CATEGORY" ON "category" ("cat_name"); + +CREATE INDEX "FULLTEXT_INDEX_PRODUCT" ON "product" ("product_name"); + +COMMENT ON TABLE "category" IS 'Category is stored as tree like structure'; + +ALTER TABLE "category" ADD CONSTRAINT "FK_CATEGORY_SUPER" FOREIGN KEY ("super_cat_id") REFERENCES "category" ("cat_id"); + +ALTER TABLE "product" ADD CONSTRAINT "FK_PRODUCT_CATEGORY" FOREIGN KEY ("cat_id") REFERENCES "category" ("cat_id"); + +ALTER TABLE "wishlist" ADD CONSTRAINT "FK_WISHLIST_PRODUCT" FOREIGN KEY ("product_id") REFERENCES "product" ("product_id"); + +ALTER TABLE "wishlist" ADD CONSTRAINT "FK_WISHLIST_USER" FOREIGN KEY ("user_id") REFERENCES "user" ("user_id"); diff --git a/packages/dbml-cli/__test__/db2dbml/oracle/stdout.txt b/packages/dbml-cli/__test__/db2dbml/oracle/stdout.txt new file mode 100644 index 000000000..299529a8b --- /dev/null +++ b/packages/dbml-cli/__test__/db2dbml/oracle/stdout.txt @@ -0,0 +1 @@ + ✔ Generated DBML file from database's connection: schema.dbml diff --git a/packages/dbml-cli/__test__/db2dbml/sqlite/expect-out-files/schema.dbml b/packages/dbml-cli/__test__/db2dbml/sqlite/expect-out-files/schema.dbml new file mode 100644 index 000000000..b61dea6d8 --- /dev/null +++ b/packages/dbml-cli/__test__/db2dbml/sqlite/expect-out-files/schema.dbml @@ -0,0 +1,108 @@ +Table "main"."Customers" { + "customer_id" INTEGER [pk, increment] + "first_name" VARCHAR(50) [not null] + "last_name" VARCHAR(50) [not null] + "gender" STRING + "household_income" INTEGER + "birthdate" DATE [not null] + "phone_number" INTEGER [not null] + "email" VARCHAR(128) +} + +Table "main"."Car_Vins" { + "vin" INTEGER [pk, increment] + "model_id" INTEGER [not null] + "option_set_id" INTEGER [not null] + "manufactured_date" DATE [not null] + "manufactured_plant_id" INTEGER [not null] +} + +Table "main"."Car_Options" { + "option_set_id" INTEGER [pk, increment] + "model_id" INTEGER + "engine_id" INTEGER [not null] + "transmission_id" INTEGER [not null] + "chassis_id" INTEGER [not null] + "premium_sound_id" INTEGER + "color" VARCHAR(30) [not null] + "option_set_price" INTEGER [not null] +} + +Table "main"."Car_Parts" { + "part_id" INTEGER [pk, increment] + "part_name" VARCHAR(100) [not null] + "manufacture_plant_id" INTEGER [not null] + "manufacture_start_date" DATE [not null] + "manufacture_end_date" DATE + "part_recall" INTEGER [default: 0] +} + +Table "main"."Brands" { + "brand_id" INTEGER [pk, increment] + "brand_name" VARCHAR(50) [not null] +} + +Table "main"."Models" { + "model_id" INTEGER [pk, increment] + "model_name" VARCHAR(50) [not null] + "model_base_price" INTEGER [not null] + "brand_id" INTEGER [not null] +} + +Table "main"."Customer_Ownership" { + "customer_id" INTEGER [pk, not null, increment] + "vin" INTEGER [not null] + "purchase_date" DATE [not null] + "purchase_price" INTEGER [not null] + "warantee_expire_date" DATE + "dealer_id" INTEGER [not null] +} + +Table "main"."Manufacture_Plant" { + "manufacture_plant_id" INTEGER [pk, increment] + "plant_name" VARCHAR(50) [not null] + "plant_type" "VARCHAR (7)" + "plant_location" VARCHAR(100) + "company_owned" INTEGER +} + +Table "main"."Dealers" { + "dealer_id" INTEGER [pk, increment] + "dealer_name" VARCHAR(50) [not null] + "dealer_address" VARCHAR(100) +} + +Table "main"."Dealer_Brand" { + "dealer_id" INTEGER [pk, not null, increment] + "brand_id" INTEGER [not null] +} + +Ref "fk_Car_Vins_0":"main"."Car_Options"."option_set_id" < "main"."Car_Vins"."option_set_id" + +Ref "fk_Car_Vins_1":"main"."Manufacture_Plant"."manufacture_plant_id" < "main"."Car_Vins"."manufactured_plant_id" + +Ref "fk_Car_Vins_2":"main"."Models"."model_id" < "main"."Car_Vins"."model_id" + +Ref "fk_Car_Options_0":"main"."Car_Parts"."part_id" < "main"."Car_Options"."chassis_id" + +Ref "fk_Car_Options_1":"main"."Car_Parts"."part_id" < "main"."Car_Options"."transmission_id" + +Ref "fk_Car_Options_2":"main"."Car_Parts"."part_id" < "main"."Car_Options"."premium_sound_id" + +Ref "fk_Car_Options_3":"main"."Car_Parts"."part_id" < "main"."Car_Options"."engine_id" + +Ref "fk_Car_Options_4":"main"."Models"."model_id" < "main"."Car_Options"."model_id" + +Ref "fk_Car_Parts_0":"main"."Manufacture_Plant"."manufacture_plant_id" < "main"."Car_Parts"."manufacture_plant_id" + +Ref "fk_Models_0":"main"."Brands"."brand_id" < "main"."Models"."brand_id" + +Ref "fk_Customer_Ownership_0":"main"."Dealers"."dealer_id" < "main"."Customer_Ownership"."dealer_id" + +Ref "fk_Customer_Ownership_1":"main"."Car_Vins"."vin" < "main"."Customer_Ownership"."vin" + +Ref "fk_Customer_Ownership_2":"main"."Customers"."customer_id" < "main"."Customer_Ownership"."customer_id" + +Ref "fk_Dealer_Brand_0":"main"."Brands"."brand_id" < "main"."Dealer_Brand"."brand_id" + +Ref "fk_Dealer_Brand_1":"main"."Dealers"."dealer_id" < "main"."Dealer_Brand"."dealer_id" diff --git a/packages/dbml-cli/__test__/db2dbml/sqlite/options.json b/packages/dbml-cli/__test__/db2dbml/sqlite/options.json new file mode 100644 index 000000000..ae44fcd35 --- /dev/null +++ b/packages/dbml-cli/__test__/db2dbml/sqlite/options.json @@ -0,0 +1,8 @@ +{ + "args": [ + "sqlite", + "schema.db", + "-o", + "./out-files/schema.dbml" + ] +} diff --git a/packages/dbml-cli/__test__/db2dbml/sqlite/schema.sql b/packages/dbml-cli/__test__/db2dbml/sqlite/schema.sql new file mode 100644 index 000000000..b32c58bd3 --- /dev/null +++ b/packages/dbml-cli/__test__/db2dbml/sqlite/schema.sql @@ -0,0 +1,96 @@ +-- src: https://github.com/dtaivpp/car_company_database/blob/master/Create_Tables.sql +Create Table Customers( + customer_id INTEGER PRIMARY KEY AUTOINCREMENT, + first_name VARCHAR(50) NOT NULL, + last_name VARCHAR(50) NOT NULL, + gender STRING CHECK(gender = "Male" or gender = "Female"), + household_income INTEGER, + birthdate DATE NOT NULL, + phone_number INTEGER NOT NULL, + email VARCHAR(128) +); + +Create Table Car_Vins( + vin INTEGER PRIMARY KEY AUTOINCREMENT, + model_id INTEGER NOT NULL, + option_set_id INTEGER NOT NULL, + manufactured_date DATE NOT NULL, + manufactured_plant_id INTEGER NOT NULL, + FOREIGN KEY (model_id) REFERENCES Models(model_id), + FOREIGN KEY (manufactured_plant_id) REFERENCES Manufacture_Plant(manufacture_plant_id), + FOREIGN KEY (option_set_id) REFERENCES Car_Options(option_set_id) +); + +Create Table Car_Options( + option_set_id INTEGER PRIMARY KEY AUTOINCREMENT, + model_id INTEGER NULL, + engine_id INTEGER NOT NULL, + transmission_id INTEGER NOT NULL, + chassis_id INTEGER NOT NULL, + premium_sound_id INTEGER, + color VARCHAR(30) NOT NULL, + option_set_price INTEGER NOT NUll, + FOREIGN KEY (model_id) REFERENCES Models(model_id), + FOREIGN KEY (engine_id) REFERENCES Car_Parts(part_id), + FOREIGN KEY (premium_sound_id) REFERENCES Car_Parts(part_id), + FOREIGN KEY (transmission_id) REFERENCES Car_Parts(part_id), + FOREIGN KEY (chassis_id) REFERENCES Car_Parts(part_id) +); + +Create Table Car_Parts( + part_id INTEGER PRIMARY KEY AUTOINCREMENT, + part_name VARCHAR(100) NOT NULL, + manufacture_plant_id INTEGER NOT NULL, + manufacture_start_date DATE NOT NUll, + manufacture_end_date DATE, + part_recall INTEGER DEFAULT 0 CHECK (part_recall = 0 or part_recall = 1), + FOREIGN KEY (manufacture_plant_id) REFERENCES Manufacture_Plant(manufacture_plant_id) +); + +Create Table Brands( + brand_id INTEGER PRIMARY KEY AUTOINCREMENT, + brand_name VARCHAR(50) NOT NUll +); + +Create Table Models( + model_id INTEGER PRIMARY KEY AUTOINCREMENT, + model_name VARCHAR(50) NOT NULL, + model_base_price INTEGER NOT NULL, + brand_id INTEGER NOT NULL, + FOREIGN KEY (brand_id) REFERENCES Brands(brand_id) +); + +Create Table Customer_Ownership( + customer_id INTEGER NOT NULL, + vin INTEGER NOT NULL, + purchase_date DATE NOT NULL, + purchase_price INTEGER NOT NULL, + warantee_expire_date DATE, + dealer_id INTEGER NOT NULL, + FOREIGN KEY (customer_id) REFERENCES Customers(customer_id), + FOREIGN KEY (vin) REFERENCES Car_Vins(vin), + FOREIGN KEY (dealer_id) REFERENCES Dealers(dealer_id) + PRIMARY KEY (customer_id, vin) +); + +Create Table Manufacture_Plant( + manufacture_plant_id INTEGER PRIMARY KEY AUTOINCREMENT, + plant_name VARCHAR(50) NOT NULL, + plant_type VARCHAR (7) CHECK (plant_type="Assembly" or plant_type="Parts"), + plant_location VARCHAR(100), + company_owned INTEGER CHECK(company_owned=0 or company_owned=1) +); + +Create Table Dealers ( + dealer_id INTEGER PRIMARY KEY AUTOINCREMENT, + dealer_name VARCHAR(50) NOT NULL, + dealer_address VARCHAR(100) +); + +Create Table Dealer_Brand( + dealer_id INTEGER NOT NULL, + brand_id INTEGER NOT NULL, + FOREIGN KEY (dealer_id) REFERENCES Dealers(dealer_id), + FOREIGN KEY (brand_id) REFERENCES Brands(brand_id), + PRIMARY KEY (dealer_id, brand_id) +); \ No newline at end of file diff --git a/packages/dbml-cli/__test__/db2dbml/sqlite/stdout.txt b/packages/dbml-cli/__test__/db2dbml/sqlite/stdout.txt new file mode 100644 index 000000000..299529a8b --- /dev/null +++ b/packages/dbml-cli/__test__/db2dbml/sqlite/stdout.txt @@ -0,0 +1 @@ + ✔ Generated DBML file from database's connection: schema.dbml diff --git a/packages/dbml-cli/src/cli/index.js b/packages/dbml-cli/src/cli/index.js index 3d9e24b5e..c2702441d 100644 --- a/packages/dbml-cli/src/cli/index.js +++ b/packages/dbml-cli/src/cli/index.js @@ -50,7 +50,7 @@ function sql2dbml (args) { function db2dbml (args) { program.version(projectInfo.version); - + // TODO: Update description to add `oracle` and `sqlite` const description = `Generate DBML directly from a database your database format (postgres, mysql, mssql, snowflake, bigquery) your database connection string: diff --git a/packages/dbml-cli/src/cli/utils.js b/packages/dbml-cli/src/cli/utils.js index 1726c82a4..035ab613a 100644 --- a/packages/dbml-cli/src/cli/utils.js +++ b/packages/dbml-cli/src/cli/utils.js @@ -34,15 +34,26 @@ function getFormatOpt (opts) { } function getConnectionOpt (args) { - const supportedDatabases = ['postgres', 'mysql', 'mssql', 'snowflake', 'bigquery']; + const supportedDatabases = ['postgres', 'mysql', 'mssql', 'snowflake', 'bigquery', 'sqlite', 'oracle']; const defaultConnectionOpt = { connection: args[0], databaseType: 'unknown', }; - return reduce(args, (connectionOpt, arg) => { + return reduce(args, (connectionOpt, arg, idx) => { if (supportedDatabases.includes(arg)) connectionOpt.databaseType = arg; + if (connectionOpt.databaseType === 'sqlite' && idx === 1) { + connectionOpt.connection = arg; + return connectionOpt; + } // Check if the arg is a connection string using regex + const oracleConnectionRegex = /^.*?\/.*@.*$/; + if (connectionOpt.databaseType === 'oracle' && oracleConnectionRegex.test(arg)) { + // Example: user/password@localhost:1521/service_name + connectionOpt.connection = arg; + return connectionOpt; + } + const connectionStringRegex = /^.*[:;]/; if (connectionStringRegex.test(arg)) { // Example: jdbc:mysql://localhost:3306/mydatabase @@ -68,7 +79,11 @@ function generate (inputPaths, transform, outputPlugin) { const content = transform(source); outputPlugin.write(content); } catch (e) { - if (e instanceof CompilerError) throw e.map((diag) => ({ ...diag, message: diag.message, filepath: path.basename(_path), stack: diag.stack })); + if (e instanceof CompilerError) { + throw e.map((diag) => ({ + ...diag, message: diag.message, filepath: path.basename(_path), stack: diag.stack, + })); + } throw e; } }); diff --git a/packages/dbml-connector/package.json b/packages/dbml-connector/package.json index 60723916c..f82f9e9d6 100644 --- a/packages/dbml-connector/package.json +++ b/packages/dbml-connector/package.json @@ -15,10 +15,12 @@ "@babel/preset-env": "^7.21.4", "@babel/preset-typescript": "^7.24.7", "@babel/runtime": "^7.21.0", + "@types/better-sqlite3": "^7.6.13", "@types/jest": "^29.5.12", "@types/lodash": "^4.17.16", "@types/mssql": "^9.1.5", "@types/node": "^22.2.0", + "@types/oracledb": "^6.9.0", "@types/pg": "^8.11.6", "babel-jest": "^29.5.0", "jest": "^29.7.0", @@ -35,9 +37,11 @@ "@google-cloud/bigquery": "^7.9.0", "@typescript-eslint/eslint-plugin": "^8.30.1", "@typescript-eslint/parser": "^8.30.1", + "better-sqlite3": "^12.2.0", "lodash": "^4.17.21", "mssql": "^11.0.1", "mysql2": "^3.11.0", + "oracledb": "^6.9.0", "pg": "^8.12.0", "snowflake-sdk": "^2.0.3" }, diff --git a/packages/dbml-connector/src/connectors/connector.ts b/packages/dbml-connector/src/connectors/connector.ts index 6434f0214..4c85997b5 100644 --- a/packages/dbml-connector/src/connectors/connector.ts +++ b/packages/dbml-connector/src/connectors/connector.ts @@ -4,6 +4,8 @@ import { fetchSchemaJson as fetchMssqlSchemaJson } from './mssqlConnector'; import { fetchSchemaJson as fetchMysqlSchemaJson } from './mysqlConnector'; import { fetchSchemaJson as fetchSnowflakeSchemaJson } from './snowflakeConnector'; import { fetchSchemaJson as fetchBigQuerySchemaJson } from './bigqueryConnector'; +import { fetchSchemaJson as fetchSqliteSchemaJson } from './sqliteConnector'; +import { fetchSchemaJson as fetchOracleSchemaJson } from './oracleConnector'; const fetchSchemaJson = async (connection: string, databaseType: string): Promise => { switch (databaseType) { @@ -17,6 +19,10 @@ const fetchSchemaJson = async (connection: string, databaseType: string): Promis return fetchSnowflakeSchemaJson(connection); case 'bigquery': return fetchBigQuerySchemaJson(connection); + case 'sqlite': + return fetchSqliteSchemaJson(connection); + case 'oracle': + return fetchOracleSchemaJson(connection); default: throw new Error(`Unsupported database type: ${databaseType}`); } diff --git a/packages/dbml-connector/src/connectors/oracleConnector.ts b/packages/dbml-connector/src/connectors/oracleConnector.ts new file mode 100644 index 000000000..91470ec40 --- /dev/null +++ b/packages/dbml-connector/src/connectors/oracleConnector.ts @@ -0,0 +1,481 @@ +import * as oracledb from 'oracledb'; +import { + DefaultInfo, + DatabaseSchema, + DefaultType, + Field, + IndexColumn, + FieldsDictionary, + Table, + Enum, + IndexesDictionary, + TableConstraintsDictionary, + Ref, + TypeInfo, +} from './types'; +import { getEnumValues } from './sqliteConnector'; + +async function connectOracle (connection: string): Promise { + // Parse connection string to extract connection details + // Expected format: user/password@hostname/servicename + const regex = /^(.*?)\/(.*)@(.*)$/; + const match = connection.match(regex); + + if (!match) { + throw new Error('Invalid Oracle connection string format. Expected: user/password@hostname/servicename'); + } + + const [, user, password, connectionString] = match; + + // Set connection options + const connectionConfig: oracledb.ConnectionAttributes = { + user, + password, + connectString: connectionString, + }; + + // Connect to Oracle database + return oracledb.getConnection(connectionConfig); +} + +function getDbDefault (columnDefault: string | null, defaultValueType: DefaultType): DefaultInfo | null { + if (columnDefault === null) { + return null; + } + + return { + type: defaultValueType, + value: columnDefault, + }; +} + +function getFieldType (dataType: string, dataLength: number | null, dataPrecision: number | null, dataScale: number | null): TypeInfo { + let typeName = dataType; + + // Add precision and scale for numeric types + if (dataType === 'NUMBER' && dataPrecision !== null) { + if (dataScale !== null && dataScale > 0) { + typeName = `${dataType}(${dataPrecision},${dataScale})`; + } else { + typeName = `${dataType}(${dataPrecision})`; + } + } + + // Add length for character types + if ((['VARCHAR2', 'CHAR', 'NCHAR', 'NVARCHAR2', 'RAW'].includes(dataType)) && dataLength !== null) { + typeName = `${dataType}(${dataLength})`; + } + + return { + type_name: typeName, + schemaName: null, + }; +} + +function determineDefaultValueType (dataDefault: string): DefaultType { + if (dataDefault.startsWith("'") && dataDefault.endsWith("'")) { + return 'string'; + } + + if (dataDefault === 'true' || dataDefault === 'false') { + return 'boolean'; + } + + if (!Number.isNaN(dataDefault)) { + return 'number'; + } + + return 'expression'; +} + +function generateField (row: any, tableName: string, columnsWithEnum: { [key: string]: Enum }): Field { + const { + COLUMN_NAME, + DATA_TYPE, + DATA_LENGTH, + DATA_PRECISION, + DATA_SCALE, + NULLABLE, + DATA_DEFAULT, + IDENTITY_COLUMN, + COLUMN_COMMENT, + } = row; + + const defaultValueType: DefaultType = DATA_DEFAULT ? determineDefaultValueType(DATA_DEFAULT) : 'expression'; + + // Either Oracle type or an Enum type + let actualType = getFieldType(DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE); + + const key = `${tableName}.${COLUMN_NAME}`; + if (columnsWithEnum[key]) { + actualType = { + type_name: columnsWithEnum[key].name, + schemaName: columnsWithEnum[key].schemaName, + }; + } + + return { + name: COLUMN_NAME, + type: actualType, + dbdefault: getDbDefault(DATA_DEFAULT, defaultValueType), + not_null: NULLABLE === 'N', + increment: IDENTITY_COLUMN === 'YES', + note: COLUMN_COMMENT ? { value: COLUMN_COMMENT } : { value: '' }, + }; +} + +async function generateTablesAndFields (client: oracledb.Connection, schemaName: string, columnsWithEnum: { [key: string]: Enum }): + Promise<{ tableList: Table[]; fieldMap: FieldsDictionary }> { + // Query to get all tables in the schema with comments + const tableQuery = ` + SELECT + T.TABLE_NAME, + C.COMMENTS AS TABLE_COMMENT + FROM ALL_TABLES T + LEFT JOIN ALL_TAB_COMMENTS C ON T.OWNER = C.OWNER AND T.TABLE_NAME = C.TABLE_NAME + WHERE T.OWNER = :schemaName + ORDER BY T.TABLE_NAME + `; + + const tableResult = await client.execute(tableQuery, { schemaName }, { outFormat: oracledb.OUT_FORMAT_OBJECT }); + const tables = tableResult.rows || []; + + const tableList: Table[] = []; + const fieldMap: FieldsDictionary = {}; + + // Process each table + for (const table of tables) { + const tableName = (table as any).TABLE_NAME; + const tableComment = (table as any).TABLE_COMMENT; + + tableList.push({ + name: tableName, + schemaName, + note: tableComment ? { value: tableComment } : { value: '' }, + }); + + // Query to get all columns for the table with comments + const columnQuery = ` + SELECT + C.COLUMN_NAME, + C.DATA_TYPE, + C.DATA_LENGTH, + C.DATA_PRECISION, + C.DATA_SCALE, + C.NULLABLE, + C.DATA_DEFAULT, + CASE WHEN C.IDENTITY_COLUMN = 'YES' THEN 'YES' ELSE 'NO' END AS IDENTITY_COLUMN, + CC.COMMENTS AS COLUMN_COMMENT + FROM ALL_TAB_COLUMNS C + LEFT JOIN ALL_COL_COMMENTS CC ON C.OWNER = CC.OWNER AND C.TABLE_NAME = CC.TABLE_NAME AND C.COLUMN_NAME = CC.COLUMN_NAME + WHERE C.OWNER = :schemaName AND C.TABLE_NAME = :tableName + ORDER BY C.COLUMN_ID + `; + + const columnResult = await client.execute(columnQuery, { schemaName, tableName }, { outFormat: oracledb.OUT_FORMAT_OBJECT }); + const columns = columnResult.rows || []; + + fieldMap[`${schemaName}.${tableName}`] = columns.map(row => generateField(row, tableName, columnsWithEnum)); + } + + return { tableList, fieldMap }; +} + +async function generateIndexes (client: oracledb.Connection, schemaName: string): Promise { + const indexMap: IndexesDictionary = {}; + + // Query to get all indexes in the schema + const indexQuery = ` + SELECT + I.TABLE_NAME, + I.INDEX_NAME, + I.INDEX_TYPE, + I.UNIQUENESS, + IC.COLUMN_NAME, + IC.COLUMN_POSITION + FROM ALL_INDEXES I + JOIN ALL_IND_COLUMNS IC ON I.INDEX_NAME = IC.INDEX_NAME AND I.OWNER = IC.INDEX_OWNER + WHERE I.OWNER = :schemaName + ORDER BY I.TABLE_NAME, I.INDEX_NAME, IC.COLUMN_POSITION + `; + + const indexResult = await client.execute(indexQuery, { schemaName }, { outFormat: oracledb.OUT_FORMAT_OBJECT }); + const indexRows = indexResult.rows || []; + + // Group indexes by table + const indexesByTable: Record> = {}; + + for (const row of indexRows) { + const { + TABLE_NAME, INDEX_NAME, INDEX_TYPE, UNIQUENESS, COLUMN_NAME, + } = row as any; + + if (!indexesByTable[TABLE_NAME]) { + indexesByTable[TABLE_NAME] = {}; + } + + if (!indexesByTable[TABLE_NAME][INDEX_NAME]) { + indexesByTable[TABLE_NAME][INDEX_NAME] = { + unique: UNIQUENESS === 'UNIQUE', + type: INDEX_TYPE, + columns: [], + }; + } + + indexesByTable[TABLE_NAME][INDEX_NAME].columns.push({ + type: 'column', + value: COLUMN_NAME, + }); + } + + // Convert to the expected format + for (const tableName in indexesByTable) { + const tableKey = `${schemaName}.${tableName}`; + indexMap[tableKey] = []; + + for (const indexName in indexesByTable[tableName]) { + const { unique, type, columns } = indexesByTable[tableName][indexName]; + + indexMap[tableKey].push({ + name: indexName, + type, + unique, + columns, + }); + } + + // Remove empty arrays + if (indexMap[tableKey].length === 0) { + delete indexMap[tableKey]; + } + } + + return indexMap; +} + +async function generatePrimaryKeys (client: oracledb.Connection, schemaName: string): Promise { + const constraintMap: TableConstraintsDictionary = {}; + + // Query to get all primary key constraints + const pkQuery = ` + SELECT + CON.TABLE_NAME, + COL.COLUMN_NAME + FROM ALL_CONSTRAINTS CON + JOIN ALL_CONS_COLUMNS COL ON CON.CONSTRAINT_NAME = COL.CONSTRAINT_NAME AND CON.OWNER = COL.OWNER + WHERE CON.CONSTRAINT_TYPE = 'P' AND CON.OWNER = :schemaName + ORDER BY CON.TABLE_NAME, COL.POSITION + `; + + const pkResult = await client.execute(pkQuery, { schemaName }, { outFormat: oracledb.OUT_FORMAT_OBJECT }); + const pkRows = pkResult.rows || []; + + // Group primary keys by table + for (const row of pkRows) { + const { TABLE_NAME, COLUMN_NAME } = row as any; + const tableKey = `${schemaName}.${TABLE_NAME}`; + + if (!constraintMap[tableKey]) { + constraintMap[tableKey] = {}; + } + + constraintMap[tableKey][COLUMN_NAME] = { pk: true }; + } + + return constraintMap; +} + +async function generateForeignKeys (client: oracledb.Connection, schemaName: string): Promise { + const foreignKeyList: Ref[] = []; + + // Query to get all foreign key constraints + const fkQuery = ` + SELECT + AC.CONSTRAINT_NAME, + AC.TABLE_NAME AS CHILD_TABLE, + ACC.COLUMN_NAME AS CHILD_COLUMN, + AC.R_CONSTRAINT_NAME, + ACP.TABLE_NAME AS PARENT_TABLE, + ACP.COLUMN_NAME AS PARENT_COLUMN, + AC.DELETE_RULE + FROM ALL_CONSTRAINTS AC + JOIN ALL_CONS_COLUMNS ACC ON AC.CONSTRAINT_NAME = ACC.CONSTRAINT_NAME AND AC.OWNER = ACC.OWNER + JOIN ALL_CONSTRAINTS PC ON AC.R_CONSTRAINT_NAME = PC.CONSTRAINT_NAME AND AC.R_OWNER = PC.OWNER + JOIN ALL_CONS_COLUMNS ACP ON PC.CONSTRAINT_NAME = ACP.CONSTRAINT_NAME AND PC.OWNER = ACP.OWNER + WHERE AC.CONSTRAINT_TYPE = 'R' AND AC.OWNER = :schemaName + ORDER BY AC.CONSTRAINT_NAME, ACC.POSITION + `; + + const fkResult = await client.execute(fkQuery, { schemaName }, { outFormat: oracledb.OUT_FORMAT_OBJECT }); + const fkRows = fkResult.rows || []; + + // Group foreign keys by constraint name + const fksByConstraint: Record = {}; + + for (const row of fkRows) { + const { + CONSTRAINT_NAME, + CHILD_TABLE, + CHILD_COLUMN, + PARENT_TABLE, + PARENT_COLUMN, + DELETE_RULE, + } = row as any; + + if (!fksByConstraint[CONSTRAINT_NAME]) { + fksByConstraint[CONSTRAINT_NAME] = { + childTable: CHILD_TABLE, + childColumns: [], + parentTable: PARENT_TABLE, + parentColumns: [], + deleteRule: DELETE_RULE, + }; + } + + fksByConstraint[CONSTRAINT_NAME].childColumns.push(CHILD_COLUMN); + fksByConstraint[CONSTRAINT_NAME].parentColumns.push(PARENT_COLUMN); + } + + // Convert to the expected format + for (const constraintName in fksByConstraint) { + const { + childTable, + childColumns, + parentTable, + parentColumns, + deleteRule, + } = fksByConstraint[constraintName]; + + const endpoint1 = { + tableName: childTable, + schemaName, + fieldNames: childColumns, + relation: '*' as const, + }; + + const endpoint2 = { + tableName: parentTable, + schemaName, + fieldNames: parentColumns, + relation: '1' as const, + }; + + foreignKeyList.push({ + name: constraintName, + endpoints: [endpoint1, endpoint2], + onDelete: deleteRule === 'NO ACTION' ? null : deleteRule.toLowerCase(), + onUpdate: null, // Oracle doesn't support ON UPDATE actions + }); + } + + return foreignKeyList; +} + +async function generateEnums (client: oracledb.Connection, schemaName: string): Promise<{ enumList: Enum[], columnsWithEnum: { [key: string]: Enum } }> { + // Oracle doesn't have native enum types, but we can check for check constraints that might represent enums + const enumList: Enum[] = []; + const columnsWithEnum: { [key: string]: Enum } = {}; + + // Query to get check constraints using DBMS_METADATA.GET_DDL to avoid LONG datatype issues + const checkQuery = ` + SELECT + CON.TABLE_NAME, + CON.CONSTRAINT_NAME, + CON.SEARCH_CONDITION, + COL.COLUMN_NAME + FROM ALL_CONSTRAINTS CON + JOIN ALL_CONS_COLUMNS COL ON CON.CONSTRAINT_NAME = COL.CONSTRAINT_NAME AND CON.OWNER = COL.OWNER + WHERE CON.CONSTRAINT_TYPE = 'C' AND CON.OWNER = :schemaName + `; + + const checkResult = await client.execute(checkQuery, { schemaName }, { outFormat: oracledb.OUT_FORMAT_OBJECT }); + const checkRows = checkResult.rows || []; + + for (const row of checkRows) { + const { + TABLE_NAME, COLUMN_NAME, SEARCH_CONDITION, CONSTRAINT_NAME, + } = row as any; + + // Use getEnumValues from sqliteConnector to extract enum values + const enumValuesByColumns = getEnumValues(SEARCH_CONDITION, CONSTRAINT_NAME); + + if (enumValuesByColumns.length > 0) { + for (const item of enumValuesByColumns) { + // Check if any of the columns in the enum match the current column + // This is needed because Oracle constraints can span multiple columns + if (!item.columns.some(col => col.toUpperCase() === COLUMN_NAME)) { + continue; + } + + const enumObj: Enum = { + name: item.constraint_name, + schemaName, + values: item.enumValues, + }; + + enumList.push(enumObj); + const key = `${TABLE_NAME}.${COLUMN_NAME}`; + columnsWithEnum[key] = enumObj; + } + } + } + + return { enumList, columnsWithEnum }; +} + +async function fetchSchemaJson (connection: string): Promise { + let client: oracledb.Connection | null = null; + + try { + client = await connectOracle(connection); + + // Get the schema name from the connection (user name in Oracle) + const schemaName = client.user?.toUpperCase(); + if (!schemaName) { + throw new Error('Cannot get schema name from the connection'); + } + + // First, get the enums and columns with enum types + const { enumList, columnsWithEnum } = await generateEnums(client, schemaName); + + // Then, get the rest of the schema data + const [ + { tableList, fieldMap }, + indexMap, + constraintMap, + foreignKeyList, + ] = await Promise.all([ + generateTablesAndFields(client, schemaName, columnsWithEnum), + generateIndexes(client, schemaName), + generatePrimaryKeys(client, schemaName), + generateForeignKeys(client, schemaName), + ]); + + return { + tables: tableList, + fields: fieldMap, + refs: foreignKeyList, + enums: enumList, + indexes: indexMap, + tableConstraints: constraintMap, + }; + } finally { + if (client) { + try { + await client.close(); + } catch (error) { + console.error('Error closing Oracle connection:', error); + } + } + } +} + +export { + fetchSchemaJson, +}; diff --git a/packages/dbml-connector/src/connectors/sqliteConnector.ts b/packages/dbml-connector/src/connectors/sqliteConnector.ts new file mode 100644 index 000000000..6feea59fc --- /dev/null +++ b/packages/dbml-connector/src/connectors/sqliteConnector.ts @@ -0,0 +1,389 @@ +import type { Database } from 'better-sqlite3'; +import DatabaseConstructor, { SqliteError } from 'better-sqlite3'; +import { + DatabaseSchema, + DefaultInfo, + DefaultType, + Enum, + EnumValuesDict, + Field, + FieldsDictionary, + IndexColumn, + IndexesDictionary, + Ref, + Table, + TableConstraint, + TableConstraintsDictionary, + TypeInfo, +} from './types'; + +const SCHEMA_NAME = 'main'; + +const getFullColumnName = (tbName: string, colName: string) => `${SCHEMA_NAME}.${tbName}.${colName}`; + +function connectSQLite (connection: string): Database { + try { + return new DatabaseConstructor(connection, { readonly: true, fileMustExist: true }); + } catch (err) { + if (err instanceof SqliteError) { + throw new Error(`SQLite connection error: ${err.message}`); + } + throw err; // Rethrow error if you want the calling code to handle it + } +} + +function getDbDefault (columnDefault: string | null, defaultValueType: DefaultType): DefaultInfo | null { + if (columnDefault === null) { + return null; + } + + return { + type: defaultValueType, + value: columnDefault, + }; +} + +function getFieldType (columnType: string): TypeInfo { + return { + type_name: columnType.toUpperCase(), + schemaName: null, + }; +} + +function generateField (tableName: string, columnsWithEnum: { [key: string]: Enum }, row: any): Field { + const { + name, + type, + notnull, + dflt_value: dfltValue, + pk, + } = row; + + let defaultValueType: DefaultType; + + if (dfltValue && dfltValue.startsWith("'") && dfltValue.endsWith("'")) { + defaultValueType = 'string'; + } else if (['true', 'false'].includes(dfltValue)) { + defaultValueType = 'boolean'; + } else if (!Number.isNaN(dfltValue)) { + defaultValueType = 'number'; + } else { + defaultValueType = 'expression'; + } + + // Either SQLite type or an Enum type + let actualType = getFieldType(type); + + const key = getFullColumnName(tableName, name); + if (columnsWithEnum[key]) { + actualType = { + type_name: columnsWithEnum[key].name, + schemaName: SCHEMA_NAME, + }; + } + + return { + name, + type: actualType, + dbdefault: getDbDefault(dfltValue, defaultValueType), + not_null: notnull === 1, + increment: type.toLowerCase() === 'integer' && pk === 1, + pk: pk === 1, + note: { value: '' }, + }; +} + +export function getEnumValues (definition: string, constraintName: string): EnumValuesDict[] { + if (!definition) return []; + + // Extract column names and their enum values from CHECK constraints + // Example: "CHECK(column IN ('value1', 'value2', 'value3'))" + + // First, try to match the IN clause pattern + const inClausePattern = /(\w+)\s+IN\s*\(([^)]+)\)/gi; + const inMatches = [...definition.matchAll(inClausePattern)]; + + // Second, try to match the OR pattern + const orPattern = /(\w+)\s*=\s*'([^']+)'/gi; + const orMatches = [...definition.matchAll(orPattern)]; + + const colMap: { [key: string]: string[] } = {}; + + // Process IN clause matches + if (inMatches.length > 0) { + inMatches.forEach(match => { + const columnName = match[1]; + const valuesString = match[2]; + // Extract values from the string, handling quoted values + const values = valuesString.split(',') + .map(v => v.trim().replace(/^'|'$/g, '')); + + colMap[columnName] = values; + }); + } + // Process OR pattern matches + if (orMatches.length > 0) { + orMatches.forEach(match => { + const columnName = match[1]; + const value = match[2]; + + if (!colMap[columnName]) { + colMap[columnName] = [value]; + } else if (!colMap[columnName].includes(value)) { + colMap[columnName].push(value); + } + }); + } + + // If no matches found, return empty array + if (Object.keys(colMap).length === 0) return []; + + // Check if multiple columns have the same set of enum values + const arraysEqual = (a: string[], b: string[]): boolean => { + if (a.length !== b.length) return false; + const sortedA = [...a].sort(); + const sortedB = [...b].sort(); + return sortedA.every((value, index) => value === sortedB[index]); + }; + + // Group columns with the same enum values + const result: EnumValuesDict[] = []; + const processedKeys = new Set(); + + Object.keys(colMap).forEach((key) => { + if (processedKeys.has(key)) return; + + const mergedColumns = [key]; + const colValues = colMap[key]; + + Object.keys(colMap).forEach((innerKey) => { + if (key !== innerKey && arraysEqual(colValues, colMap[innerKey])) { + mergedColumns.push(innerKey); + processedKeys.add(innerKey); + } + }); + + const enumValues = colValues.map((value) => ({ name: value })); + result.push({ + columns: mergedColumns, + enumValues, + constraint_name: `${constraintName}_${mergedColumns.join('_')}`, + }); + + processedKeys.add(key); + }); + + return result; +} + +function generateTablesAndEnums (db: Database): { tableList: Table[], enumList: Enum[], columnsWithEnum: { [key: string]: Enum } } { + // Query to get all tables and their CREATE statements + const tablesQuery = ` + SELECT name, sql FROM sqlite_master + WHERE type='table' AND name NOT LIKE 'sqlite_%'; + `; + + const tables = db.prepare(tablesQuery).all(); + const tableList: Table[] = []; + const enumList: Enum[] = []; + const columnsWithEnum: { [key: string]: Enum } = {}; + + tables.forEach((table: any) => { + const tableName = table.name; + tableList.push({ + name: tableName, + schemaName: SCHEMA_NAME, + note: { value: '' }, + }); + + const createTableSql = table.sql; + if (!createTableSql) return; + + // Extract CHECK constraints from the CREATE TABLE statement + // SQLite CHECK constraints can be in the format: + // 1. Column level: "column_name TEXT CHECK(column_name IN ('value1', 'value2'))" + // 2. Table level: "CHECK(column_name IN ('value1', 'value2'))" + + // Extract table-level CHECK constraints + const tableCheckPattern = /CHECK\s*\(((?:[^()]+|\((?:[^()]+|\([^()]*\))*\))*)\)/gi; + const tableCheckMatches = [...createTableSql.matchAll(tableCheckPattern)]; + + tableCheckMatches.forEach((match, index) => { + const checkDefinition = match[1]; + const constraintName = `check_${tableName}_${index}`; + + const enumValuesByColumns = getEnumValues(checkDefinition, constraintName); + + if (enumValuesByColumns.length > 0) { + enumValuesByColumns.forEach(item => { + const enumEle: Enum = { + name: item.constraint_name, + schemaName: SCHEMA_NAME, + values: item.enumValues, + }; + + enumList.push(enumEle); + + item.columns.forEach(col => { + const key = getFullColumnName(tableName, col); + columnsWithEnum[key] = enumEle; + }); + }); + } + }); + }); + + return { tableList, enumList, columnsWithEnum }; +} + +function generateFieldsAndConstraints (tables: Table[], columnsWithEnum: { [key: string]: Enum }, db: Database): + { fieldMap: FieldsDictionary; constraintMap: TableConstraintsDictionary } { + const fieldMap: FieldsDictionary = {}; + const constraintMap: TableConstraintsDictionary = {}; + + tables.forEach((table: any) => { + const tableName = table.name; + const columnsQuery = `PRAGMA table_info(${tableName});`; + const columns = db.prepare(columnsQuery).all(); + + fieldMap[`main.${tableName}`] = columns.map((row) => generateField(tableName, columnsWithEnum, row)); + + const pkColumns = columns.filter((col: any) => col.pk === 1); + + if (pkColumns.length > 0) { + const tableConstraint: TableConstraint = {}; + + pkColumns.forEach((col: any) => { + tableConstraint[col.name] = { pk: true }; + }); + + constraintMap[`main.${tableName}`] = tableConstraint; + } + }); + + return { fieldMap, constraintMap }; +} + +function generateIndexes (tables: Table[], db: Database): IndexesDictionary { + const indexMap: IndexesDictionary = {}; + + tables.forEach((table: any) => { + const tableName = table.name; + const indexesQuery = `PRAGMA index_list(${tableName});`; + const indexes = db.prepare(indexesQuery).all(); + + if (indexes.length === 0) return; + + indexMap[`main.${tableName}`] = []; + + indexes.forEach((index: any) => { + const { name, unique } = index; + + // Skip auto-generated indexes for PRIMARY KEY + if (name.startsWith('sqlite_autoindex_')) return; + + const indexInfoQuery = `PRAGMA index_info(${name});`; + const indexColumns = db.prepare(indexInfoQuery).all(); + + const columns: IndexColumn[] = indexColumns.map((col: any) => ({ + type: 'column', + value: col.name, + })); + + indexMap[`main.${tableName}`].push({ + name, + type: 'btree', + unique: unique === 1, + columns, + }); + }); + + // Remove empty arrays + if (indexMap[`main.${tableName}`].length === 0) { + delete indexMap[`main.${tableName}`]; + } + }); + + return indexMap; +} + +function generateForeignKeys (tables: Table[], db: Database): Ref[] { + const foreignKeyList: Ref[] = []; + + tables.forEach((table: any) => { + const tableName = table.name; + const foreignKeysQuery = `PRAGMA foreign_key_list(${tableName});`; + const foreignKeys = db.prepare(foreignKeysQuery).all(); + + foreignKeys.forEach((fk: any) => { + const { + id, + table: refTableName, + from: foreignColumnName, + to: refColumnName, + on_update: onUpdate, + on_delete: onDelete, + } = fk; + + // Group foreign keys by id to handle composite foreign keys + const existingRef = foreignKeyList.find(ref => ref.name === `fk_${tableName}_${id}` + && ref.endpoints[0].tableName === tableName); + + if (existingRef) { + // Add column to existing foreign key + existingRef.endpoints[0].fieldNames.push(foreignColumnName); + existingRef.endpoints[1].fieldNames.push(refColumnName); + } else { + // Create new foreign key + const endpoint1 = { + tableName, + schemaName: SCHEMA_NAME, + fieldNames: [foreignColumnName], + relation: '*' as const, + }; + + const endpoint2 = { + tableName: refTableName, + schemaName: SCHEMA_NAME, + fieldNames: [refColumnName], + relation: '1' as const, + }; + + foreignKeyList.push({ + name: `fk_${tableName}_${id}`, + endpoints: [endpoint1, endpoint2], + onDelete: onDelete === 'NO ACTION' ? null : onDelete, + onUpdate: onUpdate === 'NO ACTION' ? null : onUpdate, + }); + } + }); + }); + + return foreignKeyList; +} + +async function fetchSchemaJson (connection: string): Promise { + const db = connectSQLite(connection); + + try { + const { tableList, enumList, columnsWithEnum } = generateTablesAndEnums(db); + const { fieldMap, constraintMap } = generateFieldsAndConstraints(tableList, columnsWithEnum, db); + const indexMap = generateIndexes(tableList, db); + const foreignKeyList = generateForeignKeys(tableList, db); + + return { + tables: tableList, + fields: fieldMap, + refs: foreignKeyList, + enums: enumList, + indexes: indexMap, + tableConstraints: constraintMap, + }; + } finally { + db.close(); + } +} + +export { + fetchSchemaJson, +}; diff --git a/yarn.lock b/yarn.lock index cf8f97b15..efff3d237 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1974,6 +1974,13 @@ dependencies: eslint-visitor-keys "^3.4.3" +"@eslint-community/eslint-utils@^4.7.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" + integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== + dependencies: + eslint-visitor-keys "^3.4.3" + "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": version "4.12.1" resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" @@ -3285,100 +3292,100 @@ estree-walker "^2.0.2" picomatch "^4.0.2" -"@rollup/rollup-android-arm-eabi@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz#8560592f0dcf43b8cb0949af9f1d916205148d12" - integrity sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA== +"@rollup/rollup-android-arm-eabi@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz#9145b38faf3fbfe3ec557130110e772f797335aa" + integrity sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A== "@rollup/rollup-android-arm-eabi@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz#7050c2acdc1214a730058e21f613ab0e1fe1ced9" integrity sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw== -"@rollup/rollup-android-arm64@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz#6bfb777bbce998691b6fd3e916b05cd46392d020" - integrity sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ== +"@rollup/rollup-android-arm64@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz#d73d641c59e9d7827e5ce0af9dfbc168b95cce0f" + integrity sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ== "@rollup/rollup-android-arm64@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz#3f5b2afbfcbe9021649701cf6ff0d54b1fb7e4a5" integrity sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw== -"@rollup/rollup-darwin-arm64@4.45.1": - version "4.45.1" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz" - integrity sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA== +"@rollup/rollup-darwin-arm64@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz#45d9d71d941117c98e7a5e77f60f0bc682d27e82" + integrity sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw== "@rollup/rollup-darwin-arm64@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz#70a1679fb4393ba7bafb730ee56a5278cbcdafb0" integrity sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg== -"@rollup/rollup-darwin-x64@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz#c617a8ece21050bfbea299c126767d2e70cfa79a" - integrity sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og== +"@rollup/rollup-darwin-x64@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz#8d72fb5f81714cb43e90f263fb1674520cce3f2a" + integrity sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ== "@rollup/rollup-darwin-x64@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz#ae75aec88fa72069de9bca3a3ec22bf4e6a962bf" integrity sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A== -"@rollup/rollup-freebsd-arm64@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz#5a6af0a9acf82162d2910933649ae24fc0ea3ecb" - integrity sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g== +"@rollup/rollup-freebsd-arm64@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz#a52b58852c9cec9255e382a2f335b08bc8c6111d" + integrity sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg== "@rollup/rollup-freebsd-arm64@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz#8a2bda997faa1d7e335ce1961ce71d1a76ac6288" integrity sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ== -"@rollup/rollup-freebsd-x64@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz#ae9709463560196fc275bd0da598668a2e341023" - integrity sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A== +"@rollup/rollup-freebsd-x64@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz#104511dc64612789ddda41d164ab07cdac84a6c1" + integrity sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg== "@rollup/rollup-freebsd-x64@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz#fc287bcc39b9a9c0df97336d68fd5f4458f87977" integrity sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A== -"@rollup/rollup-linux-arm-gnueabihf@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz#6ec52661764dbd54c19d6520a403aa385a5c0fbf" - integrity sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q== +"@rollup/rollup-linux-arm-gnueabihf@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz#643e3ad19c93903201fde89abd76baaee725e6c2" + integrity sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA== "@rollup/rollup-linux-arm-gnueabihf@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz#5b5a2a55dffaa64d7c7a231e80e491219e33d4f3" integrity sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA== -"@rollup/rollup-linux-arm-musleabihf@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz#fd33ba4a43ef8419e96811236493d19436271923" - integrity sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q== +"@rollup/rollup-linux-arm-musleabihf@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz#fdc6a595aec7b20c5bfdac81412028c56d734e63" + integrity sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg== "@rollup/rollup-linux-arm-musleabihf@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz#979eab95003c21837ea0fdd8a721aa3e69fa4aa3" integrity sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA== -"@rollup/rollup-linux-arm64-gnu@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz#933b3d99b73c9d7bf4506cab0d5d313c7e74fd2d" - integrity sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw== +"@rollup/rollup-linux-arm64-gnu@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz#c28620bcd385496bdbbc24920b21f9fcca9ecbfa" + integrity sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw== "@rollup/rollup-linux-arm64-gnu@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz#53b89f1289cbeca5ed9b6ca1602a6fe1a29dd4e2" integrity sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ== -"@rollup/rollup-linux-arm64-musl@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz#dbe9ae24ee9e97b75662fddcb69eb7f23c89280a" - integrity sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog== +"@rollup/rollup-linux-arm64-musl@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz#a6b71b1e8fa33bac9f65b6f879e8ed878035d120" + integrity sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ== "@rollup/rollup-linux-arm64-musl@4.52.3": version "4.52.3" @@ -3390,65 +3397,65 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz#1cc71838465a8297f92ccc5cc9c29756b71f6e73" integrity sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg== -"@rollup/rollup-linux-loongarch64-gnu@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz#818c5a071eec744436dbcdd76fe9c3c869dc9a8d" - integrity sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg== +"@rollup/rollup-linux-loongarch64-gnu@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz#b06374601ce865a1110324b2f06db574d3a1b0e1" + integrity sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w== -"@rollup/rollup-linux-powerpc64le-gnu@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz#6b8591def27d886fa147fb0340126c7d6682a7e4" - integrity sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg== +"@rollup/rollup-linux-powerpc64le-gnu@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz#8a2a1f6058c920889c2aff3753a20fead7a8cc26" + integrity sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg== "@rollup/rollup-linux-ppc64-gnu@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz#fe3fdf2ef57dc2d58fedd4f1e0678660772c843a" integrity sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw== -"@rollup/rollup-linux-riscv64-gnu@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz#f1861ac4ee8da64e0b0d23853ff26fe2baa876cf" - integrity sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw== +"@rollup/rollup-linux-riscv64-gnu@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz#8ef6f680d011b95a2f6546c6c31a37a33138035f" + integrity sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A== "@rollup/rollup-linux-riscv64-gnu@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz#eebc99e75832891d58532501879ca749b1592f93" integrity sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg== -"@rollup/rollup-linux-riscv64-musl@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz#320c961401a923b374e358664527b188e374e1ae" - integrity sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA== +"@rollup/rollup-linux-riscv64-musl@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz#9f4884c5955a7cd39b396f6e27aa59b3269988eb" + integrity sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A== "@rollup/rollup-linux-riscv64-musl@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz#9a2df234d61763a44601eba17c36844a18f20539" integrity sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg== -"@rollup/rollup-linux-s390x-gnu@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz#1763eed3362b50b6164d3f0947486c03cc7e616d" - integrity sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw== +"@rollup/rollup-linux-s390x-gnu@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz#5619303cc51994e3df404a497f42c79dc5efd6eb" + integrity sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw== "@rollup/rollup-linux-s390x-gnu@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz#f0e45ea7e41ee473c85458b1ec8fab9572cc1834" integrity sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg== -"@rollup/rollup-linux-x64-gnu@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz#0d4c8d0b8f801902f0844a40a9d981a0179f4971" - integrity sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw== +"@rollup/rollup-linux-x64-gnu@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz#c3e42b66c04e25ad0f2a00beec42ede96ccc8983" + integrity sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ== "@rollup/rollup-linux-x64-gnu@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz#ed63dec576799fa5571eee5b2040f65faa82b49b" integrity sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA== -"@rollup/rollup-linux-x64-musl@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz#ec30bb48b5fe22a3aaba98072f2d5b7139e1a8eb" - integrity sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw== +"@rollup/rollup-linux-x64-musl@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz#8d3452de42aa72fc5fc3e5ad1eb0b68030742a25" + integrity sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg== "@rollup/rollup-linux-x64-musl@4.52.3": version "4.52.3" @@ -3460,20 +3467,20 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz#84b4170fe28c2b41e406add6ccf8513bf91195ea" integrity sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA== -"@rollup/rollup-win32-arm64-msvc@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz#27a6e48d1502e8e4bed96bedfb533738655874f2" - integrity sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg== +"@rollup/rollup-win32-arm64-msvc@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz#3b7bbd9f43f1c380061f306abce6f3f64de20306" + integrity sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg== "@rollup/rollup-win32-arm64-msvc@4.52.3": version "4.52.3" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz#4fb0cd004183da819bec804eba70f1ef6936ccbf" integrity sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA== -"@rollup/rollup-win32-ia32-msvc@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz#a2fbad3bec20ff879f3fd51720adf33692ca8f3d" - integrity sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw== +"@rollup/rollup-win32-ia32-msvc@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz#e27ef5c40bbec49fac3d4e4b1618fbe4597b40e5" + integrity sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ== "@rollup/rollup-win32-ia32-msvc@4.52.3": version "4.52.3" @@ -3485,10 +3492,10 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz#867222f288a9557487900c7836998123ebbadc9d" integrity sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ== -"@rollup/rollup-win32-x64-msvc@4.45.1": - version "4.45.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz#e5085c6d13da15b4c5133cd2a6bb11f25b6bb77a" - integrity sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA== +"@rollup/rollup-win32-x64-msvc@4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz#b0b595ad4720259bbb81600750d26a655cac06be" + integrity sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA== "@rollup/rollup-win32-x64-msvc@4.52.3": version "4.52.3" @@ -4290,6 +4297,13 @@ dependencies: "@babel/types" "^7.3.0" +"@types/better-sqlite3@^7.6.13": + version "7.6.13" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz#a72387f00d2f53cab699e63f2e2c05453cf953f0" + integrity sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA== + dependencies: + "@types/node" "*" + "@types/caseless@*": version "0.12.5" resolved "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz" @@ -4300,6 +4314,11 @@ resolved "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/estree@1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + "@types/estree@1.0.8", "@types/estree@^1.0.6": version "1.0.8" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" @@ -4421,7 +4440,7 @@ "@types/node@^24.0.14": version "24.0.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.0.14.tgz#6e3d4fb6d858c48c69707394e1a0e08ce1ecc1bc" + resolved "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz" integrity sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw== dependencies: undici-types "~7.8.0" @@ -4431,6 +4450,13 @@ resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/oracledb@^6.9.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@types/oracledb/-/oracledb-6.10.0.tgz#1e7dd2373c9730105ccd5af941a4f0a8110c4c52" + integrity sha512-dRaEYKRkJhSSM/uKrscE7zXC5D75JSkBgdye5kSxzTRwrMAUI5V675cD3fqCdMuSOiGo2K9Ng3CjjRI4rzeuAg== + dependencies: + "@types/node" "*" + "@types/pg@^8.11.6": version "8.11.6" resolved "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz" @@ -4503,29 +4529,38 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz" - integrity sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q== + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz#c9afec1866ee1a6ea3d768b5f8e92201efbbba06" + integrity sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.30.1" - "@typescript-eslint/type-utils" "8.30.1" - "@typescript-eslint/utils" "8.30.1" - "@typescript-eslint/visitor-keys" "8.30.1" + "@typescript-eslint/scope-manager" "8.39.0" + "@typescript-eslint/type-utils" "8.39.0" + "@typescript-eslint/utils" "8.39.0" + "@typescript-eslint/visitor-keys" "8.39.0" graphemer "^1.4.0" - ignore "^5.3.1" + ignore "^7.0.0" natural-compare "^1.4.0" - ts-api-utils "^2.0.1" + ts-api-utils "^2.1.0" "@typescript-eslint/parser@^8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.30.1.tgz" - integrity sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg== - dependencies: - "@typescript-eslint/scope-manager" "8.30.1" - "@typescript-eslint/types" "8.30.1" - "@typescript-eslint/typescript-estree" "8.30.1" - "@typescript-eslint/visitor-keys" "8.30.1" + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.39.0.tgz#c4b895d7a47f4cd5ee6ee77ea30e61d58b802008" + integrity sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg== + dependencies: + "@typescript-eslint/scope-manager" "8.39.0" + "@typescript-eslint/types" "8.39.0" + "@typescript-eslint/typescript-estree" "8.39.0" + "@typescript-eslint/visitor-keys" "8.39.0" + debug "^4.3.4" + +"@typescript-eslint/project-service@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.39.0.tgz#71cb29c3f8139f99a905b8705127bffc2ae84759" + integrity sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.39.0" + "@typescript-eslint/types" "^8.39.0" debug "^4.3.4" "@typescript-eslint/scope-manager@5.62.0": @@ -4536,33 +4571,39 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz" - integrity sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg== +"@typescript-eslint/scope-manager@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz#ba4bf6d8257bbc172c298febf16bc22df4856570" + integrity sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A== dependencies: - "@typescript-eslint/types" "8.30.1" - "@typescript-eslint/visitor-keys" "8.30.1" + "@typescript-eslint/types" "8.39.0" + "@typescript-eslint/visitor-keys" "8.39.0" + +"@typescript-eslint/tsconfig-utils@8.39.0", "@typescript-eslint/tsconfig-utils@^8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz#b2e87fef41a3067c570533b722f6af47be213f13" + integrity sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ== -"@typescript-eslint/type-utils@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz" - integrity sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA== +"@typescript-eslint/type-utils@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz#310ec781ae5e7bb0f5940bfd652573587f22786b" + integrity sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q== dependencies: - "@typescript-eslint/typescript-estree" "8.30.1" - "@typescript-eslint/utils" "8.30.1" + "@typescript-eslint/types" "8.39.0" + "@typescript-eslint/typescript-estree" "8.39.0" + "@typescript-eslint/utils" "8.39.0" debug "^4.3.4" - ts-api-utils "^2.0.1" + ts-api-utils "^2.1.0" "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz" - integrity sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw== +"@typescript-eslint/types@8.39.0", "@typescript-eslint/types@^8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.39.0.tgz#80f010b7169d434a91cd0529d70a528dbc9c99c6" + integrity sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" @@ -4577,29 +4618,31 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz" - integrity sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ== +"@typescript-eslint/typescript-estree@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz#b9477a5c47a0feceffe91adf553ad9a3cd4cb3d6" + integrity sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw== dependencies: - "@typescript-eslint/types" "8.30.1" - "@typescript-eslint/visitor-keys" "8.30.1" + "@typescript-eslint/project-service" "8.39.0" + "@typescript-eslint/tsconfig-utils" "8.39.0" + "@typescript-eslint/types" "8.39.0" + "@typescript-eslint/visitor-keys" "8.39.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" minimatch "^9.0.4" semver "^7.6.0" - ts-api-utils "^2.0.1" + ts-api-utils "^2.1.0" -"@typescript-eslint/utils@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz" - integrity sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ== +"@typescript-eslint/utils@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.39.0.tgz#dfea42f3c7ec85f9f3e994ff0bba8f3b2f09e220" + integrity sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ== dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.30.1" - "@typescript-eslint/types" "8.30.1" - "@typescript-eslint/typescript-estree" "8.30.1" + "@eslint-community/eslint-utils" "^4.7.0" + "@typescript-eslint/scope-manager" "8.39.0" + "@typescript-eslint/types" "8.39.0" + "@typescript-eslint/typescript-estree" "8.39.0" "@typescript-eslint/utils@^5.10.0": version "5.62.0" @@ -4623,13 +4666,13 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@8.30.1": - version "8.30.1" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz" - integrity sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA== +"@typescript-eslint/visitor-keys@8.39.0": + version "8.39.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz#5d619a6e810cdd3fd1913632719cbccab08bf875" + integrity sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA== dependencies: - "@typescript-eslint/types" "8.30.1" - eslint-visitor-keys "^4.2.0" + "@typescript-eslint/types" "8.39.0" + eslint-visitor-keys "^4.2.1" "@unrs/resolver-binding-darwin-arm64@1.3.3": version "1.3.3" @@ -5013,21 +5056,16 @@ acorn-walk@^8.1.1: dependencies: acorn "^8.11.0" -acorn@^8.11.0, acorn@^8.4.1: - version "8.12.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +acorn@^8.11.0, acorn@^8.15.0, acorn@^8.4.1: + version "8.15.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== acorn@^8.14.0: version "8.14.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== -acorn@^8.15.0: - version "8.15.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - acorn@^8.9.0: version "8.10.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" @@ -5523,6 +5561,14 @@ benchmark@^2.1.4: lodash "^4.17.4" platform "^1.3.3" +better-sqlite3@^12.2.0: + version "12.2.0" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-12.2.0.tgz#de7c3466074f2d1a5d260f510647e822e42684d2" + integrity sha512-eGbYq2CT+tos1fBwLQ/tkBt9J5M3JEHjku4hbvQUePCckkvVf14xWj+1m7dGoK81M/fOjFT7yM9UMeKT/+vFLQ== + dependencies: + bindings "^1.5.0" + prebuild-install "^7.1.1" + big-integer@^1.6.43: version "1.6.52" resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz" @@ -5548,6 +5594,13 @@ binascii@0.0.2: resolved "https://registry.npmjs.org/binascii/-/binascii-0.0.2.tgz" integrity sha512-rA2CrUl1+6yKrn+XgLs8Hdy18OER1UW146nM+ixzhQXDY+Bd3ySkyIJGwF2a4I45JwbvF1mDL/nWkqBwpOcdBA== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" @@ -5869,6 +5922,11 @@ chokidar@^3.6.0: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chownr@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" @@ -6321,6 +6379,13 @@ decamelize@^1.1.0: resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + dedent@0.7.0, dedent@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" @@ -6336,6 +6401,11 @@ deep-eql@^5.0.1: resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz" integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" @@ -6403,6 +6473,11 @@ detect-indent@^5.0.0: resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= +detect-libc@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + detect-libc@^2.0.3, detect-libc@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz" @@ -6536,6 +6611,13 @@ encoding@^0.1.12, encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" +end-of-stream@^1.1.0: + version "1.4.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" @@ -6860,11 +6942,6 @@ eslint-visitor-keys@^3.4.3: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-visitor-keys@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" - integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== - eslint-visitor-keys@^4.2.1: version "4.2.1" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz" @@ -7080,6 +7157,11 @@ exit@^0.1.2: resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" @@ -7165,18 +7247,7 @@ fast-glob@3.2.7: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-glob@^3.3.2: +fast-glob@^3.2.9, fast-glob@^3.3.2: version "3.3.3" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -7266,6 +7337,11 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + filelist@^1.0.1: version "1.0.4" resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" @@ -7661,6 +7737,11 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@5.1.2, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" @@ -8064,10 +8145,10 @@ ignore@^5.0.4, ignore@^5.2.0: resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -ignore@^5.3.1: - version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +ignore@^7.0.0: + version "7.0.5" + resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== import-fresh@^3.2.1: version "3.3.0" @@ -8118,7 +8199,7 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.2, ini@^1.3.8: +ini@^1.3.2, ini@^1.3.8, ini@~1.3.0: version "1.3.8" resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -10187,6 +10268,11 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" @@ -10262,7 +10348,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -10378,6 +10464,11 @@ minizlib@^3.0.1: dependencies: minipass "^7.1.2" +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" @@ -10514,6 +10605,11 @@ nanoid@^3.3.11: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + native-duplexpair@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz" @@ -10545,6 +10641,13 @@ neo-async@^2.6.0: resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== +node-abi@^3.3.0: + version "3.80.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.80.0.tgz#d7390951f27caa129cceeec01e1c20fc9f07581c" + integrity sha512-LyPuZJcI9HVwzXK1GPxWNzrr+vr8Hp/3UqlmWxxh8p54U1ZbclOqbSog9lWHaCX+dBaiGi6n/hIX+mKu74GmPA== + dependencies: + semver "^7.3.5" + node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" @@ -10889,7 +10992,7 @@ obuf@~1.1.2: resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -once@^1.3.0, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -10961,6 +11064,11 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +oracledb@^6.9.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/oracledb/-/oracledb-6.9.0.tgz#53909307016239b019b6c292e2af21cf9745ec32" + integrity sha512-NwPbIGPv6m0GTFSbyy4/5WEjsKMiiJRxztLmYUcfD3oyh/uXdmVmKOwEWr84wFwWJ/0wQrYQh4PjnzvShibRaA== + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" @@ -11492,6 +11600,24 @@ postgres-range@^1.1.1: resolved "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz" integrity sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w== +prebuild-install@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^2.0.0" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -11596,6 +11722,14 @@ proxy-from-env@^1.1.0: resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +pump@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.3.tgz#151d979f1a29668dc0025ec589a455b53282268d" + integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.1.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" @@ -11628,6 +11762,16 @@ quick-lru@^4.0.1: resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-is@^18.0.0: version "18.2.0" resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" @@ -11930,32 +12074,32 @@ rimraf@^4.4.1: glob "^9.2.0" rollup@^4.34.9: - version "4.45.1" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz" - integrity sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw== + version "4.41.0" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz" + integrity sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg== dependencies: - "@types/estree" "1.0.8" + "@types/estree" "1.0.7" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.45.1" - "@rollup/rollup-android-arm64" "4.45.1" - "@rollup/rollup-darwin-arm64" "4.45.1" - "@rollup/rollup-darwin-x64" "4.45.1" - "@rollup/rollup-freebsd-arm64" "4.45.1" - "@rollup/rollup-freebsd-x64" "4.45.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.45.1" - "@rollup/rollup-linux-arm-musleabihf" "4.45.1" - "@rollup/rollup-linux-arm64-gnu" "4.45.1" - "@rollup/rollup-linux-arm64-musl" "4.45.1" - "@rollup/rollup-linux-loongarch64-gnu" "4.45.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.45.1" - "@rollup/rollup-linux-riscv64-gnu" "4.45.1" - "@rollup/rollup-linux-riscv64-musl" "4.45.1" - "@rollup/rollup-linux-s390x-gnu" "4.45.1" - "@rollup/rollup-linux-x64-gnu" "4.45.1" - "@rollup/rollup-linux-x64-musl" "4.45.1" - "@rollup/rollup-win32-arm64-msvc" "4.45.1" - "@rollup/rollup-win32-ia32-msvc" "4.45.1" - "@rollup/rollup-win32-x64-msvc" "4.45.1" + "@rollup/rollup-android-arm-eabi" "4.41.0" + "@rollup/rollup-android-arm64" "4.41.0" + "@rollup/rollup-darwin-arm64" "4.41.0" + "@rollup/rollup-darwin-x64" "4.41.0" + "@rollup/rollup-freebsd-arm64" "4.41.0" + "@rollup/rollup-freebsd-x64" "4.41.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.41.0" + "@rollup/rollup-linux-arm-musleabihf" "4.41.0" + "@rollup/rollup-linux-arm64-gnu" "4.41.0" + "@rollup/rollup-linux-arm64-musl" "4.41.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.41.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.41.0" + "@rollup/rollup-linux-riscv64-gnu" "4.41.0" + "@rollup/rollup-linux-riscv64-musl" "4.41.0" + "@rollup/rollup-linux-s390x-gnu" "4.41.0" + "@rollup/rollup-linux-x64-gnu" "4.41.0" + "@rollup/rollup-linux-x64-musl" "4.41.0" + "@rollup/rollup-win32-arm64-msvc" "4.41.0" + "@rollup/rollup-win32-ia32-msvc" "4.41.0" + "@rollup/rollup-win32-x64-msvc" "4.41.0" fsevents "~2.3.2" rollup@^4.43.0: @@ -12078,16 +12222,16 @@ semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semve dependencies: lru-cache "^6.0.0" -semver@^7.6.0, semver@^7.7.1: - version "7.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== - -semver@^7.6.3: +semver@^7.6.0, semver@^7.6.3: version "7.7.2" resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== +semver@^7.7.1: + version "7.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + seq-queue@^0.0.5: version "0.0.5" resolved "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz" @@ -12150,6 +12294,20 @@ sigstore@^1.3.0, sigstore@^1.4.0: "@sigstore/tuf" "^1.0.1" make-fetch-happen "^11.0.1" +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-lru-cache@^0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz" @@ -12547,6 +12705,11 @@ strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + strnum@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" @@ -12607,7 +12770,17 @@ tapable@^2.2.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz" integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== -tar-stream@~2.2.0: +tar-fs@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.4.tgz#800824dbf4ef06ded9afea4acafe71c67c76b930" + integrity sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4, tar-stream@~2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -12827,7 +13000,7 @@ triple-beam@^1.3.0: resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== -ts-api-utils@^2.0.1: +ts-api-utils@^2.0.1, ts-api-utils@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz" integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== @@ -12921,6 +13094,13 @@ tuf-js@^1.1.7: debug "^4.3.4" make-fetch-happen "^11.1.1" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" @@ -13282,9 +13462,9 @@ vite-plugin-dts@^4.5.4: magic-string "^0.30.17" "vite@^5.0.0 || ^6.0.0", vite@^6.3.5: - version "6.3.6" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.3.6.tgz#69a976b64930750d40219fbc68c5200874d315c1" - integrity sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA== + version "6.3.5" + resolved "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz" + integrity sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ== dependencies: esbuild "^0.25.0" fdir "^6.4.4"