@devbro/neko-sql 0.1.11 → 0.1.14

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.
@@ -20,6 +20,7 @@ declare class SchemaGrammar {
20
20
  protected quoteString(value: string | string[]): string;
21
21
  protected doubleQuoteString(value: string | string[]): string;
22
22
  protected compileForeignKey(foreignKey: ForeignKeyConstraint): string;
23
+ protected compileIndex(tableName: string, index: IndexConstraint): CompiledSql;
23
24
  }
24
25
 
25
26
  declare class Schema {
@@ -119,30 +120,30 @@ declare class Query {
119
120
  update(data: Record<string, Parameter>): Promise<any>;
120
121
  upsert(data: Record<string, Parameter>, uniqueColumns: string[], updateColumns: string[]): Promise<any>;
121
122
  delete(): Promise<any>;
122
- join(table: string, type: joinType['type'], conditions: whereType[] | {
123
+ join(table: string, type: joinType['type'], conditions: (whereType | {
123
124
  column1: string;
124
125
  column2: string;
125
- }[]): this;
126
- innerJoin(table: string, conditions: whereType[] | {
126
+ })[]): this;
127
+ innerJoin(table: string, conditions: (whereType | {
127
128
  column1: string;
128
129
  column2: string;
129
- }[]): this;
130
- leftJoin(table: string, conditions: whereType[] | {
130
+ })[]): this;
131
+ leftJoin(table: string, conditions: (whereType | {
131
132
  column1: string;
132
133
  column2: string;
133
- }[]): this;
134
- rightJoin(table: string, conditions: whereType[] | {
134
+ })[]): this;
135
+ rightJoin(table: string, conditions: (whereType | {
135
136
  column1: string;
136
137
  column2: string;
137
- }[]): this;
138
- fullJoin(table: string, conditions: whereType[] | {
138
+ })[]): this;
139
+ fullJoin(table: string, conditions: (whereType | {
139
140
  column1: string;
140
141
  column2: string;
141
- }[]): this;
142
- crossJoin(table: string, conditions: whereType[] | {
142
+ })[]): this;
143
+ crossJoin(table: string, conditions: (whereType | {
143
144
  column1: string;
144
145
  column2: string;
145
- }[]): this;
146
+ })[]): this;
146
147
  }
147
148
 
148
149
  type selectType = string;
@@ -176,7 +177,7 @@ type whereNull = {
176
177
  column: string;
177
178
  };
178
179
  type whereType = whereBasic & (whereOp | whereOpColumn | whereNested | whereNull);
179
- type Parameter = string | number | Date | boolean | null | Expression | undefined | number[];
180
+ type Parameter = string | number | Date | boolean | null | Expression | undefined | number[] | string[];
180
181
  type JoinCondition = 'and' | 'or';
181
182
  type CompiledSql = {
182
183
  sql: string;
@@ -205,6 +206,16 @@ declare class Column {
205
206
  unique(unique?: boolean): this;
206
207
  default(value: ColumnPropertiesType['default']): this;
207
208
  }
209
+ declare class IndexConstraint {
210
+ columns: string[];
211
+ indexName: string | undefined;
212
+ unique: boolean;
213
+ _type: 'gin' | 'btree' | 'hash' | 'gist' | 'spgist' | 'brin' | undefined;
214
+ constructor(columns: string | string[]);
215
+ name(indexName: string): this;
216
+ setUnique(unique?: boolean): this;
217
+ type(type: typeof this._type): this;
218
+ }
208
219
  declare class ForeignKeyConstraint {
209
220
  column: string;
210
221
  reference_table: {
@@ -224,6 +235,7 @@ declare class Blueprint {
224
235
  columns: Column[];
225
236
  drop_coumns: string[];
226
237
  foreignKeys: ForeignKeyConstraint[];
238
+ indexes: IndexConstraint[];
227
239
  existingTable: boolean;
228
240
  primaryKeys: string[];
229
241
  constructor();
@@ -247,6 +259,8 @@ declare class Blueprint {
247
259
  primary(keys: string[]): void;
248
260
  foreign(columnName: string): ForeignKeyConstraint;
249
261
  dropColumn(columnName: string): void;
262
+ index(columns: string | string[], indexName?: string): IndexConstraint;
263
+ unique(columns: string | string[], indexName?: string): IndexConstraint;
250
264
  }
251
265
 
252
- 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 };
266
+ export { Blueprint as B, type ColumnPropertiesType as C, Expression as E, ForeignKeyConstraint as F, IndexConstraint as I, 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 +1 @@
1
- export { B as Blueprint, a as Column, C as ColumnPropertiesType, F as ForeignKeyConstraint } from './Blueprint-CCVXLNaD.mjs';
1
+ export { B as Blueprint, a as Column, C as ColumnPropertiesType, F as ForeignKeyConstraint, I as IndexConstraint } from './Blueprint-BiMz4Je8.mjs';
@@ -34,6 +34,30 @@ class Column {
34
34
  return this;
35
35
  }
36
36
  }
37
+ class IndexConstraint {
38
+ static {
39
+ __name(this, "IndexConstraint");
40
+ }
41
+ columns;
42
+ indexName = void 0;
43
+ unique = false;
44
+ _type = void 0;
45
+ constructor(columns) {
46
+ this.columns = Array.isArray(columns) ? columns : [columns];
47
+ }
48
+ name(indexName) {
49
+ this.indexName = indexName;
50
+ return this;
51
+ }
52
+ setUnique(unique = true) {
53
+ this.unique = unique;
54
+ return this;
55
+ }
56
+ type(type) {
57
+ this._type = type;
58
+ return this;
59
+ }
60
+ }
37
61
  class ForeignKeyConstraint {
38
62
  static {
39
63
  __name(this, "ForeignKeyConstraint");
@@ -71,6 +95,7 @@ class Blueprint {
71
95
  columns = [];
72
96
  drop_coumns = [];
73
97
  foreignKeys = [];
98
+ indexes = [];
74
99
  existingTable = false;
75
100
  primaryKeys = [];
76
101
  constructor() {
@@ -171,10 +196,27 @@ class Blueprint {
171
196
  dropColumn(columnName) {
172
197
  this.drop_coumns.push(columnName);
173
198
  }
199
+ index(columns, indexName) {
200
+ const indexConstraint = new IndexConstraint(columns);
201
+ if (indexName) {
202
+ indexConstraint.name(indexName);
203
+ }
204
+ this.indexes.push(indexConstraint);
205
+ return indexConstraint;
206
+ }
207
+ unique(columns, indexName) {
208
+ const indexConstraint = new IndexConstraint(columns).setUnique(true);
209
+ if (indexName) {
210
+ indexConstraint.name(indexName);
211
+ }
212
+ this.indexes.push(indexConstraint);
213
+ return indexConstraint;
214
+ }
174
215
  }
175
216
  export {
176
217
  Blueprint,
177
218
  Column,
178
- ForeignKeyConstraint
219
+ ForeignKeyConstraint,
220
+ IndexConstraint
179
221
  };
180
222
  //# sourceMappingURL=Blueprint.mjs.map
@@ -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 | '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
+ {"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// Index constraint for creating database indexes\nexport class IndexConstraint {\n columns: string[];\n indexName: string | undefined = undefined;\n unique: boolean = false;\n _type: 'gin' | 'btree' | 'hash' | 'gist' | 'spgist' | 'brin' | undefined = undefined;\n\n constructor(columns: string | string[]) {\n this.columns = Array.isArray(columns) ? columns : [columns];\n }\n\n name(indexName: string) {\n this.indexName = indexName;\n return this;\n }\n\n setUnique(unique: boolean = true) {\n this.unique = unique;\n return this;\n }\n\n type(type: typeof this._type) {\n this._type = type;\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 indexes: IndexConstraint[] = [];\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 index(columns: string | string[], indexName?: string) {\n const indexConstraint = new IndexConstraint(columns);\n if (indexName) {\n indexConstraint.name(indexName);\n }\n this.indexes.push(indexConstraint);\n return indexConstraint;\n }\n\n unique(columns: string | string[], indexName?: string) {\n const indexConstraint = new IndexConstraint(columns).setUnique(true);\n if (indexName) {\n indexConstraint.name(indexName);\n }\n this.indexes.push(indexConstraint);\n return indexConstraint;\n }\n}\n"],"mappings":";;AAAA,SAAS,kBAAkB;AAuBpB,MAAM,OAAO;AAAA,EAvBpB,OAuBoB;AAAA;AAAA;AAAA,EAClB,aAAqB;AAAA,EACrB,aAAmC;AAAA,IACjC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EAEA,YAAY,YAAoB,MAAoC;AAClE,SAAK,aAAa;AAClB,SAAK,WAAW,OAAO;AAAA,EACzB;AAAA,EAEA,OAAO,QAAgB;AACrB,SAAK,WAAW,SAAS;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,WAAoB,MAAM;AACjC,SAAK,WAAW,WAAW;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAAkB,MAAM;AAC7B,SAAK,WAAW,SAAS;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,OAAwC;AAC9C,SAAK,WAAW,UAAU;AAC1B,WAAO;AAAA,EACT;AACF;AAGO,MAAM,gBAAgB;AAAA,EA5D7B,OA4D6B;AAAA;AAAA;AAAA,EAC3B;AAAA,EACA,YAAgC;AAAA,EAChC,SAAkB;AAAA,EAClB,QAA2E;AAAA,EAE3E,YAAY,SAA4B;AACtC,SAAK,UAAU,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAAA,EAC5D;AAAA,EAEA,KAAK,WAAmB;AACtB,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,SAAkB,MAAM;AAChC,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,MAAyB;AAC5B,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AACF;AAGO,MAAM,qBAAqB;AAAA,EAvFlC,OAuFkC;AAAA;AAAA;AAAA,EAChC;AAAA,EACA;AAAA,EACA,iBAAoE;AAAA,EACpE,iBAAoE;AAAA,EAEpE,YAAY,QAAgB;AAC1B,SAAK,SAAS;AACd,SAAK,kBAAkB,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA,EACjD;AAAA,EAEA,GAAG,OAAe;AAChB,SAAK,gBAAgB,QAAQ;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,QAAgB;AACzB,SAAK,gBAAgB,SAAS;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,QAAoC;AAC3C,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,QAAoC;AAC3C,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACT;AACF;AAEO,MAAM,UAAU;AAAA,EAvHvB,OAuHuB;AAAA;AAAA;AAAA,EACrB,YAAoB;AAAA,EACpB,UAAoB,CAAC;AAAA,EACrB,cAAwB,CAAC;AAAA,EACzB,cAAsC,CAAC;AAAA,EACvC,UAA6B,CAAC;AAAA,EAC9B,gBAAyB;AAAA,EACzB,cAAwB,CAAC;AAAA,EACzB,cAAc;AAAA,EAAC;AAAA,EACf,aAAa,WAAmB,gBAAyB,OAAO;AAC9D,SAAK,YAAY;AACjB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,QAAQ,YAAoB;AAC1B,UAAM,KAAK,IAAI,OAAO,YAAY,SAAS;AAC3C,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,YAAoB;AACvB,UAAM,KAAK,IAAI,OAAO,YAAY,MAAM;AACxC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,YAAoB,SAAiB,KAAK;AAC/C,UAAM,KAAK,IAAI,OAAO,YAAY,QAAQ;AAC1C,OAAG,OAAO,MAAM;AAChB,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,YAAoB;AACvB,UAAM,KAAK,IAAI,OAAO,YAAY,MAAM;AACxC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,YAAoB;AACvB,UAAM,KAAK,IAAI,OAAO,YAAY,MAAM;AACxC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAoB;AACxB,UAAM,KAAK,IAAI,OAAO,YAAY,OAAO;AACzC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,YAAoB;AAC1B,UAAM,KAAK,IAAI,OAAO,YAAY,SAAS;AAC3C,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAoB;AACxB,UAAM,KAAK,IAAI,OAAO,YAAY,OAAO;AACzC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,YAAoB;AACzB,UAAM,KAAK,IAAI,OAAO,YAAY,QAAQ;AAC1C,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK;AACH,UAAM,KAAK,IAAI,OAAO,MAAM,QAAQ;AACpC,SAAK,QAAQ,KAAK,EAAE;AACpB,SAAK,YAAY,KAAK,IAAI;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,aAAa;AACX,SAAK,QAAQ;AAAA,MACX,IAAI,OAAO,cAAc,YAAY,EAAE,QAAQ,IAAI,WAAW,mBAAmB,CAAC;AAAA,IACpF;AACA,SAAK,QAAQ;AAAA,MACX,IAAI,OAAO,cAAc,YAAY,EAAE,QAAQ,IAAI,WAAW,mBAAmB,CAAC;AAAA,IACpF;AAAA,EACF;AAAA,EAEA,KAAK,YAAoB;AACvB,UAAM,KAAK,IAAI,OAAO,YAAY,MAAM;AACxC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,YAAoB;AAC5B,UAAM,KAAK,IAAI,OAAO,YAAY,WAAW;AAC7C,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,YAAoB;AAC9B,UAAM,KAAK,IAAI,OAAO,YAAY,YAAY;AAC9C,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,YAAoB;AAC3B,WAAO,KAAK,UAAU,UAAU;AAAA,EAClC;AAAA,EAEA,WAAW,YAAoB;AAC7B,WAAO,KAAK,YAAY,UAAU;AAAA,EACpC;AAAA,EAEA,QAAQ,MAAgB;AACtB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,QAAQ,YAAoB;AAC1B,UAAM,KAAK,IAAI,qBAAqB,UAAU;AAC9C,SAAK,YAAY,KAAK,EAAE;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,YAAoB;AAC7B,SAAK,YAAY,KAAK,UAAU;AAAA,EAClC;AAAA,EAEA,MAAM,SAA4B,WAAoB;AACpD,UAAM,kBAAkB,IAAI,gBAAgB,OAAO;AACnD,QAAI,WAAW;AACb,sBAAgB,KAAK,SAAS;AAAA,IAChC;AACA,SAAK,QAAQ,KAAK,eAAe;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAA4B,WAAoB;AACrD,UAAM,kBAAkB,IAAI,gBAAgB,OAAO,EAAE,UAAU,IAAI;AACnE,QAAI,WAAW;AACb,sBAAgB,KAAK,SAAS;AAAA,IAChC;AACA,SAAK,QAAQ,KAAK,eAAe;AACjC,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -1 +1 @@
1
- export { b as Connection } from './Blueprint-CCVXLNaD.mjs';
1
+ export { b as Connection } from './Blueprint-BiMz4Je8.mjs';
@@ -1 +1 @@
1
- export { E as Expression } from './Blueprint-CCVXLNaD.mjs';
1
+ export { E as Expression } from './Blueprint-BiMz4Je8.mjs';
@@ -1,4 +1,4 @@
1
- import { S as Schema } from './Blueprint-CCVXLNaD.mjs';
1
+ import { S as Schema } from './Blueprint-BiMz4Je8.mjs';
2
2
 
3
3
  declare abstract class Migration {
4
4
  abstract up(schema: Schema): Promise<void>;
package/dist/Query.d.mts CHANGED
@@ -1 +1 @@
1
- export { c as Query, Q as QueryParts } from './Blueprint-CCVXLNaD.mjs';
1
+ export { c as Query, Q as QueryParts } from './Blueprint-BiMz4Je8.mjs';
package/dist/Query.mjs CHANGED
@@ -8,7 +8,7 @@ class Query {
8
8
  static {
9
9
  __name(this, "Query");
10
10
  }
11
- allowedOperations = ["=", ">", "<", "!=", "like", "ilike"];
11
+ allowedOperations = ["=", ">", "<", "!=", "like", "ilike", "in"];
12
12
  parts = {
13
13
  select: ["*"],
14
14
  table: "",
@@ -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 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 join(\n table: string,\n type: joinType['type'],\n conditions: whereType[] | { column1: string; column2: string }[]\n ): 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, table, conditions: conditions_corrected });\n return this;\n }\n\n innerJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n return this.join(table, 'inner', conditions);\n }\n\n leftJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n return this.join(table, 'left', conditions);\n }\n\n rightJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n return this.join(table, 'right', conditions);\n }\n\n fullJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n return this.join(table, 'full', conditions);\n }\n\n crossJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n return this.join(table, 'cross', conditions);\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', 'in'];\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 join(\n table: string,\n type: joinType['type'],\n conditions: (whereType | { column1: string; column2: string })[]\n ): 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, table, conditions: conditions_corrected });\n return this;\n }\n\n innerJoin(table: string, conditions: (whereType | { column1: string; column2: string })[]): this {\n return this.join(table, 'inner', conditions);\n }\n\n leftJoin(table: string, conditions: (whereType | { column1: string; column2: string })[]): this {\n return this.join(table, 'left', conditions);\n }\n\n rightJoin(table: string, conditions: (whereType | { column1: string; column2: string })[]): this {\n return this.join(table, 'right', conditions);\n }\n\n fullJoin(table: string, conditions: (whereType | { column1: string; column2: string })[]): this {\n return this.join(table, 'full', conditions);\n }\n\n crossJoin(table: string, conditions: (whereType | { column1: string; column2: string })[]): this {\n return this.join(table, 'cross', conditions);\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- export { d as QueryGrammar } from './Blueprint-CCVXLNaD.mjs';
1
+ export { d as QueryGrammar } from './Blueprint-BiMz4Je8.mjs';
package/dist/Schema.d.mts CHANGED
@@ -1 +1 @@
1
- export { S as Schema } from './Blueprint-CCVXLNaD.mjs';
1
+ export { S as Schema } from './Blueprint-BiMz4Je8.mjs';
@@ -1 +1 @@
1
- export { e as SchemaGrammar } from './Blueprint-CCVXLNaD.mjs';
1
+ export { e as SchemaGrammar } from './Blueprint-BiMz4Je8.mjs';
@@ -26,7 +26,17 @@ class SchemaGrammar {
26
26
  });
27
27
  }
28
28
  sql += [columns, primaryKeys, ...foreignKeys].join(",") + ")";
29
- return { sql, bindings: [] };
29
+ const compiledSql = { sql, bindings: [] };
30
+ if (blueprint.indexes.length > 0) {
31
+ const indexSqls = blueprint.indexes.map((index) => {
32
+ return this.compileIndex(blueprint.tableName, index);
33
+ });
34
+ return {
35
+ sql: [compiledSql.sql, ...indexSqls.map((idx) => idx.sql)].join("; "),
36
+ bindings: compiledSql.bindings
37
+ };
38
+ }
39
+ return compiledSql;
30
40
  }
31
41
  compileAlterTable(blueprint) {
32
42
  let sql = ["alter table " + blueprint.tableName];
@@ -36,8 +46,26 @@ class SchemaGrammar {
36
46
  const drop_columns = blueprint.drop_coumns.map((v) => {
37
47
  return "drop column " + v;
38
48
  });
39
- sql = sql.concat([[...add_columns, ...drop_columns].join(", ")]);
40
- return { sql: sql.join(" "), bindings: [] };
49
+ const alterStatements = [...add_columns, ...drop_columns];
50
+ if (alterStatements.length > 0) {
51
+ sql = sql.concat([alterStatements.join(", ")]);
52
+ }
53
+ let compiledSql;
54
+ if (alterStatements.length > 0) {
55
+ compiledSql = { sql: sql.join(" "), bindings: [] };
56
+ } else {
57
+ compiledSql = { sql: sql.join(" ") + " ", bindings: [] };
58
+ }
59
+ if (blueprint.indexes.length > 0) {
60
+ const indexSqls = blueprint.indexes.map((index) => {
61
+ return this.compileIndex(blueprint.tableName, index);
62
+ });
63
+ return {
64
+ sql: [compiledSql.sql, ...indexSqls.map((idx) => idx.sql)].join("; "),
65
+ bindings: compiledSql.bindings
66
+ };
67
+ }
68
+ return compiledSql;
41
69
  }
42
70
  compileColumn(column) {
43
71
  const rc = [`${column.columnName}`];
@@ -160,6 +188,13 @@ class SchemaGrammar {
160
188
  }
161
189
  return rc.join(" ");
162
190
  }
191
+ compileIndex(tableName, index) {
192
+ const indexName = index.indexName || `${tableName}_${index.columns.join("_")}_${index.unique ? "unique" : "index"}`;
193
+ const uniqueKeyword = index.unique ? "unique " : "";
194
+ const indexType = index._type ? ` using ${index._type}` : "";
195
+ const sql = `create ${uniqueKeyword}index ${indexName} on ${tableName}${indexType} (${index.columns.join(", ")})`;
196
+ return { sql, bindings: [] };
197
+ }
163
198
  }
164
199
  export {
165
200
  SchemaGrammar
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/SchemaGrammar.mts"],"sourcesContent":["import { Blueprint, Column, ForeignKeyConstraint } from './Blueprint.mjs';\nimport { Expression } from './Expression.mjs';\nimport { CompiledSql, Parameter } from './types.mjs';\n\nexport class SchemaGrammar {\n toSql(blueprint: Blueprint): string {\n if (!blueprint.existingTable) {\n return this.compileCreateTable(blueprint).sql;\n } else if (blueprint.existingTable) {\n return this.compileAlterTable(blueprint).sql;\n }\n\n throw new Error('bad blueprint to compile: ' + blueprint.tableName);\n }\n\n compileCreateTable(blueprint: Blueprint): CompiledSql {\n let sql = 'create table ' + blueprint.tableName + ' (';\n const columns = blueprint.columns\n .map((v: Column) => {\n return this.compileColumn(v);\n })\n .join(', ');\n\n const primaryKeys = this.compilePrimaryKeys(blueprint.primaryKeys);\n let foreignKeys: string[] = [];\n if (blueprint.foreignKeys.length > 0) {\n foreignKeys = blueprint.foreignKeys.map((v: ForeignKeyConstraint) => {\n return this.compileForeignKey(v);\n });\n }\n sql += [columns, primaryKeys, ...foreignKeys].join(',') + ')';\n return { sql, bindings: [] };\n }\n\n compileAlterTable(blueprint: Blueprint): CompiledSql {\n let sql: string[] = ['alter table ' + blueprint.tableName];\n const add_columns = blueprint.columns.map((v: Column) => {\n return 'add column ' + this.compileColumn(v);\n });\n\n const drop_columns = blueprint.drop_coumns.map((v: string) => {\n return 'drop column ' + v;\n });\n\n sql = sql.concat([[...add_columns, ...drop_columns].join(', ')]);\n\n return { sql: sql.join(' '), bindings: [] };\n }\n\n compileColumn(column: Column): string {\n const rc = [`${column.columnName}`];\n\n if (column.properties.type === 'string') {\n rc.push('varchar(' + column.properties.length + ')');\n } else if (column.properties.type === 'char') {\n rc.push('char');\n } else if (column.properties.type === 'boolean') {\n rc.push('boolean');\n } else if (column.properties.type === 'integer') {\n rc.push('integer');\n } else if (column.properties.type === 'text') {\n rc.push('text');\n } else if (column.properties.type === 'timestamp') {\n rc.push('timestamp');\n } else if (column.properties.type === 'timestampz') {\n rc.push('timestamp with time zone');\n } else if (column.properties.type === 'serial') {\n rc.push('serial');\n } else if (column.properties.type === 'float') {\n rc.push('float');\n } else if (column.properties.type === 'double') {\n rc.push('double precision');\n } else if (column.properties.type === 'date') {\n rc.push('date');\n } else if (column.properties.type === 'json') {\n rc.push('json');\n } else if (column.properties.type === 'jsonb') {\n rc.push('jsonb');\n } else {\n throw new Error('Unknown column type: ' + column.properties.type);\n }\n\n if (column.properties.nullable) {\n rc.push('null');\n } else {\n rc.push('not null');\n }\n\n if (column.properties.unique) {\n rc.push('unique');\n }\n\n if (column.properties.default !== null) {\n rc.push('default ' + this.escape(column.properties.default));\n }\n\n return rc.join(' ');\n }\n\n escape(value: Parameter): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n\n if (typeof value === 'number') {\n return value.toString();\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (value instanceof Date) {\n return \"'\" + value.toISOString() + \"'\";\n }\n\n if (value instanceof Expression) {\n return value.toCompiledSql().sql;\n }\n if (Array.isArray(value)) {\n return \"'{\" + value.join(',') + \"}'\";\n }\n\n return \"'\" + value.replace(\"'\", \"\\\\'\") + \"'\";\n }\n\n compilePrimaryKeys(primaryKeys: string[]): string {\n if (!primaryKeys.length) {\n return '';\n }\n\n return 'primary key (' + primaryKeys.join(', ') + ')';\n }\n\n compileTables(schema: string | string[] | undefined = undefined): CompiledSql {\n return {\n sql:\n 'select c.relname as name, n.nspname as schema, pg_total_relation_size(c.oid) as size, ' +\n \"obj_description(c.oid, 'pg_class') as comment from pg_class c, pg_namespace n \" +\n \"where c.relkind in ('r', 'p') and n.oid = c.relnamespace and \" +\n this.compileSchemaWhereClause(schema, 'n.nspname') +\n ' order by n.nspname, c.relname',\n bindings: [],\n };\n }\n\n compileTableExists(tableName: string, schema: string = ''): CompiledSql {\n return {\n sql:\n 'select exists (select 1 from pg_class c, pg_namespace n where ' +\n 'n.nspname = ' +\n (schema ? this.escape(schema) : 'current_schema()') +\n \" and c.relname = $1 and c.relkind in ('r', 'p') and n.oid = c.relnamespace)\",\n bindings: [tableName],\n };\n }\n\n compileDropTable(tableName: string): CompiledSql {\n return { sql: `drop table ${this.doubleQuoteString(tableName)}`, bindings: [] };\n }\n\n compileDropTableIfExists(tableName: string): CompiledSql {\n return { sql: `drop table if exists ${this.doubleQuoteString(tableName)}`, bindings: [] };\n }\n\n protected compileSchemaWhereClause(\n schema: string | string[] | undefined,\n column: string\n ): string {\n if (Array.isArray(schema) && schema.length > 0) {\n return `${column} in (${this.quoteString(schema)})`;\n } else if (schema && typeof schema === 'string') {\n return `${column} = ${this.quoteString(schema)}`;\n } else {\n return `${column} <> 'information_schema' and ${column} not like 'pg\\\\_%'`;\n }\n }\n\n protected quoteString(value: string | string[]): string {\n if (Array.isArray(value)) {\n return value.map((v) => `'${v.replace(/'/g, \"\\\\'\")}'`).join(', ');\n }\n return `'${value.replace(/'/g, \"\\\\'\")}'`;\n }\n\n protected doubleQuoteString(value: string | string[]): string {\n if (Array.isArray(value)) {\n return value.map((v) => this.doubleQuoteString(v)).join(', ');\n }\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n }\n\n protected compileForeignKey(foreignKey: ForeignKeyConstraint): string {\n //FOREIGN KEY (PersonID) REFERENCES users(id)\n const rc = [`FOREIGN KEY (${foreignKey.column})`];\n rc.push(`references ${foreignKey.reference_table.table}(${foreignKey.reference_table.column})`);\n\n if (foreignKey.onDeleteAction) {\n rc.push(`on delete ${foreignKey.onDeleteAction}`);\n }\n\n if (foreignKey.onUpdateAction) {\n rc.push(`on update ${foreignKey.onUpdateAction}`);\n }\n\n return rc.join(' ');\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/SchemaGrammar.mts"],"sourcesContent":["import { Blueprint, Column, ForeignKeyConstraint, IndexConstraint } from './Blueprint.mjs';\nimport { Expression } from './Expression.mjs';\nimport { CompiledSql, Parameter } from './types.mjs';\n\nexport class SchemaGrammar {\n toSql(blueprint: Blueprint): string {\n if (!blueprint.existingTable) {\n return this.compileCreateTable(blueprint).sql;\n } else if (blueprint.existingTable) {\n return this.compileAlterTable(blueprint).sql;\n }\n\n throw new Error('bad blueprint to compile: ' + blueprint.tableName);\n }\n\n compileCreateTable(blueprint: Blueprint): CompiledSql {\n let sql = 'create table ' + blueprint.tableName + ' (';\n const columns = blueprint.columns\n .map((v: Column) => {\n return this.compileColumn(v);\n })\n .join(', ');\n\n const primaryKeys = this.compilePrimaryKeys(blueprint.primaryKeys);\n let foreignKeys: string[] = [];\n if (blueprint.foreignKeys.length > 0) {\n foreignKeys = blueprint.foreignKeys.map((v: ForeignKeyConstraint) => {\n return this.compileForeignKey(v);\n });\n }\n sql += [columns, primaryKeys, ...foreignKeys].join(',') + ')';\n\n const compiledSql = { sql, bindings: [] };\n\n // If there are indexes to create, we need to return multiple statements\n if (blueprint.indexes.length > 0) {\n const indexSqls = blueprint.indexes.map((index: IndexConstraint) => {\n return this.compileIndex(blueprint.tableName, index);\n });\n return {\n sql: [compiledSql.sql, ...indexSqls.map((idx) => idx.sql)].join('; '),\n bindings: compiledSql.bindings,\n };\n }\n\n return compiledSql;\n }\n\n compileAlterTable(blueprint: Blueprint): CompiledSql {\n let sql: string[] = ['alter table ' + blueprint.tableName];\n const add_columns = blueprint.columns.map((v: Column) => {\n return 'add column ' + this.compileColumn(v);\n });\n\n const drop_columns = blueprint.drop_coumns.map((v: string) => {\n return 'drop column ' + v;\n });\n\n const alterStatements = [...add_columns, ...drop_columns];\n if (alterStatements.length > 0) {\n sql = sql.concat([alterStatements.join(', ')]);\n }\n\n // Handle case where only indexes are being added without column changes\n let compiledSql: CompiledSql;\n if (alterStatements.length > 0) {\n compiledSql = { sql: sql.join(' '), bindings: [] };\n } else {\n // No column changes, just need the base alter table statement for consistency\n compiledSql = { sql: sql.join(' ') + ' ', bindings: [] };\n }\n\n // If there are indexes to create in alter table, add them as separate statements\n if (blueprint.indexes.length > 0) {\n const indexSqls = blueprint.indexes.map((index: IndexConstraint) => {\n return this.compileIndex(blueprint.tableName, index);\n });\n return {\n sql: [compiledSql.sql, ...indexSqls.map((idx) => idx.sql)].join('; '),\n bindings: compiledSql.bindings,\n };\n }\n\n return compiledSql;\n }\n\n compileColumn(column: Column): string {\n const rc = [`${column.columnName}`];\n\n if (column.properties.type === 'string') {\n rc.push('varchar(' + column.properties.length + ')');\n } else if (column.properties.type === 'char') {\n rc.push('char');\n } else if (column.properties.type === 'boolean') {\n rc.push('boolean');\n } else if (column.properties.type === 'integer') {\n rc.push('integer');\n } else if (column.properties.type === 'text') {\n rc.push('text');\n } else if (column.properties.type === 'timestamp') {\n rc.push('timestamp');\n } else if (column.properties.type === 'timestampz') {\n rc.push('timestamp with time zone');\n } else if (column.properties.type === 'serial') {\n rc.push('serial');\n } else if (column.properties.type === 'float') {\n rc.push('float');\n } else if (column.properties.type === 'double') {\n rc.push('double precision');\n } else if (column.properties.type === 'date') {\n rc.push('date');\n } else if (column.properties.type === 'json') {\n rc.push('json');\n } else if (column.properties.type === 'jsonb') {\n rc.push('jsonb');\n } else {\n throw new Error('Unknown column type: ' + column.properties.type);\n }\n\n if (column.properties.nullable) {\n rc.push('null');\n } else {\n rc.push('not null');\n }\n\n if (column.properties.unique) {\n rc.push('unique');\n }\n\n if (column.properties.default !== null) {\n rc.push('default ' + this.escape(column.properties.default));\n }\n\n return rc.join(' ');\n }\n\n escape(value: Parameter): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n\n if (typeof value === 'number') {\n return value.toString();\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (value instanceof Date) {\n return \"'\" + value.toISOString() + \"'\";\n }\n\n if (value instanceof Expression) {\n return value.toCompiledSql().sql;\n }\n if (Array.isArray(value)) {\n return \"'{\" + value.join(',') + \"}'\";\n }\n\n return \"'\" + value.replace(\"'\", \"\\\\'\") + \"'\";\n }\n\n compilePrimaryKeys(primaryKeys: string[]): string {\n if (!primaryKeys.length) {\n return '';\n }\n\n return 'primary key (' + primaryKeys.join(', ') + ')';\n }\n\n compileTables(schema: string | string[] | undefined = undefined): CompiledSql {\n return {\n sql:\n 'select c.relname as name, n.nspname as schema, pg_total_relation_size(c.oid) as size, ' +\n \"obj_description(c.oid, 'pg_class') as comment from pg_class c, pg_namespace n \" +\n \"where c.relkind in ('r', 'p') and n.oid = c.relnamespace and \" +\n this.compileSchemaWhereClause(schema, 'n.nspname') +\n ' order by n.nspname, c.relname',\n bindings: [],\n };\n }\n\n compileTableExists(tableName: string, schema: string = ''): CompiledSql {\n return {\n sql:\n 'select exists (select 1 from pg_class c, pg_namespace n where ' +\n 'n.nspname = ' +\n (schema ? this.escape(schema) : 'current_schema()') +\n \" and c.relname = $1 and c.relkind in ('r', 'p') and n.oid = c.relnamespace)\",\n bindings: [tableName],\n };\n }\n\n compileDropTable(tableName: string): CompiledSql {\n return { sql: `drop table ${this.doubleQuoteString(tableName)}`, bindings: [] };\n }\n\n compileDropTableIfExists(tableName: string): CompiledSql {\n return { sql: `drop table if exists ${this.doubleQuoteString(tableName)}`, bindings: [] };\n }\n\n protected compileSchemaWhereClause(\n schema: string | string[] | undefined,\n column: string\n ): string {\n if (Array.isArray(schema) && schema.length > 0) {\n return `${column} in (${this.quoteString(schema)})`;\n } else if (schema && typeof schema === 'string') {\n return `${column} = ${this.quoteString(schema)}`;\n } else {\n return `${column} <> 'information_schema' and ${column} not like 'pg\\\\_%'`;\n }\n }\n\n protected quoteString(value: string | string[]): string {\n if (Array.isArray(value)) {\n return value.map((v) => `'${v.replace(/'/g, \"\\\\'\")}'`).join(', ');\n }\n return `'${value.replace(/'/g, \"\\\\'\")}'`;\n }\n\n protected doubleQuoteString(value: string | string[]): string {\n if (Array.isArray(value)) {\n return value.map((v) => this.doubleQuoteString(v)).join(', ');\n }\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n }\n\n protected compileForeignKey(foreignKey: ForeignKeyConstraint): string {\n //FOREIGN KEY (PersonID) REFERENCES users(id)\n const rc = [`FOREIGN KEY (${foreignKey.column})`];\n rc.push(`references ${foreignKey.reference_table.table}(${foreignKey.reference_table.column})`);\n\n if (foreignKey.onDeleteAction) {\n rc.push(`on delete ${foreignKey.onDeleteAction}`);\n }\n\n if (foreignKey.onUpdateAction) {\n rc.push(`on update ${foreignKey.onUpdateAction}`);\n }\n\n return rc.join(' ');\n }\n\n protected compileIndex(tableName: string, index: IndexConstraint): CompiledSql {\n const indexName =\n index.indexName ||\n `${tableName}_${index.columns.join('_')}_${index.unique ? 'unique' : 'index'}`;\n const uniqueKeyword = index.unique ? 'unique ' : '';\n const indexType = index._type ? ` using ${index._type}` : '';\n\n const sql = `create ${uniqueKeyword}index ${indexName} on ${tableName}${indexType} (${index.columns.join(', ')})`;\n\n return { sql, bindings: [] };\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  export { PostgresqlConnection } from './postgresql/PostgresqlConnection.mjs';
2
2
  export { PostgresqlQueryGrammar } from './postgresql/PostgresqlQueryGrammar.mjs';
3
3
  export { PostgresqlSchemaGrammar } from './postgresql/PostgresqlSchemaGrammar.mjs';
4
- import '../Blueprint-CCVXLNaD.mjs';
4
+ import '../Blueprint-BiMz4Je8.mjs';
5
5
  import 'pg';
@@ -1,6 +1,6 @@
1
1
  import { PostgresqlQueryGrammar } from './PostgresqlQueryGrammar.mjs';
2
2
  import { PostgresqlSchemaGrammar } from './PostgresqlSchemaGrammar.mjs';
3
- import { b as Connection, l as CompiledSql, c as Query, S as Schema } from '../../Blueprint-CCVXLNaD.mjs';
3
+ import { b as Connection, l as CompiledSql, c as Query, S as Schema } from '../../Blueprint-BiMz4Je8.mjs';
4
4
  import { PoolClient, Pool, PoolConfig } from 'pg';
5
5
 
6
6
  declare class PostgresqlConnection extends Connection {
@@ -1,4 +1,4 @@
1
- import { d as QueryGrammar, c as Query, l as CompiledSql, P as Parameter } from '../../Blueprint-CCVXLNaD.mjs';
1
+ import { d as QueryGrammar, c as Query, l as CompiledSql, P as Parameter } from '../../Blueprint-BiMz4Je8.mjs';
2
2
 
3
3
  declare class PostgresqlQueryGrammar extends QueryGrammar {
4
4
  private parameterIndex;
@@ -1,4 +1,4 @@
1
- import { e as SchemaGrammar } from '../../Blueprint-CCVXLNaD.mjs';
1
+ import { e as SchemaGrammar } from '../../Blueprint-BiMz4Je8.mjs';
2
2
 
3
3
  declare class PostgresqlSchemaGrammar extends SchemaGrammar {
4
4
  }
@@ -1,5 +1,5 @@
1
1
  export { PostgresqlConnection } from './PostgresqlConnection.mjs';
2
2
  export { PostgresqlQueryGrammar } from './PostgresqlQueryGrammar.mjs';
3
3
  export { PostgresqlSchemaGrammar } from './PostgresqlSchemaGrammar.mjs';
4
- import '../../Blueprint-CCVXLNaD.mjs';
4
+ import '../../Blueprint-BiMz4Je8.mjs';
5
5
  import 'pg';
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { PostgresqlConnection } from './databases/postgresql/PostgresqlConnection.mjs';
2
2
  export { PostgresqlQueryGrammar } from './databases/postgresql/PostgresqlQueryGrammar.mjs';
3
3
  export { PostgresqlSchemaGrammar } from './databases/postgresql/PostgresqlSchemaGrammar.mjs';
4
- export { B as Blueprint, a as Column, C as ColumnPropertiesType, l as CompiledSql, b as Connection, F as ForeignKeyConstraint, J as JoinCondition, P as Parameter, c as Query, d as QueryGrammar, Q as QueryParts, S as Schema, e as SchemaGrammar, m as havingType, n as joinType, s as selectType, w as whereBasic, h as whereNested, j as whereNull, f as whereOp, g as whereOpColumn, i as whereRaw, k as whereType } from './Blueprint-CCVXLNaD.mjs';
4
+ export { B as Blueprint, a as Column, C as ColumnPropertiesType, l as CompiledSql, b as Connection, F as ForeignKeyConstraint, I as IndexConstraint, J as JoinCondition, P as Parameter, c as Query, d as QueryGrammar, Q as QueryParts, S as Schema, e as SchemaGrammar, m as havingType, n as joinType, s as selectType, w as whereBasic, h as whereNested, j as whereNull, f as whereOp, g as whereOpColumn, i as whereRaw, k as whereType } from './Blueprint-BiMz4Je8.mjs';
5
5
  export { Migration } from './Migration.mjs';
6
6
  import 'pg';
package/dist/index.js CHANGED
@@ -35,6 +35,7 @@ __export(index_exports, {
35
35
  Column: () => Column,
36
36
  Connection: () => Connection,
37
37
  ForeignKeyConstraint: () => ForeignKeyConstraint,
38
+ IndexConstraint: () => IndexConstraint,
38
39
  Migration: () => Migration,
39
40
  PostgresqlConnection: () => PostgresqlConnection,
40
41
  PostgresqlQueryGrammar: () => PostgresqlQueryGrammar,
@@ -65,7 +66,7 @@ var Query = class _Query {
65
66
  static {
66
67
  __name(this, "Query");
67
68
  }
68
- allowedOperations = ["=", ">", "<", "!=", "like", "ilike"];
69
+ allowedOperations = ["=", ">", "<", "!=", "like", "ilike", "in"];
69
70
  parts = {
70
71
  select: ["*"],
71
72
  table: "",
@@ -575,6 +576,30 @@ var Column = class {
575
576
  return this;
576
577
  }
577
578
  };
579
+ var IndexConstraint = class {
580
+ static {
581
+ __name(this, "IndexConstraint");
582
+ }
583
+ columns;
584
+ indexName = void 0;
585
+ unique = false;
586
+ _type = void 0;
587
+ constructor(columns) {
588
+ this.columns = Array.isArray(columns) ? columns : [columns];
589
+ }
590
+ name(indexName) {
591
+ this.indexName = indexName;
592
+ return this;
593
+ }
594
+ setUnique(unique = true) {
595
+ this.unique = unique;
596
+ return this;
597
+ }
598
+ type(type) {
599
+ this._type = type;
600
+ return this;
601
+ }
602
+ };
578
603
  var ForeignKeyConstraint = class {
579
604
  static {
580
605
  __name(this, "ForeignKeyConstraint");
@@ -612,6 +637,7 @@ var Blueprint = class {
612
637
  columns = [];
613
638
  drop_coumns = [];
614
639
  foreignKeys = [];
640
+ indexes = [];
615
641
  existingTable = false;
616
642
  primaryKeys = [];
617
643
  constructor() {
@@ -712,6 +738,22 @@ var Blueprint = class {
712
738
  dropColumn(columnName) {
713
739
  this.drop_coumns.push(columnName);
714
740
  }
741
+ index(columns, indexName) {
742
+ const indexConstraint = new IndexConstraint(columns);
743
+ if (indexName) {
744
+ indexConstraint.name(indexName);
745
+ }
746
+ this.indexes.push(indexConstraint);
747
+ return indexConstraint;
748
+ }
749
+ unique(columns, indexName) {
750
+ const indexConstraint = new IndexConstraint(columns).setUnique(true);
751
+ if (indexName) {
752
+ indexConstraint.name(indexName);
753
+ }
754
+ this.indexes.push(indexConstraint);
755
+ return indexConstraint;
756
+ }
715
757
  };
716
758
 
717
759
  // src/SchemaGrammar.mts
@@ -740,7 +782,17 @@ var SchemaGrammar = class {
740
782
  });
741
783
  }
742
784
  sql += [columns, primaryKeys, ...foreignKeys].join(",") + ")";
743
- return { sql, bindings: [] };
785
+ const compiledSql = { sql, bindings: [] };
786
+ if (blueprint.indexes.length > 0) {
787
+ const indexSqls = blueprint.indexes.map((index) => {
788
+ return this.compileIndex(blueprint.tableName, index);
789
+ });
790
+ return {
791
+ sql: [compiledSql.sql, ...indexSqls.map((idx) => idx.sql)].join("; "),
792
+ bindings: compiledSql.bindings
793
+ };
794
+ }
795
+ return compiledSql;
744
796
  }
745
797
  compileAlterTable(blueprint) {
746
798
  let sql = ["alter table " + blueprint.tableName];
@@ -750,8 +802,26 @@ var SchemaGrammar = class {
750
802
  const drop_columns = blueprint.drop_coumns.map((v) => {
751
803
  return "drop column " + v;
752
804
  });
753
- sql = sql.concat([[...add_columns, ...drop_columns].join(", ")]);
754
- return { sql: sql.join(" "), bindings: [] };
805
+ const alterStatements = [...add_columns, ...drop_columns];
806
+ if (alterStatements.length > 0) {
807
+ sql = sql.concat([alterStatements.join(", ")]);
808
+ }
809
+ let compiledSql;
810
+ if (alterStatements.length > 0) {
811
+ compiledSql = { sql: sql.join(" "), bindings: [] };
812
+ } else {
813
+ compiledSql = { sql: sql.join(" ") + " ", bindings: [] };
814
+ }
815
+ if (blueprint.indexes.length > 0) {
816
+ const indexSqls = blueprint.indexes.map((index) => {
817
+ return this.compileIndex(blueprint.tableName, index);
818
+ });
819
+ return {
820
+ sql: [compiledSql.sql, ...indexSqls.map((idx) => idx.sql)].join("; "),
821
+ bindings: compiledSql.bindings
822
+ };
823
+ }
824
+ return compiledSql;
755
825
  }
756
826
  compileColumn(column) {
757
827
  const rc = [`${column.columnName}`];
@@ -874,6 +944,13 @@ var SchemaGrammar = class {
874
944
  }
875
945
  return rc.join(" ");
876
946
  }
947
+ compileIndex(tableName, index) {
948
+ const indexName = index.indexName || `${tableName}_${index.columns.join("_")}_${index.unique ? "unique" : "index"}`;
949
+ const uniqueKeyword = index.unique ? "unique " : "";
950
+ const indexType = index._type ? ` using ${index._type}` : "";
951
+ const sql = `create ${uniqueKeyword}index ${indexName} on ${tableName}${indexType} (${index.columns.join(", ")})`;
952
+ return { sql, bindings: [] };
953
+ }
877
954
  };
878
955
 
879
956
  // src/Schema.mts
@@ -1013,6 +1090,7 @@ var Migration = class {
1013
1090
  Column,
1014
1091
  Connection,
1015
1092
  ForeignKeyConstraint,
1093
+ IndexConstraint,
1016
1094
  Migration,
1017
1095
  PostgresqlConnection,
1018
1096
  PostgresqlQueryGrammar,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/Connection.mts","../src/databases/postgresql/PostgresqlConnection.mts","../src/Query.mts","../src/QueryGrammar.mts","../src/databases/postgresql/PostgresqlQueryGrammar.mts","../src/Expression.mts","../src/Blueprint.mts","../src/SchemaGrammar.mts","../src/Schema.mts","../src/databases/postgresql/PostgresqlSchemaGrammar.mts","../src/Migration.mts"],"sourcesContent":["export * from './databases/index.mjs';\nexport * from './Blueprint.mjs';\nexport * from './Connection.mjs';\nexport * from './Query.mjs';\nexport * from './QueryGrammar.mjs';\nexport * from './Schema.mjs';\nexport * from './SchemaGrammar.mjs';\nexport * from './types.mjs';\nexport * from './Migration.mjs';\n","import { Schema } from './Schema.mjs';\nimport { Query } from './Query.mjs';\nimport { CompiledSql } from './types.mjs';\nimport { QueryGrammar } from './QueryGrammar.mjs';\nimport { SchemaGrammar } from './SchemaGrammar.mjs';\n\nexport abstract class Connection {\n abstract connect(): Promise<boolean>;\n abstract runQuery(sql: CompiledSql): Promise<any>;\n abstract runCursor(sql: CompiledSql): Promise<any>;\n abstract disconnect(): Promise<boolean>;\n abstract getQuery(): Query;\n abstract getSchema(): Schema;\n abstract beginTransaction(): Promise<void>;\n abstract commit(): Promise<void>;\n abstract rollback(): Promise<void>;\n abstract getQueryGrammar(): QueryGrammar;\n abstract getSchemaGrammar(): SchemaGrammar;\n}\n","import { Connection as ConnectionAbs } from '../../Connection.mjs';\nimport { Connection, PoolClient, PoolConfig } from 'pg';\nimport { Pool } from 'pg';\nimport { CompiledSql } from '../../types.mjs';\nimport { Query } from '../../Query.mjs';\nimport { PostgresqlQueryGrammar } from './PostgresqlQueryGrammar.mjs';\nimport { Schema } from '../../Schema.mjs';\nimport { PostgresqlSchemaGrammar } from './PostgresqlSchemaGrammar.mjs';\nimport Cursor from 'pg-cursor';\n\nexport class PostgresqlConnection extends ConnectionAbs {\n connection: PoolClient | undefined;\n static pool: Pool;\n\n static defaults: PoolConfig = {\n port: 5432,\n ssl: false,\n max: 20,\n idleTimeoutMillis: 1, // wait X milli seconds before closing an idle/released connection\n connectionTimeoutMillis: 30000, // wait up to 30 seconds to obtain a new connection\n maxUses: 7500,\n };\n\n constructor(params: PoolConfig) {\n super();\n if (!PostgresqlConnection.pool) {\n PostgresqlConnection.pool = new Pool({ ...PostgresqlConnection.defaults, ...params });\n }\n }\n async connect(): Promise<boolean> {\n this.connection = await PostgresqlConnection.pool.connect();\n return true;\n }\n async runQuery(sql: CompiledSql) {\n const result = await this.connection?.query(sql.sql, sql.bindings);\n return result?.rows;\n }\n\n async runCursor(sql: CompiledSql): Promise<any> {\n return this.connection?.query(new Cursor(sql.sql, sql.bindings));\n }\n\n async disconnect(): Promise<boolean> {\n await this.connection?.release();\n return true;\n }\n\n getQuery(): Query {\n return new Query(this, new PostgresqlQueryGrammar());\n }\n\n getSchema(): Schema {\n return new Schema(this, new PostgresqlSchemaGrammar());\n }\n\n getQueryGrammar(): PostgresqlQueryGrammar {\n return new PostgresqlQueryGrammar();\n }\n getSchemaGrammar(): PostgresqlSchemaGrammar {\n return new PostgresqlSchemaGrammar();\n }\n\n async beginTransaction(): Promise<void> {\n if (!this.connection) {\n throw new Error('No active connection to begin a transaction.');\n }\n await this.connection.query('BEGIN');\n }\n\n async commit(): Promise<void> {\n if (!this.connection) {\n throw new Error('No active connection to commit a transaction.');\n }\n await this.connection.query('COMMIT');\n }\n\n async rollback(): Promise<void> {\n if (!this.connection) {\n throw new Error('No active connection to rollback a transaction.');\n }\n await this.connection.query('ROLLBACK');\n }\n\n static async destroy(): Promise<void> {\n PostgresqlConnection.pool.end();\n return;\n }\n}\n","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 join(\n table: string,\n type: joinType['type'],\n conditions: whereType[] | { column1: string; column2: string }[]\n ): 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, table, conditions: conditions_corrected });\n return this;\n }\n\n innerJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n return this.join(table, 'inner', conditions);\n }\n\n leftJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n return this.join(table, 'left', conditions);\n }\n\n rightJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n return this.join(table, 'right', conditions);\n }\n\n fullJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n return this.join(table, 'full', conditions);\n }\n\n crossJoin(table: string, conditions: whereType[] | { column1: string; column2: string }[]): this {\n return this.join(table, 'cross', conditions);\n }\n}\n","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","import { Query } from '../../Query.mjs';\nimport { QueryGrammar } from '../../QueryGrammar.mjs';\nimport { CompiledSql, Parameter } from '../../types.mjs';\n\nexport class PostgresqlQueryGrammar extends QueryGrammar {\n private parameterIndex: number;\n constructor() {\n super();\n this.parameterIndex = 1;\n }\n\n toSql(query: Query): CompiledSql {\n this.parameterIndex = 1;\n return super.toSql(query);\n }\n\n getVariablePlaceholder(): string {\n return '$' + this.parameterIndex++;\n }\n\n compileInsert(query: Query, data: Record<string, any>): CompiledSql {\n this.parameterIndex = 1;\n return super.compileInsert(query, data);\n }\n\n compileInsertGetId(\n query: Query,\n data: Record<string, any>,\n options: { primaryKey: string[] } = { primaryKey: ['id'] }\n ): CompiledSql {\n this.parameterIndex = 1;\n const rc = super.compileInsert(query, data);\n rc.sql += ` RETURNING ${options.primaryKey.join(', ')}`;\n return rc;\n }\n\n compileUpdate(query: Query, data: Record<string, any>): CompiledSql {\n this.parameterIndex = 1;\n return super.compileUpdate(query, data);\n }\n\n compileDelete(query: Query): CompiledSql {\n this.parameterIndex = 1;\n return super.compileDelete(query);\n }\n\n compileUpsert(\n query: Query,\n data: Record<string, Parameter>,\n conflictFields: string[],\n updateFields: string[]\n ): CompiledSql {\n this.parameterIndex = 1;\n return super.compileUpsert(query, data, conflictFields, updateFields);\n }\n\n compileCount(query: Query): CompiledSql {\n this.parameterIndex = 1;\n return super.compileCount(query);\n }\n}\n","import { CompiledSql } from './types.mjs';\n\nexport class Expression {\n constructor(\n private sql = '',\n private bindings = []\n ) {}\n\n toCompiledSql(): CompiledSql {\n return { sql: this.sql, bindings: this.bindings };\n }\n}\n","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","import { Blueprint, Column, ForeignKeyConstraint } from './Blueprint.mjs';\nimport { Expression } from './Expression.mjs';\nimport { CompiledSql, Parameter } from './types.mjs';\n\nexport class SchemaGrammar {\n toSql(blueprint: Blueprint): string {\n if (!blueprint.existingTable) {\n return this.compileCreateTable(blueprint).sql;\n } else if (blueprint.existingTable) {\n return this.compileAlterTable(blueprint).sql;\n }\n\n throw new Error('bad blueprint to compile: ' + blueprint.tableName);\n }\n\n compileCreateTable(blueprint: Blueprint): CompiledSql {\n let sql = 'create table ' + blueprint.tableName + ' (';\n const columns = blueprint.columns\n .map((v: Column) => {\n return this.compileColumn(v);\n })\n .join(', ');\n\n const primaryKeys = this.compilePrimaryKeys(blueprint.primaryKeys);\n let foreignKeys: string[] = [];\n if (blueprint.foreignKeys.length > 0) {\n foreignKeys = blueprint.foreignKeys.map((v: ForeignKeyConstraint) => {\n return this.compileForeignKey(v);\n });\n }\n sql += [columns, primaryKeys, ...foreignKeys].join(',') + ')';\n return { sql, bindings: [] };\n }\n\n compileAlterTable(blueprint: Blueprint): CompiledSql {\n let sql: string[] = ['alter table ' + blueprint.tableName];\n const add_columns = blueprint.columns.map((v: Column) => {\n return 'add column ' + this.compileColumn(v);\n });\n\n const drop_columns = blueprint.drop_coumns.map((v: string) => {\n return 'drop column ' + v;\n });\n\n sql = sql.concat([[...add_columns, ...drop_columns].join(', ')]);\n\n return { sql: sql.join(' '), bindings: [] };\n }\n\n compileColumn(column: Column): string {\n const rc = [`${column.columnName}`];\n\n if (column.properties.type === 'string') {\n rc.push('varchar(' + column.properties.length + ')');\n } else if (column.properties.type === 'char') {\n rc.push('char');\n } else if (column.properties.type === 'boolean') {\n rc.push('boolean');\n } else if (column.properties.type === 'integer') {\n rc.push('integer');\n } else if (column.properties.type === 'text') {\n rc.push('text');\n } else if (column.properties.type === 'timestamp') {\n rc.push('timestamp');\n } else if (column.properties.type === 'timestampz') {\n rc.push('timestamp with time zone');\n } else if (column.properties.type === 'serial') {\n rc.push('serial');\n } else if (column.properties.type === 'float') {\n rc.push('float');\n } else if (column.properties.type === 'double') {\n rc.push('double precision');\n } else if (column.properties.type === 'date') {\n rc.push('date');\n } else if (column.properties.type === 'json') {\n rc.push('json');\n } else if (column.properties.type === 'jsonb') {\n rc.push('jsonb');\n } else {\n throw new Error('Unknown column type: ' + column.properties.type);\n }\n\n if (column.properties.nullable) {\n rc.push('null');\n } else {\n rc.push('not null');\n }\n\n if (column.properties.unique) {\n rc.push('unique');\n }\n\n if (column.properties.default !== null) {\n rc.push('default ' + this.escape(column.properties.default));\n }\n\n return rc.join(' ');\n }\n\n escape(value: Parameter): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n\n if (typeof value === 'number') {\n return value.toString();\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (value instanceof Date) {\n return \"'\" + value.toISOString() + \"'\";\n }\n\n if (value instanceof Expression) {\n return value.toCompiledSql().sql;\n }\n if (Array.isArray(value)) {\n return \"'{\" + value.join(',') + \"}'\";\n }\n\n return \"'\" + value.replace(\"'\", \"\\\\'\") + \"'\";\n }\n\n compilePrimaryKeys(primaryKeys: string[]): string {\n if (!primaryKeys.length) {\n return '';\n }\n\n return 'primary key (' + primaryKeys.join(', ') + ')';\n }\n\n compileTables(schema: string | string[] | undefined = undefined): CompiledSql {\n return {\n sql:\n 'select c.relname as name, n.nspname as schema, pg_total_relation_size(c.oid) as size, ' +\n \"obj_description(c.oid, 'pg_class') as comment from pg_class c, pg_namespace n \" +\n \"where c.relkind in ('r', 'p') and n.oid = c.relnamespace and \" +\n this.compileSchemaWhereClause(schema, 'n.nspname') +\n ' order by n.nspname, c.relname',\n bindings: [],\n };\n }\n\n compileTableExists(tableName: string, schema: string = ''): CompiledSql {\n return {\n sql:\n 'select exists (select 1 from pg_class c, pg_namespace n where ' +\n 'n.nspname = ' +\n (schema ? this.escape(schema) : 'current_schema()') +\n \" and c.relname = $1 and c.relkind in ('r', 'p') and n.oid = c.relnamespace)\",\n bindings: [tableName],\n };\n }\n\n compileDropTable(tableName: string): CompiledSql {\n return { sql: `drop table ${this.doubleQuoteString(tableName)}`, bindings: [] };\n }\n\n compileDropTableIfExists(tableName: string): CompiledSql {\n return { sql: `drop table if exists ${this.doubleQuoteString(tableName)}`, bindings: [] };\n }\n\n protected compileSchemaWhereClause(\n schema: string | string[] | undefined,\n column: string\n ): string {\n if (Array.isArray(schema) && schema.length > 0) {\n return `${column} in (${this.quoteString(schema)})`;\n } else if (schema && typeof schema === 'string') {\n return `${column} = ${this.quoteString(schema)}`;\n } else {\n return `${column} <> 'information_schema' and ${column} not like 'pg\\\\_%'`;\n }\n }\n\n protected quoteString(value: string | string[]): string {\n if (Array.isArray(value)) {\n return value.map((v) => `'${v.replace(/'/g, \"\\\\'\")}'`).join(', ');\n }\n return `'${value.replace(/'/g, \"\\\\'\")}'`;\n }\n\n protected doubleQuoteString(value: string | string[]): string {\n if (Array.isArray(value)) {\n return value.map((v) => this.doubleQuoteString(v)).join(', ');\n }\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n }\n\n protected compileForeignKey(foreignKey: ForeignKeyConstraint): string {\n //FOREIGN KEY (PersonID) REFERENCES users(id)\n const rc = [`FOREIGN KEY (${foreignKey.column})`];\n rc.push(`references ${foreignKey.reference_table.table}(${foreignKey.reference_table.column})`);\n\n if (foreignKey.onDeleteAction) {\n rc.push(`on delete ${foreignKey.onDeleteAction}`);\n }\n\n if (foreignKey.onUpdateAction) {\n rc.push(`on update ${foreignKey.onUpdateAction}`);\n }\n\n return rc.join(' ');\n }\n}\n","import { Blueprint } from './Blueprint.mjs';\nimport { Connection } from './Connection.mjs';\nimport { SchemaGrammar } from './SchemaGrammar.mjs';\n\nexport class Schema {\n constructor(\n private readonly connection: Connection | null,\n private readonly grammar: SchemaGrammar\n ) {}\n\n async createTable(tableName: string, structMethod: (blueprint: Blueprint) => void) {\n const blueprint = new Blueprint();\n blueprint.setTableName(tableName, false);\n structMethod(blueprint);\n\n const grammar = new SchemaGrammar();\n const sql = grammar.toSql(blueprint);\n await this.connection?.runQuery({ sql, bindings: [] });\n }\n\n async alterTable(tableName: string, structMethod: (blueprint: Blueprint) => void) {\n const blueprint = new Blueprint();\n blueprint.setTableName(tableName, true);\n structMethod(blueprint);\n\n const grammar = new SchemaGrammar();\n const sql = grammar.toSql(blueprint);\n await this.connection?.runQuery({ sql, bindings: [] });\n }\n\n async dropTable(tableName: string) {\n const grammar = new SchemaGrammar();\n await this.connection?.runQuery(grammar.compileDropTable(tableName));\n }\n\n async dropTableIfExists(tableName: string) {\n const grammar = new SchemaGrammar();\n await this.connection?.runQuery(grammar.compileDropTableIfExists(tableName));\n }\n\n async tables() {\n const grammar = new SchemaGrammar();\n return await this.connection?.runQuery(grammar.compileTables());\n }\n\n async tableExists(table_name: string): Promise<boolean> {\n const grammar = new SchemaGrammar();\n return (await this.connection?.runQuery(grammar.compileTableExists(table_name)))[0]['exists'];\n }\n}\n","import { SchemaGrammar } from '../../SchemaGrammar.mjs';\n\nexport class PostgresqlSchemaGrammar extends SchemaGrammar {}\n","import { Schema } from './Schema.mjs';\n\nexport abstract class Migration {\n abstract up(schema: Schema): Promise<void>;\n abstract down(schema: Schema): Promise<void>;\n}\n"],"mappings":"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","names":["Cursor"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/Connection.mts","../src/databases/postgresql/PostgresqlConnection.mts","../src/Query.mts","../src/QueryGrammar.mts","../src/databases/postgresql/PostgresqlQueryGrammar.mts","../src/Expression.mts","../src/Blueprint.mts","../src/SchemaGrammar.mts","../src/Schema.mts","../src/databases/postgresql/PostgresqlSchemaGrammar.mts","../src/Migration.mts"],"sourcesContent":["export * from './databases/index.mjs';\nexport * from './Blueprint.mjs';\nexport * from './Connection.mjs';\nexport * from './Query.mjs';\nexport * from './QueryGrammar.mjs';\nexport * from './Schema.mjs';\nexport * from './SchemaGrammar.mjs';\nexport * from './types.mjs';\nexport * from './Migration.mjs';\n","import { Schema } from './Schema.mjs';\nimport { Query } from './Query.mjs';\nimport { CompiledSql } from './types.mjs';\nimport { QueryGrammar } from './QueryGrammar.mjs';\nimport { SchemaGrammar } from './SchemaGrammar.mjs';\n\nexport abstract class Connection {\n abstract connect(): Promise<boolean>;\n abstract runQuery(sql: CompiledSql): Promise<any>;\n abstract runCursor(sql: CompiledSql): Promise<any>;\n abstract disconnect(): Promise<boolean>;\n abstract getQuery(): Query;\n abstract getSchema(): Schema;\n abstract beginTransaction(): Promise<void>;\n abstract commit(): Promise<void>;\n abstract rollback(): Promise<void>;\n abstract getQueryGrammar(): QueryGrammar;\n abstract getSchemaGrammar(): SchemaGrammar;\n}\n","import { Connection as ConnectionAbs } from '../../Connection.mjs';\nimport { Connection, PoolClient, PoolConfig } from 'pg';\nimport { Pool } from 'pg';\nimport { CompiledSql } from '../../types.mjs';\nimport { Query } from '../../Query.mjs';\nimport { PostgresqlQueryGrammar } from './PostgresqlQueryGrammar.mjs';\nimport { Schema } from '../../Schema.mjs';\nimport { PostgresqlSchemaGrammar } from './PostgresqlSchemaGrammar.mjs';\nimport Cursor from 'pg-cursor';\n\nexport class PostgresqlConnection extends ConnectionAbs {\n connection: PoolClient | undefined;\n static pool: Pool;\n\n static defaults: PoolConfig = {\n port: 5432,\n ssl: false,\n max: 20,\n idleTimeoutMillis: 1, // wait X milli seconds before closing an idle/released connection\n connectionTimeoutMillis: 30000, // wait up to 30 seconds to obtain a new connection\n maxUses: 7500,\n };\n\n constructor(params: PoolConfig) {\n super();\n if (!PostgresqlConnection.pool) {\n PostgresqlConnection.pool = new Pool({ ...PostgresqlConnection.defaults, ...params });\n }\n }\n async connect(): Promise<boolean> {\n this.connection = await PostgresqlConnection.pool.connect();\n return true;\n }\n async runQuery(sql: CompiledSql) {\n const result = await this.connection?.query(sql.sql, sql.bindings);\n return result?.rows;\n }\n\n async runCursor(sql: CompiledSql): Promise<any> {\n return this.connection?.query(new Cursor(sql.sql, sql.bindings));\n }\n\n async disconnect(): Promise<boolean> {\n await this.connection?.release();\n return true;\n }\n\n getQuery(): Query {\n return new Query(this, new PostgresqlQueryGrammar());\n }\n\n getSchema(): Schema {\n return new Schema(this, new PostgresqlSchemaGrammar());\n }\n\n getQueryGrammar(): PostgresqlQueryGrammar {\n return new PostgresqlQueryGrammar();\n }\n getSchemaGrammar(): PostgresqlSchemaGrammar {\n return new PostgresqlSchemaGrammar();\n }\n\n async beginTransaction(): Promise<void> {\n if (!this.connection) {\n throw new Error('No active connection to begin a transaction.');\n }\n await this.connection.query('BEGIN');\n }\n\n async commit(): Promise<void> {\n if (!this.connection) {\n throw new Error('No active connection to commit a transaction.');\n }\n await this.connection.query('COMMIT');\n }\n\n async rollback(): Promise<void> {\n if (!this.connection) {\n throw new Error('No active connection to rollback a transaction.');\n }\n await this.connection.query('ROLLBACK');\n }\n\n static async destroy(): Promise<void> {\n PostgresqlConnection.pool.end();\n return;\n }\n}\n","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', 'in'];\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 join(\n table: string,\n type: joinType['type'],\n conditions: (whereType | { column1: string; column2: string })[]\n ): 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, table, conditions: conditions_corrected });\n return this;\n }\n\n innerJoin(table: string, conditions: (whereType | { column1: string; column2: string })[]): this {\n return this.join(table, 'inner', conditions);\n }\n\n leftJoin(table: string, conditions: (whereType | { column1: string; column2: string })[]): this {\n return this.join(table, 'left', conditions);\n }\n\n rightJoin(table: string, conditions: (whereType | { column1: string; column2: string })[]): this {\n return this.join(table, 'right', conditions);\n }\n\n fullJoin(table: string, conditions: (whereType | { column1: string; column2: string })[]): this {\n return this.join(table, 'full', conditions);\n }\n\n crossJoin(table: string, conditions: (whereType | { column1: string; column2: string })[]): this {\n return this.join(table, 'cross', conditions);\n }\n}\n","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","import { Query } from '../../Query.mjs';\nimport { QueryGrammar } from '../../QueryGrammar.mjs';\nimport { CompiledSql, Parameter } from '../../types.mjs';\n\nexport class PostgresqlQueryGrammar extends QueryGrammar {\n private parameterIndex: number;\n constructor() {\n super();\n this.parameterIndex = 1;\n }\n\n toSql(query: Query): CompiledSql {\n this.parameterIndex = 1;\n return super.toSql(query);\n }\n\n getVariablePlaceholder(): string {\n return '$' + this.parameterIndex++;\n }\n\n compileInsert(query: Query, data: Record<string, any>): CompiledSql {\n this.parameterIndex = 1;\n return super.compileInsert(query, data);\n }\n\n compileInsertGetId(\n query: Query,\n data: Record<string, any>,\n options: { primaryKey: string[] } = { primaryKey: ['id'] }\n ): CompiledSql {\n this.parameterIndex = 1;\n const rc = super.compileInsert(query, data);\n rc.sql += ` RETURNING ${options.primaryKey.join(', ')}`;\n return rc;\n }\n\n compileUpdate(query: Query, data: Record<string, any>): CompiledSql {\n this.parameterIndex = 1;\n return super.compileUpdate(query, data);\n }\n\n compileDelete(query: Query): CompiledSql {\n this.parameterIndex = 1;\n return super.compileDelete(query);\n }\n\n compileUpsert(\n query: Query,\n data: Record<string, Parameter>,\n conflictFields: string[],\n updateFields: string[]\n ): CompiledSql {\n this.parameterIndex = 1;\n return super.compileUpsert(query, data, conflictFields, updateFields);\n }\n\n compileCount(query: Query): CompiledSql {\n this.parameterIndex = 1;\n return super.compileCount(query);\n }\n}\n","import { CompiledSql } from './types.mjs';\n\nexport class Expression {\n constructor(\n private sql = '',\n private bindings = []\n ) {}\n\n toCompiledSql(): CompiledSql {\n return { sql: this.sql, bindings: this.bindings };\n }\n}\n","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// Index constraint for creating database indexes\nexport class IndexConstraint {\n columns: string[];\n indexName: string | undefined = undefined;\n unique: boolean = false;\n _type: 'gin' | 'btree' | 'hash' | 'gist' | 'spgist' | 'brin' | undefined = undefined;\n\n constructor(columns: string | string[]) {\n this.columns = Array.isArray(columns) ? columns : [columns];\n }\n\n name(indexName: string) {\n this.indexName = indexName;\n return this;\n }\n\n setUnique(unique: boolean = true) {\n this.unique = unique;\n return this;\n }\n\n type(type: typeof this._type) {\n this._type = type;\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 indexes: IndexConstraint[] = [];\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 index(columns: string | string[], indexName?: string) {\n const indexConstraint = new IndexConstraint(columns);\n if (indexName) {\n indexConstraint.name(indexName);\n }\n this.indexes.push(indexConstraint);\n return indexConstraint;\n }\n\n unique(columns: string | string[], indexName?: string) {\n const indexConstraint = new IndexConstraint(columns).setUnique(true);\n if (indexName) {\n indexConstraint.name(indexName);\n }\n this.indexes.push(indexConstraint);\n return indexConstraint;\n }\n}\n","import { Blueprint, Column, ForeignKeyConstraint, IndexConstraint } from './Blueprint.mjs';\nimport { Expression } from './Expression.mjs';\nimport { CompiledSql, Parameter } from './types.mjs';\n\nexport class SchemaGrammar {\n toSql(blueprint: Blueprint): string {\n if (!blueprint.existingTable) {\n return this.compileCreateTable(blueprint).sql;\n } else if (blueprint.existingTable) {\n return this.compileAlterTable(blueprint).sql;\n }\n\n throw new Error('bad blueprint to compile: ' + blueprint.tableName);\n }\n\n compileCreateTable(blueprint: Blueprint): CompiledSql {\n let sql = 'create table ' + blueprint.tableName + ' (';\n const columns = blueprint.columns\n .map((v: Column) => {\n return this.compileColumn(v);\n })\n .join(', ');\n\n const primaryKeys = this.compilePrimaryKeys(blueprint.primaryKeys);\n let foreignKeys: string[] = [];\n if (blueprint.foreignKeys.length > 0) {\n foreignKeys = blueprint.foreignKeys.map((v: ForeignKeyConstraint) => {\n return this.compileForeignKey(v);\n });\n }\n sql += [columns, primaryKeys, ...foreignKeys].join(',') + ')';\n\n const compiledSql = { sql, bindings: [] };\n\n // If there are indexes to create, we need to return multiple statements\n if (blueprint.indexes.length > 0) {\n const indexSqls = blueprint.indexes.map((index: IndexConstraint) => {\n return this.compileIndex(blueprint.tableName, index);\n });\n return {\n sql: [compiledSql.sql, ...indexSqls.map((idx) => idx.sql)].join('; '),\n bindings: compiledSql.bindings,\n };\n }\n\n return compiledSql;\n }\n\n compileAlterTable(blueprint: Blueprint): CompiledSql {\n let sql: string[] = ['alter table ' + blueprint.tableName];\n const add_columns = blueprint.columns.map((v: Column) => {\n return 'add column ' + this.compileColumn(v);\n });\n\n const drop_columns = blueprint.drop_coumns.map((v: string) => {\n return 'drop column ' + v;\n });\n\n const alterStatements = [...add_columns, ...drop_columns];\n if (alterStatements.length > 0) {\n sql = sql.concat([alterStatements.join(', ')]);\n }\n\n // Handle case where only indexes are being added without column changes\n let compiledSql: CompiledSql;\n if (alterStatements.length > 0) {\n compiledSql = { sql: sql.join(' '), bindings: [] };\n } else {\n // No column changes, just need the base alter table statement for consistency\n compiledSql = { sql: sql.join(' ') + ' ', bindings: [] };\n }\n\n // If there are indexes to create in alter table, add them as separate statements\n if (blueprint.indexes.length > 0) {\n const indexSqls = blueprint.indexes.map((index: IndexConstraint) => {\n return this.compileIndex(blueprint.tableName, index);\n });\n return {\n sql: [compiledSql.sql, ...indexSqls.map((idx) => idx.sql)].join('; '),\n bindings: compiledSql.bindings,\n };\n }\n\n return compiledSql;\n }\n\n compileColumn(column: Column): string {\n const rc = [`${column.columnName}`];\n\n if (column.properties.type === 'string') {\n rc.push('varchar(' + column.properties.length + ')');\n } else if (column.properties.type === 'char') {\n rc.push('char');\n } else if (column.properties.type === 'boolean') {\n rc.push('boolean');\n } else if (column.properties.type === 'integer') {\n rc.push('integer');\n } else if (column.properties.type === 'text') {\n rc.push('text');\n } else if (column.properties.type === 'timestamp') {\n rc.push('timestamp');\n } else if (column.properties.type === 'timestampz') {\n rc.push('timestamp with time zone');\n } else if (column.properties.type === 'serial') {\n rc.push('serial');\n } else if (column.properties.type === 'float') {\n rc.push('float');\n } else if (column.properties.type === 'double') {\n rc.push('double precision');\n } else if (column.properties.type === 'date') {\n rc.push('date');\n } else if (column.properties.type === 'json') {\n rc.push('json');\n } else if (column.properties.type === 'jsonb') {\n rc.push('jsonb');\n } else {\n throw new Error('Unknown column type: ' + column.properties.type);\n }\n\n if (column.properties.nullable) {\n rc.push('null');\n } else {\n rc.push('not null');\n }\n\n if (column.properties.unique) {\n rc.push('unique');\n }\n\n if (column.properties.default !== null) {\n rc.push('default ' + this.escape(column.properties.default));\n }\n\n return rc.join(' ');\n }\n\n escape(value: Parameter): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n\n if (typeof value === 'number') {\n return value.toString();\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (value instanceof Date) {\n return \"'\" + value.toISOString() + \"'\";\n }\n\n if (value instanceof Expression) {\n return value.toCompiledSql().sql;\n }\n if (Array.isArray(value)) {\n return \"'{\" + value.join(',') + \"}'\";\n }\n\n return \"'\" + value.replace(\"'\", \"\\\\'\") + \"'\";\n }\n\n compilePrimaryKeys(primaryKeys: string[]): string {\n if (!primaryKeys.length) {\n return '';\n }\n\n return 'primary key (' + primaryKeys.join(', ') + ')';\n }\n\n compileTables(schema: string | string[] | undefined = undefined): CompiledSql {\n return {\n sql:\n 'select c.relname as name, n.nspname as schema, pg_total_relation_size(c.oid) as size, ' +\n \"obj_description(c.oid, 'pg_class') as comment from pg_class c, pg_namespace n \" +\n \"where c.relkind in ('r', 'p') and n.oid = c.relnamespace and \" +\n this.compileSchemaWhereClause(schema, 'n.nspname') +\n ' order by n.nspname, c.relname',\n bindings: [],\n };\n }\n\n compileTableExists(tableName: string, schema: string = ''): CompiledSql {\n return {\n sql:\n 'select exists (select 1 from pg_class c, pg_namespace n where ' +\n 'n.nspname = ' +\n (schema ? this.escape(schema) : 'current_schema()') +\n \" and c.relname = $1 and c.relkind in ('r', 'p') and n.oid = c.relnamespace)\",\n bindings: [tableName],\n };\n }\n\n compileDropTable(tableName: string): CompiledSql {\n return { sql: `drop table ${this.doubleQuoteString(tableName)}`, bindings: [] };\n }\n\n compileDropTableIfExists(tableName: string): CompiledSql {\n return { sql: `drop table if exists ${this.doubleQuoteString(tableName)}`, bindings: [] };\n }\n\n protected compileSchemaWhereClause(\n schema: string | string[] | undefined,\n column: string\n ): string {\n if (Array.isArray(schema) && schema.length > 0) {\n return `${column} in (${this.quoteString(schema)})`;\n } else if (schema && typeof schema === 'string') {\n return `${column} = ${this.quoteString(schema)}`;\n } else {\n return `${column} <> 'information_schema' and ${column} not like 'pg\\\\_%'`;\n }\n }\n\n protected quoteString(value: string | string[]): string {\n if (Array.isArray(value)) {\n return value.map((v) => `'${v.replace(/'/g, \"\\\\'\")}'`).join(', ');\n }\n return `'${value.replace(/'/g, \"\\\\'\")}'`;\n }\n\n protected doubleQuoteString(value: string | string[]): string {\n if (Array.isArray(value)) {\n return value.map((v) => this.doubleQuoteString(v)).join(', ');\n }\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n }\n\n protected compileForeignKey(foreignKey: ForeignKeyConstraint): string {\n //FOREIGN KEY (PersonID) REFERENCES users(id)\n const rc = [`FOREIGN KEY (${foreignKey.column})`];\n rc.push(`references ${foreignKey.reference_table.table}(${foreignKey.reference_table.column})`);\n\n if (foreignKey.onDeleteAction) {\n rc.push(`on delete ${foreignKey.onDeleteAction}`);\n }\n\n if (foreignKey.onUpdateAction) {\n rc.push(`on update ${foreignKey.onUpdateAction}`);\n }\n\n return rc.join(' ');\n }\n\n protected compileIndex(tableName: string, index: IndexConstraint): CompiledSql {\n const indexName =\n index.indexName ||\n `${tableName}_${index.columns.join('_')}_${index.unique ? 'unique' : 'index'}`;\n const uniqueKeyword = index.unique ? 'unique ' : '';\n const indexType = index._type ? ` using ${index._type}` : '';\n\n const sql = `create ${uniqueKeyword}index ${indexName} on ${tableName}${indexType} (${index.columns.join(', ')})`;\n\n return { sql, bindings: [] };\n }\n}\n","import { Blueprint } from './Blueprint.mjs';\nimport { Connection } from './Connection.mjs';\nimport { SchemaGrammar } from './SchemaGrammar.mjs';\n\nexport class Schema {\n constructor(\n private readonly connection: Connection | null,\n private readonly grammar: SchemaGrammar\n ) {}\n\n async createTable(tableName: string, structMethod: (blueprint: Blueprint) => void) {\n const blueprint = new Blueprint();\n blueprint.setTableName(tableName, false);\n structMethod(blueprint);\n\n const grammar = new SchemaGrammar();\n const sql = grammar.toSql(blueprint);\n await this.connection?.runQuery({ sql, bindings: [] });\n }\n\n async alterTable(tableName: string, structMethod: (blueprint: Blueprint) => void) {\n const blueprint = new Blueprint();\n blueprint.setTableName(tableName, true);\n structMethod(blueprint);\n\n const grammar = new SchemaGrammar();\n const sql = grammar.toSql(blueprint);\n await this.connection?.runQuery({ sql, bindings: [] });\n }\n\n async dropTable(tableName: string) {\n const grammar = new SchemaGrammar();\n await this.connection?.runQuery(grammar.compileDropTable(tableName));\n }\n\n async dropTableIfExists(tableName: string) {\n const grammar = new SchemaGrammar();\n await this.connection?.runQuery(grammar.compileDropTableIfExists(tableName));\n }\n\n async tables() {\n const grammar = new SchemaGrammar();\n return await this.connection?.runQuery(grammar.compileTables());\n }\n\n async tableExists(table_name: string): Promise<boolean> {\n const grammar = new SchemaGrammar();\n return (await this.connection?.runQuery(grammar.compileTableExists(table_name)))[0]['exists'];\n }\n}\n","import { SchemaGrammar } from '../../SchemaGrammar.mjs';\n\nexport class PostgresqlSchemaGrammar extends SchemaGrammar {}\n","import { Schema } from './Schema.mjs';\n\nexport abstract class Migration {\n abstract up(schema: Schema): Promise<void>;\n abstract down(schema: Schema): Promise<void>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;ACMO,IAAe,aAAf,MAA0B;AAAA,EANjC,OAMiC;AAAA;AAAA;AAYjC;;;AChBA,gBAAqB;;;ACsBd,IAAM,QAAN,MAAM,OAAM;AAAA,EAcjB,YACkB,YACA,SAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAzCL,OAwBmB;AAAA;AAAA;AAAA,EACjB,oBAA8B,CAAC,KAAK,KAAK,KAAK,MAAM,QAAQ,SAAS,IAAI;AAAA,EACzE,QAAoB;AAAA,IAClB,QAAQ,CAAC,GAAG;AAAA,IACZ,OAAO;AAAA,IACP,MAAM,CAAC;AAAA,IACP,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EAOA,MAAM,WAAyB;AAC7B,SAAK,MAAM,QAAQ;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,YACE,MACA,gBAA+B,OAC/B,kBAA2B,OAC3B;AACA,UAAM,WAAW,IAAI,OAAM,KAAK,YAAY,KAAK,OAAO;AACxD,SAAK,QAAQ;AACb,SAAK,MAAM,MAAM,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,QACE,QACA,WACA,OACA,gBAA+B,OAC/B,kBAA2B,OACrB;AACN,SAAK,MAAM,MAAM,KAAK;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,YACE,SACA,WACA,SACA,gBAA+B,OAC/B,kBAA2B,OACrB;AACN,SAAK,MAAM,MAAM,KAAK;AAAA,MACpB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,UACE,QACA,gBAA+B,OAC/B,kBAA2B,OACrB;AACN,SAAK,MAAM,MAAM,KAAK,EAAE,MAAM,QAAQ,QAAQ,eAAe,gBAAgB,CAAC;AAC9E,WAAO;AAAA,EACT;AAAA,EAEA,aAAmB;AACjB,SAAK,MAAM,QAAQ,CAAC;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAA6B;AAClC,SAAK,MAAM,SAAS,CAAC,GAAG,OAAO;AAC/B,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,SAAyB;AAC/B,SAAK,MAAM,UAAU,CAAC,GAAG,OAAO;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,SACE,QACA,WACA,OACA,gBAA+B,OAC/B,kBAA2B,OACrB;AACN,SAAK,MAAM,OAAO,KAAK;AAAA,MACrB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,UACE,KACA,UACA,gBAA+B,OAC/B,kBAA2B,OACrB;AACN,SAAK,MAAM,OAAO,KAAK,EAAE,MAAM,OAAO,KAAK,UAAU,eAAe,gBAAgB,CAAC;AACrF,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,QAAgB,YAA4B,OAAa;AAC/D,SAAK,MAAM,QAAQ,KAAK,GAAG,MAAM,IAAI,SAAS,EAAE;AAChD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAqB;AACzB,SAAK,MAAM,QAAQ;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAsB;AAC3B,SAAK,MAAM,SAAS;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,QAAqB;AACnB,WAAO,KAAK,QAAQ,MAAM,IAAI;AAAA,EAChC;AAAA,EAEA,MAAM,MAAM;AACV,WAAO,MAAM,KAAK,YAAY,SAAS,KAAK,MAAM,CAAC;AAAA,EACrD;AAAA,EAEA,MAAM,QAAyB;AAC7B,UAAM,OAAoB,KAAK,QAAQ,aAAa,IAAI;AACxD,UAAM,SAAS,MAAM,KAAK,YAAY,SAAS,IAAI;AACnD,QAAI,UAAU,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,GAAG;AACxD,aAAO,SAAS,OAAO,CAAC,EAAE,OAAO,GAAG,EAAE;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY;AAChB,WAAO,MAAM,KAAK,YAAY,UAAU,KAAK,MAAM,CAAC;AAAA,EACtD;AAAA,EAEA,gBAAmC;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAAO,MAAiC;AAC5C,UAAM,OAAoB,KAAK,QAAQ,cAAc,MAAM,IAAI;AAC/D,WAAO,MAAM,KAAK,YAAY,SAAS,IAAI;AAAA,EAC7C;AAAA,EAEA,MAAM,YACJ,MACA,UAAoC,EAAE,YAAY,CAAC,IAAI,EAAE,GACzD;AACA,UAAM,OAAoB,KAAK,QAAQ,mBAAmB,MAAM,MAAM,OAAO;AAC7E,WAAO,MAAM,KAAK,YAAY,SAAS,IAAI;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAO,MAAiC;AAC5C,UAAM,OAAoB,KAAK,QAAQ,cAAc,MAAM,IAAI;AAC/D,WAAO,MAAM,KAAK,YAAY,SAAS,IAAI;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAO,MAAiC,eAAyB,eAAyB;AAC9F,UAAM,OAAoB,KAAK,QAAQ,cAAc,MAAM,MAAM,eAAe,aAAa;AAC7F,WAAO,MAAM,KAAK,YAAY,SAAS,IAAI;AAAA,EAC7C;AAAA,EAEA,MAAM,SAAS;AACb,UAAM,OAAoB,KAAK,QAAQ,cAAc,IAAI;AACzD,WAAO,MAAM,KAAK,YAAY,SAAS,IAAI;AAAA,EAC7C;AAAA,EAEA,KACE,OACA,MACA,YACM;AACN,QAAI,uBAAoC,CAAC;AACzC,eAAW,QAAQ,YAAY;AAC7B,2BAAqB,KAAK;AAAA,QACxB,eAAe;AAAA,QACf,iBAAiB;AAAA,QACjB,MAAM;AAAA;AAAA,QAEN,WAAW;AAAA,QACX,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AACA,SAAK,MAAM,KAAK,KAAK,EAAE,MAAM,OAAO,YAAY,qBAAqB,CAAC;AACtE,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,OAAe,YAAwE;AAC/F,WAAO,KAAK,KAAK,OAAO,SAAS,UAAU;AAAA,EAC7C;AAAA,EAEA,SAAS,OAAe,YAAwE;AAC9F,WAAO,KAAK,KAAK,OAAO,QAAQ,UAAU;AAAA,EAC5C;AAAA,EAEA,UAAU,OAAe,YAAwE;AAC/F,WAAO,KAAK,KAAK,OAAO,SAAS,UAAU;AAAA,EAC7C;AAAA,EAEA,SAAS,OAAe,YAAwE;AAC9F,WAAO,KAAK,KAAK,OAAO,QAAQ,UAAU;AAAA,EAC5C;AAAA,EAEA,UAAU,OAAe,YAAwE;AAC/F,WAAO,KAAK,KAAK,OAAO,SAAS,UAAU;AAAA,EAC7C;AACF;;;ACpPA,SAAS,aAAa,KAAa;AACjC,SAAO,IAAI,UAAU,GAAG,CAAC,EAAE,YAAY,IAAI,IAAI,UAAU,CAAC;AAC5D;AAFS;AAGF,IAAe,eAAf,MAA4B;AAAA,EAlBnC,OAkBmC;AAAA;AAAA;AAAA,EACjC,WAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,OAA2B;AAC/B,QAAI,MAAM;AACV,QAAI,WAAwB,CAAC;AAE7B,eAAW,QAAQ,KAAK,UAAU;AAEhC,YAAM,WAAuB,YAAY,aAAa,IAAI;AAE1D,YAAM,IAAI,KAAK,QAAQ,EAAE,MAAM,MAAM,IAAI,CAAC;AAC1C,UAAI,CAAC,KAAK;AACR,cAAM,EAAE;AAAA,MACV,WAAW,EAAE,KAAK;AAChB,eAAO,MAAM,EAAE;AAAA,MACjB;AACA,iBAAW,CAAC,GAAG,UAAU,GAAG,EAAE,QAAQ;AAAA,IACxC;AACA,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAAA,EAEA,aAAa,OAA2B;AACtC,QAAI,MAAM;AACV,QAAI,WAAwB,CAAC;AAE7B,eAAW,QAAQ,KAAK,UAAU;AAEhC,UAAI,QAAQ,MAAM,MAAM,IAAI;AAC5B,UAAI,SAAS,UAAU;AACrB,gBAAQ,CAAC,mBAAmB;AAAA,MAC9B;AAEA,YAAM,WAAuB,YAAY,aAAa,IAAI;AAE1D,YAAM,IAAI,KAAK,QAAQ,EAAE,KAAK;AAC9B,UAAI,CAAC,KAAK;AACR,cAAM,EAAE;AAAA,MACV,WAAW,EAAE,KAAK;AAChB,eAAO,MAAM,EAAE;AAAA,MACjB;AACA,iBAAW,CAAC,GAAG,UAAU,GAAG,EAAE,QAAQ;AAAA,IACxC;AACA,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAAA,EAEA,cAAc,SAAoC;AAChD,UAAM,KAAK,QACR,IAAI,CAAC,MAAM;AACV,aAAO;AAAA,IACT,CAAC,EACA,KAAK,IAAI;AAEZ,WAAO,EAAE,KAAK,YAAY,IAAI,UAAU,CAAC,EAAE;AAAA,EAC7C;AAAA,EAEA,aAAa,WAAgC;AAC3C,QAAI,KAAK;AACT,QAAI,UAAU,QAAQ;AACpB,WAAK,UAAU;AAAA,IACjB;AAEA,WAAO,EAAE,KAAK,IAAI,UAAU,CAAC,EAAE;AAAA,EACjC;AAAA,EAEA,YAAY,OAAgC;AAC1C,QAAI,MAAM;AACV,QAAI,WAAwB,CAAC;AAE7B,eAAW,KAAK,OAAO;AACrB,aAAO,MAAM,EAAE,OAAO,WAAW,EAAE,QAAQ;AAE3C,YAAM,QAAQ,KAAK,aAAa,EAAE,UAAU;AAC5C,UAAI,MAAM,IAAI,WAAW,QAAQ,GAAG;AAClC,cAAM,MAAM,MAAM,IAAI,UAAU,SAAS,MAAM;AAAA,MACjD;AAEA,aAAO;AACP,aAAO,MAAM;AACb,aAAO;AAEP,iBAAW,CAAC,GAAG,UAAU,GAAG,MAAM,QAAQ;AAAA,IAC5C;AAEA,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAAA,EAEA,aAAa,QAAkC;AAC7C,QAAI,MAAM;AACV,QAAI,WAAwB,CAAC;AAE7B,eAAW,KAAK,QAAQ;AACtB,aAAO,MAAM,EAAE,gBAAgB;AAC/B,UAAI,EAAE,iBAAiB;AACrB,eAAO;AAAA,MACT;AACA,YAAM,WAAW,iBAAiB,aAAa,EAAE,IAAI;AAErD,YAAM,KAAK,KAAK,QAAQ,EAAE,CAAC;AAC3B,aAAO,GAAG;AACV,iBAAW,CAAC,GAAG,UAAU,GAAG,GAAG,QAAQ;AAAA,IACzC;AACA,QAAI,IAAI,WAAW,OAAO,GAAG;AAC3B,YAAM,WAAW,IAAI,UAAU,QAAQ,MAAM;AAAA,IAC/C,WAAW,IAAI,WAAW,MAAM,GAAG;AACjC,YAAM,WAAW,IAAI,UAAU,OAAO,MAAM;AAAA,IAC9C;AACA,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAAA,EAEA,mBAAmB,GAA6B;AAC9C,UAAM,WAAW,EAAE;AACnB,UAAM,EAAE,KAAK,SAAS,IAAI,SAAS,QAAQ,aAAa,SAAS,MAAM,KAAK;AAC5E,QAAI,OAAO,IAAI,QAAQ,WAAW,EAAE;AACpC,WAAO;AAAA,MACL,KAAK,IAAI,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,sBAAsB,GAAyB;AAC7C,QAAI,EAAE,UAAU,YAAY,MAAM,QAAQ,MAAM,QAAQ,EAAE,KAAK,GAAG;AAChE,aAAO;AAAA,QACL,KAAK,GAAG,EAAE,MAAM,UAAU,KAAK,uBAAuB,CAAC;AAAA,QACvD,UAAU,CAAC,EAAE,KAAK;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,KAAK,GAAG,EAAE,MAAM,IAAI,EAAE,SAAS,IAAI,KAAK,uBAAuB,CAAC;AAAA,MAChE,UAAU,CAAC,EAAE,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,4BAA4B,GAA+B;AACzD,WAAO;AAAA,MACL,KAAK,GAAG,EAAE,OAAO,IAAI,EAAE,SAAS,IAAI,EAAE,OAAO;AAAA,MAC7C,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAAA,EAEA,eAAe,SAAgC;AAC7C,QAAI,KAAK;AACT,QAAI,QAAQ,QAAQ;AAClB,WAAK,cAAc,QAAQ,KAAK,IAAI;AAAA,IACtC;AAEA,WAAO,EAAE,KAAK,IAAI,UAAU,CAAC,EAAE;AAAA,EACjC;AAAA,EAEA,aAAa,OAAmC;AAC9C,QAAI,KAAK;AACT,QAAI,UAAU,MAAM;AAClB,WAAK,WAAW;AAAA,IAClB;AAEA,WAAO,EAAE,KAAK,IAAI,UAAU,CAAC,EAAE;AAAA,EACjC;AAAA,EAEA,cAAc,QAAoC;AAChD,QAAI,KAAK;AACT,QAAI,WAAW,MAAM;AACnB,WAAK,YAAY;AAAA,IACnB;AAEA,WAAO,EAAE,KAAK,IAAI,UAAU,CAAC,EAAE;AAAA,EACjC;AAAA,EAIA,iBAAiB,GAA2B;AAC1C,WAAO;AAAA,MACL,KAAK,GAAG,EAAE,MAAM;AAAA,MAChB,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAAA,EAEA,cAAc,OAAc,MAA8C;AACxE,QAAI,MAAM,iBAAiB,MAAM,MAAM,QAAQ;AAC/C,UAAM,UAAoB,CAAC;AAC3B,UAAM,WAAwB,CAAC;AAC/B,UAAM,SAAmB,CAAC;AAE1B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,cAAQ,KAAK,CAAC;AACd,eAAS,KAAK,CAAC;AACf,aAAO,KAAK,KAAK,uBAAuB,CAAC;AAAA,IAC3C;AAEA,WAAO,QAAQ,KAAK,IAAI,IAAI,eAAe,SAAS;AAEpD,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAAA,EAQA,cAAc,OAAc,MAA8C;AACxE,QAAI,MAAM,YAAY,MAAM,MAAM,QAAQ;AAC1C,UAAM,WAAwB,CAAC;AAE/B,UAAM,WAAW,CAAC;AAClB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,eAAS,KAAK,GAAG,CAAC,MAAM,KAAK,uBAAuB,CAAC,EAAE;AACvD,eAAS,KAAK,CAAC;AAAA,IACjB;AAEA,WAAO,SAAS,KAAK,IAAI;AAEzB,UAAM,aAAa,KAAK,aAAa,MAAM,MAAM,KAAK;AACtD,WAAO,MAAM,WAAW;AACxB,aAAS,KAAK,GAAG,WAAW,QAAQ;AAEpC,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAAA,EAEA,cAAc,OAA2B;AACvC,QAAI,MAAM,iBAAiB,MAAM,MAAM;AACvC,UAAM,aAAa,KAAK,aAAa,MAAM,MAAM,KAAK;AACtD,WAAO,MAAM,WAAW;AACxB,WAAO,EAAE,KAAK,UAAU,WAAW,SAAS;AAAA,EAC9C;AAAA,EAEA,cACE,OACA,MACA,gBACA,cACa;AACb,QAAI,MAAM,iBAAiB,MAAM,MAAM,QAAQ;AAC/C,UAAM,UAAoB,CAAC;AAC3B,UAAM,WAAwB,CAAC;AAC/B,UAAM,SAAmB,CAAC;AAE1B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,cAAQ,KAAK,CAAC;AACd,eAAS,KAAK,CAAC;AACf,aAAO,KAAK,KAAK,uBAAuB,CAAC;AAAA,IAC3C;AAEA,WAAO,QAAQ,KAAK,IAAI,IAAI,eAAe,SAAS;AAEpD,WAAO,mBAAmB,eAAe,KAAK,IAAI,IAAI;AACtD,UAAM,WAAW,CAAC;AAClB,eAAW,KAAK,cAAc;AAC5B,eAAS,KAAK,GAAG,CAAC,eAAe,CAAC,EAAE;AAAA,IACtC;AACA,WAAO,SAAS,KAAK,IAAI;AAEzB,UAAM,aAAa,KAAK,aAAa,MAAM,MAAM,KAAK;AACtD,WAAO,MAAM,WAAW;AACxB,aAAS,KAAK,GAAG,WAAW,QAAQ;AAEpC,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAAA,EAEA,eAAe,SAAgC;AAC7C,QAAI,KAAK;AACT,QAAI,QAAQ,QAAQ;AAClB,WAAK,cAAc,QAAQ,KAAK,IAAI;AAAA,IACtC;AAEA,WAAO,EAAE,KAAK,IAAI,UAAU,CAAC,EAAE;AAAA,EACjC;AAAA,EAEA,cAAc,QAAmC;AAC/C,QAAI,MAAM;AACV,QAAI,WAAwB,CAAC;AAE7B,eAAW,KAAK,QAAQ;AACtB,aAAO,MAAM,EAAE,gBAAgB;AAC/B,UAAI,EAAE,iBAAiB;AACrB,eAAO;AAAA,MACT;AACA,YAAM,WAAW,kBAAkB,aAAa,EAAE,IAAI;AAEtD,YAAM,KAAK,KAAK,QAAQ,EAAE,CAAC;AAC3B,aAAO,GAAG;AACV,iBAAW,CAAC,GAAG,UAAU,GAAG,GAAG,QAAQ;AAAA,IACzC;AACA,QAAI,IAAI,WAAW,OAAO,GAAG;AAC3B,YAAM,YAAY,IAAI,UAAU,QAAQ,MAAM;AAAA,IAChD,WAAW,IAAI,WAAW,MAAM,GAAG;AACjC,YAAM,YAAY,IAAI,UAAU,OAAO,MAAM;AAAA,IAC/C;AACA,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAAA,EAEA,uBAAuB,GAAyB;AAC9C,WAAO;AAAA,MACL,KAAK,GAAG,EAAE,MAAM,IAAI,EAAE,SAAS,IAAI,KAAK,uBAAuB,CAAC;AAAA,MAChE,UAAU,CAAC,EAAE,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,iBAAiB,GAA0B;AACzC,WAAO;AAAA,MACL,KAAK,EAAE;AAAA,MACP,UAAU,EAAE;AAAA,IACd;AAAA,EACF;AACF;;;ACxUO,IAAM,yBAAN,cAAqC,aAAa;AAAA,EAJzD,OAIyD;AAAA;AAAA;AAAA,EAC/C;AAAA,EACR,cAAc;AACZ,UAAM;AACN,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,MAAM,OAA2B;AAC/B,SAAK,iBAAiB;AACtB,WAAO,MAAM,MAAM,KAAK;AAAA,EAC1B;AAAA,EAEA,yBAAiC;AAC/B,WAAO,MAAM,KAAK;AAAA,EACpB;AAAA,EAEA,cAAc,OAAc,MAAwC;AAClE,SAAK,iBAAiB;AACtB,WAAO,MAAM,cAAc,OAAO,IAAI;AAAA,EACxC;AAAA,EAEA,mBACE,OACA,MACA,UAAoC,EAAE,YAAY,CAAC,IAAI,EAAE,GAC5C;AACb,SAAK,iBAAiB;AACtB,UAAM,KAAK,MAAM,cAAc,OAAO,IAAI;AAC1C,OAAG,OAAO,cAAc,QAAQ,WAAW,KAAK,IAAI,CAAC;AACrD,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,OAAc,MAAwC;AAClE,SAAK,iBAAiB;AACtB,WAAO,MAAM,cAAc,OAAO,IAAI;AAAA,EACxC;AAAA,EAEA,cAAc,OAA2B;AACvC,SAAK,iBAAiB;AACtB,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC;AAAA,EAEA,cACE,OACA,MACA,gBACA,cACa;AACb,SAAK,iBAAiB;AACtB,WAAO,MAAM,cAAc,OAAO,MAAM,gBAAgB,YAAY;AAAA,EACtE;AAAA,EAEA,aAAa,OAA2B;AACtC,SAAK,iBAAiB;AACtB,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC;AACF;;;AC1DO,IAAM,aAAN,MAAiB;AAAA,EACtB,YACU,MAAM,IACN,WAAW,CAAC,GACpB;AAFQ;AACA;AAAA,EACP;AAAA,EANL,OAEwB;AAAA;AAAA;AAAA,EAMtB,gBAA6B;AAC3B,WAAO,EAAE,KAAK,KAAK,KAAK,UAAU,KAAK,SAAS;AAAA,EAClD;AACF;;;ACYO,IAAM,SAAN,MAAa;AAAA,EAvBpB,OAuBoB;AAAA;AAAA;AAAA,EAClB,aAAqB;AAAA,EACrB,aAAmC;AAAA,IACjC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EAEA,YAAY,YAAoB,MAAoC;AAClE,SAAK,aAAa;AAClB,SAAK,WAAW,OAAO;AAAA,EACzB;AAAA,EAEA,OAAO,QAAgB;AACrB,SAAK,WAAW,SAAS;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,WAAoB,MAAM;AACjC,SAAK,WAAW,WAAW;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAAkB,MAAM;AAC7B,SAAK,WAAW,SAAS;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,OAAwC;AAC9C,SAAK,WAAW,UAAU;AAC1B,WAAO;AAAA,EACT;AACF;AAGO,IAAM,kBAAN,MAAsB;AAAA,EA5D7B,OA4D6B;AAAA;AAAA;AAAA,EAC3B;AAAA,EACA,YAAgC;AAAA,EAChC,SAAkB;AAAA,EAClB,QAA2E;AAAA,EAE3E,YAAY,SAA4B;AACtC,SAAK,UAAU,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAAA,EAC5D;AAAA,EAEA,KAAK,WAAmB;AACtB,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,SAAkB,MAAM;AAChC,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,MAAyB;AAC5B,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AACF;AAGO,IAAM,uBAAN,MAA2B;AAAA,EAvFlC,OAuFkC;AAAA;AAAA;AAAA,EAChC;AAAA,EACA;AAAA,EACA,iBAAoE;AAAA,EACpE,iBAAoE;AAAA,EAEpE,YAAY,QAAgB;AAC1B,SAAK,SAAS;AACd,SAAK,kBAAkB,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA,EACjD;AAAA,EAEA,GAAG,OAAe;AAChB,SAAK,gBAAgB,QAAQ;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,QAAgB;AACzB,SAAK,gBAAgB,SAAS;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,QAAoC;AAC3C,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,QAAoC;AAC3C,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACT;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EAvHvB,OAuHuB;AAAA;AAAA;AAAA,EACrB,YAAoB;AAAA,EACpB,UAAoB,CAAC;AAAA,EACrB,cAAwB,CAAC;AAAA,EACzB,cAAsC,CAAC;AAAA,EACvC,UAA6B,CAAC;AAAA,EAC9B,gBAAyB;AAAA,EACzB,cAAwB,CAAC;AAAA,EACzB,cAAc;AAAA,EAAC;AAAA,EACf,aAAa,WAAmB,gBAAyB,OAAO;AAC9D,SAAK,YAAY;AACjB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,QAAQ,YAAoB;AAC1B,UAAM,KAAK,IAAI,OAAO,YAAY,SAAS;AAC3C,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,YAAoB;AACvB,UAAM,KAAK,IAAI,OAAO,YAAY,MAAM;AACxC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,YAAoB,SAAiB,KAAK;AAC/C,UAAM,KAAK,IAAI,OAAO,YAAY,QAAQ;AAC1C,OAAG,OAAO,MAAM;AAChB,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,YAAoB;AACvB,UAAM,KAAK,IAAI,OAAO,YAAY,MAAM;AACxC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,YAAoB;AACvB,UAAM,KAAK,IAAI,OAAO,YAAY,MAAM;AACxC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAoB;AACxB,UAAM,KAAK,IAAI,OAAO,YAAY,OAAO;AACzC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,YAAoB;AAC1B,UAAM,KAAK,IAAI,OAAO,YAAY,SAAS;AAC3C,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAoB;AACxB,UAAM,KAAK,IAAI,OAAO,YAAY,OAAO;AACzC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,YAAoB;AACzB,UAAM,KAAK,IAAI,OAAO,YAAY,QAAQ;AAC1C,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK;AACH,UAAM,KAAK,IAAI,OAAO,MAAM,QAAQ;AACpC,SAAK,QAAQ,KAAK,EAAE;AACpB,SAAK,YAAY,KAAK,IAAI;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,aAAa;AACX,SAAK,QAAQ;AAAA,MACX,IAAI,OAAO,cAAc,YAAY,EAAE,QAAQ,IAAI,WAAW,mBAAmB,CAAC;AAAA,IACpF;AACA,SAAK,QAAQ;AAAA,MACX,IAAI,OAAO,cAAc,YAAY,EAAE,QAAQ,IAAI,WAAW,mBAAmB,CAAC;AAAA,IACpF;AAAA,EACF;AAAA,EAEA,KAAK,YAAoB;AACvB,UAAM,KAAK,IAAI,OAAO,YAAY,MAAM;AACxC,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,YAAoB;AAC5B,UAAM,KAAK,IAAI,OAAO,YAAY,WAAW;AAC7C,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,YAAoB;AAC9B,UAAM,KAAK,IAAI,OAAO,YAAY,YAAY;AAC9C,SAAK,QAAQ,KAAK,EAAE;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,YAAoB;AAC3B,WAAO,KAAK,UAAU,UAAU;AAAA,EAClC;AAAA,EAEA,WAAW,YAAoB;AAC7B,WAAO,KAAK,YAAY,UAAU;AAAA,EACpC;AAAA,EAEA,QAAQ,MAAgB;AACtB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,QAAQ,YAAoB;AAC1B,UAAM,KAAK,IAAI,qBAAqB,UAAU;AAC9C,SAAK,YAAY,KAAK,EAAE;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,YAAoB;AAC7B,SAAK,YAAY,KAAK,UAAU;AAAA,EAClC;AAAA,EAEA,MAAM,SAA4B,WAAoB;AACpD,UAAM,kBAAkB,IAAI,gBAAgB,OAAO;AACnD,QAAI,WAAW;AACb,sBAAgB,KAAK,SAAS;AAAA,IAChC;AACA,SAAK,QAAQ,KAAK,eAAe;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAA4B,WAAoB;AACrD,UAAM,kBAAkB,IAAI,gBAAgB,OAAO,EAAE,UAAU,IAAI;AACnE,QAAI,WAAW;AACb,sBAAgB,KAAK,SAAS;AAAA,IAChC;AACA,SAAK,QAAQ,KAAK,eAAe;AACjC,WAAO;AAAA,EACT;AACF;;;ACjQO,IAAM,gBAAN,MAAoB;AAAA,EAJ3B,OAI2B;AAAA;AAAA;AAAA,EACzB,MAAM,WAA8B;AAClC,QAAI,CAAC,UAAU,eAAe;AAC5B,aAAO,KAAK,mBAAmB,SAAS,EAAE;AAAA,IAC5C,WAAW,UAAU,eAAe;AAClC,aAAO,KAAK,kBAAkB,SAAS,EAAE;AAAA,IAC3C;AAEA,UAAM,IAAI,MAAM,+BAA+B,UAAU,SAAS;AAAA,EACpE;AAAA,EAEA,mBAAmB,WAAmC;AACpD,QAAI,MAAM,kBAAkB,UAAU,YAAY;AAClD,UAAM,UAAU,UAAU,QACvB,IAAI,CAAC,MAAc;AAClB,aAAO,KAAK,cAAc,CAAC;AAAA,IAC7B,CAAC,EACA,KAAK,IAAI;AAEZ,UAAM,cAAc,KAAK,mBAAmB,UAAU,WAAW;AACjE,QAAI,cAAwB,CAAC;AAC7B,QAAI,UAAU,YAAY,SAAS,GAAG;AACpC,oBAAc,UAAU,YAAY,IAAI,CAAC,MAA4B;AACnE,eAAO,KAAK,kBAAkB,CAAC;AAAA,MACjC,CAAC;AAAA,IACH;AACA,WAAO,CAAC,SAAS,aAAa,GAAG,WAAW,EAAE,KAAK,GAAG,IAAI;AAE1D,UAAM,cAAc,EAAE,KAAK,UAAU,CAAC,EAAE;AAGxC,QAAI,UAAU,QAAQ,SAAS,GAAG;AAChC,YAAM,YAAY,UAAU,QAAQ,IAAI,CAAC,UAA2B;AAClE,eAAO,KAAK,aAAa,UAAU,WAAW,KAAK;AAAA,MACrD,CAAC;AACD,aAAO;AAAA,QACL,KAAK,CAAC,YAAY,KAAK,GAAG,UAAU,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI;AAAA,QACpE,UAAU,YAAY;AAAA,MACxB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkB,WAAmC;AACnD,QAAI,MAAgB,CAAC,iBAAiB,UAAU,SAAS;AACzD,UAAM,cAAc,UAAU,QAAQ,IAAI,CAAC,MAAc;AACvD,aAAO,gBAAgB,KAAK,cAAc,CAAC;AAAA,IAC7C,CAAC;AAED,UAAM,eAAe,UAAU,YAAY,IAAI,CAAC,MAAc;AAC5D,aAAO,iBAAiB;AAAA,IAC1B,CAAC;AAED,UAAM,kBAAkB,CAAC,GAAG,aAAa,GAAG,YAAY;AACxD,QAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAM,IAAI,OAAO,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC;AAAA,IAC/C;AAGA,QAAI;AACJ,QAAI,gBAAgB,SAAS,GAAG;AAC9B,oBAAc,EAAE,KAAK,IAAI,KAAK,GAAG,GAAG,UAAU,CAAC,EAAE;AAAA,IACnD,OAAO;AAEL,oBAAc,EAAE,KAAK,IAAI,KAAK,GAAG,IAAI,KAAK,UAAU,CAAC,EAAE;AAAA,IACzD;AAGA,QAAI,UAAU,QAAQ,SAAS,GAAG;AAChC,YAAM,YAAY,UAAU,QAAQ,IAAI,CAAC,UAA2B;AAClE,eAAO,KAAK,aAAa,UAAU,WAAW,KAAK;AAAA,MACrD,CAAC;AACD,aAAO;AAAA,QACL,KAAK,CAAC,YAAY,KAAK,GAAG,UAAU,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI;AAAA,QACpE,UAAU,YAAY;AAAA,MACxB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,QAAwB;AACpC,UAAM,KAAK,CAAC,GAAG,OAAO,UAAU,EAAE;AAElC,QAAI,OAAO,WAAW,SAAS,UAAU;AACvC,SAAG,KAAK,aAAa,OAAO,WAAW,SAAS,GAAG;AAAA,IACrD,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,WAAW;AAC/C,SAAG,KAAK,SAAS;AAAA,IACnB,WAAW,OAAO,WAAW,SAAS,WAAW;AAC/C,SAAG,KAAK,SAAS;AAAA,IACnB,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,aAAa;AACjD,SAAG,KAAK,WAAW;AAAA,IACrB,WAAW,OAAO,WAAW,SAAS,cAAc;AAClD,SAAG,KAAK,0BAA0B;AAAA,IACpC,WAAW,OAAO,WAAW,SAAS,UAAU;AAC9C,SAAG,KAAK,QAAQ;AAAA,IAClB,WAAW,OAAO,WAAW,SAAS,SAAS;AAC7C,SAAG,KAAK,OAAO;AAAA,IACjB,WAAW,OAAO,WAAW,SAAS,UAAU;AAC9C,SAAG,KAAK,kBAAkB;AAAA,IAC5B,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,SAAS;AAC7C,SAAG,KAAK,OAAO;AAAA,IACjB,OAAO;AACL,YAAM,IAAI,MAAM,0BAA0B,OAAO,WAAW,IAAI;AAAA,IAClE;AAEA,QAAI,OAAO,WAAW,UAAU;AAC9B,SAAG,KAAK,MAAM;AAAA,IAChB,OAAO;AACL,SAAG,KAAK,UAAU;AAAA,IACpB;AAEA,QAAI,OAAO,WAAW,QAAQ;AAC5B,SAAG,KAAK,QAAQ;AAAA,IAClB;AAEA,QAAI,OAAO,WAAW,YAAY,MAAM;AACtC,SAAG,KAAK,aAAa,KAAK,OAAO,OAAO,WAAW,OAAO,CAAC;AAAA,IAC7D;AAEA,WAAO,GAAG,KAAK,GAAG;AAAA,EACpB;AAAA,EAEA,OAAO,OAA0B;AAC/B,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,MAAM,SAAS;AAAA,IACxB;AAEA,QAAI,OAAO,UAAU,WAAW;AAC9B,aAAO,QAAQ,SAAS;AAAA,IAC1B;AAEA,QAAI,iBAAiB,MAAM;AACzB,aAAO,MAAM,MAAM,YAAY,IAAI;AAAA,IACrC;AAEA,QAAI,iBAAiB,YAAY;AAC/B,aAAO,MAAM,cAAc,EAAE;AAAA,IAC/B;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,OAAO,MAAM,KAAK,GAAG,IAAI;AAAA,IAClC;AAEA,WAAO,MAAM,MAAM,QAAQ,KAAK,KAAK,IAAI;AAAA,EAC3C;AAAA,EAEA,mBAAmB,aAA+B;AAChD,QAAI,CAAC,YAAY,QAAQ;AACvB,aAAO;AAAA,IACT;AAEA,WAAO,kBAAkB,YAAY,KAAK,IAAI,IAAI;AAAA,EACpD;AAAA,EAEA,cAAc,SAAwC,QAAwB;AAC5E,WAAO;AAAA,MACL,KACE,sOAGA,KAAK,yBAAyB,QAAQ,WAAW,IACjD;AAAA,MACF,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAAA,EAEA,mBAAmB,WAAmB,SAAiB,IAAiB;AACtE,WAAO;AAAA,MACL,KACE,gFAEC,SAAS,KAAK,OAAO,MAAM,IAAI,sBAChC;AAAA,MACF,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,iBAAiB,WAAgC;AAC/C,WAAO,EAAE,KAAK,cAAc,KAAK,kBAAkB,SAAS,CAAC,IAAI,UAAU,CAAC,EAAE;AAAA,EAChF;AAAA,EAEA,yBAAyB,WAAgC;AACvD,WAAO,EAAE,KAAK,wBAAwB,KAAK,kBAAkB,SAAS,CAAC,IAAI,UAAU,CAAC,EAAE;AAAA,EAC1F;AAAA,EAEU,yBACR,QACA,QACQ;AACR,QAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,GAAG;AAC9C,aAAO,GAAG,MAAM,QAAQ,KAAK,YAAY,MAAM,CAAC;AAAA,IAClD,WAAW,UAAU,OAAO,WAAW,UAAU;AAC/C,aAAO,GAAG,MAAM,MAAM,KAAK,YAAY,MAAM,CAAC;AAAA,IAChD,OAAO;AACL,aAAO,GAAG,MAAM,gCAAgC,MAAM;AAAA,IACxD;AAAA,EACF;AAAA,EAEU,YAAY,OAAkC;AACtD,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,MAAM,IAAI,CAAC,MAAM,IAAI,EAAE,QAAQ,MAAM,KAAK,CAAC,GAAG,EAAE,KAAK,IAAI;AAAA,IAClE;AACA,WAAO,IAAI,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,EACvC;AAAA,EAEU,kBAAkB,OAAkC;AAC5D,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,MAAM,IAAI,CAAC,MAAM,KAAK,kBAAkB,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,IAC9D;AACA,WAAO,IAAI,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,EACvC;AAAA,EAEU,kBAAkB,YAA0C;AAEpE,UAAM,KAAK,CAAC,gBAAgB,WAAW,MAAM,GAAG;AAChD,OAAG,KAAK,cAAc,WAAW,gBAAgB,KAAK,IAAI,WAAW,gBAAgB,MAAM,GAAG;AAE9F,QAAI,WAAW,gBAAgB;AAC7B,SAAG,KAAK,aAAa,WAAW,cAAc,EAAE;AAAA,IAClD;AAEA,QAAI,WAAW,gBAAgB;AAC7B,SAAG,KAAK,aAAa,WAAW,cAAc,EAAE;AAAA,IAClD;AAEA,WAAO,GAAG,KAAK,GAAG;AAAA,EACpB;AAAA,EAEU,aAAa,WAAmB,OAAqC;AAC7E,UAAM,YACJ,MAAM,aACN,GAAG,SAAS,IAAI,MAAM,QAAQ,KAAK,GAAG,CAAC,IAAI,MAAM,SAAS,WAAW,OAAO;AAC9E,UAAM,gBAAgB,MAAM,SAAS,YAAY;AACjD,UAAM,YAAY,MAAM,QAAQ,UAAU,MAAM,KAAK,KAAK;AAE1D,UAAM,MAAM,UAAU,aAAa,SAAS,SAAS,OAAO,SAAS,GAAG,SAAS,KAAK,MAAM,QAAQ,KAAK,IAAI,CAAC;AAE9G,WAAO,EAAE,KAAK,UAAU,CAAC,EAAE;AAAA,EAC7B;AACF;;;AC5PO,IAAM,SAAN,MAAa;AAAA,EAClB,YACmB,YACA,SACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EARL,OAIoB;AAAA;AAAA;AAAA,EAMlB,MAAM,YAAY,WAAmB,cAA8C;AACjF,UAAM,YAAY,IAAI,UAAU;AAChC,cAAU,aAAa,WAAW,KAAK;AACvC,iBAAa,SAAS;AAEtB,UAAM,UAAU,IAAI,cAAc;AAClC,UAAM,MAAM,QAAQ,MAAM,SAAS;AACnC,UAAM,KAAK,YAAY,SAAS,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC;AAAA,EACvD;AAAA,EAEA,MAAM,WAAW,WAAmB,cAA8C;AAChF,UAAM,YAAY,IAAI,UAAU;AAChC,cAAU,aAAa,WAAW,IAAI;AACtC,iBAAa,SAAS;AAEtB,UAAM,UAAU,IAAI,cAAc;AAClC,UAAM,MAAM,QAAQ,MAAM,SAAS;AACnC,UAAM,KAAK,YAAY,SAAS,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC;AAAA,EACvD;AAAA,EAEA,MAAM,UAAU,WAAmB;AACjC,UAAM,UAAU,IAAI,cAAc;AAClC,UAAM,KAAK,YAAY,SAAS,QAAQ,iBAAiB,SAAS,CAAC;AAAA,EACrE;AAAA,EAEA,MAAM,kBAAkB,WAAmB;AACzC,UAAM,UAAU,IAAI,cAAc;AAClC,UAAM,KAAK,YAAY,SAAS,QAAQ,yBAAyB,SAAS,CAAC;AAAA,EAC7E;AAAA,EAEA,MAAM,SAAS;AACb,UAAM,UAAU,IAAI,cAAc;AAClC,WAAO,MAAM,KAAK,YAAY,SAAS,QAAQ,cAAc,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,YAAY,YAAsC;AACtD,UAAM,UAAU,IAAI,cAAc;AAClC,YAAQ,MAAM,KAAK,YAAY,SAAS,QAAQ,mBAAmB,UAAU,CAAC,GAAG,CAAC,EAAE,QAAQ;AAAA,EAC9F;AACF;;;AC/CO,IAAM,0BAAN,cAAsC,cAAc;AAAA,EAF3D,OAE2D;AAAA;AAAA;AAAC;;;ARM5D,uBAAmB;AAEZ,IAAM,uBAAN,MAAM,8BAA6B,WAAc;AAAA,EAVxD,OAUwD;AAAA;AAAA;AAAA,EACtD;AAAA,EACA,OAAO;AAAA,EAEP,OAAO,WAAuB;AAAA,IAC5B,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,mBAAmB;AAAA;AAAA,IACnB,yBAAyB;AAAA;AAAA,IACzB,SAAS;AAAA,EACX;AAAA,EAEA,YAAY,QAAoB;AAC9B,UAAM;AACN,QAAI,CAAC,sBAAqB,MAAM;AAC9B,4BAAqB,OAAO,IAAI,eAAK,EAAE,GAAG,sBAAqB,UAAU,GAAG,OAAO,CAAC;AAAA,IACtF;AAAA,EACF;AAAA,EACA,MAAM,UAA4B;AAChC,SAAK,aAAa,MAAM,sBAAqB,KAAK,QAAQ;AAC1D,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS,KAAkB;AAC/B,UAAM,SAAS,MAAM,KAAK,YAAY,MAAM,IAAI,KAAK,IAAI,QAAQ;AACjE,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,MAAM,UAAU,KAAgC;AAC9C,WAAO,KAAK,YAAY,MAAM,IAAI,iBAAAA,QAAO,IAAI,KAAK,IAAI,QAAQ,CAAC;AAAA,EACjE;AAAA,EAEA,MAAM,aAA+B;AACnC,UAAM,KAAK,YAAY,QAAQ;AAC/B,WAAO;AAAA,EACT;AAAA,EAEA,WAAkB;AAChB,WAAO,IAAI,MAAM,MAAM,IAAI,uBAAuB,CAAC;AAAA,EACrD;AAAA,EAEA,YAAoB;AAClB,WAAO,IAAI,OAAO,MAAM,IAAI,wBAAwB,CAAC;AAAA,EACvD;AAAA,EAEA,kBAA0C;AACxC,WAAO,IAAI,uBAAuB;AAAA,EACpC;AAAA,EACA,mBAA4C;AAC1C,WAAO,IAAI,wBAAwB;AAAA,EACrC;AAAA,EAEA,MAAM,mBAAkC;AACtC,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AACA,UAAM,KAAK,WAAW,MAAM,OAAO;AAAA,EACrC;AAAA,EAEA,MAAM,SAAwB;AAC5B,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AACA,UAAM,KAAK,WAAW,MAAM,QAAQ;AAAA,EACtC;AAAA,EAEA,MAAM,WAA0B;AAC9B,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACnE;AACA,UAAM,KAAK,WAAW,MAAM,UAAU;AAAA,EACxC;AAAA,EAEA,aAAa,UAAyB;AACpC,0BAAqB,KAAK,IAAI;AAC9B;AAAA,EACF;AACF;;;ASrFO,IAAe,YAAf,MAAyB;AAAA,EAFhC,OAEgC;AAAA;AAAA;AAGhC;","names":["Cursor"]}
package/dist/types.d.mts CHANGED
@@ -1 +1 @@
1
- export { l as CompiledSql, J as JoinCondition, P as Parameter, m as havingType, n as joinType, s as selectType, w as whereBasic, h as whereNested, j as whereNull, f as whereOp, g as whereOpColumn, i as whereRaw, k as whereType } from './Blueprint-CCVXLNaD.mjs';
1
+ export { l as CompiledSql, J as JoinCondition, P as Parameter, m as havingType, n as joinType, s as selectType, w as whereBasic, h as whereNested, j as whereNull, f as whereOp, g as whereOpColumn, i as whereRaw, k as whereType } from './Blueprint-BiMz4Je8.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devbro/neko-sql",
3
- "version": "0.1.11",
3
+ "version": "0.1.14",
4
4
  "description": "generic sql generator",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",