-
Notifications
You must be signed in to change notification settings - Fork 53
Expand file tree
/
Copy pathPrinter.ts
More file actions
56 lines (50 loc) · 2.27 KB
/
Printer.ts
File metadata and controls
56 lines (50 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import { AssignmentExpression, BinaryExpression, BooleanLiteral, FieldSpecifier, Identifier, InnerJoinSpecifier, LogicalExpression, MemberExpression, NullLiteral, NumericLiteral, SelectStatement, StringLiteral, TableSpecifier } from "./AST";
import { JoinStrings, StringContains } from "./Utils";
export type Print<T> =
T extends Identifier<infer N> ? N :
T extends MemberExpression<infer O, infer P> ? `${O}.${P}` :
T extends NumericLiteral<infer V> ? `${V}` :
T extends StringLiteral<infer V> ? QuoteString<V> :
T extends BooleanLiteral<true> ? 'true' :
T extends BooleanLiteral<false> ? 'false' :
T extends NullLiteral ? 'null' :
// @ts-ignore due to excessive depth
T extends BinaryExpression<infer L, infer O, infer R> ? `${Print<L>} ${O} ${Print<R>}` :
T extends LogicalExpression<infer L, infer O, infer R> ? `${Print<L>} ${O} ${Print<R>}` :
T extends FieldSpecifier<infer S, Identifier<infer A>> ?
S extends Identifier<A>
? `${A}`
: `${Print<S>} AS ${A}` :
T extends TableSpecifier<Identifier<infer S>, Identifier<infer A>> ?
S extends A ? `${S}` : `${S} AS ${A}` :
T extends InnerJoinSpecifier<TableSpecifier<infer S, infer A>, infer Where> ?
JoinStrings<['INNER JOIN', Print<TableSpecifier<S, A>>, 'ON', Print<Where>], ' '> :
T extends SelectStatement<
infer Fields & any[],
TableSpecifier<infer TableName, infer TableAlias>,
infer Joins & any[],
infer Where,
infer Offset,
infer Limit
> ?
JoinStrings<
[
'SELECT',
Fields extends readonly any[] ? JoinStrings<PrintArray<Fields>, ', '> : '',
'FROM',
Print<TableSpecifier<TableName, TableAlias>>,
JoinStrings<PrintArray<Joins>, ' '>,
Where extends BooleanLiteral<true>
? ''
: `WHERE ${Print<Where>}`,
Limit extends -1 ? '' : `LIMIT ${Limit}`,
Offset extends 0 ? '' : `OFFSET ${Offset}`
],
' '
> :
T extends AssignmentExpression<Identifier<infer Key>, infer Value> ?
JoinStrings<[Key, '=', Print<Value>], ' '> :
`CANNOT PRINT THIS AST NODE`;
type PrintArray<T> = T extends any[] ? {[K in keyof T]: Print<T[K]>} : never;
type QuoteString<T extends string> =
StringContains<T, "'"> extends true ? `"${T}"` : `'${T}'`;