Skip to content
This repository was archived by the owner on May 18, 2024. It is now read-only.

Commit a07f53e

Browse files
author
Jeongho Nam
committed
Close #66
1 parent ab97a07 commit a07f53e

File tree

6 files changed

+38
-21
lines changed

6 files changed

+38
-21
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "safe-typeorm",
3-
"version": "1.0.11",
3+
"version": "1.0.12",
44
"description": "Safe Relationship Decorators for the TypeORM",
55
"main": "lib/index.js",
66
"typings": "lib/index.d.ts",

src/Model.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { initialize } from "./functional/initialize";
2222
import { insert } from "./functional/insert";
2323
import { toPrimitive } from "./functional/toPrimitive";
2424
import { update } from "./functional/update";
25+
import { WhereColumnType } from "./typings/WhereColumnType";
2526

2627
/**
2728
* The basic model class.
@@ -233,7 +234,7 @@ export abstract class Model extends orm.BaseEntity
233234
Literal extends SpecialFields<T, Field>>
234235
(
235236
this: Model.Creator<T>,
236-
fieldLike: `${Literal}` | `${string}.${Literal}`,
237+
fieldLike: WhereColumnType<`${Literal}` | `${string}.${Literal}`>,
237238
param: Field.MemberType<T, Literal> | null
238239
): [string, Record<string, Field.ValueType<T[Literal]>>];
239240

@@ -267,7 +268,7 @@ export abstract class Model extends orm.BaseEntity
267268
OperatorType extends Operator>
268269
(
269270
this: Model.Creator<T>,
270-
fieldLike: `${Literal}` | `${string}.${Literal}`,
271+
fieldLike: WhereColumnType<`${Literal}` | `${string}.${Literal}`>,
271272
operator: OperatorType,
272273
param: OperatorType extends "="|"!="|"<>"
273274
? Field.MemberType<T, Literal> | null
@@ -301,7 +302,7 @@ export abstract class Model extends orm.BaseEntity
301302
Literal extends SpecialFields<T, Field>>
302303
(
303304
this: Model.Creator<T>,
304-
fieldLike: `${Literal}` | `${string}.${Literal}`,
305+
fieldLike: WhereColumnType<`${Literal}` | `${string}.${Literal}`>,
305306
operator: "IN" | "NOT IN",
306307
parameters: Array<Field.MemberType<T, Literal>>,
307308
): [string, Record<string, Array<Field.ValueType<T[Literal]>>>];
@@ -336,7 +337,7 @@ export abstract class Model extends orm.BaseEntity
336337
Literal extends SpecialFields<T, Field>>
337338
(
338339
this: Model.Creator<T>,
339-
fieldLike: `${Literal}` | `${string}.${Literal}`,
340+
fieldLike: WhereColumnType<`${Literal}` | `${string}.${Literal}`>,
340341
operator: "BETWEEN",
341342
minimum: Field.MemberType<T, Literal>,
342343
maximum: Field.MemberType<T, Literal>
@@ -347,7 +348,7 @@ export abstract class Model extends orm.BaseEntity
347348
Literal extends SpecialFields<T, Field>>
348349
(
349350
this: Model.Creator<T>,
350-
fieldLike: `${Literal}` | `${string}.${Literal}`,
351+
fieldLike: WhereColumnType<`${Literal}` | `${string}.${Literal}`>,
351352
...rest: any[]
352353
): [string, any]
353354
{

src/functional/getWhereArguments.ts

+22-12
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { SpecialFields } from "../typings/SpecialFields";
99
import { BelongsAccessorBase } from "../decorators/base/BelongsAccessorBase";
1010
import { findRepository } from "./findRepository";
1111
import { get_column_name_tuple } from "./internal/get_column_name_tuple";
12+
import { WhereColumnType } from "../typings/WhereColumnType";
1213

1314
/**
1415
* Get arguments for the where-equal query.
@@ -39,7 +40,7 @@ export function getWhereArguments<
3940
Literal extends SpecialFields<T, Field>>
4041
(
4142
creator: Creator<T>,
42-
fieldLike: `${Literal}` | `${string}.${Literal}`,
43+
fieldLike: WhereColumnType<`${Literal}` | `${string}.${Literal}`>,
4344
param: Field.MemberType<T, Literal> | null
4445
): [string, Record<string, Field.ValueType<T[Literal]>>];
4546

@@ -69,12 +70,12 @@ export function getWhereArguments<
6970
* never can be the runtime error
7071
*/
7172
export function getWhereArguments<
72-
T extends { [P in Literal]: Field; },
73-
Literal extends SpecialFields<T, Field>,
73+
T extends { [P in Literal]: Field; },
74+
Literal extends SpecialFields<T, Field>,
7475
OperatorType extends Operator>
7576
(
7677
creator: Creator<T>,
77-
fieldLike: `${Literal}` | `${string}.${Literal}`,
78+
fieldLike: WhereColumnType<`${Literal}` | `${string}.${Literal}`>,
7879
operator: OperatorType,
7980
param: OperatorType extends "="|"!="|"<>"
8081
? Field.MemberType<T, Literal> | null
@@ -111,7 +112,7 @@ export function getWhereArguments<
111112
Literal extends SpecialFields<T, Field>>
112113
(
113114
creator: Creator<T>,
114-
fieldLike: `${Literal}` | `${string}.${Literal}`,
115+
fieldLike: WhereColumnType<`${Literal}` | `${string}.${Literal}`>,
115116
operator: "IN" | "NOT IN",
116117
parameters: Array<Field.MemberType<T, Literal>>
117118
): [string, Record<string, [Field.ValueType<T[Literal]>, Field.ValueType<T[Literal]>]>];
@@ -147,7 +148,7 @@ export function getWhereArguments<
147148
Literal extends SpecialFields<T, Field>>
148149
(
149150
creator: Creator<T>,
150-
fieldLike: `${Literal}` | `${string}.${Literal}`,
151+
fieldLike: WhereColumnType<`${Literal}` | `${string}.${Literal}`>,
151152
operator: "BETWEEN",
152153
minimum: Field.MemberType<T, Literal>,
153154
maximum: Field.MemberType<T, Literal>
@@ -158,14 +159,23 @@ export function getWhereArguments<
158159
Literal extends SpecialFields<T, Field>>
159160
(
160161
creator: Creator<T>,
161-
fieldLike: `${Literal}` | `${string}.${Literal}`,
162+
fieldLike: WhereColumnType<`${Literal}` | `${string}.${Literal}`>,
162163
...rest: any[]
163164
): [string, any]
164165
{
165-
const tuple: [string, string] = get_column_name_tuple(creator, fieldLike);
166+
const tuple: [string, string] = get_column_name_tuple
167+
(
168+
creator,
169+
typeof fieldLike === "string"
170+
? fieldLike
171+
: fieldLike[0]
172+
);
166173
const column: string = tuple[0]
167174
? `${tuple[0]}.${tuple[1]}`
168175
: tuple[1];
176+
const left: string = typeof fieldLike === "string"
177+
? column
178+
: fieldLike[1](column);
169179

170180
// MOST OPERATORS
171181
if (rest.length <= 2)
@@ -190,9 +200,9 @@ export function getWhereArguments<
190200
if (param === null)
191201
{
192202
if (operator === "=")
193-
return [`${column} IS NULL`] as any;
203+
return [`${left} IS NULL`] as any;
194204
else if (operator === "!=" || operator === "<>")
195-
return [`${column} IS NOT NULL`] as any;
205+
return [`${left} IS NOT NULL`] as any;
196206
else
197207
throw new InvalidArgument(`Error on ${creator.name}.getColumn(): unable to bind null value for the ${operator} operator.`);
198208
}
@@ -202,7 +212,7 @@ export function getWhereArguments<
202212
const binding: string = (operator === "IN" || operator === "NOT IN")
203213
? `(:...${uuid})`
204214
: `:${uuid}`;
205-
return [`${column} ${operator} ${binding}`, { [uuid]: param }];
215+
return [`${left} ${operator} ${binding}`, { [uuid]: param }];
206216
}
207217

208218
// BETWEEN OPERATOR
@@ -211,7 +221,7 @@ export function getWhereArguments<
211221
const minimum: Field.ValueType<T[Literal]> = _Decompose_entity(rest[1]);
212222
const maximum: Field.ValueType<T[Literal]> = _Decompose_entity(rest[2]);
213223

214-
return [`${column} BETWEEN :${from} AND :${to}`,
224+
return [`${left} BETWEEN :${from} AND :${to}`,
215225
{
216226
[from]: minimum,
217227
[to]: maximum

src/typings/Field.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,20 @@ export type Field
99
| boolean
1010
| Date
1111
| Belongs.ManyToOne<any, PrimaryColumnType>
12+
| Belongs.External.ManyToOne<any, PrimaryColumnType>
1213
| Belongs.OneToOne<any, PrimaryColumnType>
14+
| Belongs.External.OneToOne<any, PrimaryColumnType>
1315
| null;
1416

1517
export namespace Field
1618
{
1719
export type ValueType<Type extends Field>
1820
= Type extends string ? Type
19-
: Type extends Belongs.ManyToOne<infer Target, infer KeyType, infer Options>
21+
: Type extends (Belongs.ManyToOne<infer Target, infer KeyType, infer Options> | Belongs.External.ManyToOne<infer Target, infer KeyType, infer Options>)
2022
? Options extends { nullable: true }
2123
? (ModelLike<Target, KeyType, true> | PrimaryColumnType.ValueType<KeyType> | null)
2224
: (ModelLike<Target, KeyType, false> | PrimaryColumnType.ValueType<KeyType>)
23-
: Type extends Belongs.OneToOne<infer Target, infer KeyType, infer Options>
25+
: Type extends (Belongs.OneToOne<infer Target, infer KeyType, infer Options> | Belongs.External.OneToOne<infer Target, infer KeyType, infer Options>)
2426
? Options extends { nullable: true }
2527
? (ModelLike<Target, KeyType, true> | PrimaryColumnType.ValueType<KeyType> | null)
2628
: (ModelLike<Target, KeyType, false> | PrimaryColumnType.ValueType<KeyType>)

src/typings/WhereColumnType.ts

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export type WhereColumnType<Literal extends string>
2+
= Literal
3+
| [Literal, (str: string) => string];

src/typings/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ export * from "./Primitive";
1010
export * from "./Relationship";
1111
export * from "./Same";
1212
export * from "./SpecialFields";
13-
export * from "./StringColumnType";
13+
export * from "./StringColumnType";
14+
export * from "./WhereColumnType";

0 commit comments

Comments
 (0)