@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.
- package/README.md +23 -3
- package/dist/{Blueprint-D3WHeqRS.d.mts → Blueprint-g4SmS1bH.d.mts} +6 -0
- package/dist/Blueprint.d.mts +1 -1
- package/dist/Connection.d.mts +1 -1
- package/dist/Expression.d.mts +1 -1
- package/dist/Migration.d.mts +1 -1
- package/dist/Query.d.mts +1 -1
- package/dist/Query.mjs +3 -1
- package/dist/Query.mjs.map +1 -1
- package/dist/QueryGrammar.d.mts +1 -1
- package/dist/QueryGrammar.mjs +8 -0
- package/dist/QueryGrammar.mjs.map +1 -1
- package/dist/Schema.d.mts +1 -1
- package/dist/SchemaGrammar.d.mts +1 -1
- package/dist/databases/index.d.mts +5 -1
- package/dist/databases/index.mjs +1 -0
- package/dist/databases/index.mjs.map +1 -1
- package/dist/databases/mysql/MysqlConnection.d.mts +41 -0
- package/dist/databases/mysql/MysqlConnection.mjs +208 -0
- package/dist/databases/mysql/MysqlConnection.mjs.map +1 -0
- package/dist/databases/mysql/MysqlQueryGrammar.d.mts +13 -0
- package/dist/databases/mysql/MysqlQueryGrammar.mjs +18 -0
- package/dist/databases/mysql/MysqlQueryGrammar.mjs.map +1 -0
- package/dist/databases/mysql/MysqlSchemaGrammar.d.mts +8 -0
- package/dist/databases/mysql/MysqlSchemaGrammar.mjs +58 -0
- package/dist/databases/mysql/MysqlSchemaGrammar.mjs.map +1 -0
- package/dist/databases/mysql/index.d.mts +6 -0
- package/dist/databases/mysql/index.mjs +4 -0
- package/dist/databases/mysql/index.mjs.map +1 -0
- package/dist/databases/postgresql/PostgresqlConnection.d.mts +1 -1
- package/dist/databases/postgresql/PostgresqlConnection.mjs +17 -3
- package/dist/databases/postgresql/PostgresqlConnection.mjs.map +1 -1
- package/dist/databases/postgresql/PostgresqlQueryGrammar.d.mts +1 -1
- package/dist/databases/postgresql/PostgresqlSchemaGrammar.d.mts +1 -1
- package/dist/databases/postgresql/index.d.mts +1 -1
- package/dist/databases/sqlite/SqliteConnection.d.mts +1 -1
- package/dist/databases/sqlite/SqliteQueryGrammar.d.mts +1 -1
- package/dist/databases/sqlite/SqliteSchemaGrammar.d.mts +2 -1
- package/dist/databases/sqlite/SqliteSchemaGrammar.mjs +46 -0
- package/dist/databases/sqlite/SqliteSchemaGrammar.mjs.map +1 -1
- package/dist/databases/sqlite/index.d.mts +1 -1
- package/dist/index.d.mts +5 -1
- package/dist/index.js +347 -4
- package/dist/index.js.map +1 -1
- package/dist/types.d.mts +1 -1
- 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';
|
package/dist/Blueprint.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { B as Blueprint, a as Column, C as ColumnPropertiesType, F as ForeignKeyConstraint, I as IndexConstraint } from './Blueprint-
|
|
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';
|
package/dist/Connection.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { b as Connection, c as connection_events } from './Blueprint-
|
|
1
|
+
export { b as Connection, c as connection_events } from './Blueprint-g4SmS1bH.mjs';
|
|
2
2
|
import '@devbro/neko-helper';
|
package/dist/Expression.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { E as Expression } from './Blueprint-
|
|
1
|
+
export { E as Expression } from './Blueprint-g4SmS1bH.mjs';
|
|
2
2
|
import '@devbro/neko-helper';
|
package/dist/Migration.d.mts
CHANGED
package/dist/Query.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { d as Query, Q as QueryParts } from './Blueprint-
|
|
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
|
-
|
|
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);
|
package/dist/Query.mjs.map
CHANGED
|
@@ -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":[]}
|
package/dist/QueryGrammar.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { e as QueryGrammar } from './Blueprint-
|
|
1
|
+
export { e as QueryGrammar } from './Blueprint-g4SmS1bH.mjs';
|
|
2
2
|
import '@devbro/neko-helper';
|
package/dist/QueryGrammar.mjs
CHANGED
|
@@ -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-
|
|
1
|
+
export { S as Schema } from './Blueprint-g4SmS1bH.mjs';
|
|
2
2
|
import '@devbro/neko-helper';
|
package/dist/SchemaGrammar.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { f as SchemaGrammar } from './Blueprint-
|
|
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
|
-
|
|
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';
|
package/dist/databases/index.mjs
CHANGED
|
@@ -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":";;AAAA,SAA4B,cAAc,qBAAqB;AAC/D,OAAO,WAAW;AAElB,SAAS,aAAa;AACtB,SAAS,yBAAyB;AAClC,SAAS,cAAc;AACvB,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;AAEtB,MAAM,wBAAwB,cAAc;AAAA,EATnD,OASmD;AAAA;AAAA;AAAA,EACzC,eAAe,IAAI,aAAa;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,EACP,OAAO;AAAA,EAEP,OAAO,WAA8B;AAAA,IACnC,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,uBAAuB;AAAA,EACzB;AAAA,EAEA,YAAY,QAA2B;AACrC,UAAM;AACN,QAAI,CAAC,gBAAgB,MAAM;AACzB,sBAAgB,aAAa,EAAE,GAAG,gBAAgB,UAAU,GAAG,OAAO;AACtE,sBAAgB,OAAO,MAAM,WAAW,gBAAgB,UAAU;AAAA,IACpE;AAAA,EACF;AAAA,EACA,MAAM,UAA4B;AAChC,SAAK,aAAa,KAAK,SAAS,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAChD,SAAK,aAAa,MAAM,gBAAgB,KAAK,cAAc;AAC3D,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;AAEA,SAAK,aAAa,KAAK,SAAS,EAAE,KAAK,IAAI,KAAK,UAAU,IAAI,SAAS,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAExF,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAM,KAAK,QAAQ;AAAA,IACrB;AAEA,UAAM,SAAS,MAAM,KAAK,WAAY,MAAM,IAAI,KAAK,IAAI,QAAQ;AACjE,WAAO,OAAO,CAAC;AAAA,EACjB;AAAA,EAEA,MAAM,UAAU,KAAgC;AAG9C,WAAO,KAAK,SAAS,GAAG;AAAA,EAC1B;AAAA,EAEA,MAAM,aAA+B;AACnC,QAAI,KAAK,eAAe,QAAW;AACjC,aAAO;AAAA,IACT;AACA,SAAK,WAAW,QAAQ;AACxB,SAAK,aAAa;AAClB,SAAK,aAAa,KAAK,YAAY,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACnD,WAAO;AAAA,EACT;AAAA,EAEA,WAAkB;AAChB,WAAO,IAAI,MAAM,MAAM,IAAI,kBAAkB,CAAC;AAAA,EAChD;AAAA,EAEA,YAAoB;AAClB,WAAO,IAAI,OAAO,MAAM,IAAI,mBAAmB,CAAC;AAAA,EAClD;AAAA,EAEA,kBAAqC;AACnC,WAAO,IAAI,kBAAkB;AAAA,EAC/B;AAAA,EACA,mBAAuC;AACrC,WAAO,IAAI,mBAAmB;AAAA,EAChC;AAAA,EAEA,MAAM,mBAAkC;AACtC,UAAM,KAAK,SAAS;AAAA,MAClB,KAAK;AAAA,MACL,UAAU,CAAC;AAAA,MACX,OAAO,CAAC,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;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,OAAO,UAAyB;AAC9B,WAAO,gBAAgB,KAAK,IAAI;AAAA,EAClC;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,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,QAAI,iBAAiB,IAAI,KAAK,YAAY,CAAC,GAAG;AAE5C,YAAM,cAAc,KAAK,QAAQ,MAAM,IAAI;AAC3C,aAAO,KAAK,WAAW;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,MAA6B;AAChD,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAMA,YAAW,MAAM,MAAM,iBAAiB;AAAA,QAC5C,MAAM,gBAAgB,WAAW;AAAA,QACjC,MAAM,gBAAgB,WAAW;AAAA,QACjC,UAAU,gBAAgB,WAAW;AAAA,QACrC,MAAM,gBAAgB,WAAW;AAAA,MACnC,CAAC;AAED,YAAMC,YAAW,KAAK,4BAA4B,IAAI;AACtD,cAAQ,IAAIA,SAAQ;AACpB,UAAI,CAAC,IAAI,IAAI,MAAMD,UAAS,MAAM,mBAAmBC,SAAQ,EAAE;AAE/D,YAAMD,UAAS,IAAI;AACnB;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,MAAM,iBAAiB;AAAA,MAC5C,MAAM,gBAAgB,WAAW;AAAA,MACjC,MAAM,gBAAgB,WAAW;AAAA,MACjC,UAAU,gBAAgB,WAAW;AAAA,MACrC,MAAM,gBAAgB,WAAW;AAAA,IACnC,CAAC;AACD,UAAM,WAAW,KAAK,4BAA4B,IAAI;AACtD,UAAM,SAAS,MAAM,mBAAmB,QAAQ,EAAE;AAClD,UAAM,SAAS,IAAI;AAAA,EACrB;AAAA,EAEA,MAAM,aAAa,MAA6B;AAC9C,QAAI,KAAK,YAAY,GAAG;AACtB,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,WAAW,MAAM,MAAM,iBAAiB;AAAA,MAC5C,MAAM,gBAAgB,WAAW;AAAA,MACjC,MAAM,gBAAgB,WAAW;AAAA,MACjC,UAAU,gBAAgB,WAAW;AAAA,MACrC,MAAM,gBAAgB,WAAW;AAAA,IACnC,CAAC;AACD,UAAM,WAAW,KAAK,4BAA4B,IAAI;AACtD,UAAM,SAAS,MAAM,iBAAiB,QAAQ,EAAE;AAChD,UAAM,SAAS,IAAI;AAAA,EACrB;AAAA,EAEA,MAAM,gBAAmC;AACvC,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAM,KAAK,QAAQ;AAAA,IACrB;AACA,UAAM,CAAC,IAAI,IAAI,MAAM,KAAK,WAAY,MAA6B,gBAAgB;AACnF,WAAO,KAAK,IAAI,CAAC,QAAa,IAAI,QAAQ;AAAA,EAC5C;AAAA,EAEA,MAAM,eAAe,MAAgC;AACnD,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAM,WAAW,MAAM,MAAM,iBAAiB;AAAA,QAC5C,MAAM,gBAAgB,WAAW;AAAA,QACjC,MAAM,gBAAgB,WAAW;AAAA,QACjC,UAAU,gBAAgB,WAAW;AAAA,QACrC,MAAM,gBAAgB,WAAW;AAAA,MACnC,CAAC;AAED,UAAI,CAACE,KAAI,IAAI,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,CAAC,IAAI;AAAA,MACP;AAEA,YAAM,SAAS,IAAI;AAEnB,aAAOA,MAAK,SAAS;AAAA,IACvB;AACA,UAAM,CAAC,IAAI,IAAI,MAAM,KAAK,WAAY;AAAA,MACpC;AAAA,MACA,CAAC,IAAI;AAAA,IACP;AACA,WAAO,KAAK,SAAS;AAAA,EACvB;AACF;","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":[]}
|