@devbro/neko-sql 0.1.8 → 0.1.10

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.
@@ -0,0 +1,235 @@
1
+ declare class Expression {
2
+ private sql;
3
+ private bindings;
4
+ constructor(sql?: string, bindings?: never[]);
5
+ toCompiledSql(): CompiledSql;
6
+ }
7
+
8
+ declare class SchemaGrammar {
9
+ toSql(blueprint: Blueprint): string;
10
+ compileCreateTable(blueprint: Blueprint): CompiledSql;
11
+ compileAlterTable(blueprint: Blueprint): CompiledSql;
12
+ compileColumn(column: Column): string;
13
+ escape(value: Parameter): string;
14
+ compilePrimaryKeys(primaryKeys: string[]): string;
15
+ compileTables(schema?: string | string[] | undefined): CompiledSql;
16
+ compileTableExists(tableName: string, schema?: string): CompiledSql;
17
+ compileDropTable(tableName: string): CompiledSql;
18
+ compileDropTableIfExists(tableName: string): CompiledSql;
19
+ protected compileSchemaWhereClause(schema: string | string[] | undefined, column: string): string;
20
+ protected quoteString(value: string | string[]): string;
21
+ protected doubleQuoteString(value: string | string[]): string;
22
+ protected compileForeignKey(foreignKey: ForeignKeyConstraint): string;
23
+ }
24
+
25
+ declare class Schema {
26
+ private readonly connection;
27
+ private readonly grammar;
28
+ constructor(connection: Connection | null, grammar: SchemaGrammar);
29
+ createTable(tableName: string, structMethod: (blueprint: Blueprint) => void): Promise<void>;
30
+ alterTable(tableName: string, structMethod: (blueprint: Blueprint) => void): Promise<void>;
31
+ dropTable(tableName: string): Promise<void>;
32
+ dropTableIfExists(tableName: string): Promise<void>;
33
+ tables(): Promise<any>;
34
+ tableExists(table_name: string): Promise<boolean>;
35
+ }
36
+
37
+ declare abstract class QueryGrammar {
38
+ sqlParts: string[];
39
+ toSql(query: Query): CompiledSql;
40
+ compileCount(query: Query): CompiledSql;
41
+ compileSelect(selects: selectType[]): CompiledSql;
42
+ compileTable(tableName: string): CompiledSql;
43
+ compileJoin(joins: joinType[]): CompiledSql;
44
+ compileWhere(wheres: whereType[]): CompiledSql;
45
+ compileWhereNested(w: whereNested): CompiledSql;
46
+ compileWhereOperation(w: whereOp): CompiledSql;
47
+ compileWhereOperationColumn(w: whereOpColumn): CompiledSql;
48
+ compileOrderBy(orderBy: string[]): CompiledSql;
49
+ compileLimit(limit: number | null): CompiledSql;
50
+ compileOffset(offset: number | null): CompiledSql;
51
+ abstract getVariablePlaceholder(): string;
52
+ compileWhereNull(w: whereNull): CompiledSql;
53
+ compileInsert(query: Query, data: Record<string, Parameter>): CompiledSql;
54
+ abstract compileInsertGetId(query: Query, data: Record<string, Parameter>, options: {
55
+ primaryKey: string[];
56
+ }): CompiledSql;
57
+ compileUpdate(query: Query, data: Record<string, Parameter>): CompiledSql;
58
+ compileDelete(query: Query): CompiledSql;
59
+ compileUpsert(query: Query, data: Record<string, Parameter>, conflictFields: string[], updateFields: string[]): CompiledSql;
60
+ compileGroupBy(groupBy: string[]): CompiledSql;
61
+ compileHaving(having: havingType[]): CompiledSql;
62
+ compileHavingOperation(w: whereOp): CompiledSql;
63
+ compileHavingRaw(w: whereRaw): CompiledSql;
64
+ }
65
+
66
+ declare abstract class Connection {
67
+ abstract connect(): Promise<boolean>;
68
+ abstract runQuery(sql: CompiledSql): Promise<any>;
69
+ abstract runCursor(sql: CompiledSql): Promise<any>;
70
+ abstract disconnect(): Promise<boolean>;
71
+ abstract getQuery(): Query;
72
+ abstract getSchema(): Schema;
73
+ abstract beginTransaction(): Promise<void>;
74
+ abstract commit(): Promise<void>;
75
+ abstract rollback(): Promise<void>;
76
+ abstract getQueryGrammar(): QueryGrammar;
77
+ abstract getSchemaGrammar(): SchemaGrammar;
78
+ }
79
+
80
+ type QueryParts = {
81
+ select: selectType[];
82
+ table: string;
83
+ join: joinType[];
84
+ where: whereType[];
85
+ groupBy: string[];
86
+ having: havingType[];
87
+ orderBy: string[];
88
+ limit: number | null;
89
+ offset: number | null;
90
+ };
91
+ declare class Query {
92
+ readonly connection: Connection | null;
93
+ readonly grammar: QueryGrammar;
94
+ allowedOperations: string[];
95
+ parts: QueryParts;
96
+ constructor(connection: Connection | null, grammar: QueryGrammar);
97
+ table(tableName: string): this;
98
+ whereNested(func: (q: Query) => void, joinCondition?: JoinCondition, negateCondition?: boolean): this;
99
+ whereOp(column: string, operation: (typeof this.allowedOperations)[number], value: Parameter, joinCondition?: JoinCondition, negateCondition?: boolean): this;
100
+ whereColumn(column1: string, operation: (typeof this.allowedOperations)[number], column2: string, joinCondition?: JoinCondition, negateCondition?: boolean): this;
101
+ whereNull(column: string, joinCondition?: JoinCondition, negateCondition?: boolean): this;
102
+ clearWhere(): this;
103
+ select(selects: selectType[]): this;
104
+ groupBy(columns: string[]): this;
105
+ havingOp(column: string, operation: (typeof this.allowedOperations)[number], value: Parameter, joinCondition?: JoinCondition, negateCondition?: boolean): this;
106
+ havingRaw(sql: string, bindings: Parameter[], joinCondition?: JoinCondition, negateCondition?: boolean): this;
107
+ orderBy(column: string, direction?: 'asc' | 'desc'): this;
108
+ limit(limit: number): this;
109
+ offset(offset: number): this;
110
+ toSql(): CompiledSql;
111
+ get(): Promise<any>;
112
+ count(): Promise<number>;
113
+ getCursor(): Promise<any>;
114
+ getConnection(): Connection | null;
115
+ insert(data: Record<string, Parameter>): Promise<any>;
116
+ insertGetId(data: Record<string, Parameter>, options?: {
117
+ primaryKey: string[];
118
+ }): Promise<any>;
119
+ update(data: Record<string, Parameter>): Promise<any>;
120
+ upsert(data: Record<string, Parameter>, uniqueColumns: string[], updateColumns: string[]): Promise<any>;
121
+ delete(): Promise<any>;
122
+ innerJoin(table: string, conditions: whereType[] | {
123
+ column1: string;
124
+ column2: string;
125
+ }[]): this;
126
+ leftJoin(table: string, condtions: whereType[]): this;
127
+ rightJoin(table: string, condtions: whereType[]): this;
128
+ fullJoin(table: string, condtions: whereType[]): this;
129
+ }
130
+
131
+ type selectType = string;
132
+ type whereBasic = {
133
+ joinCondition: JoinCondition;
134
+ negateCondition: boolean;
135
+ };
136
+ type whereOp = {
137
+ type: 'operation';
138
+ column: string;
139
+ operation: string;
140
+ value: Parameter;
141
+ };
142
+ type whereOpColumn = {
143
+ type: 'operationColumn';
144
+ column1: string;
145
+ operation: string;
146
+ column2: string;
147
+ };
148
+ type whereNested = {
149
+ type: 'nested';
150
+ query: Query;
151
+ };
152
+ type whereRaw = {
153
+ type: 'raw';
154
+ sql: string;
155
+ bindings: Parameter[];
156
+ };
157
+ type whereNull = {
158
+ type: 'null';
159
+ column: string;
160
+ };
161
+ type whereType = whereBasic & (whereOp | whereOpColumn | whereNested | whereNull);
162
+ type Parameter = string | number | Date | boolean | null | Expression | undefined | number[];
163
+ type JoinCondition = 'and' | 'or';
164
+ type CompiledSql = {
165
+ sql: string;
166
+ bindings: Parameter[];
167
+ };
168
+ type havingType = whereBasic & (whereOp | whereRaw);
169
+ type joinType = {
170
+ type: 'inner' | 'left' | 'right' | 'full';
171
+ table: string;
172
+ conditions: whereType[];
173
+ };
174
+
175
+ type ColumnPropertiesType = {
176
+ type: 'string' | 'integer' | 'float' | 'double' | 'boolean' | 'char' | 'text' | 'date' | 'timestamp' | 'timestampz' | 'serial' | 'json' | 'jsonb';
177
+ length: number;
178
+ nullable: boolean;
179
+ unique: boolean;
180
+ default: Parameter;
181
+ };
182
+ declare class Column {
183
+ columnName: string;
184
+ properties: ColumnPropertiesType;
185
+ constructor(columnName: string, type: ColumnPropertiesType['type']);
186
+ length(length: number): this;
187
+ nullable(nullable?: boolean): this;
188
+ unique(unique?: boolean): this;
189
+ default(value: ColumnPropertiesType['default']): this;
190
+ }
191
+ declare class ForeignKeyConstraint {
192
+ column: string;
193
+ reference_table: {
194
+ table: string;
195
+ column: string;
196
+ };
197
+ onUpdateAction: 'cascade' | 'set null' | 'restrict' | 'no action';
198
+ onDeleteAction: 'cascade' | 'set null' | 'restrict' | 'no action';
199
+ constructor(column: string);
200
+ on(table: string): this;
201
+ references(column: string): this;
202
+ onDelete(action: typeof this.onDeleteAction): this;
203
+ onUpdate(action: typeof this.onUpdateAction): this;
204
+ }
205
+ declare class Blueprint {
206
+ tableName: string;
207
+ columns: Column[];
208
+ drop_coumns: string[];
209
+ foreignKeys: ForeignKeyConstraint[];
210
+ existingTable: boolean;
211
+ primaryKeys: string[];
212
+ constructor();
213
+ setTableName(tableName: string, existingTable?: boolean): void;
214
+ boolean(columnName: string): Column;
215
+ char(columnName: string): Column;
216
+ string(columnName: string, length?: number): Column;
217
+ text(columnName: string): Column;
218
+ json(columnName: string): Column;
219
+ jsonb(columnName: string): Column;
220
+ integer(columnName: string): Column;
221
+ float(columnName: string): Column;
222
+ double(columnName: string): Column;
223
+ id(): Column;
224
+ timestamps(): void;
225
+ date(columnName: string): Column;
226
+ timestamp(columnName: string): Column;
227
+ timestampTz(columnName: string): Column;
228
+ datetime(columnName: string): Column;
229
+ datetimeTz(columnName: string): Column;
230
+ primary(keys: string[]): void;
231
+ foreign(columnName: string): ForeignKeyConstraint;
232
+ dropColumn(columnName: string): void;
233
+ }
234
+
235
+ export { Blueprint as B, type ColumnPropertiesType as C, Expression as E, ForeignKeyConstraint as F, type JoinCondition as J, type Parameter as P, type QueryParts as Q, Schema as S, Column as a, Connection as b, Query as c, QueryGrammar as d, SchemaGrammar as e, type whereOp as f, type whereOpColumn as g, type whereNested as h, type whereRaw as i, type whereNull as j, type whereType as k, type CompiledSql as l, type havingType as m, type joinType as n, type selectType as s, type whereBasic as w };
@@ -1,61 +1 @@
1
- import { P as Parameter } from './types-BEFQrxTG.mjs';
2
-
3
- type ColumnPropertiesType = {
4
- type: 'string' | 'integer' | 'float' | 'double' | 'boolean' | 'char' | 'text' | 'date' | 'timestamp' | 'timestampz' | 'serial';
5
- length: number;
6
- nullable: boolean;
7
- unique: boolean;
8
- default: Parameter;
9
- };
10
- declare class Column {
11
- columnName: string;
12
- properties: ColumnPropertiesType;
13
- constructor(columnName: string, type: ColumnPropertiesType['type']);
14
- length(length: number): this;
15
- nullable(nullable?: boolean): this;
16
- unique(unique?: boolean): this;
17
- default(value: ColumnPropertiesType['default']): this;
18
- }
19
- declare class ForeignKeyConstraint {
20
- column: string;
21
- reference_table: {
22
- table: string;
23
- column: string;
24
- };
25
- onUpdateAction: 'cascade' | 'set null' | 'restrict' | 'no action';
26
- onDeleteAction: 'cascade' | 'set null' | 'restrict' | 'no action';
27
- constructor(column: string);
28
- on(table: string): this;
29
- references(column: string): this;
30
- onDelete(action: typeof this.onDeleteAction): this;
31
- onUpdate(action: typeof this.onUpdateAction): this;
32
- }
33
- declare class Blueprint {
34
- tableName: string;
35
- columns: Column[];
36
- drop_coumns: string[];
37
- foreignKeys: ForeignKeyConstraint[];
38
- existingTable: boolean;
39
- primaryKeys: string[];
40
- constructor();
41
- setTableName(tableName: string, existingTable?: boolean): void;
42
- Boolean(columnName: string): Column;
43
- char(columnName: string): Column;
44
- string(columnName: string, length?: number): Column;
45
- text(columnName: string): Column;
46
- integer(columnName: string): Column;
47
- float(columnName: string): Column;
48
- double(columnName: string): Column;
49
- id(): Column;
50
- timestamps(): void;
51
- date(columnName: string): Column;
52
- timestamp(columnName: string): Column;
53
- timestampTz(columnName: string): Column;
54
- datetime(columnName: string): Column;
55
- datetimeTz(columnName: string): Column;
56
- primary(keys: string[]): void;
57
- foreign(columnName: string): ForeignKeyConstraint;
58
- dropColumn(columnName: string): void;
59
- }
60
-
61
- export { Blueprint, Column, type ColumnPropertiesType, ForeignKeyConstraint };
1
+ export { B as Blueprint, a as Column, C as ColumnPropertiesType, F as ForeignKeyConstraint } from './Blueprint-BDzA_swP.mjs';
@@ -79,7 +79,7 @@ class Blueprint {
79
79
  this.tableName = tableName;
80
80
  this.existingTable = existingTable;
81
81
  }
82
- Boolean(columnName) {
82
+ boolean(columnName) {
83
83
  const rc = new Column(columnName, "boolean");
84
84
  this.columns.push(rc);
85
85
  return rc;
@@ -100,6 +100,16 @@ class Blueprint {
100
100
  this.columns.push(rc);
101
101
  return rc;
102
102
  }
103
+ json(columnName) {
104
+ const rc = new Column(columnName, "json");
105
+ this.columns.push(rc);
106
+ return rc;
107
+ }
108
+ jsonb(columnName) {
109
+ const rc = new Column(columnName, "jsonb");
110
+ this.columns.push(rc);
111
+ return rc;
112
+ }
103
113
  integer(columnName) {
104
114
  const rc = new Column(columnName, "integer");
105
115
  this.columns.push(rc);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Blueprint.mts"],"sourcesContent":["import { Expression } from './Expression.mjs';\nimport { Parameter } from './types.mjs';\n\nexport type ColumnPropertiesType = {\n type:\n | 'string'\n | 'integer'\n | 'float'\n | 'double'\n | 'boolean'\n | 'char'\n | 'text'\n | 'date'\n | 'timestamp'\n | 'timestampz'\n | 'serial';\n length: number;\n nullable: boolean;\n unique: boolean;\n default: Parameter;\n};\nexport class Column {\n columnName: string = '';\n properties: ColumnPropertiesType = {\n type: 'string',\n length: 255,\n nullable: false,\n unique: false,\n default: null,\n };\n\n constructor(columnName: string, type: ColumnPropertiesType['type']) {\n this.columnName = columnName;\n this.properties.type = type;\n }\n\n length(length: number) {\n this.properties.length = length;\n return this;\n }\n\n nullable(nullable: boolean = true) {\n this.properties.nullable = nullable;\n return this;\n }\n\n unique(unique: boolean = true) {\n this.properties.unique = unique;\n return this;\n }\n\n default(value: ColumnPropertiesType['default']) {\n this.properties.default = value;\n return this;\n }\n}\n\n// references('id').on('roles').onDelete('cascade').onUpdate('cascade');\nexport class ForeignKeyConstraint {\n column: string;\n reference_table: { table: string; column: string };\n onUpdateAction: 'cascade' | 'set null' | 'restrict' | 'no action' = 'restrict';\n onDeleteAction: 'cascade' | 'set null' | 'restrict' | 'no action' = 'restrict';\n\n constructor(column: string) {\n this.column = column;\n this.reference_table = { table: '', column: '' };\n }\n\n on(table: string) {\n this.reference_table.table = table;\n return this;\n }\n\n references(column: string) {\n this.reference_table.column = column;\n return this;\n }\n\n onDelete(action: typeof this.onDeleteAction) {\n this.onDeleteAction = action;\n return this;\n }\n\n onUpdate(action: typeof this.onUpdateAction) {\n this.onUpdateAction = action;\n return this;\n }\n}\n\nexport class Blueprint {\n tableName: string = '';\n columns: Column[] = [];\n drop_coumns: string[] = [];\n foreignKeys: ForeignKeyConstraint[] = [];\n existingTable: boolean = false;\n primaryKeys: string[] = [];\n constructor() {}\n setTableName(tableName: string, existingTable: boolean = false) {\n this.tableName = tableName;\n this.existingTable = existingTable;\n }\n\n Boolean(columnName: string) {\n const rc = new Column(columnName, 'boolean');\n this.columns.push(rc);\n return rc;\n }\n\n char(columnName: string) {\n const rc = new Column(columnName, 'char');\n this.columns.push(rc);\n return rc;\n }\n\n string(columnName: string, length: number = 255) {\n const rc = new Column(columnName, 'string');\n rc.length(length);\n this.columns.push(rc);\n return rc;\n }\n\n text(columnName: string) {\n const rc = new Column(columnName, 'text');\n this.columns.push(rc);\n return rc;\n }\n\n integer(columnName: string) {\n const rc = new Column(columnName, 'integer');\n this.columns.push(rc);\n return rc;\n }\n\n float(columnName: string) {\n const rc = new Column(columnName, 'float');\n this.columns.push(rc);\n return rc;\n }\n\n double(columnName: string) {\n const rc = new Column(columnName, 'double');\n this.columns.push(rc);\n return rc;\n }\n\n id() {\n const rc = new Column('id', 'serial');\n this.columns.push(rc);\n this.primaryKeys.push('id');\n return rc;\n }\n\n timestamps() {\n this.columns.push(\n new Column('created_at', 'timestampz').default(new Expression('CURRENT_TIMESTAMP'))\n );\n this.columns.push(\n new Column('updated_at', 'timestampz').default(new Expression('CURRENT_TIMESTAMP'))\n );\n }\n\n date(columnName: string) {\n const rc = new Column(columnName, 'date');\n this.columns.push(rc);\n return rc;\n }\n\n timestamp(columnName: string) {\n const rc = new Column(columnName, 'timestamp');\n this.columns.push(rc);\n return rc;\n }\n\n timestampTz(columnName: string) {\n const rc = new Column(columnName, 'timestampz');\n this.columns.push(rc);\n return rc;\n }\n\n datetime(columnName: string) {\n return this.timestamp(columnName);\n }\n\n datetimeTz(columnName: string) {\n return this.timestampTz(columnName);\n }\n\n primary(keys: string[]) {\n this.primaryKeys = keys;\n }\n\n foreign(columnName: string) {\n const rc = new ForeignKeyConstraint(columnName);\n this.foreignKeys.push(rc);\n return rc;\n }\n\n dropColumn(columnName: string) {\n this.drop_coumns.push(columnName);\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/Blueprint.mts"],"sourcesContent":["import { Expression } from './Expression.mjs';\nimport { Parameter } from './types.mjs';\n\nexport type ColumnPropertiesType = {\n type:\n | 'string'\n | 'integer'\n | 'float'\n | 'double'\n | 'boolean'\n | 'char'\n | 'text'\n | 'date'\n | 'timestamp'\n | 'timestampz'\n | 'serial'\n | 'json'\n | 'jsonb';\n length: number;\n nullable: boolean;\n unique: boolean;\n default: Parameter;\n};\nexport class Column {\n columnName: string = '';\n properties: ColumnPropertiesType = {\n type: 'string',\n length: 255,\n nullable: false,\n unique: false,\n default: null,\n };\n\n constructor(columnName: string, type: ColumnPropertiesType['type']) {\n this.columnName = columnName;\n this.properties.type = type;\n }\n\n length(length: number) {\n this.properties.length = length;\n return this;\n }\n\n nullable(nullable: boolean = true) {\n this.properties.nullable = nullable;\n return this;\n }\n\n unique(unique: boolean = true) {\n this.properties.unique = unique;\n return this;\n }\n\n default(value: ColumnPropertiesType['default']) {\n this.properties.default = value;\n return this;\n }\n}\n\n// references('id').on('roles').onDelete('cascade').onUpdate('cascade');\nexport class ForeignKeyConstraint {\n column: string;\n reference_table: { table: string; column: string };\n onUpdateAction: 'cascade' | 'set null' | 'restrict' | 'no action' = 'restrict';\n onDeleteAction: 'cascade' | 'set null' | 'restrict' | 'no action' = 'restrict';\n\n constructor(column: string) {\n this.column = column;\n this.reference_table = { table: '', column: '' };\n }\n\n on(table: string) {\n this.reference_table.table = table;\n return this;\n }\n\n references(column: string) {\n this.reference_table.column = column;\n return this;\n }\n\n onDelete(action: typeof this.onDeleteAction) {\n this.onDeleteAction = action;\n return this;\n }\n\n onUpdate(action: typeof this.onUpdateAction) {\n this.onUpdateAction = action;\n return this;\n }\n}\n\nexport class Blueprint {\n tableName: string = '';\n columns: Column[] = [];\n drop_coumns: string[] = [];\n foreignKeys: ForeignKeyConstraint[] = [];\n existingTable: boolean = false;\n primaryKeys: string[] = [];\n constructor() {}\n setTableName(tableName: string, existingTable: boolean = false) {\n this.tableName = tableName;\n this.existingTable = existingTable;\n }\n\n boolean(columnName: string) {\n const rc = new Column(columnName, 'boolean');\n this.columns.push(rc);\n return rc;\n }\n\n char(columnName: string) {\n const rc = new Column(columnName, 'char');\n this.columns.push(rc);\n return rc;\n }\n\n string(columnName: string, length: number = 255) {\n const rc = new Column(columnName, 'string');\n rc.length(length);\n this.columns.push(rc);\n return rc;\n }\n\n text(columnName: string) {\n const rc = new Column(columnName, 'text');\n this.columns.push(rc);\n return rc;\n }\n\n json(columnName: string) {\n const rc = new Column(columnName, 'json');\n this.columns.push(rc);\n return rc;\n }\n\n jsonb(columnName: string) {\n const rc = new Column(columnName, 'jsonb');\n this.columns.push(rc);\n return rc;\n }\n\n integer(columnName: string) {\n const rc = new Column(columnName, 'integer');\n this.columns.push(rc);\n return rc;\n }\n\n float(columnName: string) {\n const rc = new Column(columnName, 'float');\n this.columns.push(rc);\n return rc;\n }\n\n double(columnName: string) {\n const rc = new Column(columnName, 'double');\n this.columns.push(rc);\n return rc;\n }\n\n id() {\n const rc = new Column('id', 'serial');\n this.columns.push(rc);\n this.primaryKeys.push('id');\n return rc;\n }\n\n timestamps() {\n this.columns.push(\n new Column('created_at', 'timestampz').default(new Expression('CURRENT_TIMESTAMP'))\n );\n this.columns.push(\n new Column('updated_at', 'timestampz').default(new Expression('CURRENT_TIMESTAMP'))\n );\n }\n\n date(columnName: string) {\n const rc = new Column(columnName, 'date');\n this.columns.push(rc);\n return rc;\n }\n\n timestamp(columnName: string) {\n const rc = new Column(columnName, 'timestamp');\n this.columns.push(rc);\n return rc;\n }\n\n timestampTz(columnName: string) {\n const rc = new Column(columnName, 'timestampz');\n this.columns.push(rc);\n return rc;\n }\n\n datetime(columnName: string) {\n return this.timestamp(columnName);\n }\n\n datetimeTz(columnName: string) {\n return this.timestampTz(columnName);\n }\n\n primary(keys: string[]) {\n this.primaryKeys = keys;\n }\n\n foreign(columnName: string) {\n const rc = new ForeignKeyConstraint(columnName);\n this.foreignKeys.push(rc);\n return rc;\n }\n\n dropColumn(columnName: string) {\n this.drop_coumns.push(columnName);\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1 @@
1
- export { C as Connection } from './Connection-Ba1yrJgb.mjs';
2
- import './types-BEFQrxTG.mjs';
3
- import './SchemaGrammar.mjs';
4
- import './Blueprint.mjs';
1
+ export { b as Connection } from './Blueprint-BDzA_swP.mjs';
@@ -1 +1 @@
1
- export { E as Expression } from './types-BEFQrxTG.mjs';
1
+ export { E as Expression } from './Blueprint-BDzA_swP.mjs';
@@ -1,7 +1,4 @@
1
- import { S as Schema } from './Connection-Ba1yrJgb.mjs';
2
- import './Blueprint.mjs';
3
- import './types-BEFQrxTG.mjs';
4
- import './SchemaGrammar.mjs';
1
+ import { S as Schema } from './Blueprint-BDzA_swP.mjs';
5
2
 
6
3
  declare abstract class Migration {
7
4
  abstract up(schema: Schema): Promise<void>;
package/dist/Query.d.mts CHANGED
@@ -1,4 +1 @@
1
- export { a as Query, Q as QueryParts } from './Connection-Ba1yrJgb.mjs';
2
- import './types-BEFQrxTG.mjs';
3
- import './Blueprint.mjs';
4
- import './SchemaGrammar.mjs';
1
+ export { c as Query, Q as QueryParts } from './Blueprint-BDzA_swP.mjs';
package/dist/Query.mjs CHANGED
@@ -24,6 +24,17 @@ class Query {
24
24
  this.parts.table = tableName;
25
25
  return this;
26
26
  }
27
+ whereNested(func, joinCondition = "and", negateCondition = false) {
28
+ const subQuery = new Query(this.connection, this.grammar);
29
+ func(subQuery);
30
+ this.parts.where.push({
31
+ type: "nested",
32
+ query: subQuery,
33
+ joinCondition,
34
+ negateCondition
35
+ });
36
+ return this;
37
+ }
27
38
  whereOp(column, operation, value, joinCondition = "and", negateCondition = false) {
28
39
  this.parts.where.push({
29
40
  type: "operation",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Query.mts"],"sourcesContent":["import { Connection } from './Connection.mjs';\nimport { QueryGrammar } from './QueryGrammar.mjs';\nimport {\n CompiledSql,\n JoinCondition,\n Parameter,\n selectType,\n whereType,\n havingType,\n joinType,\n} from './types.mjs';\n\nexport type QueryParts = {\n select: selectType[];\n table: string;\n join: joinType[];\n where: whereType[];\n groupBy: string[];\n having: havingType[];\n orderBy: string[];\n limit: number | null;\n offset: number | null;\n};\n\nexport class Query {\n allowedOperations: string[] = ['=', '>', '<', '!=', 'like', 'ilike'];\n parts: QueryParts = {\n select: ['*'],\n table: '',\n join: [],\n where: [],\n groupBy: [],\n having: [],\n orderBy: [],\n limit: null,\n offset: null,\n };\n\n constructor(\n private readonly connection: Connection | null,\n private readonly grammar: QueryGrammar\n ) {}\n\n table(tableName: string): this {\n this.parts.table = tableName;\n return this;\n }\n\n whereOp(\n column: string,\n operation: (typeof this.allowedOperations)[number],\n value: Parameter,\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.where.push({\n type: 'operation',\n column,\n operation,\n value,\n joinCondition,\n negateCondition,\n });\n return this;\n }\n\n whereColumn(\n column1: string,\n operation: (typeof this.allowedOperations)[number],\n column2: string,\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.where.push({\n type: 'operationColumn',\n column1,\n operation,\n column2,\n joinCondition,\n negateCondition,\n });\n return this;\n }\n\n whereNull(\n column: string,\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.where.push({ type: 'null', column, joinCondition, negateCondition });\n return this;\n }\n\n clearWhere(): this {\n this.parts.where = [];\n return this;\n }\n\n select(selects: selectType[]): this {\n this.parts.select = [...selects];\n return this;\n }\n\n groupBy(columns: string[]): this {\n this.parts.groupBy = [...columns];\n return this;\n }\n\n havingOp(\n column: string,\n operation: (typeof this.allowedOperations)[number],\n value: Parameter,\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.having.push({\n type: 'operation',\n column,\n operation,\n value,\n joinCondition,\n negateCondition,\n });\n return this;\n }\n\n havingRaw(\n sql: string,\n bindings: Parameter[],\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.having.push({ type: 'raw', sql, bindings, joinCondition, negateCondition });\n return this;\n }\n\n orderBy(column: string, direction: 'asc' | 'desc' = 'asc'): this {\n this.parts.orderBy.push(`${column} ${direction}`);\n return this;\n }\n\n limit(limit: number): this {\n this.parts.limit = limit;\n return this;\n }\n\n offset(offset: number): this {\n this.parts.offset = offset;\n return this;\n }\n\n toSql(): CompiledSql {\n return this.grammar.toSql(this);\n }\n\n async get() {\n return await this.connection?.runQuery(this.toSql());\n }\n\n async count(): Promise<number> {\n const csql: CompiledSql = this.grammar.compileCount(this);\n const result = await this.connection?.runQuery(csql);\n if (result && Array.isArray(result) && result.length > 0) {\n return parseInt(result[0]['count'], 10);\n }\n return 0;\n }\n\n async getCursor() {\n return await this.connection?.runCursor(this.toSql());\n }\n\n getConnection(): Connection | null {\n return this.connection;\n }\n\n async insert(data: Record<string, Parameter>) {\n const csql: CompiledSql = this.grammar.compileInsert(this, data);\n return await this.connection?.runQuery(csql);\n }\n\n async insertGetId(\n data: Record<string, Parameter>,\n options: { primaryKey: string[] } = { primaryKey: ['id'] }\n ) {\n const csql: CompiledSql = this.grammar.compileInsertGetId(this, data, options);\n return await this.connection?.runQuery(csql);\n }\n\n async update(data: Record<string, Parameter>) {\n const csql: CompiledSql = this.grammar.compileUpdate(this, data);\n return await this.connection?.runQuery(csql);\n }\n\n async upsert(data: Record<string, Parameter>, uniqueColumns: string[], updateColumns: string[]) {\n const csql: CompiledSql = this.grammar.compileUpsert(this, data, uniqueColumns, updateColumns);\n return await this.connection?.runQuery(csql);\n }\n\n async delete() {\n const csql: CompiledSql = this.grammar.compileDelete(this);\n return await this.connection?.runQuery(csql);\n }\n\n innerJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n let conditions_corrected: whereType[] = [];\n for (const cond of conditions) {\n conditions_corrected.push({\n joinCondition: 'and',\n negateCondition: false,\n type: 'operationColumn',\n // @ts-ignore\n operation: '=',\n ...cond,\n });\n }\n this.parts.join.push({ type: 'inner', table, conditions: conditions_corrected });\n return this;\n }\n\n leftJoin(table: string, condtions: whereType[]): this {\n this.parts.join.push({ type: 'left', table, conditions: condtions });\n return this;\n }\n\n rightJoin(table: string, condtions: whereType[]): this {\n this.parts.join.push({ type: 'right', table, conditions: condtions });\n return this;\n }\n\n fullJoin(table: string, condtions: whereType[]): this {\n this.parts.join.push({ type: 'full', table, conditions: condtions });\n return this;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/Query.mts"],"sourcesContent":["import { Connection } from './Connection.mjs';\nimport { QueryGrammar } from './QueryGrammar.mjs';\nimport {\n CompiledSql,\n JoinCondition,\n Parameter,\n selectType,\n whereType,\n havingType,\n joinType,\n} from './types.mjs';\n\nexport type QueryParts = {\n select: selectType[];\n table: string;\n join: joinType[];\n where: whereType[];\n groupBy: string[];\n having: havingType[];\n orderBy: string[];\n limit: number | null;\n offset: number | null;\n};\n\nexport class Query {\n allowedOperations: string[] = ['=', '>', '<', '!=', 'like', 'ilike'];\n parts: QueryParts = {\n select: ['*'],\n table: '',\n join: [],\n where: [],\n groupBy: [],\n having: [],\n orderBy: [],\n limit: null,\n offset: null,\n };\n\n constructor(\n public readonly connection: Connection | null,\n public readonly grammar: QueryGrammar\n ) {}\n\n table(tableName: string): this {\n this.parts.table = tableName;\n return this;\n }\n\n whereNested(\n func: (q: Query) => void,\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ) {\n const subQuery = new Query(this.connection, this.grammar);\n func(subQuery);\n this.parts.where.push({\n type: 'nested',\n query: subQuery,\n joinCondition,\n negateCondition,\n });\n return this;\n }\n\n whereOp(\n column: string,\n operation: (typeof this.allowedOperations)[number],\n value: Parameter,\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.where.push({\n type: 'operation',\n column,\n operation,\n value,\n joinCondition,\n negateCondition,\n });\n return this;\n }\n\n whereColumn(\n column1: string,\n operation: (typeof this.allowedOperations)[number],\n column2: string,\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.where.push({\n type: 'operationColumn',\n column1,\n operation,\n column2,\n joinCondition,\n negateCondition,\n });\n return this;\n }\n\n whereNull(\n column: string,\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.where.push({ type: 'null', column, joinCondition, negateCondition });\n return this;\n }\n\n clearWhere(): this {\n this.parts.where = [];\n return this;\n }\n\n select(selects: selectType[]): this {\n this.parts.select = [...selects];\n return this;\n }\n\n groupBy(columns: string[]): this {\n this.parts.groupBy = [...columns];\n return this;\n }\n\n havingOp(\n column: string,\n operation: (typeof this.allowedOperations)[number],\n value: Parameter,\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.having.push({\n type: 'operation',\n column,\n operation,\n value,\n joinCondition,\n negateCondition,\n });\n return this;\n }\n\n havingRaw(\n sql: string,\n bindings: Parameter[],\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.having.push({ type: 'raw', sql, bindings, joinCondition, negateCondition });\n return this;\n }\n\n orderBy(column: string, direction: 'asc' | 'desc' = 'asc'): this {\n this.parts.orderBy.push(`${column} ${direction}`);\n return this;\n }\n\n limit(limit: number): this {\n this.parts.limit = limit;\n return this;\n }\n\n offset(offset: number): this {\n this.parts.offset = offset;\n return this;\n }\n\n toSql(): CompiledSql {\n return this.grammar.toSql(this);\n }\n\n async get() {\n return await this.connection?.runQuery(this.toSql());\n }\n\n async count(): Promise<number> {\n const csql: CompiledSql = this.grammar.compileCount(this);\n const result = await this.connection?.runQuery(csql);\n if (result && Array.isArray(result) && result.length > 0) {\n return parseInt(result[0]['count'], 10);\n }\n return 0;\n }\n\n async getCursor() {\n return await this.connection?.runCursor(this.toSql());\n }\n\n getConnection(): Connection | null {\n return this.connection;\n }\n\n async insert(data: Record<string, Parameter>) {\n const csql: CompiledSql = this.grammar.compileInsert(this, data);\n return await this.connection?.runQuery(csql);\n }\n\n async insertGetId(\n data: Record<string, Parameter>,\n options: { primaryKey: string[] } = { primaryKey: ['id'] }\n ) {\n const csql: CompiledSql = this.grammar.compileInsertGetId(this, data, options);\n return await this.connection?.runQuery(csql);\n }\n\n async update(data: Record<string, Parameter>) {\n const csql: CompiledSql = this.grammar.compileUpdate(this, data);\n return await this.connection?.runQuery(csql);\n }\n\n async upsert(data: Record<string, Parameter>, uniqueColumns: string[], updateColumns: string[]) {\n const csql: CompiledSql = this.grammar.compileUpsert(this, data, uniqueColumns, updateColumns);\n return await this.connection?.runQuery(csql);\n }\n\n async delete() {\n const csql: CompiledSql = this.grammar.compileDelete(this);\n return await this.connection?.runQuery(csql);\n }\n\n innerJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n let conditions_corrected: whereType[] = [];\n for (const cond of conditions) {\n conditions_corrected.push({\n joinCondition: 'and',\n negateCondition: false,\n type: 'operationColumn',\n // @ts-ignore\n operation: '=',\n ...cond,\n });\n }\n this.parts.join.push({ type: 'inner', table, conditions: conditions_corrected });\n return this;\n }\n\n leftJoin(table: string, condtions: whereType[]): this {\n this.parts.join.push({ type: 'left', table, conditions: condtions });\n return this;\n }\n\n rightJoin(table: string, condtions: whereType[]): this {\n this.parts.join.push({ type: 'right', table, conditions: condtions });\n return this;\n }\n\n fullJoin(table: string, condtions: whereType[]): this {\n this.parts.join.push({ type: 'full', table, conditions: condtions });\n return this;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1 @@
1
- export { b as QueryGrammar } from './Connection-Ba1yrJgb.mjs';
2
- import './types-BEFQrxTG.mjs';
3
- import './Blueprint.mjs';
4
- import './SchemaGrammar.mjs';
1
+ export { d as QueryGrammar } from './Blueprint-BDzA_swP.mjs';
@@ -102,6 +102,15 @@ class QueryGrammar {
102
102
  }
103
103
  return { sql, bindings };
104
104
  }
105
+ compileWhereNested(w) {
106
+ const subQuery = w.query;
107
+ const { sql, bindings } = subQuery.grammar.compileWhere(subQuery.parts.where);
108
+ let sql2 = sql.replace(/^where /, "");
109
+ return {
110
+ sql: `(${sql2})`,
111
+ bindings
112
+ };
113
+ }
105
114
  compileWhereOperation(w) {
106
115
  if (w.operation.toLowerCase() === "in" && Array.isArray(w.value)) {
107
116
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/QueryGrammar.mts"],"sourcesContent":["import { Query } from './Query.mjs';\nimport {\n Parameter,\n CompiledSql,\n selectType,\n whereNull,\n whereOp,\n whereType,\n whereRaw,\n havingType,\n whereOpColumn,\n joinType,\n} from './types.mjs';\n\nfunction toUpperFirst(str: string) {\n return str.substring(0, 1).toUpperCase() + str.substring(1);\n}\nexport abstract class QueryGrammar {\n sqlParts: string[] = [\n 'select',\n 'table',\n 'join',\n 'where',\n 'groupBy',\n 'having',\n 'orderBy',\n 'limit',\n 'offset',\n ];\n\n toSql(query: Query): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n\n for (const part of this.sqlParts) {\n // @ts-ignore\n const funcName: keyof this = 'compile' + toUpperFirst(part);\n // @ts-ignore\n const r = this[funcName](query.parts[part]);\n if (!sql) {\n sql = r.sql;\n } else if (r.sql) {\n sql += ' ' + r.sql;\n }\n bindings = [...bindings, ...r.bindings];\n }\n return { sql, bindings };\n }\n\n compileCount(query: Query): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n\n for (const part of this.sqlParts) {\n // @ts-ignore\n let parts = query.parts[part];\n if (part === 'select') {\n parts = ['count(*) as count'];\n }\n // @ts-ignore\n const funcName: keyof this = 'compile' + toUpperFirst(part);\n // @ts-ignore\n const r = this[funcName](parts);\n if (!sql) {\n sql = r.sql;\n } else if (r.sql) {\n sql += ' ' + r.sql;\n }\n bindings = [...bindings, ...r.bindings];\n }\n return { sql, bindings };\n }\n\n compileSelect(selects: selectType[]): CompiledSql {\n const rc = selects\n .map((v) => {\n return v;\n })\n .join(', ');\n\n return { sql: 'select ' + rc, bindings: [] };\n }\n\n compileTable(tableName: string): CompiledSql {\n let rc = '';\n if (tableName.length) {\n rc = 'from ' + tableName;\n }\n\n return { sql: rc, bindings: [] };\n }\n\n compileJoin(joins: joinType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n\n for (const j of joins) {\n sql += ' ' + j.type + ' join ' + j.table + ' on ';\n\n const where = this.compileWhere(j.conditions);\n if (where.sql.startsWith('where ')) {\n where.sql = where.sql.substring('where '.length);\n }\n\n sql += '(';\n sql += where.sql;\n sql += ')';\n\n bindings = [...bindings, ...where.bindings];\n }\n\n return { sql, bindings };\n }\n\n compileWhere(wheres: whereType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n\n for (const w of wheres) {\n sql += ' ' + w.joinCondition + ' ';\n if (w.negateCondition) {\n sql += 'not ';\n }\n const funcName = 'compileWhere' + toUpperFirst(w.type);\n // @ts-ignore\n const wh = this[funcName](w);\n sql += wh.sql;\n bindings = [...bindings, ...wh.bindings];\n }\n if (sql.startsWith(' and ')) {\n sql = 'where ' + sql.substring(' and '.length);\n } else if (sql.startsWith(' or ')) {\n sql = 'where ' + sql.substring(' or '.length);\n }\n return { sql, bindings };\n }\n\n compileWhereOperation(w: whereOp): CompiledSql {\n if (w.operation.toLowerCase() === 'in' && Array.isArray(w.value)) {\n return {\n sql: `${w.column} = ANY(${this.getVariablePlaceholder()})`,\n bindings: [w.value],\n };\n }\n\n return {\n sql: `${w.column} ${w.operation} ${this.getVariablePlaceholder()}`,\n bindings: [w.value],\n };\n }\n\n compileWhereOperationColumn(w: whereOpColumn): CompiledSql {\n return {\n sql: `${w.column1} ${w.operation} ${w.column2}`,\n bindings: [],\n };\n }\n\n compileOrderBy(orderBy: string[]): CompiledSql {\n let rc = '';\n if (orderBy.length) {\n rc = 'order by ' + orderBy.join(', ');\n }\n\n return { sql: rc, bindings: [] };\n }\n\n compileLimit(limit: number | null): CompiledSql {\n let rc = '';\n if (limit !== null) {\n rc = 'limit ' + limit;\n }\n\n return { sql: rc, bindings: [] };\n }\n\n compileOffset(offset: number | null): CompiledSql {\n let rc = '';\n if (offset !== null) {\n rc = 'offset ' + offset;\n }\n\n return { sql: rc, bindings: [] };\n }\n\n abstract getVariablePlaceholder(): string;\n\n compileWhereNull(w: whereNull): CompiledSql {\n return {\n sql: `${w.column} is null`,\n bindings: [],\n };\n }\n\n compileInsert(query: Query, data: Record<string, Parameter>): CompiledSql {\n let sql = 'insert into ' + query.parts.table + ' (';\n const columns: string[] = [];\n const bindings: Parameter[] = [];\n const values: string[] = [];\n\n for (const [k, v] of Object.entries(data)) {\n columns.push(k);\n bindings.push(v);\n values.push(this.getVariablePlaceholder());\n }\n\n sql += columns.join(', ') + ') values (' + values + ')';\n\n return { sql, bindings };\n }\n\n abstract compileInsertGetId(\n query: Query,\n data: Record<string, Parameter>,\n options: { primaryKey: string[] }\n ): CompiledSql;\n\n compileUpdate(query: Query, data: Record<string, Parameter>): CompiledSql {\n let sql = 'update ' + query.parts.table + ' set ';\n const bindings: Parameter[] = [];\n\n const setParts = [];\n for (const [k, v] of Object.entries(data)) {\n setParts.push(`${k} = ${this.getVariablePlaceholder()}`);\n bindings.push(v);\n }\n\n sql += setParts.join(', ');\n\n const where_csql = this.compileWhere(query.parts.where);\n sql += ' ' + where_csql.sql;\n bindings.push(...where_csql.bindings);\n\n return { sql, bindings };\n }\n\n compileDelete(query: Query): CompiledSql {\n let sql = 'delete from ' + query.parts.table;\n const where_csql = this.compileWhere(query.parts.where);\n sql += ' ' + where_csql.sql;\n return { sql, bindings: where_csql.bindings };\n }\n\n compileUpsert(\n query: Query,\n data: Record<string, Parameter>,\n conflictFields: string[],\n updateFields: string[]\n ): CompiledSql {\n let sql = 'insert into ' + query.parts.table + ' (';\n const columns: string[] = [];\n const bindings: Parameter[] = [];\n const values: string[] = [];\n\n for (const [k, v] of Object.entries(data)) {\n columns.push(k);\n bindings.push(v);\n values.push(this.getVariablePlaceholder());\n }\n\n sql += columns.join(', ') + ') values (' + values + ')';\n\n sql += ' on conflict (' + conflictFields.join(', ') + ') do update set ';\n const setParts = [];\n for (const f of updateFields) {\n setParts.push(`${f} = excluded.${f}`);\n }\n sql += setParts.join(', ');\n\n const where_csql = this.compileWhere(query.parts.where);\n sql += ' ' + where_csql.sql;\n bindings.push(...where_csql.bindings);\n\n return { sql, bindings };\n }\n\n compileGroupBy(groupBy: string[]): CompiledSql {\n let rc = '';\n if (groupBy.length) {\n rc = 'group by ' + groupBy.join(', ');\n }\n\n return { sql: rc, bindings: [] };\n }\n\n compileHaving(having: havingType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n\n for (const w of having) {\n sql += ' ' + w.joinCondition + ' ';\n if (w.negateCondition) {\n sql += 'not ';\n }\n const funcName = 'compileHaving' + toUpperFirst(w.type);\n // @ts-ignore\n const wh = this[funcName](w);\n sql += wh.sql;\n bindings = [...bindings, ...wh.bindings];\n }\n if (sql.startsWith(' and ')) {\n sql = 'having ' + sql.substring(' and '.length);\n } else if (sql.startsWith(' or ')) {\n sql = 'having ' + sql.substring(' or '.length);\n }\n return { sql, bindings };\n }\n\n compileHavingOperation(w: whereOp): CompiledSql {\n return {\n sql: `${w.column} ${w.operation} ${this.getVariablePlaceholder()}`,\n bindings: [w.value],\n };\n }\n\n compileHavingRaw(w: whereRaw): CompiledSql {\n return {\n sql: w.sql,\n bindings: w.bindings,\n };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/QueryGrammar.mts"],"sourcesContent":["import { Query } from './Query.mjs';\nimport {\n Parameter,\n CompiledSql,\n selectType,\n whereNull,\n whereOp,\n whereType,\n whereRaw,\n havingType,\n whereOpColumn,\n joinType,\n whereNested,\n} from './types.mjs';\n\nfunction toUpperFirst(str: string) {\n return str.substring(0, 1).toUpperCase() + str.substring(1);\n}\nexport abstract class QueryGrammar {\n sqlParts: string[] = [\n 'select',\n 'table',\n 'join',\n 'where',\n 'groupBy',\n 'having',\n 'orderBy',\n 'limit',\n 'offset',\n ];\n\n toSql(query: Query): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n\n for (const part of this.sqlParts) {\n // @ts-ignore\n const funcName: keyof this = 'compile' + toUpperFirst(part);\n // @ts-ignore\n const r = this[funcName](query.parts[part]);\n if (!sql) {\n sql = r.sql;\n } else if (r.sql) {\n sql += ' ' + r.sql;\n }\n bindings = [...bindings, ...r.bindings];\n }\n return { sql, bindings };\n }\n\n compileCount(query: Query): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n\n for (const part of this.sqlParts) {\n // @ts-ignore\n let parts = query.parts[part];\n if (part === 'select') {\n parts = ['count(*) as count'];\n }\n // @ts-ignore\n const funcName: keyof this = 'compile' + toUpperFirst(part);\n // @ts-ignore\n const r = this[funcName](parts);\n if (!sql) {\n sql = r.sql;\n } else if (r.sql) {\n sql += ' ' + r.sql;\n }\n bindings = [...bindings, ...r.bindings];\n }\n return { sql, bindings };\n }\n\n compileSelect(selects: selectType[]): CompiledSql {\n const rc = selects\n .map((v) => {\n return v;\n })\n .join(', ');\n\n return { sql: 'select ' + rc, bindings: [] };\n }\n\n compileTable(tableName: string): CompiledSql {\n let rc = '';\n if (tableName.length) {\n rc = 'from ' + tableName;\n }\n\n return { sql: rc, bindings: [] };\n }\n\n compileJoin(joins: joinType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n\n for (const j of joins) {\n sql += ' ' + j.type + ' join ' + j.table + ' on ';\n\n const where = this.compileWhere(j.conditions);\n if (where.sql.startsWith('where ')) {\n where.sql = where.sql.substring('where '.length);\n }\n\n sql += '(';\n sql += where.sql;\n sql += ')';\n\n bindings = [...bindings, ...where.bindings];\n }\n\n return { sql, bindings };\n }\n\n compileWhere(wheres: whereType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n\n for (const w of wheres) {\n sql += ' ' + w.joinCondition + ' ';\n if (w.negateCondition) {\n sql += 'not ';\n }\n const funcName = 'compileWhere' + toUpperFirst(w.type);\n // @ts-ignore\n const wh = this[funcName](w);\n sql += wh.sql;\n bindings = [...bindings, ...wh.bindings];\n }\n if (sql.startsWith(' and ')) {\n sql = 'where ' + sql.substring(' and '.length);\n } else if (sql.startsWith(' or ')) {\n sql = 'where ' + sql.substring(' or '.length);\n }\n return { sql, bindings };\n }\n\n compileWhereNested(w: whereNested): CompiledSql {\n const subQuery = w.query;\n const { sql, bindings } = subQuery.grammar.compileWhere(subQuery.parts.where);\n let sql2 = sql.replace(/^where /, '');\n return {\n sql: `(${sql2})`,\n bindings,\n };\n }\n\n compileWhereOperation(w: whereOp): CompiledSql {\n if (w.operation.toLowerCase() === 'in' && Array.isArray(w.value)) {\n return {\n sql: `${w.column} = ANY(${this.getVariablePlaceholder()})`,\n bindings: [w.value],\n };\n }\n\n return {\n sql: `${w.column} ${w.operation} ${this.getVariablePlaceholder()}`,\n bindings: [w.value],\n };\n }\n\n compileWhereOperationColumn(w: whereOpColumn): CompiledSql {\n return {\n sql: `${w.column1} ${w.operation} ${w.column2}`,\n bindings: [],\n };\n }\n\n compileOrderBy(orderBy: string[]): CompiledSql {\n let rc = '';\n if (orderBy.length) {\n rc = 'order by ' + orderBy.join(', ');\n }\n\n return { sql: rc, bindings: [] };\n }\n\n compileLimit(limit: number | null): CompiledSql {\n let rc = '';\n if (limit !== null) {\n rc = 'limit ' + limit;\n }\n\n return { sql: rc, bindings: [] };\n }\n\n compileOffset(offset: number | null): CompiledSql {\n let rc = '';\n if (offset !== null) {\n rc = 'offset ' + offset;\n }\n\n return { sql: rc, bindings: [] };\n }\n\n abstract getVariablePlaceholder(): string;\n\n compileWhereNull(w: whereNull): CompiledSql {\n return {\n sql: `${w.column} is null`,\n bindings: [],\n };\n }\n\n compileInsert(query: Query, data: Record<string, Parameter>): CompiledSql {\n let sql = 'insert into ' + query.parts.table + ' (';\n const columns: string[] = [];\n const bindings: Parameter[] = [];\n const values: string[] = [];\n\n for (const [k, v] of Object.entries(data)) {\n columns.push(k);\n bindings.push(v);\n values.push(this.getVariablePlaceholder());\n }\n\n sql += columns.join(', ') + ') values (' + values + ')';\n\n return { sql, bindings };\n }\n\n abstract compileInsertGetId(\n query: Query,\n data: Record<string, Parameter>,\n options: { primaryKey: string[] }\n ): CompiledSql;\n\n compileUpdate(query: Query, data: Record<string, Parameter>): CompiledSql {\n let sql = 'update ' + query.parts.table + ' set ';\n const bindings: Parameter[] = [];\n\n const setParts = [];\n for (const [k, v] of Object.entries(data)) {\n setParts.push(`${k} = ${this.getVariablePlaceholder()}`);\n bindings.push(v);\n }\n\n sql += setParts.join(', ');\n\n const where_csql = this.compileWhere(query.parts.where);\n sql += ' ' + where_csql.sql;\n bindings.push(...where_csql.bindings);\n\n return { sql, bindings };\n }\n\n compileDelete(query: Query): CompiledSql {\n let sql = 'delete from ' + query.parts.table;\n const where_csql = this.compileWhere(query.parts.where);\n sql += ' ' + where_csql.sql;\n return { sql, bindings: where_csql.bindings };\n }\n\n compileUpsert(\n query: Query,\n data: Record<string, Parameter>,\n conflictFields: string[],\n updateFields: string[]\n ): CompiledSql {\n let sql = 'insert into ' + query.parts.table + ' (';\n const columns: string[] = [];\n const bindings: Parameter[] = [];\n const values: string[] = [];\n\n for (const [k, v] of Object.entries(data)) {\n columns.push(k);\n bindings.push(v);\n values.push(this.getVariablePlaceholder());\n }\n\n sql += columns.join(', ') + ') values (' + values + ')';\n\n sql += ' on conflict (' + conflictFields.join(', ') + ') do update set ';\n const setParts = [];\n for (const f of updateFields) {\n setParts.push(`${f} = excluded.${f}`);\n }\n sql += setParts.join(', ');\n\n const where_csql = this.compileWhere(query.parts.where);\n sql += ' ' + where_csql.sql;\n bindings.push(...where_csql.bindings);\n\n return { sql, bindings };\n }\n\n compileGroupBy(groupBy: string[]): CompiledSql {\n let rc = '';\n if (groupBy.length) {\n rc = 'group by ' + groupBy.join(', ');\n }\n\n return { sql: rc, bindings: [] };\n }\n\n compileHaving(having: havingType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n\n for (const w of having) {\n sql += ' ' + w.joinCondition + ' ';\n if (w.negateCondition) {\n sql += 'not ';\n }\n const funcName = 'compileHaving' + toUpperFirst(w.type);\n // @ts-ignore\n const wh = this[funcName](w);\n sql += wh.sql;\n bindings = [...bindings, ...wh.bindings];\n }\n if (sql.startsWith(' and ')) {\n sql = 'having ' + sql.substring(' and '.length);\n } else if (sql.startsWith(' or ')) {\n sql = 'having ' + sql.substring(' or '.length);\n }\n return { sql, bindings };\n }\n\n compileHavingOperation(w: whereOp): CompiledSql {\n return {\n sql: `${w.column} ${w.operation} ${this.getVariablePlaceholder()}`,\n bindings: [w.value],\n };\n }\n\n compileHavingRaw(w: whereRaw): CompiledSql {\n return {\n sql: w.sql,\n bindings: w.bindings,\n };\n }\n}\n"],"mappings":"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","names":[]}
package/dist/Schema.d.mts CHANGED
@@ -1,4 +1 @@
1
- import './Blueprint.mjs';
2
- export { S as Schema } from './Connection-Ba1yrJgb.mjs';
3
- import './SchemaGrammar.mjs';
4
- import './types-BEFQrxTG.mjs';
1
+ export { S as Schema } from './Blueprint-BDzA_swP.mjs';
@@ -1,21 +1 @@
1
- import { Blueprint, Column, ForeignKeyConstraint } from './Blueprint.mjs';
2
- import { C as CompiledSql, P as Parameter } from './types-BEFQrxTG.mjs';
3
-
4
- declare class SchemaGrammar {
5
- toSql(blueprint: Blueprint): string;
6
- compileCreateTable(blueprint: Blueprint): CompiledSql;
7
- compileAlterTable(blueprint: Blueprint): CompiledSql;
8
- compileColumn(column: Column): string;
9
- escape(value: Parameter): string;
10
- compilePrimaryKeys(primaryKeys: string[]): string;
11
- compileTables(schema?: string | string[] | undefined): CompiledSql;
12
- compileTableExists(tableName: string, schema?: string): CompiledSql;
13
- compileDropTable(tableName: string): CompiledSql;
14
- compileDropTableIfExists(tableName: string): CompiledSql;
15
- protected compileSchemaWhereClause(schema: string | string[] | undefined, column: string): string;
16
- protected quoteString(value: string | string[]): string;
17
- protected doubleQuoteString(value: string | string[]): string;
18
- protected compileForeignKey(foreignKey: ForeignKeyConstraint): string;
19
- }
20
-
21
- export { SchemaGrammar };
1
+ export { e as SchemaGrammar } from './Blueprint-BDzA_swP.mjs';
@@ -63,6 +63,10 @@ class SchemaGrammar {
63
63
  rc.push("double precision");
64
64
  } else if (column.properties.type === "date") {
65
65
  rc.push("date");
66
+ } else if (column.properties.type === "json") {
67
+ rc.push("json");
68
+ } else if (column.properties.type === "jsonb") {
69
+ rc.push("jsonb");
66
70
  } else {
67
71
  throw new Error("Unknown column type: " + column.properties.type);
68
72
  }