metal-orm 1.1.10 → 1.1.11

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.
@@ -98,6 +98,31 @@ const databaseFunction: FunctionNode = {
98
98
  args: []
99
99
  };
100
100
 
101
+ const readMysqlField = (row: object, field: string): unknown => {
102
+ const record = row as Record<string, unknown>;
103
+
104
+ if (Object.prototype.hasOwnProperty.call(record, field)) {
105
+ return record[field];
106
+ }
107
+
108
+ const lower = field.toLowerCase();
109
+ if (lower !== field && Object.prototype.hasOwnProperty.call(record, lower)) {
110
+ return record[lower];
111
+ }
112
+
113
+ const upper = field.toUpperCase();
114
+ if (upper !== field && Object.prototype.hasOwnProperty.call(record, upper)) {
115
+ return record[upper];
116
+ }
117
+
118
+ return undefined;
119
+ };
120
+
121
+ const readMysqlStringField = (row: object, field: string): string | undefined => {
122
+ const value = readMysqlField(row, field);
123
+ return typeof value === 'string' ? value : undefined;
124
+ };
125
+
101
126
  /**
102
127
  * Schema introspector for MySQL.
103
128
  * Queries information_schema tables to extract schema metadata.
@@ -254,30 +279,58 @@ export const mysqlIntrospector: SchemaIntrospector = {
254
279
 
255
280
  const tableComments = new Map<string, string>();
256
281
  tableRows.forEach(r => {
257
- const key = `${r.table_schema}.${r.table_name}`;
258
- if (r.table_comment) {
259
- tableComments.set(key, r.table_comment);
282
+ const tableSchema = readMysqlStringField(r, 'table_schema');
283
+ const tableName = readMysqlStringField(r, 'table_name');
284
+ const tableComment = readMysqlStringField(r, 'table_comment');
285
+ if (!tableSchema || !tableName) return;
286
+ const key = `${tableSchema}.${tableName}`;
287
+ if (tableComment) {
288
+ tableComments.set(key, tableComment);
260
289
  }
261
290
  });
262
291
 
263
292
  const pkMap = new Map<string, string[]>();
264
293
  pkRows.forEach(r => {
265
- const key = `${r.table_schema}.${r.table_name}`;
294
+ const tableSchema = readMysqlStringField(r, 'table_schema');
295
+ const tableName = readMysqlStringField(r, 'table_name');
296
+ const columnName = readMysqlStringField(r, 'column_name');
297
+ if (!tableSchema || !tableName || !columnName) return;
298
+ const key = `${tableSchema}.${tableName}`;
266
299
  const list = pkMap.get(key) || [];
267
- list.push(r.column_name);
300
+ list.push(columnName);
268
301
  pkMap.set(key, list);
269
302
  });
270
303
 
271
304
  const fkMap = new Map<string, MysqlForeignKeyEntry[]>();
272
305
  fkRows.forEach(r => {
273
- const key = `${r.table_schema}.${r.table_name}.${r.column_name}`;
306
+ const tableSchema = readMysqlStringField(r, 'table_schema');
307
+ const tableName = readMysqlStringField(r, 'table_name');
308
+ const columnName = readMysqlStringField(r, 'column_name');
309
+ const constraintName = readMysqlStringField(r, 'constraint_name');
310
+ const referencedTableSchema = readMysqlStringField(r, 'referenced_table_schema');
311
+ const referencedTableName = readMysqlStringField(r, 'referenced_table_name');
312
+ const referencedColumnName = readMysqlStringField(r, 'referenced_column_name');
313
+ const deleteRule = readMysqlStringField(r, 'delete_rule');
314
+ const updateRule = readMysqlStringField(r, 'update_rule');
315
+ if (
316
+ !tableSchema ||
317
+ !tableName ||
318
+ !columnName ||
319
+ !constraintName ||
320
+ !referencedTableSchema ||
321
+ !referencedTableName ||
322
+ !referencedColumnName
323
+ ) {
324
+ return;
325
+ }
326
+ const key = `${tableSchema}.${tableName}.${columnName}`;
274
327
  const list = fkMap.get(key) || [];
275
328
  list.push({
276
- table: `${r.referenced_table_schema}.${r.referenced_table_name}`,
277
- column: r.referenced_column_name,
278
- onDelete: r.delete_rule,
279
- onUpdate: r.update_rule,
280
- name: r.constraint_name
329
+ table: `${referencedTableSchema}.${referencedTableName}`,
330
+ column: referencedColumnName,
331
+ onDelete: deleteRule,
332
+ onUpdate: updateRule,
333
+ name: constraintName
281
334
  });
282
335
  fkMap.set(key, list);
283
336
  });
@@ -285,12 +338,21 @@ export const mysqlIntrospector: SchemaIntrospector = {
285
338
  const tablesByKey = new Map<string, DatabaseTable>();
286
339
 
287
340
  columnRows.forEach(r => {
288
- const key = `${r.table_schema}.${r.table_name}`;
289
- if (!shouldIncludeTable(r.table_name, options)) return;
341
+ const tableSchema = readMysqlStringField(r, 'table_schema');
342
+ const tableName = readMysqlStringField(r, 'table_name');
343
+ const columnName = readMysqlStringField(r, 'column_name');
344
+ const columnType = readMysqlStringField(r, 'column_type') || readMysqlStringField(r, 'data_type');
345
+ const isNullable = readMysqlStringField(r, 'is_nullable');
346
+ const columnDefault = readMysqlField(r, 'column_default');
347
+ const extra = readMysqlStringField(r, 'extra');
348
+ const columnComment = readMysqlStringField(r, 'column_comment');
349
+ if (!tableSchema || !tableName || !columnName || !columnType || !isNullable) return;
350
+ const key = `${tableSchema}.${tableName}`;
351
+ if (!shouldIncludeTable(tableName, options)) return;
290
352
  if (!tablesByKey.has(key)) {
291
353
  tablesByKey.set(key, {
292
- name: r.table_name,
293
- schema: r.table_schema,
354
+ name: tableName,
355
+ schema: tableSchema,
294
356
  columns: [],
295
357
  primaryKey: pkMap.get(key) || [],
296
358
  indexes: [],
@@ -298,17 +360,16 @@ export const mysqlIntrospector: SchemaIntrospector = {
298
360
  });
299
361
  }
300
362
  const table = tablesByKey.get(key)!;
301
- const columnType = r.column_type || r.data_type;
302
- const comment = r.column_comment?.trim() ? r.column_comment : undefined;
363
+ const comment = columnComment?.trim() ? columnComment : undefined;
303
364
  const column: DatabaseColumn = {
304
- name: r.column_name,
365
+ name: columnName,
305
366
  type: columnType,
306
- notNull: r.is_nullable === 'NO',
307
- default: r.column_default ?? undefined,
308
- autoIncrement: typeof r.extra === 'string' && r.extra.includes('auto_increment'),
367
+ notNull: isNullable === 'NO',
368
+ default: columnDefault ?? undefined,
369
+ autoIncrement: typeof extra === 'string' && extra.includes('auto_increment'),
309
370
  comment
310
371
  };
311
- const fk = fkMap.get(`${key}.${r.column_name}`)?.[0];
372
+ const fk = fkMap.get(`${key}.${columnName}`)?.[0];
312
373
  if (fk) {
313
374
  column.references = {
314
375
  table: fk.table,
@@ -322,14 +383,20 @@ export const mysqlIntrospector: SchemaIntrospector = {
322
383
  });
323
384
 
324
385
  indexRows.forEach(r => {
325
- const key = `${r.table_schema}.${r.table_name}`;
386
+ const tableSchema = readMysqlStringField(r, 'table_schema');
387
+ const tableName = readMysqlStringField(r, 'table_name');
388
+ const indexName = readMysqlStringField(r, 'index_name');
389
+ const nonUnique = readMysqlField(r, 'non_unique');
390
+ const colsValue = readMysqlField(r, 'cols');
391
+ if (!tableSchema || !tableName || !indexName) return;
392
+ const key = `${tableSchema}.${tableName}`;
326
393
  const table = tablesByKey.get(key);
327
394
  if (!table) return;
328
- const cols = (typeof r.cols === 'string' ? r.cols.split(',') : []).map(c => ({ column: c.trim() }));
395
+ const cols = (typeof colsValue === 'string' ? colsValue.split(',') : []).map(c => ({ column: c.trim() }));
329
396
  const idx: DatabaseIndex = {
330
- name: r.index_name,
397
+ name: indexName,
331
398
  columns: cols,
332
- unique: r.non_unique === 0
399
+ unique: Number(nonUnique) === 0
333
400
  };
334
401
  table.indexes = table.indexes || [];
335
402
  table.indexes.push(idx);
@@ -409,26 +476,36 @@ export const mysqlIntrospector: SchemaIntrospector = {
409
476
  const viewsByKey = new Map<string, DatabaseView>();
410
477
 
411
478
  for (const r of viewRows) {
412
- if (!shouldIncludeView(r.table_name, options)) continue;
413
- const key = `${r.table_schema}.${r.table_name}`;
479
+ const tableSchema = readMysqlStringField(r, 'table_schema');
480
+ const tableName = readMysqlStringField(r, 'table_name');
481
+ const viewDefinition = readMysqlStringField(r, 'view_definition');
482
+ if (!tableSchema || !tableName) continue;
483
+ if (!shouldIncludeView(tableName, options)) continue;
484
+ const key = `${tableSchema}.${tableName}`;
414
485
  viewsByKey.set(key, {
415
- name: r.table_name,
416
- schema: r.table_schema,
486
+ name: tableName,
487
+ schema: tableSchema,
417
488
  columns: [],
418
- definition: r.view_definition || undefined
489
+ definition: viewDefinition || undefined
419
490
  });
420
491
  }
421
492
 
422
493
  for (const r of viewColumnRows) {
423
- const key = `${r.table_schema}.${r.table_name}`;
494
+ const tableSchema = readMysqlStringField(r, 'table_schema');
495
+ const tableName = readMysqlStringField(r, 'table_name');
496
+ const columnName = readMysqlStringField(r, 'column_name');
497
+ const columnType = readMysqlStringField(r, 'column_type') || readMysqlStringField(r, 'data_type');
498
+ const isNullable = readMysqlStringField(r, 'is_nullable');
499
+ const columnComment = readMysqlStringField(r, 'column_comment');
500
+ if (!tableSchema || !tableName || !columnName || !columnType || !isNullable) continue;
501
+ const key = `${tableSchema}.${tableName}`;
424
502
  const view = viewsByKey.get(key);
425
503
  if (!view) continue;
426
- const columnType = r.column_type || r.data_type;
427
504
  const column: DatabaseColumn = {
428
- name: r.column_name,
505
+ name: columnName,
429
506
  type: columnType,
430
- notNull: r.is_nullable === 'NO',
431
- comment: r.column_comment?.trim() || undefined
507
+ notNull: isNullable === 'NO',
508
+ comment: columnComment?.trim() || undefined
432
509
  };
433
510
  view.columns.push(column);
434
511
  }
@@ -12,10 +12,10 @@ export interface BetterSqlite3Statement {
12
12
  run(...params: unknown[]): { changes: number; lastInsertRowid: number | bigint };
13
13
  }
14
14
 
15
- export interface BetterSqlite3ClientLike {
16
- prepare(sql: string): BetterSqlite3Statement;
17
- transaction<T extends (...args: any[]) => any>(fn: T): T;
18
- }
15
+ export interface BetterSqlite3ClientLike {
16
+ prepare(sql: string): BetterSqlite3Statement;
17
+ transaction<T extends (...args: unknown[]) => unknown>(fn: T): T;
18
+ }
19
19
 
20
20
  const SAVEPOINT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
21
21