@devbro/neko-sql 0.1.28 → 0.1.30

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.
@@ -25,15 +25,88 @@ declare class SchemaGrammar {
25
25
  protected compileIndex(tableName: string, index: IndexConstraint): CompiledSql;
26
26
  }
27
27
 
28
+ /**
29
+ * Schema builder for creating and managing database tables.
30
+ * Provides methods for table creation, alteration, and inspection.
31
+ */
28
32
  declare class Schema {
29
33
  private readonly connection;
30
34
  private readonly grammar;
35
+ /**
36
+ * Creates a new Schema instance.
37
+ *
38
+ * @param connection - The database connection to use for schema operations
39
+ * @param grammar - The schema grammar for generating SQL statements
40
+ */
31
41
  constructor(connection: Connection | null, grammar: SchemaGrammar);
42
+ /**
43
+ * Creates a new table in the database.
44
+ *
45
+ * @param tableName - The name of the table to create
46
+ * @param structMethod - A callback function that receives a Blueprint to define table structure
47
+ *
48
+ * @example
49
+ * await schema.createTable('users', (table) => {
50
+ * table.increments('id');
51
+ * table.string('name');
52
+ * table.string('email').unique();
53
+ * table.timestamps();
54
+ * });
55
+ */
32
56
  createTable(tableName: string, structMethod: (blueprint: Blueprint) => void): Promise<void>;
57
+ /**
58
+ * Modifies an existing table structure.
59
+ *
60
+ * @param tableName - The name of the table to alter
61
+ * @param structMethod - A callback function that receives a Blueprint to define modifications
62
+ *
63
+ * @example
64
+ * await schema.alterTable('users', (table) => {
65
+ * table.string('phone').nullable();
66
+ * table.dropColumn('old_field');
67
+ * });
68
+ */
33
69
  alterTable(tableName: string, structMethod: (blueprint: Blueprint) => void): Promise<void>;
70
+ /**
71
+ * Drops (deletes) a table from the database.
72
+ *
73
+ * @param tableName - The name of the table to drop
74
+ *
75
+ * @example
76
+ * await schema.dropTable('old_users');
77
+ */
34
78
  dropTable(tableName: string): Promise<void>;
79
+ /**
80
+ * Drops a table from the database if it exists.
81
+ * Safe to call even if the table doesn't exist.
82
+ *
83
+ * @param tableName - The name of the table to drop
84
+ *
85
+ * @example
86
+ * await schema.dropTableIfExists('temp_table');
87
+ */
35
88
  dropTableIfExists(tableName: string): Promise<void>;
89
+ /**
90
+ * Retrieves a list of all tables in the database.
91
+ *
92
+ * @returns A promise that resolves to an array of table information
93
+ *
94
+ * @example
95
+ * const allTables = await schema.tables();
96
+ * console.log(allTables);
97
+ */
36
98
  tables(): Promise<any>;
99
+ /**
100
+ * Checks if a table exists in the database.
101
+ *
102
+ * @param table_name - The name of the table to check
103
+ * @returns A promise that resolves to true if the table exists, false otherwise
104
+ *
105
+ * @example
106
+ * if (await schema.tableExists('users')) {
107
+ * console.log('Users table exists');
108
+ * }
109
+ */
37
110
  tableExists(table_name: string): Promise<boolean>;
38
111
  }
39
112
 
@@ -75,7 +148,7 @@ declare abstract class Connection implements EventEmittor<connection_events[]> {
75
148
  abstract emit(event: connection_events, ...args: any[]): Promise<boolean>;
76
149
  abstract isConnected(): boolean;
77
150
  abstract connect(): Promise<boolean>;
78
- abstract runQuery(sql: CompiledSql): Promise<any>;
151
+ abstract runQuery(sql: CompiledSql | string): Promise<any>;
79
152
  abstract runCursor(sql: CompiledSql): Promise<any>;
80
153
  abstract disconnect(): Promise<boolean>;
81
154
  abstract getQuery(): Query;
@@ -1,2 +1,2 @@
1
- export { B as Blueprint, a as Column, C as ColumnPropertiesType, F as ForeignKeyConstraint, I as IndexConstraint } from './Blueprint-BYILRon9.mjs';
1
+ export { B as Blueprint, a as Column, C as ColumnPropertiesType, F as ForeignKeyConstraint, I as IndexConstraint } from './Blueprint-D3WHeqRS.mjs';
2
2
  import '@devbro/neko-helper';
@@ -1,2 +1,2 @@
1
- export { b as Connection, c as connection_events } from './Blueprint-BYILRon9.mjs';
1
+ export { b as Connection, c as connection_events } from './Blueprint-D3WHeqRS.mjs';
2
2
  import '@devbro/neko-helper';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Connection.mts"],"sourcesContent":["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';\nimport { EventEmittor } from '@devbro/neko-helper';\n\nexport type connection_events = 'connect' | 'disconnect' | 'query' | 'error';\nexport abstract class Connection implements EventEmittor<connection_events[]> {\n abstract on(event: connection_events, listener: (...args: any[]) => void): this;\n abstract off(event: connection_events, listener: (...args: any[]) => void): this;\n abstract emit(event: connection_events, ...args: any[]): Promise<boolean>;\n\n abstract isConnected(): boolean;\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 abstract createDatabase(name: string): Promise<void>;\n abstract dropDatabase(name: string): Promise<void>;\n abstract listDatabases(): Promise<string[]>;\n abstract existsDatabase(name: string): Promise<boolean>;\n}\n"],"mappings":";;AAQO,MAAe,WAAwD;AAAA,EAR9E,OAQ8E;AAAA;AAAA;AAqB9E;","names":[]}
1
+ {"version":3,"sources":["../src/Connection.mts"],"sourcesContent":["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';\nimport { EventEmittor } from '@devbro/neko-helper';\n\nexport type connection_events = 'connect' | 'disconnect' | 'query' | 'error';\nexport abstract class Connection implements EventEmittor<connection_events[]> {\n abstract on(event: connection_events, listener: (...args: any[]) => void): this;\n abstract off(event: connection_events, listener: (...args: any[]) => void): this;\n abstract emit(event: connection_events, ...args: any[]): Promise<boolean>;\n\n abstract isConnected(): boolean;\n abstract connect(): Promise<boolean>;\n abstract runQuery(sql: CompiledSql | string): 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 abstract createDatabase(name: string): Promise<void>;\n abstract dropDatabase(name: string): Promise<void>;\n abstract listDatabases(): Promise<string[]>;\n abstract existsDatabase(name: string): Promise<boolean>;\n}\n"],"mappings":";;AAQO,MAAe,WAAwD;AAAA,EAR9E,OAQ8E;AAAA;AAAA;AAqB9E;","names":[]}
@@ -1,2 +1,2 @@
1
- export { E as Expression } from './Blueprint-BYILRon9.mjs';
1
+ export { E as Expression } from './Blueprint-D3WHeqRS.mjs';
2
2
  import '@devbro/neko-helper';
@@ -1,4 +1,4 @@
1
- import { S as Schema } from './Blueprint-BYILRon9.mjs';
1
+ import { S as Schema } from './Blueprint-D3WHeqRS.mjs';
2
2
  import '@devbro/neko-helper';
3
3
 
4
4
  declare abstract class Migration {
package/dist/Query.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- export { d as Query, Q as QueryParts } from './Blueprint-BYILRon9.mjs';
1
+ export { d as Query, Q as QueryParts } from './Blueprint-D3WHeqRS.mjs';
2
2
  import '@devbro/neko-helper';
@@ -1,2 +1,2 @@
1
- export { e as QueryGrammar } from './Blueprint-BYILRon9.mjs';
1
+ export { e as QueryGrammar } from './Blueprint-D3WHeqRS.mjs';
2
2
  import '@devbro/neko-helper';
package/dist/Schema.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- export { S as Schema } from './Blueprint-BYILRon9.mjs';
1
+ export { S as Schema } from './Blueprint-D3WHeqRS.mjs';
2
2
  import '@devbro/neko-helper';
package/dist/Schema.mjs CHANGED
@@ -1,8 +1,13 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
  import { Blueprint } from "./Blueprint.mjs";
4
- import { SchemaGrammar } from "./SchemaGrammar.mjs";
5
4
  class Schema {
5
+ /**
6
+ * Creates a new Schema instance.
7
+ *
8
+ * @param connection - The database connection to use for schema operations
9
+ * @param grammar - The schema grammar for generating SQL statements
10
+ */
6
11
  constructor(connection, grammar) {
7
12
  this.connection = connection;
8
13
  this.grammar = grammar;
@@ -10,37 +15,94 @@ class Schema {
10
15
  static {
11
16
  __name(this, "Schema");
12
17
  }
18
+ /**
19
+ * Creates a new table in the database.
20
+ *
21
+ * @param tableName - The name of the table to create
22
+ * @param structMethod - A callback function that receives a Blueprint to define table structure
23
+ *
24
+ * @example
25
+ * await schema.createTable('users', (table) => {
26
+ * table.increments('id');
27
+ * table.string('name');
28
+ * table.string('email').unique();
29
+ * table.timestamps();
30
+ * });
31
+ */
13
32
  async createTable(tableName, structMethod) {
14
33
  const blueprint = new Blueprint();
15
34
  blueprint.setTableName(tableName, false);
16
35
  structMethod(blueprint);
17
- const grammar = new SchemaGrammar();
18
- const sql = grammar.toSql(blueprint);
36
+ const sql = this.grammar.toSql(blueprint);
19
37
  await this.connection?.runQuery({ sql, parts: [], bindings: [] });
20
38
  }
39
+ /**
40
+ * Modifies an existing table structure.
41
+ *
42
+ * @param tableName - The name of the table to alter
43
+ * @param structMethod - A callback function that receives a Blueprint to define modifications
44
+ *
45
+ * @example
46
+ * await schema.alterTable('users', (table) => {
47
+ * table.string('phone').nullable();
48
+ * table.dropColumn('old_field');
49
+ * });
50
+ */
21
51
  async alterTable(tableName, structMethod) {
22
52
  const blueprint = new Blueprint();
23
53
  blueprint.setTableName(tableName, true);
24
54
  structMethod(blueprint);
25
- const grammar = new SchemaGrammar();
26
- const sql = grammar.toSql(blueprint);
55
+ const sql = this.grammar.toSql(blueprint);
27
56
  await this.connection?.runQuery({ sql, parts: [], bindings: [] });
28
57
  }
58
+ /**
59
+ * Drops (deletes) a table from the database.
60
+ *
61
+ * @param tableName - The name of the table to drop
62
+ *
63
+ * @example
64
+ * await schema.dropTable('old_users');
65
+ */
29
66
  async dropTable(tableName) {
30
- const grammar = new SchemaGrammar();
31
- await this.connection?.runQuery(grammar.compileDropTable(tableName));
67
+ await this.connection?.runQuery(this.grammar.compileDropTable(tableName));
32
68
  }
69
+ /**
70
+ * Drops a table from the database if it exists.
71
+ * Safe to call even if the table doesn't exist.
72
+ *
73
+ * @param tableName - The name of the table to drop
74
+ *
75
+ * @example
76
+ * await schema.dropTableIfExists('temp_table');
77
+ */
33
78
  async dropTableIfExists(tableName) {
34
- const grammar = new SchemaGrammar();
35
- await this.connection?.runQuery(grammar.compileDropTableIfExists(tableName));
79
+ await this.connection?.runQuery(this.grammar.compileDropTableIfExists(tableName));
36
80
  }
81
+ /**
82
+ * Retrieves a list of all tables in the database.
83
+ *
84
+ * @returns A promise that resolves to an array of table information
85
+ *
86
+ * @example
87
+ * const allTables = await schema.tables();
88
+ * console.log(allTables);
89
+ */
37
90
  async tables() {
38
- const grammar = new SchemaGrammar();
39
- return await this.connection?.runQuery(grammar.compileTables());
91
+ return await this.connection?.runQuery(this.grammar.compileTables());
40
92
  }
93
+ /**
94
+ * Checks if a table exists in the database.
95
+ *
96
+ * @param table_name - The name of the table to check
97
+ * @returns A promise that resolves to true if the table exists, false otherwise
98
+ *
99
+ * @example
100
+ * if (await schema.tableExists('users')) {
101
+ * console.log('Users table exists');
102
+ * }
103
+ */
41
104
  async tableExists(table_name) {
42
- const grammar = new SchemaGrammar();
43
- return (await this.connection?.runQuery(grammar.compileTableExists(table_name)))[0]["exists"];
105
+ return (await this.connection?.runQuery(this.grammar.compileTableExists(table_name)))[0]["exists"];
44
106
  }
45
107
  }
46
108
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Schema.mts"],"sourcesContent":["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, parts: [], 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, parts: [], 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"],"mappings":";;AAAA,SAAS,iBAAiB;AAE1B,SAAS,qBAAqB;AAEvB,MAAM,OAAO;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,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AAAA,EAClE;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,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AAAA,EAClE;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;","names":[]}
1
+ {"version":3,"sources":["../src/Schema.mts"],"sourcesContent":["import { Blueprint } from './Blueprint.mjs';\nimport { Connection } from './Connection.mjs';\nimport { SchemaGrammar } from './SchemaGrammar.mjs';\n\n/**\n * Schema builder for creating and managing database tables.\n * Provides methods for table creation, alteration, and inspection.\n */\nexport class Schema {\n /**\n * Creates a new Schema instance.\n *\n * @param connection - The database connection to use for schema operations\n * @param grammar - The schema grammar for generating SQL statements\n */\n constructor(\n private readonly connection: Connection | null,\n private readonly grammar: SchemaGrammar\n ) {}\n\n /**\n * Creates a new table in the database.\n *\n * @param tableName - The name of the table to create\n * @param structMethod - A callback function that receives a Blueprint to define table structure\n *\n * @example\n * await schema.createTable('users', (table) => {\n * table.increments('id');\n * table.string('name');\n * table.string('email').unique();\n * table.timestamps();\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 sql = this.grammar.toSql(blueprint);\n await this.connection?.runQuery({ sql, parts: [], bindings: [] });\n }\n\n /**\n * Modifies an existing table structure.\n *\n * @param tableName - The name of the table to alter\n * @param structMethod - A callback function that receives a Blueprint to define modifications\n *\n * @example\n * await schema.alterTable('users', (table) => {\n * table.string('phone').nullable();\n * table.dropColumn('old_field');\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 sql = this.grammar.toSql(blueprint);\n await this.connection?.runQuery({ sql, parts: [], bindings: [] });\n }\n\n /**\n * Drops (deletes) a table from the database.\n *\n * @param tableName - The name of the table to drop\n *\n * @example\n * await schema.dropTable('old_users');\n */\n async dropTable(tableName: string) {\n await this.connection?.runQuery(this.grammar.compileDropTable(tableName));\n }\n\n /**\n * Drops a table from the database if it exists.\n * Safe to call even if the table doesn't exist.\n *\n * @param tableName - The name of the table to drop\n *\n * @example\n * await schema.dropTableIfExists('temp_table');\n */\n async dropTableIfExists(tableName: string) {\n await this.connection?.runQuery(this.grammar.compileDropTableIfExists(tableName));\n }\n\n /**\n * Retrieves a list of all tables in the database.\n *\n * @returns A promise that resolves to an array of table information\n *\n * @example\n * const allTables = await schema.tables();\n * console.log(allTables);\n */\n async tables() {\n return await this.connection?.runQuery(this.grammar.compileTables());\n }\n\n /**\n * Checks if a table exists in the database.\n *\n * @param table_name - The name of the table to check\n * @returns A promise that resolves to true if the table exists, false otherwise\n *\n * @example\n * if (await schema.tableExists('users')) {\n * console.log('Users table exists');\n * }\n */\n async tableExists(table_name: string): Promise<boolean> {\n return (await this.connection?.runQuery(this.grammar.compileTableExists(table_name)))[0][\n 'exists'\n ];\n }\n}\n"],"mappings":";;AAAA,SAAS,iBAAiB;AAQnB,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlB,YACmB,YACA,SACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAlBL,OAQoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BlB,MAAM,YAAY,WAAmB,cAA8C;AACjF,UAAM,YAAY,IAAI,UAAU;AAChC,cAAU,aAAa,WAAW,KAAK;AACvC,iBAAa,SAAS;AAEtB,UAAM,MAAM,KAAK,QAAQ,MAAM,SAAS;AACxC,UAAM,KAAK,YAAY,SAAS,EAAE,KAAK,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,WAAW,WAAmB,cAA8C;AAChF,UAAM,YAAY,IAAI,UAAU;AAChC,cAAU,aAAa,WAAW,IAAI;AACtC,iBAAa,SAAS;AAEtB,UAAM,MAAM,KAAK,QAAQ,MAAM,SAAS;AACxC,UAAM,KAAK,YAAY,SAAS,EAAE,KAAK,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,UAAU,WAAmB;AACjC,UAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,iBAAiB,SAAS,CAAC;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,kBAAkB,WAAmB;AACzC,UAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,yBAAyB,SAAS,CAAC;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,SAAS;AACb,WAAO,MAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,cAAc,CAAC;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,YAAY,YAAsC;AACtD,YAAQ,MAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,mBAAmB,UAAU,CAAC,GAAG,CAAC,EACrF,QACF;AAAA,EACF;AACF;","names":[]}
@@ -1,2 +1,2 @@
1
- export { f as SchemaGrammar } from './Blueprint-BYILRon9.mjs';
1
+ export { f as SchemaGrammar } from './Blueprint-D3WHeqRS.mjs';
2
2
  import '@devbro/neko-helper';
@@ -1,6 +1,6 @@
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-BYILRon9.mjs';
4
+ import '../Blueprint-D3WHeqRS.mjs';
5
5
  import '@devbro/neko-helper';
6
6
  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, c as connection_events, m as CompiledSql, d as Query, S as Schema } from '../../Blueprint-BYILRon9.mjs';
3
+ import { b as Connection, c as connection_events, m as CompiledSql, d as Query, S as Schema } from '../../Blueprint-D3WHeqRS.mjs';
4
4
  import { PoolClient, Pool, PoolConfig } from 'pg';
5
5
  import '@devbro/neko-helper';
6
6
 
@@ -14,7 +14,7 @@ declare class PostgresqlConnection extends Connection {
14
14
  static defaults: PoolConfig;
15
15
  constructor(params: PoolConfig);
16
16
  connect(): Promise<boolean>;
17
- runQuery(sql: CompiledSql): Promise<any[]>;
17
+ runQuery(sql: CompiledSql | string): Promise<any>;
18
18
  runCursor(sql: CompiledSql): Promise<any>;
19
19
  disconnect(): Promise<boolean>;
20
20
  getQuery(): Query;
@@ -1,6 +1,7 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
3
  import { Connection as ConnectionAbs } from "../../Connection.mjs";
4
+ import { Client } from "pg";
4
5
  import { Pool } from "pg";
5
6
  import { Query } from "../../Query.mjs";
6
7
  import { PostgresqlQueryGrammar } from "./PostgresqlQueryGrammar.mjs";
@@ -48,6 +49,9 @@ class PostgresqlConnection extends ConnectionAbs {
48
49
  return true;
49
50
  }
50
51
  async runQuery(sql) {
52
+ if (typeof sql === "string") {
53
+ sql = { sql, bindings: [], parts: [sql] };
54
+ }
51
55
  let counter = 1;
52
56
  let sql2 = sql.sql;
53
57
  if (sql.parts && sql.parts.length > 0) {
@@ -129,18 +133,31 @@ class PostgresqlConnection extends ConnectionAbs {
129
133
  return name;
130
134
  }
131
135
  async createDatabase(name) {
132
- if (!this.isConnected()) {
133
- await this.connect();
136
+ if (this.isConnected()) {
137
+ throw new Error("Cannot create database while connected.");
134
138
  }
139
+ let conn = new Client({
140
+ ...PostgresqlConnection.pool.options,
141
+ database: "postgres"
142
+ });
143
+ await conn.connect();
135
144
  const safeName = this.validateAndEscapeIdentifier(name);
136
- await this.connection.query(`CREATE DATABASE ${safeName}`);
145
+ await conn.query(`CREATE DATABASE ${safeName}`);
146
+ await conn.end();
137
147
  }
138
148
  async dropDatabase(name) {
139
- if (!this.isConnected()) {
140
- await this.connect();
149
+ if (this.isConnected()) {
150
+ throw new Error("Cannot drop database while connected.");
141
151
  }
152
+ let conn = new Client({
153
+ ...PostgresqlConnection.pool.options,
154
+ database: "postgres"
155
+ // connect to default 'postgres' database to drop others
156
+ });
157
+ await conn.connect();
142
158
  const safeName = this.validateAndEscapeIdentifier(name);
143
- await this.connection.query(`DROP DATABASE ${safeName}`);
159
+ await conn.query(`DROP DATABASE ${safeName}`);
160
+ await conn.end();
144
161
  }
145
162
  async listDatabases() {
146
163
  if (!this.isConnected()) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/databases/postgresql/PostgresqlConnection.mts"],"sourcesContent":["import { connection_events, 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';\nimport { EventManager } from '@devbro/neko-helper';\n\nexport class PostgresqlConnection extends ConnectionAbs {\n private eventManager = new EventManager();\n\n on(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.on(event, listener);\n return this;\n }\n off(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.off(event, listener);\n return this;\n }\n emit(event: connection_events, ...args: any[]): Promise<boolean> {\n return this.eventManager.emit(event, ...args);\n }\n\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.eventManager.emit('connect');\n this.connection = await PostgresqlConnection.pool.connect();\n return true;\n }\n async runQuery(sql: CompiledSql) {\n let counter = 1;\n let sql2 = sql.sql;\n if (sql.parts && sql.parts.length > 0) {\n sql2 = sql.parts.map((v) => (v === '?' ? '$' + counter++ : v)).join(' ');\n }\n\n this.eventManager.emit('query', { sql: sql2, bindings: sql.bindings });\n\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query(sql2, 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 if (this.connection === undefined) {\n return true;\n }\n await this.connection?.release();\n this.connection = undefined;\n this.eventManager.emit('disconnect');\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 await this.runQuery({ sql: 'BEGIN', bindings: [], parts: ['BEGIN'] });\n }\n\n async commit(): Promise<void> {\n await this.runQuery({ sql: 'COMMIT', bindings: [], parts: ['COMMIT'] });\n }\n\n async rollback(): Promise<void> {\n await this.runQuery({ sql: 'ROLLBACK', bindings: [], parts: ['ROLLBACK'] });\n }\n\n static async destroy(): Promise<void> {\n PostgresqlConnection.pool.end();\n return;\n }\n\n isConnected(): boolean {\n return this.connection !== undefined;\n }\n\n /**\n * Validates and escapes a PostgreSQL identifier (database name, table name, etc.)\n * Uses a whitelist approach to ensure only safe characters are allowed\n */\n private validateAndEscapeIdentifier(name: string): string {\n // PostgreSQL identifiers can contain: letters, digits, underscores, and dollar signs\n // They must start with a letter or underscore\n const validIdentifierPattern = /^[a-zA-Z_][a-zA-Z0-9_$]*$/;\n\n if (!validIdentifierPattern.test(name)) {\n throw new Error(\n `Invalid identifier: \"${name}\". Identifiers must start with a letter or underscore and contain only letters, digits, underscores, and dollar signs.`\n );\n }\n\n // PostgreSQL reserved keywords that should be quoted\n const reservedKeywords = new Set([\n 'user',\n 'table',\n 'database',\n 'order',\n 'group',\n 'select',\n 'insert',\n 'update',\n 'delete',\n ]);\n\n // Quote the identifier if it's a reserved keyword or contains uppercase letters\n if (reservedKeywords.has(name.toLowerCase()) || name !== name.toLowerCase()) {\n // Escape any double quotes in the name\n const escapedName = name.replace(/\"/g, '\"\"');\n return `\"${escapedName}\"`;\n }\n\n return name;\n }\n\n async createDatabase(name: string): Promise<void> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const safeName = this.validateAndEscapeIdentifier(name);\n await this.connection!.query(`CREATE DATABASE ${safeName}`);\n }\n\n async dropDatabase(name: string): Promise<void> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const safeName = this.validateAndEscapeIdentifier(name);\n await this.connection!.query(`DROP DATABASE ${safeName}`);\n }\n\n async listDatabases(): Promise<string[]> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query(\n 'SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY datname'\n );\n return result.rows.map((row: any) => row.datname);\n }\n\n async existsDatabase(name: string): Promise<boolean> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query('SELECT 1 FROM pg_database WHERE datname = $1', [\n name,\n ]);\n return result.rows.length > 0;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/databases/postgresql/PostgresqlConnection.mts"],"sourcesContent":["import { connection_events, Connection as ConnectionAbs } from '../../Connection.mjs';\nimport { Client, 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';\nimport { EventManager } from '@devbro/neko-helper';\n\nexport class PostgresqlConnection extends ConnectionAbs {\n private eventManager = new EventManager();\n\n on(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.on(event, listener);\n return this;\n }\n off(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.off(event, listener);\n return this;\n }\n emit(event: connection_events, ...args: any[]): Promise<boolean> {\n return this.eventManager.emit(event, ...args);\n }\n\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.eventManager.emit('connect');\n this.connection = await PostgresqlConnection.pool.connect();\n return true;\n }\n async runQuery(sql: CompiledSql | string): Promise<any> {\n if( typeof sql === 'string') {\n sql = { sql: sql, bindings: [], parts: [sql] };\n }\n let counter = 1;\n let sql2 = sql.sql;\n if (sql.parts && sql.parts.length > 0) {\n sql2 = sql.parts.map((v) => (v === '?' ? '$' + counter++ : v)).join(' ');\n }\n\n this.eventManager.emit('query', { sql: sql2, bindings: sql.bindings });\n\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query(sql2, 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 if (this.connection === undefined) {\n return true;\n }\n await this.connection?.release();\n this.connection = undefined;\n this.eventManager.emit('disconnect');\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 await this.runQuery({ sql: 'BEGIN', bindings: [], parts: ['BEGIN'] });\n }\n\n async commit(): Promise<void> {\n await this.runQuery({ sql: 'COMMIT', bindings: [], parts: ['COMMIT'] });\n }\n\n async rollback(): Promise<void> {\n await this.runQuery({ sql: 'ROLLBACK', bindings: [], parts: ['ROLLBACK'] });\n }\n\n static async destroy(): Promise<void> {\n PostgresqlConnection.pool.end();\n return;\n }\n\n isConnected(): boolean {\n return this.connection !== undefined;\n }\n\n /**\n * Validates and escapes a PostgreSQL identifier (database name, table name, etc.)\n * Uses a whitelist approach to ensure only safe characters are allowed\n */\n private validateAndEscapeIdentifier(name: string): string {\n // PostgreSQL identifiers can contain: letters, digits, underscores, and dollar signs\n // They must start with a letter or underscore\n const validIdentifierPattern = /^[a-zA-Z_][a-zA-Z0-9_$]*$/;\n\n if (!validIdentifierPattern.test(name)) {\n throw new Error(\n `Invalid identifier: \"${name}\". Identifiers must start with a letter or underscore and contain only letters, digits, underscores, and dollar signs.`\n );\n }\n\n // PostgreSQL reserved keywords that should be quoted\n const reservedKeywords = new Set([\n 'user',\n 'table',\n 'database',\n 'order',\n 'group',\n 'select',\n 'insert',\n 'update',\n 'delete',\n ]);\n\n // Quote the identifier if it's a reserved keyword or contains uppercase letters\n if (reservedKeywords.has(name.toLowerCase()) || name !== name.toLowerCase()) {\n // Escape any double quotes in the name\n const escapedName = name.replace(/\"/g, '\"\"');\n return `\"${escapedName}\"`;\n }\n\n return name;\n }\n\n async createDatabase(name: string): Promise<void> {\n if (this.isConnected()) {\n throw new Error('Cannot create database while connected.');\n }\n\n let conn = new Client({\n ...PostgresqlConnection.pool.options,\n database: 'postgres',\n });\n await conn.connect();\n const safeName = this.validateAndEscapeIdentifier(name);\n await conn.query(`CREATE DATABASE ${safeName}`);\n await conn.end();\n }\n\n async dropDatabase(name: string): Promise<void> {\n if (this.isConnected()) {\n throw new Error('Cannot drop database while connected.');\n }\n\n let conn = new Client({\n ...PostgresqlConnection.pool.options,\n database: 'postgres', // connect to default 'postgres' database to drop others\n });\n await conn.connect();\n const safeName = this.validateAndEscapeIdentifier(name);\n await conn.query(`DROP DATABASE ${safeName}`);\n await conn.end();\n }\n\n async listDatabases(): Promise<string[]> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query(\n 'SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY datname'\n );\n return result.rows.map((row: any) => row.datname);\n }\n\n async existsDatabase(name: string): Promise<boolean> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query('SELECT 1 FROM pg_database WHERE datname = $1', [\n name,\n ]);\n return result.rows.length > 0;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,4 @@
1
- import { e as QueryGrammar, d as Query, m as CompiledSql, P as Parameter } from '../../Blueprint-BYILRon9.mjs';
1
+ import { e as QueryGrammar, d as Query, m as CompiledSql, P as Parameter } from '../../Blueprint-D3WHeqRS.mjs';
2
2
  import '@devbro/neko-helper';
3
3
 
4
4
  declare class PostgresqlQueryGrammar extends QueryGrammar {
@@ -1,4 +1,4 @@
1
- import { f as SchemaGrammar } from '../../Blueprint-BYILRon9.mjs';
1
+ import { f as SchemaGrammar } from '../../Blueprint-D3WHeqRS.mjs';
2
2
  import '@devbro/neko-helper';
3
3
 
4
4
  declare class PostgresqlSchemaGrammar extends SchemaGrammar {
@@ -1,6 +1,6 @@
1
1
  export { PostgresqlConnection } from './PostgresqlConnection.mjs';
2
2
  export { PostgresqlQueryGrammar } from './PostgresqlQueryGrammar.mjs';
3
3
  export { PostgresqlSchemaGrammar } from './PostgresqlSchemaGrammar.mjs';
4
- import '../../Blueprint-BYILRon9.mjs';
4
+ import '../../Blueprint-D3WHeqRS.mjs';
5
5
  import '@devbro/neko-helper';
6
6
  import 'pg';
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
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, m as CompiledSql, b as Connection, F as ForeignKeyConstraint, I as IndexConstraint, J as JoinCondition, P as Parameter, d as Query, e as QueryGrammar, Q as QueryParts, S as Schema, f as SchemaGrammar, c as connection_events, n as havingType, o as joinType, s as selectType, w as whereBasic, i as whereNested, k as whereNull, g as whereOp, h as whereOpColumn, j as whereRaw, l as whereType } from './Blueprint-BYILRon9.mjs';
4
+ export { B as Blueprint, a as Column, C as ColumnPropertiesType, m as CompiledSql, b as Connection, F as ForeignKeyConstraint, I as IndexConstraint, J as JoinCondition, P as Parameter, d as Query, e as QueryGrammar, Q as QueryParts, S as Schema, f as SchemaGrammar, c as connection_events, n as havingType, o as joinType, s as selectType, w as whereBasic, i as whereNested, k as whereNull, g as whereOp, h as whereOpColumn, j as whereRaw, l as whereType } from './Blueprint-D3WHeqRS.mjs';
5
5
  export { Migration } from './Migration.mjs';
6
6
  import 'pg';
7
7
  import '@devbro/neko-helper';
package/dist/index.js CHANGED
@@ -56,6 +56,7 @@ var Connection = class {
56
56
 
57
57
  // src/databases/postgresql/PostgresqlConnection.mts
58
58
  var import_pg = require("pg");
59
+ var import_pg2 = require("pg");
59
60
 
60
61
  // src/Query.mts
61
62
  var Query = class _Query {
@@ -862,6 +863,112 @@ var Blueprint = class {
862
863
  }
863
864
  };
864
865
 
866
+ // src/Schema.mts
867
+ var Schema = class {
868
+ /**
869
+ * Creates a new Schema instance.
870
+ *
871
+ * @param connection - The database connection to use for schema operations
872
+ * @param grammar - The schema grammar for generating SQL statements
873
+ */
874
+ constructor(connection, grammar) {
875
+ this.connection = connection;
876
+ this.grammar = grammar;
877
+ }
878
+ static {
879
+ __name(this, "Schema");
880
+ }
881
+ /**
882
+ * Creates a new table in the database.
883
+ *
884
+ * @param tableName - The name of the table to create
885
+ * @param structMethod - A callback function that receives a Blueprint to define table structure
886
+ *
887
+ * @example
888
+ * await schema.createTable('users', (table) => {
889
+ * table.increments('id');
890
+ * table.string('name');
891
+ * table.string('email').unique();
892
+ * table.timestamps();
893
+ * });
894
+ */
895
+ async createTable(tableName, structMethod) {
896
+ const blueprint = new Blueprint();
897
+ blueprint.setTableName(tableName, false);
898
+ structMethod(blueprint);
899
+ const sql = this.grammar.toSql(blueprint);
900
+ await this.connection?.runQuery({ sql, parts: [], bindings: [] });
901
+ }
902
+ /**
903
+ * Modifies an existing table structure.
904
+ *
905
+ * @param tableName - The name of the table to alter
906
+ * @param structMethod - A callback function that receives a Blueprint to define modifications
907
+ *
908
+ * @example
909
+ * await schema.alterTable('users', (table) => {
910
+ * table.string('phone').nullable();
911
+ * table.dropColumn('old_field');
912
+ * });
913
+ */
914
+ async alterTable(tableName, structMethod) {
915
+ const blueprint = new Blueprint();
916
+ blueprint.setTableName(tableName, true);
917
+ structMethod(blueprint);
918
+ const sql = this.grammar.toSql(blueprint);
919
+ await this.connection?.runQuery({ sql, parts: [], bindings: [] });
920
+ }
921
+ /**
922
+ * Drops (deletes) a table from the database.
923
+ *
924
+ * @param tableName - The name of the table to drop
925
+ *
926
+ * @example
927
+ * await schema.dropTable('old_users');
928
+ */
929
+ async dropTable(tableName) {
930
+ await this.connection?.runQuery(this.grammar.compileDropTable(tableName));
931
+ }
932
+ /**
933
+ * Drops a table from the database if it exists.
934
+ * Safe to call even if the table doesn't exist.
935
+ *
936
+ * @param tableName - The name of the table to drop
937
+ *
938
+ * @example
939
+ * await schema.dropTableIfExists('temp_table');
940
+ */
941
+ async dropTableIfExists(tableName) {
942
+ await this.connection?.runQuery(this.grammar.compileDropTableIfExists(tableName));
943
+ }
944
+ /**
945
+ * Retrieves a list of all tables in the database.
946
+ *
947
+ * @returns A promise that resolves to an array of table information
948
+ *
949
+ * @example
950
+ * const allTables = await schema.tables();
951
+ * console.log(allTables);
952
+ */
953
+ async tables() {
954
+ return await this.connection?.runQuery(this.grammar.compileTables());
955
+ }
956
+ /**
957
+ * Checks if a table exists in the database.
958
+ *
959
+ * @param table_name - The name of the table to check
960
+ * @returns A promise that resolves to true if the table exists, false otherwise
961
+ *
962
+ * @example
963
+ * if (await schema.tableExists('users')) {
964
+ * console.log('Users table exists');
965
+ * }
966
+ */
967
+ async tableExists(table_name) {
968
+ return (await this.connection?.runQuery(this.grammar.compileTableExists(table_name)))[0]["exists"];
969
+ }
970
+ };
971
+
865
972
  // src/SchemaGrammar.mts
866
973
  var SchemaGrammar = class {
867
974
  static {
@@ -1069,49 +1176,6 @@ var SchemaGrammar = class {
1069
1176
  }
1070
1177
  };
1071
1178
 
1072
- // src/Schema.mts
1073
- var Schema = class {
1074
- constructor(connection, grammar) {
1075
- this.connection = connection;
1076
- this.grammar = grammar;
1077
- }
1078
- static {
1079
- __name(this, "Schema");
1080
- }
1081
- async createTable(tableName, structMethod) {
1082
- const blueprint = new Blueprint();
1083
- blueprint.setTableName(tableName, false);
1084
- structMethod(blueprint);
1085
- const grammar = new SchemaGrammar();
1086
- const sql = grammar.toSql(blueprint);
1087
- await this.connection?.runQuery({ sql, parts: [], bindings: [] });
1088
- }
1089
- async alterTable(tableName, structMethod) {
1090
- const blueprint = new Blueprint();
1091
- blueprint.setTableName(tableName, true);
1092
- structMethod(blueprint);
1093
- const grammar = new SchemaGrammar();
1094
- const sql = grammar.toSql(blueprint);
1095
- await this.connection?.runQuery({ sql, parts: [], bindings: [] });
1096
- }
1097
- async dropTable(tableName) {
1098
- const grammar = new SchemaGrammar();
1099
- await this.connection?.runQuery(grammar.compileDropTable(tableName));
1100
- }
1101
- async dropTableIfExists(tableName) {
1102
- const grammar = new SchemaGrammar();
1103
- await this.connection?.runQuery(grammar.compileDropTableIfExists(tableName));
1104
- }
1105
- async tables() {
1106
- const grammar = new SchemaGrammar();
1107
- return await this.connection?.runQuery(grammar.compileTables());
1108
- }
1109
- async tableExists(table_name) {
1110
- const grammar = new SchemaGrammar();
1111
- return (await this.connection?.runQuery(grammar.compileTableExists(table_name)))[0]["exists"];
1112
- }
1113
- };
1114
-
1115
1179
  // src/databases/postgresql/PostgresqlSchemaGrammar.mts
1116
1180
  var PostgresqlSchemaGrammar = class extends SchemaGrammar {
1117
1181
  static {
@@ -1153,7 +1217,7 @@ var PostgresqlConnection = class _PostgresqlConnection extends Connection {
1153
1217
  constructor(params) {
1154
1218
  super();
1155
1219
  if (!_PostgresqlConnection.pool) {
1156
- _PostgresqlConnection.pool = new import_pg.Pool({ ..._PostgresqlConnection.defaults, ...params });
1220
+ _PostgresqlConnection.pool = new import_pg2.Pool({ ..._PostgresqlConnection.defaults, ...params });
1157
1221
  }
1158
1222
  }
1159
1223
  async connect() {
@@ -1162,6 +1226,9 @@ var PostgresqlConnection = class _PostgresqlConnection extends Connection {
1162
1226
  return true;
1163
1227
  }
1164
1228
  async runQuery(sql) {
1229
+ if (typeof sql === "string") {
1230
+ sql = { sql, bindings: [], parts: [sql] };
1231
+ }
1165
1232
  let counter = 1;
1166
1233
  let sql2 = sql.sql;
1167
1234
  if (sql.parts && sql.parts.length > 0) {
@@ -1243,18 +1310,31 @@ var PostgresqlConnection = class _PostgresqlConnection extends Connection {
1243
1310
  return name;
1244
1311
  }
1245
1312
  async createDatabase(name) {
1246
- if (!this.isConnected()) {
1247
- await this.connect();
1313
+ if (this.isConnected()) {
1314
+ throw new Error("Cannot create database while connected.");
1248
1315
  }
1316
+ let conn = new import_pg.Client({
1317
+ ..._PostgresqlConnection.pool.options,
1318
+ database: "postgres"
1319
+ });
1320
+ await conn.connect();
1249
1321
  const safeName = this.validateAndEscapeIdentifier(name);
1250
- await this.connection.query(`CREATE DATABASE ${safeName}`);
1322
+ await conn.query(`CREATE DATABASE ${safeName}`);
1323
+ await conn.end();
1251
1324
  }
1252
1325
  async dropDatabase(name) {
1253
- if (!this.isConnected()) {
1254
- await this.connect();
1326
+ if (this.isConnected()) {
1327
+ throw new Error("Cannot drop database while connected.");
1255
1328
  }
1329
+ let conn = new import_pg.Client({
1330
+ ..._PostgresqlConnection.pool.options,
1331
+ database: "postgres"
1332
+ // connect to default 'postgres' database to drop others
1333
+ });
1334
+ await conn.connect();
1256
1335
  const safeName = this.validateAndEscapeIdentifier(name);
1257
- await this.connection.query(`DROP DATABASE ${safeName}`);
1336
+ await conn.query(`DROP DATABASE ${safeName}`);
1337
+ await conn.end();
1258
1338
  }
1259
1339
  async listDatabases() {
1260
1340
  if (!this.isConnected()) {
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';\nimport { EventEmittor } from '@devbro/neko-helper';\n\nexport type connection_events = 'connect' | 'disconnect' | 'query' | 'error';\nexport abstract class Connection implements EventEmittor<connection_events[]> {\n abstract on(event: connection_events, listener: (...args: any[]) => void): this;\n abstract off(event: connection_events, listener: (...args: any[]) => void): this;\n abstract emit(event: connection_events, ...args: any[]): Promise<boolean>;\n\n abstract isConnected(): boolean;\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 abstract createDatabase(name: string): Promise<void>;\n abstract dropDatabase(name: string): Promise<void>;\n abstract listDatabases(): Promise<string[]>;\n abstract existsDatabase(name: string): Promise<boolean>;\n}\n","import { connection_events, 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';\nimport { EventManager } from '@devbro/neko-helper';\n\nexport class PostgresqlConnection extends ConnectionAbs {\n private eventManager = new EventManager();\n\n on(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.on(event, listener);\n return this;\n }\n off(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.off(event, listener);\n return this;\n }\n emit(event: connection_events, ...args: any[]): Promise<boolean> {\n return this.eventManager.emit(event, ...args);\n }\n\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.eventManager.emit('connect');\n this.connection = await PostgresqlConnection.pool.connect();\n return true;\n }\n async runQuery(sql: CompiledSql) {\n let counter = 1;\n let sql2 = sql.sql;\n if (sql.parts && sql.parts.length > 0) {\n sql2 = sql.parts.map((v) => (v === '?' ? '$' + counter++ : v)).join(' ');\n }\n\n this.eventManager.emit('query', { sql: sql2, bindings: sql.bindings });\n\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query(sql2, 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 if (this.connection === undefined) {\n return true;\n }\n await this.connection?.release();\n this.connection = undefined;\n this.eventManager.emit('disconnect');\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 await this.runQuery({ sql: 'BEGIN', bindings: [], parts: ['BEGIN'] });\n }\n\n async commit(): Promise<void> {\n await this.runQuery({ sql: 'COMMIT', bindings: [], parts: ['COMMIT'] });\n }\n\n async rollback(): Promise<void> {\n await this.runQuery({ sql: 'ROLLBACK', bindings: [], parts: ['ROLLBACK'] });\n }\n\n static async destroy(): Promise<void> {\n PostgresqlConnection.pool.end();\n return;\n }\n\n isConnected(): boolean {\n return this.connection !== undefined;\n }\n\n /**\n * Validates and escapes a PostgreSQL identifier (database name, table name, etc.)\n * Uses a whitelist approach to ensure only safe characters are allowed\n */\n private validateAndEscapeIdentifier(name: string): string {\n // PostgreSQL identifiers can contain: letters, digits, underscores, and dollar signs\n // They must start with a letter or underscore\n const validIdentifierPattern = /^[a-zA-Z_][a-zA-Z0-9_$]*$/;\n\n if (!validIdentifierPattern.test(name)) {\n throw new Error(\n `Invalid identifier: \"${name}\". Identifiers must start with a letter or underscore and contain only letters, digits, underscores, and dollar signs.`\n );\n }\n\n // PostgreSQL reserved keywords that should be quoted\n const reservedKeywords = new Set([\n 'user',\n 'table',\n 'database',\n 'order',\n 'group',\n 'select',\n 'insert',\n 'update',\n 'delete',\n ]);\n\n // Quote the identifier if it's a reserved keyword or contains uppercase letters\n if (reservedKeywords.has(name.toLowerCase()) || name !== name.toLowerCase()) {\n // Escape any double quotes in the name\n const escapedName = name.replace(/\"/g, '\"\"');\n return `\"${escapedName}\"`;\n }\n\n return name;\n }\n\n async createDatabase(name: string): Promise<void> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const safeName = this.validateAndEscapeIdentifier(name);\n await this.connection!.query(`CREATE DATABASE ${safeName}`);\n }\n\n async dropDatabase(name: string): Promise<void> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const safeName = this.validateAndEscapeIdentifier(name);\n await this.connection!.query(`DROP DATABASE ${safeName}`);\n }\n\n async listDatabases(): Promise<string[]> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query(\n 'SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY datname'\n );\n return result.rows.map((row: any) => row.datname);\n }\n\n async existsDatabase(name: string): Promise<boolean> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query('SELECT 1 FROM pg_database WHERE datname = $1', [\n name,\n ]);\n return result.rows.length > 0;\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 alias: string | 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 alias: 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 whereRaw(\n sql: string,\n bindings: Parameter[],\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.where.push({ type: 'raw', sql, bindings, joinCondition, negateCondition });\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 let sql = this.toSql();\n return await this.connection?.runQuery(sql);\n }\n\n async first() {\n let rc = await this.connection?.runQuery(this.toSql());\n if (rc && Array.isArray(rc) && rc.length > 0) {\n return rc[0];\n }\n return undefined;\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 | Query,\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(\n table: Parameters<typeof this.join>[0],\n conditions: (whereType | { column1: string; column2: string })[]\n ): this {\n return this.join(table, 'inner', conditions);\n }\n\n leftJoin(\n table: Parameters<typeof this.join>[0],\n conditions: (whereType | { column1: string; column2: string })[]\n ): this {\n return this.join(table, 'left', conditions);\n }\n\n rightJoin(\n table: Parameters<typeof this.join>[0],\n conditions: (whereType | { column1: string; column2: string })[]\n ): this {\n return this.join(table, 'right', conditions);\n }\n\n fullJoin(\n table: Parameters<typeof this.join>[0],\n conditions: (whereType | { column1: string; column2: string })[]\n ): this {\n return this.join(table, 'full', conditions);\n }\n\n crossJoin(\n table: Parameters<typeof this.join>[0],\n conditions: (whereType | { column1: string; column2: string })[]\n ): this {\n return this.join(table, 'cross', conditions);\n }\n\n alias(alias: string): this {\n this.parts.alias = alias;\n return this;\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// @ts-ignore - no type definitions available for sql-tokenizer\nimport { sqlTokenizer } from 'sql-tokenizer';\nimport { Arr } from '@devbro/neko-helper';\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 rc = this.toSqlParts(query);\n rc.sql = this.joinArray(rc.parts);\n return rc;\n }\n\n toSqlParts(query: Query): CompiledSql {\n let parts: string[] = [];\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 bindings = [...bindings, ...r.bindings];\n parts = [...parts, ...r.parts];\n }\n\n return {\n sql: '',\n bindings,\n parts,\n };\n }\n\n compileCount(query: Query): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n let parts: (string | number)[] = [];\n\n for (const part of this.sqlParts) {\n // @ts-ignore\n let parts2 = query.parts[part];\n if (part === 'select') {\n parts2 = ['count(*) as count'];\n }\n // @ts-ignore\n const funcName: keyof this = 'compile' + toUpperFirst(part);\n // @ts-ignore\n const r = this[funcName](parts2);\n bindings = [...bindings, ...r.bindings];\n parts = [...parts, ...r.parts];\n }\n return { sql, parts, bindings };\n }\n\n compileSelect(selects: selectType[]): CompiledSql {\n const parts = ['select'];\n selects.map((v) => {\n parts.push(v);\n parts.push(',');\n });\n parts.pop();\n\n return { sql: this.joinArray(parts), parts, bindings: [] };\n }\n\n joinArray(arr: (string | number)[]): string {\n let rc = '';\n let last: string | number = '';\n for (const a of arr) {\n if (a === ',') {\n rc += a;\n } else if (last === '(' || last === ' ' || a === ')') {\n rc += a;\n } else if (a === '') {\n rc += '';\n } else {\n rc += ' ' + a;\n }\n last = a;\n }\n\n return rc.trim();\n }\n\n compileTable(tableName: string): CompiledSql {\n let parts = [];\n if (tableName.length) {\n parts.push('from');\n parts.push(tableName);\n }\n\n return { sql: parts.join(' '), parts, bindings: [] };\n }\n\n compileJoin(joins: joinType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n let parts: (string | number)[] = [];\n\n for (const j of joins) {\n let table = '';\n let table_bindings: any[] = [];\n\n parts.push(j.type);\n parts.push('join');\n if (typeof j.table === 'string') {\n parts.push(j.table);\n } else {\n const subQuery = j.table;\n const { parts: parts2, bindings } = subQuery.toSql();\n parts = [...parts, '(', ...parts2, ')', 'as', subQuery.parts.alias || 'subquery'];\n table_bindings = bindings;\n }\n\n parts.push('on');\n\n const where = this.compileWhere(j.conditions);\n const where_parts = where.parts;\n where_parts.shift();\n parts.push('(');\n parts = [...parts, ...where_parts];\n parts.push(')');\n\n bindings = [...bindings, ...table_bindings, ...where.bindings];\n }\n\n return { sql, parts, bindings };\n }\n\n compileWhere(wheres: whereType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n let parts: (string | number)[] = [];\n\n for (const w of wheres) {\n sql += ' ' + w.joinCondition + ' ';\n parts.push(w.joinCondition);\n if (w.negateCondition) {\n sql += 'not ';\n parts.push('not');\n }\n const funcName = 'compileWhere' + toUpperFirst(w.type);\n // @ts-ignore\n const wh = this[funcName](w);\n sql += wh.sql;\n parts = parts.concat(wh.parts);\n bindings = [...bindings, ...wh.bindings];\n }\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\n if (parts.length > 0) {\n parts[0] = 'where';\n }\n return { sql, parts, bindings };\n }\n\n compileWhereNested(w: whereNested): CompiledSql {\n const subQuery = w.query;\n let parts: (string | number)[] = [];\n const { sql, parts: parts2, bindings } = subQuery.grammar.compileWhere(subQuery.parts.where);\n let sql2 = sql.replace(/^where /, '');\n parts2.shift();\n parts.push('(');\n parts = parts.concat(parts2);\n parts.push(')');\n return {\n sql: `(${sql2})`,\n parts,\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( ? )`,\n parts: [w.column, ' = ANY(', '?', ')'],\n bindings: [w.value],\n };\n }\n\n return {\n sql: `${w.column} ${w.operation} ?`,\n parts: [w.column, w.operation, '?'],\n bindings: [w.value],\n };\n }\n\n compileWhereOperationColumn(w: whereOpColumn): CompiledSql {\n return {\n sql: `${w.column1} ${w.operation} ${w.column2}`,\n parts: [w.column1, w.operation, w.column2],\n bindings: [],\n };\n }\n\n compileWhereRaw(w: whereRaw): CompiledSql {\n const tokenize = sqlTokenizer();\n\n return {\n sql: w.sql,\n parts: tokenize(w.sql).filter((t: string) => t !== ' '),\n bindings: w.bindings,\n };\n }\n\n compileOrderBy(orderBy: string[]): CompiledSql {\n let rc = '';\n let parts: (string | number)[] = [];\n if (orderBy.length) {\n rc = 'order by ' + orderBy.join(', ');\n parts.push('order by');\n parts = parts.concat(Arr.intersperse(orderBy, ','));\n }\n\n return { sql: rc, parts, bindings: [] };\n }\n\n compileLimit(limit: number | null): CompiledSql {\n let rc = '';\n let parts: (string | number)[] = [];\n if (limit !== null) {\n rc = 'limit ' + limit;\n parts.push('limit');\n parts.push(limit);\n }\n\n return { sql: rc, parts, bindings: [] };\n }\n\n compileOffset(offset: number | null): CompiledSql {\n let rc = '';\n let parts: (string | number)[] = [];\n if (offset !== null) {\n rc = 'offset ' + offset;\n parts.push('offset');\n parts.push(offset);\n }\n\n return { sql: rc, parts, bindings: [] };\n }\n\n compileWhereNull(w: whereNull): CompiledSql {\n return {\n sql: `${w.column} is null`,\n parts: [w.column, 'is', 'null'],\n bindings: [],\n };\n }\n\n compileInsert(query: Query, data: Record<string, Parameter>): CompiledSql {\n let parts = ['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 parts.push(k);\n parts.push(',');\n }\n parts.pop();\n parts = parts.concat([')', 'values', '(']);\n\n for (const [k, v] of Object.entries(data)) {\n parts.push('?');\n bindings.push(v);\n parts.push(',');\n }\n parts.pop();\n parts.push(')');\n\n return { sql: parts.join(' '), parts, 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 const bindings: Parameter[] = [];\n let parts: (string | number)[] = ['update', query.parts.table, 'set'];\n\n const setParts = [];\n for (const [k, v] of Object.entries(data)) {\n parts = parts.concat([k, '=', '?', ',']);\n setParts.push(`${k} = ?`);\n bindings.push(v);\n }\n parts.pop();\n\n const where_csql = this.compileWhere(query.parts.where);\n parts = parts.concat(where_csql.parts);\n bindings.push(...where_csql.bindings);\n\n return { sql: parts.join(' '), parts, bindings };\n }\n\n compileDelete(query: Query): CompiledSql {\n let sql = 'delete from ' + query.parts.table;\n let parts: (string | number)[] = ['delete', 'from', query.parts.table];\n const where_csql = this.compileWhere(query.parts.where);\n sql += ' ' + where_csql.sql;\n parts = parts.concat(where_csql.parts);\n return { sql, parts, 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 parts: (string | number)[] = [];\n const bindings: Parameter[] = [];\n\n let isql = this.compileInsert(query, data);\n parts = isql.parts;\n bindings.push(...isql.bindings);\n\n parts = parts.concat(['on', 'conflict', '(', ...conflictFields, ')', 'do', 'update', 'set']);\n const setParts = [];\n for (const f of updateFields) {\n setParts.push(`${f} = excluded.${f}`);\n setParts.push(`,`);\n }\n setParts.pop();\n parts = parts.concat(setParts);\n\n const where_csql = this.compileWhere(query.parts.where);\n parts = parts.concat(where_csql.parts);\n bindings.push(...where_csql.bindings);\n\n return { sql: parts.join(' '), parts, bindings };\n }\n\n compileGroupBy(groupBy: string[]): CompiledSql {\n let rc = '';\n let parts: (string | number)[] = [];\n if (groupBy.length) {\n rc = 'group by ' + groupBy.join(', ');\n parts.push('group by');\n parts = parts.concat(groupBy);\n }\n\n return { sql: rc, parts, bindings: [] };\n }\n\n compileHaving(having: havingType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n let parts: (string | number)[] = [];\n\n for (const w of having) {\n sql += ' ' + w.joinCondition + ' ';\n parts.push(w.joinCondition);\n if (w.negateCondition) {\n sql += 'not ';\n parts.push('not');\n }\n const funcName = 'compileHaving' + toUpperFirst(w.type);\n // @ts-ignore\n const wh = this[funcName](w);\n parts = parts.concat(wh.parts);\n sql += wh.sql;\n bindings = [...bindings, ...wh.bindings];\n }\n\n if (parts.length > 0) {\n parts[0] = 'having';\n }\n\n return { sql: parts.join(' '), parts, bindings };\n }\n\n compileHavingOperation(w: whereOp): CompiledSql {\n return {\n sql: `${w.column} ${w.operation} ?`,\n parts: [w.column, w.operation, '?'],\n bindings: [w.value],\n };\n }\n\n compileHavingRaw(w: whereRaw): CompiledSql {\n return {\n sql: w.sql,\n parts: w.sql.split(' '),\n bindings: w.bindings,\n };\n }\n}\n","import { Query } from '../../Query.mjs';\nimport { QueryGrammar } from '../../QueryGrammar.mjs';\nimport { CompiledSql, Parameter } from '../../types.mjs';\nimport { Arr } from '@devbro/neko-helper';\nexport class PostgresqlQueryGrammar extends QueryGrammar {\n constructor() {\n super();\n }\n\n toSql(query: Query): CompiledSql {\n return super.toSql(query);\n }\n\n compileInsert(query: Query, data: Record<string, any>): CompiledSql {\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 const rc = super.compileInsert(query, data);\n rc.sql += ` RETURNING ${options.primaryKey.join(', ')}`;\n rc.parts = rc.parts.concat(['RETURNING', ...Arr.intersperse(options.primaryKey, ',')]);\n return rc;\n }\n\n compileUpdate(query: Query, data: Record<string, any>): CompiledSql {\n return super.compileUpdate(query, data);\n }\n\n compileDelete(query: Query): CompiledSql {\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 return super.compileUpsert(query, data, conflictFields, updateFields);\n }\n\n compileCount(query: Query): CompiledSql {\n return super.compileCount(query);\n }\n}\n","import { CompiledSql } from './types.mjs';\n// @ts-ignore - no type definitions available for sql-tokenizer\nimport { sqlTokenizer } from 'sql-tokenizer';\n\nexport class Expression {\n constructor(\n private sql = '',\n private bindings = []\n ) {}\n\n toCompiledSql(): CompiledSql {\n let parts = [];\n try {\n const tokenize = sqlTokenizer();\n parts = tokenize(this.sql);\n } catch (error) {\n console.error('Error tokenizing SQL:', error);\n parts = [this.sql];\n }\n return { sql: this.sql, bindings: this.bindings, parts };\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 | 'raw';\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 raw(sql: string) {\n const rc = new Column(sql, 'raw');\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, parts: [], 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 parts: [],\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(' '), parts: [], bindings: [] };\n } else {\n // No column changes, just need the base alter table statement for consistency\n compiledSql = { sql: sql.join(' ') + ' ', parts: [], 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 parts: [],\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 if (column.properties.type === 'raw') {\n return column.columnName;\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 parts: [],\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 parts: [],\n bindings: [tableName],\n };\n }\n\n compileDropTable(tableName: string): CompiledSql {\n return { sql: `drop table ${this.doubleQuoteString(tableName)}`, parts: [], bindings: [] };\n }\n\n compileDropTableIfExists(tableName: string): CompiledSql {\n return {\n sql: `drop table if exists ${this.doubleQuoteString(tableName)}`,\n parts: [],\n bindings: [],\n };\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, parts: [], 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, parts: [], 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, parts: [], 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":["bindings","import_neko_helper","import_sql_tokenizer","import_neko_helper","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/Schema.mts","../src/SchemaGrammar.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';\nimport { EventEmittor } from '@devbro/neko-helper';\n\nexport type connection_events = 'connect' | 'disconnect' | 'query' | 'error';\nexport abstract class Connection implements EventEmittor<connection_events[]> {\n abstract on(event: connection_events, listener: (...args: any[]) => void): this;\n abstract off(event: connection_events, listener: (...args: any[]) => void): this;\n abstract emit(event: connection_events, ...args: any[]): Promise<boolean>;\n\n abstract isConnected(): boolean;\n abstract connect(): Promise<boolean>;\n abstract runQuery(sql: CompiledSql | string): 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 abstract createDatabase(name: string): Promise<void>;\n abstract dropDatabase(name: string): Promise<void>;\n abstract listDatabases(): Promise<string[]>;\n abstract existsDatabase(name: string): Promise<boolean>;\n}\n","import { connection_events, Connection as ConnectionAbs } from '../../Connection.mjs';\nimport { Client, 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';\nimport { EventManager } from '@devbro/neko-helper';\n\nexport class PostgresqlConnection extends ConnectionAbs {\n private eventManager = new EventManager();\n\n on(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.on(event, listener);\n return this;\n }\n off(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.off(event, listener);\n return this;\n }\n emit(event: connection_events, ...args: any[]): Promise<boolean> {\n return this.eventManager.emit(event, ...args);\n }\n\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.eventManager.emit('connect');\n this.connection = await PostgresqlConnection.pool.connect();\n return true;\n }\n async runQuery(sql: CompiledSql | string): Promise<any> {\n if( typeof sql === 'string') {\n sql = { sql: sql, bindings: [], parts: [sql] };\n }\n let counter = 1;\n let sql2 = sql.sql;\n if (sql.parts && sql.parts.length > 0) {\n sql2 = sql.parts.map((v) => (v === '?' ? '$' + counter++ : v)).join(' ');\n }\n\n this.eventManager.emit('query', { sql: sql2, bindings: sql.bindings });\n\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query(sql2, 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 if (this.connection === undefined) {\n return true;\n }\n await this.connection?.release();\n this.connection = undefined;\n this.eventManager.emit('disconnect');\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 await this.runQuery({ sql: 'BEGIN', bindings: [], parts: ['BEGIN'] });\n }\n\n async commit(): Promise<void> {\n await this.runQuery({ sql: 'COMMIT', bindings: [], parts: ['COMMIT'] });\n }\n\n async rollback(): Promise<void> {\n await this.runQuery({ sql: 'ROLLBACK', bindings: [], parts: ['ROLLBACK'] });\n }\n\n static async destroy(): Promise<void> {\n PostgresqlConnection.pool.end();\n return;\n }\n\n isConnected(): boolean {\n return this.connection !== undefined;\n }\n\n /**\n * Validates and escapes a PostgreSQL identifier (database name, table name, etc.)\n * Uses a whitelist approach to ensure only safe characters are allowed\n */\n private validateAndEscapeIdentifier(name: string): string {\n // PostgreSQL identifiers can contain: letters, digits, underscores, and dollar signs\n // They must start with a letter or underscore\n const validIdentifierPattern = /^[a-zA-Z_][a-zA-Z0-9_$]*$/;\n\n if (!validIdentifierPattern.test(name)) {\n throw new Error(\n `Invalid identifier: \"${name}\". Identifiers must start with a letter or underscore and contain only letters, digits, underscores, and dollar signs.`\n );\n }\n\n // PostgreSQL reserved keywords that should be quoted\n const reservedKeywords = new Set([\n 'user',\n 'table',\n 'database',\n 'order',\n 'group',\n 'select',\n 'insert',\n 'update',\n 'delete',\n ]);\n\n // Quote the identifier if it's a reserved keyword or contains uppercase letters\n if (reservedKeywords.has(name.toLowerCase()) || name !== name.toLowerCase()) {\n // Escape any double quotes in the name\n const escapedName = name.replace(/\"/g, '\"\"');\n return `\"${escapedName}\"`;\n }\n\n return name;\n }\n\n async createDatabase(name: string): Promise<void> {\n if (this.isConnected()) {\n throw new Error('Cannot create database while connected.');\n }\n\n let conn = new Client({\n ...PostgresqlConnection.pool.options,\n database: 'postgres',\n });\n await conn.connect();\n const safeName = this.validateAndEscapeIdentifier(name);\n await conn.query(`CREATE DATABASE ${safeName}`);\n await conn.end();\n }\n\n async dropDatabase(name: string): Promise<void> {\n if (this.isConnected()) {\n throw new Error('Cannot drop database while connected.');\n }\n\n let conn = new Client({\n ...PostgresqlConnection.pool.options,\n database: 'postgres', // connect to default 'postgres' database to drop others\n });\n await conn.connect();\n const safeName = this.validateAndEscapeIdentifier(name);\n await conn.query(`DROP DATABASE ${safeName}`);\n await conn.end();\n }\n\n async listDatabases(): Promise<string[]> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query(\n 'SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY datname'\n );\n return result.rows.map((row: any) => row.datname);\n }\n\n async existsDatabase(name: string): Promise<boolean> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query('SELECT 1 FROM pg_database WHERE datname = $1', [\n name,\n ]);\n return result.rows.length > 0;\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 alias: string | 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 alias: 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 whereRaw(\n sql: string,\n bindings: Parameter[],\n joinCondition: JoinCondition = 'and',\n negateCondition: boolean = false\n ): this {\n this.parts.where.push({ type: 'raw', sql, bindings, joinCondition, negateCondition });\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 let sql = this.toSql();\n return await this.connection?.runQuery(sql);\n }\n\n async first() {\n let rc = await this.connection?.runQuery(this.toSql());\n if (rc && Array.isArray(rc) && rc.length > 0) {\n return rc[0];\n }\n return undefined;\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 | Query,\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(\n table: Parameters<typeof this.join>[0],\n conditions: (whereType | { column1: string; column2: string })[]\n ): this {\n return this.join(table, 'inner', conditions);\n }\n\n leftJoin(\n table: Parameters<typeof this.join>[0],\n conditions: (whereType | { column1: string; column2: string })[]\n ): this {\n return this.join(table, 'left', conditions);\n }\n\n rightJoin(\n table: Parameters<typeof this.join>[0],\n conditions: (whereType | { column1: string; column2: string })[]\n ): this {\n return this.join(table, 'right', conditions);\n }\n\n fullJoin(\n table: Parameters<typeof this.join>[0],\n conditions: (whereType | { column1: string; column2: string })[]\n ): this {\n return this.join(table, 'full', conditions);\n }\n\n crossJoin(\n table: Parameters<typeof this.join>[0],\n conditions: (whereType | { column1: string; column2: string })[]\n ): this {\n return this.join(table, 'cross', conditions);\n }\n\n alias(alias: string): this {\n this.parts.alias = alias;\n return this;\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// @ts-ignore - no type definitions available for sql-tokenizer\nimport { sqlTokenizer } from 'sql-tokenizer';\nimport { Arr } from '@devbro/neko-helper';\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 rc = this.toSqlParts(query);\n rc.sql = this.joinArray(rc.parts);\n return rc;\n }\n\n toSqlParts(query: Query): CompiledSql {\n let parts: string[] = [];\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 bindings = [...bindings, ...r.bindings];\n parts = [...parts, ...r.parts];\n }\n\n return {\n sql: '',\n bindings,\n parts,\n };\n }\n\n compileCount(query: Query): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n let parts: (string | number)[] = [];\n\n for (const part of this.sqlParts) {\n // @ts-ignore\n let parts2 = query.parts[part];\n if (part === 'select') {\n parts2 = ['count(*) as count'];\n }\n // @ts-ignore\n const funcName: keyof this = 'compile' + toUpperFirst(part);\n // @ts-ignore\n const r = this[funcName](parts2);\n bindings = [...bindings, ...r.bindings];\n parts = [...parts, ...r.parts];\n }\n return { sql, parts, bindings };\n }\n\n compileSelect(selects: selectType[]): CompiledSql {\n const parts = ['select'];\n selects.map((v) => {\n parts.push(v);\n parts.push(',');\n });\n parts.pop();\n\n return { sql: this.joinArray(parts), parts, bindings: [] };\n }\n\n joinArray(arr: (string | number)[]): string {\n let rc = '';\n let last: string | number = '';\n for (const a of arr) {\n if (a === ',') {\n rc += a;\n } else if (last === '(' || last === ' ' || a === ')') {\n rc += a;\n } else if (a === '') {\n rc += '';\n } else {\n rc += ' ' + a;\n }\n last = a;\n }\n\n return rc.trim();\n }\n\n compileTable(tableName: string): CompiledSql {\n let parts = [];\n if (tableName.length) {\n parts.push('from');\n parts.push(tableName);\n }\n\n return { sql: parts.join(' '), parts, bindings: [] };\n }\n\n compileJoin(joins: joinType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n let parts: (string | number)[] = [];\n\n for (const j of joins) {\n let table = '';\n let table_bindings: any[] = [];\n\n parts.push(j.type);\n parts.push('join');\n if (typeof j.table === 'string') {\n parts.push(j.table);\n } else {\n const subQuery = j.table;\n const { parts: parts2, bindings } = subQuery.toSql();\n parts = [...parts, '(', ...parts2, ')', 'as', subQuery.parts.alias || 'subquery'];\n table_bindings = bindings;\n }\n\n parts.push('on');\n\n const where = this.compileWhere(j.conditions);\n const where_parts = where.parts;\n where_parts.shift();\n parts.push('(');\n parts = [...parts, ...where_parts];\n parts.push(')');\n\n bindings = [...bindings, ...table_bindings, ...where.bindings];\n }\n\n return { sql, parts, bindings };\n }\n\n compileWhere(wheres: whereType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n let parts: (string | number)[] = [];\n\n for (const w of wheres) {\n sql += ' ' + w.joinCondition + ' ';\n parts.push(w.joinCondition);\n if (w.negateCondition) {\n sql += 'not ';\n parts.push('not');\n }\n const funcName = 'compileWhere' + toUpperFirst(w.type);\n // @ts-ignore\n const wh = this[funcName](w);\n sql += wh.sql;\n parts = parts.concat(wh.parts);\n bindings = [...bindings, ...wh.bindings];\n }\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\n if (parts.length > 0) {\n parts[0] = 'where';\n }\n return { sql, parts, bindings };\n }\n\n compileWhereNested(w: whereNested): CompiledSql {\n const subQuery = w.query;\n let parts: (string | number)[] = [];\n const { sql, parts: parts2, bindings } = subQuery.grammar.compileWhere(subQuery.parts.where);\n let sql2 = sql.replace(/^where /, '');\n parts2.shift();\n parts.push('(');\n parts = parts.concat(parts2);\n parts.push(')');\n return {\n sql: `(${sql2})`,\n parts,\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( ? )`,\n parts: [w.column, ' = ANY(', '?', ')'],\n bindings: [w.value],\n };\n }\n\n return {\n sql: `${w.column} ${w.operation} ?`,\n parts: [w.column, w.operation, '?'],\n bindings: [w.value],\n };\n }\n\n compileWhereOperationColumn(w: whereOpColumn): CompiledSql {\n return {\n sql: `${w.column1} ${w.operation} ${w.column2}`,\n parts: [w.column1, w.operation, w.column2],\n bindings: [],\n };\n }\n\n compileWhereRaw(w: whereRaw): CompiledSql {\n const tokenize = sqlTokenizer();\n\n return {\n sql: w.sql,\n parts: tokenize(w.sql).filter((t: string) => t !== ' '),\n bindings: w.bindings,\n };\n }\n\n compileOrderBy(orderBy: string[]): CompiledSql {\n let rc = '';\n let parts: (string | number)[] = [];\n if (orderBy.length) {\n rc = 'order by ' + orderBy.join(', ');\n parts.push('order by');\n parts = parts.concat(Arr.intersperse(orderBy, ','));\n }\n\n return { sql: rc, parts, bindings: [] };\n }\n\n compileLimit(limit: number | null): CompiledSql {\n let rc = '';\n let parts: (string | number)[] = [];\n if (limit !== null) {\n rc = 'limit ' + limit;\n parts.push('limit');\n parts.push(limit);\n }\n\n return { sql: rc, parts, bindings: [] };\n }\n\n compileOffset(offset: number | null): CompiledSql {\n let rc = '';\n let parts: (string | number)[] = [];\n if (offset !== null) {\n rc = 'offset ' + offset;\n parts.push('offset');\n parts.push(offset);\n }\n\n return { sql: rc, parts, bindings: [] };\n }\n\n compileWhereNull(w: whereNull): CompiledSql {\n return {\n sql: `${w.column} is null`,\n parts: [w.column, 'is', 'null'],\n bindings: [],\n };\n }\n\n compileInsert(query: Query, data: Record<string, Parameter>): CompiledSql {\n let parts = ['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 parts.push(k);\n parts.push(',');\n }\n parts.pop();\n parts = parts.concat([')', 'values', '(']);\n\n for (const [k, v] of Object.entries(data)) {\n parts.push('?');\n bindings.push(v);\n parts.push(',');\n }\n parts.pop();\n parts.push(')');\n\n return { sql: parts.join(' '), parts, 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 const bindings: Parameter[] = [];\n let parts: (string | number)[] = ['update', query.parts.table, 'set'];\n\n const setParts = [];\n for (const [k, v] of Object.entries(data)) {\n parts = parts.concat([k, '=', '?', ',']);\n setParts.push(`${k} = ?`);\n bindings.push(v);\n }\n parts.pop();\n\n const where_csql = this.compileWhere(query.parts.where);\n parts = parts.concat(where_csql.parts);\n bindings.push(...where_csql.bindings);\n\n return { sql: parts.join(' '), parts, bindings };\n }\n\n compileDelete(query: Query): CompiledSql {\n let sql = 'delete from ' + query.parts.table;\n let parts: (string | number)[] = ['delete', 'from', query.parts.table];\n const where_csql = this.compileWhere(query.parts.where);\n sql += ' ' + where_csql.sql;\n parts = parts.concat(where_csql.parts);\n return { sql, parts, 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 parts: (string | number)[] = [];\n const bindings: Parameter[] = [];\n\n let isql = this.compileInsert(query, data);\n parts = isql.parts;\n bindings.push(...isql.bindings);\n\n parts = parts.concat(['on', 'conflict', '(', ...conflictFields, ')', 'do', 'update', 'set']);\n const setParts = [];\n for (const f of updateFields) {\n setParts.push(`${f} = excluded.${f}`);\n setParts.push(`,`);\n }\n setParts.pop();\n parts = parts.concat(setParts);\n\n const where_csql = this.compileWhere(query.parts.where);\n parts = parts.concat(where_csql.parts);\n bindings.push(...where_csql.bindings);\n\n return { sql: parts.join(' '), parts, bindings };\n }\n\n compileGroupBy(groupBy: string[]): CompiledSql {\n let rc = '';\n let parts: (string | number)[] = [];\n if (groupBy.length) {\n rc = 'group by ' + groupBy.join(', ');\n parts.push('group by');\n parts = parts.concat(groupBy);\n }\n\n return { sql: rc, parts, bindings: [] };\n }\n\n compileHaving(having: havingType[]): CompiledSql {\n let sql = '';\n let bindings: Parameter[] = [];\n let parts: (string | number)[] = [];\n\n for (const w of having) {\n sql += ' ' + w.joinCondition + ' ';\n parts.push(w.joinCondition);\n if (w.negateCondition) {\n sql += 'not ';\n parts.push('not');\n }\n const funcName = 'compileHaving' + toUpperFirst(w.type);\n // @ts-ignore\n const wh = this[funcName](w);\n parts = parts.concat(wh.parts);\n sql += wh.sql;\n bindings = [...bindings, ...wh.bindings];\n }\n\n if (parts.length > 0) {\n parts[0] = 'having';\n }\n\n return { sql: parts.join(' '), parts, bindings };\n }\n\n compileHavingOperation(w: whereOp): CompiledSql {\n return {\n sql: `${w.column} ${w.operation} ?`,\n parts: [w.column, w.operation, '?'],\n bindings: [w.value],\n };\n }\n\n compileHavingRaw(w: whereRaw): CompiledSql {\n return {\n sql: w.sql,\n parts: w.sql.split(' '),\n bindings: w.bindings,\n };\n }\n}\n","import { Query } from '../../Query.mjs';\nimport { QueryGrammar } from '../../QueryGrammar.mjs';\nimport { CompiledSql, Parameter } from '../../types.mjs';\nimport { Arr } from '@devbro/neko-helper';\nexport class PostgresqlQueryGrammar extends QueryGrammar {\n constructor() {\n super();\n }\n\n toSql(query: Query): CompiledSql {\n return super.toSql(query);\n }\n\n compileInsert(query: Query, data: Record<string, any>): CompiledSql {\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 const rc = super.compileInsert(query, data);\n rc.sql += ` RETURNING ${options.primaryKey.join(', ')}`;\n rc.parts = rc.parts.concat(['RETURNING', ...Arr.intersperse(options.primaryKey, ',')]);\n return rc;\n }\n\n compileUpdate(query: Query, data: Record<string, any>): CompiledSql {\n return super.compileUpdate(query, data);\n }\n\n compileDelete(query: Query): CompiledSql {\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 return super.compileUpsert(query, data, conflictFields, updateFields);\n }\n\n compileCount(query: Query): CompiledSql {\n return super.compileCount(query);\n }\n}\n","import { CompiledSql } from './types.mjs';\n// @ts-ignore - no type definitions available for sql-tokenizer\nimport { sqlTokenizer } from 'sql-tokenizer';\n\nexport class Expression {\n constructor(\n private sql = '',\n private bindings = []\n ) {}\n\n toCompiledSql(): CompiledSql {\n let parts = [];\n try {\n const tokenize = sqlTokenizer();\n parts = tokenize(this.sql);\n } catch (error) {\n console.error('Error tokenizing SQL:', error);\n parts = [this.sql];\n }\n return { sql: this.sql, bindings: this.bindings, parts };\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 | 'raw';\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 raw(sql: string) {\n const rc = new Column(sql, 'raw');\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 } from './Blueprint.mjs';\nimport { Connection } from './Connection.mjs';\nimport { SchemaGrammar } from './SchemaGrammar.mjs';\n\n/**\n * Schema builder for creating and managing database tables.\n * Provides methods for table creation, alteration, and inspection.\n */\nexport class Schema {\n /**\n * Creates a new Schema instance.\n *\n * @param connection - The database connection to use for schema operations\n * @param grammar - The schema grammar for generating SQL statements\n */\n constructor(\n private readonly connection: Connection | null,\n private readonly grammar: SchemaGrammar\n ) {}\n\n /**\n * Creates a new table in the database.\n *\n * @param tableName - The name of the table to create\n * @param structMethod - A callback function that receives a Blueprint to define table structure\n *\n * @example\n * await schema.createTable('users', (table) => {\n * table.increments('id');\n * table.string('name');\n * table.string('email').unique();\n * table.timestamps();\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 sql = this.grammar.toSql(blueprint);\n await this.connection?.runQuery({ sql, parts: [], bindings: [] });\n }\n\n /**\n * Modifies an existing table structure.\n *\n * @param tableName - The name of the table to alter\n * @param structMethod - A callback function that receives a Blueprint to define modifications\n *\n * @example\n * await schema.alterTable('users', (table) => {\n * table.string('phone').nullable();\n * table.dropColumn('old_field');\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 sql = this.grammar.toSql(blueprint);\n await this.connection?.runQuery({ sql, parts: [], bindings: [] });\n }\n\n /**\n * Drops (deletes) a table from the database.\n *\n * @param tableName - The name of the table to drop\n *\n * @example\n * await schema.dropTable('old_users');\n */\n async dropTable(tableName: string) {\n await this.connection?.runQuery(this.grammar.compileDropTable(tableName));\n }\n\n /**\n * Drops a table from the database if it exists.\n * Safe to call even if the table doesn't exist.\n *\n * @param tableName - The name of the table to drop\n *\n * @example\n * await schema.dropTableIfExists('temp_table');\n */\n async dropTableIfExists(tableName: string) {\n await this.connection?.runQuery(this.grammar.compileDropTableIfExists(tableName));\n }\n\n /**\n * Retrieves a list of all tables in the database.\n *\n * @returns A promise that resolves to an array of table information\n *\n * @example\n * const allTables = await schema.tables();\n * console.log(allTables);\n */\n async tables() {\n return await this.connection?.runQuery(this.grammar.compileTables());\n }\n\n /**\n * Checks if a table exists in the database.\n *\n * @param table_name - The name of the table to check\n * @returns A promise that resolves to true if the table exists, false otherwise\n *\n * @example\n * if (await schema.tableExists('users')) {\n * console.log('Users table exists');\n * }\n */\n async tableExists(table_name: string): Promise<boolean> {\n return (await this.connection?.runQuery(this.grammar.compileTableExists(table_name)))[0][\n 'exists'\n ];\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, parts: [], 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 parts: [],\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(' '), parts: [], bindings: [] };\n } else {\n // No column changes, just need the base alter table statement for consistency\n compiledSql = { sql: sql.join(' ') + ' ', parts: [], 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 parts: [],\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 if (column.properties.type === 'raw') {\n return column.columnName;\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 parts: [],\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 parts: [],\n bindings: [tableName],\n };\n }\n\n compileDropTable(tableName: string): CompiledSql {\n return { sql: `drop table ${this.doubleQuoteString(tableName)}`, parts: [], bindings: [] };\n }\n\n compileDropTableIfExists(tableName: string): CompiledSql {\n return {\n sql: `drop table if exists ${this.doubleQuoteString(tableName)}`,\n parts: [],\n bindings: [],\n };\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, parts: [], bindings: [] };\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;;;;;;;;;;;;;;;;;;;ACQO,IAAe,aAAf,MAAuE;AAAA,EAR9E,OAQ8E;AAAA;AAAA;AAqB9E;;;AC5BA,gBAA+C;AAC/C,IAAAA,aAAqB;;;ACuBd,IAAM,QAAN,MAAM,OAAM;AAAA,EAejB,YACkB,YACA,SAChB;AAFgB;AACA;AAAA,EACf;AAAA,EA3CL,OAyBmB;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,IACR,OAAO;AAAA,EACT;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,SACE,KACA,UACA,gBAA+B,OAC/B,kBAA2B,OACrB;AACN,SAAK,MAAM,MAAM,KAAK,EAAE,MAAM,OAAO,KAAK,UAAU,eAAe,gBAAgB,CAAC;AACpF,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,QAAI,MAAM,KAAK,MAAM;AACrB,WAAO,MAAM,KAAK,YAAY,SAAS,GAAG;AAAA,EAC5C;AAAA,EAEA,MAAM,QAAQ;AACZ,QAAI,KAAK,MAAM,KAAK,YAAY,SAAS,KAAK,MAAM,CAAC;AACrD,QAAI,MAAM,MAAM,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG;AAC5C,aAAO,GAAG,CAAC;AAAA,IACb;AACA,WAAO;AAAA,EACT;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,UACE,OACA,YACM;AACN,WAAO,KAAK,KAAK,OAAO,SAAS,UAAU;AAAA,EAC7C;AAAA,EAEA,SACE,OACA,YACM;AACN,WAAO,KAAK,KAAK,OAAO,QAAQ,UAAU;AAAA,EAC5C;AAAA,EAEA,UACE,OACA,YACM;AACN,WAAO,KAAK,KAAK,OAAO,SAAS,UAAU;AAAA,EAC7C;AAAA,EAEA,SACE,OACA,YACM;AACN,WAAO,KAAK,KAAK,OAAO,QAAQ,UAAU;AAAA,EAC5C;AAAA,EAEA,UACE,OACA,YACM;AACN,WAAO,KAAK,KAAK,OAAO,SAAS,UAAU;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAqB;AACzB,SAAK,MAAM,QAAQ;AACnB,WAAO;AAAA,EACT;AACF;;;AC7RA,2BAA6B;AAC7B,yBAAoB;AAEpB,SAAS,aAAa,KAAa;AACjC,SAAO,IAAI,UAAU,GAAG,CAAC,EAAE,YAAY,IAAI,IAAI,UAAU,CAAC;AAC5D;AAFS;AAGF,IAAe,eAAf,MAA4B;AAAA,EArBnC,OAqBmC;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,KAAK,KAAK,WAAW,KAAK;AAC9B,OAAG,MAAM,KAAK,UAAU,GAAG,KAAK;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,OAA2B;AACpC,QAAI,QAAkB,CAAC;AACvB,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,iBAAW,CAAC,GAAG,UAAU,GAAG,EAAE,QAAQ;AACtC,cAAQ,CAAC,GAAG,OAAO,GAAG,EAAE,KAAK;AAAA,IAC/B;AAEA,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,OAA2B;AACtC,QAAI,MAAM;AACV,QAAI,WAAwB,CAAC;AAC7B,QAAI,QAA6B,CAAC;AAElC,eAAW,QAAQ,KAAK,UAAU;AAEhC,UAAI,SAAS,MAAM,MAAM,IAAI;AAC7B,UAAI,SAAS,UAAU;AACrB,iBAAS,CAAC,mBAAmB;AAAA,MAC/B;AAEA,YAAM,WAAuB,YAAY,aAAa,IAAI;AAE1D,YAAM,IAAI,KAAK,QAAQ,EAAE,MAAM;AAC/B,iBAAW,CAAC,GAAG,UAAU,GAAG,EAAE,QAAQ;AACtC,cAAQ,CAAC,GAAG,OAAO,GAAG,EAAE,KAAK;AAAA,IAC/B;AACA,WAAO,EAAE,KAAK,OAAO,SAAS;AAAA,EAChC;AAAA,EAEA,cAAc,SAAoC;AAChD,UAAM,QAAQ,CAAC,QAAQ;AACvB,YAAQ,IAAI,CAAC,MAAM;AACjB,YAAM,KAAK,CAAC;AACZ,YAAM,KAAK,GAAG;AAAA,IAChB,CAAC;AACD,UAAM,IAAI;AAEV,WAAO,EAAE,KAAK,KAAK,UAAU,KAAK,GAAG,OAAO,UAAU,CAAC,EAAE;AAAA,EAC3D;AAAA,EAEA,UAAU,KAAkC;AAC1C,QAAI,KAAK;AACT,QAAI,OAAwB;AAC5B,eAAW,KAAK,KAAK;AACnB,UAAI,MAAM,KAAK;AACb,cAAM;AAAA,MACR,WAAW,SAAS,OAAO,SAAS,OAAO,MAAM,KAAK;AACpD,cAAM;AAAA,MACR,WAAW,MAAM,IAAI;AACnB,cAAM;AAAA,MACR,OAAO;AACL,cAAM,MAAM;AAAA,MACd;AACA,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,KAAK;AAAA,EACjB;AAAA,EAEA,aAAa,WAAgC;AAC3C,QAAI,QAAQ,CAAC;AACb,QAAI,UAAU,QAAQ;AACpB,YAAM,KAAK,MAAM;AACjB,YAAM,KAAK,SAAS;AAAA,IACtB;AAEA,WAAO,EAAE,KAAK,MAAM,KAAK,GAAG,GAAG,OAAO,UAAU,CAAC,EAAE;AAAA,EACrD;AAAA,EAEA,YAAY,OAAgC;AAC1C,QAAI,MAAM;AACV,QAAI,WAAwB,CAAC;AAC7B,QAAI,QAA6B,CAAC;AAElC,eAAW,KAAK,OAAO;AACrB,UAAI,QAAQ;AACZ,UAAI,iBAAwB,CAAC;AAE7B,YAAM,KAAK,EAAE,IAAI;AACjB,YAAM,KAAK,MAAM;AACjB,UAAI,OAAO,EAAE,UAAU,UAAU;AAC/B,cAAM,KAAK,EAAE,KAAK;AAAA,MACpB,OAAO;AACL,cAAM,WAAW,EAAE;AACnB,cAAM,EAAE,OAAO,QAAQ,UAAAC,UAAS,IAAI,SAAS,MAAM;AACnD,gBAAQ,CAAC,GAAG,OAAO,KAAK,GAAG,QAAQ,KAAK,MAAM,SAAS,MAAM,SAAS,UAAU;AAChF,yBAAiBA;AAAA,MACnB;AAEA,YAAM,KAAK,IAAI;AAEf,YAAM,QAAQ,KAAK,aAAa,EAAE,UAAU;AAC5C,YAAM,cAAc,MAAM;AAC1B,kBAAY,MAAM;AAClB,YAAM,KAAK,GAAG;AACd,cAAQ,CAAC,GAAG,OAAO,GAAG,WAAW;AACjC,YAAM,KAAK,GAAG;AAEd,iBAAW,CAAC,GAAG,UAAU,GAAG,gBAAgB,GAAG,MAAM,QAAQ;AAAA,IAC/D;AAEA,WAAO,EAAE,KAAK,OAAO,SAAS;AAAA,EAChC;AAAA,EAEA,aAAa,QAAkC;AAC7C,QAAI,MAAM;AACV,QAAI,WAAwB,CAAC;AAC7B,QAAI,QAA6B,CAAC;AAElC,eAAW,KAAK,QAAQ;AACtB,aAAO,MAAM,EAAE,gBAAgB;AAC/B,YAAM,KAAK,EAAE,aAAa;AAC1B,UAAI,EAAE,iBAAiB;AACrB,eAAO;AACP,cAAM,KAAK,KAAK;AAAA,MAClB;AACA,YAAM,WAAW,iBAAiB,aAAa,EAAE,IAAI;AAErD,YAAM,KAAK,KAAK,QAAQ,EAAE,CAAC;AAC3B,aAAO,GAAG;AACV,cAAQ,MAAM,OAAO,GAAG,KAAK;AAC7B,iBAAW,CAAC,GAAG,UAAU,GAAG,GAAG,QAAQ;AAAA,IACzC;AAEA,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;AAEA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,CAAC,IAAI;AAAA,IACb;AACA,WAAO,EAAE,KAAK,OAAO,SAAS;AAAA,EAChC;AAAA,EAEA,mBAAmB,GAA6B;AAC9C,UAAM,WAAW,EAAE;AACnB,QAAI,QAA6B,CAAC;AAClC,UAAM,EAAE,KAAK,OAAO,QAAQ,SAAS,IAAI,SAAS,QAAQ,aAAa,SAAS,MAAM,KAAK;AAC3F,QAAI,OAAO,IAAI,QAAQ,WAAW,EAAE;AACpC,WAAO,MAAM;AACb,UAAM,KAAK,GAAG;AACd,YAAQ,MAAM,OAAO,MAAM;AAC3B,UAAM,KAAK,GAAG;AACd,WAAO;AAAA,MACL,KAAK,IAAI,IAAI;AAAA,MACb;AAAA,MACA;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;AAAA,QAChB,OAAO,CAAC,EAAE,QAAQ,WAAW,KAAK,GAAG;AAAA,QACrC,UAAU,CAAC,EAAE,KAAK;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,KAAK,GAAG,EAAE,MAAM,IAAI,EAAE,SAAS;AAAA,MAC/B,OAAO,CAAC,EAAE,QAAQ,EAAE,WAAW,GAAG;AAAA,MAClC,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,OAAO,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO;AAAA,MACzC,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAAA,EAEA,gBAAgB,GAA0B;AACxC,UAAM,eAAW,mCAAa;AAE9B,WAAO;AAAA,MACL,KAAK,EAAE;AAAA,MACP,OAAO,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,MAAc,MAAM,GAAG;AAAA,MACtD,UAAU,EAAE;AAAA,IACd;AAAA,EACF;AAAA,EAEA,eAAe,SAAgC;AAC7C,QAAI,KAAK;AACT,QAAI,QAA6B,CAAC;AAClC,QAAI,QAAQ,QAAQ;AAClB,WAAK,cAAc,QAAQ,KAAK,IAAI;AACpC,YAAM,KAAK,UAAU;AACrB,cAAQ,MAAM,OAAO,uBAAI,YAAY,SAAS,GAAG,CAAC;AAAA,IACpD;AAEA,WAAO,EAAE,KAAK,IAAI,OAAO,UAAU,CAAC,EAAE;AAAA,EACxC;AAAA,EAEA,aAAa,OAAmC;AAC9C,QAAI,KAAK;AACT,QAAI,QAA6B,CAAC;AAClC,QAAI,UAAU,MAAM;AAClB,WAAK,WAAW;AAChB,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,KAAK;AAAA,IAClB;AAEA,WAAO,EAAE,KAAK,IAAI,OAAO,UAAU,CAAC,EAAE;AAAA,EACxC;AAAA,EAEA,cAAc,QAAoC;AAChD,QAAI,KAAK;AACT,QAAI,QAA6B,CAAC;AAClC,QAAI,WAAW,MAAM;AACnB,WAAK,YAAY;AACjB,YAAM,KAAK,QAAQ;AACnB,YAAM,KAAK,MAAM;AAAA,IACnB;AAEA,WAAO,EAAE,KAAK,IAAI,OAAO,UAAU,CAAC,EAAE;AAAA,EACxC;AAAA,EAEA,iBAAiB,GAA2B;AAC1C,WAAO;AAAA,MACL,KAAK,GAAG,EAAE,MAAM;AAAA,MAChB,OAAO,CAAC,EAAE,QAAQ,MAAM,MAAM;AAAA,MAC9B,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAAA,EAEA,cAAc,OAAc,MAA8C;AACxE,QAAI,QAAQ,CAAC,UAAU,QAAQ,MAAM,MAAM,OAAO,GAAG;AACrD,UAAM,UAAoB,CAAC;AAC3B,UAAM,WAAwB,CAAC;AAC/B,UAAM,SAAmB,CAAC;AAE1B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,YAAM,KAAK,CAAC;AACZ,YAAM,KAAK,GAAG;AAAA,IAChB;AACA,UAAM,IAAI;AACV,YAAQ,MAAM,OAAO,CAAC,KAAK,UAAU,GAAG,CAAC;AAEzC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,YAAM,KAAK,GAAG;AACd,eAAS,KAAK,CAAC;AACf,YAAM,KAAK,GAAG;AAAA,IAChB;AACA,UAAM,IAAI;AACV,UAAM,KAAK,GAAG;AAEd,WAAO,EAAE,KAAK,MAAM,KAAK,GAAG,GAAG,OAAO,SAAS;AAAA,EACjD;AAAA,EAQA,cAAc,OAAc,MAA8C;AACxE,UAAM,WAAwB,CAAC;AAC/B,QAAI,QAA6B,CAAC,UAAU,MAAM,MAAM,OAAO,KAAK;AAEpE,UAAM,WAAW,CAAC;AAClB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,cAAQ,MAAM,OAAO,CAAC,GAAG,KAAK,KAAK,GAAG,CAAC;AACvC,eAAS,KAAK,GAAG,CAAC,MAAM;AACxB,eAAS,KAAK,CAAC;AAAA,IACjB;AACA,UAAM,IAAI;AAEV,UAAM,aAAa,KAAK,aAAa,MAAM,MAAM,KAAK;AACtD,YAAQ,MAAM,OAAO,WAAW,KAAK;AACrC,aAAS,KAAK,GAAG,WAAW,QAAQ;AAEpC,WAAO,EAAE,KAAK,MAAM,KAAK,GAAG,GAAG,OAAO,SAAS;AAAA,EACjD;AAAA,EAEA,cAAc,OAA2B;AACvC,QAAI,MAAM,iBAAiB,MAAM,MAAM;AACvC,QAAI,QAA6B,CAAC,UAAU,QAAQ,MAAM,MAAM,KAAK;AACrE,UAAM,aAAa,KAAK,aAAa,MAAM,MAAM,KAAK;AACtD,WAAO,MAAM,WAAW;AACxB,YAAQ,MAAM,OAAO,WAAW,KAAK;AACrC,WAAO,EAAE,KAAK,OAAO,UAAU,WAAW,SAAS;AAAA,EACrD;AAAA,EAEA,cACE,OACA,MACA,gBACA,cACa;AACb,QAAI,QAA6B,CAAC;AAClC,UAAM,WAAwB,CAAC;AAE/B,QAAI,OAAO,KAAK,cAAc,OAAO,IAAI;AACzC,YAAQ,KAAK;AACb,aAAS,KAAK,GAAG,KAAK,QAAQ;AAE9B,YAAQ,MAAM,OAAO,CAAC,MAAM,YAAY,KAAK,GAAG,gBAAgB,KAAK,MAAM,UAAU,KAAK,CAAC;AAC3F,UAAM,WAAW,CAAC;AAClB,eAAW,KAAK,cAAc;AAC5B,eAAS,KAAK,GAAG,CAAC,eAAe,CAAC,EAAE;AACpC,eAAS,KAAK,GAAG;AAAA,IACnB;AACA,aAAS,IAAI;AACb,YAAQ,MAAM,OAAO,QAAQ;AAE7B,UAAM,aAAa,KAAK,aAAa,MAAM,MAAM,KAAK;AACtD,YAAQ,MAAM,OAAO,WAAW,KAAK;AACrC,aAAS,KAAK,GAAG,WAAW,QAAQ;AAEpC,WAAO,EAAE,KAAK,MAAM,KAAK,GAAG,GAAG,OAAO,SAAS;AAAA,EACjD;AAAA,EAEA,eAAe,SAAgC;AAC7C,QAAI,KAAK;AACT,QAAI,QAA6B,CAAC;AAClC,QAAI,QAAQ,QAAQ;AAClB,WAAK,cAAc,QAAQ,KAAK,IAAI;AACpC,YAAM,KAAK,UAAU;AACrB,cAAQ,MAAM,OAAO,OAAO;AAAA,IAC9B;AAEA,WAAO,EAAE,KAAK,IAAI,OAAO,UAAU,CAAC,EAAE;AAAA,EACxC;AAAA,EAEA,cAAc,QAAmC;AAC/C,QAAI,MAAM;AACV,QAAI,WAAwB,CAAC;AAC7B,QAAI,QAA6B,CAAC;AAElC,eAAW,KAAK,QAAQ;AACtB,aAAO,MAAM,EAAE,gBAAgB;AAC/B,YAAM,KAAK,EAAE,aAAa;AAC1B,UAAI,EAAE,iBAAiB;AACrB,eAAO;AACP,cAAM,KAAK,KAAK;AAAA,MAClB;AACA,YAAM,WAAW,kBAAkB,aAAa,EAAE,IAAI;AAEtD,YAAM,KAAK,KAAK,QAAQ,EAAE,CAAC;AAC3B,cAAQ,MAAM,OAAO,GAAG,KAAK;AAC7B,aAAO,GAAG;AACV,iBAAW,CAAC,GAAG,UAAU,GAAG,GAAG,QAAQ;AAAA,IACzC;AAEA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,CAAC,IAAI;AAAA,IACb;AAEA,WAAO,EAAE,KAAK,MAAM,KAAK,GAAG,GAAG,OAAO,SAAS;AAAA,EACjD;AAAA,EAEA,uBAAuB,GAAyB;AAC9C,WAAO;AAAA,MACL,KAAK,GAAG,EAAE,MAAM,IAAI,EAAE,SAAS;AAAA,MAC/B,OAAO,CAAC,EAAE,QAAQ,EAAE,WAAW,GAAG;AAAA,MAClC,UAAU,CAAC,EAAE,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,iBAAiB,GAA0B;AACzC,WAAO;AAAA,MACL,KAAK,EAAE;AAAA,MACP,OAAO,EAAE,IAAI,MAAM,GAAG;AAAA,MACtB,UAAU,EAAE;AAAA,IACd;AAAA,EACF;AACF;;;ACpaA,IAAAC,sBAAoB;AACb,IAAM,yBAAN,cAAqC,aAAa;AAAA,EAJzD,OAIyD;AAAA;AAAA;AAAA,EACvD,cAAc;AACZ,UAAM;AAAA,EACR;AAAA,EAEA,MAAM,OAA2B;AAC/B,WAAO,MAAM,MAAM,KAAK;AAAA,EAC1B;AAAA,EAEA,cAAc,OAAc,MAAwC;AAClE,WAAO,MAAM,cAAc,OAAO,IAAI;AAAA,EACxC;AAAA,EAEA,mBACE,OACA,MACA,UAAoC,EAAE,YAAY,CAAC,IAAI,EAAE,GAC5C;AACb,UAAM,KAAK,MAAM,cAAc,OAAO,IAAI;AAC1C,OAAG,OAAO,cAAc,QAAQ,WAAW,KAAK,IAAI,CAAC;AACrD,OAAG,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,GAAG,wBAAI,YAAY,QAAQ,YAAY,GAAG,CAAC,CAAC;AACrF,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,OAAc,MAAwC;AAClE,WAAO,MAAM,cAAc,OAAO,IAAI;AAAA,EACxC;AAAA,EAEA,cAAc,OAA2B;AACvC,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC;AAAA,EAEA,cACE,OACA,MACA,gBACA,cACa;AACb,WAAO,MAAM,cAAc,OAAO,MAAM,gBAAgB,YAAY;AAAA,EACtE;AAAA,EAEA,aAAa,OAA2B;AACtC,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC;AACF;;;AC9CA,IAAAC,wBAA6B;AAEtB,IAAM,aAAN,MAAiB;AAAA,EACtB,YACU,MAAM,IACN,WAAW,CAAC,GACpB;AAFQ;AACA;AAAA,EACP;AAAA,EARL,OAIwB;AAAA;AAAA;AAAA,EAMtB,gBAA6B;AAC3B,QAAI,QAAQ,CAAC;AACb,QAAI;AACF,YAAM,eAAW,oCAAa;AAC9B,cAAQ,SAAS,KAAK,GAAG;AAAA,IAC3B,SAAS,OAAO;AACd,cAAQ,MAAM,yBAAyB,KAAK;AAC5C,cAAQ,CAAC,KAAK,GAAG;AAAA,IACnB;AACA,WAAO,EAAE,KAAK,KAAK,KAAK,UAAU,KAAK,UAAU,MAAM;AAAA,EACzD;AACF;;;ACGO,IAAM,SAAN,MAAa;AAAA,EAxBpB,OAwBoB;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,EA7D7B,OA6D6B;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,EAxFlC,OAwFkC;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,EAxHvB,OAwHuB;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,IAAI,KAAa;AACf,UAAM,KAAK,IAAI,OAAO,KAAK,KAAK;AAChC,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;;;ACpQO,IAAM,SAAN,MAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlB,YACmB,YACA,SACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAlBL,OAQoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BlB,MAAM,YAAY,WAAmB,cAA8C;AACjF,UAAM,YAAY,IAAI,UAAU;AAChC,cAAU,aAAa,WAAW,KAAK;AACvC,iBAAa,SAAS;AAEtB,UAAM,MAAM,KAAK,QAAQ,MAAM,SAAS;AACxC,UAAM,KAAK,YAAY,SAAS,EAAE,KAAK,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,WAAW,WAAmB,cAA8C;AAChF,UAAM,YAAY,IAAI,UAAU;AAChC,cAAU,aAAa,WAAW,IAAI;AACtC,iBAAa,SAAS;AAEtB,UAAM,MAAM,KAAK,QAAQ,MAAM,SAAS;AACxC,UAAM,KAAK,YAAY,SAAS,EAAE,KAAK,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,UAAU,WAAmB;AACjC,UAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,iBAAiB,SAAS,CAAC;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,kBAAkB,WAAmB;AACzC,UAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,yBAAyB,SAAS,CAAC;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,SAAS;AACb,WAAO,MAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,cAAc,CAAC;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,YAAY,YAAsC;AACtD,YAAQ,MAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,mBAAmB,UAAU,CAAC,GAAG,CAAC,EACrF,QACF;AAAA,EACF;AACF;;;AClHO,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,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE;AAGnD,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,OAAO,CAAC;AAAA,QACR,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,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,IAC9D,OAAO;AAEL,oBAAc,EAAE,KAAK,IAAI,KAAK,GAAG,IAAI,KAAK,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,IACpE;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,OAAO,CAAC;AAAA,QACR,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,WAAW,OAAO,WAAW,SAAS,OAAO;AAC3C,aAAO,OAAO;AAAA,IAChB,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,OAAO,CAAC;AAAA,MACR,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,OAAO,CAAC;AAAA,MACR,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,iBAAiB,WAAgC;AAC/C,WAAO,EAAE,KAAK,cAAc,KAAK,kBAAkB,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EAC3F;AAAA,EAEA,yBAAyB,WAAgC;AACvD,WAAO;AAAA,MACL,KAAK,wBAAwB,KAAK,kBAAkB,SAAS,CAAC;AAAA,MAC9D,OAAO,CAAC;AAAA,MACR,UAAU,CAAC;AAAA,IACb;AAAA,EACF;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,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EACxC;AACF;;;ACxQO,IAAM,0BAAN,cAAsC,cAAc;AAAA,EAF3D,OAE2D;AAAA;AAAA;AAAC;;;ARM5D,uBAAmB;AACnB,IAAAC,sBAA6B;AAEtB,IAAM,uBAAN,MAAM,8BAA6B,WAAc;AAAA,EAXxD,OAWwD;AAAA;AAAA;AAAA,EAC9C,eAAe,IAAI,iCAAa;AAAA,EAExC,GAAG,OAA0B,UAA0C;AACrE,SAAK,aAAa,GAAG,OAAO,QAAQ;AACpC,WAAO;AAAA,EACT;AAAA,EACA,IAAI,OAA0B,UAA0C;AACtE,SAAK,aAAa,IAAI,OAAO,QAAQ;AACrC,WAAO;AAAA,EACT;AAAA,EACA,KAAK,UAA6B,MAA+B;AAC/D,WAAO,KAAK,aAAa,KAAK,OAAO,GAAG,IAAI;AAAA,EAC9C;AAAA,EAEA;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,gBAAK,EAAE,GAAG,sBAAqB,UAAU,GAAG,OAAO,CAAC;AAAA,IACtF;AAAA,EACF;AAAA,EACA,MAAM,UAA4B;AAChC,SAAK,aAAa,KAAK,SAAS;AAChC,SAAK,aAAa,MAAM,sBAAqB,KAAK,QAAQ;AAC1D,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS,KAAyC;AACtD,QAAI,OAAO,QAAQ,UAAU;AAC3B,YAAM,EAAE,KAAU,UAAU,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE;AAAA,IAC/C;AACA,QAAI,UAAU;AACd,QAAI,OAAO,IAAI;AACf,QAAI,IAAI,SAAS,IAAI,MAAM,SAAS,GAAG;AACrC,aAAO,IAAI,MAAM,IAAI,CAAC,MAAO,MAAM,MAAM,MAAM,YAAY,CAAE,EAAE,KAAK,GAAG;AAAA,IACzE;AAEA,SAAK,aAAa,KAAK,SAAS,EAAE,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC;AAErE,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAM,KAAK,QAAQ;AAAA,IACrB;AACA,UAAM,SAAS,MAAM,KAAK,WAAY,MAAM,MAAM,IAAI,QAAQ;AAC9D,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,MAAM,UAAU,KAAgC;AAC9C,WAAO,KAAK,YAAY,MAAM,IAAI,iBAAAC,QAAO,IAAI,KAAK,IAAI,QAAQ,CAAC;AAAA,EACjE;AAAA,EAEA,MAAM,aAA+B;AACnC,QAAI,KAAK,eAAe,QAAW;AACjC,aAAO;AAAA,IACT;AACA,UAAM,KAAK,YAAY,QAAQ;AAC/B,SAAK,aAAa;AAClB,SAAK,aAAa,KAAK,YAAY;AACnC,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,UAAM,KAAK,SAAS,EAAE,KAAK,SAAS,UAAU,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;AAAA,EACtE;AAAA,EAEA,MAAM,SAAwB;AAC5B,UAAM,KAAK,SAAS,EAAE,KAAK,UAAU,UAAU,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,WAA0B;AAC9B,UAAM,KAAK,SAAS,EAAE,KAAK,YAAY,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;AAAA,EAC5E;AAAA,EAEA,aAAa,UAAyB;AACpC,0BAAqB,KAAK,IAAI;AAC9B;AAAA,EACF;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,4BAA4B,MAAsB;AAGxD,UAAM,yBAAyB;AAE/B,QAAI,CAAC,uBAAuB,KAAK,IAAI,GAAG;AACtC,YAAM,IAAI;AAAA,QACR,wBAAwB,IAAI;AAAA,MAC9B;AAAA,IACF;AAGA,UAAM,mBAAmB,oBAAI,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,QAAI,iBAAiB,IAAI,KAAK,YAAY,CAAC,KAAK,SAAS,KAAK,YAAY,GAAG;AAE3E,YAAM,cAAc,KAAK,QAAQ,MAAM,IAAI;AAC3C,aAAO,IAAI,WAAW;AAAA,IACxB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,MAA6B;AAChD,QAAI,KAAK,YAAY,GAAG;AACtB,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAEA,QAAI,OAAO,IAAI,iBAAO;AAAA,MACpB,GAAG,sBAAqB,KAAK;AAAA,MAC7B,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,KAAK,QAAQ;AACnB,UAAM,WAAW,KAAK,4BAA4B,IAAI;AACtD,UAAM,KAAK,MAAM,mBAAmB,QAAQ,EAAE;AAC9C,UAAM,KAAK,IAAI;AAAA,EACjB;AAAA,EAEA,MAAM,aAAa,MAA6B;AAC9C,QAAI,KAAK,YAAY,GAAG;AACtB,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,QAAI,OAAO,IAAI,iBAAO;AAAA,MACpB,GAAG,sBAAqB,KAAK;AAAA,MAC7B,UAAU;AAAA;AAAA,IACZ,CAAC;AACD,UAAM,KAAK,QAAQ;AACnB,UAAM,WAAW,KAAK,4BAA4B,IAAI;AACtD,UAAM,KAAK,MAAM,iBAAiB,QAAQ,EAAE;AAC5C,UAAM,KAAK,IAAI;AAAA,EACjB;AAAA,EAEA,MAAM,gBAAmC;AACvC,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAM,KAAK,QAAQ;AAAA,IACrB;AACA,UAAM,SAAS,MAAM,KAAK,WAAY;AAAA,MACpC;AAAA,IACF;AACA,WAAO,OAAO,KAAK,IAAI,CAAC,QAAa,IAAI,OAAO;AAAA,EAClD;AAAA,EAEA,MAAM,eAAe,MAAgC;AACnD,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAM,KAAK,QAAQ;AAAA,IACrB;AACA,UAAM,SAAS,MAAM,KAAK,WAAY,MAAM,gDAAgD;AAAA,MAC1F;AAAA,IACF,CAAC;AACD,WAAO,OAAO,KAAK,SAAS;AAAA,EAC9B;AACF;;;AS3MO,IAAe,YAAf,MAAyB;AAAA,EAFhC,OAEgC;AAAA;AAAA;AAGhC;","names":["import_pg","bindings","import_neko_helper","import_sql_tokenizer","import_neko_helper","Cursor"]}
package/dist/types.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- export { m as CompiledSql, J as JoinCondition, P as Parameter, n as havingType, o as joinType, s as selectType, w as whereBasic, i as whereNested, k as whereNull, g as whereOp, h as whereOpColumn, j as whereRaw, l as whereType } from './Blueprint-BYILRon9.mjs';
1
+ export { m as CompiledSql, J as JoinCondition, P as Parameter, n as havingType, o as joinType, s as selectType, w as whereBasic, i as whereNested, k as whereNull, g as whereOp, h as whereOpColumn, j as whereRaw, l as whereType } from './Blueprint-D3WHeqRS.mjs';
2
2
  import '@devbro/neko-helper';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devbro/neko-sql",
3
- "version": "0.1.28",
3
+ "version": "0.1.30",
4
4
  "description": "generic sql generator",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",