@devbro/neko-sql 0.1.32 → 0.1.34

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.
Files changed (46) hide show
  1. package/README.md +23 -3
  2. package/dist/{Blueprint-D3WHeqRS.d.mts → Blueprint-g4SmS1bH.d.mts} +6 -0
  3. package/dist/Blueprint.d.mts +1 -1
  4. package/dist/Connection.d.mts +1 -1
  5. package/dist/Expression.d.mts +1 -1
  6. package/dist/Migration.d.mts +1 -1
  7. package/dist/Query.d.mts +1 -1
  8. package/dist/Query.mjs +3 -1
  9. package/dist/Query.mjs.map +1 -1
  10. package/dist/QueryGrammar.d.mts +1 -1
  11. package/dist/QueryGrammar.mjs +8 -0
  12. package/dist/QueryGrammar.mjs.map +1 -1
  13. package/dist/Schema.d.mts +1 -1
  14. package/dist/SchemaGrammar.d.mts +1 -1
  15. package/dist/databases/index.d.mts +5 -1
  16. package/dist/databases/index.mjs +1 -0
  17. package/dist/databases/index.mjs.map +1 -1
  18. package/dist/databases/mysql/MysqlConnection.d.mts +41 -0
  19. package/dist/databases/mysql/MysqlConnection.mjs +208 -0
  20. package/dist/databases/mysql/MysqlConnection.mjs.map +1 -0
  21. package/dist/databases/mysql/MysqlQueryGrammar.d.mts +13 -0
  22. package/dist/databases/mysql/MysqlQueryGrammar.mjs +18 -0
  23. package/dist/databases/mysql/MysqlQueryGrammar.mjs.map +1 -0
  24. package/dist/databases/mysql/MysqlSchemaGrammar.d.mts +8 -0
  25. package/dist/databases/mysql/MysqlSchemaGrammar.mjs +58 -0
  26. package/dist/databases/mysql/MysqlSchemaGrammar.mjs.map +1 -0
  27. package/dist/databases/mysql/index.d.mts +6 -0
  28. package/dist/databases/mysql/index.mjs +4 -0
  29. package/dist/databases/mysql/index.mjs.map +1 -0
  30. package/dist/databases/postgresql/PostgresqlConnection.d.mts +1 -1
  31. package/dist/databases/postgresql/PostgresqlConnection.mjs +17 -3
  32. package/dist/databases/postgresql/PostgresqlConnection.mjs.map +1 -1
  33. package/dist/databases/postgresql/PostgresqlQueryGrammar.d.mts +1 -1
  34. package/dist/databases/postgresql/PostgresqlSchemaGrammar.d.mts +1 -1
  35. package/dist/databases/postgresql/index.d.mts +1 -1
  36. package/dist/databases/sqlite/SqliteConnection.d.mts +1 -1
  37. package/dist/databases/sqlite/SqliteQueryGrammar.d.mts +1 -1
  38. package/dist/databases/sqlite/SqliteSchemaGrammar.d.mts +2 -1
  39. package/dist/databases/sqlite/SqliteSchemaGrammar.mjs +46 -0
  40. package/dist/databases/sqlite/SqliteSchemaGrammar.mjs.map +1 -1
  41. package/dist/databases/sqlite/index.d.mts +1 -1
  42. package/dist/index.d.mts +5 -1
  43. package/dist/index.js +347 -4
  44. package/dist/index.js.map +1 -1
  45. package/dist/types.d.mts +1 -1
  46. package/package.json +2 -1
package/README.md CHANGED
@@ -15,10 +15,10 @@ currently supported databases:
15
15
 
16
16
  - postgresql
17
17
  - sqlite
18
+ - mysql
18
19
 
19
20
  future planned:
20
21
 
21
- - mysql
22
22
  - mssql
23
23
 
24
24
  ## how to use
@@ -63,8 +63,28 @@ const results = await query.table('users').whereOp('id', '=', 1).get();
63
63
  await conn.disconnect();
64
64
  ```
65
65
 
66
+ ### MySQL Example
67
+
68
+ ```typescript
69
+ import { MysqlConnection } from '@devbro/neko-sql';
70
+
71
+ const conn = new MysqlConnection({
72
+ host: 'localhost',
73
+ database: 'mydb',
74
+ user: 'myuser',
75
+ password: 'mypassword',
76
+ port: 3306,
77
+ });
78
+
79
+ await conn.connect();
80
+
81
+ // Use Query builder
82
+ const query = conn.getQuery();
83
+ const results = await query.table('users').whereOp('id', '=', 1).get();
84
+
85
+ await conn.disconnect();
86
+ ```
87
+
66
88
  please check test classes for more robust examples
67
89
 
68
90
  ## APIs
69
-
70
- -- TODO: add all available methods and how to use them
@@ -139,6 +139,12 @@ declare abstract class QueryGrammar {
139
139
  compileHaving(having: havingType[]): CompiledSql;
140
140
  compileHavingOperation(w: whereOp): CompiledSql;
141
141
  compileHavingRaw(w: whereRaw): CompiledSql;
142
+ /**
143
+ * post process result from database
144
+ * @param result result from database
145
+ * @returns post processed result
146
+ */
147
+ postProcessGetInsertId(result: any): any;
142
148
  }
143
149
 
144
150
  type connection_events = 'connect' | 'disconnect' | 'query' | 'error';
@@ -1,2 +1,2 @@
1
- export { B as Blueprint, a as Column, C as ColumnPropertiesType, F as ForeignKeyConstraint, I as IndexConstraint } from './Blueprint-D3WHeqRS.mjs';
1
+ export { B as Blueprint, a as Column, C as ColumnPropertiesType, F as ForeignKeyConstraint, I as IndexConstraint } from './Blueprint-g4SmS1bH.mjs';
2
2
  import '@devbro/neko-helper';
@@ -1,2 +1,2 @@
1
- export { b as Connection, c as connection_events } from './Blueprint-D3WHeqRS.mjs';
1
+ export { b as Connection, c as connection_events } from './Blueprint-g4SmS1bH.mjs';
2
2
  import '@devbro/neko-helper';
@@ -1,2 +1,2 @@
1
- export { E as Expression } from './Blueprint-D3WHeqRS.mjs';
1
+ export { E as Expression } from './Blueprint-g4SmS1bH.mjs';
2
2
  import '@devbro/neko-helper';
@@ -1,4 +1,4 @@
1
- import { S as Schema } from './Blueprint-D3WHeqRS.mjs';
1
+ import { S as Schema } from './Blueprint-g4SmS1bH.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-D3WHeqRS.mjs';
1
+ export { d as Query, Q as QueryParts } from './Blueprint-g4SmS1bH.mjs';
2
2
  import '@devbro/neko-helper';
package/dist/Query.mjs CHANGED
@@ -139,7 +139,9 @@ class Query {
139
139
  }
140
140
  async insertGetId(data, options = { primaryKey: ["id"] }) {
141
141
  const csql = this.grammar.compileInsertGetId(this, data, options);
142
- return await this.connection?.runQuery(csql);
142
+ let rc = await this.connection?.runQuery(csql);
143
+ rc = this.grammar.postProcessGetInsertId(rc);
144
+ return rc;
143
145
  }
144
146
  async update(data) {
145
147
  const csql = this.grammar.compileUpdate(this, data);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Query.mts"],"sourcesContent":["import { Connection } from './Connection.mjs';\nimport { QueryGrammar } from './QueryGrammar.mjs';\nimport {\n CompiledSql,\n JoinCondition,\n Parameter,\n selectType,\n whereType,\n havingType,\n joinType,\n} from './types.mjs';\n\nexport type QueryParts = {\n select: selectType[];\n table: string;\n join: joinType[];\n where: whereType[];\n groupBy: string[];\n having: havingType[];\n orderBy: string[];\n limit: number | null;\n offset: number | null;\n 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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/Query.mts"],"sourcesContent":["import { Connection } from './Connection.mjs';\nimport { QueryGrammar } from './QueryGrammar.mjs';\nimport {\n CompiledSql,\n JoinCondition,\n Parameter,\n selectType,\n whereType,\n havingType,\n joinType,\n} from './types.mjs';\n\nexport type QueryParts = {\n select: selectType[];\n table: string;\n join: joinType[];\n where: whereType[];\n groupBy: string[];\n having: havingType[];\n orderBy: string[];\n limit: number | null;\n offset: number | null;\n 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 let rc = await this.connection?.runQuery(csql);\n rc = this.grammar.postProcessGetInsertId(rc);\n return rc;\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"],"mappings":"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","names":[]}
@@ -1,2 +1,2 @@
1
- export { e as QueryGrammar } from './Blueprint-D3WHeqRS.mjs';
1
+ export { e as QueryGrammar } from './Blueprint-g4SmS1bH.mjs';
2
2
  import '@devbro/neko-helper';
@@ -335,6 +335,14 @@ class QueryGrammar {
335
335
  bindings: w.bindings
336
336
  };
337
337
  }
338
+ /**
339
+ * post process result from database
340
+ * @param result result from database
341
+ * @returns post processed result
342
+ */
343
+ postProcessGetInsertId(result) {
344
+ return result;
345
+ }
338
346
  }
339
347
  export {
340
348
  QueryGrammar
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/QueryGrammar.mts"],"sourcesContent":["import { Query } from './Query.mjs';\nimport {\n Parameter,\n CompiledSql,\n selectType,\n whereNull,\n whereOp,\n whereType,\n whereRaw,\n havingType,\n whereOpColumn,\n joinType,\n 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"],"mappings":"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","names":["bindings"]}
1
+ {"version":3,"sources":["../src/QueryGrammar.mts"],"sourcesContent":["import { Query } from './Query.mjs';\nimport {\n Parameter,\n CompiledSql,\n selectType,\n whereNull,\n whereOp,\n whereType,\n whereRaw,\n havingType,\n whereOpColumn,\n joinType,\n whereNested,\n} from './types.mjs';\n// @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 /**\n * post process result from database\n * @param result result from database\n * @returns post processed result\n */\n postProcessGetInsertId(result: any) {\n return result;\n }\n}\n"],"mappings":"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","names":["bindings"]}
package/dist/Schema.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- export { S as Schema } from './Blueprint-D3WHeqRS.mjs';
1
+ export { S as Schema } from './Blueprint-g4SmS1bH.mjs';
2
2
  import '@devbro/neko-helper';
@@ -1,2 +1,2 @@
1
- export { f as SchemaGrammar } from './Blueprint-D3WHeqRS.mjs';
1
+ export { f as SchemaGrammar } from './Blueprint-g4SmS1bH.mjs';
2
2
  import '@devbro/neko-helper';
@@ -4,7 +4,11 @@ export { PostgresqlSchemaGrammar } from './postgresql/PostgresqlSchemaGrammar.mj
4
4
  export { SqliteConfig, SqliteConnection } from './sqlite/SqliteConnection.mjs';
5
5
  export { SqliteQueryGrammar } from './sqlite/SqliteQueryGrammar.mjs';
6
6
  export { SqliteSchemaGrammar } from './sqlite/SqliteSchemaGrammar.mjs';
7
- import '../Blueprint-D3WHeqRS.mjs';
7
+ export { MysqlConnection } from './mysql/MysqlConnection.mjs';
8
+ export { MysqlQueryGrammar } from './mysql/MysqlQueryGrammar.mjs';
9
+ export { MysqlSchemaGrammar } from './mysql/MysqlSchemaGrammar.mjs';
10
+ import '../Blueprint-g4SmS1bH.mjs';
8
11
  import '@devbro/neko-helper';
9
12
  import 'pg';
10
13
  import 'better-sqlite3';
14
+ import 'mysql2/promise';
@@ -1,3 +1,4 @@
1
1
  export * from "./postgresql/index.mjs";
2
2
  export * from "./sqlite/index.mjs";
3
+ export * from "./mysql/index.mjs";
3
4
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/databases/index.mts"],"sourcesContent":["export * from './postgresql/index.mjs';\nexport * from './sqlite/index.mjs';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../src/databases/index.mts"],"sourcesContent":["export * from './postgresql/index.mjs';\nexport * from './sqlite/index.mjs';\nexport * from './mysql/index.mjs';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,41 @@
1
+ import { b as Connection, c as connection_events, m as CompiledSql, d as Query, S as Schema } from '../../Blueprint-g4SmS1bH.mjs';
2
+ import mysql from 'mysql2/promise';
3
+ import { MysqlQueryGrammar } from './MysqlQueryGrammar.mjs';
4
+ import { MysqlSchemaGrammar } from './MysqlSchemaGrammar.mjs';
5
+ import '@devbro/neko-helper';
6
+
7
+ declare class MysqlConnection extends Connection {
8
+ private eventManager;
9
+ on(event: connection_events, listener: (...args: any[]) => void): this;
10
+ off(event: connection_events, listener: (...args: any[]) => void): this;
11
+ emit(event: connection_events, ...args: any[]): Promise<boolean>;
12
+ connection: mysql.PoolConnection | undefined;
13
+ static pool: mysql.Pool;
14
+ static poolConfig: mysql.PoolOptions;
15
+ static defaults: mysql.PoolOptions;
16
+ constructor(params: mysql.PoolOptions);
17
+ connect(): Promise<boolean>;
18
+ runQuery(sql: CompiledSql | string): Promise<any>;
19
+ runCursor(sql: CompiledSql): Promise<any>;
20
+ disconnect(): Promise<boolean>;
21
+ getQuery(): Query;
22
+ getSchema(): Schema;
23
+ getQueryGrammar(): MysqlQueryGrammar;
24
+ getSchemaGrammar(): MysqlSchemaGrammar;
25
+ beginTransaction(): Promise<void>;
26
+ commit(): Promise<void>;
27
+ rollback(): Promise<void>;
28
+ static destroy(): Promise<void>;
29
+ isConnected(): boolean;
30
+ /**
31
+ * Validates and escapes a MySQL identifier (database name, table name, etc.)
32
+ * Uses a whitelist approach to ensure only safe characters are allowed
33
+ */
34
+ private validateAndEscapeIdentifier;
35
+ createDatabase(name: string): Promise<void>;
36
+ dropDatabase(name: string): Promise<void>;
37
+ listDatabases(): Promise<string[]>;
38
+ existsDatabase(name: string): Promise<boolean>;
39
+ }
40
+
41
+ export { MysqlConnection };
@@ -0,0 +1,208 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { Connection as ConnectionAbs } from "../../Connection.mjs";
4
+ import mysql from "mysql2/promise";
5
+ import { Query } from "../../Query.mjs";
6
+ import { MysqlQueryGrammar } from "./MysqlQueryGrammar.mjs";
7
+ import { Schema } from "../../Schema.mjs";
8
+ import { MysqlSchemaGrammar } from "./MysqlSchemaGrammar.mjs";
9
+ import { EventManager } from "@devbro/neko-helper";
10
+ class MysqlConnection extends ConnectionAbs {
11
+ static {
12
+ __name(this, "MysqlConnection");
13
+ }
14
+ eventManager = new EventManager();
15
+ on(event, listener) {
16
+ this.eventManager.on(event, listener);
17
+ return this;
18
+ }
19
+ off(event, listener) {
20
+ this.eventManager.off(event, listener);
21
+ return this;
22
+ }
23
+ emit(event, ...args) {
24
+ return this.eventManager.emit(event, ...args);
25
+ }
26
+ connection;
27
+ static pool;
28
+ static poolConfig;
29
+ static defaults = {
30
+ port: 3306,
31
+ connectionLimit: 20,
32
+ waitForConnections: true,
33
+ queueLimit: 0,
34
+ enableKeepAlive: true,
35
+ keepAliveInitialDelay: 0
36
+ };
37
+ constructor(params) {
38
+ super();
39
+ if (!MysqlConnection.pool) {
40
+ MysqlConnection.poolConfig = { ...MysqlConnection.defaults, ...params };
41
+ MysqlConnection.pool = mysql.createPool(MysqlConnection.poolConfig);
42
+ }
43
+ }
44
+ async connect() {
45
+ this.eventManager.emit("connect").catch(() => {
46
+ });
47
+ this.connection = await MysqlConnection.pool.getConnection();
48
+ return true;
49
+ }
50
+ async runQuery(sql) {
51
+ if (typeof sql === "string") {
52
+ sql = { sql, bindings: [], parts: [sql] };
53
+ }
54
+ this.eventManager.emit("query", { sql: sql.sql, bindings: sql.bindings }).catch(() => {
55
+ });
56
+ if (!this.isConnected()) {
57
+ await this.connect();
58
+ }
59
+ const result = await this.connection.query(sql.sql, sql.bindings);
60
+ return result[0];
61
+ }
62
+ async runCursor(sql) {
63
+ return this.runQuery(sql);
64
+ }
65
+ async disconnect() {
66
+ if (this.connection === void 0) {
67
+ return true;
68
+ }
69
+ this.connection.release();
70
+ this.connection = void 0;
71
+ this.eventManager.emit("disconnect").catch(() => {
72
+ });
73
+ return true;
74
+ }
75
+ getQuery() {
76
+ return new Query(this, new MysqlQueryGrammar());
77
+ }
78
+ getSchema() {
79
+ return new Schema(this, new MysqlSchemaGrammar());
80
+ }
81
+ getQueryGrammar() {
82
+ return new MysqlQueryGrammar();
83
+ }
84
+ getSchemaGrammar() {
85
+ return new MysqlSchemaGrammar();
86
+ }
87
+ async beginTransaction() {
88
+ await this.runQuery({
89
+ sql: "BEGIN",
90
+ bindings: [],
91
+ parts: ["BEGIN"]
92
+ });
93
+ }
94
+ async commit() {
95
+ await this.runQuery({ sql: "COMMIT", bindings: [], parts: ["COMMIT"] });
96
+ }
97
+ async rollback() {
98
+ await this.runQuery({ sql: "ROLLBACK", bindings: [], parts: ["ROLLBACK"] });
99
+ }
100
+ static destroy() {
101
+ return MysqlConnection.pool.end();
102
+ }
103
+ isConnected() {
104
+ return this.connection !== void 0;
105
+ }
106
+ /**
107
+ * Validates and escapes a MySQL identifier (database name, table name, etc.)
108
+ * Uses a whitelist approach to ensure only safe characters are allowed
109
+ */
110
+ validateAndEscapeIdentifier(name) {
111
+ const validIdentifierPattern = /^[a-zA-Z0-9_$]+$/;
112
+ if (!validIdentifierPattern.test(name)) {
113
+ throw new Error(
114
+ `Invalid identifier: "${name}". Identifiers must contain only letters, digits, underscores, and dollar signs.`
115
+ );
116
+ }
117
+ const reservedKeywords = /* @__PURE__ */ new Set([
118
+ "database",
119
+ "table",
120
+ "user",
121
+ "order",
122
+ "group",
123
+ "select",
124
+ "insert",
125
+ "update",
126
+ "delete",
127
+ "from",
128
+ "where",
129
+ "index",
130
+ "key"
131
+ ]);
132
+ if (reservedKeywords.has(name.toLowerCase())) {
133
+ const escapedName = name.replace(/`/g, "``");
134
+ return `\`${escapedName}\``;
135
+ }
136
+ return name;
137
+ }
138
+ async createDatabase(name) {
139
+ if (!this.isConnected()) {
140
+ const tempConn2 = await mysql.createConnection({
141
+ host: MysqlConnection.poolConfig.host,
142
+ user: MysqlConnection.poolConfig.user,
143
+ password: MysqlConnection.poolConfig.password,
144
+ port: MysqlConnection.poolConfig.port
145
+ });
146
+ const safeName2 = this.validateAndEscapeIdentifier(name);
147
+ console.log(safeName2);
148
+ let [rows] = await tempConn2.query(`CREATE DATABASE ${safeName2}`);
149
+ await tempConn2.end();
150
+ return;
151
+ }
152
+ const tempConn = await mysql.createConnection({
153
+ host: MysqlConnection.poolConfig.host,
154
+ user: MysqlConnection.poolConfig.user,
155
+ password: MysqlConnection.poolConfig.password,
156
+ port: MysqlConnection.poolConfig.port
157
+ });
158
+ const safeName = this.validateAndEscapeIdentifier(name);
159
+ await tempConn.query(`CREATE DATABASE ${safeName}`);
160
+ await tempConn.end();
161
+ }
162
+ async dropDatabase(name) {
163
+ if (this.isConnected()) {
164
+ throw new Error("Cannot drop database while connected.");
165
+ }
166
+ const tempConn = await mysql.createConnection({
167
+ host: MysqlConnection.poolConfig.host,
168
+ user: MysqlConnection.poolConfig.user,
169
+ password: MysqlConnection.poolConfig.password,
170
+ port: MysqlConnection.poolConfig.port
171
+ });
172
+ const safeName = this.validateAndEscapeIdentifier(name);
173
+ await tempConn.query(`DROP DATABASE ${safeName}`);
174
+ await tempConn.end();
175
+ }
176
+ async listDatabases() {
177
+ if (!this.isConnected()) {
178
+ await this.connect();
179
+ }
180
+ const [rows] = await this.connection.query("SHOW DATABASES");
181
+ return rows.map((row) => row.Database);
182
+ }
183
+ async existsDatabase(name) {
184
+ if (!this.isConnected()) {
185
+ const tempConn = await mysql.createConnection({
186
+ host: MysqlConnection.poolConfig.host,
187
+ user: MysqlConnection.poolConfig.user,
188
+ password: MysqlConnection.poolConfig.password,
189
+ port: MysqlConnection.poolConfig.port
190
+ });
191
+ let [rows2] = await tempConn.query(
192
+ "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?",
193
+ [name]
194
+ );
195
+ await tempConn.end();
196
+ return rows2.length > 0;
197
+ }
198
+ const [rows] = await this.connection.query(
199
+ "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?",
200
+ [name]
201
+ );
202
+ return rows.length > 0;
203
+ }
204
+ }
205
+ export {
206
+ MysqlConnection
207
+ };
208
+ //# sourceMappingURL=MysqlConnection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/databases/mysql/MysqlConnection.mts"],"sourcesContent":["import { connection_events, Connection as ConnectionAbs } from '../../Connection.mjs';\nimport mysql from 'mysql2/promise';\nimport { CompiledSql } from '../../types.mjs';\nimport { Query } from '../../Query.mjs';\nimport { MysqlQueryGrammar } from './MysqlQueryGrammar.mjs';\nimport { Schema } from '../../Schema.mjs';\nimport { MysqlSchemaGrammar } from './MysqlSchemaGrammar.mjs';\nimport { EventManager } from '@devbro/neko-helper';\n\nexport class MysqlConnection 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: mysql.PoolConnection | undefined;\n static pool: mysql.Pool;\n static poolConfig: mysql.PoolOptions;\n\n static defaults: mysql.PoolOptions = {\n port: 3306,\n connectionLimit: 20,\n waitForConnections: true,\n queueLimit: 0,\n enableKeepAlive: true,\n keepAliveInitialDelay: 0,\n };\n\n constructor(params: mysql.PoolOptions) {\n super();\n if (!MysqlConnection.pool) {\n MysqlConnection.poolConfig = { ...MysqlConnection.defaults, ...params };\n MysqlConnection.pool = mysql.createPool(MysqlConnection.poolConfig);\n }\n }\n async connect(): Promise<boolean> {\n this.eventManager.emit('connect').catch(() => {});\n this.connection = await MysqlConnection.pool.getConnection();\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\n this.eventManager.emit('query', { sql: sql.sql, bindings: sql.bindings }).catch(() => {});\n\n if (!this.isConnected()) {\n await this.connect();\n }\n\n const result = await this.connection!.query(sql.sql, sql.bindings);\n return result[0];\n }\n\n async runCursor(sql: CompiledSql): Promise<any> {\n // MySQL doesn't have native cursor support like PostgreSQL\n // Return the full result set for now\n return this.runQuery(sql);\n }\n\n async disconnect(): Promise<boolean> {\n if (this.connection === undefined) {\n return true;\n }\n this.connection.release();\n this.connection = undefined;\n this.eventManager.emit('disconnect').catch(() => {});\n return true;\n }\n\n getQuery(): Query {\n return new Query(this, new MysqlQueryGrammar());\n }\n\n getSchema(): Schema {\n return new Schema(this, new MysqlSchemaGrammar());\n }\n\n getQueryGrammar(): MysqlQueryGrammar {\n return new MysqlQueryGrammar();\n }\n getSchemaGrammar(): MysqlSchemaGrammar {\n return new MysqlSchemaGrammar();\n }\n\n async beginTransaction(): Promise<void> {\n await this.runQuery({\n sql: 'BEGIN',\n bindings: [],\n parts: ['BEGIN'],\n });\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 destroy(): Promise<void> {\n return MysqlConnection.pool.end();\n }\n\n isConnected(): boolean {\n return this.connection !== undefined;\n }\n\n /**\n * Validates and escapes a MySQL 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 // MySQL identifiers can contain: letters, digits, underscores, and dollar signs\n // They must start with a letter, underscore, or digit (in MySQL 5.7.8+)\n const validIdentifierPattern = /^[a-zA-Z0-9_$]+$/;\n\n if (!validIdentifierPattern.test(name)) {\n throw new Error(\n `Invalid identifier: \"${name}\". Identifiers must contain only letters, digits, underscores, and dollar signs.`\n );\n }\n\n // MySQL reserved keywords that should be quoted\n const reservedKeywords = new Set([\n 'database',\n 'table',\n 'user',\n 'order',\n 'group',\n 'select',\n 'insert',\n 'update',\n 'delete',\n 'from',\n 'where',\n 'index',\n 'key',\n ]);\n\n // Quote the identifier with backticks if it's a reserved keyword\n if (reservedKeywords.has(name.toLowerCase())) {\n // Escape any backticks 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 const tempConn = await mysql.createConnection({\n host: MysqlConnection.poolConfig.host,\n user: MysqlConnection.poolConfig.user,\n password: MysqlConnection.poolConfig.password,\n port: MysqlConnection.poolConfig.port,\n });\n\n const safeName = this.validateAndEscapeIdentifier(name);\n console.log(safeName);\n let [rows] = await tempConn.query(`CREATE DATABASE ${safeName}`);\n\n await tempConn.end();\n return;\n }\n\n const tempConn = await mysql.createConnection({\n host: MysqlConnection.poolConfig.host,\n user: MysqlConnection.poolConfig.user,\n password: MysqlConnection.poolConfig.password,\n port: MysqlConnection.poolConfig.port,\n });\n const safeName = this.validateAndEscapeIdentifier(name);\n await tempConn.query(`CREATE DATABASE ${safeName}`);\n await tempConn.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 const tempConn = await mysql.createConnection({\n host: MysqlConnection.poolConfig.host,\n user: MysqlConnection.poolConfig.user,\n password: MysqlConnection.poolConfig.password,\n port: MysqlConnection.poolConfig.port,\n });\n const safeName = this.validateAndEscapeIdentifier(name);\n await tempConn.query(`DROP DATABASE ${safeName}`);\n await tempConn.end();\n }\n\n async listDatabases(): Promise<string[]> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const [rows] = await this.connection!.query<mysql.RowDataPacket[]>('SHOW DATABASES');\n return rows.map((row: any) => row.Database);\n }\n\n async existsDatabase(name: string): Promise<boolean> {\n if (!this.isConnected()) {\n const tempConn = await mysql.createConnection({\n host: MysqlConnection.poolConfig.host,\n user: MysqlConnection.poolConfig.user,\n password: MysqlConnection.poolConfig.password,\n port: MysqlConnection.poolConfig.port,\n });\n\n let [rows] = await tempConn.query<mysql.RowDataPacket[]>(\n 'SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?',\n [name]\n );\n\n await tempConn.end();\n\n return rows.length > 0;\n }\n const [rows] = await this.connection!.query<mysql.RowDataPacket[]>(\n 'SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?',\n [name]\n );\n return rows.length > 0;\n }\n}\n"],"mappings":"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","names":["tempConn","safeName","rows"]}
@@ -0,0 +1,13 @@
1
+ import { e as QueryGrammar, d as Query, m as CompiledSql } from '../../Blueprint-g4SmS1bH.mjs';
2
+ import '@devbro/neko-helper';
3
+
4
+ declare class MysqlQueryGrammar extends QueryGrammar {
5
+ compileInsertGetId(query: Query, data: Record<string, any>, options?: {
6
+ primaryKey: string[];
7
+ }): CompiledSql;
8
+ postProcessGetInsertId(result: any): {
9
+ id: any;
10
+ }[];
11
+ }
12
+
13
+ export { MysqlQueryGrammar };
@@ -0,0 +1,18 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { QueryGrammar } from "../../QueryGrammar.mjs";
4
+ class MysqlQueryGrammar extends QueryGrammar {
5
+ static {
6
+ __name(this, "MysqlQueryGrammar");
7
+ }
8
+ compileInsertGetId(query, data, options = { primaryKey: ["id"] }) {
9
+ return super.compileInsert(query, data);
10
+ }
11
+ postProcessGetInsertId(result) {
12
+ return [{ id: result.insertId }];
13
+ }
14
+ }
15
+ export {
16
+ MysqlQueryGrammar
17
+ };
18
+ //# sourceMappingURL=MysqlQueryGrammar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/databases/mysql/MysqlQueryGrammar.mts"],"sourcesContent":["import { Query } from '../../Query.mjs';\nimport { QueryGrammar } from '../../QueryGrammar.mjs';\nimport { CompiledSql } from '../../types.mjs';\n\nexport class MysqlQueryGrammar extends QueryGrammar {\n compileInsertGetId(\n query: Query,\n data: Record<string, any>,\n options: { primaryKey: string[] } = { primaryKey: ['id'] }\n ): CompiledSql {\n return super.compileInsert(query, data);\n }\n\n postProcessGetInsertId(result: any) {\n return [{id: result.insertId}];\n }\n}\n"],"mappings":";;AACA,SAAS,oBAAoB;AAGtB,MAAM,0BAA0B,aAAa;AAAA,EAJpD,OAIoD;AAAA;AAAA;AAAA,EAClD,mBACE,OACA,MACA,UAAoC,EAAE,YAAY,CAAC,IAAI,EAAE,GAC5C;AACb,WAAO,MAAM,cAAc,OAAO,IAAI;AAAA,EACxC;AAAA,EAEA,uBAAuB,QAAa;AAClC,WAAO,CAAC,EAAC,IAAI,OAAO,SAAQ,CAAC;AAAA,EAC/B;AACF;","names":[]}
@@ -0,0 +1,8 @@
1
+ import { f as SchemaGrammar, a as Column } from '../../Blueprint-g4SmS1bH.mjs';
2
+ import '@devbro/neko-helper';
3
+
4
+ declare class MysqlSchemaGrammar extends SchemaGrammar {
5
+ compileColumn(column: Column): string;
6
+ }
7
+
8
+ export { MysqlSchemaGrammar };