orchid-orm 1.75.0 → 1.76.1
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.
- package/dist/index.d.ts +55 -36
- package/dist/index.js +17 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -5
- package/dist/index.mjs.map +1 -1
- package/dist/migrations/index.js +12 -5
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/index.mjs +12 -5
- package/dist/migrations/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.d.ts
CHANGED
|
@@ -13,7 +13,15 @@ interface BelongsToOptions<Columns extends Column.Shape.QueryInit = Column.Shape
|
|
|
13
13
|
on?: ColumnsShape.InputPartial<Related['columns']['shape']>;
|
|
14
14
|
}
|
|
15
15
|
type BelongsToParams<T extends RelationConfigSelf, FK extends string> = { [Name in FK]: T['columns']['shape'][Name]['__type'] };
|
|
16
|
-
type BelongsToDefaultRequired<T extends RelationConfigSelf, Rel extends BelongsTo> =
|
|
16
|
+
type BelongsToDefaultRequired<T extends RelationConfigSelf, Rel extends BelongsTo, Related> = Related extends {
|
|
17
|
+
softDelete: true;
|
|
18
|
+
} ? false : BelongsToDefaultRequiredFromColumns<T, Rel>;
|
|
19
|
+
type BelongsToDefaultRequiredFromColumns<T extends RelationConfigSelf, Rel extends BelongsTo> = BelongsToColumnRequired<T['columns']['shape'][Rel['options']['columns'][number] & string]> extends true ? true : false;
|
|
20
|
+
type BelongsToColumnRequired<Column> = Column extends {
|
|
21
|
+
data: {
|
|
22
|
+
isNullable: true;
|
|
23
|
+
};
|
|
24
|
+
} ? false : true;
|
|
17
25
|
type BelongsToQuery<T extends Query, Name extends string> = { [P in keyof T]: P extends '__selectable' ? SelectableFromShape<T['shape'], Name> : P extends '__as' ? Name : P extends CreateMethodsNames | DeleteMethodsNames ? never : T[P] } & QueryHasWhere;
|
|
18
26
|
interface BelongsToDataForCreate<Name extends string, FK extends string, Required, Q extends Query> {
|
|
19
27
|
columns: FK;
|
|
@@ -261,16 +269,27 @@ type RelationToOneDataForCreateSameQuery<Q extends RelationToOneDataForCreateSam
|
|
|
261
269
|
};
|
|
262
270
|
interface RelationThunkBase {
|
|
263
271
|
type: string;
|
|
264
|
-
|
|
272
|
+
id: string;
|
|
265
273
|
options: unknown;
|
|
266
274
|
}
|
|
267
275
|
type RelationThunk = BelongsTo | HasOne | HasMany | HasAndBelongsToMany;
|
|
268
276
|
interface RelationThunks {
|
|
269
277
|
[K: string]: RelationThunk;
|
|
270
278
|
}
|
|
271
|
-
type
|
|
272
|
-
|
|
273
|
-
|
|
279
|
+
type TableClassInstances<T extends TableClasses> = InstanceType<T[keyof T]>;
|
|
280
|
+
type RelationToTableInputById<Tables, Id extends string> = Extract<Tables, {
|
|
281
|
+
id: Id;
|
|
282
|
+
}>;
|
|
283
|
+
type RelationToTableInputByKey<T extends TableClasses, Id extends string> = Id extends keyof T ? InstanceType<T[Id]> : never;
|
|
284
|
+
type RelationToTableInputByName<Tables, Id extends string> = Extract<Tables, {
|
|
285
|
+
table: Id;
|
|
286
|
+
} | {
|
|
287
|
+
name: Id;
|
|
288
|
+
}>;
|
|
289
|
+
type RelationToTableInputByKeyOrName<T extends TableClasses, Id extends string> = Id extends keyof T ? RelationToTableInputByKey<T, Id> : RelationToTableInputByName<TableClassInstances<T>, Id>;
|
|
290
|
+
type RelationToTableInputFromClasses<T extends TableClasses, Id extends string> = RelationToTableInputById<TableClassInstances<T>, Id> extends infer Result ? [Result] extends [never] ? RelationToTableInputByKeyOrName<T, Id> : Result : never;
|
|
291
|
+
type RelationToTableInput<TC extends TableClasses, VC extends TableClasses, Rel extends RelationThunkBase> = RelationToTableInputFromClasses<TC, Rel['id']> extends infer Result ? [Result] extends [never] ? RelationToTableInputFromClasses<VC, Rel['id']> extends infer Result ? [Result] extends [never] ? false : Result : never : Result : never;
|
|
292
|
+
type RelationTableToQuery<TC extends TableClasses, VC extends TableClasses, Rel extends RelationThunkBase> = RelationToTableInput<TC, VC, Rel> extends infer Result extends ORMTableInput ? TableQueryBuilder<TC, VC, Result> : never;
|
|
274
293
|
interface RelationConfigSelf {
|
|
275
294
|
columns: {
|
|
276
295
|
shape: Column.Shape.QueryInit;
|
|
@@ -315,23 +334,17 @@ interface OrchidORMTableHelper<T extends Query> {
|
|
|
315
334
|
*/
|
|
316
335
|
makeHelper<Args extends unknown[], Result>(fn: (q: T, ...args: Args) => Result): OrchidORMQueryHelper<T, Args, Result>;
|
|
317
336
|
}
|
|
318
|
-
type OrchidORMTables<
|
|
319
|
-
new (): infer R extends ORMTableInput;
|
|
320
|
-
} ? OrchidORMTableHelper<TableQueryBuilder<R>> : never };
|
|
321
|
-
type OrchidORMViews<T extends TableClasses = TableClasses> = { [K in keyof T]: T[K] extends {
|
|
337
|
+
type OrchidORMTables<TC extends TableClasses = TableClasses, VC extends TableClasses = TableClasses> = { [K in keyof TC]: TC[K] extends {
|
|
322
338
|
new (): infer R extends ORMTableInput;
|
|
323
|
-
} ? OrchidORMTableHelper<TableQueryBuilder<R>> : never };
|
|
324
|
-
type OrchidORMBundle<
|
|
325
|
-
$views:
|
|
339
|
+
} ? OrchidORMTableHelper<TableQueryBuilder<TC, VC, R>> : never };
|
|
340
|
+
type OrchidORMBundle<TC extends TableClasses = TableClasses, VC extends TableClasses = TableClasses> = OrchidORMTables<TC> & {
|
|
341
|
+
$views: OrchidORMTables<VC, TC>;
|
|
326
342
|
};
|
|
327
|
-
type OrchidORMDbTables<
|
|
343
|
+
type OrchidORMDbTables<TC extends TableClasses = TableClasses, VC extends TableClasses = TableClasses> = { [K in keyof TC]: TC[K] extends {
|
|
328
344
|
new (): infer R extends ORMTableInput;
|
|
329
|
-
} ? TableQueryBuilder<R> : never };
|
|
330
|
-
type
|
|
331
|
-
|
|
332
|
-
} ? TableQueryBuilder<R> : never };
|
|
333
|
-
type OrchidORM<T extends TableClasses = TableClasses, V extends TableClasses = TableClasses> = OrchidORMDbTables<T> & {
|
|
334
|
-
$views: OrchidORMDbViews<V>;
|
|
345
|
+
} ? TableQueryBuilder<TC, VC, R> : never };
|
|
346
|
+
type OrchidORM<TC extends TableClasses = TableClasses, VC extends TableClasses = TableClasses> = OrchidORMDbTables<TC, VC> & {
|
|
347
|
+
$views: OrchidORMDbTables<VC, TC>;
|
|
335
348
|
} & OrchidORMMethods;
|
|
336
349
|
/**
|
|
337
350
|
* Identity helper for table row-level security configuration.
|
|
@@ -525,23 +538,23 @@ interface TableInfo {
|
|
|
525
538
|
name: string;
|
|
526
539
|
}
|
|
527
540
|
interface Table extends Query, TableInfo {}
|
|
528
|
-
type BelongsToRequired<T extends RelationConfigSelf, Rel extends BelongsTo> = Rel['options'] extends {
|
|
541
|
+
type BelongsToRequired<T extends RelationConfigSelf, Rel extends BelongsTo, Related> = Rel['options'] extends {
|
|
529
542
|
required: infer Required extends boolean;
|
|
530
543
|
} ? Required : Rel['options'] extends {
|
|
531
544
|
on: unknown;
|
|
532
|
-
} ? false : BelongsToDefaultRequired<T, Rel>;
|
|
533
|
-
type BelongsToRelationInfo<T extends RelationConfigSelf, Name extends string, Rel extends BelongsTo> = BelongsToInfo<T, Rel['options']['columns'][number] & string, BelongsToRequired<T, Rel>, BelongsToQuery<
|
|
534
|
-
type BelongsToCreateData<T extends RelationConfigSelf, Name extends string, Rel extends BelongsTo> = BelongsToDataForCreate<Name, Rel['options']['columns'][number] & string, BelongsToRequired<T, Rel>, BelongsToQuery<
|
|
545
|
+
} ? false : BelongsToDefaultRequired<T, Rel, Related>;
|
|
546
|
+
type BelongsToRelationInfo<TC extends TableClasses, VC extends TableClasses, T extends RelationConfigSelf, Name extends string, Rel extends BelongsTo> = RelationToTableInput<TC, VC, Rel> extends infer Related extends ORMTableInput ? BelongsToInfo<T, Rel['options']['columns'][number] & string, BelongsToRequired<T, Rel, Related>, BelongsToQuery<TableQueryBuilder<TC, VC, Related>, Name>> : never;
|
|
547
|
+
type BelongsToCreateData<TC extends TableClasses, VC extends TableClasses, T extends RelationConfigSelf, Name extends string, Rel extends BelongsTo> = RelationToTableInput<TC, VC, Rel> extends infer Related extends ORMTableInput ? BelongsToDataForCreate<Name, Rel['options']['columns'][number] & string, BelongsToRequired<T, Rel, Related>, BelongsToQuery<TableQueryBuilder<TC, VC, Related>, Name>> : never;
|
|
535
548
|
type BelongsToCreateDataColumns<T extends RelationConfigSelf> = { [K in keyof T['relations']]: T['relations'][K] extends BelongsTo ? T['relations'][K]['options']['columns'][number] & string : never }[keyof T['relations']];
|
|
536
|
-
type BelongsToCreateDataForColumn<T extends RelationConfigSelf, Column extends string> = { [K in keyof T['relations']]: T['relations'][K] extends BelongsTo ? Column extends T['relations'][K]['options']['columns'][number] ? BelongsToCreateData<T, K & string, T['relations'][K]> : never : never }[keyof T['relations']];
|
|
537
|
-
type RelationDataForCreate<T extends RelationConfigSelf, Name extends keyof T['relations'] & string> = T['relations'][Name] extends HasOne ? HasOneInfo<T, Name, T['relations'][Name], HasOneQuery<T, Name, RelationTableToQuery<T['relations'][Name]>>>['dataForCreate'] : T['relations'][Name] extends HasMany ? HasManyInfo<T, Name, T['relations'][Name], HasManyQuery<T, Name, RelationTableToQuery<T['relations'][Name]>>>['dataForCreate'] : T['relations'][Name] extends HasAndBelongsToMany ? HasAndBelongsToManyInfo<T, Name, T['relations'][Name]['options']['columns'][number] & string, HasAndBelongsToManyQuery<Name, RelationTableToQuery<T['relations'][Name]>>>['dataForCreate'] : never;
|
|
549
|
+
type BelongsToCreateDataForColumn<TC extends TableClasses, VC extends TableClasses, T extends RelationConfigSelf, Column extends string> = { [K in keyof T['relations']]: T['relations'][K] extends BelongsTo ? Column extends T['relations'][K]['options']['columns'][number] ? BelongsToCreateData<TC, VC, T, K & string, T['relations'][K]> : never : never }[keyof T['relations']];
|
|
550
|
+
type RelationDataForCreate<TC extends TableClasses, VC extends TableClasses, T extends RelationConfigSelf, Name extends keyof T['relations'] & string> = T['relations'][Name] extends HasOne ? HasOneInfo<T, Name, T['relations'][Name], HasOneQuery<T, Name, RelationTableToQuery<TC, VC, T['relations'][Name]>>>['dataForCreate'] : T['relations'][Name] extends HasMany ? HasManyInfo<T, Name, T['relations'][Name], HasManyQuery<T, Name, RelationTableToQuery<TC, VC, T['relations'][Name]>>>['dataForCreate'] : T['relations'][Name] extends HasAndBelongsToMany ? HasAndBelongsToManyInfo<T, Name, T['relations'][Name]['options']['columns'][number] & string, HasAndBelongsToManyQuery<Name, RelationTableToQuery<TC, VC, T['relations'][Name]>>>['dataForCreate'] : never;
|
|
538
551
|
type RelationDataForCreateOptionalNames<T extends RelationConfigSelf> = { [K in keyof T['relations'] & string]: T['relations'][K] extends BelongsTo ? never : K }[keyof T['relations'] & string];
|
|
539
|
-
type BelongsToRelationsDataForCreate<T extends RelationConfigSelf> = { [Column in BelongsToCreateDataColumns<T>]: BelongsToCreateDataForColumn<T, Column> };
|
|
540
|
-
type RelationsDataForCreateOptional<T extends RelationConfigSelf> = RelationDataForCreateOptionalNames<T> extends never ? EmptyObject : { [K in RelationDataForCreateOptionalNames<T>]: (u: RelationDataForCreate<T, K>) => void }[RelationDataForCreateOptionalNames<T>] extends ((u: infer Obj) => void) ? Obj : EmptyObject;
|
|
541
|
-
interface TableQueryBuilder<T extends ORMTableInput> extends TableInfo, Db<T['table'] extends string ? T['table'] : T['name'], T['columns']['shape'], T['columns']['data'], T['types'], T['table'] extends string ? T['readOnly'] extends true ? true : undefined : T['readOnly'] extends false ? undefined : true, T> {
|
|
542
|
-
relations: T extends RelationConfigSelf ? { [K in keyof T['relations'] & string]: T['relations'][K] extends BelongsTo ? BelongsToRelationInfo<T, K, T['relations'][K]> : T['relations'][K] extends HasOne ? HasOneInfo<T, K, T['relations'][K], HasOneQuery<T, K, RelationTableToQuery<T['relations'][K]>>> : T['relations'][K] extends HasMany ? HasManyInfo<T, K, T['relations'][K], HasManyQuery<T, K, RelationTableToQuery<T['relations'][K]>>> : T['relations'][K] extends HasAndBelongsToMany ? HasAndBelongsToManyInfo<T, K, T['relations'][K]['options']['columns'][number] & string, HasAndBelongsToManyQuery<K, RelationTableToQuery<T['relations'][K]>>> : never } : EmptyObject;
|
|
543
|
-
relationsDataForCreate: T extends RelationConfigSelf ? BelongsToRelationsDataForCreate<T> : EmptyObject;
|
|
544
|
-
relationsDataForCreateOptional: T extends RelationConfigSelf ? RelationsDataForCreateOptional<T> : EmptyObject;
|
|
552
|
+
type BelongsToRelationsDataForCreate<TC extends TableClasses, VC extends TableClasses, T extends RelationConfigSelf> = { [Column in BelongsToCreateDataColumns<T>]: BelongsToCreateDataForColumn<TC, VC, T, Column> };
|
|
553
|
+
type RelationsDataForCreateOptional<TC extends TableClasses, VC extends TableClasses, T extends RelationConfigSelf> = RelationDataForCreateOptionalNames<T> extends never ? EmptyObject : { [K in RelationDataForCreateOptionalNames<T>]: (u: RelationDataForCreate<TC, VC, T, K>) => void }[RelationDataForCreateOptionalNames<T>] extends ((u: infer Obj) => void) ? Obj : EmptyObject;
|
|
554
|
+
interface TableQueryBuilder<TC extends TableClasses, VC extends TableClasses, T extends ORMTableInput> extends TableInfo, Db<T['table'] extends string ? T['table'] : T['name'], T['columns']['shape'], T['columns']['data'], T['types'], T['table'] extends string ? T['readOnly'] extends true ? true : undefined : T['readOnly'] extends false ? undefined : true, T> {
|
|
555
|
+
relations: T extends RelationConfigSelf ? { [K in keyof T['relations'] & string]: T['relations'][K] extends BelongsTo ? BelongsToRelationInfo<TC, VC, T, K, T['relations'][K]> : T['relations'][K] extends HasOne ? HasOneInfo<T, K, T['relations'][K], HasOneQuery<T, K, RelationTableToQuery<TC, VC, T['relations'][K]>>> : T['relations'][K] extends HasMany ? HasManyInfo<T, K, T['relations'][K], HasManyQuery<T, K, RelationTableToQuery<TC, VC, T['relations'][K]>>> : T['relations'][K] extends HasAndBelongsToMany ? HasAndBelongsToManyInfo<T, K, T['relations'][K]['options']['columns'][number] & string, HasAndBelongsToManyQuery<K, RelationTableToQuery<TC, VC, T['relations'][K]>>> : never } : EmptyObject;
|
|
556
|
+
relationsDataForCreate: T extends RelationConfigSelf ? BelongsToRelationsDataForCreate<TC, VC, T> : EmptyObject;
|
|
557
|
+
relationsDataForCreateOptional: T extends RelationConfigSelf ? RelationsDataForCreateOptional<TC, VC, T> : EmptyObject;
|
|
545
558
|
}
|
|
546
559
|
interface PickORMTableInputColumns {
|
|
547
560
|
columns: {
|
|
@@ -557,8 +570,10 @@ interface PickORMTableComputed {
|
|
|
557
570
|
}
|
|
558
571
|
interface PickORMTableInputColumnsAndComputed extends PickORMTableInputColumns, PickORMTableComputed {}
|
|
559
572
|
interface ORMTableInput extends PickORMTableInputColumnsAndComputed {
|
|
573
|
+
id?: string;
|
|
560
574
|
autoForeignKeys?: TableData.References.BaseOptions | boolean;
|
|
561
575
|
schema?: QuerySchema;
|
|
576
|
+
nameInDb?: string;
|
|
562
577
|
types: unknown;
|
|
563
578
|
filePath: string;
|
|
564
579
|
language?: string;
|
|
@@ -615,6 +630,10 @@ interface SetColumnsResult<Shape extends Column.Shape.QueryInit, Data extends Ma
|
|
|
615
630
|
}
|
|
616
631
|
interface BaseTableInstance<ColumnTypes> {
|
|
617
632
|
table?: string;
|
|
633
|
+
/**
|
|
634
|
+
* Database relation name used in SQL and migration generation.
|
|
635
|
+
*/
|
|
636
|
+
nameInDb?: string;
|
|
618
637
|
columns: {
|
|
619
638
|
shape: Column.Shape.QueryInit;
|
|
620
639
|
data: MaybeArray<TableDataItem>;
|
|
@@ -751,7 +770,7 @@ interface BaseTableInstance<ColumnTypes> {
|
|
|
751
770
|
new (): Related;
|
|
752
771
|
}, options: Options): {
|
|
753
772
|
type: 'belongsTo';
|
|
754
|
-
|
|
773
|
+
id: Related['id'] extends string ? Related['id'] : Related['table'] extends string ? Related['table'] : Related['name'];
|
|
755
774
|
options: Options;
|
|
756
775
|
};
|
|
757
776
|
hasOne<Columns extends Column.Shape.QueryInit, Related extends ORMTableInput, Through extends string, Source extends string, Options extends HasOneOptions<Columns, Related, Through, Source>>(this: {
|
|
@@ -762,7 +781,7 @@ interface BaseTableInstance<ColumnTypes> {
|
|
|
762
781
|
new (): Related;
|
|
763
782
|
}, options: Options): {
|
|
764
783
|
type: 'hasOne';
|
|
765
|
-
|
|
784
|
+
id: Related['id'] extends string ? Related['id'] : Related['table'] extends string ? Related['table'] : Related['name'];
|
|
766
785
|
options: Options;
|
|
767
786
|
};
|
|
768
787
|
hasMany<Columns extends Column.Shape.QueryInit, Related extends ORMTableInput, Through extends string, Source extends string, Options extends HasOneOptions<Columns, Related, Through, Source>>(this: {
|
|
@@ -773,7 +792,7 @@ interface BaseTableInstance<ColumnTypes> {
|
|
|
773
792
|
new (): Related;
|
|
774
793
|
}, options: Options): {
|
|
775
794
|
type: 'hasMany';
|
|
776
|
-
|
|
795
|
+
id: Related['id'] extends string ? Related['id'] : Related['table'] extends string ? Related['table'] : Related['name'];
|
|
777
796
|
options: Options;
|
|
778
797
|
};
|
|
779
798
|
hasAndBelongsToMany<Columns extends Column.Shape.QueryInit, Related extends ORMTableInput, Options extends HasAndBelongsToManyOptions<Columns, Related>>(this: {
|
|
@@ -784,7 +803,7 @@ interface BaseTableInstance<ColumnTypes> {
|
|
|
784
803
|
new (): Related;
|
|
785
804
|
}, options: Options): {
|
|
786
805
|
type: 'hasAndBelongsToMany';
|
|
787
|
-
|
|
806
|
+
id: Related['id'] extends string ? Related['id'] : Related['table'] extends string ? Related['table'] : Related['name'];
|
|
788
807
|
options: Options;
|
|
789
808
|
};
|
|
790
809
|
beforeQuery: BeforeHookMethod;
|
|
@@ -892,4 +911,4 @@ declare const createRepo: <T extends Query, Methods extends MethodsBase<T>>(tabl
|
|
|
892
911
|
table: T["table"];
|
|
893
912
|
shape: T["shape"];
|
|
894
913
|
}>(q: Q) => Query & Q & MapMethods<T, Methods>) & T, Methods>;
|
|
895
|
-
export { BaseMaterializedViewInstance, BaseTableClass, BaseTableInstance, BaseViewInstance, DefaultSelect, FromQuery, Insertable, MapMethods, MapQueryMethods, MethodsBase, ORMTableInput, OrchidORM, OrchidORMBundle, OrchidORMDbTables,
|
|
914
|
+
export { BaseMaterializedViewInstance, BaseTableClass, BaseTableInstance, BaseViewInstance, DefaultSelect, FromQuery, Insertable, MapMethods, MapQueryMethods, MethodsBase, ORMTableInput, OrchidORM, OrchidORMBundle, OrchidORMDbTables, OrchidORMTables, OrchidOrmParam, PickORMTableComputed, PickORMTableInputColumns, PickORMTableInputColumnsAndComputed, Queryable, Repo, Selectable, SetColumnsResult, Table, TableClass, TableClasses, TableInfo, TableQueryBuilder, Updatable, bundleOrchidORM, bundleOrchidORMTables, createBaseTable, createRepo, defineRls, makeOrchidOrmDbWithAdapter, orchidORMWithAdapter, setGrants };
|
package/dist/index.js
CHANGED
|
@@ -67,6 +67,8 @@ function createBaseTable({ schemaConfig = pqb_internal.defaultSchemaConfig, colu
|
|
|
67
67
|
let instance = instances.get(this);
|
|
68
68
|
if (!instance) {
|
|
69
69
|
instance = new this();
|
|
70
|
+
const name = instance.table || instance.name;
|
|
71
|
+
if (instance.nameInDb === void 0 && name) instance.nameInDb = instance.snakeCase ? (0, pqb_internal.toSnakeCase)(name) : name;
|
|
70
72
|
instances.set(this, instance);
|
|
71
73
|
}
|
|
72
74
|
return instance;
|
|
@@ -214,7 +216,7 @@ function joinHasRelation(baseQuery, joiningQuery, primaryKeys, foreignKeys, len)
|
|
|
214
216
|
return q;
|
|
215
217
|
}
|
|
216
218
|
const addAutoForeignKey = (tableConfig, from, to, primaryKeys, foreignKeys, options, originalForeignKeys) => {
|
|
217
|
-
const toTable = to.table;
|
|
219
|
+
const toTable = to.q.nameInDb || to.table;
|
|
218
220
|
let fkeyOptions = options.foreignKey !== void 0 ? options.foreignKey : tableConfig.autoForeignKeys;
|
|
219
221
|
if (!fkeyOptions) return;
|
|
220
222
|
if (fkeyOptions === true) fkeyOptions = tableConfig.autoForeignKeys || pqb_internal.emptyObject;
|
|
@@ -228,7 +230,10 @@ const addAutoForeignKey = (tableConfig, from, to, primaryKeys, foreignKeys, opti
|
|
|
228
230
|
if (typeof fkey.fnOrTable === "string") {
|
|
229
231
|
fkeyTable = fkey.fnOrTable;
|
|
230
232
|
fkeyColumn = getColumnKeyFromDbName(to, fkeyColumn);
|
|
231
|
-
} else
|
|
233
|
+
} else {
|
|
234
|
+
const instance = fkey.fnOrTable().instance();
|
|
235
|
+
fkeyTable = instance.nameInDb || instance.table;
|
|
236
|
+
}
|
|
232
237
|
if (toTable === fkeyTable && pkey === fkeyColumn) return;
|
|
233
238
|
}
|
|
234
239
|
}
|
|
@@ -239,7 +244,13 @@ const addAutoForeignKey = (tableConfig, from, to, primaryKeys, foreignKeys, opti
|
|
|
239
244
|
const sortedFkeys = [...foreignKeys].sort();
|
|
240
245
|
for (const { references: refs } of constraints) {
|
|
241
246
|
if (!refs) continue;
|
|
242
|
-
|
|
247
|
+
let sameForeignTable = false;
|
|
248
|
+
if (typeof refs.fnOrTable === "string") sameForeignTable = refs.fnOrTable === toTable && refs.foreignColumns.every((column, i) => getColumnKeyFromDbName(to, column) === sortedPkeys[i]);
|
|
249
|
+
else {
|
|
250
|
+
const instance = refs.fnOrTable().instance();
|
|
251
|
+
sameForeignTable = (instance.nameInDb || instance.table) === toTable && refs.foreignColumns.every((column, i) => column === sortedPkeys[i]);
|
|
252
|
+
}
|
|
253
|
+
if (refs.columns.length === sortedFkeys.length && refs.columns.every((column, i) => column === sortedFkeys[i]) && refs.foreignColumns.length === sortedPkeys.length && sameForeignTable) return;
|
|
243
254
|
}
|
|
244
255
|
}
|
|
245
256
|
(from.internal.tableData.constraints ??= []).push({
|
|
@@ -1479,6 +1490,7 @@ const assignTablesToOrm = (isTable, tables, result, adapter, qb, asyncStorage, c
|
|
|
1479
1490
|
scopes: table.scopes,
|
|
1480
1491
|
softDelete: table.softDelete,
|
|
1481
1492
|
snakeCase: table.snakeCase,
|
|
1493
|
+
nameInDb: table.nameInDb,
|
|
1482
1494
|
comment: table.comment,
|
|
1483
1495
|
readOnly: isTable ? table.readOnly ? true : void 0 : table.materialized || table.readOnly !== false ? true : void 0,
|
|
1484
1496
|
materialized: !isTable && table.materialized ? true : void 0,
|
|
@@ -1608,12 +1620,12 @@ const privateOrchidORMWithAdapter = ({ log, logger, autoPreparedStatements, noPr
|
|
|
1608
1620
|
viewInstances = assignTablesToOrm(false, views, result.$views, adapter, qb, asyncStorage, commonOptions, schema);
|
|
1609
1621
|
const tableDbNames = Object.values(tableInstances).map((table) => {
|
|
1610
1622
|
const s = typeof table.schema === "function" ? table.schema() : table.schema;
|
|
1611
|
-
return `${s ? s + "." : ""}${table.
|
|
1623
|
+
return `${s ? s + "." : ""}${table.nameInDb}`;
|
|
1612
1624
|
});
|
|
1613
1625
|
for (const key in views) {
|
|
1614
1626
|
const view = viewInstances[key];
|
|
1615
1627
|
const s = typeof view.schema === "function" ? view.schema() : view.schema;
|
|
1616
|
-
const name = `${s ? s + "." : ""}${view.
|
|
1628
|
+
const name = `${s ? s + "." : ""}${view.nameInDb}`;
|
|
1617
1629
|
if (tableDbNames.includes(name)) throw new Error(`Cannot configure both a table and a view for database relation ${name}`);
|
|
1618
1630
|
}
|
|
1619
1631
|
}
|