bun-query-builder 0.2.16 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,6 +13,11 @@ export declare function generateModelSource(table: string, columns: Introspected
13
13
  export declare function introspectDatabase(opts?: { tables?: string[] }): Promise<IntrospectedModel[]>;
14
14
  /** Map a raw SQL column type back to a normalized model column type. */
15
15
  export declare function sqlTypeToNormalized(rawType: string, dialect: SupportedDialect, ctx?: { enumValues?: string[] }): NormalizedColumnType;
16
+ /**
17
+ * Normalize a MySQL information_schema column without discarding physical
18
+ * details carried only by COLUMN_TYPE (for example TINYINT(1) and VARCHAR(n)).
19
+ */
20
+ export declare function mysqlColumnType(dataType: unknown, columnType: unknown, enumValues?: string[]): NormalizedColumnType;
16
21
  /**
17
22
  * The plan type for one Postgres column, given what the catalogue knows.
18
23
  *
package/dist/bin/cli.js CHANGED
@@ -17764,6 +17764,9 @@ function sqlTypeToNormalized(rawType, dialect, ctx) {
17764
17764
  return "enum";
17765
17765
  return "string";
17766
17766
  }
17767
+ function mysqlColumnType(dataType, columnType, enumValues) {
17768
+ return sqlTypeToNormalized(String(columnType || dataType || ""), "mysql", { enumValues });
17769
+ }
17767
17770
  function asAction(raw2) {
17768
17771
  const v = String(raw2 ?? "").toLowerCase().trim();
17769
17772
  if (v === "cascade" || v === "restrict" || v === "set null")
@@ -17959,7 +17962,7 @@ async function buildMysqlTable(qb, table) {
17959
17962
  const hasDefault = rawDefault != null;
17960
17963
  return {
17961
17964
  name,
17962
- type: sqlTypeToNormalized(String(r.data_type ?? r.DATA_TYPE ?? columnType), "mysql", { enumValues }),
17965
+ type: mysqlColumnType(r.data_type ?? r.DATA_TYPE, columnType, enumValues),
17963
17966
  isPrimaryKey,
17964
17967
  isUnique: uniqueColumns.has(name),
17965
17968
  isNullable: isPrimaryKey ? false : String(r.is_nullable ?? r.IS_NULLABLE).toUpperCase() === "YES",
@@ -18207,7 +18210,42 @@ class MySQLDriver {
18207
18210
  sql += ` ON DELETE ${onDelete.toUpperCase()}`;
18208
18211
  if (onUpdate)
18209
18212
  sql += ` ON UPDATE ${onUpdate.toUpperCase()}`;
18210
- return `${sql};`;
18213
+ return `${this.dropForeignKeysOn(tableName, columnName)}
18214
+ ${sql};`;
18215
+ }
18216
+ dropForeignKeysOn(tableName, columnName) {
18217
+ const table = this.quoteLiteral(tableName);
18218
+ const column = this.quoteLiteral(columnName);
18219
+ return `SET @drop_fks := (
18220
+ SELECT CONCAT(
18221
+ 'ALTER TABLE \`', ${table}, '\` DROP FOREIGN KEY \`',
18222
+ GROUP_CONCAT(kcu.CONSTRAINT_NAME SEPARATOR '\`, DROP FOREIGN KEY \`'),
18223
+ '\`'
18224
+ )
18225
+ FROM information_schema.KEY_COLUMN_USAGE kcu
18226
+ WHERE kcu.TABLE_SCHEMA = DATABASE()
18227
+ AND kcu.TABLE_NAME = ${table}
18228
+ AND kcu.COLUMN_NAME = ${column}
18229
+ AND kcu.REFERENCED_TABLE_NAME IS NOT NULL
18230
+ AND kcu.CONSTRAINT_NAME IN (
18231
+ SELECT single.CONSTRAINT_NAME FROM (
18232
+ SELECT inner_kcu.CONSTRAINT_NAME
18233
+ FROM information_schema.KEY_COLUMN_USAGE inner_kcu
18234
+ WHERE inner_kcu.TABLE_SCHEMA = DATABASE()
18235
+ AND inner_kcu.TABLE_NAME = ${table}
18236
+ AND inner_kcu.REFERENCED_TABLE_NAME IS NOT NULL
18237
+ GROUP BY inner_kcu.CONSTRAINT_NAME
18238
+ HAVING COUNT(*) = 1
18239
+ ) AS single
18240
+ )
18241
+ );
18242
+ SET @drop_fks := IFNULL(@drop_fks, 'SELECT 1');
18243
+ PREPARE drop_fks_stmt FROM @drop_fks;
18244
+ EXECUTE drop_fks_stmt;
18245
+ DEALLOCATE PREPARE drop_fks_stmt;`;
18246
+ }
18247
+ quoteLiteral(value) {
18248
+ return `'${value.replace(/'/g, "''")}'`;
18211
18249
  }
18212
18250
  addColumn(tableName, column) {
18213
18251
  const typeSql = this.getColumnType(column);
@@ -18397,7 +18435,34 @@ class PostgresDriver {
18397
18435
  sql += ` ON DELETE ${onDelete.toUpperCase()}`;
18398
18436
  if (onUpdate)
18399
18437
  sql += ` ON UPDATE ${onUpdate.toUpperCase()}`;
18400
- return `${sql};`;
18438
+ return `${this.dropForeignKeysOn(tableName, columnName)}
18439
+ ${sql};`;
18440
+ }
18441
+ dropForeignKeysOn(tableName, columnName) {
18442
+ const table = this.quoteLiteral(tableName);
18443
+ const column = this.quoteLiteral(columnName);
18444
+ return `DO $$
18445
+ DECLARE existing_name text;
18446
+ BEGIN
18447
+ FOR existing_name IN
18448
+ SELECT con.conname
18449
+ FROM pg_constraint con
18450
+ JOIN pg_class rel ON rel.oid = con.conrelid
18451
+ JOIN pg_namespace nsp ON nsp.oid = rel.relnamespace
18452
+ WHERE con.contype = 'f'
18453
+ AND rel.relname = ${table}
18454
+ AND nsp.nspname = current_schema()
18455
+ AND con.conkey = ARRAY[(
18456
+ SELECT att.attnum FROM pg_attribute att
18457
+ WHERE att.attrelid = rel.oid AND att.attname = ${column} AND att.attnum > 0
18458
+ )]::smallint[]
18459
+ LOOP
18460
+ EXECUTE format('ALTER TABLE %I DROP CONSTRAINT %I', ${table}, existing_name);
18461
+ END LOOP;
18462
+ END $$;`;
18463
+ }
18464
+ quoteLiteral(value) {
18465
+ return `'${value.replace(/'/g, "''")}'`;
18401
18466
  }
18402
18467
  addColumn(tableName, column) {
18403
18468
  const typeSql = this.getColumnType(column);
@@ -31562,7 +31627,7 @@ function getPrefix() {
31562
31627
  }
31563
31628
  var prefix = getPrefix();
31564
31629
  // package.json
31565
- var version2 = "0.2.16";
31630
+ var version2 = "0.2.18";
31566
31631
 
31567
31632
  // bin/cli.ts
31568
31633
  init_actions();
package/dist/src/index.js CHANGED
@@ -17763,6 +17763,9 @@ function sqlTypeToNormalized(rawType, dialect, ctx) {
17763
17763
  return "enum";
17764
17764
  return "string";
17765
17765
  }
17766
+ function mysqlColumnType(dataType, columnType, enumValues) {
17767
+ return sqlTypeToNormalized(String(columnType || dataType || ""), "mysql", { enumValues });
17768
+ }
17766
17769
  function asAction(raw2) {
17767
17770
  const v = String(raw2 ?? "").toLowerCase().trim();
17768
17771
  if (v === "cascade" || v === "restrict" || v === "set null")
@@ -17958,7 +17961,7 @@ async function buildMysqlTable(qb, table) {
17958
17961
  const hasDefault = rawDefault != null;
17959
17962
  return {
17960
17963
  name,
17961
- type: sqlTypeToNormalized(String(r.data_type ?? r.DATA_TYPE ?? columnType), "mysql", { enumValues }),
17964
+ type: mysqlColumnType(r.data_type ?? r.DATA_TYPE, columnType, enumValues),
17962
17965
  isPrimaryKey,
17963
17966
  isUnique: uniqueColumns.has(name),
17964
17967
  isNullable: isPrimaryKey ? false : String(r.is_nullable ?? r.IS_NULLABLE).toUpperCase() === "YES",
@@ -18206,7 +18209,42 @@ class MySQLDriver {
18206
18209
  sql += ` ON DELETE ${onDelete.toUpperCase()}`;
18207
18210
  if (onUpdate)
18208
18211
  sql += ` ON UPDATE ${onUpdate.toUpperCase()}`;
18209
- return `${sql};`;
18212
+ return `${this.dropForeignKeysOn(tableName, columnName)}
18213
+ ${sql};`;
18214
+ }
18215
+ dropForeignKeysOn(tableName, columnName) {
18216
+ const table = this.quoteLiteral(tableName);
18217
+ const column = this.quoteLiteral(columnName);
18218
+ return `SET @drop_fks := (
18219
+ SELECT CONCAT(
18220
+ 'ALTER TABLE \`', ${table}, '\` DROP FOREIGN KEY \`',
18221
+ GROUP_CONCAT(kcu.CONSTRAINT_NAME SEPARATOR '\`, DROP FOREIGN KEY \`'),
18222
+ '\`'
18223
+ )
18224
+ FROM information_schema.KEY_COLUMN_USAGE kcu
18225
+ WHERE kcu.TABLE_SCHEMA = DATABASE()
18226
+ AND kcu.TABLE_NAME = ${table}
18227
+ AND kcu.COLUMN_NAME = ${column}
18228
+ AND kcu.REFERENCED_TABLE_NAME IS NOT NULL
18229
+ AND kcu.CONSTRAINT_NAME IN (
18230
+ SELECT single.CONSTRAINT_NAME FROM (
18231
+ SELECT inner_kcu.CONSTRAINT_NAME
18232
+ FROM information_schema.KEY_COLUMN_USAGE inner_kcu
18233
+ WHERE inner_kcu.TABLE_SCHEMA = DATABASE()
18234
+ AND inner_kcu.TABLE_NAME = ${table}
18235
+ AND inner_kcu.REFERENCED_TABLE_NAME IS NOT NULL
18236
+ GROUP BY inner_kcu.CONSTRAINT_NAME
18237
+ HAVING COUNT(*) = 1
18238
+ ) AS single
18239
+ )
18240
+ );
18241
+ SET @drop_fks := IFNULL(@drop_fks, 'SELECT 1');
18242
+ PREPARE drop_fks_stmt FROM @drop_fks;
18243
+ EXECUTE drop_fks_stmt;
18244
+ DEALLOCATE PREPARE drop_fks_stmt;`;
18245
+ }
18246
+ quoteLiteral(value) {
18247
+ return `'${value.replace(/'/g, "''")}'`;
18210
18248
  }
18211
18249
  addColumn(tableName, column) {
18212
18250
  const typeSql = this.getColumnType(column);
@@ -18396,7 +18434,34 @@ class PostgresDriver {
18396
18434
  sql += ` ON DELETE ${onDelete.toUpperCase()}`;
18397
18435
  if (onUpdate)
18398
18436
  sql += ` ON UPDATE ${onUpdate.toUpperCase()}`;
18399
- return `${sql};`;
18437
+ return `${this.dropForeignKeysOn(tableName, columnName)}
18438
+ ${sql};`;
18439
+ }
18440
+ dropForeignKeysOn(tableName, columnName) {
18441
+ const table = this.quoteLiteral(tableName);
18442
+ const column = this.quoteLiteral(columnName);
18443
+ return `DO $$
18444
+ DECLARE existing_name text;
18445
+ BEGIN
18446
+ FOR existing_name IN
18447
+ SELECT con.conname
18448
+ FROM pg_constraint con
18449
+ JOIN pg_class rel ON rel.oid = con.conrelid
18450
+ JOIN pg_namespace nsp ON nsp.oid = rel.relnamespace
18451
+ WHERE con.contype = 'f'
18452
+ AND rel.relname = ${table}
18453
+ AND nsp.nspname = current_schema()
18454
+ AND con.conkey = ARRAY[(
18455
+ SELECT att.attnum FROM pg_attribute att
18456
+ WHERE att.attrelid = rel.oid AND att.attname = ${column} AND att.attnum > 0
18457
+ )]::smallint[]
18458
+ LOOP
18459
+ EXECUTE format('ALTER TABLE %I DROP CONSTRAINT %I', ${table}, existing_name);
18460
+ END LOOP;
18461
+ END $$;`;
18462
+ }
18463
+ quoteLiteral(value) {
18464
+ return `'${value.replace(/'/g, "''")}'`;
18400
18465
  }
18401
18466
  addColumn(tableName, column) {
18402
18467
  const typeSql = this.getColumnType(column);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bun-query-builder",
3
3
  "type": "module",
4
- "version": "0.2.16",
4
+ "version": "0.2.18",
5
5
  "description": "A simple yet performant query builder for TypeScript. Built with Bun.",
6
6
  "author": "Chris Breuer <chris@stacksjs.org>",
7
7
  "license": "MIT",