drizzle-kit 0.24.0-6386ea9 → 0.24.0-bb966f7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. package/api.js +1219 -656
  2. package/api.mjs +1219 -656
  3. package/bin.cjs +1790 -1200
  4. package/package.json +4 -4
  5. package/utils.js +9 -0
  6. package/utils.mjs +8 -0
package/bin.cjs CHANGED
@@ -6564,6 +6564,13 @@ var init_sqliteSchema = __esm({
6564
6564
  function isPgArrayType(sqlType) {
6565
6565
  return sqlType.match(/.*\[\d*\].*|.*\[\].*/g) !== null;
6566
6566
  }
6567
+ function findAddedAndRemoved(columnNames1, columnNames2) {
6568
+ const set1 = new Set(columnNames1);
6569
+ const set2 = new Set(columnNames2);
6570
+ const addedColumns = columnNames2.filter((it) => !set1.has(it));
6571
+ const removedColumns = columnNames1.filter((it) => !set2.has(it));
6572
+ return { addedColumns, removedColumns };
6573
+ }
6567
6574
  var import_fs, import_path, import_url, copy, objectValues, assertV1OutFolder, dryJournal, prepareOutFolder, validatorForDialect, validateWithReport, prepareMigrationFolder, prepareMigrationMeta, schemaRenameKey, tableRenameKey, columnRenameKey, normaliseSQLiteUrl;
6568
6575
  var init_utils = __esm({
6569
6576
  "src/utils.ts"() {
@@ -11361,7 +11368,8 @@ var init_cli = __esm({
11361
11368
  schemaFilter: unionType([stringType(), stringType().array()]).optional().default(["public"]),
11362
11369
  extensionsFilters: literalType("postgis").array().optional(),
11363
11370
  verbose: booleanType().optional(),
11364
- strict: booleanType().optional()
11371
+ strict: booleanType().optional(),
11372
+ driver: driver.optional()
11365
11373
  }).passthrough();
11366
11374
  pullParams = objectType({
11367
11375
  config: stringType().optional(),
@@ -17365,7 +17373,8 @@ var init_utils4 = __esm({
17365
17373
  breakpoints: breakpoints || true,
17366
17374
  schema: schema5,
17367
17375
  out: out || "drizzle",
17368
- bundle: driver2 === "expo"
17376
+ bundle: driver2 === "expo",
17377
+ driver: driver2
17369
17378
  };
17370
17379
  };
17371
17380
  flattenDatabaseCredentials = (config) => {
@@ -17393,6 +17402,7 @@ var init_utils4 = __esm({
17393
17402
  const raw2 = flattenDatabaseCredentials(
17394
17403
  from === "config" ? await drizzleConfigFromFile(options.config) : options
17395
17404
  );
17405
+ raw2.driver ||= options.driver;
17396
17406
  raw2.verbose ||= options.verbose;
17397
17407
  raw2.strict ||= options.strict;
17398
17408
  const parsed = pushParams.safeParse(raw2);
@@ -17467,7 +17477,8 @@ var init_utils4 = __esm({
17467
17477
  force: options.force ?? false,
17468
17478
  credentials: parsed2.data,
17469
17479
  tablesFilter,
17470
- schemasFilter
17480
+ schemasFilter,
17481
+ driver: config.driver
17471
17482
  };
17472
17483
  }
17473
17484
  assertUnreachable(config.dialect);
@@ -22852,7 +22863,20 @@ var init_jsonDiffer = __esm({
22852
22863
  });
22853
22864
 
22854
22865
  // src/sqlgenerator.ts
22855
- var pgNativeTypes, isPgNativeType, Convertor, PgCreateTableConvertor, MySqlCreateTableConvertor, SQLiteCreateTableConvertor, PgAlterTableAlterColumnSetGenerated, PgAlterTableAlterColumnDropGenerated, PgAlterTableAlterColumnAlterGenerated, PgAlterTableAddUniqueConstraintConvertor, PgAlterTableDropUniqueConstraintConvertor, MySQLAlterTableAddUniqueConstraintConvertor, MySQLAlterTableDropUniqueConstraintConvertor, SQLiteAlterTableAddUniqueConstraintConvertor, SQLiteAlterTableDropUniqueConstraintConvertor, CreatePgSequenceConvertor, DropPgSequenceConvertor, RenamePgSequenceConvertor, MovePgSequenceConvertor, AlterPgSequenceConvertor, CreateTypeEnumConvertor, AlterTypeAddValueConvertor, PgDropTableConvertor, MySQLDropTableConvertor, SQLiteDropTableConvertor, PgRenameTableConvertor, SqliteRenameTableConvertor, MySqlRenameTableConvertor, PgAlterTableRenameColumnConvertor, MySqlAlterTableRenameColumnConvertor, SQLiteAlterTableRenameColumnConvertor, PgAlterTableDropColumnConvertor, MySqlAlterTableDropColumnConvertor, SQLiteAlterTableDropColumnConvertor, PgAlterTableAddColumnConvertor, MySqlAlterTableAddColumnConvertor, SQLiteAlterTableAddColumnConvertor, PgAlterTableAlterColumnSetTypeConvertor, SQLiteAlterTableAlterColumnSetTypeConvertor, PgAlterTableAlterColumnSetDefaultConvertor, SqliteAlterTableAlterColumnSetDefaultConvertor, PgAlterTableAlterColumnDropDefaultConvertor, PgAlterTableAlterColumnDropGeneratedConvertor, PgAlterTableAlterColumnSetExpressionConvertor, PgAlterTableAlterColumnAlterrGeneratedConvertor, SqliteAlterTableAlterColumnDropGeneratedConvertor, SqliteAlterTableAlterColumnSetExpressionConvertor, SqliteAlterTableAlterColumnAlterGeneratedConvertor, MySqlAlterTableAlterColumnAlterrGeneratedConvertor, MySqlAlterTableAddPk, MySqlAlterTableDropPk, MySqlModifyColumn, SqliteAlterTableAlterColumnDropDefaultConvertor, PgAlterTableCreateCompositePrimaryKeyConvertor, PgAlterTableDeleteCompositePrimaryKeyConvertor, PgAlterTableAlterCompositePrimaryKeyConvertor, MySqlAlterTableCreateCompositePrimaryKeyConvertor, MySqlAlterTableDeleteCompositePrimaryKeyConvertor, MySqlAlterTableAlterCompositePrimaryKeyConvertor, SqliteAlterTableCreateCompositePrimaryKeyConvertor, SqliteAlterTableDeleteCompositePrimaryKeyConvertor, SqliteAlterTableAlterCompositePrimaryKeyConvertor, PgAlterTableAlterColumnSetPrimaryKeyConvertor, PgAlterTableAlterColumnDropPrimaryKeyConvertor, PgAlterTableAlterColumnSetNotNullConvertor, SqliteAlterTableAlterColumnSetNotNullConvertor, SqliteAlterTableAlterColumnSetAutoincrementConvertor, SqliteAlterTableAlterColumnDropAutoincrementConvertor, PgAlterTableAlterColumnDropNotNullConvertor, SqliteAlterTableAlterColumnDropNotNullConvertor, PgCreateForeignKeyConvertor, SqliteCreateForeignKeyConvertor, MySqlCreateForeignKeyConvertor, PgAlterForeignKeyConvertor, SqliteAlterForeignKeyConvertor, PgDeleteForeignKeyConvertor, SqliteDeleteForeignKeyConvertor, MySqlDeleteForeignKeyConvertor, CreatePgIndexConvertor, CreateMySqlIndexConvertor, CreateSqliteIndexConvertor, PgDropIndexConvertor, PgCreateSchemaConvertor, PgRenameSchemaConvertor, PgDropSchemaConvertor, PgAlterTableSetSchemaConvertor, PgAlterTableSetNewSchemaConvertor, PgAlterTableRemoveFromSchemaConvertor, SqliteDropIndexConvertor, MySqlDropIndexConvertor, convertors, fromJson;
22866
+ function fromJson(statements, dialect7, action, driver2, json2) {
22867
+ const result = statements.flatMap((statement) => {
22868
+ const filtered = convertors.filter((it) => {
22869
+ return it.can(statement, dialect7, driver2);
22870
+ });
22871
+ const convertor = filtered.length === 1 ? filtered[0] : void 0;
22872
+ if (!convertor) {
22873
+ return "";
22874
+ }
22875
+ return convertor.convert(statement, json2, action);
22876
+ }).filter((it) => it !== "");
22877
+ return result;
22878
+ }
22879
+ var pgNativeTypes, isPgNativeType, Convertor, PgCreateTableConvertor, MySqlCreateTableConvertor, SQLiteCreateTableConvertor, PgAlterTableAlterColumnSetGenerated, PgAlterTableAlterColumnDropGenerated, PgAlterTableAlterColumnAlterGenerated, PgAlterTableAddUniqueConstraintConvertor, PgAlterTableDropUniqueConstraintConvertor, MySQLAlterTableAddUniqueConstraintConvertor, MySQLAlterTableDropUniqueConstraintConvertor, CreatePgSequenceConvertor, DropPgSequenceConvertor, RenamePgSequenceConvertor, MovePgSequenceConvertor, AlterPgSequenceConvertor, CreateTypeEnumConvertor, AlterTypeAddValueConvertor, PgDropTableConvertor, MySQLDropTableConvertor, SQLiteDropTableConvertor, PgRenameTableConvertor, SqliteRenameTableConvertor, MySqlRenameTableConvertor, PgAlterTableRenameColumnConvertor, MySqlAlterTableRenameColumnConvertor, SQLiteAlterTableRenameColumnConvertor, PgAlterTableDropColumnConvertor, MySqlAlterTableDropColumnConvertor, SQLiteAlterTableDropColumnConvertor, PgAlterTableAddColumnConvertor, MySqlAlterTableAddColumnConvertor, SQLiteAlterTableAddColumnConvertor, PgAlterTableAlterColumnSetTypeConvertor, PgAlterTableAlterColumnSetDefaultConvertor, PgAlterTableAlterColumnDropDefaultConvertor, PgAlterTableAlterColumnDropGeneratedConvertor, PgAlterTableAlterColumnSetExpressionConvertor, PgAlterTableAlterColumnAlterrGeneratedConvertor, SqliteAlterTableAlterColumnDropGeneratedConvertor, SqliteAlterTableAlterColumnSetExpressionConvertor, SqliteAlterTableAlterColumnAlterGeneratedConvertor, MySqlAlterTableAlterColumnAlterrGeneratedConvertor, MySqlAlterTableAddPk, MySqlAlterTableDropPk, LibSQLModifyColumn, MySqlModifyColumn, PgAlterTableCreateCompositePrimaryKeyConvertor, PgAlterTableDeleteCompositePrimaryKeyConvertor, PgAlterTableAlterCompositePrimaryKeyConvertor, MySqlAlterTableCreateCompositePrimaryKeyConvertor, MySqlAlterTableDeleteCompositePrimaryKeyConvertor, MySqlAlterTableAlterCompositePrimaryKeyConvertor, PgAlterTableAlterColumnSetPrimaryKeyConvertor, PgAlterTableAlterColumnDropPrimaryKeyConvertor, PgAlterTableAlterColumnSetNotNullConvertor, PgAlterTableAlterColumnDropNotNullConvertor, PgCreateForeignKeyConvertor, LibSQLCreateForeignKeyConvertor, MySqlCreateForeignKeyConvertor, PgAlterForeignKeyConvertor, PgDeleteForeignKeyConvertor, MySqlDeleteForeignKeyConvertor, CreatePgIndexConvertor, CreateMySqlIndexConvertor, CreateSqliteIndexConvertor, PgDropIndexConvertor, PgCreateSchemaConvertor, PgRenameSchemaConvertor, PgDropSchemaConvertor, PgAlterTableSetSchemaConvertor, PgAlterTableSetNewSchemaConvertor, PgAlterTableRemoveFromSchemaConvertor, SqliteDropIndexConvertor, MySqlDropIndexConvertor, SQLiteRecreateTableConvertor, LibSQLRecreateTableConvertor, convertors;
22856
22880
  var init_sqlgenerator = __esm({
22857
22881
  "src/sqlgenerator.ts"() {
22858
22882
  "use strict";
@@ -23177,32 +23201,6 @@ var init_sqlgenerator = __esm({
23177
23201
  return `ALTER TABLE \`${statement.tableName}\` DROP INDEX \`${unsquashed.name}\`;`;
23178
23202
  }
23179
23203
  };
23180
- SQLiteAlterTableAddUniqueConstraintConvertor = class extends Convertor {
23181
- can(statement, dialect7) {
23182
- return statement.type === "create_unique_constraint" && dialect7 === "sqlite";
23183
- }
23184
- convert(statement) {
23185
- return `/*
23186
- SQLite does not support "Adding unique constraint to an existing table" out of the box, we do not generate automatic migration for that, so it has to be done manually
23187
- Please refer to: https://www.techonthenet.com/sqlite/unique.php
23188
-
23189
- Due to that we don't generate migration automatically and it has to be done manually
23190
- */`;
23191
- }
23192
- };
23193
- SQLiteAlterTableDropUniqueConstraintConvertor = class extends Convertor {
23194
- can(statement, dialect7) {
23195
- return statement.type === "delete_unique_constraint" && dialect7 === "sqlite";
23196
- }
23197
- convert(statement) {
23198
- return `/*
23199
- SQLite does not support "Dropping unique constraint from an existing table" out of the box, we do not generate automatic migration for that, so it has to be done manually
23200
- Please refer to: https://www.techonthenet.com/sqlite/unique.php
23201
-
23202
- Due to that we don't generate migration automatically and it has to be done manually
23203
- */`;
23204
- }
23205
- };
23206
23204
  CreatePgSequenceConvertor = class extends Convertor {
23207
23205
  can(statement, dialect7) {
23208
23206
  return statement.type === "create_sequence" && dialect7 === "postgresql";
@@ -23371,7 +23369,7 @@ var init_sqlgenerator = __esm({
23371
23369
  }
23372
23370
  convert(statement) {
23373
23371
  const { tableName, oldColumnName, newColumnName } = statement;
23374
- return `ALTER TABLE \`${tableName}\` RENAME COLUMN \`${oldColumnName}\` TO \`${newColumnName}\`;`;
23372
+ return `ALTER TABLE \`${tableName}\` RENAME COLUMN "${oldColumnName}" TO "${newColumnName}";`;
23375
23373
  }
23376
23374
  };
23377
23375
  PgAlterTableDropColumnConvertor = class extends Convertor {
@@ -23472,21 +23470,6 @@ var init_sqlgenerator = __esm({
23472
23470
  return `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN "${columnName}" SET DATA TYPE ${newDataType};`;
23473
23471
  }
23474
23472
  };
23475
- SQLiteAlterTableAlterColumnSetTypeConvertor = class extends Convertor {
23476
- can(statement, dialect7) {
23477
- return statement.type === "alter_table_alter_column_set_type" && dialect7 === "sqlite";
23478
- }
23479
- convert(statement) {
23480
- return `/*
23481
- SQLite does not support "Changing existing column type" out of the box, we do not generate automatic migration for that, so it has to be done manually
23482
- Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
23483
- https://www.sqlite.org/lang_altertable.html
23484
- https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3
23485
-
23486
- Due to that we don't generate migration automatically and it has to be done manually
23487
- */`;
23488
- }
23489
- };
23490
23473
  PgAlterTableAlterColumnSetDefaultConvertor = class extends Convertor {
23491
23474
  can(statement, dialect7) {
23492
23475
  return statement.type === "alter_table_alter_column_set_default" && dialect7 === "postgresql";
@@ -23497,21 +23480,6 @@ var init_sqlgenerator = __esm({
23497
23480
  return `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN "${columnName}" SET DEFAULT ${statement.newDefaultValue};`;
23498
23481
  }
23499
23482
  };
23500
- SqliteAlterTableAlterColumnSetDefaultConvertor = class extends Convertor {
23501
- can(statement, dialect7) {
23502
- return statement.type === "alter_table_alter_column_set_default" && dialect7 === "sqlite";
23503
- }
23504
- convert(statement) {
23505
- return `/*
23506
- SQLite does not support "Set default to column" out of the box, we do not generate automatic migration for that, so it has to be done manually
23507
- Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
23508
- https://www.sqlite.org/lang_altertable.html
23509
- https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3
23510
-
23511
- Due to that we don't generate migration automatically and it has to be done manually
23512
- */`;
23513
- }
23514
- };
23515
23483
  PgAlterTableAlterColumnDropDefaultConvertor = class extends Convertor {
23516
23484
  can(statement, dialect7) {
23517
23485
  return statement.type === "alter_table_alter_column_drop_default" && dialect7 === "postgresql";
@@ -23785,6 +23753,67 @@ var init_sqlgenerator = __esm({
23785
23753
  return `ALTER TABLE \`${statement.tableName}\` DROP PRIMARY KEY`;
23786
23754
  }
23787
23755
  };
23756
+ LibSQLModifyColumn = class extends Convertor {
23757
+ can(statement, dialect7, driver2) {
23758
+ return (statement.type === "alter_table_alter_column_set_type" || statement.type === "alter_table_alter_column_drop_notnull" || statement.type === "alter_table_alter_column_set_notnull" || statement.type === "alter_table_alter_column_set_default" || statement.type === "alter_table_alter_column_drop_default") && dialect7 === "sqlite" && driver2 === "turso";
23759
+ }
23760
+ convert(statement, json2, action) {
23761
+ const { tableName, columnName } = statement;
23762
+ let columnType = ``;
23763
+ let columnDefault = "";
23764
+ let columnNotNull = "";
23765
+ const sqlStatements = [];
23766
+ const indexes = [];
23767
+ for (const table4 of Object.values(json2.tables)) {
23768
+ for (const index4 of Object.values(table4.indexes)) {
23769
+ const unsquashed = SQLiteSquasher.unsquashIdx(index4);
23770
+ sqlStatements.push(`DROP INDEX IF EXISTS "${unsquashed.name}";`);
23771
+ indexes.push({ ...unsquashed, tableName: table4.name });
23772
+ }
23773
+ }
23774
+ switch (statement.type) {
23775
+ case "alter_table_alter_column_set_type":
23776
+ columnType = ` ${statement.newDataType}`;
23777
+ columnDefault = statement.columnDefault ? ` DEFAULT ${statement.columnDefault}` : "";
23778
+ columnNotNull = statement.columnNotNull ? ` NOT NULL` : "";
23779
+ break;
23780
+ case "alter_table_alter_column_drop_notnull":
23781
+ columnType = ` ${statement.newDataType}`;
23782
+ columnDefault = statement.columnDefault ? ` DEFAULT ${statement.columnDefault}` : "";
23783
+ columnNotNull = "";
23784
+ break;
23785
+ case "alter_table_alter_column_set_notnull":
23786
+ columnType = ` ${statement.newDataType}`;
23787
+ columnDefault = statement.columnDefault ? ` DEFAULT ${statement.columnDefault}` : "";
23788
+ columnNotNull = ` NOT NULL`;
23789
+ break;
23790
+ case "alter_table_alter_column_set_default":
23791
+ columnType = ` ${statement.newDataType}`;
23792
+ columnDefault = ` DEFAULT ${statement.newDefaultValue}`;
23793
+ columnNotNull = statement.columnNotNull ? ` NOT NULL` : "";
23794
+ break;
23795
+ case "alter_table_alter_column_drop_default":
23796
+ columnType = ` ${statement.newDataType}`;
23797
+ columnDefault = "";
23798
+ columnNotNull = statement.columnNotNull ? ` NOT NULL` : "";
23799
+ break;
23800
+ }
23801
+ columnDefault = columnDefault instanceof Date ? columnDefault.toISOString() : columnDefault;
23802
+ sqlStatements.push(
23803
+ `ALTER TABLE \`${tableName}\` ALTER COLUMN "${columnName}" TO "${columnName}"${columnType}${columnNotNull}${columnDefault};`
23804
+ );
23805
+ for (const index4 of indexes) {
23806
+ const indexPart = index4.isUnique ? "UNIQUE INDEX" : "INDEX";
23807
+ const whereStatement = index4.where ? ` WHERE ${index4.where}` : "";
23808
+ const uniqueString = index4.columns.map((it) => `\`${it}\``).join(",");
23809
+ const tableName2 = index4.tableName;
23810
+ sqlStatements.push(
23811
+ `CREATE ${indexPart} \`${index4.name}\` ON \`${tableName2}\` (${uniqueString})${whereStatement};`
23812
+ );
23813
+ }
23814
+ return sqlStatements;
23815
+ }
23816
+ };
23788
23817
  MySqlModifyColumn = class extends Convertor {
23789
23818
  can(statement, dialect7) {
23790
23819
  return (statement.type === "alter_table_alter_column_set_type" || statement.type === "alter_table_alter_column_set_notnull" || statement.type === "alter_table_alter_column_drop_notnull" || statement.type === "alter_table_alter_column_drop_on_update" || statement.type === "alter_table_alter_column_set_on_update" || statement.type === "alter_table_alter_column_set_autoincrement" || statement.type === "alter_table_alter_column_drop_autoincrement" || statement.type === "alter_table_alter_column_set_default" || statement.type === "alter_table_alter_column_drop_default" || statement.type === "alter_table_alter_column_set_generated" || statement.type === "alter_table_alter_column_drop_generated") && dialect7 === "mysql";
@@ -23923,21 +23952,6 @@ var init_sqlgenerator = __esm({
23923
23952
  return `ALTER TABLE \`${tableName}\` MODIFY COLUMN \`${columnName}\`${columnType}${columnAutoincrement}${columnNotNull}${columnDefault}${columnOnUpdate}${columnGenerated};`;
23924
23953
  }
23925
23954
  };
23926
- SqliteAlterTableAlterColumnDropDefaultConvertor = class extends Convertor {
23927
- can(statement, dialect7) {
23928
- return statement.type === "alter_table_alter_column_drop_default" && dialect7 === "sqlite";
23929
- }
23930
- convert(statement) {
23931
- return `/*
23932
- SQLite does not support "Drop default from column" out of the box, we do not generate automatic migration for that, so it has to be done manually
23933
- Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
23934
- https://www.sqlite.org/lang_altertable.html
23935
- https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3
23936
-
23937
- Due to that we don't generate migration automatically and it has to be done manually
23938
- */`;
23939
- }
23940
- };
23941
23955
  PgAlterTableCreateCompositePrimaryKeyConvertor = class extends Convertor {
23942
23956
  can(statement, dialect7) {
23943
23957
  return statement.type === "create_composite_pk" && dialect7 === "postgresql";
@@ -24002,85 +24016,6 @@ ${BREAKPOINT}ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT ${statement.newCo
24002
24016
  return `ALTER TABLE \`${statement.tableName}\` DROP PRIMARY KEY, ADD PRIMARY KEY(\`${newColumns.join("`,`")}\`);`;
24003
24017
  }
24004
24018
  };
24005
- SqliteAlterTableCreateCompositePrimaryKeyConvertor = class extends Convertor {
24006
- can(statement, dialect7) {
24007
- return statement.type === "create_composite_pk" && dialect7 === "sqlite";
24008
- }
24009
- convert(statement) {
24010
- let msg = "/*\n";
24011
- msg += `You're trying to add PRIMARY KEY(${statement.data}) to '${statement.tableName}' table
24012
- `;
24013
- msg += "SQLite does not support adding primary key to an already created table\n";
24014
- msg += "You can do it in 3 steps with drizzle orm:\n";
24015
- msg += " - create new mirror table with needed pk, rename current table to old_table, generate SQL\n";
24016
- msg += " - migrate old data from one table to another\n";
24017
- msg += " - delete old_table in schema, generate sql\n\n";
24018
- msg += "or create manual migration like below:\n\n";
24019
- msg += "ALTER TABLE table_name RENAME TO old_table;\n";
24020
- msg += "CREATE TABLE table_name (\n";
24021
- msg += " column1 datatype [ NULL | NOT NULL ],\n";
24022
- msg += " column2 datatype [ NULL | NOT NULL ],\n";
24023
- msg += " ...\n";
24024
- msg += " PRIMARY KEY (pk_col1, pk_col2, ... pk_col_n)\n";
24025
- msg += " );\n";
24026
- msg += "INSERT INTO table_name SELECT * FROM old_table;\n\n";
24027
- msg += "Due to that we don't generate migration automatically and it has to be done manually\n";
24028
- msg += "*/\n";
24029
- return msg;
24030
- }
24031
- };
24032
- SqliteAlterTableDeleteCompositePrimaryKeyConvertor = class extends Convertor {
24033
- can(statement, dialect7) {
24034
- return statement.type === "delete_composite_pk" && dialect7 === "sqlite";
24035
- }
24036
- convert(statement) {
24037
- let msg = "/*\n";
24038
- msg += `You're trying to delete PRIMARY KEY(${statement.data}) from '${statement.tableName}' table
24039
- `;
24040
- msg += "SQLite does not supportprimary key deletion from existing table\n";
24041
- msg += "You can do it in 3 steps with drizzle orm:\n";
24042
- msg += " - create new mirror table table without pk, rename current table to old_table, generate SQL\n";
24043
- msg += " - migrate old data from one table to another\n";
24044
- msg += " - delete old_table in schema, generate sql\n\n";
24045
- msg += "or create manual migration like below:\n\n";
24046
- msg += "ALTER TABLE table_name RENAME TO old_table;\n";
24047
- msg += "CREATE TABLE table_name (\n";
24048
- msg += " column1 datatype [ NULL | NOT NULL ],\n";
24049
- msg += " column2 datatype [ NULL | NOT NULL ],\n";
24050
- msg += " ...\n";
24051
- msg += " PRIMARY KEY (pk_col1, pk_col2, ... pk_col_n)\n";
24052
- msg += " );\n";
24053
- msg += "INSERT INTO table_name SELECT * FROM old_table;\n\n";
24054
- msg += "Due to that we don't generate migration automatically and it has to be done manually\n";
24055
- msg += "*/\n";
24056
- return msg;
24057
- }
24058
- };
24059
- SqliteAlterTableAlterCompositePrimaryKeyConvertor = class extends Convertor {
24060
- can(statement, dialect7) {
24061
- return statement.type === "alter_composite_pk" && dialect7 === "sqlite";
24062
- }
24063
- convert(statement) {
24064
- let msg = "/*\n";
24065
- msg += "SQLite does not support altering primary key\n";
24066
- msg += "You can do it in 3 steps with drizzle orm:\n";
24067
- msg += " - create new mirror table with needed pk, rename current table to old_table, generate SQL\n";
24068
- msg += " - migrate old data from one table to another\n";
24069
- msg += " - delete old_table in schema, generate sql\n\n";
24070
- msg += "or create manual migration like below:\n\n";
24071
- msg += "ALTER TABLE table_name RENAME TO old_table;\n";
24072
- msg += "CREATE TABLE table_name (\n";
24073
- msg += " column1 datatype [ NULL | NOT NULL ],\n";
24074
- msg += " column2 datatype [ NULL | NOT NULL ],\n";
24075
- msg += " ...\n";
24076
- msg += " PRIMARY KEY (pk_col1, pk_col2, ... pk_col_n)\n";
24077
- msg += " );\n";
24078
- msg += "INSERT INTO table_name SELECT * FROM old_table;\n\n";
24079
- msg += "Due to that we don't generate migration automatically and it has to be done manually\n";
24080
- msg += "*/\n";
24081
- return msg;
24082
- }
24083
- };
24084
24019
  PgAlterTableAlterColumnSetPrimaryKeyConvertor = class extends Convertor {
24085
24020
  can(statement, dialect7) {
24086
24021
  return statement.type === "alter_table_alter_column_set_pk" && dialect7 === "postgresql";
@@ -24125,51 +24060,6 @@ ${BREAKPOINT}ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT ${statement.newCo
24125
24060
  return `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN "${columnName}" SET NOT NULL;`;
24126
24061
  }
24127
24062
  };
24128
- SqliteAlterTableAlterColumnSetNotNullConvertor = class extends Convertor {
24129
- can(statement, dialect7) {
24130
- return statement.type === "alter_table_alter_column_set_notnull" && dialect7 === "sqlite";
24131
- }
24132
- convert(statement) {
24133
- return `/*
24134
- SQLite does not support "Set not null to column" out of the box, we do not generate automatic migration for that, so it has to be done manually
24135
- Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
24136
- https://www.sqlite.org/lang_altertable.html
24137
- https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3
24138
-
24139
- Due to that we don't generate migration automatically and it has to be done manually
24140
- */`;
24141
- }
24142
- };
24143
- SqliteAlterTableAlterColumnSetAutoincrementConvertor = class extends Convertor {
24144
- can(statement, dialect7) {
24145
- return statement.type === "alter_table_alter_column_set_autoincrement" && dialect7 === "sqlite";
24146
- }
24147
- convert(statement) {
24148
- return `/*
24149
- SQLite does not support "Set autoincrement to a column" out of the box, we do not generate automatic migration for that, so it has to be done manually
24150
- Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
24151
- https://www.sqlite.org/lang_altertable.html
24152
- https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3
24153
-
24154
- Due to that we don't generate migration automatically and it has to be done manually
24155
- */`;
24156
- }
24157
- };
24158
- SqliteAlterTableAlterColumnDropAutoincrementConvertor = class extends Convertor {
24159
- can(statement, dialect7) {
24160
- return statement.type === "alter_table_alter_column_drop_autoincrement" && dialect7 === "sqlite";
24161
- }
24162
- convert(statement) {
24163
- return `/*
24164
- SQLite does not support "Drop autoincrement from a column" out of the box, we do not generate automatic migration for that, so it has to be done manually
24165
- Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
24166
- https://www.sqlite.org/lang_altertable.html
24167
- https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3
24168
-
24169
- Due to that we don't generate migration automatically and it has to be done manually
24170
- */`;
24171
- }
24172
- };
24173
24063
  PgAlterTableAlterColumnDropNotNullConvertor = class extends Convertor {
24174
24064
  can(statement, dialect7) {
24175
24065
  return statement.type === "alter_table_alter_column_drop_notnull" && dialect7 === "postgresql";
@@ -24180,21 +24070,6 @@ ${BREAKPOINT}ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT ${statement.newCo
24180
24070
  return `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN "${columnName}" DROP NOT NULL;`;
24181
24071
  }
24182
24072
  };
24183
- SqliteAlterTableAlterColumnDropNotNullConvertor = class extends Convertor {
24184
- can(statement, dialect7) {
24185
- return statement.type === "alter_table_alter_column_drop_notnull" && dialect7 === "sqlite";
24186
- }
24187
- convert(statement) {
24188
- return `/*
24189
- SQLite does not support "Drop not null from column" out of the box, we do not generate automatic migration for that, so it has to be done manually
24190
- Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
24191
- https://www.sqlite.org/lang_altertable.html
24192
- https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3
24193
-
24194
- Due to that we don't generate migration automatically and it has to be done manually
24195
- */`;
24196
- }
24197
- };
24198
24073
  PgCreateForeignKeyConvertor = class extends Convertor {
24199
24074
  can(statement, dialect7) {
24200
24075
  return statement.type === "create_reference" && dialect7 === "postgresql";
@@ -24225,18 +24100,21 @@ ${BREAKPOINT}ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT ${statement.newCo
24225
24100
  return sql;
24226
24101
  }
24227
24102
  };
24228
- SqliteCreateForeignKeyConvertor = class extends Convertor {
24229
- can(statement, dialect7) {
24230
- return statement.type === "create_reference" && dialect7 === "sqlite";
24103
+ LibSQLCreateForeignKeyConvertor = class extends Convertor {
24104
+ can(statement, dialect7, driver2) {
24105
+ return statement.type === "create_reference" && dialect7 === "sqlite" && driver2 === "turso";
24231
24106
  }
24232
- convert(statement) {
24233
- return `/*
24234
- SQLite does not support "Creating foreign key on existing column" out of the box, we do not generate automatic migration for that, so it has to be done manually
24235
- Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
24236
- https://www.sqlite.org/lang_altertable.html
24237
-
24238
- Due to that we don't generate migration automatically and it has to be done manually
24239
- */`;
24107
+ convert(statement, json2, action) {
24108
+ const { columnsFrom, columnsTo, tableFrom, onDelete, onUpdate, tableTo } = action === "push" ? SQLiteSquasher.unsquashPushFK(statement.data) : SQLiteSquasher.unsquashFK(statement.data);
24109
+ const { columnDefault, columnNotNull, columnType } = statement;
24110
+ const onDeleteStatement = onDelete ? ` ON DELETE ${onDelete}` : "";
24111
+ const onUpdateStatement = onUpdate ? ` ON UPDATE ${onUpdate}` : "";
24112
+ const columnsDefaultValue = columnDefault ? ` DEFAULT ${columnDefault}` : "";
24113
+ const columnNotNullValue = columnNotNull ? ` NOT NULL` : "";
24114
+ const columnTypeValue = columnType ? ` ${columnType}` : "";
24115
+ const columnFrom = columnsFrom[0];
24116
+ const columnTo = columnsTo[0];
24117
+ return `ALTER TABLE \`${tableFrom}\` ALTER COLUMN "${columnFrom}" TO "${columnFrom}"${columnTypeValue}${columnNotNullValue}${columnsDefaultValue} REFERENCES ${tableTo}(${columnTo})${onDeleteStatement}${onUpdateStatement};`;
24240
24118
  }
24241
24119
  };
24242
24120
  MySqlCreateForeignKeyConvertor = class extends Convertor {
@@ -24285,20 +24163,6 @@ ${BREAKPOINT}ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT ${statement.newCo
24285
24163
  return sql;
24286
24164
  }
24287
24165
  };
24288
- SqliteAlterForeignKeyConvertor = class extends Convertor {
24289
- can(statement, dialect7) {
24290
- return statement.type === "alter_reference" && dialect7 === "sqlite";
24291
- }
24292
- convert(statement) {
24293
- return `/*
24294
- SQLite does not support "Changing existing foreign key" out of the box, we do not generate automatic migration for that, so it has to be done manually
24295
- Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
24296
- https://www.sqlite.org/lang_altertable.html
24297
-
24298
- Due to that we don't generate migration automatically and it has to be done manually
24299
- */`;
24300
- }
24301
- };
24302
24166
  PgDeleteForeignKeyConvertor = class extends Convertor {
24303
24167
  can(statement, dialect7) {
24304
24168
  return statement.type === "delete_reference" && dialect7 === "postgresql";
@@ -24311,20 +24175,6 @@ ${BREAKPOINT}ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT ${statement.newCo
24311
24175
  `;
24312
24176
  }
24313
24177
  };
24314
- SqliteDeleteForeignKeyConvertor = class extends Convertor {
24315
- can(statement, dialect7) {
24316
- return statement.type === "delete_reference" && dialect7 === "sqlite";
24317
- }
24318
- convert(statement) {
24319
- return `/*
24320
- SQLite does not support "Dropping foreign key" out of the box, we do not generate automatic migration for that, so it has to be done manually
24321
- Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php
24322
- https://www.sqlite.org/lang_altertable.html
24323
-
24324
- Due to that we don't generate migration automatically and it has to be done manually
24325
- */`;
24326
- }
24327
- };
24328
24178
  MySqlDeleteForeignKeyConvertor = class extends Convertor {
24329
24179
  can(statement, dialect7) {
24330
24180
  return statement.type === "delete_reference" && dialect7 === "mysql";
@@ -24490,10 +24340,96 @@ ${BREAKPOINT}ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT ${statement.newCo
24490
24340
  return `DROP INDEX \`${name}\` ON \`${statement.tableName}\`;`;
24491
24341
  }
24492
24342
  };
24343
+ SQLiteRecreateTableConvertor = class extends Convertor {
24344
+ can(statement, dialect7, driver2) {
24345
+ return statement.type === "recreate_table" && dialect7 === "sqlite" && !driver2;
24346
+ }
24347
+ convert(statement) {
24348
+ const { tableName, columns, compositePKs, referenceData } = statement;
24349
+ const columnNames = columns.map((it) => `"${it.name}"`).join(", ");
24350
+ const newTableName = `__new_${tableName}`;
24351
+ const sqlStatements = [];
24352
+ sqlStatements.push(`PRAGMA foreign_keys=OFF;`);
24353
+ sqlStatements.push(
24354
+ new SQLiteCreateTableConvertor().convert({
24355
+ type: "sqlite_create_table",
24356
+ tableName: newTableName,
24357
+ columns,
24358
+ referenceData,
24359
+ compositePKs
24360
+ })
24361
+ );
24362
+ sqlStatements.push(
24363
+ `INSERT INTO \`${newTableName}\`(${columnNames}) SELECT ${columnNames} FROM \`${tableName}\`;`
24364
+ );
24365
+ sqlStatements.push(
24366
+ new SQLiteDropTableConvertor().convert({
24367
+ type: "drop_table",
24368
+ tableName,
24369
+ schema: ""
24370
+ })
24371
+ );
24372
+ sqlStatements.push(
24373
+ new SqliteRenameTableConvertor().convert({
24374
+ fromSchema: "",
24375
+ tableNameFrom: newTableName,
24376
+ tableNameTo: tableName,
24377
+ toSchema: "",
24378
+ type: "rename_table"
24379
+ })
24380
+ );
24381
+ sqlStatements.push(`PRAGMA foreign_keys=ON;`);
24382
+ return sqlStatements;
24383
+ }
24384
+ };
24385
+ LibSQLRecreateTableConvertor = class extends Convertor {
24386
+ can(statement, dialect7, driver2) {
24387
+ return statement.type === "recreate_table" && dialect7 === "sqlite" && driver2 === "turso";
24388
+ }
24389
+ convert(statement) {
24390
+ const { tableName, columns, compositePKs, referenceData } = statement;
24391
+ const columnNames = columns.map((it) => `"${it.name}"`).join(", ");
24392
+ const newTableName = `__new_${tableName}`;
24393
+ const sqlStatements = [];
24394
+ sqlStatements.push(`PRAGMA foreign_keys=OFF;`);
24395
+ sqlStatements.push(
24396
+ new SQLiteCreateTableConvertor().convert({
24397
+ type: "sqlite_create_table",
24398
+ tableName: newTableName,
24399
+ columns,
24400
+ referenceData,
24401
+ compositePKs
24402
+ })
24403
+ );
24404
+ sqlStatements.push(
24405
+ `INSERT INTO \`${newTableName}\`(${columnNames}) SELECT ${columnNames} FROM \`${tableName}\`;`
24406
+ );
24407
+ sqlStatements.push(
24408
+ new SQLiteDropTableConvertor().convert({
24409
+ type: "drop_table",
24410
+ tableName,
24411
+ schema: ""
24412
+ })
24413
+ );
24414
+ sqlStatements.push(
24415
+ new SqliteRenameTableConvertor().convert({
24416
+ fromSchema: "",
24417
+ tableNameFrom: newTableName,
24418
+ tableNameTo: tableName,
24419
+ toSchema: "",
24420
+ type: "rename_table"
24421
+ })
24422
+ );
24423
+ sqlStatements.push(`PRAGMA foreign_keys=ON;`);
24424
+ return sqlStatements;
24425
+ }
24426
+ };
24493
24427
  convertors = [];
24494
24428
  convertors.push(new PgCreateTableConvertor());
24495
24429
  convertors.push(new MySqlCreateTableConvertor());
24496
24430
  convertors.push(new SQLiteCreateTableConvertor());
24431
+ convertors.push(new SQLiteRecreateTableConvertor());
24432
+ convertors.push(new LibSQLRecreateTableConvertor());
24497
24433
  convertors.push(new CreateTypeEnumConvertor());
24498
24434
  convertors.push(new CreatePgSequenceConvertor());
24499
24435
  convertors.push(new DropPgSequenceConvertor());
@@ -24541,6 +24477,7 @@ ${BREAKPOINT}ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT ${statement.newCo
24541
24477
  convertors.push(new SqliteAlterTableAlterColumnAlterGeneratedConvertor());
24542
24478
  convertors.push(new SqliteAlterTableAlterColumnSetExpressionConvertor());
24543
24479
  convertors.push(new MySqlModifyColumn());
24480
+ convertors.push(new LibSQLModifyColumn());
24544
24481
  convertors.push(new PgCreateForeignKeyConvertor());
24545
24482
  convertors.push(new MySqlCreateForeignKeyConvertor());
24546
24483
  convertors.push(new PgAlterForeignKeyConvertor());
@@ -24552,24 +24489,10 @@ ${BREAKPOINT}ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT ${statement.newCo
24552
24489
  convertors.push(new PgAlterTableSetSchemaConvertor());
24553
24490
  convertors.push(new PgAlterTableSetNewSchemaConvertor());
24554
24491
  convertors.push(new PgAlterTableRemoveFromSchemaConvertor());
24555
- convertors.push(new SQLiteAlterTableAlterColumnSetTypeConvertor());
24556
- convertors.push(new SqliteAlterForeignKeyConvertor());
24557
- convertors.push(new SqliteDeleteForeignKeyConvertor());
24558
- convertors.push(new SqliteCreateForeignKeyConvertor());
24559
- convertors.push(new SQLiteAlterTableAddUniqueConstraintConvertor());
24560
- convertors.push(new SQLiteAlterTableDropUniqueConstraintConvertor());
24492
+ convertors.push(new LibSQLCreateForeignKeyConvertor());
24561
24493
  convertors.push(new PgAlterTableAlterColumnDropGenerated());
24562
24494
  convertors.push(new PgAlterTableAlterColumnSetGenerated());
24563
24495
  convertors.push(new PgAlterTableAlterColumnAlterGenerated());
24564
- convertors.push(new SqliteAlterTableAlterColumnSetNotNullConvertor());
24565
- convertors.push(new SqliteAlterTableAlterColumnDropNotNullConvertor());
24566
- convertors.push(new SqliteAlterTableAlterColumnSetDefaultConvertor());
24567
- convertors.push(new SqliteAlterTableAlterColumnDropDefaultConvertor());
24568
- convertors.push(new SqliteAlterTableAlterColumnSetAutoincrementConvertor());
24569
- convertors.push(new SqliteAlterTableAlterColumnDropAutoincrementConvertor());
24570
- convertors.push(new SqliteAlterTableCreateCompositePrimaryKeyConvertor());
24571
- convertors.push(new SqliteAlterTableDeleteCompositePrimaryKeyConvertor());
24572
- convertors.push(new SqliteAlterTableAlterCompositePrimaryKeyConvertor());
24573
24496
  convertors.push(new PgAlterTableCreateCompositePrimaryKeyConvertor());
24574
24497
  convertors.push(new PgAlterTableDeleteCompositePrimaryKeyConvertor());
24575
24498
  convertors.push(new PgAlterTableAlterCompositePrimaryKeyConvertor());
@@ -24578,19 +24501,6 @@ ${BREAKPOINT}ALTER TABLE ${tableNameWithSchema} ADD CONSTRAINT ${statement.newCo
24578
24501
  convertors.push(new MySqlAlterTableCreateCompositePrimaryKeyConvertor());
24579
24502
  convertors.push(new MySqlAlterTableAddPk());
24580
24503
  convertors.push(new MySqlAlterTableAlterCompositePrimaryKeyConvertor());
24581
- fromJson = (statements, dialect7) => {
24582
- const result = statements.flatMap((statement) => {
24583
- const filtered = convertors.filter((it) => {
24584
- return it.can(statement, dialect7);
24585
- });
24586
- const convertor = filtered.length === 1 ? filtered[0] : void 0;
24587
- if (!convertor) {
24588
- return "";
24589
- }
24590
- return convertor.convert(statement);
24591
- }).filter((it) => it !== "");
24592
- return result;
24593
- };
24594
24504
  https:
24595
24505
  `
24596
24506
  create table users (
@@ -24618,12 +24528,248 @@ drop type __venum;
24618
24528
  }
24619
24529
  });
24620
24530
 
24531
+ // src/cli/commands/sqlitePushUtils.ts
24532
+ var _moveDataStatements, getOldTableName, getNewTableName, logSuggestionsAndReturn;
24533
+ var init_sqlitePushUtils = __esm({
24534
+ "src/cli/commands/sqlitePushUtils.ts"() {
24535
+ "use strict";
24536
+ init_source();
24537
+ init_sqliteSchema();
24538
+ init_sqlgenerator();
24539
+ init_utils();
24540
+ _moveDataStatements = (tableName, json, dataLoss = false) => {
24541
+ const statements = [];
24542
+ const newTableName = `__new_${tableName}`;
24543
+ const tableColumns = Object.values(json.tables[tableName].columns);
24544
+ const referenceData = Object.values(json.tables[tableName].foreignKeys);
24545
+ const compositePKs = Object.values(
24546
+ json.tables[tableName].compositePrimaryKeys
24547
+ ).map((it) => SQLiteSquasher.unsquashPK(it));
24548
+ const fks = referenceData.map((it) => SQLiteSquasher.unsquashPushFK(it));
24549
+ statements.push(
24550
+ new SQLiteCreateTableConvertor().convert({
24551
+ type: "sqlite_create_table",
24552
+ tableName: newTableName,
24553
+ columns: tableColumns,
24554
+ referenceData: fks,
24555
+ compositePKs
24556
+ })
24557
+ );
24558
+ if (!dataLoss) {
24559
+ const columns = Object.keys(json.tables[tableName].columns).map(
24560
+ (c) => `"${c}"`
24561
+ );
24562
+ statements.push(
24563
+ `INSERT INTO \`${newTableName}\`(${columns.join(
24564
+ ", "
24565
+ )}) SELECT ${columns.join(", ")} FROM \`${tableName}\`;`
24566
+ );
24567
+ }
24568
+ statements.push(
24569
+ new SQLiteDropTableConvertor().convert({
24570
+ type: "drop_table",
24571
+ tableName,
24572
+ schema: ""
24573
+ })
24574
+ );
24575
+ statements.push(
24576
+ new SqliteRenameTableConvertor().convert({
24577
+ fromSchema: "",
24578
+ tableNameFrom: newTableName,
24579
+ tableNameTo: tableName,
24580
+ toSchema: "",
24581
+ type: "rename_table"
24582
+ })
24583
+ );
24584
+ for (const idx of Object.values(json.tables[tableName].indexes)) {
24585
+ statements.push(
24586
+ new CreateSqliteIndexConvertor().convert({
24587
+ type: "create_index",
24588
+ tableName,
24589
+ schema: "",
24590
+ data: idx
24591
+ })
24592
+ );
24593
+ }
24594
+ return statements;
24595
+ };
24596
+ getOldTableName = (tableName, meta) => {
24597
+ for (const key of Object.keys(meta.tables)) {
24598
+ const value = meta.tables[key];
24599
+ if (`"${tableName}"` === value) {
24600
+ return key.substring(1, key.length - 1);
24601
+ }
24602
+ }
24603
+ return tableName;
24604
+ };
24605
+ getNewTableName = (tableName, meta) => {
24606
+ if (typeof meta.tables[`"${tableName}"`] !== "undefined") {
24607
+ return meta.tables[`"${tableName}"`].substring(
24608
+ 1,
24609
+ meta.tables[`"${tableName}"`].length - 1
24610
+ );
24611
+ }
24612
+ return tableName;
24613
+ };
24614
+ logSuggestionsAndReturn = async (connection, statements, json1, json2, meta) => {
24615
+ let shouldAskForApprove = false;
24616
+ const statementsToExecute = [];
24617
+ const infoToPrint = [];
24618
+ const tablesToRemove = [];
24619
+ const columnsToRemove = [];
24620
+ const schemasToRemove = [];
24621
+ const tablesToTruncate = [];
24622
+ for (const statement of statements) {
24623
+ if (statement.type === "drop_table") {
24624
+ const res = await connection.query(
24625
+ `select count(*) as count from \`${statement.tableName}\``
24626
+ );
24627
+ const count = Number(res[0].count);
24628
+ if (count > 0) {
24629
+ infoToPrint.push(
24630
+ `\xB7 You're about to delete ${source_default.underline(
24631
+ statement.tableName
24632
+ )} table with ${count} items`
24633
+ );
24634
+ tablesToRemove.push(statement.tableName);
24635
+ shouldAskForApprove = true;
24636
+ }
24637
+ const fromJsonStatement = fromJson([statement], "sqlite", "push");
24638
+ statementsToExecute.push(
24639
+ ...Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]
24640
+ );
24641
+ } else if (statement.type === "alter_table_drop_column") {
24642
+ const tableName = statement.tableName;
24643
+ const columnName = statement.columnName;
24644
+ const res = await connection.query(
24645
+ `select count(\`${tableName}\`.\`${columnName}\`) as count from \`${tableName}\``
24646
+ );
24647
+ const count = Number(res[0].count);
24648
+ if (count > 0) {
24649
+ infoToPrint.push(
24650
+ `\xB7 You're about to delete ${source_default.underline(
24651
+ columnName
24652
+ )} column in ${tableName} table with ${count} items`
24653
+ );
24654
+ columnsToRemove.push(`${tableName}_${statement.columnName}`);
24655
+ shouldAskForApprove = true;
24656
+ }
24657
+ const fromJsonStatement = fromJson([statement], "sqlite", "push");
24658
+ statementsToExecute.push(
24659
+ ...Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]
24660
+ );
24661
+ } else if (statement.type === "sqlite_alter_table_add_column" && (statement.column.notNull && !statement.column.default)) {
24662
+ const tableName = statement.tableName;
24663
+ const columnName = statement.column.name;
24664
+ const res = await connection.query(
24665
+ `select count(*) as count from \`${tableName}\``
24666
+ );
24667
+ const count = Number(res[0].count);
24668
+ if (count > 0) {
24669
+ infoToPrint.push(
24670
+ `\xB7 You're about to add not-null ${source_default.underline(
24671
+ columnName
24672
+ )} column without default value, which contains ${count} items`
24673
+ );
24674
+ tablesToTruncate.push(tableName);
24675
+ statementsToExecute.push(`delete from ${tableName};`);
24676
+ shouldAskForApprove = true;
24677
+ }
24678
+ const fromJsonStatement = fromJson([statement], "sqlite", "push");
24679
+ statementsToExecute.push(
24680
+ ...Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]
24681
+ );
24682
+ } else if (statement.type === "recreate_table") {
24683
+ const tableName = statement.tableName;
24684
+ const oldTableName = getOldTableName(tableName, meta);
24685
+ let dataLoss = false;
24686
+ const prevColumnNames = Object.keys(json1.tables[oldTableName].columns);
24687
+ const currentColumnNames = Object.keys(json2.tables[tableName].columns);
24688
+ const { removedColumns, addedColumns } = findAddedAndRemoved(
24689
+ prevColumnNames,
24690
+ currentColumnNames
24691
+ );
24692
+ if (removedColumns.length) {
24693
+ for (const removedColumn of removedColumns) {
24694
+ const res = await connection.query(
24695
+ `select count(\`${tableName}\`.\`${removedColumn}\`) as count from \`${tableName}\``
24696
+ );
24697
+ const count = Number(res[0].count);
24698
+ if (count > 0) {
24699
+ infoToPrint.push(
24700
+ `\xB7 You're about to delete ${source_default.underline(
24701
+ removedColumn
24702
+ )} column in ${tableName} table with ${count} items`
24703
+ );
24704
+ columnsToRemove.push(removedColumn);
24705
+ shouldAskForApprove = true;
24706
+ }
24707
+ }
24708
+ }
24709
+ if (addedColumns.length) {
24710
+ for (const addedColumn of addedColumns) {
24711
+ const [res] = await connection.query(
24712
+ `select count(*) as count from \`${tableName}\``
24713
+ );
24714
+ const columnConf = json2.tables[tableName].columns[addedColumn];
24715
+ const count = Number(res.count);
24716
+ if (count > 0 && columnConf.notNull && !columnConf.default) {
24717
+ dataLoss = true;
24718
+ infoToPrint.push(
24719
+ `\xB7 You're about to add not-null ${source_default.underline(
24720
+ addedColumn
24721
+ )} column without default value to table, which contains ${count} items`
24722
+ );
24723
+ shouldAskForApprove = true;
24724
+ tablesToTruncate.push(tableName);
24725
+ statementsToExecute.push(`DELETE FROM \`${tableName}\`;`);
24726
+ }
24727
+ }
24728
+ }
24729
+ const tablesReferencingCurrent = [];
24730
+ for (const table4 of Object.values(json2.tables)) {
24731
+ const tablesRefs = Object.values(json2.tables[table4.name].foreignKeys).filter((t2) => SQLiteSquasher.unsquashPushFK(t2).tableTo === tableName).map((it) => SQLiteSquasher.unsquashPushFK(it).tableFrom);
24732
+ tablesReferencingCurrent.push(...tablesRefs);
24733
+ }
24734
+ if (!tablesReferencingCurrent.length) {
24735
+ statementsToExecute.push(..._moveDataStatements(tableName, json2, dataLoss));
24736
+ continue;
24737
+ }
24738
+ const [{ foreign_keys: pragmaState }] = await connection.query(`PRAGMA foreign_keys;`);
24739
+ if (pragmaState) {
24740
+ statementsToExecute.push(`PRAGMA foreign_keys=OFF;`);
24741
+ }
24742
+ statementsToExecute.push(..._moveDataStatements(tableName, json2, dataLoss));
24743
+ if (pragmaState) {
24744
+ statementsToExecute.push(`PRAGMA foreign_keys=ON;`);
24745
+ }
24746
+ } else {
24747
+ const fromJsonStatement = fromJson([statement], "sqlite", "push");
24748
+ statementsToExecute.push(
24749
+ ...Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]
24750
+ );
24751
+ }
24752
+ }
24753
+ return {
24754
+ statementsToExecute,
24755
+ shouldAskForApprove,
24756
+ infoToPrint,
24757
+ columnsToRemove: [...new Set(columnsToRemove)],
24758
+ schemasToRemove: [...new Set(schemasToRemove)],
24759
+ tablesToTruncate: [...new Set(tablesToTruncate)],
24760
+ tablesToRemove: [...new Set(tablesToRemove)]
24761
+ };
24762
+ };
24763
+ }
24764
+ });
24765
+
24621
24766
  // src/jsonStatements.ts
24622
- var preparePgCreateTableJson, prepareMySqlCreateTableJson, prepareSQLiteCreateTable, prepareDropTableJson, prepareRenameTableJson, prepareCreateEnumJson, prepareAddValuesToEnumJson, prepareDropEnumJson, prepareMoveEnumJson, prepareRenameEnumJson, prepareCreateSequenceJson, prepareAlterSequenceJson, prepareDropSequenceJson, prepareMoveSequenceJson, prepareRenameSequenceJson, prepareCreateSchemasJson, prepareRenameSchemasJson, prepareDeleteSchemasJson, prepareRenameColumns, _prepareDropColumns, _prepareAddColumns, _prepareSqliteAddColumns, prepareAlterColumnsMysql, preparePgAlterColumns, prepareSqliteAlterColumns, preparePgCreateIndexesJson, prepareCreateIndexesJson, prepareCreateReferencesJson, prepareDropReferencesJson, prepareAlterReferencesJson, prepareDropIndexesJson, prepareAddCompositePrimaryKeySqlite, prepareDeleteCompositePrimaryKeySqlite, prepareAlterCompositePrimaryKeySqlite, prepareAddCompositePrimaryKeyPg, prepareDeleteCompositePrimaryKeyPg, prepareAlterCompositePrimaryKeyPg, prepareAddUniqueConstraintPg, prepareDeleteUniqueConstraintPg, prepareAddCompositePrimaryKeyMySql, prepareDeleteCompositePrimaryKeyMySql, prepareAlterCompositePrimaryKeyMySql;
24767
+ var preparePgCreateTableJson, prepareMySqlCreateTableJson, prepareSQLiteCreateTable, prepareDropTableJson, prepareRenameTableJson, prepareCreateEnumJson, prepareAddValuesToEnumJson, prepareDropEnumJson, prepareMoveEnumJson, prepareRenameEnumJson, prepareCreateSequenceJson, prepareAlterSequenceJson, prepareDropSequenceJson, prepareMoveSequenceJson, prepareRenameSequenceJson, prepareCreateSchemasJson, prepareRenameSchemasJson, prepareDeleteSchemasJson, prepareRenameColumns, _prepareDropColumns, _prepareAddColumns, _prepareSqliteAddColumns, prepareAlterColumnsMysql, preparePgAlterColumns, prepareSqliteAlterColumns, preparePgCreateIndexesJson, prepareCreateIndexesJson, prepareCreateReferencesJson, prepareLibSQLCreateReferencesJson, prepareDropReferencesJson, prepareLibSQLDropReferencesJson, prepareAlterReferencesJson, prepareDropIndexesJson, prepareAddCompositePrimaryKeySqlite, prepareDeleteCompositePrimaryKeySqlite, prepareAlterCompositePrimaryKeySqlite, prepareAddCompositePrimaryKeyPg, prepareDeleteCompositePrimaryKeyPg, prepareAlterCompositePrimaryKeyPg, prepareAddUniqueConstraintPg, prepareDeleteUniqueConstraintPg, prepareAddCompositePrimaryKeyMySql, prepareDeleteCompositePrimaryKeyMySql, prepareAlterCompositePrimaryKeyMySql;
24623
24768
  var init_jsonStatements = __esm({
24624
24769
  "src/jsonStatements.ts"() {
24625
24770
  "use strict";
24626
24771
  init_source();
24772
+ init_sqlitePushUtils();
24627
24773
  init_views();
24628
24774
  init_mysqlSchema();
24629
24775
  init_pgSchema();
@@ -25397,7 +25543,7 @@ var init_jsonStatements = __esm({
25397
25543
  return [...dropPkStatements, ...setPkStatements, ...statements];
25398
25544
  };
25399
25545
  prepareSqliteAlterColumns = (tableName, schema5, columns, json2) => {
25400
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
25546
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
25401
25547
  let statements = [];
25402
25548
  let dropPkStatements = [];
25403
25549
  let setPkStatements = [];
@@ -25411,6 +25557,49 @@ var init_jsonStatements = __esm({
25411
25557
  const columnPk = json2.tables[tableName].columns[columnName].primaryKey;
25412
25558
  const columnGenerated = json2.tables[tableName].columns[columnName].generated;
25413
25559
  const compositePk = json2.tables[tableName].compositePrimaryKeys[`${tableName}_${columnName}`];
25560
+ if (((_a = column7.autoincrement) == null ? void 0 : _a.type) === "added") {
25561
+ statements.push({
25562
+ type: "alter_table_alter_column_set_autoincrement",
25563
+ tableName,
25564
+ columnName,
25565
+ schema: schema5,
25566
+ newDataType: columnType,
25567
+ columnDefault,
25568
+ columnOnUpdate,
25569
+ columnNotNull,
25570
+ columnAutoIncrement,
25571
+ columnPk
25572
+ });
25573
+ }
25574
+ if (((_b = column7.autoincrement) == null ? void 0 : _b.type) === "changed") {
25575
+ const type = column7.autoincrement.new ? "alter_table_alter_column_set_autoincrement" : "alter_table_alter_column_drop_autoincrement";
25576
+ statements.push({
25577
+ type,
25578
+ tableName,
25579
+ columnName,
25580
+ schema: schema5,
25581
+ newDataType: columnType,
25582
+ columnDefault,
25583
+ columnOnUpdate,
25584
+ columnNotNull,
25585
+ columnAutoIncrement,
25586
+ columnPk
25587
+ });
25588
+ }
25589
+ if (((_c = column7.autoincrement) == null ? void 0 : _c.type) === "deleted") {
25590
+ statements.push({
25591
+ type: "alter_table_alter_column_drop_autoincrement",
25592
+ tableName,
25593
+ columnName,
25594
+ schema: schema5,
25595
+ newDataType: columnType,
25596
+ columnDefault,
25597
+ columnOnUpdate,
25598
+ columnNotNull,
25599
+ columnAutoIncrement,
25600
+ columnPk
25601
+ });
25602
+ }
25414
25603
  if (typeof column7.name !== "string") {
25415
25604
  statements.push({
25416
25605
  type: "alter_table_rename_column",
@@ -25420,7 +25609,7 @@ var init_jsonStatements = __esm({
25420
25609
  schema: schema5
25421
25610
  });
25422
25611
  }
25423
- if (((_a = column7.type) == null ? void 0 : _a.type) === "changed") {
25612
+ if (((_d = column7.type) == null ? void 0 : _d.type) === "changed") {
25424
25613
  statements.push({
25425
25614
  type: "alter_table_alter_column_set_type",
25426
25615
  tableName,
@@ -25435,7 +25624,7 @@ var init_jsonStatements = __esm({
25435
25624
  columnPk
25436
25625
  });
25437
25626
  }
25438
- if (((_b = column7.primaryKey) == null ? void 0 : _b.type) === "deleted" || ((_c = column7.primaryKey) == null ? void 0 : _c.type) === "changed" && !column7.primaryKey.new && typeof compositePk === "undefined") {
25627
+ if (((_e = column7.primaryKey) == null ? void 0 : _e.type) === "deleted" || ((_f = column7.primaryKey) == null ? void 0 : _f.type) === "changed" && !column7.primaryKey.new && typeof compositePk === "undefined") {
25439
25628
  dropPkStatements.push({
25440
25629
  ////
25441
25630
  type: "alter_table_alter_column_drop_pk",
@@ -25444,7 +25633,7 @@ var init_jsonStatements = __esm({
25444
25633
  schema: schema5
25445
25634
  });
25446
25635
  }
25447
- if (((_d = column7.default) == null ? void 0 : _d.type) === "added") {
25636
+ if (((_g = column7.default) == null ? void 0 : _g.type) === "added") {
25448
25637
  statements.push({
25449
25638
  type: "alter_table_alter_column_set_default",
25450
25639
  tableName,
@@ -25458,7 +25647,7 @@ var init_jsonStatements = __esm({
25458
25647
  columnPk
25459
25648
  });
25460
25649
  }
25461
- if (((_e = column7.default) == null ? void 0 : _e.type) === "changed") {
25650
+ if (((_h = column7.default) == null ? void 0 : _h.type) === "changed") {
25462
25651
  statements.push({
25463
25652
  type: "alter_table_alter_column_set_default",
25464
25653
  tableName,
@@ -25473,7 +25662,7 @@ var init_jsonStatements = __esm({
25473
25662
  columnPk
25474
25663
  });
25475
25664
  }
25476
- if (((_f = column7.default) == null ? void 0 : _f.type) === "deleted") {
25665
+ if (((_i = column7.default) == null ? void 0 : _i.type) === "deleted") {
25477
25666
  statements.push({
25478
25667
  type: "alter_table_alter_column_drop_default",
25479
25668
  tableName,
@@ -25487,7 +25676,7 @@ var init_jsonStatements = __esm({
25487
25676
  columnPk
25488
25677
  });
25489
25678
  }
25490
- if (((_g = column7.notNull) == null ? void 0 : _g.type) === "added") {
25679
+ if (((_j = column7.notNull) == null ? void 0 : _j.type) === "added") {
25491
25680
  statements.push({
25492
25681
  type: "alter_table_alter_column_set_notnull",
25493
25682
  tableName,
@@ -25501,7 +25690,7 @@ var init_jsonStatements = __esm({
25501
25690
  columnPk
25502
25691
  });
25503
25692
  }
25504
- if (((_h = column7.notNull) == null ? void 0 : _h.type) === "changed") {
25693
+ if (((_k = column7.notNull) == null ? void 0 : _k.type) === "changed") {
25505
25694
  const type = column7.notNull.new ? "alter_table_alter_column_set_notnull" : "alter_table_alter_column_drop_notnull";
25506
25695
  statements.push({
25507
25696
  type,
@@ -25516,7 +25705,7 @@ var init_jsonStatements = __esm({
25516
25705
  columnPk
25517
25706
  });
25518
25707
  }
25519
- if (((_i = column7.notNull) == null ? void 0 : _i.type) === "deleted") {
25708
+ if (((_l = column7.notNull) == null ? void 0 : _l.type) === "deleted") {
25520
25709
  statements.push({
25521
25710
  type: "alter_table_alter_column_drop_notnull",
25522
25711
  tableName,
@@ -25530,7 +25719,7 @@ var init_jsonStatements = __esm({
25530
25719
  columnPk
25531
25720
  });
25532
25721
  }
25533
- if (((_j = column7.generated) == null ? void 0 : _j.type) === "added") {
25722
+ if (((_m = column7.generated) == null ? void 0 : _m.type) === "added") {
25534
25723
  if ((columnGenerated == null ? void 0 : columnGenerated.type) === "virtual") {
25535
25724
  statements.push({
25536
25725
  type: "alter_table_alter_column_set_generated",
@@ -25551,7 +25740,7 @@ var init_jsonStatements = __esm({
25551
25740
  );
25552
25741
  }
25553
25742
  }
25554
- if (((_k = column7.generated) == null ? void 0 : _k.type) === "changed") {
25743
+ if (((_n = column7.generated) == null ? void 0 : _n.type) === "changed") {
25555
25744
  if ((columnGenerated == null ? void 0 : columnGenerated.type) === "virtual") {
25556
25745
  statements.push({
25557
25746
  type: "alter_table_alter_column_alter_generated",
@@ -25572,7 +25761,7 @@ var init_jsonStatements = __esm({
25572
25761
  );
25573
25762
  }
25574
25763
  }
25575
- if (((_l = column7.generated) == null ? void 0 : _l.type) === "deleted") {
25764
+ if (((_o = column7.generated) == null ? void 0 : _o.type) === "deleted") {
25576
25765
  statements.push({
25577
25766
  type: "alter_table_alter_column_drop_generated",
25578
25767
  tableName,
@@ -25587,7 +25776,7 @@ var init_jsonStatements = __esm({
25587
25776
  columnGenerated
25588
25777
  });
25589
25778
  }
25590
- if (((_m = column7.primaryKey) == null ? void 0 : _m.type) === "added" || ((_n = column7.primaryKey) == null ? void 0 : _n.type) === "changed" && column7.primaryKey.new) {
25779
+ if (((_p = column7.primaryKey) == null ? void 0 : _p.type) === "added" || ((_q = column7.primaryKey) == null ? void 0 : _q.type) === "changed" && column7.primaryKey.new) {
25591
25780
  const wasAutoincrement = statements.filter(
25592
25781
  (it) => it.type === "alter_table_alter_column_set_autoincrement"
25593
25782
  );
@@ -25600,7 +25789,7 @@ var init_jsonStatements = __esm({
25600
25789
  });
25601
25790
  }
25602
25791
  }
25603
- if (((_o = column7.onUpdate) == null ? void 0 : _o.type) === "added") {
25792
+ if (((_r = column7.onUpdate) == null ? void 0 : _r.type) === "added") {
25604
25793
  statements.push({
25605
25794
  type: "alter_table_alter_column_set_on_update",
25606
25795
  tableName,
@@ -25614,7 +25803,7 @@ var init_jsonStatements = __esm({
25614
25803
  columnPk
25615
25804
  });
25616
25805
  }
25617
- if (((_p = column7.onUpdate) == null ? void 0 : _p.type) === "deleted") {
25806
+ if (((_s = column7.onUpdate) == null ? void 0 : _s.type) === "deleted") {
25618
25807
  statements.push({
25619
25808
  type: "alter_table_alter_column_drop_on_update",
25620
25809
  tableName,
@@ -25674,6 +25863,37 @@ var init_jsonStatements = __esm({
25674
25863
  };
25675
25864
  });
25676
25865
  };
25866
+ prepareLibSQLCreateReferencesJson = (tableName, schema5, foreignKeys, json2, action) => {
25867
+ return Object.values(foreignKeys).map((fkData) => {
25868
+ const { columnsFrom, tableFrom, columnsTo } = action === "push" ? SQLiteSquasher.unsquashPushFK(fkData) : SQLiteSquasher.unsquashFK(fkData);
25869
+ let isMulticolumn = false;
25870
+ if (columnsFrom.length > 1 || columnsTo.length > 1) {
25871
+ isMulticolumn = true;
25872
+ return {
25873
+ type: "create_reference",
25874
+ tableName,
25875
+ data: fkData,
25876
+ schema: schema5,
25877
+ isMulticolumn
25878
+ };
25879
+ }
25880
+ const columnFrom = columnsFrom[0];
25881
+ const {
25882
+ notNull: columnNotNull,
25883
+ default: columnDefault,
25884
+ type: columnType
25885
+ } = json2.tables[tableFrom].columns[columnFrom];
25886
+ return {
25887
+ type: "create_reference",
25888
+ tableName,
25889
+ data: fkData,
25890
+ schema: schema5,
25891
+ columnNotNull,
25892
+ columnDefault,
25893
+ columnType
25894
+ };
25895
+ });
25896
+ };
25677
25897
  prepareDropReferencesJson = (tableName, schema5, foreignKeys) => {
25678
25898
  return Object.values(foreignKeys).map((fkData) => {
25679
25899
  return {
@@ -25684,6 +25904,54 @@ var init_jsonStatements = __esm({
25684
25904
  };
25685
25905
  });
25686
25906
  };
25907
+ prepareLibSQLDropReferencesJson = (tableName, schema5, foreignKeys, json2, meta, action) => {
25908
+ const statements = Object.values(foreignKeys).map((fkData) => {
25909
+ const { columnsFrom, tableFrom, columnsTo, name, tableTo, onDelete, onUpdate } = action === "push" ? SQLiteSquasher.unsquashPushFK(fkData) : SQLiteSquasher.unsquashFK(fkData);
25910
+ const keys = Object.keys(json2.tables[tableName].columns);
25911
+ const filtered = columnsFrom.filter((it) => keys.includes(it));
25912
+ const fullDrop = filtered.length === 0;
25913
+ if (fullDrop)
25914
+ return;
25915
+ let isMulticolumn = false;
25916
+ if (columnsFrom.length > 1 || columnsTo.length > 1) {
25917
+ isMulticolumn = true;
25918
+ return {
25919
+ type: "delete_reference",
25920
+ tableName,
25921
+ data: fkData,
25922
+ schema: schema5,
25923
+ isMulticolumn
25924
+ };
25925
+ }
25926
+ const columnFrom = columnsFrom[0];
25927
+ const newTableName = getNewTableName(tableFrom, meta);
25928
+ const {
25929
+ notNull: columnNotNull,
25930
+ default: columnDefault,
25931
+ type: columnType
25932
+ } = json2.tables[newTableName].columns[columnFrom];
25933
+ const fkToSquash = {
25934
+ columnsFrom,
25935
+ columnsTo,
25936
+ name,
25937
+ tableFrom: newTableName,
25938
+ tableTo,
25939
+ onDelete,
25940
+ onUpdate
25941
+ };
25942
+ const foreignKey = action === "push" ? SQLiteSquasher.squashPushFK(fkToSquash) : SQLiteSquasher.squashFK(fkToSquash);
25943
+ return {
25944
+ type: "delete_reference",
25945
+ tableName,
25946
+ data: foreignKey,
25947
+ schema: schema5,
25948
+ columnNotNull,
25949
+ columnDefault,
25950
+ columnType
25951
+ };
25952
+ });
25953
+ return statements.filter((it) => it);
25954
+ };
25687
25955
  prepareAlterReferencesJson = (tableName, schema5, foreignKeys) => {
25688
25956
  const stmts = [];
25689
25957
  Object.values(foreignKeys).map((val2) => {
@@ -25838,8 +26106,289 @@ var init_jsonStatements = __esm({
25838
26106
  }
25839
26107
  });
25840
26108
 
26109
+ // src/statementCombiner.ts
26110
+ var prepareLibSQLRecreateTable, prepareSQLiteRecreateTable, libSQLCombineStatements, sqliteCombineStatements;
26111
+ var init_statementCombiner = __esm({
26112
+ "src/statementCombiner.ts"() {
26113
+ "use strict";
26114
+ init_jsonStatements();
26115
+ init_sqliteSchema();
26116
+ prepareLibSQLRecreateTable = (table4, action) => {
26117
+ const { name, columns, uniqueConstraints, indexes } = table4;
26118
+ const composites = Object.values(table4.compositePrimaryKeys).map(
26119
+ (it) => SQLiteSquasher.unsquashPK(it)
26120
+ );
26121
+ const references2 = Object.values(table4.foreignKeys);
26122
+ const fks = references2.map(
26123
+ (it) => action === "push" ? SQLiteSquasher.unsquashPushFK(it) : SQLiteSquasher.unsquashFK(it)
26124
+ );
26125
+ const statements = [
26126
+ {
26127
+ type: "recreate_table",
26128
+ tableName: name,
26129
+ columns: Object.values(columns),
26130
+ compositePKs: composites,
26131
+ referenceData: fks,
26132
+ uniqueConstraints: Object.values(uniqueConstraints)
26133
+ }
26134
+ ];
26135
+ if (Object.keys(indexes).length) {
26136
+ statements.push(...prepareCreateIndexesJson(name, "", indexes));
26137
+ }
26138
+ return statements;
26139
+ };
26140
+ prepareSQLiteRecreateTable = (table4, action) => {
26141
+ const { name, columns, uniqueConstraints, indexes } = table4;
26142
+ const composites = Object.values(table4.compositePrimaryKeys).map(
26143
+ (it) => SQLiteSquasher.unsquashPK(it)
26144
+ );
26145
+ const references2 = Object.values(table4.foreignKeys);
26146
+ const fks = references2.map(
26147
+ (it) => action === "push" ? SQLiteSquasher.unsquashPushFK(it) : SQLiteSquasher.unsquashFK(it)
26148
+ );
26149
+ const statements = [
26150
+ {
26151
+ type: "recreate_table",
26152
+ tableName: name,
26153
+ columns: Object.values(columns),
26154
+ compositePKs: composites,
26155
+ referenceData: fks,
26156
+ uniqueConstraints: Object.values(uniqueConstraints)
26157
+ }
26158
+ ];
26159
+ if (Object.keys(indexes).length) {
26160
+ statements.push(...prepareCreateIndexesJson(name, "", indexes));
26161
+ }
26162
+ return statements;
26163
+ };
26164
+ libSQLCombineStatements = (statements, json2, action) => {
26165
+ const newStatements = {};
26166
+ for (const statement of statements) {
26167
+ if (statement.type === "alter_table_alter_column_drop_autoincrement" || statement.type === "alter_table_alter_column_set_autoincrement" || statement.type === "alter_table_alter_column_drop_pk" || statement.type === "alter_table_alter_column_set_pk" || statement.type === "create_composite_pk" || statement.type === "alter_composite_pk" || statement.type === "delete_composite_pk") {
26168
+ const tableName2 = statement.tableName;
26169
+ const statementsForTable2 = newStatements[tableName2];
26170
+ if (!statementsForTable2) {
26171
+ newStatements[tableName2] = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26172
+ continue;
26173
+ }
26174
+ if (!statementsForTable2.some(({ type }) => type === "recreate_table")) {
26175
+ const wasRename = statementsForTable2.some(({ type }) => type === "rename_table");
26176
+ const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26177
+ if (wasRename) {
26178
+ newStatements[tableName2].push(...preparedStatements);
26179
+ } else {
26180
+ newStatements[tableName2] = preparedStatements;
26181
+ }
26182
+ continue;
26183
+ }
26184
+ continue;
26185
+ }
26186
+ if (statement.type === "alter_table_alter_column_set_type" || statement.type === "alter_table_alter_column_drop_notnull" || statement.type === "alter_table_alter_column_set_notnull" || statement.type === "alter_table_alter_column_set_default" || statement.type === "alter_table_alter_column_drop_default") {
26187
+ const { tableName: tableName2, columnName, columnPk } = statement;
26188
+ const columnIsPartOfForeignKey = Object.values(
26189
+ json2.tables[tableName2].foreignKeys
26190
+ ).some((it) => {
26191
+ const unsquashFk = action === "push" ? SQLiteSquasher.unsquashPushFK(it) : SQLiteSquasher.unsquashFK(it);
26192
+ return unsquashFk.columnsFrom.includes(columnName);
26193
+ });
26194
+ const statementsForTable2 = newStatements[tableName2];
26195
+ if (!statementsForTable2 && (columnIsPartOfForeignKey || columnPk)) {
26196
+ newStatements[tableName2] = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26197
+ continue;
26198
+ }
26199
+ if (statementsForTable2 && (columnIsPartOfForeignKey || columnPk)) {
26200
+ if (!statementsForTable2.some(({ type }) => type === "recreate_table")) {
26201
+ const wasRename = statementsForTable2.some(({ type }) => type === "rename_table");
26202
+ const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26203
+ if (wasRename) {
26204
+ newStatements[tableName2].push(...preparedStatements);
26205
+ } else {
26206
+ newStatements[tableName2] = preparedStatements;
26207
+ }
26208
+ }
26209
+ continue;
26210
+ }
26211
+ if (statementsForTable2 && !(columnIsPartOfForeignKey || columnPk)) {
26212
+ if (!statementsForTable2.some(({ type }) => type === "recreate_table")) {
26213
+ newStatements[tableName2].push(statement);
26214
+ }
26215
+ continue;
26216
+ }
26217
+ newStatements[tableName2] = [statement];
26218
+ continue;
26219
+ }
26220
+ if (statement.type === "create_reference") {
26221
+ const tableName2 = statement.tableName;
26222
+ const data = action === "push" ? SQLiteSquasher.unsquashPushFK(statement.data) : SQLiteSquasher.unsquashFK(statement.data);
26223
+ const statementsForTable2 = newStatements[tableName2];
26224
+ if (!statementsForTable2) {
26225
+ newStatements[tableName2] = statement.isMulticolumn ? prepareLibSQLRecreateTable(json2.tables[tableName2], action) : [statement];
26226
+ continue;
26227
+ }
26228
+ if (!statement.isMulticolumn && statementsForTable2.some(
26229
+ (st) => st.type === "sqlite_alter_table_add_column" && st.column.name === data.columnsFrom[0]
26230
+ )) {
26231
+ continue;
26232
+ }
26233
+ if (statement.isMulticolumn) {
26234
+ if (!statementsForTable2.some(({ type }) => type === "recreate_table")) {
26235
+ const wasRename = statementsForTable2.some(({ type }) => type === "rename_table");
26236
+ const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26237
+ if (wasRename) {
26238
+ newStatements[tableName2].push(...preparedStatements);
26239
+ } else {
26240
+ newStatements[tableName2] = preparedStatements;
26241
+ }
26242
+ continue;
26243
+ }
26244
+ continue;
26245
+ }
26246
+ if (!statementsForTable2.some(({ type }) => type === "recreate_table")) {
26247
+ newStatements[tableName2].push(statement);
26248
+ }
26249
+ continue;
26250
+ }
26251
+ if (statement.type === "delete_reference") {
26252
+ const tableName2 = statement.tableName;
26253
+ const statementsForTable2 = newStatements[tableName2];
26254
+ if (!statementsForTable2) {
26255
+ newStatements[tableName2] = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26256
+ continue;
26257
+ }
26258
+ if (!statementsForTable2.some(({ type }) => type === "recreate_table")) {
26259
+ const wasRename = statementsForTable2.some(({ type }) => type === "rename_table");
26260
+ const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26261
+ if (wasRename) {
26262
+ newStatements[tableName2].push(...preparedStatements);
26263
+ } else {
26264
+ newStatements[tableName2] = preparedStatements;
26265
+ }
26266
+ continue;
26267
+ }
26268
+ continue;
26269
+ }
26270
+ if (statement.type === "sqlite_alter_table_add_column" && statement.column.primaryKey) {
26271
+ const tableName2 = statement.tableName;
26272
+ const statementsForTable2 = newStatements[tableName2];
26273
+ if (!statementsForTable2) {
26274
+ newStatements[tableName2] = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26275
+ continue;
26276
+ }
26277
+ if (!statementsForTable2.some(({ type }) => type === "recreate_table")) {
26278
+ const wasRename = statementsForTable2.some(({ type }) => type === "rename_table");
26279
+ const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26280
+ if (wasRename) {
26281
+ newStatements[tableName2].push(...preparedStatements);
26282
+ } else {
26283
+ newStatements[tableName2] = preparedStatements;
26284
+ }
26285
+ continue;
26286
+ }
26287
+ continue;
26288
+ }
26289
+ const tableName = statement.type === "rename_table" ? statement.tableNameTo : statement.tableName;
26290
+ const statementsForTable = newStatements[tableName];
26291
+ if (!statementsForTable) {
26292
+ newStatements[tableName] = [statement];
26293
+ continue;
26294
+ }
26295
+ if (!statementsForTable.some(({ type }) => type === "recreate_table")) {
26296
+ newStatements[tableName].push(statement);
26297
+ }
26298
+ }
26299
+ const combinedStatements = Object.values(newStatements).flat();
26300
+ const renamedTables = combinedStatements.filter((it) => it.type === "rename_table");
26301
+ const renamedColumns = combinedStatements.filter((it) => it.type === "alter_table_rename_column");
26302
+ const rest = combinedStatements.filter((it) => it.type !== "rename_table" && it.type !== "alter_table_rename_column");
26303
+ return [...renamedTables, ...renamedColumns, ...rest];
26304
+ };
26305
+ sqliteCombineStatements = (statements, json2, action) => {
26306
+ const newStatements = {};
26307
+ for (const statement of statements) {
26308
+ if (statement.type === "alter_table_alter_column_set_type" || statement.type === "alter_table_alter_column_set_default" || statement.type === "alter_table_alter_column_drop_default" || statement.type === "alter_table_alter_column_set_notnull" || statement.type === "alter_table_alter_column_drop_notnull" || statement.type === "alter_table_alter_column_drop_autoincrement" || statement.type === "alter_table_alter_column_set_autoincrement" || statement.type === "alter_table_alter_column_drop_pk" || statement.type === "alter_table_alter_column_set_pk" || statement.type === "delete_reference" || statement.type === "alter_reference" || statement.type === "create_composite_pk" || statement.type === "alter_composite_pk" || statement.type === "delete_composite_pk" || statement.type === "create_unique_constraint" || statement.type === "delete_unique_constraint") {
26309
+ const tableName2 = statement.tableName;
26310
+ const statementsForTable2 = newStatements[tableName2];
26311
+ if (!statementsForTable2) {
26312
+ newStatements[tableName2] = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26313
+ continue;
26314
+ }
26315
+ if (!statementsForTable2.some(({ type }) => type === "recreate_table")) {
26316
+ const wasRename = statementsForTable2.some(({ type }) => type === "rename_table");
26317
+ const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26318
+ if (wasRename) {
26319
+ newStatements[tableName2].push(...preparedStatements);
26320
+ } else {
26321
+ newStatements[tableName2] = preparedStatements;
26322
+ }
26323
+ continue;
26324
+ }
26325
+ continue;
26326
+ }
26327
+ if (statement.type === "sqlite_alter_table_add_column" && statement.column.primaryKey) {
26328
+ const tableName2 = statement.tableName;
26329
+ const statementsForTable2 = newStatements[tableName2];
26330
+ if (!statementsForTable2) {
26331
+ newStatements[tableName2] = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26332
+ continue;
26333
+ }
26334
+ if (!statementsForTable2.some(({ type }) => type === "recreate_table")) {
26335
+ const wasRename = statementsForTable2.some(({ type }) => type === "rename_table");
26336
+ const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26337
+ if (wasRename) {
26338
+ newStatements[tableName2].push(...preparedStatements);
26339
+ } else {
26340
+ newStatements[tableName2] = preparedStatements;
26341
+ }
26342
+ continue;
26343
+ }
26344
+ continue;
26345
+ }
26346
+ if (statement.type === "create_reference") {
26347
+ const tableName2 = statement.tableName;
26348
+ const data = action === "push" ? SQLiteSquasher.unsquashPushFK(statement.data) : SQLiteSquasher.unsquashFK(statement.data);
26349
+ const statementsForTable2 = newStatements[tableName2];
26350
+ if (!statementsForTable2) {
26351
+ newStatements[tableName2] = prepareSQLiteRecreateTable(json2.tables[tableName2], action);
26352
+ continue;
26353
+ }
26354
+ if (data.columnsFrom.length === 1 && statementsForTable2.some(
26355
+ (st) => st.type === "sqlite_alter_table_add_column" && st.column.name === data.columnsFrom[0]
26356
+ )) {
26357
+ continue;
26358
+ }
26359
+ if (!statementsForTable2.some(({ type }) => type === "recreate_table")) {
26360
+ const wasRename = statementsForTable2.some(({ type }) => type === "rename_table");
26361
+ const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName2], action);
26362
+ if (wasRename) {
26363
+ newStatements[tableName2].push(...preparedStatements);
26364
+ } else {
26365
+ newStatements[tableName2] = preparedStatements;
26366
+ }
26367
+ continue;
26368
+ }
26369
+ continue;
26370
+ }
26371
+ const tableName = statement.type === "rename_table" ? statement.tableNameTo : statement.tableName;
26372
+ const statementsForTable = newStatements[tableName];
26373
+ if (!statementsForTable) {
26374
+ newStatements[tableName] = [statement];
26375
+ continue;
26376
+ }
26377
+ if (!statementsForTable.some(({ type }) => type === "recreate_table")) {
26378
+ newStatements[tableName].push(statement);
26379
+ }
26380
+ }
26381
+ const combinedStatements = Object.values(newStatements).flat();
26382
+ const renamedTables = combinedStatements.filter((it) => it.type === "rename_table");
26383
+ const renamedColumns = combinedStatements.filter((it) => it.type === "alter_table_rename_column");
26384
+ const rest = combinedStatements.filter((it) => it.type !== "rename_table" && it.type !== "alter_table_rename_column");
26385
+ return [...renamedTables, ...renamedColumns, ...rest];
26386
+ };
26387
+ }
26388
+ });
26389
+
25841
26390
  // src/snapshotsDiffer.ts
25842
- var makeChanged, makeSelfOrChanged, makePatched, columnSchema, alteredColumnSchema, enumSchema2, changedEnumSchema, tableScheme, alteredTableScheme, diffResultScheme, diffResultSchemeMysql, diffResultSchemeSQLite, schemaChangeFor, nameChangeFor, nameSchemaChangeFor, columnChangeFor, applyPgSnapshotsDiff, applyMysqlSnapshotsDiff, applySqliteSnapshotsDiff;
26391
+ var makeChanged, makeSelfOrChanged, makePatched, columnSchema, alteredColumnSchema, enumSchema2, changedEnumSchema, tableScheme, alteredTableScheme, diffResultScheme, diffResultSchemeMysql, diffResultSchemeSQLite, schemaChangeFor, nameChangeFor, nameSchemaChangeFor, columnChangeFor, applyPgSnapshotsDiff, applyMysqlSnapshotsDiff, applySqliteSnapshotsDiff, applyLibSQLSnapshotsDiff;
25843
26392
  var init_snapshotsDiffer = __esm({
25844
26393
  "src/snapshotsDiffer.ts"() {
25845
26394
  "use strict";
@@ -25851,6 +26400,7 @@ var init_snapshotsDiffer = __esm({
25851
26400
  init_mysqlSchema();
25852
26401
  init_pgSchema();
25853
26402
  init_sqliteSchema();
26403
+ init_statementCombiner();
25854
26404
  init_utils();
25855
26405
  makeChanged = (schema5) => {
25856
26406
  return objectType({
@@ -27178,7 +27728,8 @@ var init_snapshotsDiffer = __esm({
27178
27728
  jsonStatements.push(...jsonDropColumnsStatemets);
27179
27729
  jsonStatements.push(...jsonAlteredCompositePKs);
27180
27730
  jsonStatements.push(...jsonAlteredUniqueConstraints);
27181
- const sqlStatements = fromJson(jsonStatements, "sqlite");
27731
+ const combinedJsonStatements = sqliteCombineStatements(jsonStatements, json2, action);
27732
+ const sqlStatements = fromJson(combinedJsonStatements, "sqlite");
27182
27733
  const uniqueSqlStatements = [];
27183
27734
  sqlStatements.forEach((ss) => {
27184
27735
  if (!uniqueSqlStatements.includes(ss)) {
@@ -27190,7 +27741,298 @@ var init_snapshotsDiffer = __esm({
27190
27741
  });
27191
27742
  const _meta = prepareMigrationMeta([], rTables, rColumns);
27192
27743
  return {
27193
- statements: jsonStatements,
27744
+ statements: combinedJsonStatements,
27745
+ sqlStatements: uniqueSqlStatements,
27746
+ _meta
27747
+ };
27748
+ };
27749
+ applyLibSQLSnapshotsDiff = async (json1, json2, tablesResolver2, columnsResolver2, prevFull, curFull, action) => {
27750
+ const tablesDiff = diffSchemasOrTables(json1.tables, json2.tables);
27751
+ const {
27752
+ created: createdTables,
27753
+ deleted: deletedTables,
27754
+ renamed: renamedTables
27755
+ } = await tablesResolver2({
27756
+ created: tablesDiff.added,
27757
+ deleted: tablesDiff.deleted
27758
+ });
27759
+ const tablesPatchedSnap1 = copy(json1);
27760
+ tablesPatchedSnap1.tables = mapEntries(tablesPatchedSnap1.tables, (_2, it) => {
27761
+ const { name } = nameChangeFor(it, renamedTables);
27762
+ it.name = name;
27763
+ return [name, it];
27764
+ });
27765
+ const res = diffColumns(tablesPatchedSnap1.tables, json2.tables);
27766
+ const columnRenames = [];
27767
+ const columnCreates = [];
27768
+ const columnDeletes = [];
27769
+ for (let entry of Object.values(res)) {
27770
+ const { renamed, created, deleted } = await columnsResolver2({
27771
+ tableName: entry.name,
27772
+ schema: entry.schema,
27773
+ deleted: entry.columns.deleted,
27774
+ created: entry.columns.added
27775
+ });
27776
+ if (created.length > 0) {
27777
+ columnCreates.push({
27778
+ table: entry.name,
27779
+ columns: created
27780
+ });
27781
+ }
27782
+ if (deleted.length > 0) {
27783
+ columnDeletes.push({
27784
+ table: entry.name,
27785
+ columns: deleted
27786
+ });
27787
+ }
27788
+ if (renamed.length > 0) {
27789
+ columnRenames.push({
27790
+ table: entry.name,
27791
+ renames: renamed
27792
+ });
27793
+ }
27794
+ }
27795
+ const columnRenamesDict = columnRenames.reduce(
27796
+ (acc, it) => {
27797
+ acc[it.table] = it.renames;
27798
+ return acc;
27799
+ },
27800
+ {}
27801
+ );
27802
+ const columnsPatchedSnap1 = copy(tablesPatchedSnap1);
27803
+ columnsPatchedSnap1.tables = mapEntries(
27804
+ columnsPatchedSnap1.tables,
27805
+ (tableKey2, tableValue) => {
27806
+ const patchedColumns = mapKeys(
27807
+ tableValue.columns,
27808
+ (columnKey, column7) => {
27809
+ const rens = columnRenamesDict[tableValue.name] || [];
27810
+ const newName = columnChangeFor(columnKey, rens);
27811
+ column7.name = newName;
27812
+ return newName;
27813
+ }
27814
+ );
27815
+ tableValue.columns = patchedColumns;
27816
+ return [tableKey2, tableValue];
27817
+ }
27818
+ );
27819
+ const diffResult = applyJsonDiff(columnsPatchedSnap1, json2);
27820
+ const typedResult = diffResultSchemeSQLite.parse(diffResult);
27821
+ const tablesMap = {};
27822
+ typedResult.alteredTablesWithColumns.forEach((obj) => {
27823
+ tablesMap[obj.name] = obj;
27824
+ });
27825
+ const jsonCreateTables = createdTables.map((it) => {
27826
+ return prepareSQLiteCreateTable(it, action);
27827
+ });
27828
+ const jsonCreateIndexesForCreatedTables = createdTables.map((it) => {
27829
+ return prepareCreateIndexesJson(
27830
+ it.name,
27831
+ it.schema,
27832
+ it.indexes,
27833
+ curFull.internal
27834
+ );
27835
+ }).flat();
27836
+ const jsonDropTables = deletedTables.map((it) => {
27837
+ return prepareDropTableJson(it);
27838
+ });
27839
+ const jsonRenameTables = renamedTables.map((it) => {
27840
+ return prepareRenameTableJson(it.from, it.to);
27841
+ });
27842
+ const jsonRenameColumnsStatements = columnRenames.map((it) => prepareRenameColumns(it.table, "", it.renames)).flat();
27843
+ const jsonDropColumnsStatemets = columnDeletes.map((it) => _prepareDropColumns(it.table, "", it.columns)).flat();
27844
+ const jsonAddColumnsStatemets = columnCreates.map((it) => {
27845
+ return _prepareSqliteAddColumns(
27846
+ it.table,
27847
+ it.columns,
27848
+ tablesMap[it.table] && tablesMap[it.table].addedForeignKeys ? Object.values(tablesMap[it.table].addedForeignKeys) : []
27849
+ );
27850
+ }).flat();
27851
+ const rColumns = jsonRenameColumnsStatements.map((it) => {
27852
+ const tableName = it.tableName;
27853
+ const schema5 = it.schema;
27854
+ return {
27855
+ from: { schema: schema5, table: tableName, column: it.oldColumnName },
27856
+ to: { schema: schema5, table: tableName, column: it.newColumnName }
27857
+ };
27858
+ });
27859
+ const rTables = renamedTables.map((it) => {
27860
+ return { from: it.from, to: it.to };
27861
+ });
27862
+ const _meta = prepareMigrationMeta([], rTables, rColumns);
27863
+ const allAltered = typedResult.alteredTablesWithColumns;
27864
+ const jsonAddedCompositePKs = [];
27865
+ const jsonDeletedCompositePKs = [];
27866
+ const jsonAlteredCompositePKs = [];
27867
+ const jsonAddedUniqueConstraints = [];
27868
+ const jsonDeletedUniqueConstraints = [];
27869
+ const jsonAlteredUniqueConstraints = [];
27870
+ allAltered.forEach((it) => {
27871
+ let addedColumns = [];
27872
+ for (const addedPkName of Object.keys(it.addedCompositePKs)) {
27873
+ const addedPkColumns = it.addedCompositePKs[addedPkName];
27874
+ addedColumns = SQLiteSquasher.unsquashPK(addedPkColumns);
27875
+ }
27876
+ let deletedColumns = [];
27877
+ for (const deletedPkName of Object.keys(it.deletedCompositePKs)) {
27878
+ const deletedPkColumns = it.deletedCompositePKs[deletedPkName];
27879
+ deletedColumns = SQLiteSquasher.unsquashPK(deletedPkColumns);
27880
+ }
27881
+ const doPerformDeleteAndCreate = JSON.stringify(addedColumns) !== JSON.stringify(deletedColumns);
27882
+ let addedCompositePKs = [];
27883
+ let deletedCompositePKs = [];
27884
+ let alteredCompositePKs = [];
27885
+ if (doPerformDeleteAndCreate) {
27886
+ addedCompositePKs = prepareAddCompositePrimaryKeySqlite(
27887
+ it.name,
27888
+ it.addedCompositePKs
27889
+ );
27890
+ deletedCompositePKs = prepareDeleteCompositePrimaryKeySqlite(
27891
+ it.name,
27892
+ it.deletedCompositePKs
27893
+ );
27894
+ }
27895
+ alteredCompositePKs = prepareAlterCompositePrimaryKeySqlite(
27896
+ it.name,
27897
+ it.alteredCompositePKs
27898
+ );
27899
+ let addedUniqueConstraints = [];
27900
+ let deletedUniqueConstraints = [];
27901
+ let alteredUniqueConstraints = [];
27902
+ addedUniqueConstraints = prepareAddUniqueConstraintPg(
27903
+ it.name,
27904
+ it.schema,
27905
+ it.addedUniqueConstraints
27906
+ );
27907
+ deletedUniqueConstraints = prepareDeleteUniqueConstraintPg(
27908
+ it.name,
27909
+ it.schema,
27910
+ it.deletedUniqueConstraints
27911
+ );
27912
+ if (it.alteredUniqueConstraints) {
27913
+ const added = {};
27914
+ const deleted = {};
27915
+ for (const k of Object.keys(it.alteredUniqueConstraints)) {
27916
+ added[k] = it.alteredUniqueConstraints[k].__new;
27917
+ deleted[k] = it.alteredUniqueConstraints[k].__old;
27918
+ }
27919
+ addedUniqueConstraints.push(
27920
+ ...prepareAddUniqueConstraintPg(it.name, it.schema, added)
27921
+ );
27922
+ deletedUniqueConstraints.push(
27923
+ ...prepareDeleteUniqueConstraintPg(it.name, it.schema, deleted)
27924
+ );
27925
+ }
27926
+ jsonAddedCompositePKs.push(...addedCompositePKs);
27927
+ jsonDeletedCompositePKs.push(...deletedCompositePKs);
27928
+ jsonAlteredCompositePKs.push(...alteredCompositePKs);
27929
+ jsonAddedUniqueConstraints.push(...addedUniqueConstraints);
27930
+ jsonDeletedUniqueConstraints.push(...deletedUniqueConstraints);
27931
+ jsonAlteredUniqueConstraints.push(...alteredUniqueConstraints);
27932
+ });
27933
+ const jsonTableAlternations = allAltered.map((it) => {
27934
+ return prepareSqliteAlterColumns(it.name, it.schema, it.altered, json2);
27935
+ }).flat();
27936
+ const jsonCreateIndexesForAllAlteredTables = allAltered.map((it) => {
27937
+ return prepareCreateIndexesJson(
27938
+ it.name,
27939
+ it.schema,
27940
+ it.addedIndexes || {},
27941
+ curFull.internal
27942
+ );
27943
+ }).flat();
27944
+ const jsonDropIndexesForAllAlteredTables = allAltered.map((it) => {
27945
+ return prepareDropIndexesJson(
27946
+ it.name,
27947
+ it.schema,
27948
+ it.deletedIndexes || {}
27949
+ );
27950
+ }).flat();
27951
+ allAltered.forEach((it) => {
27952
+ const droppedIndexes = Object.keys(it.alteredIndexes).reduce(
27953
+ (current, item) => {
27954
+ current[item] = it.alteredIndexes[item].__old;
27955
+ return current;
27956
+ },
27957
+ {}
27958
+ );
27959
+ const createdIndexes = Object.keys(it.alteredIndexes).reduce(
27960
+ (current, item) => {
27961
+ current[item] = it.alteredIndexes[item].__new;
27962
+ return current;
27963
+ },
27964
+ {}
27965
+ );
27966
+ jsonCreateIndexesForAllAlteredTables.push(
27967
+ ...prepareCreateIndexesJson(
27968
+ it.name,
27969
+ it.schema,
27970
+ createdIndexes || {},
27971
+ curFull.internal
27972
+ )
27973
+ );
27974
+ jsonDropIndexesForAllAlteredTables.push(
27975
+ ...prepareDropIndexesJson(it.name, it.schema, droppedIndexes || {})
27976
+ );
27977
+ });
27978
+ const jsonReferencesForAllAlteredTables = allAltered.map((it) => {
27979
+ const forAdded = prepareLibSQLCreateReferencesJson(
27980
+ it.name,
27981
+ it.schema,
27982
+ it.addedForeignKeys,
27983
+ json2,
27984
+ action
27985
+ );
27986
+ const forAltered = prepareLibSQLDropReferencesJson(
27987
+ it.name,
27988
+ it.schema,
27989
+ it.deletedForeignKeys,
27990
+ json2,
27991
+ _meta,
27992
+ action
27993
+ );
27994
+ const alteredFKs = prepareAlterReferencesJson(it.name, it.schema, it.alteredForeignKeys);
27995
+ return [...forAdded, ...forAltered, ...alteredFKs];
27996
+ }).flat();
27997
+ const jsonCreatedReferencesForAlteredTables = jsonReferencesForAllAlteredTables.filter(
27998
+ (t2) => t2.type === "create_reference"
27999
+ );
28000
+ const jsonDroppedReferencesForAlteredTables = jsonReferencesForAllAlteredTables.filter(
28001
+ (t2) => t2.type === "delete_reference"
28002
+ );
28003
+ const jsonStatements = [];
28004
+ jsonStatements.push(...jsonCreateTables);
28005
+ jsonStatements.push(...jsonDropTables);
28006
+ jsonStatements.push(...jsonRenameTables);
28007
+ jsonStatements.push(...jsonRenameColumnsStatements);
28008
+ jsonStatements.push(...jsonDroppedReferencesForAlteredTables);
28009
+ jsonStatements.push(...jsonDropIndexesForAllAlteredTables);
28010
+ jsonStatements.push(...jsonDeletedCompositePKs);
28011
+ jsonStatements.push(...jsonTableAlternations);
28012
+ jsonStatements.push(...jsonAddedCompositePKs);
28013
+ jsonStatements.push(...jsonAddColumnsStatemets);
28014
+ jsonStatements.push(...jsonCreateIndexesForCreatedTables);
28015
+ jsonStatements.push(...jsonCreateIndexesForAllAlteredTables);
28016
+ jsonStatements.push(...jsonCreatedReferencesForAlteredTables);
28017
+ jsonStatements.push(...jsonDropColumnsStatemets);
28018
+ jsonStatements.push(...jsonAlteredCompositePKs);
28019
+ jsonStatements.push(...jsonAlteredUniqueConstraints);
28020
+ const combinedJsonStatements = libSQLCombineStatements(jsonStatements, json2, action);
28021
+ const sqlStatements = fromJson(
28022
+ combinedJsonStatements,
28023
+ "sqlite",
28024
+ action,
28025
+ "turso",
28026
+ json2
28027
+ );
28028
+ const uniqueSqlStatements = [];
28029
+ sqlStatements.forEach((ss) => {
28030
+ if (!uniqueSqlStatements.includes(ss)) {
28031
+ uniqueSqlStatements.push(ss);
28032
+ }
28033
+ });
28034
+ return {
28035
+ statements: combinedJsonStatements,
27194
28036
  sqlStatements: uniqueSqlStatements,
27195
28037
  _meta
27196
28038
  };
@@ -28529,6 +29371,7 @@ __export(migrate_exports, {
28529
29371
  prepareAndMigrateMysql: () => prepareAndMigrateMysql,
28530
29372
  prepareAndMigratePg: () => prepareAndMigratePg,
28531
29373
  prepareAndMigrateSqlite: () => prepareAndMigrateSqlite,
29374
+ prepareLibSQLPush: () => prepareLibSQLPush,
28532
29375
  prepareMySQLPush: () => prepareMySQLPush,
28533
29376
  preparePgPush: () => preparePgPush,
28534
29377
  prepareSQLitePush: () => prepareSQLitePush,
@@ -28541,7 +29384,7 @@ __export(migrate_exports, {
28541
29384
  tablesResolver: () => tablesResolver,
28542
29385
  writeResult: () => writeResult
28543
29386
  });
28544
- var import_fs5, import_hanji3, import_path4, schemasResolver, tablesResolver, sequencesResolver, enumsResolver, columnsResolver, prepareAndMigratePg, preparePgPush, prepareMySQLPush, prepareAndMigrateMysql, prepareAndMigrateSqlite, prepareSQLitePush, promptColumnsConflicts, promptNamedWithSchemasConflict, promptSchemasConflict, BREAKPOINT, writeResult, embeddedMigrations, prepareSnapshotFolderName, two;
29387
+ var import_fs5, import_hanji3, import_path4, schemasResolver, tablesResolver, sequencesResolver, enumsResolver, columnsResolver, prepareAndMigratePg, preparePgPush, prepareMySQLPush, prepareAndMigrateMysql, prepareAndMigrateSqlite, prepareSQLitePush, prepareLibSQLPush, promptColumnsConflicts, promptNamedWithSchemasConflict, promptSchemasConflict, BREAKPOINT, writeResult, embeddedMigrations, prepareSnapshotFolderName, two;
28545
29388
  var init_migrate = __esm({
28546
29389
  "src/cli/commands/migrate.ts"() {
28547
29390
  "use strict";
@@ -28793,6 +29636,7 @@ var init_migrate = __esm({
28793
29636
  prepareAndMigrateSqlite = async (config) => {
28794
29637
  const outFolder = config.out;
28795
29638
  const schemaPath = config.schema;
29639
+ const driver2 = config.driver;
28796
29640
  try {
28797
29641
  assertV1OutFolder(outFolder);
28798
29642
  const { snapshots, journal } = prepareMigrationFolder(outFolder, "sqlite");
@@ -28818,14 +29662,27 @@ var init_migrate = __esm({
28818
29662
  }
28819
29663
  const squashedPrev = squashSqliteScheme(validatedPrev);
28820
29664
  const squashedCur = squashSqliteScheme(validatedCur);
28821
- const { sqlStatements, _meta } = await applySqliteSnapshotsDiff(
28822
- squashedPrev,
28823
- squashedCur,
28824
- tablesResolver,
28825
- columnsResolver,
28826
- validatedPrev,
28827
- validatedCur
28828
- );
29665
+ let sqlStatements;
29666
+ let _meta;
29667
+ if (driver2 === "turso") {
29668
+ ({ sqlStatements, _meta } = await applyLibSQLSnapshotsDiff(
29669
+ squashedPrev,
29670
+ squashedCur,
29671
+ tablesResolver,
29672
+ columnsResolver,
29673
+ validatedPrev,
29674
+ validatedCur
29675
+ ));
29676
+ } else {
29677
+ ({ sqlStatements, _meta } = await applySqliteSnapshotsDiff(
29678
+ squashedPrev,
29679
+ squashedCur,
29680
+ tablesResolver,
29681
+ columnsResolver,
29682
+ validatedPrev,
29683
+ validatedCur
29684
+ ));
29685
+ }
28829
29686
  writeResult({
28830
29687
  cur,
28831
29688
  sqlStatements,
@@ -28841,13 +29698,51 @@ var init_migrate = __esm({
28841
29698
  console.error(e2);
28842
29699
  }
28843
29700
  };
28844
- prepareSQLitePush = async (schemaPath, snapshot) => {
29701
+ prepareSQLitePush = async (schemaPath, snapshot, driver2) => {
29702
+ const { prev, cur } = await prepareSQLiteDbPushSnapshot(snapshot, schemaPath);
29703
+ const validatedPrev = sqliteSchema.parse(prev);
29704
+ const validatedCur = sqliteSchema.parse(cur);
29705
+ const squashedPrev = squashSqliteScheme(validatedPrev, "push");
29706
+ const squashedCur = squashSqliteScheme(validatedCur, "push");
29707
+ let sqlStatements;
29708
+ let statements;
29709
+ let _meta;
29710
+ if (driver2 === "turso") {
29711
+ ({ sqlStatements, statements, _meta } = await applyLibSQLSnapshotsDiff(
29712
+ squashedPrev,
29713
+ squashedCur,
29714
+ tablesResolver,
29715
+ columnsResolver,
29716
+ validatedPrev,
29717
+ validatedCur,
29718
+ "push"
29719
+ ));
29720
+ } else {
29721
+ ({ sqlStatements, statements, _meta } = await applySqliteSnapshotsDiff(
29722
+ squashedPrev,
29723
+ squashedCur,
29724
+ tablesResolver,
29725
+ columnsResolver,
29726
+ validatedPrev,
29727
+ validatedCur,
29728
+ "push"
29729
+ ));
29730
+ }
29731
+ return {
29732
+ sqlStatements,
29733
+ statements,
29734
+ squashedPrev,
29735
+ squashedCur,
29736
+ meta: _meta
29737
+ };
29738
+ };
29739
+ prepareLibSQLPush = async (schemaPath, snapshot) => {
28845
29740
  const { prev, cur } = await prepareSQLiteDbPushSnapshot(snapshot, schemaPath);
28846
29741
  const validatedPrev = sqliteSchema.parse(prev);
28847
29742
  const validatedCur = sqliteSchema.parse(cur);
28848
29743
  const squashedPrev = squashSqliteScheme(validatedPrev, "push");
28849
29744
  const squashedCur = squashSqliteScheme(validatedCur, "push");
28850
- const { sqlStatements, statements, _meta } = await applySqliteSnapshotsDiff(
29745
+ const { sqlStatements, statements, _meta } = await applyLibSQLSnapshotsDiff(
28851
29746
  squashedPrev,
28852
29747
  squashedCur,
28853
29748
  tablesResolver,
@@ -72205,8 +73100,271 @@ var init_selector_ui = __esm({
72205
73100
  }
72206
73101
  });
72207
73102
 
73103
+ // src/cli/commands/libSqlPushUtils.ts
73104
+ var getOldTableName3, _moveDataStatements2, libSqlLogSuggestionsAndReturn;
73105
+ var init_libSqlPushUtils = __esm({
73106
+ "src/cli/commands/libSqlPushUtils.ts"() {
73107
+ "use strict";
73108
+ init_source();
73109
+ init_utils();
73110
+ init_sqliteSchema();
73111
+ init_sqlgenerator();
73112
+ getOldTableName3 = (tableName, meta) => {
73113
+ for (const key of Object.keys(meta.tables)) {
73114
+ const value = meta.tables[key];
73115
+ if (`"${tableName}"` === value) {
73116
+ return key.substring(1, key.length - 1);
73117
+ }
73118
+ }
73119
+ return tableName;
73120
+ };
73121
+ _moveDataStatements2 = (tableName, json, dataLoss = false) => {
73122
+ const statements = [];
73123
+ const newTableName = `__new_${tableName}`;
73124
+ const tableColumns = Object.values(json.tables[tableName].columns);
73125
+ const referenceData = Object.values(json.tables[tableName].foreignKeys);
73126
+ const compositePKs = Object.values(
73127
+ json.tables[tableName].compositePrimaryKeys
73128
+ ).map((it) => SQLiteSquasher.unsquashPK(it));
73129
+ const fks = referenceData.map((it) => SQLiteSquasher.unsquashPushFK(it));
73130
+ statements.push(
73131
+ new SQLiteCreateTableConvertor().convert({
73132
+ type: "sqlite_create_table",
73133
+ tableName: newTableName,
73134
+ columns: tableColumns,
73135
+ referenceData: fks,
73136
+ compositePKs
73137
+ })
73138
+ );
73139
+ if (!dataLoss) {
73140
+ const columns = Object.keys(json.tables[tableName].columns).map(
73141
+ (c) => `"${c}"`
73142
+ );
73143
+ statements.push(
73144
+ `INSERT INTO \`${newTableName}\`(${columns.join(
73145
+ ", "
73146
+ )}) SELECT ${columns.join(", ")} FROM \`${tableName}\`;`
73147
+ );
73148
+ }
73149
+ statements.push(
73150
+ new SQLiteDropTableConvertor().convert({
73151
+ type: "drop_table",
73152
+ tableName,
73153
+ schema: ""
73154
+ })
73155
+ );
73156
+ statements.push(
73157
+ new SqliteRenameTableConvertor().convert({
73158
+ fromSchema: "",
73159
+ tableNameFrom: newTableName,
73160
+ tableNameTo: tableName,
73161
+ toSchema: "",
73162
+ type: "rename_table"
73163
+ })
73164
+ );
73165
+ for (const idx of Object.values(json.tables[tableName].indexes)) {
73166
+ statements.push(
73167
+ new CreateSqliteIndexConvertor().convert({
73168
+ type: "create_index",
73169
+ tableName,
73170
+ schema: "",
73171
+ data: idx
73172
+ })
73173
+ );
73174
+ }
73175
+ return statements;
73176
+ };
73177
+ libSqlLogSuggestionsAndReturn = async (connection, statements, json1, json2, meta) => {
73178
+ let shouldAskForApprove = false;
73179
+ const statementsToExecute = [];
73180
+ const infoToPrint = [];
73181
+ const tablesToRemove = [];
73182
+ const columnsToRemove = [];
73183
+ const tablesToTruncate = [];
73184
+ for (const statement of statements) {
73185
+ if (statement.type === "drop_table") {
73186
+ const res = await connection.query(
73187
+ `select count(*) as count from \`${statement.tableName}\``
73188
+ );
73189
+ const count = Number(res[0].count);
73190
+ if (count > 0) {
73191
+ infoToPrint.push(
73192
+ `\xB7 You're about to delete ${source_default.underline(
73193
+ statement.tableName
73194
+ )} table with ${count} items`
73195
+ );
73196
+ tablesToRemove.push(statement.tableName);
73197
+ shouldAskForApprove = true;
73198
+ }
73199
+ const fromJsonStatement = fromJson([statement], "sqlite", "push", "turso", json2);
73200
+ statementsToExecute.push(
73201
+ ...Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]
73202
+ );
73203
+ } else if (statement.type === "alter_table_drop_column") {
73204
+ const tableName = statement.tableName;
73205
+ const res = await connection.query(
73206
+ `select count(*) as count from \`${tableName}\``
73207
+ );
73208
+ const count = Number(res[0].count);
73209
+ if (count > 0) {
73210
+ infoToPrint.push(
73211
+ `\xB7 You're about to delete ${source_default.underline(
73212
+ statement.columnName
73213
+ )} column in ${tableName} table with ${count} items`
73214
+ );
73215
+ columnsToRemove.push(`${tableName}_${statement.columnName}`);
73216
+ shouldAskForApprove = true;
73217
+ }
73218
+ const fromJsonStatement = fromJson([statement], "sqlite", "push", "turso", json2);
73219
+ statementsToExecute.push(
73220
+ ...Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]
73221
+ );
73222
+ } else if (statement.type === "sqlite_alter_table_add_column" && statement.column.notNull && !statement.column.default) {
73223
+ const newTableName = statement.tableName;
73224
+ const res = await connection.query(
73225
+ `select count(*) as count from \`${newTableName}\``
73226
+ );
73227
+ const count = Number(res[0].count);
73228
+ if (count > 0) {
73229
+ infoToPrint.push(
73230
+ `\xB7 You're about to add not-null ${source_default.underline(
73231
+ statement.column.name
73232
+ )} column without default value, which contains ${count} items`
73233
+ );
73234
+ tablesToTruncate.push(newTableName);
73235
+ statementsToExecute.push(`delete from ${newTableName};`);
73236
+ shouldAskForApprove = true;
73237
+ }
73238
+ const fromJsonStatement = fromJson([statement], "sqlite", "push", "turso", json2);
73239
+ statementsToExecute.push(
73240
+ ...Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]
73241
+ );
73242
+ } else if (statement.type === "alter_table_alter_column_set_notnull") {
73243
+ const tableName = statement.tableName;
73244
+ if (statement.type === "alter_table_alter_column_set_notnull" && typeof statement.columnDefault === "undefined") {
73245
+ const res = await connection.query(
73246
+ `select count(*) as count from \`${tableName}\``
73247
+ );
73248
+ const count = Number(res[0].count);
73249
+ if (count > 0) {
73250
+ infoToPrint.push(
73251
+ `\xB7 You're about to add not-null constraint to ${source_default.underline(
73252
+ statement.columnName
73253
+ )} column without default value, which contains ${count} items`
73254
+ );
73255
+ tablesToTruncate.push(tableName);
73256
+ statementsToExecute.push(`delete from \`${tableName}\``);
73257
+ shouldAskForApprove = true;
73258
+ }
73259
+ }
73260
+ const modifyStatements = new LibSQLModifyColumn().convert(statement, json2);
73261
+ statementsToExecute.push(
73262
+ ...Array.isArray(modifyStatements) ? modifyStatements : [modifyStatements]
73263
+ );
73264
+ } else if (statement.type === "recreate_table") {
73265
+ const tableName = statement.tableName;
73266
+ let dataLoss = false;
73267
+ const oldTableName = getOldTableName3(tableName, meta);
73268
+ const prevColumnNames = Object.keys(json1.tables[oldTableName].columns);
73269
+ const currentColumnNames = Object.keys(json2.tables[tableName].columns);
73270
+ const { removedColumns, addedColumns } = findAddedAndRemoved(
73271
+ prevColumnNames,
73272
+ currentColumnNames
73273
+ );
73274
+ if (removedColumns.length) {
73275
+ for (const removedColumn of removedColumns) {
73276
+ const res = await connection.query(
73277
+ `select count(\`${tableName}\`.\`${removedColumn}\`) as count from \`${tableName}\``
73278
+ );
73279
+ const count = Number(res[0].count);
73280
+ if (count > 0) {
73281
+ infoToPrint.push(
73282
+ `\xB7 You're about to delete ${source_default.underline(
73283
+ removedColumn
73284
+ )} column in ${tableName} table with ${count} items`
73285
+ );
73286
+ columnsToRemove.push(removedColumn);
73287
+ shouldAskForApprove = true;
73288
+ }
73289
+ }
73290
+ }
73291
+ if (addedColumns.length) {
73292
+ for (const addedColumn of addedColumns) {
73293
+ const [res] = await connection.query(
73294
+ `select count(*) as count from \`${tableName}\``
73295
+ );
73296
+ const columnConf = json2.tables[tableName].columns[addedColumn];
73297
+ const count = Number(res.count);
73298
+ if (count > 0 && columnConf.notNull && !columnConf.default) {
73299
+ dataLoss = true;
73300
+ infoToPrint.push(
73301
+ `\xB7 You're about to add not-null ${source_default.underline(
73302
+ addedColumn
73303
+ )} column without default value to table, which contains ${count} items`
73304
+ );
73305
+ shouldAskForApprove = true;
73306
+ tablesToTruncate.push(tableName);
73307
+ statementsToExecute.push(`DELETE FROM \`${tableName}\`;`);
73308
+ }
73309
+ }
73310
+ }
73311
+ const tablesReferencingCurrent = [];
73312
+ for (const table4 of Object.values(json2.tables)) {
73313
+ const tablesRefs = Object.values(json2.tables[table4.name].foreignKeys).filter((t2) => SQLiteSquasher.unsquashPushFK(t2).tableTo === tableName).map((it) => SQLiteSquasher.unsquashPushFK(it).tableFrom);
73314
+ tablesReferencingCurrent.push(...tablesRefs);
73315
+ }
73316
+ if (!tablesReferencingCurrent.length) {
73317
+ statementsToExecute.push(..._moveDataStatements2(tableName, json2, dataLoss));
73318
+ continue;
73319
+ }
73320
+ const [{ foreign_keys: pragmaState }] = await connection.query(`PRAGMA foreign_keys;`);
73321
+ if (pragmaState)
73322
+ statementsToExecute.push(`PRAGMA foreign_keys=OFF;`);
73323
+ statementsToExecute.push(
73324
+ ..._moveDataStatements2(tableName, json2, dataLoss)
73325
+ );
73326
+ if (pragmaState)
73327
+ statementsToExecute.push(`PRAGMA foreign_keys=ON;`);
73328
+ } else if (statement.type === "alter_table_alter_column_set_generated" || statement.type === "alter_table_alter_column_drop_generated") {
73329
+ const tableName = statement.tableName;
73330
+ const res = await connection.query(
73331
+ `select count("${statement.columnName}") as count from \`${tableName}\``
73332
+ );
73333
+ const count = Number(res[0].count);
73334
+ if (count > 0) {
73335
+ infoToPrint.push(
73336
+ `\xB7 You're about to delete ${source_default.underline(
73337
+ statement.columnName
73338
+ )} column in ${tableName} table with ${count} items`
73339
+ );
73340
+ columnsToRemove.push(`${tableName}_${statement.columnName}`);
73341
+ shouldAskForApprove = true;
73342
+ }
73343
+ const fromJsonStatement = fromJson([statement], "sqlite", "push", "turso", json2);
73344
+ statementsToExecute.push(
73345
+ ...Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]
73346
+ );
73347
+ } else {
73348
+ const fromJsonStatement = fromJson([statement], "sqlite", "push", "turso", json2);
73349
+ statementsToExecute.push(
73350
+ ...Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]
73351
+ );
73352
+ }
73353
+ }
73354
+ return {
73355
+ statementsToExecute: [...new Set(statementsToExecute)],
73356
+ shouldAskForApprove,
73357
+ infoToPrint,
73358
+ columnsToRemove: [...new Set(columnsToRemove)],
73359
+ tablesToTruncate: [...new Set(tablesToTruncate)],
73360
+ tablesToRemove: [...new Set(tablesToRemove)]
73361
+ };
73362
+ };
73363
+ }
73364
+ });
73365
+
72208
73366
  // src/cli/commands/mysqlPushUtils.ts
72209
- var import_hanji6, filterStatements, logSuggestionsAndReturn;
73367
+ var import_hanji6, filterStatements, logSuggestionsAndReturn2;
72210
73368
  var init_mysqlPushUtils = __esm({
72211
73369
  "src/cli/commands/mysqlPushUtils.ts"() {
72212
73370
  "use strict";
@@ -72256,7 +73414,7 @@ var init_mysqlPushUtils = __esm({
72256
73414
  return true;
72257
73415
  });
72258
73416
  };
72259
- logSuggestionsAndReturn = async (db, statements, json2) => {
73417
+ logSuggestionsAndReturn2 = async (db, statements, json2) => {
72260
73418
  let shouldAskForApprove = false;
72261
73419
  const statementsToExecute = [];
72262
73420
  const infoToPrint = [];
@@ -72697,289 +73855,6 @@ var init_pgPushUtils = __esm({
72697
73855
  }
72698
73856
  });
72699
73857
 
72700
- // src/cli/commands/sqlitePushUtils.ts
72701
- var _moveDataStatements, getOldTableName, getNewTableName, logSuggestionsAndReturn2;
72702
- var init_sqlitePushUtils = __esm({
72703
- "src/cli/commands/sqlitePushUtils.ts"() {
72704
- "use strict";
72705
- init_source();
72706
- init_sqliteSchema();
72707
- init_sqlgenerator();
72708
- _moveDataStatements = (tableName, json, dataLoss = false) => {
72709
- const statements = [];
72710
- statements.push(
72711
- new SqliteRenameTableConvertor().convert({
72712
- type: "rename_table",
72713
- tableNameFrom: tableName,
72714
- tableNameTo: `__old_push_${tableName}`,
72715
- fromSchema: "",
72716
- toSchema: ""
72717
- })
72718
- );
72719
- const tableColumns = Object.values(json.tables[tableName].columns);
72720
- const referenceData = Object.values(json.tables[tableName].foreignKeys);
72721
- const compositePKs = Object.values(
72722
- json.tables[tableName].compositePrimaryKeys
72723
- ).map((it) => SQLiteSquasher.unsquashPK(it));
72724
- const fks = referenceData.map((it) => SQLiteSquasher.unsquashPushFK(it));
72725
- statements.push(
72726
- new SQLiteCreateTableConvertor().convert({
72727
- type: "sqlite_create_table",
72728
- tableName,
72729
- columns: tableColumns,
72730
- referenceData: fks,
72731
- compositePKs
72732
- })
72733
- );
72734
- if (!dataLoss) {
72735
- statements.push(
72736
- `INSERT INTO "${tableName}" SELECT * FROM "__old_push_${tableName}";`
72737
- );
72738
- }
72739
- statements.push(
72740
- new SQLiteDropTableConvertor().convert({
72741
- type: "drop_table",
72742
- tableName: `__old_push_${tableName}`,
72743
- schema: ""
72744
- })
72745
- );
72746
- for (const idx of Object.values(json.tables[tableName].indexes)) {
72747
- statements.push(
72748
- new CreateSqliteIndexConvertor().convert({
72749
- type: "create_index",
72750
- tableName,
72751
- schema: "",
72752
- data: idx
72753
- })
72754
- );
72755
- }
72756
- return statements;
72757
- };
72758
- getOldTableName = (tableName, meta) => {
72759
- for (const key of Object.keys(meta.tables)) {
72760
- const value = meta.tables[key];
72761
- if (`"${tableName}"` === value) {
72762
- return key.substring(1, key.length - 1);
72763
- }
72764
- }
72765
- return tableName;
72766
- };
72767
- getNewTableName = (tableName, meta) => {
72768
- if (typeof meta.tables[`"${tableName}"`] !== "undefined") {
72769
- return meta.tables[`"${tableName}"`].substring(
72770
- 1,
72771
- meta.tables[`"${tableName}"`].length - 1
72772
- );
72773
- }
72774
- return tableName;
72775
- };
72776
- logSuggestionsAndReturn2 = async (connection, statements, json1, json2, meta) => {
72777
- let shouldAskForApprove = false;
72778
- const statementsToExecute = [];
72779
- const infoToPrint = [];
72780
- const tablesToRemove = [];
72781
- const columnsToRemove = [];
72782
- const schemasToRemove = [];
72783
- const tablesToTruncate = [];
72784
- const tablesContext = {};
72785
- for (const statement of statements) {
72786
- if (statement.type === "drop_table") {
72787
- const res = await connection.query(
72788
- `select count(*) as count from \`${statement.tableName}\``
72789
- );
72790
- const count = Number(res[0].count);
72791
- if (count > 0) {
72792
- infoToPrint.push(
72793
- `\xB7 You're about to delete ${source_default.underline(
72794
- statement.tableName
72795
- )} table with ${count} items`
72796
- );
72797
- tablesToRemove.push(statement.tableName);
72798
- shouldAskForApprove = true;
72799
- }
72800
- const stmnt = fromJson([statement], "sqlite")[0];
72801
- statementsToExecute.push(stmnt);
72802
- } else if (statement.type === "alter_table_drop_column") {
72803
- const newTableName = getOldTableName(statement.tableName, meta);
72804
- const columnIsPartOfPk = Object.values(
72805
- json1.tables[newTableName].compositePrimaryKeys
72806
- ).find((c) => SQLiteSquasher.unsquashPK(c).includes(statement.columnName));
72807
- const columnIsPartOfIndex = Object.values(
72808
- json1.tables[newTableName].indexes
72809
- ).find((c) => SQLiteSquasher.unsquashIdx(c).columns.includes(statement.columnName));
72810
- const columnIsPk = json1.tables[newTableName].columns[statement.columnName].primaryKey;
72811
- const columnIsPartOfFk = Object.values(
72812
- json1.tables[newTableName].foreignKeys
72813
- ).find(
72814
- (t2) => SQLiteSquasher.unsquashPushFK(t2).columnsFrom.includes(
72815
- statement.columnName
72816
- )
72817
- );
72818
- const res = await connection.query(
72819
- `select count(*) as count from \`${newTableName}\``
72820
- );
72821
- const count = Number(res[0].count);
72822
- if (count > 0) {
72823
- infoToPrint.push(
72824
- `\xB7 You're about to delete ${source_default.underline(
72825
- statement.columnName
72826
- )} column in ${newTableName} table with ${count} items`
72827
- );
72828
- columnsToRemove.push(`${newTableName}_${statement.columnName}`);
72829
- shouldAskForApprove = true;
72830
- }
72831
- if (columnIsPk || columnIsPartOfPk || columnIsPartOfIndex || columnIsPartOfFk) {
72832
- tablesContext[newTableName] = [
72833
- ..._moveDataStatements(statement.tableName, json2, true)
72834
- ];
72835
- const tablesReferncingCurrent = [];
72836
- for (const table4 of Object.values(json1.tables)) {
72837
- const tablesRefs = Object.values(json1.tables[table4.name].foreignKeys).filter(
72838
- (t2) => SQLiteSquasher.unsquashPushFK(t2).tableTo === newTableName
72839
- ).map((t2) => SQLiteSquasher.unsquashPushFK(t2).tableFrom);
72840
- tablesReferncingCurrent.push(...tablesRefs);
72841
- }
72842
- const uniqueTableRefs = [...new Set(tablesReferncingCurrent)];
72843
- for (const table4 of uniqueTableRefs) {
72844
- if (typeof tablesContext[table4] === "undefined") {
72845
- tablesContext[table4] = [..._moveDataStatements(table4, json2)];
72846
- }
72847
- }
72848
- } else {
72849
- if (typeof tablesContext[newTableName] === "undefined") {
72850
- const stmnt = fromJson([statement], "sqlite")[0];
72851
- statementsToExecute.push(stmnt);
72852
- }
72853
- }
72854
- } else if (statement.type === "sqlite_alter_table_add_column") {
72855
- const newTableName = getOldTableName(statement.tableName, meta);
72856
- if (statement.column.notNull && !statement.column.default) {
72857
- const res = await connection.query(
72858
- `select count(*) as count from \`${newTableName}\``
72859
- );
72860
- const count = Number(res[0].count);
72861
- if (count > 0) {
72862
- infoToPrint.push(
72863
- `\xB7 You're about to add not-null ${source_default.underline(
72864
- statement.column.name
72865
- )} column without default value, which contains ${count} items`
72866
- );
72867
- tablesToTruncate.push(newTableName);
72868
- statementsToExecute.push(`delete from ${newTableName};`);
72869
- shouldAskForApprove = true;
72870
- }
72871
- }
72872
- if (statement.column.primaryKey) {
72873
- tablesContext[newTableName] = [
72874
- ..._moveDataStatements(statement.tableName, json2, true)
72875
- ];
72876
- const tablesReferncingCurrent = [];
72877
- for (const table4 of Object.values(json1.tables)) {
72878
- const tablesRefs = Object.values(json1.tables[table4.name].foreignKeys).filter(
72879
- (t2) => SQLiteSquasher.unsquashPushFK(t2).tableTo === newTableName
72880
- ).map((t2) => SQLiteSquasher.unsquashPushFK(t2).tableFrom);
72881
- tablesReferncingCurrent.push(...tablesRefs);
72882
- }
72883
- const uniqueTableRefs = [...new Set(tablesReferncingCurrent)];
72884
- for (const table4 of uniqueTableRefs) {
72885
- if (typeof tablesContext[table4] === "undefined") {
72886
- tablesContext[table4] = [..._moveDataStatements(table4, json2)];
72887
- }
72888
- }
72889
- } else {
72890
- if (typeof tablesContext[newTableName] === "undefined") {
72891
- const stmnt = fromJson([statement], "sqlite")[0];
72892
- statementsToExecute.push(stmnt);
72893
- }
72894
- }
72895
- } else if (statement.type === "alter_table_alter_column_set_type" || statement.type === "alter_table_alter_column_set_default" || statement.type === "alter_table_alter_column_drop_default" || statement.type === "alter_table_alter_column_set_notnull" || statement.type === "alter_table_alter_column_drop_notnull" || statement.type === "alter_table_alter_column_drop_autoincrement" || statement.type === "alter_table_alter_column_set_autoincrement" || statement.type === "alter_table_alter_column_drop_pk" || statement.type === "alter_table_alter_column_set_pk") {
72896
- if (!(statement.type === "alter_table_alter_column_set_notnull" && statement.columnPk)) {
72897
- const newTableName = getOldTableName(statement.tableName, meta);
72898
- if (statement.type === "alter_table_alter_column_set_notnull" && typeof statement.columnDefault === "undefined") {
72899
- const res = await connection.query(
72900
- `select count(*) as count from \`${newTableName}\``
72901
- );
72902
- const count = Number(res[0].count);
72903
- if (count > 0) {
72904
- infoToPrint.push(
72905
- `\xB7 You're about to add not-null constraint to ${source_default.underline(
72906
- statement.columnName
72907
- )} column without default value, which contains ${count} items`
72908
- );
72909
- tablesToTruncate.push(newTableName);
72910
- shouldAskForApprove = true;
72911
- }
72912
- tablesContext[newTableName] = _moveDataStatements(
72913
- statement.tableName,
72914
- json1,
72915
- true
72916
- );
72917
- } else {
72918
- if (typeof tablesContext[newTableName] === "undefined") {
72919
- tablesContext[newTableName] = _moveDataStatements(
72920
- statement.tableName,
72921
- json1
72922
- );
72923
- }
72924
- }
72925
- const tablesReferncingCurrent = [];
72926
- for (const table4 of Object.values(json1.tables)) {
72927
- const tablesRefs = Object.values(json1.tables[table4.name].foreignKeys).filter(
72928
- (t2) => SQLiteSquasher.unsquashPushFK(t2).tableTo === newTableName
72929
- ).map((t2) => {
72930
- return getNewTableName(
72931
- SQLiteSquasher.unsquashPushFK(t2).tableFrom,
72932
- meta
72933
- );
72934
- });
72935
- tablesReferncingCurrent.push(...tablesRefs);
72936
- }
72937
- const uniqueTableRefs = [...new Set(tablesReferncingCurrent)];
72938
- for (const table4 of uniqueTableRefs) {
72939
- if (typeof tablesContext[table4] === "undefined") {
72940
- tablesContext[table4] = [..._moveDataStatements(table4, json1)];
72941
- }
72942
- }
72943
- }
72944
- } else if (statement.type === "create_reference" || statement.type === "delete_reference" || statement.type === "alter_reference") {
72945
- const fk4 = SQLiteSquasher.unsquashPushFK(statement.data);
72946
- if (typeof tablesContext[statement.tableName] === "undefined") {
72947
- tablesContext[statement.tableName] = _moveDataStatements(
72948
- statement.tableName,
72949
- json2
72950
- );
72951
- }
72952
- } else if (statement.type === "create_composite_pk" || statement.type === "alter_composite_pk" || statement.type === "delete_composite_pk" || statement.type === "create_unique_constraint" || statement.type === "delete_unique_constraint") {
72953
- const newTableName = getOldTableName(statement.tableName, meta);
72954
- if (typeof tablesContext[newTableName] === "undefined") {
72955
- tablesContext[newTableName] = _moveDataStatements(
72956
- statement.tableName,
72957
- json2
72958
- );
72959
- }
72960
- } else {
72961
- const stmnt = fromJson([statement], "sqlite");
72962
- if (typeof stmnt !== "undefined") {
72963
- statementsToExecute.push(...stmnt);
72964
- }
72965
- }
72966
- }
72967
- for (const context of Object.values(tablesContext)) {
72968
- statementsToExecute.push(...context);
72969
- }
72970
- return {
72971
- statementsToExecute,
72972
- shouldAskForApprove,
72973
- infoToPrint,
72974
- columnsToRemove: [...new Set(columnsToRemove)],
72975
- schemasToRemove: [...new Set(schemasToRemove)],
72976
- tablesToTruncate: [...new Set(tablesToTruncate)],
72977
- tablesToRemove: [...new Set(tablesToRemove)]
72978
- };
72979
- };
72980
- }
72981
- });
72982
-
72983
73858
  // ../node_modules/.pnpm/minimatch@7.4.6/node_modules/minimatch/dist/mjs/brace-expressions.js
72984
73859
  var posixClasses, braceEscape, regexpEscape, rangesToString, parseClass;
72985
73860
  var init_brace_expressions = __esm({
@@ -74542,11 +75417,12 @@ var init_sqliteIntrospect = __esm({
74542
75417
  // src/cli/commands/push.ts
74543
75418
  var push_exports = {};
74544
75419
  __export(push_exports, {
75420
+ libSQLPush: () => libSQLPush,
74545
75421
  mysqlPush: () => mysqlPush,
74546
75422
  pgPush: () => pgPush,
74547
75423
  sqlitePush: () => sqlitePush
74548
75424
  });
74549
- var import_hanji11, mysqlPush, pgPush, sqlitePush;
75425
+ var import_hanji11, mysqlPush, pgPush, sqlitePush, libSQLPush;
74550
75426
  var init_push = __esm({
74551
75427
  "src/cli/commands/push.ts"() {
74552
75428
  "use strict";
@@ -74555,6 +75431,7 @@ var init_push = __esm({
74555
75431
  init_sqlgenerator();
74556
75432
  init_selector_ui();
74557
75433
  init_outputs();
75434
+ init_libSqlPushUtils();
74558
75435
  init_mysqlPushUtils();
74559
75436
  init_pgPushUtils();
74560
75437
  init_sqlitePushUtils();
@@ -74582,7 +75459,7 @@ var init_push = __esm({
74582
75459
  tablesToTruncate,
74583
75460
  infoToPrint,
74584
75461
  schemasToRemove
74585
- } = await logSuggestionsAndReturn(
75462
+ } = await logSuggestionsAndReturn2(
74586
75463
  db,
74587
75464
  filteredStatements,
74588
75465
  statements.validatedCur
@@ -74601,7 +75478,6 @@ var init_push = __esm({
74601
75478
  }
74602
75479
  });
74603
75480
  if (verbose) {
74604
- console.log();
74605
75481
  console.log(
74606
75482
  withStyle.warning("You are about to execute current statements:")
74607
75483
  );
@@ -74752,11 +75628,100 @@ var init_push = __esm({
74752
75628
  tablesToTruncate,
74753
75629
  infoToPrint,
74754
75630
  schemasToRemove
74755
- } = await logSuggestionsAndReturn2(
75631
+ } = await logSuggestionsAndReturn(
74756
75632
  db,
74757
75633
  statements.statements,
75634
+ statements.squashedPrev,
74758
75635
  statements.squashedCur,
75636
+ statements.meta
75637
+ );
75638
+ if (verbose && statementsToExecute.length > 0) {
75639
+ console.log();
75640
+ console.log(
75641
+ withStyle.warning("You are about to execute current statements:")
75642
+ );
75643
+ console.log();
75644
+ console.log(statementsToExecute.map((s2) => source_default.blue(s2)).join("\n"));
75645
+ console.log();
75646
+ }
75647
+ if (!force && strict) {
75648
+ if (!shouldAskForApprove) {
75649
+ const { status, data } = await (0, import_hanji11.render)(
75650
+ new Select(["No, abort", `Yes, I want to execute all statements`])
75651
+ );
75652
+ if ((data == null ? void 0 : data.index) === 0) {
75653
+ (0, import_hanji11.render)(`[${source_default.red("x")}] All changes were aborted`);
75654
+ process.exit(0);
75655
+ }
75656
+ }
75657
+ }
75658
+ if (!force && shouldAskForApprove) {
75659
+ console.log(withStyle.warning("Found data-loss statements:"));
75660
+ console.log(infoToPrint.join("\n"));
75661
+ console.log();
75662
+ console.log(
75663
+ source_default.red.bold(
75664
+ "THIS ACTION WILL CAUSE DATA LOSS AND CANNOT BE REVERTED\n"
75665
+ )
75666
+ );
75667
+ console.log(source_default.white("Do you still want to push changes?"));
75668
+ const { status, data } = await (0, import_hanji11.render)(
75669
+ new Select([
75670
+ "No, abort",
75671
+ `Yes, I want to${tablesToRemove.length > 0 ? ` remove ${tablesToRemove.length} ${tablesToRemove.length > 1 ? "tables" : "table"},` : " "}${columnsToRemove.length > 0 ? ` remove ${columnsToRemove.length} ${columnsToRemove.length > 1 ? "columns" : "column"},` : " "}${tablesToTruncate.length > 0 ? ` truncate ${tablesToTruncate.length} ${tablesToTruncate.length > 1 ? "tables" : "table"}` : ""}`.trimEnd().replace(/(^,)|(,$)/g, "").replace(/ +(?= )/g, "")
75672
+ ])
75673
+ );
75674
+ if ((data == null ? void 0 : data.index) === 0) {
75675
+ (0, import_hanji11.render)(`[${source_default.red("x")}] All changes were aborted`);
75676
+ process.exit(0);
75677
+ }
75678
+ }
75679
+ if (statementsToExecute.length === 0) {
75680
+ (0, import_hanji11.render)(`
75681
+ [${source_default.blue("i")}] No changes detected`);
75682
+ } else {
75683
+ if (!("driver" in credentials2)) {
75684
+ await db.query("begin");
75685
+ try {
75686
+ for (const dStmnt of statementsToExecute) {
75687
+ await db.query(dStmnt);
75688
+ }
75689
+ await db.query("commit");
75690
+ } catch (e2) {
75691
+ console.error(e2);
75692
+ await db.query("rollback");
75693
+ process.exit(1);
75694
+ }
75695
+ } else if (credentials2.driver === "turso") {
75696
+ await db.batch(statementsToExecute.map((it) => ({ query: it })));
75697
+ }
75698
+ (0, import_hanji11.render)(`[${source_default.green("\u2713")}] Changes applied`);
75699
+ }
75700
+ }
75701
+ };
75702
+ libSQLPush = async (schemaPath, verbose, strict, credentials2, tablesFilter, force) => {
75703
+ const { connectToSQLite: connectToSQLite2 } = await Promise.resolve().then(() => (init_connections(), connections_exports));
75704
+ const { sqlitePushIntrospect: sqlitePushIntrospect2 } = await Promise.resolve().then(() => (init_sqliteIntrospect(), sqliteIntrospect_exports));
75705
+ const db = await connectToSQLite2(credentials2);
75706
+ const { schema: schema5 } = await sqlitePushIntrospect2(db, tablesFilter);
75707
+ const { prepareLibSQLPush: prepareLibSQLPush2 } = await Promise.resolve().then(() => (init_migrate(), migrate_exports));
75708
+ const statements = await prepareLibSQLPush2(schemaPath, schema5);
75709
+ if (statements.sqlStatements.length === 0) {
75710
+ (0, import_hanji11.render)(`
75711
+ [${source_default.blue("i")}] No changes detected`);
75712
+ } else {
75713
+ const {
75714
+ shouldAskForApprove,
75715
+ statementsToExecute,
75716
+ columnsToRemove,
75717
+ tablesToRemove,
75718
+ tablesToTruncate,
75719
+ infoToPrint
75720
+ } = await libSqlLogSuggestionsAndReturn(
75721
+ db,
75722
+ statements.statements,
74759
75723
  statements.squashedPrev,
75724
+ statements.squashedCur,
74760
75725
  statements.meta
74761
75726
  );
74762
75727
  if (verbose && statementsToExecute.length > 0) {
@@ -80519,7 +81484,7 @@ var init_studio2 = __esm({
80519
81484
  }
80520
81485
  });
80521
81486
 
80522
- // ../node_modules/.pnpm/@drizzle-team+brocli@0.10.1/node_modules/@drizzle-team/brocli/index.js
81487
+ // ../node_modules/.pnpm/@drizzle-team+brocli@0.8.2/node_modules/@drizzle-team/brocli/index.js
80523
81488
  var __create2 = Object.create;
80524
81489
  var __defProp2 = Object.defineProperty;
80525
81490
  var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
@@ -80966,299 +81931,130 @@ var require_shell_quote = __commonJS2({
80966
81931
  }
80967
81932
  });
80968
81933
  var BroCliError = class extends Error {
80969
- constructor(message, event) {
81934
+ constructor(message) {
80970
81935
  const errPrefix = "BroCli error: ";
80971
81936
  super(message === void 0 ? message : `${errPrefix}${message}`);
80972
- this.event = event;
80973
81937
  }
80974
81938
  };
80975
81939
  var import_clone = __toESM2(require_clone(), 1);
80976
- var getOptionTypeText = (option) => {
80977
- let result = "";
80978
- switch (option.type) {
80979
- case "boolean":
80980
- result = "";
80981
- break;
80982
- case "number": {
80983
- if ((option.minVal ?? option.maxVal) !== void 0) {
80984
- let text = "";
80985
- if (option.isInt)
80986
- text = text + `integer `;
80987
- if (option.minVal !== void 0)
80988
- text = text + `[${option.minVal};`;
80989
- else
80990
- text = text + `(\u221E;`;
80991
- if (option.maxVal !== void 0)
80992
- text = text + `${option.maxVal}]`;
80993
- else
80994
- text = text + `\u221E)`;
80995
- result = text;
80996
- break;
80997
- }
80998
- if (option.isInt) {
80999
- result = "integer";
81000
- break;
81001
- }
81002
- result = "number";
81003
- break;
81004
- }
81005
- case "string": {
81006
- if (option.enumVals) {
81007
- result = "[ " + option.enumVals.join(" | ") + " ]";
81008
- break;
81009
- }
81010
- result = "string";
81011
- break;
81012
- }
81013
- case "positional": {
81014
- result = `${option.isRequired ? "<" : "["}${option.enumVals ? option.enumVals.join("|") : option.name}${option.isRequired ? ">" : "]"}`;
81015
- break;
81016
- }
81017
- }
81018
- if (option.isRequired && option.type !== "positional")
81019
- result = "!" + result.length ? " " : "" + result;
81020
- return result;
81021
- };
81022
- var defaultEventHandler = async (event) => {
81023
- var _a;
81024
- switch (event.type) {
81025
- case "command_help": {
81026
- const command2 = event.command;
81027
- const commandName = getCommandNameWithParents(command2);
81028
- const cliName = event.name;
81029
- const desc = command2.desc ?? command2.shortDesc;
81030
- const subs = (_a = command2.subcommands) == null ? void 0 : _a.filter((s2) => !s2.hidden);
81031
- const subcommands = subs && subs.length ? subs : void 0;
81032
- if (desc !== void 0) {
81033
- console.log(`
81034
- ${desc}`);
81035
- }
81036
- const opts = Object.values(command2.options ?? {}).filter(
81037
- (opt) => !opt.config.isHidden
81038
- );
81039
- const positionals = opts.filter((opt) => opt.config.type === "positional");
81040
- const options = opts.filter((opt) => opt.config.type !== "positional");
81041
- console.log("\nUsage:");
81042
- if (command2.handler) {
81043
- console.log(
81044
- ` ${cliName ? cliName + " " : ""}${commandName}${positionals.length ? " " + positionals.map(({ config: p2 }) => getOptionTypeText(p2)).join(" ") : ""} [flags]`
81045
- );
81046
- } else
81047
- console.log(` ${cliName ? cliName + " " : ""}${commandName} [command]`);
81048
- if (command2.aliases) {
81049
- console.log(`
81050
- Aliases:`);
81051
- console.log(` ${[command2.name, ...command2.aliases].join(", ")}`);
81052
- }
81053
- if (subcommands) {
81054
- console.log("\nAvailable Commands:");
81055
- const padding = 3;
81056
- const maxLength = subcommands.reduce((p2, e2) => e2.name.length > p2 ? e2.name.length : p2, 0);
81057
- const paddedLength = maxLength + padding;
81058
- const preDescPad = 2 + paddedLength;
81059
- const data = subcommands.map(
81060
- (s2) => ` ${s2.name.padEnd(paddedLength)}${(() => {
81061
- const description = s2.shortDesc ?? s2.desc;
81062
- if (!(description == null ? void 0 : description.length))
81063
- return "";
81064
- const split = description.split("\n");
81065
- const first = split.shift();
81066
- const final = [first, ...split.map((s22) => "".padEnd(preDescPad) + s22)].join("\n");
81067
- return final;
81068
- })()}`
81069
- ).join("\n");
81070
- console.log(data);
81071
- }
81072
- if (options.length) {
81073
- const aliasLength = options.reduce((p2, e2) => {
81074
- const currentLength = e2.config.aliases.reduce((pa, a) => pa + a.length, 0) + (e2.config.aliases.length - 1) * 2 + 1;
81075
- return currentLength > p2 ? currentLength : p2;
81076
- }, 0);
81077
- const paddedAliasLength = aliasLength > 0 ? aliasLength + 1 : 0;
81078
- const nameLength = options.reduce((p2, e2) => {
81079
- const typeLen = getOptionTypeText(e2.config).length;
81080
- const length = typeLen > 0 ? e2.config.name.length + 1 + typeLen : e2.config.name.length;
81081
- return length > p2 ? length : p2;
81082
- }, 0) + 3;
81083
- const preDescPad = paddedAliasLength + nameLength + 2;
81084
- const data = options.map(
81085
- ({ config: opt }) => ` ${`${opt.aliases.length ? opt.aliases.join(", ") + "," : ""}`.padEnd(paddedAliasLength)}${`${opt.name}${(() => {
81086
- const typeText = getOptionTypeText(opt);
81087
- return typeText.length ? " " + typeText : "";
81088
- })()}`.padEnd(nameLength)}${(() => {
81089
- var _a2;
81090
- if (!((_a2 = opt.description) == null ? void 0 : _a2.length)) {
81091
- return opt.default !== void 0 ? `default: ${JSON.stringify(opt.default)}` : "";
81092
- }
81093
- const split = opt.description.split("\n");
81094
- const first = split.shift();
81095
- const def = opt.default !== void 0 ? ` (default: ${JSON.stringify(opt.default)})` : "";
81096
- const final = [first, ...split.map((s2) => "".padEnd(preDescPad) + s2)].join("\n") + def;
81097
- return final;
81098
- })()}`
81099
- ).join("\n");
81100
- console.log("\nFlags:");
81101
- console.log(data);
81102
- }
81103
- console.log("\nGlobal flags:");
81104
- console.log(` -h, --help help for ${commandName}`);
81105
- console.log(` -v, --version version${cliName ? ` for ${cliName}` : ""}`);
81106
- if (subcommands) {
81107
- console.log(
81108
- `
81109
- Use "${cliName ? cliName + " " : ""}${commandName} [command] --help" for more information about a command.
81110
- `
81111
- );
81112
- }
81113
- return true;
81114
- }
81115
- case "global_help": {
81116
- const cliName = event.name;
81117
- const desc = event.description;
81118
- const commands = event.commands.filter((c) => !c.hidden);
81119
- if (desc !== void 0) {
81120
- console.log(`${desc}
81121
- `);
81122
- }
81123
- console.log("Usage:");
81124
- console.log(` ${cliName ? cliName + " " : ""}[command]`);
81125
- if (commands.length) {
81126
- console.log("\nAvailable Commands:");
81127
- const padding = 3;
81128
- const maxLength = commands.reduce((p2, e2) => e2.name.length > p2 ? e2.name.length : p2, 0);
81129
- const paddedLength = maxLength + padding;
81130
- const data = commands.map(
81131
- (\u0441) => ` ${\u0441.name.padEnd(paddedLength)}${(() => {
81132
- const desc2 = \u0441.shortDesc ?? \u0441.desc;
81133
- if (!(desc2 == null ? void 0 : desc2.length))
81134
- return "";
81135
- const split = desc2.split("\n");
81136
- const first = split.shift();
81137
- const final = [first, ...split.map((s2) => "".padEnd(paddedLength + 2) + s2)].join("\n");
81138
- return final;
81139
- })()}`
81140
- ).join("\n");
81141
- console.log(data);
81142
- } else {
81143
- console.log("\nNo available commands.");
81144
- }
81145
- console.log("\nFlags:");
81146
- console.log(` -h, --help help${cliName ? ` for ${cliName}` : ""}`);
81147
- console.log(` -v, --version version${cliName ? ` for ${cliName}` : ""}`);
81148
- console.log("\n");
81149
- return true;
81150
- }
81151
- case "version": {
81152
- return true;
81153
- }
81154
- case "error": {
81155
- let msg;
81156
- switch (event.violation) {
81157
- case "above_max": {
81158
- const matchedName = event.offender.namePart;
81159
- const data = event.offender.dataPart;
81160
- const option = event.option;
81161
- const max = option.maxVal;
81162
- msg = `Invalid value: number type argument '${matchedName}' expects maximal value of ${max} as an input, got: ${data}`;
81163
- break;
81164
- }
81165
- case "below_min": {
81166
- const matchedName = event.offender.namePart;
81167
- const data = event.offender.dataPart;
81168
- const option = event.option;
81169
- const min = option.minVal;
81170
- msg = `Invalid value: number type argument '${matchedName}' expects minimal value of ${min} as an input, got: ${data}`;
81171
- break;
81172
- }
81173
- case "expected_int": {
81174
- const matchedName = event.offender.namePart;
81175
- const data = event.offender.dataPart;
81176
- msg = `Invalid value: number type argument '${matchedName}' expects an integer as an input, got: ${data}`;
81177
- break;
81178
- }
81179
- case "invalid_boolean_syntax": {
81180
- const matchedName = event.offender.namePart;
81181
- const data = event.offender.dataPart;
81182
- msg = `Invalid syntax: boolean type argument '${matchedName}' must have it's value passed in the following formats: ${matchedName}=<value> | ${matchedName} <value> | ${matchedName}.
81183
- Allowed values: true, false, 0, 1`;
81184
- break;
81185
- }
81186
- case "invalid_string_syntax": {
81187
- const matchedName = event.offender.namePart;
81188
- msg = `Invalid syntax: string type argument '${matchedName}' must have it's value passed in the following formats: ${matchedName}=<value> | ${matchedName} <value>`;
81189
- break;
81190
- }
81191
- case "invalid_number_syntax": {
81192
- const matchedName = event.offender.namePart;
81193
- msg = `Invalid syntax: number type argument '${matchedName}' must have it's value passed in the following formats: ${matchedName}=<value> | ${matchedName} <value>`;
81194
- break;
81195
- }
81196
- case "invalid_number_value": {
81197
- const matchedName = event.offender.namePart;
81198
- const data = event.offender.dataPart;
81199
- msg = `Invalid value: number type argument '${matchedName}' expects a number as an input, got: ${data}`;
81200
- break;
81201
- }
81202
- case "enum_violation": {
81203
- const matchedName = event.offender.namePart;
81204
- const data = event.offender.dataPart;
81205
- const option = event.option;
81206
- const values = option.enumVals;
81207
- msg = option.type === "positional" ? `Invalid value: value for the positional argument '${option.name}' must be either one of the following: ${values.join(", ")}; Received: ${data}` : `Invalid value: value for the argument '${matchedName}' must be either one of the following: ${values.join(", ")}; Received: ${data}`;
81208
- break;
81209
- }
81210
- case "unknown_command_error": {
81211
- const msg2 = `Unknown command: '${event.offender}'.
81212
- Type '--help' to get help on the cli.`;
81213
- console.error(msg2);
81214
- return true;
81215
- }
81216
- case "unknown_subcommand_error": {
81217
- const cName = getCommandNameWithParents(event.command);
81218
- const msg2 = `Unknown command: ${cName} ${event.offender}.
81219
- Type '${cName} --help' to get the help on command.`;
81220
- console.error(msg2);
81221
- return true;
81222
- }
81223
- case "missing_args_error": {
81224
- const missingOpts = event.missing;
81225
- msg = `Command '${command.name}' is missing following required options: ${missingOpts.map((opt) => {
81226
- const name = opt.shift();
81227
- const aliases = opt;
81228
- if (aliases.length)
81229
- return `${name} [${aliases.join(", ")}]`;
81230
- return name;
81231
- }).join(", ")}`;
81232
- break;
81233
- }
81234
- case "unrecognized_args_error": {
81235
- const { command: command2, unrecognized } = event;
81236
- msg = `Unrecognized options for command '${command2.name}': ${unrecognized.join(", ")}`;
81237
- break;
81238
- }
81239
- case "unknown_error": {
81240
- const e2 = event.error;
81241
- console.error(typeof e2 === "object" && e2 !== null && "message" in e2 ? e2.message : e2);
81242
- return true;
81243
- }
81244
- }
81245
- console.error(msg);
81246
- return true;
81247
- }
81940
+ var import_shell_quote = __toESM2(require_shell_quote(), 1);
81941
+ var defaultTheme = (calledFor) => {
81942
+ if (Array.isArray(calledFor)) {
81943
+ const cmds = calledFor.filter((cmd) => !cmd.hidden);
81944
+ const tableCmds = cmds.map((cmd) => ({
81945
+ name: cmd.name,
81946
+ aliases: cmd.aliases ? cmd.aliases.join(", ") : "-",
81947
+ description: cmd.description ?? "-"
81948
+ }));
81949
+ console.log(`Here's the list of all available commands:`);
81950
+ console.table(tableCmds);
81951
+ console.log(
81952
+ "To read the details about any particular command type: [commandName] --help"
81953
+ );
81954
+ } else {
81955
+ const options = calledFor.options ? Object.values(calledFor.options).filter((opt) => {
81956
+ var _a;
81957
+ return !((_a = opt.config) == null ? void 0 : _a.isHidden);
81958
+ }).map(
81959
+ ({ config: opt }) => ({
81960
+ name: opt.name,
81961
+ aliases: opt.aliases.length ? `${opt.aliases.join(", ")}` : "-",
81962
+ description: opt.description ?? "-",
81963
+ type: opt.type,
81964
+ required: opt.isRequired ? "\u2713" : "\u2717"
81965
+ })
81966
+ ) : void 0;
81967
+ console.log(
81968
+ `Command: ${calledFor.name}${calledFor.aliases ? ` [${calledFor.aliases.join(", ")}]` : ""}${calledFor.description ? ` - ${calledFor.description}` : ""}`
81969
+ );
81970
+ if (!(options == null ? void 0 : options.length))
81971
+ return;
81972
+ console.log("\nOptions:");
81973
+ console.table(options);
81248
81974
  }
81249
- return false;
81250
81975
  };
81251
- var eventHandlerWrapper = (customEventHandler) => async (event) => await customEventHandler(event) ? true : await defaultEventHandler(event);
81252
- var import_shell_quote = __toESM2(require_shell_quote(), 1);
81253
81976
  function isInt(value) {
81254
81977
  return value === Math.floor(value);
81255
81978
  }
81256
- var executeOrLog = async (target) => typeof target === "string" ? console.log(target) : target ? await target() : void 0;
81979
+ var unknownCommand = (caller) => {
81980
+ const msg = `Unknown command: '${caller}'.
81981
+ Type '--help' to get help on the cli.`;
81982
+ return new Error(msg);
81983
+ };
81984
+ var unknownSubcommand = (command2, caller) => {
81985
+ const name = getCommandNameRecursive(command2);
81986
+ const msg = `Unknown command: ${name} ${caller}.
81987
+ Type '${name} --help' to get the help on command.`;
81988
+ new Error(
81989
+ msg
81990
+ );
81991
+ return new Error(msg);
81992
+ };
81993
+ var missingRequired = (command2, missingOpts) => {
81994
+ const msg = `Command '${command2.name}' is missing following required options: ${missingOpts.map((opt) => {
81995
+ const name = opt.shift();
81996
+ const aliases = opt;
81997
+ if (aliases.length)
81998
+ return `${name} [${aliases.join(", ")}]`;
81999
+ return name;
82000
+ }).join(", ")}`;
82001
+ return new Error(msg);
82002
+ };
82003
+ var unrecognizedOptions = (command2, unrecognizedArgs) => {
82004
+ const msg = `Unrecognized options for command '${command2.name}': ${unrecognizedArgs.join(", ")}`;
82005
+ return new Error(msg);
82006
+ };
82007
+ var invalidBooleanSyntax = (matchedName) => {
82008
+ return new Error(
82009
+ `Invalid syntax: boolean type argument '${matchedName}' must have it's value passed in the following formats: ${matchedName}=<value> | ${matchedName} <value> | ${matchedName}.
82010
+ Allowed values: true, false, 0, 1`
82011
+ );
82012
+ };
82013
+ var invalidStringSyntax = (matchedName) => {
82014
+ return new Error(
82015
+ `Invalid syntax: string type argument '${matchedName}' must have it's value passed in the following formats: ${matchedName}=<value> | ${matchedName} <value>`
82016
+ );
82017
+ };
82018
+ var enumViolation = (matchedName, data, values) => {
82019
+ return new Error(
82020
+ `Invalid value: value for the argument '${matchedName}' must be either one of the following: ${values.join(", ")}; Received: ${data}`
82021
+ );
82022
+ };
82023
+ var enumViolationPos = (matchedName, data, values) => {
82024
+ return new Error(
82025
+ `Invalid value: value for the argument '${matchedName}' must be either one of the following: ${values.join(", ")}; Received: ${data}`
82026
+ );
82027
+ };
82028
+ var invalidNumberSyntax = (matchedName) => {
82029
+ return new Error(
82030
+ `Invalid syntax: number type argument '${matchedName}' must have it's value passed in the following formats: ${matchedName}=<value> | ${matchedName} <value>`
82031
+ );
82032
+ };
82033
+ var invalidNumberValue = (matchedName, data) => {
82034
+ return new Error(
82035
+ `Invalid value: number type argument '${matchedName}' expects a number as an input, got: ${data}`
82036
+ );
82037
+ };
82038
+ var invalidInteger = (matchedName, data) => {
82039
+ return new Error(
82040
+ `Invalid value: number type argument '${matchedName}' expects an integer as an input, got: ${data}`
82041
+ );
82042
+ };
82043
+ var belowMin = (matchedName, data, min) => {
82044
+ return new Error(
82045
+ `Invalid value: number type argument '${matchedName}' expects minimal value of ${min} as an input, got: ${data}`
82046
+ );
82047
+ };
82048
+ var aboveMax = (matchedName, data, max) => {
82049
+ return new Error(
82050
+ `Invalid value: number type argument '${matchedName}' expects maximal value of ${max} as an input, got: ${data}`
82051
+ );
82052
+ };
81257
82053
  var generatePrefix = (name) => name.startsWith("-") ? name : name.length > 1 ? `--${name}` : `-${name}`;
81258
82054
  var validateOptions = (config) => {
81259
82055
  const cloned = (0, import_clone.default)(config);
81260
82056
  const entries = [];
81261
- const storedNames = [];
82057
+ const storedNames = {};
81262
82058
  const cfgEntries = Object.entries(cloned);
81263
82059
  for (const [key, value] of cfgEntries) {
81264
82060
  const cfg = value._.config;
@@ -81268,13 +82064,13 @@ var validateOptions = (config) => {
81268
82064
  continue;
81269
82065
  if (cfg.name.includes("=")) {
81270
82066
  throw new BroCliError(
81271
- `Can't define option '${generatePrefix(cfg.name)}' - option names and aliases cannot contain '='!`
82067
+ `Can't define option ${cfg.name} - option names and aliases cannot contain '='!`
81272
82068
  );
81273
82069
  }
81274
82070
  for (const alias of cfg.aliases) {
81275
82071
  if (alias.includes("=")) {
81276
82072
  throw new BroCliError(
81277
- `Can't define option '${generatePrefix(cfg.name)}' - option names and aliases cannot contain '='!`
82073
+ `Can't define option ${cfg.name} - option names and aliases cannot contain '='!`
81278
82074
  );
81279
82075
  }
81280
82076
  }
@@ -81292,33 +82088,33 @@ var validateOptions = (config) => {
81292
82088
  for (const name of allNames) {
81293
82089
  const match2 = reservedNames.find((n) => n === name);
81294
82090
  if (match2)
81295
- throw new BroCliError(`Can't define option '${cfg.name}' - name '${match2}' is reserved!`);
82091
+ throw new BroCliError(`Can't define option ${cfg.name} - name '${match2}' is reserved!`);
81296
82092
  }
81297
- for (const storage2 of storedNames) {
82093
+ const storageVals = Object.values(storedNames);
82094
+ for (const storage2 of storageVals) {
81298
82095
  const nameOccupier = storage2.find((e2) => e2 === cfg.name);
81299
82096
  if (!nameOccupier)
81300
82097
  continue;
81301
82098
  throw new BroCliError(
81302
- `Can't define option '${cfg.name}' - name is already in use by option '${storage2[0]}'!`
82099
+ `Can't define option '${cfg.name}': name is already in use by option '${storage2[0]}'!`
81303
82100
  );
81304
82101
  }
81305
82102
  for (const alias of cfg.aliases) {
81306
- for (const storage2 of storedNames) {
82103
+ for (const storage2 of storageVals) {
81307
82104
  const nameOccupier = storage2.find((e2) => e2 === alias);
81308
82105
  if (!nameOccupier)
81309
82106
  continue;
81310
82107
  throw new BroCliError(
81311
- `Can't define option '${cfg.name}' - alias '${alias}' is already in use by option '${storage2[0]}'!`
82108
+ `Can't define option '${cfg.name}': alias '${alias}' is already in use by option '${storage2[0]}'!`
81312
82109
  );
81313
82110
  }
81314
82111
  }
81315
- const currentNames = [cfg.name, ...cfg.aliases];
81316
- storedNames.push(currentNames);
81317
- currentNames.forEach((name, idx) => {
81318
- if (currentNames.findIndex((e2) => e2 === name) === idx)
82112
+ storedNames[cfg.name] = [cfg.name, ...cfg.aliases];
82113
+ storedNames[cfg.name].forEach((name, idx) => {
82114
+ if (storedNames[cfg.name].findIndex((e2) => e2 === name) === idx)
81319
82115
  return;
81320
82116
  throw new BroCliError(
81321
- `Can't define option '${cfg.name}' - duplicate alias '${name}'!`
82117
+ `Can't define option '${cfg.name}': duplicate aliases '${name}'!`
81322
82118
  );
81323
82119
  });
81324
82120
  entries.push([key, { config: cfg, $output: void 0 }]);
@@ -81339,17 +82135,14 @@ var command = (command2) => {
81339
82135
  `Can't define command '${cmd.name}' - command can't have subcommands and positional args at the same time!`
81340
82136
  );
81341
82137
  }
81342
- if (!command2.handler && !command2.subcommands) {
81343
- throw new BroCliError(
81344
- `Can't define command '${cmd.name}' - command without subcommands must have a handler present!`
81345
- );
81346
- }
81347
82138
  const processedOptions = command2.options ? validateOptions(command2.options) : void 0;
81348
82139
  cmd.options = processedOptions;
81349
82140
  cmd.name = cmd.name ?? ((_a = cmd.aliases) == null ? void 0 : _a.shift());
81350
82141
  if (!cmd.name)
81351
82142
  throw new BroCliError(`Can't define command without name!`);
81352
82143
  cmd.aliases = ((_b = cmd.aliases) == null ? void 0 : _b.length) ? cmd.aliases : void 0;
82144
+ if (!cmd.handler)
82145
+ throw new BroCliError(`Can't define command '${cmd.name}' - command must have a handler!`);
81353
82146
  if (cmd.name.startsWith("-")) {
81354
82147
  throw new BroCliError(`Can't define command '${cmd.name}' - command name can't start with '-'!`);
81355
82148
  }
@@ -81379,7 +82172,7 @@ var command = (command2) => {
81379
82172
  }
81380
82173
  return cmd;
81381
82174
  };
81382
- var getCommandInner = (commands, candidates, args, cliName, cliDescription) => {
82175
+ var getCommandInner = (commands, candidates, args) => {
81383
82176
  const { data: arg, originalIndex: index4 } = candidates.shift();
81384
82177
  const command2 = commands.find((c) => {
81385
82178
  const names = c.aliases ? [c.name, ...c.aliases] : [c.name];
@@ -81400,20 +82193,12 @@ var getCommandInner = (commands, candidates, args, cliName, cliDescription) => {
81400
82193
  };
81401
82194
  }
81402
82195
  const newCandidates = candidates.map((c) => ({ data: c.data, originalIndex: c.originalIndex - 1 }));
81403
- const subcommand = getCommandInner(command2.subcommands, newCandidates, newArgs, cliName, cliDescription);
81404
- if (!subcommand.command) {
81405
- throw new BroCliError(void 0, {
81406
- type: "error",
81407
- violation: "unknown_subcommand_error",
81408
- name: cliName,
81409
- description: cliDescription,
81410
- command: command2,
81411
- offender: candidates[0].data
81412
- });
81413
- }
82196
+ const subcommand = getCommandInner(command2.subcommands, newCandidates, newArgs);
82197
+ if (!subcommand.command)
82198
+ throw unknownSubcommand(command2, candidates[0].data);
81414
82199
  return subcommand;
81415
82200
  };
81416
- var getCommand = (commands, args, cliName, cliDescription) => {
82201
+ var getCommand = (commands, args) => {
81417
82202
  var _a;
81418
82203
  const candidates = [];
81419
82204
  for (let i2 = 0; i2 < args.length; ++i2) {
@@ -81447,23 +82232,15 @@ var getCommand = (commands, args, cliName, cliDescription) => {
81447
82232
  args: removeByIndex(args, firstCandidate.originalIndex)
81448
82233
  };
81449
82234
  }
81450
- const { command: command2, args: argsRes } = getCommandInner(commands, candidates, args, cliName, cliDescription);
81451
- if (!command2) {
81452
- throw new BroCliError(void 0, {
81453
- type: "error",
81454
- violation: "unknown_command_error",
81455
- commands,
81456
- name: cliName,
81457
- description: cliDescription,
81458
- offender: firstCandidate.data
81459
- });
81460
- }
82235
+ const { command: command2, args: argsRes } = getCommandInner(commands, candidates, args);
82236
+ if (!command2)
82237
+ throw unknownCommand(firstCandidate.data);
81461
82238
  return {
81462
82239
  command: command2,
81463
82240
  args: argsRes
81464
82241
  };
81465
82242
  };
81466
- var parseArg = (command2, options, positionals, arg, nextArg, cliName, cliDescription) => {
82243
+ var parseArg = (options, positionals, arg, nextArg) => {
81467
82244
  let data = void 0;
81468
82245
  const argSplit = arg.split("=");
81469
82246
  const hasEq = arg.includes("=");
@@ -81484,18 +82261,8 @@ var parseArg = (command2, options, positionals, arg, nextArg, cliName, cliDescri
81484
82261
  if (!positionals.length)
81485
82262
  return {};
81486
82263
  const pos = positionals.shift();
81487
- if (pos[1].enumVals && !pos[1].enumVals.find((val2) => val2 === arg)) {
81488
- throw new BroCliError(void 0, {
81489
- type: "error",
81490
- name: cliName,
81491
- description: cliDescription,
81492
- violation: "enum_violation",
81493
- command: command2,
81494
- option: pos[1],
81495
- offender: {
81496
- dataPart: arg
81497
- }
81498
- });
82264
+ if (pos[1].enumVals && !pos[1].enumVals.find((val2) => val2 === dataPart)) {
82265
+ throw enumViolationPos(pos[1].name, arg, pos[1].enumVals);
81499
82266
  }
81500
82267
  data = arg;
81501
82268
  return {
@@ -81530,126 +82297,32 @@ var parseArg = (command2, options, positionals, arg, nextArg, cliName, cliDescri
81530
82297
  skipNext = false;
81531
82298
  return true;
81532
82299
  }
81533
- throw new BroCliError(void 0, {
81534
- type: "error",
81535
- name: cliName,
81536
- description: cliDescription,
81537
- violation: "invalid_boolean_syntax",
81538
- option: opt,
81539
- command: command2,
81540
- offender: {
81541
- namePart,
81542
- dataPart
81543
- }
81544
- });
82300
+ throw invalidBooleanSyntax(match2);
81545
82301
  } else {
81546
82302
  const match2 = names.find((name) => name === namePart);
81547
82303
  if (!match2)
81548
82304
  return false;
81549
82305
  if (opt.type === "string") {
81550
- if (!hasEq && nextArg === void 0) {
81551
- throw new BroCliError(void 0, {
81552
- type: "error",
81553
- name: cliName,
81554
- description: cliDescription,
81555
- violation: "invalid_string_syntax",
81556
- option: opt,
81557
- command: command2,
81558
- offender: {
81559
- namePart,
81560
- dataPart
81561
- }
81562
- });
81563
- }
82306
+ if (!hasEq && nextArg === void 0)
82307
+ throw invalidStringSyntax(match2);
81564
82308
  if (opt.enumVals && !opt.enumVals.find((val2) => val2 === dataPart)) {
81565
- throw new BroCliError(void 0, {
81566
- type: "error",
81567
- name: cliName,
81568
- description: cliDescription,
81569
- violation: "enum_violation",
81570
- option: opt,
81571
- command: command2,
81572
- offender: {
81573
- namePart,
81574
- dataPart
81575
- }
81576
- });
82309
+ throw enumViolation(match2, dataPart, opt.enumVals);
81577
82310
  }
81578
82311
  data = dataPart;
81579
82312
  return true;
81580
82313
  }
81581
- if (!hasEq && nextArg === void 0) {
81582
- throw new BroCliError(void 0, {
81583
- type: "error",
81584
- name: cliName,
81585
- description: cliDescription,
81586
- violation: "invalid_number_syntax",
81587
- option: opt,
81588
- command: command2,
81589
- offender: {
81590
- namePart,
81591
- dataPart
81592
- }
81593
- });
81594
- }
82314
+ if (!hasEq && nextArg === void 0)
82315
+ throw invalidNumberSyntax(match2);
81595
82316
  const numData = Number(dataPart);
81596
- if (isNaN(numData)) {
81597
- throw new BroCliError(void 0, {
81598
- type: "error",
81599
- name: cliName,
81600
- description: cliDescription,
81601
- violation: "invalid_number_value",
81602
- option: opt,
81603
- command: command2,
81604
- offender: {
81605
- namePart,
81606
- dataPart
81607
- }
81608
- });
81609
- }
81610
- if (opt.isInt && !isInt(numData)) {
81611
- throw new BroCliError(void 0, {
81612
- type: "error",
81613
- name: cliName,
81614
- description: cliDescription,
81615
- violation: "expected_int",
81616
- option: opt,
81617
- command: command2,
81618
- offender: {
81619
- namePart,
81620
- dataPart
81621
- }
81622
- });
81623
- }
81624
- if (opt.minVal !== void 0 && numData < opt.minVal) {
81625
- throw new BroCliError(void 0, {
81626
- type: "error",
81627
- name: cliName,
81628
- description: cliDescription,
81629
- violation: "below_min",
81630
- option: opt,
81631
- command: command2,
81632
- offender: {
81633
- namePart,
81634
- dataPart
81635
- }
81636
- });
81637
- }
81638
- if (opt.maxVal !== void 0 && numData > opt.maxVal) {
81639
- throw new BroCliError(void 0, {
81640
- type: "error",
81641
- name: cliName,
81642
- description: cliDescription,
81643
- violation: "above_max",
81644
- option: opt,
81645
- command: command2,
81646
- offender: {
81647
- namePart,
81648
- dataPart
81649
- }
81650
- });
81651
- }
81652
- data = numData;
82317
+ if (isNaN(numData))
82318
+ throw invalidNumberValue(match2, dataPart);
82319
+ if (opt.isInt && !isInt(numData))
82320
+ throw invalidInteger(match2, dataPart);
82321
+ if (opt.minVal !== void 0 && numData < opt.minVal)
82322
+ throw belowMin(match2, dataPart, opt.minVal);
82323
+ if (opt.maxVal !== void 0 && numData > opt.maxVal)
82324
+ throw aboveMax(match2, dataPart, opt.maxVal);
82325
+ data = dataPart;
81653
82326
  return true;
81654
82327
  }
81655
82328
  });
@@ -81660,7 +82333,7 @@ var parseArg = (command2, options, positionals, arg, nextArg, cliName, cliDescri
81660
82333
  option: option == null ? void 0 : option[1]
81661
82334
  };
81662
82335
  };
81663
- var parseOptions = (command2, args, cliName, cliDescription, omitKeysOfUndefinedOptions) => {
82336
+ var parseOptions = (command2, args, omitKeysOfUndefinedOptions) => {
81664
82337
  const options = command2.options;
81665
82338
  const optEntries = Object.entries(options ?? {}).map(
81666
82339
  (opt) => [opt[0], opt[1].config]
@@ -81680,16 +82353,16 @@ var parseOptions = (command2, args, cliName, cliDescription, omitKeysOfUndefined
81680
82353
  skipNext,
81681
82354
  isHelp,
81682
82355
  isVersion
81683
- } = parseArg(command2, nonPositionalEntries, positionalEntries, arg, nextArg, cliName, cliDescription);
82356
+ } = parseArg(nonPositionalEntries, positionalEntries, arg, nextArg);
81684
82357
  if (!option)
81685
82358
  unrecognizedArgsArr.push(arg.split("=")[0]);
81686
82359
  if (skipNext)
81687
82360
  ++i2;
82361
+ result[name] = data;
81688
82362
  if (isHelp)
81689
82363
  return "help";
81690
82364
  if (isVersion)
81691
82365
  return "version";
81692
- result[name] = data;
81693
82366
  }
81694
82367
  for (const [optKey, option] of optEntries) {
81695
82368
  const data = result[optKey] ?? option.default;
@@ -81702,29 +82375,19 @@ var parseOptions = (command2, args, cliName, cliDescription, omitKeysOfUndefined
81702
82375
  if (option.isRequired && result[optKey] === void 0)
81703
82376
  missingRequiredArr.push([option.name, ...option.aliases]);
81704
82377
  }
81705
- if (missingRequiredArr.length) {
81706
- throw new BroCliError(void 0, {
81707
- type: "error",
81708
- violation: "missing_args_error",
81709
- name: cliName,
81710
- description: cliDescription,
81711
- command: command2,
81712
- missing: missingRequiredArr
81713
- });
81714
- }
81715
- if (unrecognizedArgsArr.length) {
81716
- throw new BroCliError(void 0, {
81717
- type: "error",
81718
- violation: "unrecognized_args_error",
81719
- name: cliName,
81720
- description: cliDescription,
81721
- command: command2,
81722
- unrecognized: unrecognizedArgsArr
81723
- });
81724
- }
81725
- return Object.keys(result).length ? result : void 0;
82378
+ if (missingRequiredArr.length)
82379
+ throw missingRequired(command2, missingRequiredArr);
82380
+ if (unrecognizedArgsArr.length)
82381
+ throw unrecognizedOptions(command2, unrecognizedArgsArr);
82382
+ return result;
81726
82383
  };
81727
- var getCommandNameWithParents = (command2) => command2.parent ? `${getCommandNameWithParents(command2.parent)} ${command2.name}` : command2.name;
82384
+ var executeOrLog = async (target) => {
82385
+ if (!target || typeof target === "string")
82386
+ console.log(target);
82387
+ else
82388
+ await target();
82389
+ };
82390
+ var getCommandNameRecursive = (command2) => command2.parent ? `${getCommandNameRecursive(command2.parent)} ${command2.name}` : command2.name;
81728
82391
  var validateCommands = (commands, parent) => {
81729
82392
  const storedNames = {};
81730
82393
  for (const cmd of commands) {
@@ -81733,8 +82396,8 @@ var validateCommands = (commands, parent) => {
81733
82396
  const nameOccupier = storage2.find((e2) => e2 === cmd.name);
81734
82397
  if (!nameOccupier)
81735
82398
  continue;
81736
- throw new BroCliError(
81737
- `Can't define command '${getCommandNameWithParents(cmd)}': name is already in use by command '${parent ? `${getCommandNameWithParents(parent)} ` : ""}${storage2[0]}'!`
82399
+ throw new Error(
82400
+ `Can't define command '${getCommandNameRecursive(cmd)}': name is already in use by command '${parent ? `${getCommandNameRecursive(parent)} ` : ""}${storage2[0]}'!`
81738
82401
  );
81739
82402
  }
81740
82403
  if (cmd.aliases) {
@@ -81743,8 +82406,8 @@ var validateCommands = (commands, parent) => {
81743
82406
  const nameOccupier = storage2.find((e2) => e2 === alias);
81744
82407
  if (!nameOccupier)
81745
82408
  continue;
81746
- throw new BroCliError(
81747
- `Can't define command '${getCommandNameWithParents(cmd)}': alias '${alias}' is already in use by command '${parent ? `${getCommandNameWithParents(parent)} ` : ""}${storage2[0]}'!`
82409
+ throw new Error(
82410
+ `Can't define command '${getCommandNameRecursive(cmd)}': alias '${alias}' is already in use by command '${parent ? `${getCommandNameRecursive(parent)} ` : ""}${storage2[0]}'!`
81748
82411
  );
81749
82412
  }
81750
82413
  }
@@ -81756,135 +82419,53 @@ var validateCommands = (commands, parent) => {
81756
82419
  return commands;
81757
82420
  };
81758
82421
  var removeByIndex = (arr, idx) => [...arr.slice(0, idx), ...arr.slice(idx + 1, arr.length)];
81759
- var run = async (commands, config) => {
82422
+ var help = async (command2, commands, helpHandler) => typeof command2 === "object" ? command2.help !== void 0 ? await executeOrLog(command2.help) : await helpHandler(command2) : await helpHandler(commands);
82423
+ var rawCli = async (commands, config) => {
81760
82424
  var _a, _b;
81761
- const eventHandler = (config == null ? void 0 : config.theme) ? eventHandlerWrapper(config.theme) : defaultEventHandler;
82425
+ const processedCmds = validateCommands(commands);
81762
82426
  const argSource = (config == null ? void 0 : config.argSource) ?? process.argv;
81763
82427
  const version3 = config == null ? void 0 : config.version;
81764
- const help = config == null ? void 0 : config.help;
82428
+ const helpHandler = (config == null ? void 0 : config.help) ?? defaultTheme;
81765
82429
  const omitKeysOfUndefinedOptions = (config == null ? void 0 : config.omitKeysOfUndefinedOptions) ?? false;
81766
- const cliName = config == null ? void 0 : config.name;
81767
- const cliDescription = config == null ? void 0 : config.description;
82430
+ let args = argSource.slice(2, argSource.length);
82431
+ if (!args.length)
82432
+ return await helpHandler(processedCmds);
82433
+ const helpIndex = args.findIndex((arg) => arg === "--help" || arg === "-h");
82434
+ if (helpIndex !== -1 && (helpIndex > 0 ? ((_a = args[helpIndex - 1]) == null ? void 0 : _a.startsWith("-")) && !args[helpIndex - 1].includes("=") ? false : true : true)) {
82435
+ const command3 = getCommand(processedCmds, args).command;
82436
+ return help(command3, processedCmds, helpHandler);
82437
+ }
82438
+ const versionIndex = args.findIndex((arg) => arg === "--version" || arg === "-v");
82439
+ if (versionIndex !== -1 && (versionIndex > 0 ? ((_b = args[versionIndex - 1]) == null ? void 0 : _b.startsWith("-")) ? false : true : true)) {
82440
+ return await executeOrLog(version3);
82441
+ }
82442
+ const { command: command2, args: newArgs } = getCommand(processedCmds, args);
82443
+ if (!command2)
82444
+ return helpHandler(processedCmds);
82445
+ if (command2 === "help") {
82446
+ const { command: helpCommand } = getCommand(processedCmds, newArgs);
82447
+ return help(helpCommand, processedCmds, helpHandler);
82448
+ }
82449
+ const optionResult = parseOptions(command2, newArgs, omitKeysOfUndefinedOptions);
82450
+ if (optionResult === "help")
82451
+ return await help(command2, commands, helpHandler);
82452
+ if (optionResult === "version")
82453
+ return await executeOrLog(version3);
82454
+ if (optionResult) {
82455
+ if (config == null ? void 0 : config.hook)
82456
+ await config.hook("pre", command2);
82457
+ await command2.handler(command2.transform ? await command2.transform(optionResult) : optionResult);
82458
+ if (config == null ? void 0 : config.hook)
82459
+ await config.hook("post", command2);
82460
+ }
82461
+ return void 0;
82462
+ };
82463
+ var run = async (commands, config) => {
81768
82464
  try {
81769
- const processedCmds = validateCommands(commands);
81770
- let args = argSource.slice(2, argSource.length);
81771
- if (!args.length) {
81772
- return help !== void 0 ? await executeOrLog(help) : await eventHandler({
81773
- type: "global_help",
81774
- description: cliDescription,
81775
- name: cliName,
81776
- commands: processedCmds
81777
- });
81778
- }
81779
- const helpIndex = args.findIndex((arg) => arg === "--help" || arg === "-h");
81780
- if (helpIndex !== -1 && (helpIndex > 0 ? ((_a = args[helpIndex - 1]) == null ? void 0 : _a.startsWith("-")) && !args[helpIndex - 1].includes("=") ? false : true : true)) {
81781
- const command3 = getCommand(processedCmds, args, cliName, cliDescription).command;
81782
- if (typeof command3 === "object") {
81783
- return command3.help !== void 0 ? await executeOrLog(command3.help) : await eventHandler({
81784
- type: "command_help",
81785
- description: cliDescription,
81786
- name: cliName,
81787
- command: command3
81788
- });
81789
- } else {
81790
- return help !== void 0 ? await executeOrLog(help) : await eventHandler({
81791
- type: "global_help",
81792
- description: cliDescription,
81793
- name: cliName,
81794
- commands: processedCmds
81795
- });
81796
- }
81797
- }
81798
- const versionIndex = args.findIndex((arg) => arg === "--version" || arg === "-v");
81799
- if (versionIndex !== -1 && (versionIndex > 0 ? ((_b = args[versionIndex - 1]) == null ? void 0 : _b.startsWith("-")) ? false : true : true)) {
81800
- return version3 !== void 0 ? await executeOrLog(version3) : await eventHandler({
81801
- type: "version",
81802
- name: cliName,
81803
- description: cliDescription
81804
- });
81805
- }
81806
- const { command: command2, args: newArgs } = getCommand(processedCmds, args, cliName, cliDescription);
81807
- if (!command2) {
81808
- return help !== void 0 ? await executeOrLog(help) : await eventHandler({
81809
- type: "global_help",
81810
- description: cliDescription,
81811
- name: cliName,
81812
- commands: processedCmds
81813
- });
81814
- }
81815
- if (command2 === "help") {
81816
- let helpCommand;
81817
- let newestArgs = newArgs;
81818
- do {
81819
- const res = getCommand(processedCmds, newestArgs, cliName, cliDescription);
81820
- helpCommand = res.command;
81821
- newestArgs = res.args;
81822
- } while (helpCommand === "help");
81823
- return helpCommand ? helpCommand.help !== void 0 ? await executeOrLog(helpCommand.help) : await eventHandler({
81824
- type: "command_help",
81825
- description: cliDescription,
81826
- name: cliName,
81827
- command: helpCommand
81828
- }) : help !== void 0 ? await executeOrLog(help) : await eventHandler({
81829
- type: "global_help",
81830
- description: cliDescription,
81831
- name: cliName,
81832
- commands: processedCmds
81833
- });
81834
- }
81835
- const optionResult = parseOptions(command2, newArgs, cliName, cliDescription, omitKeysOfUndefinedOptions);
81836
- if (optionResult === "help") {
81837
- return command2.help !== void 0 ? await executeOrLog(command2.help) : await eventHandler({
81838
- type: "command_help",
81839
- description: cliDescription,
81840
- name: cliName,
81841
- command: command2
81842
- });
81843
- }
81844
- if (optionResult === "version") {
81845
- return version3 !== void 0 ? await executeOrLog(version3) : await eventHandler({
81846
- type: "version",
81847
- name: cliName,
81848
- description: cliDescription
81849
- });
81850
- }
81851
- if (command2.handler) {
81852
- if (config == null ? void 0 : config.hook)
81853
- await config.hook("before", command2);
81854
- await command2.handler(command2.transform ? await command2.transform(optionResult) : optionResult);
81855
- if (config == null ? void 0 : config.hook)
81856
- await config.hook("after", command2);
81857
- return;
81858
- } else {
81859
- return command2.help !== void 0 ? await executeOrLog(command2.help) : await eventHandler({
81860
- type: "command_help",
81861
- description: cliDescription,
81862
- name: cliName,
81863
- command: command2
81864
- });
81865
- }
82465
+ await rawCli(commands, config);
81866
82466
  } catch (e2) {
81867
- if (e2 instanceof BroCliError) {
81868
- if (e2.event)
81869
- await eventHandler(e2.event);
81870
- else {
81871
- if (!(config == null ? void 0 : config.noExit))
81872
- console.error(e2.message);
81873
- else
81874
- return e2.message;
81875
- }
81876
- } else {
81877
- await eventHandler({
81878
- type: "error",
81879
- violation: "unknown_error",
81880
- name: cliName,
81881
- description: cliDescription,
81882
- error: e2
81883
- });
81884
- }
81885
- if (!(config == null ? void 0 : config.noExit))
81886
- process.exit(1);
81887
- return;
82467
+ console.error(typeof e2 === "object" && e2 !== null && "message" in e2 ? e2.message : e2);
82468
+ process.exit(1);
81888
82469
  }
81889
82470
  };
81890
82471
  var OptionBuilderBase = class _OptionBuilderBase {
@@ -81962,7 +82543,7 @@ var OptionBuilderBase = class _OptionBuilderBase {
81962
82543
  max(value) {
81963
82544
  const config = this.config();
81964
82545
  const minVal = config.minVal;
81965
- if (minVal !== void 0 && minVal > value) {
82546
+ if (minVal !== void 0 && minVal < value) {
81966
82547
  throw new BroCliError("Unable to define option's max value to be lower than min value!");
81967
82548
  }
81968
82549
  return new _OptionBuilderBase({ ...config, maxVal: value });
@@ -83493,7 +84074,7 @@ var push = command({
83493
84074
  schemasFilter,
83494
84075
  force
83495
84076
  );
83496
- } else if (dialect7 === "sqlite") {
84077
+ } else if (dialect7 === "sqlite" && !("driver" in credentials2)) {
83497
84078
  const { sqlitePush: sqlitePush2 } = await Promise.resolve().then(() => (init_push(), push_exports));
83498
84079
  await sqlitePush2(
83499
84080
  schemaPath,
@@ -83503,6 +84084,16 @@ var push = command({
83503
84084
  tablesFilter,
83504
84085
  force
83505
84086
  );
84087
+ } else if (dialect7 === "sqlite" && ("driver" in credentials2 && credentials2.driver === "turso")) {
84088
+ const { libSQLPush: libSQLPush2 } = await Promise.resolve().then(() => (init_push(), push_exports));
84089
+ await libSQLPush2(
84090
+ schemaPath,
84091
+ verbose,
84092
+ strict,
84093
+ credentials2,
84094
+ tablesFilter,
84095
+ force
84096
+ );
83506
84097
  } else {
83507
84098
  assertUnreachable(dialect7);
83508
84099
  }
@@ -83786,7 +84377,7 @@ init_utils2();
83786
84377
  var version2 = async () => {
83787
84378
  const { npmVersion } = await ormCoreVersions();
83788
84379
  const ormVersion = npmVersion ? `drizzle-orm: v${npmVersion}` : "";
83789
- const envVersion = "0.24.0-6386ea9";
84380
+ const envVersion = "0.24.0-bb966f7";
83790
84381
  const kitVersion = envVersion ? `v${envVersion}` : "--";
83791
84382
  const versions = `drizzle-kit: ${kitVersion}
83792
84383
  ${ormVersion}`;
@@ -83821,7 +84412,6 @@ var legacy = [
83821
84412
  legacyCommand("check:sqlite", "check")
83822
84413
  ];
83823
84414
  run([generate, migrate, pull, push, studio, up, check, drop, ...legacy], {
83824
- name: "drizzle-kit",
83825
84415
  version: version2
83826
84416
  });
83827
84417
  /*! Bundled license information: