Skip to content

Commit 3138671

Browse files
committed
fix(type): make sure forwarded type arguments reset Ω at the origin
closes #619
1 parent f2f6ed0 commit 3138671

File tree

4 files changed

+49
-23
lines changed

4 files changed

+49
-23
lines changed

packages/core/src/core.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,7 @@ export function zip<T extends (readonly unknown[])[]>(
851851
*/
852852
export function forwardTypeArguments(x: any, y: any): void {
853853
y.Ω = x.Ω;
854+
x.Ω = undefined;
854855
}
855856

856857
export function formatError(error: any, withStack: boolean = false): string {

packages/sql/src/sql-adapter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,7 +604,7 @@ export class SqlRawFactory implements RawFactory<[SqlQuery]> {
604604
) {
605605
}
606606

607-
create<T>(sql: SqlQuery, type?: ReceiveType<T>): RawQuery<T> {
607+
create<T = unknown>(sql: SqlQuery, type?: ReceiveType<T>): RawQuery<T> {
608608
type = type ? resolveReceiveType(type) : { kind: ReflectionKind.any };
609609
return new RawQuery(this.session, this.connectionPool, this.platform, sql, type);
610610
}

packages/sqlite/tests/sqlite.spec.ts

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,7 @@ import { databaseFactory } from './factory.js';
44
import { User, UserCredentials } from '@deepkit/orm-integration';
55
import { SQLiteDatabaseAdapter, SQLiteDatabaseTransaction } from '../src/sqlite-adapter.js';
66
import { sleep } from '@deepkit/core';
7-
import {
8-
AutoIncrement,
9-
BackReference,
10-
cast,
11-
Entity,
12-
entity,
13-
getPrimaryKeyExtractor,
14-
getPrimaryKeyHashGenerator,
15-
isReferenceInstance,
16-
PrimaryKey,
17-
Reference,
18-
ReflectionClass,
19-
serialize,
20-
typeOf,
21-
Unique,
22-
UUID,
23-
uuid,
24-
} from '@deepkit/type';
7+
import { AutoIncrement, BackReference, cast, Entity, entity, getPrimaryKeyExtractor, getPrimaryKeyHashGenerator, isReferenceInstance, PrimaryKey, Reference, ReflectionClass, serialize, typeOf, Unique, UUID, uuid } from '@deepkit/type';
258
import { DatabaseEntityRegistry, UniqueConstraintFailure } from '@deepkit/orm';
269
import { sql } from '@deepkit/sql';
2710

@@ -770,7 +753,7 @@ test('deep join population', async () => {
770753

771754
{
772755
const basket = await database.query(Basket)
773-
.joinWith('items', v=> v.joinWith('product'))
756+
.joinWith('items', v => v.joinWith('product'))
774757
.findOne();
775758
expect(basket).toBeInstanceOf(Basket);
776759
expect(basket.items[0]).toBeInstanceOf(BasketItem);
@@ -943,7 +926,9 @@ test('uuid 3', async () => {
943926
test('unique constraint 1', async () => {
944927
class Model {
945928
id: number & PrimaryKey & AutoIncrement = 0;
946-
constructor(public username: string & Unique = '') {}
929+
930+
constructor(public username: string & Unique = '') {
931+
}
947932
}
948933

949934
const database = await databaseFactory([Model]);
@@ -965,15 +950,27 @@ test('unique constraint 1', async () => {
965950
}
966951

967952
{
968-
const m = await database.query(Model).filter({username: 'paul'}).findOne();
953+
const m = await database.query(Model).filter({ username: 'paul' }).findOne();
969954
m.username = 'peter';
970955
await expect(database.persist(m)).rejects.toThrow('constraint failed');
971956
await expect(database.persist(m)).rejects.toBeInstanceOf(UniqueConstraintFailure);
972957
}
973958

974959
{
975-
const p = database.query(Model).filter({username: 'paul'}).patchOne({username: 'peter'});
960+
const p = database.query(Model).filter({ username: 'paul' }).patchOne({ username: 'peter' });
976961
await expect(p).rejects.toThrow('constraint failed');
977962
await expect(p).rejects.toBeInstanceOf(UniqueConstraintFailure);
978963
}
979964
});
965+
966+
test('forward raw types', async () => {
967+
const database = await databaseFactory([]);
968+
969+
const q1 = await database.raw<{ count1: number }>(sql`SELECT 42 AS count1`);
970+
const r1 = await q1.findOne();
971+
972+
const q2 = await database.raw(sql`SELECT 42 AS count2`);
973+
const r2: any = await q2.findOne();
974+
975+
expect(r1.count1).toEqual(r2.count2);
976+
});
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { expect, test } from '@jest/globals';
2+
import { ReceiveType, resolveReceiveType } from '../../src/reflection/reflection';
3+
import { Type } from '../../src/reflection/type';
4+
import { forwardTypeArguments } from '@deepkit/core';
5+
6+
test('function default', () => {
7+
class Clazz {
8+
create<T>(sql: string, type?: ReceiveType<T>): Type {
9+
return resolveReceiveType(type);
10+
}
11+
}
12+
13+
class Fascade {
14+
create: Clazz['create'];
15+
16+
constructor() {
17+
this.create = (...args: any) => {
18+
const clazz = new Clazz;
19+
forwardTypeArguments(this.create, clazz.create);
20+
return clazz.create.apply(clazz, args);
21+
};
22+
}
23+
}
24+
25+
const clazz = new Fascade();
26+
const t1 = clazz.create<{count1: string}>('');
27+
expect(() => clazz.create('')).toThrow('No type information received');
28+
});

0 commit comments

Comments
 (0)