drizzle-kit 0.20.5-fd4dd75 → 0.20.6-88f61dc

Sign up to get free protection for your applications and to get access to all the features.
package/utils-studio.mjs CHANGED
@@ -1099,565 +1099,13 @@ var init_outputs = __esm({
1099
1099
  }
1100
1100
  });
1101
1101
 
1102
- // src/serializer/pgSerializer.ts
1103
- import {
1104
- customType,
1105
- PgBigInt53Builder,
1106
- PgBigSerial53Builder,
1107
- PgBooleanBuilder,
1108
- PgCharBuilder,
1109
- PgCidrBuilder,
1110
- PgDateBuilder,
1111
- PgDialect,
1112
- PgDoublePrecisionBuilder,
1113
- PgInetBuilder,
1114
- PgIntegerBuilder,
1115
- PgIntervalBuilder,
1116
- PgJsonbBuilder,
1117
- PgJsonBuilder,
1118
- PgMacaddr8Builder,
1119
- PgMacaddrBuilder,
1120
- PgNumericBuilder,
1121
- PgRealBuilder,
1122
- pgSchema,
1123
- PgSerialBuilder,
1124
- PgSmallIntBuilder,
1125
- PgSmallSerialBuilder,
1126
- pgTable,
1127
- PgTextBuilder,
1128
- PgTimeBuilder,
1129
- PgTimestampBuilder,
1130
- PgUUIDBuilder,
1131
- PgVarcharBuilder,
1132
- PrimaryKeyBuilder,
1133
- uniqueKeyName
1134
- } from "drizzle-orm/pg-core";
1135
- import { getTableConfig } from "drizzle-orm/pg-core";
1136
- import { is, SQL, getTableName } from "drizzle-orm";
1137
- var dialect, trimChar, fromDatabase, columnToDefault, defaultForColumn, toDrizzle;
1138
- var init_pgSerializer = __esm({
1139
- "src/serializer/pgSerializer.ts"() {
1140
- init_serializer();
1141
- init_source();
1142
- init_outputs();
1143
- dialect = new PgDialect();
1144
- trimChar = (str, char) => {
1145
- let start = 0;
1146
- let end = str.length;
1147
- while (start < end && str[start] === char)
1148
- ++start;
1149
- while (end > start && str[end - 1] === char)
1150
- --end;
1151
- return start > 0 || end < str.length ? str.substring(start, end) : str.toString();
1152
- };
1153
- fromDatabase = async (db, tablesFilter = (table) => true, schemaFilters, progressCallback) => {
1154
- const result = {};
1155
- const internals = { tables: {} };
1156
- const where = schemaFilters.map((t) => `table_schema = '${t}'`).join(" or ");
1157
- const allTables = await db.query(
1158
- `SELECT table_schema, table_name FROM information_schema.tables WHERE ${where};`
1159
- );
1160
- const schemas = new Set(allTables.map((it) => it.table_schema));
1161
- schemas.delete("public");
1162
- const allSchemas = await db.query(`select s.nspname as table_schema
1163
- from pg_catalog.pg_namespace s
1164
- join pg_catalog.pg_user u on u.usesysid = s.nspowner
1165
- where nspname not in ('information_schema', 'pg_catalog', 'public')
1166
- and nspname not like 'pg_toast%'
1167
- and nspname not like 'pg_temp_%'
1168
- order by table_schema;`);
1169
- allSchemas.forEach((item) => {
1170
- if (schemaFilters.includes(item.table_schema)) {
1171
- schemas.add(item.table_schema);
1172
- }
1173
- });
1174
- let columnsCount = 0;
1175
- let indexesCount = 0;
1176
- let foreignKeysCount = 0;
1177
- let tableCount = 0;
1178
- const all = allTables.map((row) => {
1179
- return new Promise(async (res, rej) => {
1180
- const tableName = row.table_name;
1181
- if (!tablesFilter(tableName))
1182
- return res("");
1183
- tableCount += 1;
1184
- const tableSchema = row.table_schema;
1185
- try {
1186
- const columnToReturn = {};
1187
- const indexToReturn = {};
1188
- const foreignKeysToReturn = {};
1189
- const primaryKeys = {};
1190
- const uniqueConstrains = {};
1191
- const tableResponse = await db.query(
1192
- `SELECT a.attrelid::regclass::text, a.attname, is_nullable, a.attndims as array_dimensions
1193
- , CASE WHEN a.atttypid = ANY ('{int,int8,int2}'::regtype[])
1194
- AND EXISTS (
1195
- SELECT FROM pg_attrdef ad
1196
- WHERE ad.adrelid = a.attrelid
1197
- AND ad.adnum = a.attnum
1198
- AND pg_get_expr(ad.adbin, ad.adrelid)
1199
- = 'nextval('''
1200
- || (pg_get_serial_sequence (a.attrelid::regclass::text
1201
- , a.attname))::regclass
1202
- || '''::regclass)'
1203
- )
1204
- THEN CASE a.atttypid
1205
- WHEN 'int'::regtype THEN 'serial'
1206
- WHEN 'int8'::regtype THEN 'bigserial'
1207
- WHEN 'int2'::regtype THEN 'smallserial'
1208
- END
1209
- ELSE format_type(a.atttypid, a.atttypmod)
1210
- END AS data_type, INFORMATION_SCHEMA.COLUMNS.table_name, INFORMATION_SCHEMA.COLUMNS.column_name, INFORMATION_SCHEMA.COLUMNS.column_default, INFORMATION_SCHEMA.COLUMNS.data_type as additional_dt
1211
- FROM pg_attribute a
1212
- JOIN INFORMATION_SCHEMA.COLUMNS ON INFORMATION_SCHEMA.COLUMNS.column_name = a.attname
1213
- WHERE a.attrelid = '"${tableSchema}"."${tableName}"'::regclass and INFORMATION_SCHEMA.COLUMNS.table_name = '${tableName}'
1214
- AND a.attnum > 0
1215
- AND NOT a.attisdropped
1216
- ORDER BY a.attnum;`
1217
- );
1218
- const tableConstraints = await db.query(
1219
- `SELECT c.column_name, c.data_type, constraint_type, constraint_name, constraint_schema
1220
- FROM information_schema.table_constraints tc
1221
- JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)
1222
- JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema
1223
- AND tc.table_name = c.table_name AND ccu.column_name = c.column_name
1224
- WHERE tc.table_name = '${tableName}' and constraint_schema = '${tableSchema}';`
1225
- );
1226
- columnsCount += tableResponse.length;
1227
- if (progressCallback) {
1228
- progressCallback("columns", columnsCount, "fetching");
1229
- }
1230
- const tableForeignKeys = await db.query(
1231
- `SELECT
1232
- tc.table_schema,
1233
- tc.constraint_name,
1234
- tc.table_name,
1235
- kcu.column_name,
1236
- ccu.table_schema AS foreign_table_schema,
1237
- ccu.table_name AS foreign_table_name,
1238
- ccu.column_name AS foreign_column_name,
1239
- rc.delete_rule, rc.update_rule
1240
- FROM
1241
- information_schema.table_constraints AS tc
1242
- JOIN information_schema.key_column_usage AS kcu
1243
- ON tc.constraint_name = kcu.constraint_name
1244
- AND tc.table_schema = kcu.table_schema
1245
- JOIN information_schema.constraint_column_usage AS ccu
1246
- ON ccu.constraint_name = tc.constraint_name
1247
- AND ccu.table_schema = tc.table_schema
1248
- JOIN information_schema.referential_constraints AS rc
1249
- ON ccu.constraint_name = rc.constraint_name
1250
- WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name='${tableName}' and tc.table_schema='${tableSchema}';`
1251
- );
1252
- foreignKeysCount += tableForeignKeys.length;
1253
- if (progressCallback) {
1254
- progressCallback("fks", foreignKeysCount, "fetching");
1255
- }
1256
- for (const fk of tableForeignKeys) {
1257
- const columnFrom = fk.column_name;
1258
- const tableTo = fk.foreign_table_name;
1259
- const columnTo = fk.foreign_column_name;
1260
- const foreignKeyName = fk.constraint_name;
1261
- const onUpdate = fk.update_rule.toLowerCase();
1262
- const onDelete = fk.delete_rule.toLowerCase();
1263
- if (typeof foreignKeysToReturn[foreignKeyName] !== "undefined") {
1264
- foreignKeysToReturn[foreignKeyName].columnsFrom.push(columnFrom);
1265
- foreignKeysToReturn[foreignKeyName].columnsTo.push(columnTo);
1266
- } else {
1267
- foreignKeysToReturn[foreignKeyName] = {
1268
- name: foreignKeyName,
1269
- tableFrom: tableName,
1270
- tableTo,
1271
- columnsFrom: [columnFrom],
1272
- columnsTo: [columnTo],
1273
- onDelete,
1274
- onUpdate
1275
- };
1276
- }
1277
- foreignKeysToReturn[foreignKeyName].columnsFrom = [
1278
- ...new Set(foreignKeysToReturn[foreignKeyName].columnsFrom)
1279
- ];
1280
- foreignKeysToReturn[foreignKeyName].columnsTo = [
1281
- ...new Set(foreignKeysToReturn[foreignKeyName].columnsTo)
1282
- ];
1283
- }
1284
- const uniqueConstrainsRows = tableConstraints.filter(
1285
- (mapRow) => mapRow.constraint_type === "UNIQUE"
1286
- );
1287
- for (const unqs of uniqueConstrainsRows) {
1288
- const columnName = unqs.column_name;
1289
- const constraintName = unqs.constraint_name;
1290
- if (typeof uniqueConstrains[constraintName] !== "undefined") {
1291
- uniqueConstrains[constraintName].columns.push(columnName);
1292
- } else {
1293
- uniqueConstrains[constraintName] = {
1294
- columns: [columnName],
1295
- nullsNotDistinct: false,
1296
- name: constraintName
1297
- };
1298
- }
1299
- }
1300
- for (const columnResponse of tableResponse) {
1301
- const columnName = columnResponse.attname;
1302
- const columnAdditionalDT = columnResponse.additional_dt;
1303
- const columnDimensions = columnResponse.array_dimensions;
1304
- let columnType = columnResponse.data_type;
1305
- const primaryKey = tableConstraints.filter(
1306
- (mapRow) => columnName === mapRow.column_name && mapRow.constraint_type === "PRIMARY KEY"
1307
- );
1308
- const cprimaryKey = tableConstraints.filter(
1309
- (mapRow) => mapRow.constraint_type === "PRIMARY KEY"
1310
- );
1311
- if (cprimaryKey.length > 1) {
1312
- const tableCompositePkName = await db.query(
1313
- `SELECT conname AS primary_key
1314
- FROM pg_constraint join pg_class on (pg_class.oid = conrelid)
1315
- WHERE contype = 'p'
1316
- AND connamespace = $1::regnamespace
1317
- AND pg_class.relname = $2;`,
1318
- [tableSchema, tableName]
1319
- );
1320
- primaryKeys[tableCompositePkName[0].primary_key] = {
1321
- name: tableCompositePkName[0].primary_key,
1322
- columns: cprimaryKey.map((c) => c.column_name)
1323
- };
1324
- }
1325
- const defaultValue = defaultForColumn(columnResponse);
1326
- const isSerial = columnType === "serial";
1327
- let columnTypeMapped = columnType;
1328
- if (columnTypeMapped.startsWith("numeric(")) {
1329
- columnTypeMapped = columnTypeMapped.replace(",", ", ");
1330
- }
1331
- if (columnAdditionalDT === "ARRAY") {
1332
- if (typeof internals.tables[tableName] === "undefined") {
1333
- internals.tables[tableName] = {
1334
- columns: {
1335
- [columnName]: {
1336
- isArray: true,
1337
- dimensions: columnDimensions,
1338
- rawType: columnTypeMapped.substring(
1339
- 0,
1340
- columnTypeMapped.length - 2
1341
- )
1342
- }
1343
- }
1344
- };
1345
- } else {
1346
- if (typeof internals.tables[tableName].columns[columnName] === "undefined") {
1347
- internals.tables[tableName].columns[columnName] = {
1348
- isArray: true,
1349
- dimensions: columnDimensions,
1350
- rawType: columnTypeMapped.substring(
1351
- 0,
1352
- columnTypeMapped.length - 2
1353
- )
1354
- };
1355
- }
1356
- }
1357
- }
1358
- if (columnAdditionalDT === "ARRAY") {
1359
- for (let i = 1; i < Number(columnDimensions); i++) {
1360
- columnTypeMapped += "[]";
1361
- }
1362
- }
1363
- columnTypeMapped = columnTypeMapped.replace("character varying", "varchar").replace(" without time zone", "").replace("character", "char");
1364
- columnTypeMapped = trimChar(columnTypeMapped, '"');
1365
- columnToReturn[columnName] = {
1366
- name: columnName,
1367
- type: columnTypeMapped,
1368
- primaryKey: primaryKey.length === 1 && cprimaryKey.length < 2,
1369
- // default: isSerial ? undefined : defaultValue,
1370
- notNull: columnResponse.is_nullable === "NO"
1371
- };
1372
- if (!isSerial && typeof defaultValue !== "undefined") {
1373
- columnToReturn[columnName].default = defaultValue;
1374
- }
1375
- }
1376
- const dbIndexes = await db.query(
1377
- `SELECT t.relname as table_name, i.relname AS index_name, ix.indisunique AS is_unique, a.attname AS column_name
1378
- FROM pg_class t
1379
- JOIN pg_index ix ON t.oid = ix.indrelid
1380
- JOIN pg_class i ON i.oid = ix.indexrelid
1381
- JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
1382
- JOIN pg_namespace ns ON ns.oid = t.relnamespace
1383
- WHERE ns.nspname = '${tableSchema}'
1384
- AND t.relname = '${tableName}'
1385
- and ix.indisprimary = false;`
1386
- );
1387
- const dbIndexFromConstraint = await db.query(
1388
- `SELECT
1389
- idx.indexrelname AS index_name,
1390
- idx.relname AS table_name,
1391
- schemaname,
1392
- CASE WHEN con.conname IS NOT NULL THEN 1 ELSE 0 END AS generated_by_constraint
1393
- FROM
1394
- pg_stat_user_indexes idx
1395
- LEFT JOIN
1396
- pg_constraint con ON con.conindid = idx.indexrelid
1397
- WHERE idx.relname = '${tableName}' and schemaname = '${tableSchema}'
1398
- group by index_name, table_name,schemaname, generated_by_constraint;`
1399
- );
1400
- const idxsInConsteraint = dbIndexFromConstraint.filter((it) => it.generated_by_constraint === 1).map((it) => it.index_name);
1401
- for (const dbIndex of dbIndexes) {
1402
- const indexName2 = dbIndex.index_name;
1403
- const indexColumnName = dbIndex.column_name;
1404
- const indexIsUnique = dbIndex.is_unique;
1405
- if (idxsInConsteraint.includes(indexName2))
1406
- continue;
1407
- if (typeof indexToReturn[indexName2] !== "undefined") {
1408
- indexToReturn[indexName2].columns.push(indexColumnName);
1409
- } else {
1410
- indexToReturn[indexName2] = {
1411
- name: indexName2,
1412
- columns: [indexColumnName],
1413
- isUnique: indexIsUnique
1414
- };
1415
- }
1416
- }
1417
- indexesCount += Object.keys(indexToReturn).length;
1418
- if (progressCallback) {
1419
- progressCallback("indexes", indexesCount, "fetching");
1420
- }
1421
- result[tableName] = {
1422
- name: tableName,
1423
- schema: tableSchema !== "public" ? tableSchema : "",
1424
- columns: columnToReturn,
1425
- indexes: indexToReturn,
1426
- foreignKeys: foreignKeysToReturn,
1427
- compositePrimaryKeys: primaryKeys,
1428
- uniqueConstraints: uniqueConstrains
1429
- };
1430
- } catch (e) {
1431
- rej(e);
1432
- return;
1433
- }
1434
- res("");
1435
- });
1436
- });
1437
- if (progressCallback) {
1438
- progressCallback("tables", tableCount, "done");
1439
- }
1440
- for await (const _ of all) {
1441
- }
1442
- if (progressCallback) {
1443
- progressCallback("columns", columnsCount, "done");
1444
- progressCallback("indexes", indexesCount, "done");
1445
- progressCallback("fks", foreignKeysCount, "done");
1446
- }
1447
- const allEnums = await db.query(
1448
- `select n.nspname as enum_schema,
1449
- t.typname as enum_name,
1450
- e.enumlabel as enum_value
1451
- from pg_type t
1452
- join pg_enum e on t.oid = e.enumtypid
1453
- join pg_catalog.pg_namespace n ON n.oid = t.typnamespace;`
1454
- );
1455
- const enumsToReturn = {};
1456
- for (const dbEnum of allEnums) {
1457
- const enumName = dbEnum.enum_name;
1458
- const enumValue = dbEnum.enum_value;
1459
- if (enumsToReturn[enumName] !== void 0 && enumsToReturn[enumName] !== null) {
1460
- enumsToReturn[enumName].values[enumValue] = enumValue;
1461
- } else {
1462
- enumsToReturn[enumName] = {
1463
- name: enumName,
1464
- values: { [enumValue]: enumValue }
1465
- };
1466
- }
1467
- }
1468
- if (progressCallback) {
1469
- progressCallback("enums", Object.keys(enumsToReturn).length, "done");
1470
- }
1471
- const schemasObject = Object.fromEntries([...schemas].map((it) => [it, it]));
1472
- return {
1473
- version: "5",
1474
- dialect: "pg",
1475
- tables: result,
1476
- enums: enumsToReturn,
1477
- schemas: schemasObject,
1478
- _meta: {
1479
- schemas: {},
1480
- tables: {},
1481
- columns: {}
1482
- },
1483
- internal: internals
1484
- };
1485
- };
1486
- columnToDefault = {
1487
- "numeric(": "::numeric",
1488
- // text: "::text",
1489
- // "character varying": "::character varying",
1490
- // "double precision": "::double precision",
1491
- // "time with time zone": "::time with time zone",
1492
- "time without time zone": "::time without time zone",
1493
- // "timestamp with time zone": "::timestamp with time zone",
1494
- "timestamp without time zone": "::timestamp without time zone",
1495
- // date: "::date",
1496
- // interval: "::interval",
1497
- // character: "::bpchar",
1498
- // macaddr8: "::macaddr8",
1499
- // macaddr: "::macaddr",
1500
- // inet: "::inet",
1501
- // cidr: "::cidr",
1502
- // jsonb: "::jsonb",
1503
- // json: "::json",
1504
- "character(": "::bpchar"
1505
- };
1506
- defaultForColumn = (column) => {
1507
- if (column.data_type === "serial" || column.data_type === "smallserial" || column.data_type === "bigserial") {
1508
- return void 0;
1509
- }
1510
- const hasDifferentDefaultCast = Object.keys(columnToDefault).find(
1511
- (it) => column.data_type.startsWith(it)
1512
- );
1513
- if (column.column_default === null) {
1514
- return void 0;
1515
- }
1516
- const columnDefaultAsString = column.column_default.toString();
1517
- if (columnDefaultAsString.endsWith(
1518
- hasDifferentDefaultCast ? columnToDefault[hasDifferentDefaultCast] : column.data_type
1519
- )) {
1520
- const nonPrefixPart = column.column_default.length - (hasDifferentDefaultCast ? columnToDefault[hasDifferentDefaultCast] : `::${column.data_type}`).length - 1;
1521
- const rt = column.column_default.toString().substring(1, nonPrefixPart);
1522
- if (/^-?[\d.]+(?:e-?\d+)?$/.test(rt) && !column.data_type.startsWith("numeric")) {
1523
- return Number(rt);
1524
- } else if (column.data_type === "json" || column.data_type === "jsonb") {
1525
- const jsonWithoutSpaces = JSON.stringify(JSON.parse(rt));
1526
- return `'${jsonWithoutSpaces}'${hasDifferentDefaultCast ? columnToDefault[hasDifferentDefaultCast] : `::${column.data_type}`}`;
1527
- } else if (column.data_type === "boolean") {
1528
- return column.column_default === "true";
1529
- } else {
1530
- return `'${rt}'`;
1531
- }
1532
- } else {
1533
- if (/^-?[\d.]+(?:e-?\d+)?$/.test(columnDefaultAsString) && !column.data_type.startsWith("numeric")) {
1534
- return Number(columnDefaultAsString);
1535
- } else if (column.data_type === "boolean") {
1536
- return column.column_default === "true";
1537
- } else {
1538
- return `${columnDefaultAsString}`;
1539
- }
1540
- }
1541
- };
1542
- toDrizzle = (schema, schemaName) => {
1543
- const tables = {};
1544
- Object.values(schema.tables).forEach((t) => {
1545
- const columns = {};
1546
- Object.values(t.columns).forEach((c) => {
1547
- const columnName = c.name;
1548
- const type = c.type;
1549
- let columnBuilder;
1550
- if (type === "bigint") {
1551
- columnBuilder = new PgBigInt53Builder(columnName);
1552
- } else if (type === "bigserial") {
1553
- columnBuilder = new PgBigSerial53Builder(columnName);
1554
- } else if (type === "boolean") {
1555
- columnBuilder = new PgBooleanBuilder(columnName);
1556
- } else if (type === "cidr") {
1557
- columnBuilder = new PgCidrBuilder(columnName);
1558
- } else if (type === "date") {
1559
- columnBuilder = new PgDateBuilder(columnName);
1560
- } else if (type === "double precision") {
1561
- columnBuilder = new PgDoublePrecisionBuilder(columnName);
1562
- } else if (type === "inet") {
1563
- columnBuilder = new PgInetBuilder(columnName);
1564
- } else if (type === "integer") {
1565
- columnBuilder = new PgIntegerBuilder(columnName);
1566
- } else if (type === "interval" || type.startsWith("interval ")) {
1567
- columnBuilder = new PgIntervalBuilder(columnName, {});
1568
- } else if (type === "json") {
1569
- columnBuilder = new PgJsonBuilder(columnName);
1570
- } else if (type === "jsonb") {
1571
- columnBuilder = new PgJsonbBuilder(columnName);
1572
- } else if (type === "macaddr") {
1573
- columnBuilder = new PgMacaddrBuilder(columnName);
1574
- } else if (type === "macaddr8") {
1575
- columnBuilder = new PgMacaddr8Builder(columnName);
1576
- } else if (type === "numeric" || type.startsWith("numeric(")) {
1577
- columnBuilder = new PgNumericBuilder(columnName);
1578
- } else if (type === "real") {
1579
- columnBuilder = new PgRealBuilder(columnName);
1580
- } else if (type === "serial") {
1581
- columnBuilder = new PgSerialBuilder(columnName);
1582
- } else if (type === "smallint") {
1583
- columnBuilder = new PgSmallIntBuilder(columnName);
1584
- } else if (type === "smallserial") {
1585
- columnBuilder = new PgSmallSerialBuilder(columnName);
1586
- } else if (type === "text") {
1587
- columnBuilder = new PgTextBuilder(columnName, {});
1588
- } else if (type === "time" || type.startsWith("time(") || type === "time with time zone") {
1589
- columnBuilder = new PgTimeBuilder(columnName, false, void 0);
1590
- } else if (type === "timestamp" || type.startsWith("timestamp(") || type === "timestamp with time zone") {
1591
- columnBuilder = new PgTimestampBuilder(columnName, false, void 0);
1592
- } else if (type === "uuid") {
1593
- columnBuilder = new PgUUIDBuilder(columnName);
1594
- } else if (type === "varchar" || type.startsWith("varchar(")) {
1595
- columnBuilder = new PgVarcharBuilder(columnName, {});
1596
- } else if (type === "char" || type.startsWith("char(")) {
1597
- columnBuilder = new PgCharBuilder(columnName, {});
1598
- } else {
1599
- columnBuilder = customType({
1600
- dataType() {
1601
- return type;
1602
- }
1603
- })(columnName);
1604
- }
1605
- if (c.notNull) {
1606
- columnBuilder = columnBuilder.notNull();
1607
- }
1608
- if (c.default) {
1609
- columnBuilder = columnBuilder.default(c.default);
1610
- }
1611
- if (c.primaryKey) {
1612
- columnBuilder = columnBuilder.primaryKey();
1613
- }
1614
- columns[columnName] = columnBuilder;
1615
- });
1616
- if (schemaName === "public") {
1617
- tables[t.name] = pgTable(t.name, columns, (cb) => {
1618
- const res = {};
1619
- Object.values(t.compositePrimaryKeys).forEach((cpk) => {
1620
- const gh = cpk.columns.map((c) => cb[c]);
1621
- res[cpk.name] = new PrimaryKeyBuilder(
1622
- gh,
1623
- cpk.name
1624
- );
1625
- });
1626
- return res;
1627
- });
1628
- } else {
1629
- tables[t.name] = pgSchema(schemaName).table(t.name, columns, (cb) => {
1630
- const res = {};
1631
- Object.values(t.compositePrimaryKeys).forEach((cpk) => {
1632
- const gh = cpk.columns.map((c) => cb[c]);
1633
- res[cpk.name] = new PrimaryKeyBuilder(
1634
- gh,
1635
- cpk.name
1636
- );
1637
- });
1638
- return res;
1639
- });
1640
- }
1641
- });
1642
- return tables;
1643
- };
1644
- }
1645
- });
1646
-
1647
1102
  // src/serializer/sqliteSerializer.ts
1648
- import { getTableName as getTableName2, is as is2, SQL as SQL2 } from "drizzle-orm";
1103
+ import { getTableName, is, SQL } from "drizzle-orm";
1649
1104
  import {
1650
- getTableConfig as getTableConfig2,
1651
- PrimaryKeyBuilder as PrimaryKeyBuilder2,
1105
+ getTableConfig,
1652
1106
  SQLiteBaseInteger,
1653
- SQLiteBlobBufferBuilder,
1654
- SQLiteIntegerBuilder,
1655
- SQLiteNumericBuilder,
1656
- SQLiteRealBuilder,
1657
1107
  SQLiteSyncDialect,
1658
- sqliteTable,
1659
- SQLiteTextBuilder,
1660
- uniqueKeyName as uniqueKeyName2
1108
+ uniqueKeyName
1661
1109
  } from "drizzle-orm/sqlite-core";
1662
1110
  function mapSqlToSqliteType(sqlType) {
1663
1111
  if ([
@@ -1694,14 +1142,14 @@ function mapSqlToSqliteType(sqlType) {
1694
1142
  return "numeric";
1695
1143
  }
1696
1144
  }
1697
- var dialect2, fromDatabase2, toDrizzle2;
1145
+ var dialect, fromDatabase;
1698
1146
  var init_sqliteSerializer = __esm({
1699
1147
  "src/serializer/sqliteSerializer.ts"() {
1700
1148
  init_serializer();
1701
1149
  init_outputs();
1702
1150
  init_source();
1703
- dialect2 = new SQLiteSyncDialect();
1704
- fromDatabase2 = async (db, tablesFilter = (table) => true, progressCallback) => {
1151
+ dialect = new SQLiteSyncDialect();
1152
+ fromDatabase = async (db, tablesFilter = (table) => true, progressCallback) => {
1705
1153
  const result = {};
1706
1154
  const columns = await db.query(
1707
1155
  `SELECT
@@ -1895,50 +1343,6 @@ WHERE
1895
1343
  }
1896
1344
  };
1897
1345
  };
1898
- toDrizzle2 = (schema) => {
1899
- const tables = {};
1900
- Object.values(schema.tables).forEach((t) => {
1901
- const columns = {};
1902
- Object.values(t.columns).forEach((c) => {
1903
- const columnName = c.name;
1904
- const type = c.type;
1905
- let columnBuilder;
1906
- if (type === "integer") {
1907
- columnBuilder = new SQLiteIntegerBuilder(columnName);
1908
- } else if (type === "text") {
1909
- columnBuilder = new SQLiteTextBuilder(columnName, {});
1910
- } else if (type === "blob") {
1911
- columnBuilder = new SQLiteBlobBufferBuilder(columnName);
1912
- } else if (type === "real") {
1913
- columnBuilder = new SQLiteRealBuilder(columnName);
1914
- } else {
1915
- columnBuilder = new SQLiteNumericBuilder(columnName);
1916
- }
1917
- if (c.notNull) {
1918
- columnBuilder = columnBuilder.notNull();
1919
- }
1920
- if (c.default) {
1921
- columnBuilder = columnBuilder.default(c.default);
1922
- }
1923
- if (c.primaryKey) {
1924
- columnBuilder = columnBuilder.primaryKey();
1925
- }
1926
- columns[columnName] = columnBuilder;
1927
- });
1928
- tables[t.name] = sqliteTable(t.name, columns, (cb) => {
1929
- const res = {};
1930
- Object.values(t.compositePrimaryKeys).forEach((cpk) => {
1931
- const gh = cpk.columns.map((c) => cb[c]);
1932
- res[cpk.name] = new PrimaryKeyBuilder2(
1933
- gh,
1934
- cpk.name
1935
- );
1936
- });
1937
- return res;
1938
- });
1939
- });
1940
- return tables;
1941
- };
1942
1346
  }
1943
1347
  });
1944
1348
 
@@ -2132,24 +1536,439 @@ var require_brace_expansion = __commonJS({
2132
1536
  }
2133
1537
  }
2134
1538
  }
2135
- N.push(c);
1539
+ N.push(c);
1540
+ }
1541
+ } else {
1542
+ N = [];
1543
+ for (var j = 0; j < n.length; j++) {
1544
+ N.push.apply(N, expand2(n[j], false));
1545
+ }
1546
+ }
1547
+ for (var j = 0; j < N.length; j++) {
1548
+ for (var k = 0; k < post.length; k++) {
1549
+ var expansion = pre + N[j] + post[k];
1550
+ if (!isTop || isSequence || expansion)
1551
+ expansions.push(expansion);
1552
+ }
1553
+ }
1554
+ }
1555
+ return expansions;
1556
+ }
1557
+ }
1558
+ });
1559
+
1560
+ // src/serializer/pgSerializer.ts
1561
+ import {
1562
+ PgDialect,
1563
+ uniqueKeyName as uniqueKeyName2
1564
+ } from "drizzle-orm/pg-core";
1565
+ import { getTableConfig as getTableConfig2 } from "drizzle-orm/pg-core";
1566
+ import { is as is2, SQL as SQL2, getTableName as getTableName2 } from "drizzle-orm";
1567
+ var dialect2, trimChar, fromDatabase2, columnToDefault, defaultForColumn;
1568
+ var init_pgSerializer = __esm({
1569
+ "src/serializer/pgSerializer.ts"() {
1570
+ init_serializer();
1571
+ init_source();
1572
+ init_outputs();
1573
+ dialect2 = new PgDialect();
1574
+ trimChar = (str, char) => {
1575
+ let start = 0;
1576
+ let end = str.length;
1577
+ while (start < end && str[start] === char)
1578
+ ++start;
1579
+ while (end > start && str[end - 1] === char)
1580
+ --end;
1581
+ return start > 0 || end < str.length ? str.substring(start, end) : str.toString();
1582
+ };
1583
+ fromDatabase2 = async (db, tablesFilter = (table) => true, schemaFilters, progressCallback) => {
1584
+ const result = {};
1585
+ const internals = { tables: {} };
1586
+ const where = schemaFilters.map((t) => `table_schema = '${t}'`).join(" or ");
1587
+ const allTables = await db.query(
1588
+ `SELECT table_schema, table_name FROM information_schema.tables WHERE ${where};`
1589
+ );
1590
+ const schemas = new Set(allTables.map((it) => it.table_schema));
1591
+ schemas.delete("public");
1592
+ const allSchemas = await db.query(`select s.nspname as table_schema
1593
+ from pg_catalog.pg_namespace s
1594
+ join pg_catalog.pg_user u on u.usesysid = s.nspowner
1595
+ where nspname not in ('information_schema', 'pg_catalog', 'public')
1596
+ and nspname not like 'pg_toast%'
1597
+ and nspname not like 'pg_temp_%'
1598
+ order by table_schema;`);
1599
+ allSchemas.forEach((item) => {
1600
+ if (schemaFilters.includes(item.table_schema)) {
1601
+ schemas.add(item.table_schema);
1602
+ }
1603
+ });
1604
+ let columnsCount = 0;
1605
+ let indexesCount = 0;
1606
+ let foreignKeysCount = 0;
1607
+ let tableCount = 0;
1608
+ const all = allTables.map((row) => {
1609
+ return new Promise(async (res, rej) => {
1610
+ const tableName = row.table_name;
1611
+ if (!tablesFilter(tableName))
1612
+ return res("");
1613
+ tableCount += 1;
1614
+ const tableSchema = row.table_schema;
1615
+ try {
1616
+ const columnToReturn = {};
1617
+ const indexToReturn = {};
1618
+ const foreignKeysToReturn = {};
1619
+ const primaryKeys = {};
1620
+ const uniqueConstrains = {};
1621
+ const tableResponse = await db.query(
1622
+ `SELECT a.attrelid::regclass::text, a.attname, is_nullable, a.attndims as array_dimensions
1623
+ , CASE WHEN a.atttypid = ANY ('{int,int8,int2}'::regtype[])
1624
+ AND EXISTS (
1625
+ SELECT FROM pg_attrdef ad
1626
+ WHERE ad.adrelid = a.attrelid
1627
+ AND ad.adnum = a.attnum
1628
+ AND pg_get_expr(ad.adbin, ad.adrelid)
1629
+ = 'nextval('''
1630
+ || (pg_get_serial_sequence (a.attrelid::regclass::text
1631
+ , a.attname))::regclass
1632
+ || '''::regclass)'
1633
+ )
1634
+ THEN CASE a.atttypid
1635
+ WHEN 'int'::regtype THEN 'serial'
1636
+ WHEN 'int8'::regtype THEN 'bigserial'
1637
+ WHEN 'int2'::regtype THEN 'smallserial'
1638
+ END
1639
+ ELSE format_type(a.atttypid, a.atttypmod)
1640
+ END AS data_type, INFORMATION_SCHEMA.COLUMNS.table_name, INFORMATION_SCHEMA.COLUMNS.column_name, INFORMATION_SCHEMA.COLUMNS.column_default, INFORMATION_SCHEMA.COLUMNS.data_type as additional_dt
1641
+ FROM pg_attribute a
1642
+ JOIN INFORMATION_SCHEMA.COLUMNS ON INFORMATION_SCHEMA.COLUMNS.column_name = a.attname
1643
+ WHERE a.attrelid = '"${tableSchema}"."${tableName}"'::regclass and INFORMATION_SCHEMA.COLUMNS.table_name = '${tableName}'
1644
+ AND a.attnum > 0
1645
+ AND NOT a.attisdropped
1646
+ ORDER BY a.attnum;`
1647
+ );
1648
+ const tableConstraints = await db.query(
1649
+ `SELECT c.column_name, c.data_type, constraint_type, constraint_name, constraint_schema
1650
+ FROM information_schema.table_constraints tc
1651
+ JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)
1652
+ JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema
1653
+ AND tc.table_name = c.table_name AND ccu.column_name = c.column_name
1654
+ WHERE tc.table_name = '${tableName}' and constraint_schema = '${tableSchema}';`
1655
+ );
1656
+ columnsCount += tableResponse.length;
1657
+ if (progressCallback) {
1658
+ progressCallback("columns", columnsCount, "fetching");
1659
+ }
1660
+ const tableForeignKeys = await db.query(
1661
+ `SELECT
1662
+ tc.table_schema,
1663
+ tc.constraint_name,
1664
+ tc.table_name,
1665
+ kcu.column_name,
1666
+ ccu.table_schema AS foreign_table_schema,
1667
+ ccu.table_name AS foreign_table_name,
1668
+ ccu.column_name AS foreign_column_name,
1669
+ rc.delete_rule, rc.update_rule
1670
+ FROM
1671
+ information_schema.table_constraints AS tc
1672
+ JOIN information_schema.key_column_usage AS kcu
1673
+ ON tc.constraint_name = kcu.constraint_name
1674
+ AND tc.table_schema = kcu.table_schema
1675
+ JOIN information_schema.constraint_column_usage AS ccu
1676
+ ON ccu.constraint_name = tc.constraint_name
1677
+ AND ccu.table_schema = tc.table_schema
1678
+ JOIN information_schema.referential_constraints AS rc
1679
+ ON ccu.constraint_name = rc.constraint_name
1680
+ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name='${tableName}' and tc.table_schema='${tableSchema}';`
1681
+ );
1682
+ foreignKeysCount += tableForeignKeys.length;
1683
+ if (progressCallback) {
1684
+ progressCallback("fks", foreignKeysCount, "fetching");
1685
+ }
1686
+ for (const fk of tableForeignKeys) {
1687
+ const columnFrom = fk.column_name;
1688
+ const tableTo = fk.foreign_table_name;
1689
+ const columnTo = fk.foreign_column_name;
1690
+ const foreignKeyName = fk.constraint_name;
1691
+ const onUpdate = fk.update_rule.toLowerCase();
1692
+ const onDelete = fk.delete_rule.toLowerCase();
1693
+ if (typeof foreignKeysToReturn[foreignKeyName] !== "undefined") {
1694
+ foreignKeysToReturn[foreignKeyName].columnsFrom.push(columnFrom);
1695
+ foreignKeysToReturn[foreignKeyName].columnsTo.push(columnTo);
1696
+ } else {
1697
+ foreignKeysToReturn[foreignKeyName] = {
1698
+ name: foreignKeyName,
1699
+ tableFrom: tableName,
1700
+ tableTo,
1701
+ columnsFrom: [columnFrom],
1702
+ columnsTo: [columnTo],
1703
+ onDelete,
1704
+ onUpdate
1705
+ };
1706
+ }
1707
+ foreignKeysToReturn[foreignKeyName].columnsFrom = [
1708
+ ...new Set(foreignKeysToReturn[foreignKeyName].columnsFrom)
1709
+ ];
1710
+ foreignKeysToReturn[foreignKeyName].columnsTo = [
1711
+ ...new Set(foreignKeysToReturn[foreignKeyName].columnsTo)
1712
+ ];
1713
+ }
1714
+ const uniqueConstrainsRows = tableConstraints.filter(
1715
+ (mapRow) => mapRow.constraint_type === "UNIQUE"
1716
+ );
1717
+ for (const unqs of uniqueConstrainsRows) {
1718
+ const columnName = unqs.column_name;
1719
+ const constraintName = unqs.constraint_name;
1720
+ if (typeof uniqueConstrains[constraintName] !== "undefined") {
1721
+ uniqueConstrains[constraintName].columns.push(columnName);
1722
+ } else {
1723
+ uniqueConstrains[constraintName] = {
1724
+ columns: [columnName],
1725
+ nullsNotDistinct: false,
1726
+ name: constraintName
1727
+ };
1728
+ }
1729
+ }
1730
+ for (const columnResponse of tableResponse) {
1731
+ const columnName = columnResponse.attname;
1732
+ const columnAdditionalDT = columnResponse.additional_dt;
1733
+ const columnDimensions = columnResponse.array_dimensions;
1734
+ let columnType = columnResponse.data_type;
1735
+ const primaryKey = tableConstraints.filter(
1736
+ (mapRow) => columnName === mapRow.column_name && mapRow.constraint_type === "PRIMARY KEY"
1737
+ );
1738
+ const cprimaryKey = tableConstraints.filter(
1739
+ (mapRow) => mapRow.constraint_type === "PRIMARY KEY"
1740
+ );
1741
+ if (cprimaryKey.length > 1) {
1742
+ const tableCompositePkName = await db.query(
1743
+ `SELECT conname AS primary_key
1744
+ FROM pg_constraint join pg_class on (pg_class.oid = conrelid)
1745
+ WHERE contype = 'p'
1746
+ AND connamespace = $1::regnamespace
1747
+ AND pg_class.relname = $2;`,
1748
+ [tableSchema, tableName]
1749
+ );
1750
+ primaryKeys[tableCompositePkName[0].primary_key] = {
1751
+ name: tableCompositePkName[0].primary_key,
1752
+ columns: cprimaryKey.map((c) => c.column_name)
1753
+ };
1754
+ }
1755
+ const defaultValue = defaultForColumn(columnResponse);
1756
+ const isSerial = columnType === "serial";
1757
+ let columnTypeMapped = columnType;
1758
+ if (columnTypeMapped.startsWith("numeric(")) {
1759
+ columnTypeMapped = columnTypeMapped.replace(",", ", ");
1760
+ }
1761
+ if (columnAdditionalDT === "ARRAY") {
1762
+ if (typeof internals.tables[tableName] === "undefined") {
1763
+ internals.tables[tableName] = {
1764
+ columns: {
1765
+ [columnName]: {
1766
+ isArray: true,
1767
+ dimensions: columnDimensions,
1768
+ rawType: columnTypeMapped.substring(
1769
+ 0,
1770
+ columnTypeMapped.length - 2
1771
+ )
1772
+ }
1773
+ }
1774
+ };
1775
+ } else {
1776
+ if (typeof internals.tables[tableName].columns[columnName] === "undefined") {
1777
+ internals.tables[tableName].columns[columnName] = {
1778
+ isArray: true,
1779
+ dimensions: columnDimensions,
1780
+ rawType: columnTypeMapped.substring(
1781
+ 0,
1782
+ columnTypeMapped.length - 2
1783
+ )
1784
+ };
1785
+ }
1786
+ }
1787
+ }
1788
+ if (columnAdditionalDT === "ARRAY") {
1789
+ for (let i = 1; i < Number(columnDimensions); i++) {
1790
+ columnTypeMapped += "[]";
1791
+ }
1792
+ }
1793
+ columnTypeMapped = columnTypeMapped.replace("character varying", "varchar").replace(" without time zone", "").replace("character", "char");
1794
+ columnTypeMapped = trimChar(columnTypeMapped, '"');
1795
+ columnToReturn[columnName] = {
1796
+ name: columnName,
1797
+ type: columnTypeMapped,
1798
+ primaryKey: primaryKey.length === 1 && cprimaryKey.length < 2,
1799
+ // default: isSerial ? undefined : defaultValue,
1800
+ notNull: columnResponse.is_nullable === "NO"
1801
+ };
1802
+ if (!isSerial && typeof defaultValue !== "undefined") {
1803
+ columnToReturn[columnName].default = defaultValue;
1804
+ }
1805
+ }
1806
+ const dbIndexes = await db.query(
1807
+ `SELECT t.relname as table_name, i.relname AS index_name, ix.indisunique AS is_unique, a.attname AS column_name
1808
+ FROM pg_class t
1809
+ JOIN pg_index ix ON t.oid = ix.indrelid
1810
+ JOIN pg_class i ON i.oid = ix.indexrelid
1811
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
1812
+ JOIN pg_namespace ns ON ns.oid = t.relnamespace
1813
+ WHERE ns.nspname = '${tableSchema}'
1814
+ AND t.relname = '${tableName}'
1815
+ and ix.indisprimary = false;`
1816
+ );
1817
+ const dbIndexFromConstraint = await db.query(
1818
+ `SELECT
1819
+ idx.indexrelname AS index_name,
1820
+ idx.relname AS table_name,
1821
+ schemaname,
1822
+ CASE WHEN con.conname IS NOT NULL THEN 1 ELSE 0 END AS generated_by_constraint
1823
+ FROM
1824
+ pg_stat_user_indexes idx
1825
+ LEFT JOIN
1826
+ pg_constraint con ON con.conindid = idx.indexrelid
1827
+ WHERE idx.relname = '${tableName}' and schemaname = '${tableSchema}'
1828
+ group by index_name, table_name,schemaname, generated_by_constraint;`
1829
+ );
1830
+ const idxsInConsteraint = dbIndexFromConstraint.filter((it) => it.generated_by_constraint === 1).map((it) => it.index_name);
1831
+ for (const dbIndex of dbIndexes) {
1832
+ const indexName2 = dbIndex.index_name;
1833
+ const indexColumnName = dbIndex.column_name;
1834
+ const indexIsUnique = dbIndex.is_unique;
1835
+ if (idxsInConsteraint.includes(indexName2))
1836
+ continue;
1837
+ if (typeof indexToReturn[indexName2] !== "undefined") {
1838
+ indexToReturn[indexName2].columns.push(indexColumnName);
1839
+ } else {
1840
+ indexToReturn[indexName2] = {
1841
+ name: indexName2,
1842
+ columns: [indexColumnName],
1843
+ isUnique: indexIsUnique
1844
+ };
1845
+ }
1846
+ }
1847
+ indexesCount += Object.keys(indexToReturn).length;
1848
+ if (progressCallback) {
1849
+ progressCallback("indexes", indexesCount, "fetching");
1850
+ }
1851
+ result[tableName] = {
1852
+ name: tableName,
1853
+ schema: tableSchema !== "public" ? tableSchema : "",
1854
+ columns: columnToReturn,
1855
+ indexes: indexToReturn,
1856
+ foreignKeys: foreignKeysToReturn,
1857
+ compositePrimaryKeys: primaryKeys,
1858
+ uniqueConstraints: uniqueConstrains
1859
+ };
1860
+ } catch (e) {
1861
+ rej(e);
1862
+ return;
2136
1863
  }
1864
+ res("");
1865
+ });
1866
+ });
1867
+ if (progressCallback) {
1868
+ progressCallback("tables", tableCount, "done");
1869
+ }
1870
+ for await (const _ of all) {
1871
+ }
1872
+ if (progressCallback) {
1873
+ progressCallback("columns", columnsCount, "done");
1874
+ progressCallback("indexes", indexesCount, "done");
1875
+ progressCallback("fks", foreignKeysCount, "done");
1876
+ }
1877
+ const allEnums = await db.query(
1878
+ `select n.nspname as enum_schema,
1879
+ t.typname as enum_name,
1880
+ e.enumlabel as enum_value
1881
+ from pg_type t
1882
+ join pg_enum e on t.oid = e.enumtypid
1883
+ join pg_catalog.pg_namespace n ON n.oid = t.typnamespace;`
1884
+ );
1885
+ const enumsToReturn = {};
1886
+ for (const dbEnum of allEnums) {
1887
+ const enumName = dbEnum.enum_name;
1888
+ const enumValue = dbEnum.enum_value;
1889
+ if (enumsToReturn[enumName] !== void 0 && enumsToReturn[enumName] !== null) {
1890
+ enumsToReturn[enumName].values[enumValue] = enumValue;
2137
1891
  } else {
2138
- N = [];
2139
- for (var j = 0; j < n.length; j++) {
2140
- N.push.apply(N, expand2(n[j], false));
2141
- }
1892
+ enumsToReturn[enumName] = {
1893
+ name: enumName,
1894
+ values: { [enumValue]: enumValue }
1895
+ };
2142
1896
  }
2143
- for (var j = 0; j < N.length; j++) {
2144
- for (var k = 0; k < post.length; k++) {
2145
- var expansion = pre + N[j] + post[k];
2146
- if (!isTop || isSequence || expansion)
2147
- expansions.push(expansion);
2148
- }
1897
+ }
1898
+ if (progressCallback) {
1899
+ progressCallback("enums", Object.keys(enumsToReturn).length, "done");
1900
+ }
1901
+ const schemasObject = Object.fromEntries([...schemas].map((it) => [it, it]));
1902
+ return {
1903
+ version: "5",
1904
+ dialect: "pg",
1905
+ tables: result,
1906
+ enums: enumsToReturn,
1907
+ schemas: schemasObject,
1908
+ _meta: {
1909
+ schemas: {},
1910
+ tables: {},
1911
+ columns: {}
1912
+ },
1913
+ internal: internals
1914
+ };
1915
+ };
1916
+ columnToDefault = {
1917
+ "numeric(": "::numeric",
1918
+ // text: "::text",
1919
+ // "character varying": "::character varying",
1920
+ // "double precision": "::double precision",
1921
+ // "time with time zone": "::time with time zone",
1922
+ "time without time zone": "::time without time zone",
1923
+ // "timestamp with time zone": "::timestamp with time zone",
1924
+ "timestamp without time zone": "::timestamp without time zone",
1925
+ // date: "::date",
1926
+ // interval: "::interval",
1927
+ // character: "::bpchar",
1928
+ // macaddr8: "::macaddr8",
1929
+ // macaddr: "::macaddr",
1930
+ // inet: "::inet",
1931
+ // cidr: "::cidr",
1932
+ // jsonb: "::jsonb",
1933
+ // json: "::json",
1934
+ "character(": "::bpchar"
1935
+ };
1936
+ defaultForColumn = (column) => {
1937
+ if (column.data_type === "serial" || column.data_type === "smallserial" || column.data_type === "bigserial") {
1938
+ return void 0;
1939
+ }
1940
+ const hasDifferentDefaultCast = Object.keys(columnToDefault).find(
1941
+ (it) => column.data_type.startsWith(it)
1942
+ );
1943
+ if (column.column_default === null) {
1944
+ return void 0;
1945
+ }
1946
+ const columnDefaultAsString = column.column_default.toString();
1947
+ if (columnDefaultAsString.endsWith(
1948
+ hasDifferentDefaultCast ? columnToDefault[hasDifferentDefaultCast] : column.data_type
1949
+ )) {
1950
+ const nonPrefixPart = column.column_default.length - (hasDifferentDefaultCast ? columnToDefault[hasDifferentDefaultCast] : `::${column.data_type}`).length - 1;
1951
+ const rt = column.column_default.toString().substring(1, nonPrefixPart);
1952
+ if (/^-?[\d.]+(?:e-?\d+)?$/.test(rt) && !column.data_type.startsWith("numeric")) {
1953
+ return Number(rt);
1954
+ } else if (column.data_type === "json" || column.data_type === "jsonb") {
1955
+ const jsonWithoutSpaces = JSON.stringify(JSON.parse(rt));
1956
+ return `'${jsonWithoutSpaces}'${hasDifferentDefaultCast ? columnToDefault[hasDifferentDefaultCast] : `::${column.data_type}`}`;
1957
+ } else if (column.data_type === "boolean") {
1958
+ return column.column_default === "true";
1959
+ } else {
1960
+ return `'${rt}'`;
1961
+ }
1962
+ } else {
1963
+ if (/^-?[\d.]+(?:e-?\d+)?$/.test(columnDefaultAsString) && !column.data_type.startsWith("numeric")) {
1964
+ return Number(columnDefaultAsString);
1965
+ } else if (column.data_type === "boolean") {
1966
+ return column.column_default === "true";
1967
+ } else {
1968
+ return `${columnDefaultAsString}`;
2149
1969
  }
2150
1970
  }
2151
- return expansions;
2152
- }
1971
+ };
2153
1972
  }
2154
1973
  });
2155
1974
 
@@ -2185,9 +2004,192 @@ var init_drivers = __esm({
2185
2004
  }
2186
2005
  });
2187
2006
 
2188
- // src/utils-studio.ts
2189
- init_pgSerializer();
2190
- init_sqliteSerializer();
2007
+ // src/serializer/schemaToDrizzle.ts
2008
+ import {
2009
+ customType,
2010
+ PgBigInt53Builder,
2011
+ PgBigSerial53Builder,
2012
+ PgBooleanBuilder,
2013
+ PgCharBuilder,
2014
+ PgCidrBuilder,
2015
+ PgDateBuilder,
2016
+ PgDoublePrecisionBuilder,
2017
+ PgInetBuilder,
2018
+ PgIntegerBuilder,
2019
+ PgIntervalBuilder,
2020
+ PgJsonbBuilder,
2021
+ PgJsonBuilder,
2022
+ PgMacaddr8Builder,
2023
+ PgMacaddrBuilder,
2024
+ PgNumericBuilder,
2025
+ PgRealBuilder,
2026
+ pgSchema,
2027
+ PgSerialBuilder,
2028
+ PgSmallIntBuilder,
2029
+ PgSmallSerialBuilder,
2030
+ pgTable,
2031
+ PgTextBuilder,
2032
+ PgTimeBuilder,
2033
+ PgTimestampBuilder,
2034
+ PgUUIDBuilder,
2035
+ PgVarcharBuilder,
2036
+ PrimaryKeyBuilder as PgPrimaryKeyBuilder
2037
+ } from "drizzle-orm/pg-core";
2038
+ import {
2039
+ SQLiteIntegerBuilder,
2040
+ SQLiteTextBuilder,
2041
+ SQLiteBlobBufferBuilder,
2042
+ SQLiteRealBuilder,
2043
+ SQLiteNumericBuilder,
2044
+ sqliteTable,
2045
+ PrimaryKeyBuilder as SQLitePrimaryKeyBuilder
2046
+ } from "drizzle-orm/sqlite-core";
2047
+ var pgSchemaToDrizzle = (schema, schemaName) => {
2048
+ const tables = {};
2049
+ Object.values(schema.tables).forEach((t) => {
2050
+ const columns = {};
2051
+ Object.values(t.columns).forEach((c) => {
2052
+ const columnName = c.name;
2053
+ const type = c.type;
2054
+ let columnBuilder;
2055
+ if (type === "bigint") {
2056
+ columnBuilder = new PgBigInt53Builder(columnName);
2057
+ } else if (type === "bigserial") {
2058
+ columnBuilder = new PgBigSerial53Builder(columnName);
2059
+ } else if (type === "boolean") {
2060
+ columnBuilder = new PgBooleanBuilder(columnName);
2061
+ } else if (type === "cidr") {
2062
+ columnBuilder = new PgCidrBuilder(columnName);
2063
+ } else if (type === "date") {
2064
+ columnBuilder = new PgDateBuilder(columnName);
2065
+ } else if (type === "double precision") {
2066
+ columnBuilder = new PgDoublePrecisionBuilder(columnName);
2067
+ } else if (type === "inet") {
2068
+ columnBuilder = new PgInetBuilder(columnName);
2069
+ } else if (type === "integer") {
2070
+ columnBuilder = new PgIntegerBuilder(columnName);
2071
+ } else if (type === "interval" || type.startsWith("interval ")) {
2072
+ columnBuilder = new PgIntervalBuilder(columnName, {});
2073
+ } else if (type === "json") {
2074
+ columnBuilder = new PgJsonBuilder(columnName);
2075
+ } else if (type === "jsonb") {
2076
+ columnBuilder = new PgJsonbBuilder(columnName);
2077
+ } else if (type === "macaddr") {
2078
+ columnBuilder = new PgMacaddrBuilder(columnName);
2079
+ } else if (type === "macaddr8") {
2080
+ columnBuilder = new PgMacaddr8Builder(columnName);
2081
+ } else if (type === "numeric" || type.startsWith("numeric(")) {
2082
+ columnBuilder = new PgNumericBuilder(columnName);
2083
+ } else if (type === "real") {
2084
+ columnBuilder = new PgRealBuilder(columnName);
2085
+ } else if (type === "serial") {
2086
+ columnBuilder = new PgSerialBuilder(columnName);
2087
+ } else if (type === "smallint") {
2088
+ columnBuilder = new PgSmallIntBuilder(columnName);
2089
+ } else if (type === "smallserial") {
2090
+ columnBuilder = new PgSmallSerialBuilder(columnName);
2091
+ } else if (type === "text") {
2092
+ columnBuilder = new PgTextBuilder(columnName, {});
2093
+ } else if (type === "time" || type.startsWith("time(") || type === "time with time zone") {
2094
+ columnBuilder = new PgTimeBuilder(columnName, false, void 0);
2095
+ } else if (type === "timestamp" || type.startsWith("timestamp(") || type === "timestamp with time zone") {
2096
+ columnBuilder = new PgTimestampBuilder(columnName, false, void 0);
2097
+ } else if (type === "uuid") {
2098
+ columnBuilder = new PgUUIDBuilder(columnName);
2099
+ } else if (type === "varchar" || type.startsWith("varchar(")) {
2100
+ columnBuilder = new PgVarcharBuilder(columnName, {});
2101
+ } else if (type === "char" || type.startsWith("char(")) {
2102
+ columnBuilder = new PgCharBuilder(columnName, {});
2103
+ } else {
2104
+ columnBuilder = customType({
2105
+ dataType() {
2106
+ return type;
2107
+ }
2108
+ })(columnName);
2109
+ }
2110
+ if (c.notNull) {
2111
+ columnBuilder = columnBuilder.notNull();
2112
+ }
2113
+ if (c.default) {
2114
+ columnBuilder = columnBuilder.default(c.default);
2115
+ }
2116
+ if (c.primaryKey) {
2117
+ columnBuilder = columnBuilder.primaryKey();
2118
+ }
2119
+ columns[columnName] = columnBuilder;
2120
+ });
2121
+ if (schemaName === "public") {
2122
+ tables[t.name] = pgTable(t.name, columns, (cb) => {
2123
+ const res = {};
2124
+ Object.values(t.compositePrimaryKeys).forEach((cpk) => {
2125
+ const gh = cpk.columns.map((c) => cb[c]);
2126
+ res[cpk.name] = new PgPrimaryKeyBuilder(
2127
+ gh,
2128
+ cpk.name
2129
+ );
2130
+ });
2131
+ return res;
2132
+ });
2133
+ } else {
2134
+ tables[t.name] = pgSchema(schemaName).table(t.name, columns, (cb) => {
2135
+ const res = {};
2136
+ Object.values(t.compositePrimaryKeys).forEach((cpk) => {
2137
+ const gh = cpk.columns.map((c) => cb[c]);
2138
+ res[cpk.name] = new PgPrimaryKeyBuilder(
2139
+ gh,
2140
+ cpk.name
2141
+ );
2142
+ });
2143
+ return res;
2144
+ });
2145
+ }
2146
+ });
2147
+ return tables;
2148
+ };
2149
+ var sqliteSchemaToDrizzle = (schema) => {
2150
+ const tables = {};
2151
+ Object.values(schema.tables).forEach((t) => {
2152
+ const columns = {};
2153
+ Object.values(t.columns).forEach((c) => {
2154
+ const columnName = c.name;
2155
+ const type = c.type;
2156
+ let columnBuilder;
2157
+ if (type === "integer") {
2158
+ columnBuilder = new SQLiteIntegerBuilder(columnName);
2159
+ } else if (type === "text") {
2160
+ columnBuilder = new SQLiteTextBuilder(columnName, {});
2161
+ } else if (type === "blob") {
2162
+ columnBuilder = new SQLiteBlobBufferBuilder(columnName);
2163
+ } else if (type === "real") {
2164
+ columnBuilder = new SQLiteRealBuilder(columnName);
2165
+ } else {
2166
+ columnBuilder = new SQLiteNumericBuilder(columnName);
2167
+ }
2168
+ if (c.notNull) {
2169
+ columnBuilder = columnBuilder.notNull();
2170
+ }
2171
+ if (c.default) {
2172
+ columnBuilder = columnBuilder.default(c.default);
2173
+ }
2174
+ if (c.primaryKey) {
2175
+ columnBuilder = columnBuilder.primaryKey();
2176
+ }
2177
+ columns[columnName] = columnBuilder;
2178
+ });
2179
+ tables[t.name] = sqliteTable(t.name, columns, (cb) => {
2180
+ const res = {};
2181
+ Object.values(t.compositePrimaryKeys).forEach((cpk) => {
2182
+ const gh = cpk.columns.map((c) => cb[c]);
2183
+ res[cpk.name] = new SQLitePrimaryKeyBuilder(
2184
+ gh,
2185
+ cpk.name
2186
+ );
2187
+ });
2188
+ return res;
2189
+ });
2190
+ });
2191
+ return tables;
2192
+ };
2191
2193
 
2192
2194
  // src/cli/commands/sqliteIntrospect.ts
2193
2195
  init_views();
@@ -3365,7 +3367,7 @@ var sqlitePushIntrospect = async (client, filters) => {
3365
3367
  }
3366
3368
  return false;
3367
3369
  };
3368
- const res = await fromDatabase2(client, filter2);
3370
+ const res = await fromDatabase(client, filter2);
3369
3371
  const schema = { id: originUUID, prevId: "", ...res };
3370
3372
  return { schema };
3371
3373
  };
@@ -3401,7 +3403,7 @@ var pgPushIntrospect = async (connection, filters, schemaFilters) => {
3401
3403
  }
3402
3404
  return false;
3403
3405
  };
3404
- const res = await fromDatabase(client, filter2, schemaFilters);
3406
+ const res = await fromDatabase2(client, filter2, schemaFilters);
3405
3407
  const schema = { id: originUUID, prevId: "", ...res };
3406
3408
  const { internal, ...schemaWithoutInternals } = schema;
3407
3409
  return { schema: schemaWithoutInternals };
@@ -3412,8 +3414,8 @@ init_drivers();
3412
3414
  export {
3413
3415
  DrizzleORMPgClient,
3414
3416
  TursoSqlite,
3415
- toDrizzle as drizzleSchemaPg,
3416
- toDrizzle2 as drizzleSchemaSQLite,
3417
+ pgSchemaToDrizzle as drizzleSchemaPg,
3418
+ sqliteSchemaToDrizzle as drizzleSchemaSQLite,
3417
3419
  pgPushIntrospect,
3418
3420
  sqlitePushIntrospect
3419
3421
  };