@devbro/neko-sql 0.1.37 → 0.1.39
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/dist/cjs/index.d.ts +615 -0
- package/dist/{index.js → cjs/index.js} +50 -29
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/Blueprint.mjs.map +1 -0
- package/dist/esm/Connection.mjs.map +1 -0
- package/dist/esm/Expression.mjs.map +1 -0
- package/dist/esm/Migration.mjs.map +1 -0
- package/dist/esm/Query.mjs.map +1 -0
- package/dist/esm/QueryGrammar.mjs.map +1 -0
- package/dist/esm/Schema.mjs.map +1 -0
- package/dist/esm/SchemaGrammar.mjs.map +1 -0
- package/dist/{databases → esm/databases}/index.d.mts +1 -0
- package/dist/esm/databases/index.mjs.map +1 -0
- package/dist/{databases → esm/databases}/mysql/MysqlConnection.d.mts +1 -0
- package/dist/{databases → esm/databases}/mysql/MysqlConnection.mjs +12 -9
- package/dist/esm/databases/mysql/MysqlConnection.mjs.map +1 -0
- package/dist/esm/databases/mysql/MysqlQueryGrammar.mjs.map +1 -0
- package/dist/esm/databases/mysql/MysqlSchemaGrammar.mjs.map +1 -0
- package/dist/esm/databases/mysql/index.mjs.map +1 -0
- package/dist/{databases → esm/databases}/postgresql/PostgresqlConnection.d.mts +5 -2
- package/dist/{databases → esm/databases}/postgresql/PostgresqlConnection.mjs +16 -11
- package/dist/esm/databases/postgresql/PostgresqlConnection.mjs.map +1 -0
- package/dist/esm/databases/postgresql/PostgresqlQueryGrammar.mjs.map +1 -0
- package/dist/esm/databases/postgresql/PostgresqlSchemaGrammar.mjs.map +1 -0
- package/dist/{databases → esm/databases}/postgresql/index.d.mts +1 -0
- package/dist/esm/databases/postgresql/index.mjs.map +1 -0
- package/dist/{databases → esm/databases}/sqlite/SqliteConnection.d.mts +1 -0
- package/dist/{databases → esm/databases}/sqlite/SqliteConnection.mjs +7 -3
- package/dist/esm/databases/sqlite/SqliteConnection.mjs.map +1 -0
- package/dist/esm/databases/sqlite/SqliteQueryGrammar.mjs.map +1 -0
- package/dist/esm/databases/sqlite/SqliteSchemaGrammar.mjs.map +1 -0
- package/dist/esm/databases/sqlite/index.mjs.map +1 -0
- package/dist/esm/helper.d.mts +3 -0
- package/dist/esm/helper.mjs +19 -0
- package/dist/esm/helper.mjs.map +1 -0
- package/dist/{index.d.mts → esm/index.d.mts} +1 -0
- package/dist/esm/index.mjs.map +1 -0
- package/package.json +7 -7
- package/dist/Blueprint.mjs.map +0 -1
- package/dist/Connection.mjs.map +0 -1
- package/dist/Expression.mjs.map +0 -1
- package/dist/Migration.mjs.map +0 -1
- package/dist/Query.mjs.map +0 -1
- package/dist/QueryGrammar.mjs.map +0 -1
- package/dist/Schema.mjs.map +0 -1
- package/dist/SchemaGrammar.mjs.map +0 -1
- package/dist/databases/index.mjs.map +0 -1
- package/dist/databases/mysql/MysqlConnection.mjs.map +0 -1
- package/dist/databases/mysql/MysqlQueryGrammar.mjs.map +0 -1
- package/dist/databases/mysql/MysqlSchemaGrammar.mjs.map +0 -1
- package/dist/databases/mysql/index.mjs.map +0 -1
- package/dist/databases/postgresql/PostgresqlConnection.mjs.map +0 -1
- package/dist/databases/postgresql/PostgresqlQueryGrammar.mjs.map +0 -1
- package/dist/databases/postgresql/PostgresqlSchemaGrammar.mjs.map +0 -1
- package/dist/databases/postgresql/index.mjs.map +0 -1
- package/dist/databases/sqlite/SqliteConnection.mjs.map +0 -1
- package/dist/databases/sqlite/SqliteQueryGrammar.mjs.map +0 -1
- package/dist/databases/sqlite/SqliteSchemaGrammar.mjs.map +0 -1
- package/dist/databases/sqlite/index.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- /package/dist/{Blueprint-DjP_Sfrr.d.mts → esm/Blueprint-DjP_Sfrr.d.mts} +0 -0
- /package/dist/{Blueprint.d.mts → esm/Blueprint.d.mts} +0 -0
- /package/dist/{Blueprint.mjs → esm/Blueprint.mjs} +0 -0
- /package/dist/{Connection.d.mts → esm/Connection.d.mts} +0 -0
- /package/dist/{Connection.mjs → esm/Connection.mjs} +0 -0
- /package/dist/{Expression.d.mts → esm/Expression.d.mts} +0 -0
- /package/dist/{Expression.mjs → esm/Expression.mjs} +0 -0
- /package/dist/{Migration.d.mts → esm/Migration.d.mts} +0 -0
- /package/dist/{Migration.mjs → esm/Migration.mjs} +0 -0
- /package/dist/{Query.d.mts → esm/Query.d.mts} +0 -0
- /package/dist/{Query.mjs → esm/Query.mjs} +0 -0
- /package/dist/{QueryGrammar.d.mts → esm/QueryGrammar.d.mts} +0 -0
- /package/dist/{QueryGrammar.mjs → esm/QueryGrammar.mjs} +0 -0
- /package/dist/{Schema.d.mts → esm/Schema.d.mts} +0 -0
- /package/dist/{Schema.mjs → esm/Schema.mjs} +0 -0
- /package/dist/{SchemaGrammar.d.mts → esm/SchemaGrammar.d.mts} +0 -0
- /package/dist/{SchemaGrammar.mjs → esm/SchemaGrammar.mjs} +0 -0
- /package/dist/{databases → esm/databases}/index.mjs +0 -0
- /package/dist/{databases → esm/databases}/mysql/MysqlQueryGrammar.d.mts +0 -0
- /package/dist/{databases → esm/databases}/mysql/MysqlQueryGrammar.mjs +0 -0
- /package/dist/{databases → esm/databases}/mysql/MysqlSchemaGrammar.d.mts +0 -0
- /package/dist/{databases → esm/databases}/mysql/MysqlSchemaGrammar.mjs +0 -0
- /package/dist/{databases → esm/databases}/mysql/index.d.mts +0 -0
- /package/dist/{databases → esm/databases}/mysql/index.mjs +0 -0
- /package/dist/{databases → esm/databases}/postgresql/PostgresqlQueryGrammar.d.mts +0 -0
- /package/dist/{databases → esm/databases}/postgresql/PostgresqlQueryGrammar.mjs +0 -0
- /package/dist/{databases → esm/databases}/postgresql/PostgresqlSchemaGrammar.d.mts +0 -0
- /package/dist/{databases → esm/databases}/postgresql/PostgresqlSchemaGrammar.mjs +0 -0
- /package/dist/{databases → esm/databases}/postgresql/index.mjs +0 -0
- /package/dist/{databases → esm/databases}/sqlite/SqliteQueryGrammar.d.mts +0 -0
- /package/dist/{databases → esm/databases}/sqlite/SqliteQueryGrammar.mjs +0 -0
- /package/dist/{databases → esm/databases}/sqlite/SqliteSchemaGrammar.d.mts +0 -0
- /package/dist/{databases → esm/databases}/sqlite/SqliteSchemaGrammar.mjs +0 -0
- /package/dist/{databases → esm/databases}/sqlite/index.d.mts +0 -0
- /package/dist/{databases → esm/databases}/sqlite/index.mjs +0 -0
- /package/dist/{index.mjs → esm/index.mjs} +0 -0
- /package/dist/{types.d.mts → esm/types.d.mts} +0 -0
- /package/dist/{types.mjs → esm/types.mjs} +0 -0
- /package/dist/{types.mjs.map → esm/types.mjs.map} +0 -0
|
@@ -0,0 +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(\n query: Query,\n data: Record<string, Parameter> | Record<string, Parameter>[]\n ): CompiledSql {\n let parts = ['insert', 'into', query.parts.table, '('];\n const bindings: Parameter[] = [];\n\n // Normalize data to array\n const dataArray = Array.isArray(data) ? data : [data];\n\n if (dataArray.length === 0) {\n throw new Error('Cannot insert empty array');\n }\n\n // Get columns from first entry\n const firstEntry = dataArray[0];\n const columns = Object.keys(firstEntry);\n\n if (columns.length === 0) {\n throw new Error('Cannot insert object with no properties');\n }\n\n // Add column names\n for (const k of columns) {\n parts.push(k);\n parts.push(',');\n }\n parts.pop();\n parts = parts.concat([')', 'values']);\n\n // Add value sets for each entry\n for (let i = 0; i < dataArray.length; i++) {\n parts.push('(');\n for (const k of columns) {\n parts.push('?');\n bindings.push(dataArray[i][k]);\n parts.push(',');\n }\n parts.pop();\n parts.push(')');\n parts.push(',');\n }\n parts.pop();\n\n return { sql: parts.join(' '), parts, bindings };\n }\n\n abstract compileInsertGetId(\n query: Query,\n data: Record<string, Parameter> | 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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/Schema.mts"],"sourcesContent":["import { Blueprint } from './Blueprint.mjs';\nimport { Connection } from './Connection.mjs';\nimport { SchemaGrammar } from './SchemaGrammar.mjs';\n\n/**\n * Schema builder for creating and managing database tables.\n * Provides methods for table creation, alteration, and inspection.\n */\nexport class Schema {\n /**\n * Creates a new Schema instance.\n *\n * @param connection - The database connection to use for schema operations\n * @param grammar - The schema grammar for generating SQL statements\n */\n constructor(\n private readonly connection: Connection | null,\n private readonly grammar: SchemaGrammar\n ) {}\n\n /**\n * Creates a new table in the database.\n *\n * @param tableName - The name of the table to create\n * @param structMethod - A callback function that receives a Blueprint to define table structure\n *\n * @example\n * await schema.createTable('users', (table) => {\n * table.increments('id');\n * table.string('name');\n * table.string('email').unique();\n * table.timestamps();\n * });\n */\n async createTable(tableName: string, structMethod: (blueprint: Blueprint) => void) {\n const blueprint = new Blueprint();\n blueprint.setTableName(tableName, false);\n structMethod(blueprint);\n\n const sql = this.grammar.toSql(blueprint);\n await this.connection?.runQuery({ sql, parts: [], bindings: [] });\n }\n\n /**\n * Modifies an existing table structure.\n *\n * @param tableName - The name of the table to alter\n * @param structMethod - A callback function that receives a Blueprint to define modifications\n *\n * @example\n * await schema.alterTable('users', (table) => {\n * table.string('phone').nullable();\n * table.dropColumn('old_field');\n * });\n */\n async alterTable(tableName: string, structMethod: (blueprint: Blueprint) => void) {\n const blueprint = new Blueprint();\n blueprint.setTableName(tableName, true);\n structMethod(blueprint);\n\n const sql = this.grammar.toSql(blueprint);\n await this.connection?.runQuery({ sql, parts: [], bindings: [] });\n }\n\n /**\n * Drops (deletes) a table from the database.\n *\n * @param tableName - The name of the table to drop\n *\n * @example\n * await schema.dropTable('old_users');\n */\n async dropTable(tableName: string) {\n await this.connection?.runQuery(this.grammar.compileDropTable(tableName));\n }\n\n /**\n * Drops a table from the database if it exists.\n * Safe to call even if the table doesn't exist.\n *\n * @param tableName - The name of the table to drop\n *\n * @example\n * await schema.dropTableIfExists('temp_table');\n */\n async dropTableIfExists(tableName: string) {\n await this.connection?.runQuery(this.grammar.compileDropTableIfExists(tableName));\n }\n\n /**\n * Retrieves a list of all tables in the database.\n *\n * @returns A promise that resolves to an array of table information\n *\n * @example\n * const allTables = await schema.tables();\n * console.log(allTables);\n */\n async tables() {\n return await this.connection?.runQuery(this.grammar.compileTables());\n }\n\n /**\n * Checks if a table exists in the database.\n *\n * @param table_name - The name of the table to check\n * @returns A promise that resolves to true if the table exists, false otherwise\n *\n * @example\n * if (await schema.tableExists('users')) {\n * console.log('Users table exists');\n * }\n */\n async tableExists(table_name: string): Promise<boolean> {\n return (await this.connection?.runQuery(this.grammar.compileTableExists(table_name)))[0][\n 'exists'\n ];\n }\n}\n"],"mappings":";;AAAA,SAAS,iBAAiB;AAQnB,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlB,YACmB,YACA,SACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAlBL,OAQoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BlB,MAAM,YAAY,WAAmB,cAA8C;AACjF,UAAM,YAAY,IAAI,UAAU;AAChC,cAAU,aAAa,WAAW,KAAK;AACvC,iBAAa,SAAS;AAEtB,UAAM,MAAM,KAAK,QAAQ,MAAM,SAAS;AACxC,UAAM,KAAK,YAAY,SAAS,EAAE,KAAK,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,WAAW,WAAmB,cAA8C;AAChF,UAAM,YAAY,IAAI,UAAU;AAChC,cAAU,aAAa,WAAW,IAAI;AACtC,iBAAa,SAAS;AAEtB,UAAM,MAAM,KAAK,QAAQ,MAAM,SAAS;AACxC,UAAM,KAAK,YAAY,SAAS,EAAE,KAAK,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,UAAU,WAAmB;AACjC,UAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,iBAAiB,SAAS,CAAC;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,kBAAkB,WAAmB;AACzC,UAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,yBAAyB,SAAS,CAAC;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,SAAS;AACb,WAAO,MAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,cAAc,CAAC;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,YAAY,YAAsC;AACtD,YAAQ,MAAM,KAAK,YAAY,SAAS,KAAK,QAAQ,mBAAmB,UAAU,CAAC,GAAG,CAAC,EACrF,QACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/SchemaGrammar.mts"],"sourcesContent":["import { Blueprint, Column, ForeignKeyConstraint, IndexConstraint } from './Blueprint.mjs';\nimport { Expression } from './Expression.mjs';\nimport { CompiledSql, Parameter } from './types.mjs';\n\nexport class SchemaGrammar {\n toSql(blueprint: Blueprint): string {\n if (!blueprint.existingTable) {\n return this.compileCreateTable(blueprint).sql;\n } else if (blueprint.existingTable) {\n return this.compileAlterTable(blueprint).sql;\n }\n\n throw new Error('bad blueprint to compile: ' + blueprint.tableName);\n }\n\n compileCreateTable(blueprint: Blueprint): CompiledSql {\n let sql = 'create table ' + blueprint.tableName + ' (';\n const columns = blueprint.columns\n .map((v: Column) => {\n return this.compileColumn(v);\n })\n .join(', ');\n\n const primaryKeys = this.compilePrimaryKeys(blueprint.primaryKeys);\n let foreignKeys: string[] = [];\n if (blueprint.foreignKeys.length > 0) {\n foreignKeys = blueprint.foreignKeys.map((v: ForeignKeyConstraint) => {\n return this.compileForeignKey(v);\n });\n }\n sql += [columns, primaryKeys, ...foreignKeys].join(',') + ')';\n\n const compiledSql = { sql, parts: [], bindings: [] };\n\n // If there are indexes to create, we need to return multiple statements\n if (blueprint.indexes.length > 0) {\n const indexSqls = blueprint.indexes.map((index: IndexConstraint) => {\n return this.compileIndex(blueprint.tableName, index);\n });\n return {\n sql: [compiledSql.sql, ...indexSqls.map((idx) => idx.sql)].join('; '),\n parts: [],\n bindings: compiledSql.bindings,\n };\n }\n\n return compiledSql;\n }\n\n compileAlterTable(blueprint: Blueprint): CompiledSql {\n let sql: string[] = ['alter table ' + blueprint.tableName];\n const add_columns = blueprint.columns.map((v: Column) => {\n return 'add column ' + this.compileColumn(v);\n });\n\n const drop_columns = blueprint.drop_coumns.map((v: string) => {\n return 'drop column ' + v;\n });\n\n const alterStatements = [...add_columns, ...drop_columns];\n if (alterStatements.length > 0) {\n sql = sql.concat([alterStatements.join(', ')]);\n }\n\n // Handle case where only indexes are being added without column changes\n let compiledSql: CompiledSql;\n if (alterStatements.length > 0) {\n compiledSql = { sql: sql.join(' '), parts: [], bindings: [] };\n } else {\n // No column changes, just need the base alter table statement for consistency\n compiledSql = { sql: sql.join(' ') + ' ', parts: [], bindings: [] };\n }\n\n // If there are indexes to create in alter table, add them as separate statements\n if (blueprint.indexes.length > 0) {\n const indexSqls = blueprint.indexes.map((index: IndexConstraint) => {\n return this.compileIndex(blueprint.tableName, index);\n });\n return {\n sql: [compiledSql.sql, ...indexSqls.map((idx) => idx.sql)].join('; '),\n parts: [],\n bindings: compiledSql.bindings,\n };\n }\n\n return compiledSql;\n }\n\n compileColumn(column: Column): string {\n const rc = [`${column.columnName}`];\n\n if (column.properties.type === 'string') {\n rc.push('varchar(' + column.properties.length + ')');\n } else if (column.properties.type === 'char') {\n rc.push('char');\n } else if (column.properties.type === 'boolean') {\n rc.push('boolean');\n } else if (column.properties.type === 'integer') {\n rc.push('integer');\n } else if (column.properties.type === 'text') {\n rc.push('text');\n } else if (column.properties.type === 'timestamp') {\n rc.push('timestamp');\n } else if (column.properties.type === 'timestampz') {\n rc.push('timestamp with time zone');\n } else if (column.properties.type === 'serial') {\n rc.push('serial');\n } else if (column.properties.type === 'float') {\n rc.push('float');\n } else if (column.properties.type === 'double') {\n rc.push('double precision');\n } else if (column.properties.type === 'date') {\n rc.push('date');\n } else if (column.properties.type === 'json') {\n rc.push('json');\n } else if (column.properties.type === 'jsonb') {\n rc.push('jsonb');\n } else if (column.properties.type === 'raw') {\n return column.columnName;\n } else {\n throw new Error('Unknown column type: ' + column.properties.type);\n }\n\n if (column.properties.nullable) {\n rc.push('null');\n } else {\n rc.push('not null');\n }\n\n if (column.properties.unique) {\n rc.push('unique');\n }\n\n if (column.properties.default !== null) {\n rc.push('default ' + this.escape(column.properties.default));\n }\n\n return rc.join(' ');\n }\n\n escape(value: Parameter): string {\n if (value === null || value === undefined) {\n return 'null';\n }\n\n if (typeof value === 'number') {\n return value.toString();\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (value instanceof Date) {\n return \"'\" + value.toISOString() + \"'\";\n }\n\n if (value instanceof Expression) {\n return value.toCompiledSql().sql;\n }\n if (Array.isArray(value)) {\n return \"'{\" + value.join(',') + \"}'\";\n }\n\n return \"'\" + value.replace(\"'\", \"\\\\'\") + \"'\";\n }\n\n compilePrimaryKeys(primaryKeys: string[]): string {\n if (!primaryKeys.length) {\n return '';\n }\n\n return 'primary key (' + primaryKeys.join(', ') + ')';\n }\n\n compileTables(schema: string | string[] | undefined = undefined): CompiledSql {\n return {\n sql:\n 'select c.relname as name, n.nspname as schema, pg_total_relation_size(c.oid) as size, ' +\n \"obj_description(c.oid, 'pg_class') as comment from pg_class c, pg_namespace n \" +\n \"where c.relkind in ('r', 'p') and n.oid = c.relnamespace and \" +\n this.compileSchemaWhereClause(schema, 'n.nspname') +\n ' order by n.nspname, c.relname',\n parts: [],\n bindings: [],\n };\n }\n\n compileTableExists(tableName: string, schema: string = ''): CompiledSql {\n return {\n sql:\n 'select exists (select 1 from pg_class c, pg_namespace n where ' +\n 'n.nspname = ' +\n (schema ? this.escape(schema) : 'current_schema()') +\n \" and c.relname = $1 and c.relkind in ('r', 'p') and n.oid = c.relnamespace)\",\n parts: [],\n bindings: [tableName],\n };\n }\n\n compileDropTable(tableName: string): CompiledSql {\n return { sql: `drop table ${this.doubleQuoteString(tableName)}`, parts: [], bindings: [] };\n }\n\n compileDropTableIfExists(tableName: string): CompiledSql {\n return {\n sql: `drop table if exists ${this.doubleQuoteString(tableName)}`,\n parts: [],\n bindings: [],\n };\n }\n\n protected compileSchemaWhereClause(\n schema: string | string[] | undefined,\n column: string\n ): string {\n if (Array.isArray(schema) && schema.length > 0) {\n return `${column} in (${this.quoteString(schema)})`;\n } else if (schema && typeof schema === 'string') {\n return `${column} = ${this.quoteString(schema)}`;\n } else {\n return `${column} <> 'information_schema' and ${column} not like 'pg\\\\_%'`;\n }\n }\n\n protected quoteString(value: string | string[]): string {\n if (Array.isArray(value)) {\n return value.map((v) => `'${v.replace(/'/g, \"\\\\'\")}'`).join(', ');\n }\n return `'${value.replace(/'/g, \"\\\\'\")}'`;\n }\n\n protected doubleQuoteString(value: string | string[]): string {\n if (Array.isArray(value)) {\n return value.map((v) => this.doubleQuoteString(v)).join(', ');\n }\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n }\n\n protected compileForeignKey(foreignKey: ForeignKeyConstraint): string {\n //FOREIGN KEY (PersonID) REFERENCES users(id)\n const rc = [`FOREIGN KEY (${foreignKey.column})`];\n rc.push(`references ${foreignKey.reference_table.table}(${foreignKey.reference_table.column})`);\n\n if (foreignKey.onDeleteAction) {\n rc.push(`on delete ${foreignKey.onDeleteAction}`);\n }\n\n if (foreignKey.onUpdateAction) {\n rc.push(`on update ${foreignKey.onUpdateAction}`);\n }\n\n return rc.join(' ');\n }\n\n protected compileIndex(tableName: string, index: IndexConstraint): CompiledSql {\n const indexName =\n index.indexName ||\n `${tableName}_${index.columns.join('_')}_${index.unique ? 'unique' : 'index'}`;\n const uniqueKeyword = index.unique ? 'unique ' : '';\n const indexType = index._type ? ` using ${index._type}` : '';\n\n const sql = `create ${uniqueKeyword}index ${indexName} on ${tableName}${indexType} (${index.columns.join(', ')})`;\n\n return { sql, parts: [], bindings: [] };\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
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":[]}
|
|
@@ -12,6 +12,7 @@ declare class MysqlConnection extends Connection {
|
|
|
12
12
|
connection: mysql.PoolConnection | undefined;
|
|
13
13
|
static pool: mysql.Pool;
|
|
14
14
|
static poolConfig: mysql.PoolOptions;
|
|
15
|
+
static mysql: typeof mysql;
|
|
15
16
|
static defaults: mysql.PoolOptions;
|
|
16
17
|
constructor(params: mysql.PoolOptions);
|
|
17
18
|
connect(): Promise<boolean>;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
import { Connection as ConnectionAbs } from "../../Connection.mjs";
|
|
4
|
-
import mysql from "mysql2/promise";
|
|
5
4
|
import { Query } from "../../Query.mjs";
|
|
6
5
|
import { MysqlQueryGrammar } from "./MysqlQueryGrammar.mjs";
|
|
7
6
|
import { Schema } from "../../Schema.mjs";
|
|
8
7
|
import { MysqlSchemaGrammar } from "./MysqlSchemaGrammar.mjs";
|
|
9
8
|
import { EventManager } from "@devbro/neko-helper";
|
|
9
|
+
import { loadPackage } from "../../helper.mjs";
|
|
10
10
|
class MysqlConnection extends ConnectionAbs {
|
|
11
11
|
static {
|
|
12
12
|
__name(this, "MysqlConnection");
|
|
@@ -26,6 +26,7 @@ class MysqlConnection extends ConnectionAbs {
|
|
|
26
26
|
connection;
|
|
27
27
|
static pool;
|
|
28
28
|
static poolConfig;
|
|
29
|
+
static mysql;
|
|
29
30
|
static defaults = {
|
|
30
31
|
port: 3306,
|
|
31
32
|
connectionLimit: 20,
|
|
@@ -36,9 +37,12 @@ class MysqlConnection extends ConnectionAbs {
|
|
|
36
37
|
};
|
|
37
38
|
constructor(params) {
|
|
38
39
|
super();
|
|
40
|
+
if (!MysqlConnection.mysql) {
|
|
41
|
+
MysqlConnection.mysql = loadPackage("mysql2/promise");
|
|
42
|
+
}
|
|
39
43
|
if (!MysqlConnection.pool) {
|
|
40
44
|
MysqlConnection.poolConfig = { ...MysqlConnection.defaults, ...params };
|
|
41
|
-
MysqlConnection.pool = mysql.createPool(MysqlConnection.poolConfig);
|
|
45
|
+
MysqlConnection.pool = MysqlConnection.mysql.createPool(MysqlConnection.poolConfig);
|
|
42
46
|
}
|
|
43
47
|
}
|
|
44
48
|
async connect() {
|
|
@@ -137,19 +141,18 @@ class MysqlConnection extends ConnectionAbs {
|
|
|
137
141
|
}
|
|
138
142
|
async createDatabase(name) {
|
|
139
143
|
if (!this.isConnected()) {
|
|
140
|
-
const tempConn2 = await mysql.createConnection({
|
|
144
|
+
const tempConn2 = await MysqlConnection.mysql.createConnection({
|
|
141
145
|
host: MysqlConnection.poolConfig.host,
|
|
142
146
|
user: MysqlConnection.poolConfig.user,
|
|
143
147
|
password: MysqlConnection.poolConfig.password,
|
|
144
148
|
port: MysqlConnection.poolConfig.port
|
|
145
149
|
});
|
|
146
150
|
const safeName2 = this.validateAndEscapeIdentifier(name);
|
|
147
|
-
|
|
148
|
-
let [rows] = await tempConn2.query(`CREATE DATABASE ${safeName2}`);
|
|
151
|
+
await tempConn2.query(`CREATE DATABASE ${safeName2}`);
|
|
149
152
|
await tempConn2.end();
|
|
150
153
|
return;
|
|
151
154
|
}
|
|
152
|
-
const tempConn = await mysql.createConnection({
|
|
155
|
+
const tempConn = await MysqlConnection.mysql.createConnection({
|
|
153
156
|
host: MysqlConnection.poolConfig.host,
|
|
154
157
|
user: MysqlConnection.poolConfig.user,
|
|
155
158
|
password: MysqlConnection.poolConfig.password,
|
|
@@ -163,7 +166,7 @@ class MysqlConnection extends ConnectionAbs {
|
|
|
163
166
|
if (this.isConnected()) {
|
|
164
167
|
throw new Error("Cannot drop database while connected.");
|
|
165
168
|
}
|
|
166
|
-
const tempConn = await mysql.createConnection({
|
|
169
|
+
const tempConn = await MysqlConnection.mysql.createConnection({
|
|
167
170
|
host: MysqlConnection.poolConfig.host,
|
|
168
171
|
user: MysqlConnection.poolConfig.user,
|
|
169
172
|
password: MysqlConnection.poolConfig.password,
|
|
@@ -182,13 +185,13 @@ class MysqlConnection extends ConnectionAbs {
|
|
|
182
185
|
}
|
|
183
186
|
async existsDatabase(name) {
|
|
184
187
|
if (!this.isConnected()) {
|
|
185
|
-
const tempConn = await mysql.createConnection({
|
|
188
|
+
const tempConn = await MysqlConnection.mysql.createConnection({
|
|
186
189
|
host: MysqlConnection.poolConfig.host,
|
|
187
190
|
user: MysqlConnection.poolConfig.user,
|
|
188
191
|
password: MysqlConnection.poolConfig.password,
|
|
189
192
|
port: MysqlConnection.poolConfig.port
|
|
190
193
|
});
|
|
191
|
-
|
|
194
|
+
const [rows2] = await tempConn.query(
|
|
192
195
|
"SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?",
|
|
193
196
|
[name]
|
|
194
197
|
);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/databases/mysql/MysqlConnection.mts"],"sourcesContent":["import { connection_events, Connection as ConnectionAbs } from '../../Connection.mjs';\nimport type 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';\nimport { loadPackage } from '../../helper.mjs';\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 static mysql: typeof mysql;\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.mysql) {\n MysqlConnection.mysql = loadPackage('mysql2/promise') as typeof mysql;\n }\n if (!MysqlConnection.pool) {\n MysqlConnection.poolConfig = { ...MysqlConnection.defaults, ...params };\n MysqlConnection.pool = MysqlConnection.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 MysqlConnection.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 await tempConn.query(`CREATE DATABASE ${safeName}`);\n\n await tempConn.end();\n return;\n }\n\n const tempConn = await MysqlConnection.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 MysqlConnection.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 MysqlConnection.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 [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 @@
|
|
|
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> | Record<string, any>[],\n options: { primaryKey: string[] } = { primaryKey: ['id'] }\n ): CompiledSql {\n return super.compileInsert(query, data);\n }\n\n postProcessGetInsertId(result: any) {\n let rc = [];\n for (let i = 0; i < result.affectedRows; i++) {\n rc.push({ id: result.insertId + i });\n }\n return rc;\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,QAAI,KAAK,CAAC;AACV,aAAS,IAAI,GAAG,IAAI,OAAO,cAAc,KAAK;AAC5C,SAAG,KAAK,EAAE,IAAI,OAAO,WAAW,EAAE,CAAC;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/databases/mysql/MysqlSchemaGrammar.mts"],"sourcesContent":["import { SchemaGrammar } from '../../SchemaGrammar.mjs';\nimport { Column } from '../../Blueprint.mjs';\n\nexport class MysqlSchemaGrammar extends SchemaGrammar {\n compileColumn(column: Column): string {\n const rc = [`${column.columnName}`];\n\n if (column.properties.type === 'string') {\n rc.push('varchar(' + column.properties.length + ')');\n } else if (column.properties.type === 'char') {\n rc.push('char');\n } else if (column.properties.type === 'boolean') {\n rc.push('boolean');\n } else if (column.properties.type === 'integer') {\n rc.push('integer');\n } else if (column.properties.type === 'text') {\n rc.push('text');\n } else if (column.properties.type === 'timestamp') {\n rc.push('TIMESTAMP');\n } else if (column.properties.type === 'timestampz') {\n rc.push('TIMESTAMP');\n } else if (column.properties.type === 'serial') {\n rc.push('INT AUTO_INCREMENT');\n } else if (column.properties.type === 'float') {\n rc.push('float');\n } else if (column.properties.type === 'double') {\n rc.push('double precision');\n } else if (column.properties.type === 'date') {\n rc.push('date');\n } else if (column.properties.type === 'json') {\n rc.push('json');\n } else if (column.properties.type === 'jsonb') {\n rc.push('jsonb');\n } else if (column.properties.type === 'raw') {\n return column.columnName;\n } else {\n throw new Error('Unknown column type: ' + column.properties.type);\n }\n\n if (column.properties.nullable) {\n rc.push('null');\n } else {\n rc.push('NOT NULL');\n }\n\n if (column.properties.unique) {\n rc.push('unique');\n }\n\n if (column.properties.default !== null) {\n rc.push('default ' + this.escape(column.properties.default));\n }\n\n return rc.join(' ');\n }\n}\n"],"mappings":";;AAAA,SAAS,qBAAqB;AAGvB,MAAM,2BAA2B,cAAc;AAAA,EAHtD,OAGsD;AAAA;AAAA;AAAA,EACnD,cAAc,QAAwB;AACrC,UAAM,KAAK,CAAC,GAAG,OAAO,UAAU,EAAE;AAElC,QAAI,OAAO,WAAW,SAAS,UAAU;AACvC,SAAG,KAAK,aAAa,OAAO,WAAW,SAAS,GAAG;AAAA,IACrD,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,WAAW;AAC/C,SAAG,KAAK,SAAS;AAAA,IACnB,WAAW,OAAO,WAAW,SAAS,WAAW;AAC/C,SAAG,KAAK,SAAS;AAAA,IACnB,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,aAAa;AACjD,SAAG,KAAK,WAAW;AAAA,IACrB,WAAW,OAAO,WAAW,SAAS,cAAc;AAClD,SAAG,KAAK,WAAW;AAAA,IACrB,WAAW,OAAO,WAAW,SAAS,UAAU;AAC9C,SAAG,KAAK,oBAAoB;AAAA,IAC9B,WAAW,OAAO,WAAW,SAAS,SAAS;AAC7C,SAAG,KAAK,OAAO;AAAA,IACjB,WAAW,OAAO,WAAW,SAAS,UAAU;AAC9C,SAAG,KAAK,kBAAkB;AAAA,IAC5B,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,SAAS;AAC7C,SAAG,KAAK,OAAO;AAAA,IACjB,WAAW,OAAO,WAAW,SAAS,OAAO;AAC3C,aAAO,OAAO;AAAA,IAChB,OAAO;AACL,YAAM,IAAI,MAAM,0BAA0B,OAAO,WAAW,IAAI;AAAA,IAClE;AAEA,QAAI,OAAO,WAAW,UAAU;AAC9B,SAAG,KAAK,MAAM;AAAA,IAChB,OAAO;AACL,SAAG,KAAK,UAAU;AAAA,IACpB;AAEA,QAAI,OAAO,WAAW,QAAQ;AAC5B,SAAG,KAAK,QAAQ;AAAA,IAClB;AAEA,QAAI,OAAO,WAAW,YAAY,MAAM;AACtC,SAAG,KAAK,aAAa,KAAK,OAAO,OAAO,WAAW,OAAO,CAAC;AAAA,IAC7D;AAEA,WAAO,GAAG,KAAK,GAAG;AAAA,EACpB;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/databases/mysql/index.mts"],"sourcesContent":["export * from './MysqlConnection.mjs';\nexport * from './MysqlQueryGrammar.mjs';\nexport * from './MysqlSchemaGrammar.mjs';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { b as Connection, c as connection_events, m as CompiledSql, d as Query, S as Schema } from '../../Blueprint-DjP_Sfrr.mjs';
|
|
2
|
-
import { PoolClient,
|
|
2
|
+
import pg, { PoolClient, PoolConfig } from 'pg';
|
|
3
3
|
import { PostgresqlQueryGrammar } from './PostgresqlQueryGrammar.mjs';
|
|
4
4
|
import { PostgresqlSchemaGrammar } from './PostgresqlSchemaGrammar.mjs';
|
|
5
|
+
import pg_cursor from 'pg-cursor';
|
|
5
6
|
import '@devbro/neko-helper';
|
|
6
7
|
|
|
7
8
|
declare class PostgresqlConnection extends Connection {
|
|
@@ -9,8 +10,10 @@ declare class PostgresqlConnection extends Connection {
|
|
|
9
10
|
on(event: connection_events, listener: (...args: any[]) => void): this;
|
|
10
11
|
off(event: connection_events, listener: (...args: any[]) => void): this;
|
|
11
12
|
emit(event: connection_events, ...args: any[]): Promise<boolean>;
|
|
13
|
+
static pg: typeof pg;
|
|
14
|
+
static pg_cursor: typeof pg_cursor;
|
|
12
15
|
connection: PoolClient | undefined;
|
|
13
|
-
static pool: Pool;
|
|
16
|
+
static pool: pg.Pool;
|
|
14
17
|
static defaults: PoolConfig;
|
|
15
18
|
constructor(params: PoolConfig);
|
|
16
19
|
connect(): Promise<boolean>;
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
import { Connection as ConnectionAbs } from "../../Connection.mjs";
|
|
4
|
-
import { Client } from "pg";
|
|
5
|
-
import { Pool } from "pg";
|
|
6
4
|
import { Query } from "../../Query.mjs";
|
|
7
5
|
import { PostgresqlQueryGrammar } from "./PostgresqlQueryGrammar.mjs";
|
|
8
6
|
import { Schema } from "../../Schema.mjs";
|
|
9
7
|
import { PostgresqlSchemaGrammar } from "./PostgresqlSchemaGrammar.mjs";
|
|
10
|
-
import Cursor from "pg-cursor";
|
|
11
8
|
import { EventManager } from "@devbro/neko-helper";
|
|
9
|
+
import { loadPackage } from "../../helper.mjs";
|
|
12
10
|
class PostgresqlConnection extends ConnectionAbs {
|
|
13
11
|
static {
|
|
14
12
|
__name(this, "PostgresqlConnection");
|
|
@@ -25,6 +23,8 @@ class PostgresqlConnection extends ConnectionAbs {
|
|
|
25
23
|
emit(event, ...args) {
|
|
26
24
|
return this.eventManager.emit(event, ...args);
|
|
27
25
|
}
|
|
26
|
+
static pg;
|
|
27
|
+
static pg_cursor;
|
|
28
28
|
connection;
|
|
29
29
|
static pool;
|
|
30
30
|
static defaults = {
|
|
@@ -39,8 +39,15 @@ class PostgresqlConnection extends ConnectionAbs {
|
|
|
39
39
|
};
|
|
40
40
|
constructor(params) {
|
|
41
41
|
super();
|
|
42
|
+
if (!PostgresqlConnection.pg) {
|
|
43
|
+
PostgresqlConnection.pg = loadPackage("pg");
|
|
44
|
+
PostgresqlConnection.pg_cursor = loadPackage("pg-cursor");
|
|
45
|
+
}
|
|
42
46
|
if (!PostgresqlConnection.pool) {
|
|
43
|
-
PostgresqlConnection.pool = new Pool({
|
|
47
|
+
PostgresqlConnection.pool = new PostgresqlConnection.pg.Pool({
|
|
48
|
+
...PostgresqlConnection.defaults,
|
|
49
|
+
...params
|
|
50
|
+
});
|
|
44
51
|
}
|
|
45
52
|
}
|
|
46
53
|
async connect() {
|
|
@@ -67,7 +74,7 @@ class PostgresqlConnection extends ConnectionAbs {
|
|
|
67
74
|
return result?.rows;
|
|
68
75
|
}
|
|
69
76
|
async runCursor(sql) {
|
|
70
|
-
return this.connection?.query(new
|
|
77
|
+
return this.connection?.query(new PostgresqlConnection.pg_cursor(sql.sql, sql.bindings));
|
|
71
78
|
}
|
|
72
79
|
async disconnect() {
|
|
73
80
|
if (this.connection === void 0) {
|
|
@@ -140,7 +147,7 @@ class PostgresqlConnection extends ConnectionAbs {
|
|
|
140
147
|
await this.runQuery(`CREATE DATABASE ${safeName2}`);
|
|
141
148
|
return;
|
|
142
149
|
}
|
|
143
|
-
const conn = new Client({
|
|
150
|
+
const conn = new PostgresqlConnection.pg.Client({
|
|
144
151
|
...PostgresqlConnection.pool.options,
|
|
145
152
|
database: "postgres"
|
|
146
153
|
});
|
|
@@ -155,7 +162,7 @@ class PostgresqlConnection extends ConnectionAbs {
|
|
|
155
162
|
await this.runQuery(`DROP DATABASE ${safeName2}`);
|
|
156
163
|
return;
|
|
157
164
|
}
|
|
158
|
-
const conn = new Client({
|
|
165
|
+
const conn = new PostgresqlConnection.pg.Client({
|
|
159
166
|
...PostgresqlConnection.pool.options,
|
|
160
167
|
database: "postgres"
|
|
161
168
|
// connect to default 'postgres' database to drop others
|
|
@@ -176,15 +183,13 @@ class PostgresqlConnection extends ConnectionAbs {
|
|
|
176
183
|
}
|
|
177
184
|
async existsDatabase(name) {
|
|
178
185
|
if (!this.isConnected()) {
|
|
179
|
-
const conn = new Client({
|
|
186
|
+
const conn = new PostgresqlConnection.pg.Client({
|
|
180
187
|
...PostgresqlConnection.pool.options,
|
|
181
188
|
database: "postgres"
|
|
182
189
|
});
|
|
183
190
|
await conn.connect();
|
|
184
191
|
const safeName = this.validateAndEscapeIdentifier(name);
|
|
185
|
-
const result2 = await conn.query("SELECT 1 FROM pg_database WHERE datname = $1", [
|
|
186
|
-
safeName
|
|
187
|
-
]);
|
|
192
|
+
const result2 = await conn.query("SELECT 1 FROM pg_database WHERE datname = $1", [safeName]);
|
|
188
193
|
await conn.end();
|
|
189
194
|
return result2.rows.length > 0;
|
|
190
195
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/databases/postgresql/PostgresqlConnection.mts"],"sourcesContent":["import { connection_events, Connection as ConnectionAbs } from '../../Connection.mjs';\nimport type { Client, PoolClient, PoolConfig } from 'pg';\nimport type pg from 'pg';\nimport { CompiledSql } from '../../types.mjs';\nimport { Query } from '../../Query.mjs';\nimport { PostgresqlQueryGrammar } from './PostgresqlQueryGrammar.mjs';\nimport { Schema } from '../../Schema.mjs';\nimport { PostgresqlSchemaGrammar } from './PostgresqlSchemaGrammar.mjs';\nimport type pg_cursor from 'pg-cursor';\nimport { EventManager } from '@devbro/neko-helper';\nimport { loadPackage } from '../../helper.mjs';\n\nexport class PostgresqlConnection extends ConnectionAbs {\n private eventManager = new EventManager();\n\n on(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.on(event, listener);\n return this;\n }\n off(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.off(event, listener);\n return this;\n }\n emit(event: connection_events, ...args: any[]): Promise<boolean> {\n return this.eventManager.emit(event, ...args);\n }\n\n static pg: typeof pg;\n static pg_cursor: typeof pg_cursor;\n connection: PoolClient | undefined;\n static pool: pg.Pool;\n\n static defaults: PoolConfig = {\n port: 5432,\n ssl: false,\n max: 20,\n idleTimeoutMillis: 1, // wait X milli seconds before closing an idle/released connection\n connectionTimeoutMillis: 30000, // wait up to 30 seconds to obtain a new connection\n maxUses: 7500,\n };\n\n constructor(params: PoolConfig) {\n super();\n if (!PostgresqlConnection.pg) {\n PostgresqlConnection.pg = loadPackage('pg');\n PostgresqlConnection.pg_cursor = loadPackage('pg-cursor');\n }\n if (!PostgresqlConnection.pool) {\n PostgresqlConnection.pool = new PostgresqlConnection.pg.Pool({\n ...PostgresqlConnection.defaults,\n ...params,\n });\n }\n }\n async connect(): Promise<boolean> {\n this.eventManager.emit('connect').catch(() => {});\n this.connection = await PostgresqlConnection.pool.connect();\n return true;\n }\n async runQuery(sql: CompiledSql | string): Promise<any> {\n if (typeof sql === 'string') {\n sql = { sql: sql, bindings: [], parts: [sql] };\n }\n let counter = 1;\n let sql2 = sql.sql;\n if (sql.parts && sql.parts.length > 0) {\n sql2 = sql.parts.map((v) => (v === '?' ? '$' + counter++ : v)).join(' ');\n }\n\n this.eventManager.emit('query', { sql: sql2, bindings: sql.bindings }).catch(() => {});\n\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query(sql2, sql.bindings);\n return result?.rows;\n }\n\n async runCursor(sql: CompiledSql): Promise<any> {\n return this.connection?.query(new PostgresqlConnection.pg_cursor(sql.sql, sql.bindings));\n }\n\n async disconnect(): Promise<boolean> {\n if (this.connection === undefined) {\n return true;\n }\n await this.connection?.release();\n this.connection = undefined;\n this.eventManager.emit('disconnect').catch(() => {});\n return true;\n }\n\n getQuery(): Query {\n return new Query(this, new PostgresqlQueryGrammar());\n }\n\n getSchema(): Schema {\n return new Schema(this, new PostgresqlSchemaGrammar());\n }\n\n getQueryGrammar(): PostgresqlQueryGrammar {\n return new PostgresqlQueryGrammar();\n }\n getSchemaGrammar(): PostgresqlSchemaGrammar {\n return new PostgresqlSchemaGrammar();\n }\n\n async beginTransaction(): Promise<void> {\n await this.runQuery({ sql: 'BEGIN', bindings: [], parts: ['BEGIN'] });\n }\n\n async commit(): Promise<void> {\n await this.runQuery({ sql: 'COMMIT', bindings: [], parts: ['COMMIT'] });\n }\n\n async rollback(): Promise<void> {\n await this.runQuery({ sql: 'ROLLBACK', bindings: [], parts: ['ROLLBACK'] });\n }\n\n static destroy(): Promise<void> {\n return PostgresqlConnection.pool.end();\n }\n\n isConnected(): boolean {\n return this.connection !== undefined;\n }\n\n /**\n * Validates and escapes a PostgreSQL identifier (database name, table name, etc.)\n * Uses a whitelist approach to ensure only safe characters are allowed\n */\n private validateAndEscapeIdentifier(name: string): string {\n // PostgreSQL identifiers can contain: letters, digits, underscores, and dollar signs\n // They must start with a letter or underscore\n const validIdentifierPattern = /^[a-zA-Z_][a-zA-Z0-9_$]*$/;\n\n if (!validIdentifierPattern.test(name)) {\n throw new Error(\n `Invalid identifier: \"${name}\". Identifiers must start with a letter or underscore and contain only letters, digits, underscores, and dollar signs.`\n );\n }\n\n // PostgreSQL reserved keywords that should be quoted\n const reservedKeywords = new Set([\n 'user',\n 'table',\n 'database',\n 'order',\n 'group',\n 'select',\n 'insert',\n 'update',\n 'delete',\n ]);\n\n // Quote the identifier if it's a reserved keyword or contains uppercase letters\n if (reservedKeywords.has(name.toLowerCase()) || name !== name.toLowerCase()) {\n // Escape any double quotes in the name\n const escapedName = name.replace(/\"/g, '\"\"');\n return `\"${escapedName}\"`;\n }\n\n return name;\n }\n\n async createDatabase(name: string): Promise<void> {\n if (this.isConnected()) {\n const safeName = this.validateAndEscapeIdentifier(name);\n await this.runQuery(`CREATE DATABASE ${safeName}`);\n return;\n }\n\n const conn = new PostgresqlConnection.pg.Client({\n ...PostgresqlConnection.pool.options,\n database: 'postgres',\n });\n await conn.connect();\n const safeName = this.validateAndEscapeIdentifier(name);\n await conn.query(`CREATE DATABASE ${safeName}`);\n await conn.end();\n }\n\n async dropDatabase(name: string): Promise<void> {\n if (this.isConnected()) {\n const safeName = this.validateAndEscapeIdentifier(name);\n await this.runQuery(`DROP DATABASE ${safeName}`);\n return;\n }\n\n const conn = new PostgresqlConnection.pg.Client({\n ...PostgresqlConnection.pool.options,\n database: 'postgres', // connect to default 'postgres' database to drop others\n });\n await conn.connect();\n const safeName = this.validateAndEscapeIdentifier(name);\n await conn.query(`DROP DATABASE ${safeName}`);\n await conn.end();\n }\n\n async listDatabases(): Promise<string[]> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query(\n 'SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY datname'\n );\n return result.rows.map((row: any) => row.datname);\n }\n\n async existsDatabase(name: string): Promise<boolean> {\n if (!this.isConnected()) {\n const conn = new PostgresqlConnection.pg.Client({\n ...PostgresqlConnection.pool.options,\n database: 'postgres',\n });\n await conn.connect();\n const safeName = this.validateAndEscapeIdentifier(name);\n const result = await conn.query('SELECT 1 FROM pg_database WHERE datname = $1', [safeName]);\n await conn.end();\n return result.rows.length > 0;\n }\n\n const result = await this.connection!.query('SELECT 1 FROM pg_database WHERE datname = $1', [\n name,\n ]);\n return result.rows.length > 0;\n }\n}\n"],"mappings":"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","names":["safeName","result"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/databases/postgresql/PostgresqlQueryGrammar.mts"],"sourcesContent":["import { Query } from '../../Query.mjs';\nimport { QueryGrammar } from '../../QueryGrammar.mjs';\nimport { CompiledSql, Parameter } from '../../types.mjs';\nimport { Arr } from '@devbro/neko-helper';\nexport class PostgresqlQueryGrammar extends QueryGrammar {\n constructor() {\n super();\n }\n\n toSql(query: Query): CompiledSql {\n return super.toSql(query);\n }\n\n compileInsert(query: Query, data: Record<string, any> | Record<string, any>[]): CompiledSql {\n return super.compileInsert(query, data);\n }\n\n compileInsertGetId(\n query: Query,\n data: Record<string, any> | Record<string, any>[],\n options: { primaryKey: string[] } = { primaryKey: ['id'] }\n ): CompiledSql {\n const rc = super.compileInsert(query, data);\n rc.sql += ` RETURNING ${options.primaryKey.join(', ')}`;\n rc.parts = rc.parts.concat(['RETURNING', ...Arr.intersperse(options.primaryKey, ',')]);\n return rc;\n }\n\n compileUpdate(query: Query, data: Record<string, any>): CompiledSql {\n return super.compileUpdate(query, data);\n }\n\n compileDelete(query: Query): CompiledSql {\n return super.compileDelete(query);\n }\n\n compileUpsert(\n query: Query,\n data: Record<string, Parameter>,\n conflictFields: string[],\n updateFields: string[]\n ): CompiledSql {\n return super.compileUpsert(query, data, conflictFields, updateFields);\n }\n\n compileCount(query: Query): CompiledSql {\n return super.compileCount(query);\n }\n}\n"],"mappings":";;AACA,SAAS,oBAAoB;AAE7B,SAAS,WAAW;AACb,MAAM,+BAA+B,aAAa;AAAA,EAJzD,OAIyD;AAAA;AAAA;AAAA,EACvD,cAAc;AACZ,UAAM;AAAA,EACR;AAAA,EAEA,MAAM,OAA2B;AAC/B,WAAO,MAAM,MAAM,KAAK;AAAA,EAC1B;AAAA,EAEA,cAAc,OAAc,MAAgE;AAC1F,WAAO,MAAM,cAAc,OAAO,IAAI;AAAA,EACxC;AAAA,EAEA,mBACE,OACA,MACA,UAAoC,EAAE,YAAY,CAAC,IAAI,EAAE,GAC5C;AACb,UAAM,KAAK,MAAM,cAAc,OAAO,IAAI;AAC1C,OAAG,OAAO,cAAc,QAAQ,WAAW,KAAK,IAAI,CAAC;AACrD,OAAG,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,GAAG,IAAI,YAAY,QAAQ,YAAY,GAAG,CAAC,CAAC;AACrF,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,OAAc,MAAwC;AAClE,WAAO,MAAM,cAAc,OAAO,IAAI;AAAA,EACxC;AAAA,EAEA,cAAc,OAA2B;AACvC,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC;AAAA,EAEA,cACE,OACA,MACA,gBACA,cACa;AACb,WAAO,MAAM,cAAc,OAAO,MAAM,gBAAgB,YAAY;AAAA,EACtE;AAAA,EAEA,aAAa,OAA2B;AACtC,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/databases/postgresql/PostgresqlSchemaGrammar.mts"],"sourcesContent":["import { SchemaGrammar } from '../../SchemaGrammar.mjs';\n\nexport class PostgresqlSchemaGrammar extends SchemaGrammar {}\n"],"mappings":";;AAAA,SAAS,qBAAqB;AAEvB,MAAM,gCAAgC,cAAc;AAAA,EAF3D,OAE2D;AAAA;AAAA;AAAC;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/databases/postgresql/index.mts"],"sourcesContent":["export * from './PostgresqlConnection.mjs';\nexport * from './PostgresqlQueryGrammar.mjs';\nexport * from './PostgresqlSchemaGrammar.mjs';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -35,6 +35,7 @@ declare class SqliteConnection extends Connection {
|
|
|
35
35
|
/** Default configuration values for SQLite connections */
|
|
36
36
|
static defaults: Partial<SqliteConfig>;
|
|
37
37
|
constructor(params: SqliteConfig);
|
|
38
|
+
static sqlite: typeof Database;
|
|
38
39
|
/**
|
|
39
40
|
* Establishes a connection to the SQLite database
|
|
40
41
|
* Creates or opens the database file specified in the configuration
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
import { Connection as ConnectionAbs } from "../../Connection.mjs";
|
|
4
|
-
import Database from "better-sqlite3";
|
|
5
4
|
import { Query } from "../../Query.mjs";
|
|
6
5
|
import { SqliteQueryGrammar } from "./SqliteQueryGrammar.mjs";
|
|
7
6
|
import { Schema } from "../../Schema.mjs";
|
|
8
7
|
import { SqliteSchemaGrammar } from "./SqliteSchemaGrammar.mjs";
|
|
9
8
|
import { EventManager } from "@devbro/neko-helper";
|
|
10
9
|
import * as fs from "fs";
|
|
10
|
+
import { loadPackage } from "../../helper.mjs";
|
|
11
11
|
class SqliteConnection extends ConnectionAbs {
|
|
12
12
|
static {
|
|
13
13
|
__name(this, "SqliteConnection");
|
|
@@ -34,8 +34,12 @@ class SqliteConnection extends ConnectionAbs {
|
|
|
34
34
|
};
|
|
35
35
|
constructor(params) {
|
|
36
36
|
super();
|
|
37
|
+
if (!SqliteConnection.sqlite) {
|
|
38
|
+
SqliteConnection.sqlite = loadPackage("better-sqlite3");
|
|
39
|
+
}
|
|
37
40
|
this.config = { ...SqliteConnection.defaults, ...params };
|
|
38
41
|
}
|
|
42
|
+
static sqlite;
|
|
39
43
|
/**
|
|
40
44
|
* Establishes a connection to the SQLite database
|
|
41
45
|
* Creates or opens the database file specified in the configuration
|
|
@@ -43,7 +47,7 @@ class SqliteConnection extends ConnectionAbs {
|
|
|
43
47
|
async connect() {
|
|
44
48
|
this.eventManager.emit("connect").catch(() => {
|
|
45
49
|
});
|
|
46
|
-
this.connection = new
|
|
50
|
+
this.connection = new SqliteConnection.sqlite(this.config.filename, {
|
|
47
51
|
readonly: this.config.readonly,
|
|
48
52
|
fileMustExist: this.config.fileMustExist,
|
|
49
53
|
timeout: this.config.timeout,
|
|
@@ -202,7 +206,7 @@ class SqliteConnection extends ConnectionAbs {
|
|
|
202
206
|
*/
|
|
203
207
|
async createDatabase(name) {
|
|
204
208
|
const dbPath = name.endsWith(".db") ? name : `${name}.db`;
|
|
205
|
-
const tempDb = new
|
|
209
|
+
const tempDb = new SqliteConnection.sqlite(dbPath);
|
|
206
210
|
tempDb.close();
|
|
207
211
|
}
|
|
208
212
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/databases/sqlite/SqliteConnection.mts"],"sourcesContent":["import { connection_events, Connection as ConnectionAbs } from '../../Connection.mjs';\nimport type Database from 'better-sqlite3';\nimport { CompiledSql } from '../../types.mjs';\nimport { Query } from '../../Query.mjs';\nimport { SqliteQueryGrammar } from './SqliteQueryGrammar.mjs';\nimport { Schema } from '../../Schema.mjs';\nimport { SqliteSchemaGrammar } from './SqliteSchemaGrammar.mjs';\nimport { EventManager } from '@devbro/neko-helper';\nimport * as fs from 'fs';\nimport { loadPackage } from '../../helper.mjs';\n\n/**\n * Configuration options for SQLite database connection\n */\nexport interface SqliteConfig {\n /** Path to the SQLite database file */\n filename: string;\n /** Open the database in read-only mode (default: false) */\n readonly?: boolean;\n /** Throw an error if the database file doesn't exist (default: false) */\n fileMustExist?: boolean;\n /** Timeout in milliseconds for database operations (default: 5000) */\n timeout?: number;\n /** Optional verbose logging function for debugging SQL statements */\n verbose?: (message?: unknown, ...additionalArgs: unknown[]) => void;\n}\n\n/**\n * SQLite database connection implementation\n *\n * Provides a connection to SQLite databases using better-sqlite3.\n * Supports transactions, queries, schema operations, and database management.\n */\nexport class SqliteConnection 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: Database.Database | undefined;\n private config: SqliteConfig;\n\n /** Default configuration values for SQLite connections */\n static defaults: Partial<SqliteConfig> = {\n readonly: false,\n fileMustExist: false,\n timeout: 5000,\n };\n\n constructor(params: SqliteConfig) {\n super();\n if (!SqliteConnection.sqlite) {\n SqliteConnection.sqlite = loadPackage('better-sqlite3');\n }\n this.config = { ...SqliteConnection.defaults, ...params } as SqliteConfig;\n }\n\n static sqlite: typeof Database;\n\n /**\n * Establishes a connection to the SQLite database\n * Creates or opens the database file specified in the configuration\n */\n async connect(): Promise<boolean> {\n this.eventManager.emit('connect').catch(() => {});\n this.connection = new SqliteConnection.sqlite(this.config.filename, {\n readonly: this.config.readonly,\n fileMustExist: this.config.fileMustExist,\n timeout: this.config.timeout,\n verbose: this.config.verbose,\n });\n return true;\n }\n\n /**\n * Executes a SQL query against the database\n * Automatically detects SELECT queries and queries with RETURNING clauses\n *\n * @param sql - Compiled SQL or raw SQL string to execute\n * @returns Query results (rows for SELECT, run info for INSERT/UPDATE/DELETE)\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 try {\n const stmt = this.connection!.prepare(sql.sql);\n\n // Check if the query is a SELECT or contains RETURNING clause\n const sqlUpper = sql.sql.trim().toUpperCase();\n if (sqlUpper.startsWith('SELECT') || sqlUpper.includes('RETURNING')) {\n return stmt.all(...sql.bindings);\n } else {\n const result = stmt.run(...sql.bindings);\n return result;\n }\n } catch (error) {\n this.eventManager.emit('error', error).catch(() => {});\n throw error;\n }\n }\n\n /**\n * Executes a query and returns an iterator for streaming results\n * Useful for large result sets to avoid loading all rows into memory\n *\n * @param sql - Compiled SQL to execute\n * @returns Iterator over query results\n */\n async runCursor(sql: CompiledSql): Promise<any> {\n // SQLite doesn't have native cursor support, return iterator\n if (!this.isConnected()) {\n await this.connect();\n }\n const stmt = this.connection!.prepare(sql.sql);\n return stmt.iterate(...sql.bindings);\n }\n\n /**\n * Closes the database connection\n */\n async disconnect(): Promise<boolean> {\n if (this.connection === undefined) {\n return true;\n }\n this.connection.close();\n this.connection = undefined;\n this.eventManager.emit('disconnect').catch(() => {});\n return true;\n }\n\n /**\n * Creates a new query builder instance for this connection\n */\n getQuery(): Query {\n return new Query(this, new SqliteQueryGrammar());\n }\n\n /**\n * Creates a new schema builder instance for this connection\n */\n getSchema(): Schema {\n return new Schema(this, new SqliteSchemaGrammar());\n }\n\n /**\n * Gets the query grammar for building SQL statements\n */\n getQueryGrammar(): SqliteQueryGrammar {\n return new SqliteQueryGrammar();\n }\n\n /**\n * Gets the schema grammar for building DDL statements\n */\n getSchemaGrammar(): SqliteSchemaGrammar {\n return new SqliteSchemaGrammar();\n }\n\n /**\n * Starts a new database transaction\n */\n async beginTransaction(): Promise<void> {\n await this.runQuery({\n sql: 'BEGIN TRANSACTION',\n bindings: [],\n parts: ['BEGIN', 'TRANSACTION'],\n });\n }\n\n /**\n * Commits the current transaction\n */\n async commit(): Promise<void> {\n await this.runQuery({ sql: 'COMMIT', bindings: [], parts: ['COMMIT'] });\n }\n\n /**\n * Rolls back the current transaction\n */\n async rollback(): Promise<void> {\n await this.runQuery({ sql: 'ROLLBACK', bindings: [], parts: ['ROLLBACK'] });\n }\n\n /**\n * Checks if the database connection is active\n */\n isConnected(): boolean {\n return this.connection !== undefined && this.connection.open;\n }\n\n /**\n * Validates and escapes a SQLite identifier (database name, table name, etc.)\n * Uses a whitelist approach to ensure only safe characters are allowed\n *\n * @param name - The identifier to validate and escape\n * @returns The escaped identifier, quoted if it's a reserved keyword\n * @throws Error if the identifier contains invalid characters\n */\n private validateAndEscapeIdentifier(name: string): string {\n // SQLite identifiers can contain: letters, digits, underscores\n // They must start with a letter or underscore\n const validIdentifierPattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\n if (!validIdentifierPattern.test(name)) {\n throw new Error(\n `Invalid identifier: \"${name}\". Identifiers must start with a letter or underscore and contain only letters, digits, and underscores.`\n );\n }\n\n // SQLite reserved keywords that should be quoted\n const reservedKeywords = new Set([\n 'table',\n 'database',\n 'order',\n 'group',\n 'select',\n 'insert',\n 'update',\n 'delete',\n 'index',\n 'from',\n 'where',\n ]);\n\n // Quote the identifier if it's a reserved keyword\n if (reservedKeywords.has(name.toLowerCase())) {\n // Escape any double quotes in the name\n const escapedName = name.replace(/\"/g, '\"\"');\n return `\"${escapedName}\"`;\n }\n\n return name;\n }\n\n /**\n * Creates a new SQLite database file\n *\n * @param name - Name or path of the database file to create\n */\n async createDatabase(name: string): Promise<void> {\n // SQLite databases are files, creating a database means creating a new connection\n const dbPath = name.endsWith('.db') ? name : `${name}.db`;\n const tempDb = new SqliteConnection.sqlite(dbPath);\n tempDb.close();\n }\n\n /**\n * Deletes a SQLite database file\n *\n * @param name - Name or path of the database file to delete\n */\n async dropDatabase(name: string): Promise<void> {\n // SQLite databases are files, dropping means deleting the file\n const dbPath = name.endsWith('.db') ? name : `${name}.db`;\n if (fs.existsSync(dbPath)) {\n fs.unlinkSync(dbPath);\n }\n }\n\n /**\n * Lists available databases\n * For SQLite, this returns the current database filename\n *\n * @returns Array containing the current database filename\n */\n async listDatabases(): Promise<string[]> {\n // SQLite doesn't have a concept of multiple databases in the same connection\n // This would require listing files in a directory\n return [this.config.filename];\n }\n\n /**\n * Checks if a database file exists\n *\n * @param name - Name or path of the database file to check\n * @returns True if the database file exists, false otherwise\n */\n async existsDatabase(name: string): Promise<boolean> {\n const dbPath = name.endsWith('.db') ? name : `${name}.db`;\n return fs.existsSync(dbPath);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/databases/sqlite/SqliteQueryGrammar.mts"],"sourcesContent":["import { Query } from '../../Query.mjs';\nimport { QueryGrammar } from '../../QueryGrammar.mjs';\nimport { CompiledSql, Parameter } from '../../types.mjs';\nimport { Arr } from '@devbro/neko-helper';\n\nexport class SqliteQueryGrammar extends QueryGrammar {\n constructor() {\n super();\n }\n\n toSql(query: Query): CompiledSql {\n return super.toSql(query);\n }\n\n compileInsert(query: Query, data: Record<string, any> | Record<string, any>[]): CompiledSql {\n return super.compileInsert(query, data);\n }\n\n compileInsertGetId(\n query: Query,\n data: Record<string, any> | Record<string, any>[],\n options: { primaryKey: string[] } = { primaryKey: ['id'] }\n ): CompiledSql {\n const rc = super.compileInsert(query, data);\n rc.sql += ` RETURNING ${options.primaryKey.join(', ')}`;\n rc.parts = rc.parts.concat(['RETURNING', ...Arr.intersperse(options.primaryKey, ',')]);\n return rc;\n }\n\n compileUpdate(query: Query, data: Record<string, any>): CompiledSql {\n return super.compileUpdate(query, data);\n }\n\n compileDelete(query: Query): CompiledSql {\n return super.compileDelete(query);\n }\n\n compileUpsert(\n query: Query,\n data: Record<string, Parameter>,\n conflictFields: string[],\n updateFields: string[]\n ): CompiledSql {\n return super.compileUpsert(query, data, conflictFields, updateFields);\n }\n\n compileCount(query: Query): CompiledSql {\n return super.compileCount(query);\n }\n}\n"],"mappings":";;AACA,SAAS,oBAAoB;AAE7B,SAAS,WAAW;AAEb,MAAM,2BAA2B,aAAa;AAAA,EALrD,OAKqD;AAAA;AAAA;AAAA,EACnD,cAAc;AACZ,UAAM;AAAA,EACR;AAAA,EAEA,MAAM,OAA2B;AAC/B,WAAO,MAAM,MAAM,KAAK;AAAA,EAC1B;AAAA,EAEA,cAAc,OAAc,MAAgE;AAC1F,WAAO,MAAM,cAAc,OAAO,IAAI;AAAA,EACxC;AAAA,EAEA,mBACE,OACA,MACA,UAAoC,EAAE,YAAY,CAAC,IAAI,EAAE,GAC5C;AACb,UAAM,KAAK,MAAM,cAAc,OAAO,IAAI;AAC1C,OAAG,OAAO,cAAc,QAAQ,WAAW,KAAK,IAAI,CAAC;AACrD,OAAG,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,GAAG,IAAI,YAAY,QAAQ,YAAY,GAAG,CAAC,CAAC;AACrF,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,OAAc,MAAwC;AAClE,WAAO,MAAM,cAAc,OAAO,IAAI;AAAA,EACxC;AAAA,EAEA,cAAc,OAA2B;AACvC,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC;AAAA,EAEA,cACE,OACA,MACA,gBACA,cACa;AACb,WAAO,MAAM,cAAc,OAAO,MAAM,gBAAgB,YAAY;AAAA,EACtE;AAAA,EAEA,aAAa,OAA2B;AACtC,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/databases/sqlite/SqliteSchemaGrammar.mts"],"sourcesContent":["import { Column } from '../../Blueprint.mjs';\nimport { SchemaGrammar } from '../../SchemaGrammar.mjs';\n\nexport class SqliteSchemaGrammar extends SchemaGrammar {\n\n compileColumn(column: Column): string {\n const rc = [`${column.columnName}`];\n \n if (column.properties.type === 'string') {\n rc.push('varchar(' + column.properties.length + ')');\n } else if (column.properties.type === 'char') {\n rc.push('char');\n } else if (column.properties.type === 'boolean') {\n rc.push('boolean');\n } else if (column.properties.type === 'integer') {\n rc.push('integer');\n } else if (column.properties.type === 'text') {\n rc.push('text');\n } else if (column.properties.type === 'timestamp') {\n rc.push('timestamp');\n } else if (column.properties.type === 'timestampz') {\n rc.push('timestamp with time zone');\n } else if (column.properties.type === 'serial') {\n rc.push('INTEGER');\n } else if (column.properties.type === 'float') {\n rc.push('float');\n } else if (column.properties.type === 'double') {\n rc.push('double precision');\n } else if (column.properties.type === 'date') {\n rc.push('date');\n } else if (column.properties.type === 'json') {\n rc.push('json');\n } else if (column.properties.type === 'jsonb') {\n rc.push('jsonb');\n } else if (column.properties.type === 'raw') {\n return column.columnName;\n } else {\n throw new Error('Unknown column type: ' + column.properties.type);\n }\n\n if (column.properties.nullable) {\n rc.push('null');\n } else {\n rc.push('not null');\n }\n \n if (column.properties.unique) {\n rc.push('unique');\n }\n \n if (column.properties.default !== null) {\n rc.push('default ' + this.escape(column.properties.default));\n }\n \n return rc.join(' ');\n }\n}\n"],"mappings":";;AACA,SAAS,qBAAqB;AAEvB,MAAM,4BAA4B,cAAc;AAAA,EAHvD,OAGuD;AAAA;AAAA;AAAA,EAEnD,cAAc,QAAwB;AAClC,UAAM,KAAK,CAAC,GAAG,OAAO,UAAU,EAAE;AAElC,QAAI,OAAO,WAAW,SAAS,UAAU;AACvC,SAAG,KAAK,aAAa,OAAO,WAAW,SAAS,GAAG;AAAA,IACrD,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,WAAW;AAC/C,SAAG,KAAK,SAAS;AAAA,IACnB,WAAW,OAAO,WAAW,SAAS,WAAW;AAC/C,SAAG,KAAK,SAAS;AAAA,IACnB,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,aAAa;AACjD,SAAG,KAAK,WAAW;AAAA,IACrB,WAAW,OAAO,WAAW,SAAS,cAAc;AAClD,SAAG,KAAK,0BAA0B;AAAA,IACpC,WAAW,OAAO,WAAW,SAAS,UAAU;AAC9C,SAAG,KAAK,SAAS;AAAA,IACnB,WAAW,OAAO,WAAW,SAAS,SAAS;AAC7C,SAAG,KAAK,OAAO;AAAA,IACjB,WAAW,OAAO,WAAW,SAAS,UAAU;AAC9C,SAAG,KAAK,kBAAkB;AAAA,IAC5B,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,QAAQ;AAC5C,SAAG,KAAK,MAAM;AAAA,IAChB,WAAW,OAAO,WAAW,SAAS,SAAS;AAC7C,SAAG,KAAK,OAAO;AAAA,IACjB,WAAW,OAAO,WAAW,SAAS,OAAO;AAC3C,aAAO,OAAO;AAAA,IAChB,OAAO;AACL,YAAM,IAAI,MAAM,0BAA0B,OAAO,WAAW,IAAI;AAAA,IAClE;AAEA,QAAI,OAAO,WAAW,UAAU;AAC9B,SAAG,KAAK,MAAM;AAAA,IAChB,OAAO;AACL,SAAG,KAAK,UAAU;AAAA,IACpB;AAEA,QAAI,OAAO,WAAW,QAAQ;AAC5B,SAAG,KAAK,QAAQ;AAAA,IAClB;AAEA,QAAI,OAAO,WAAW,YAAY,MAAM;AACtC,SAAG,KAAK,aAAa,KAAK,OAAO,OAAO,WAAW,OAAO,CAAC;AAAA,IAC7D;AAEA,WAAO,GAAG,KAAK,GAAG;AAAA,EACpB;AACN;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/databases/sqlite/index.mts"],"sourcesContent":["export * from './SqliteConnection.mjs';\nexport * from './SqliteQueryGrammar.mjs';\nexport * from './SqliteSchemaGrammar.mjs';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import { createRequire } from "module";
|
|
4
|
+
const req = createRequire(import.meta.url);
|
|
5
|
+
function loadPackage(name) {
|
|
6
|
+
try {
|
|
7
|
+
return req(name);
|
|
8
|
+
} catch (error) {
|
|
9
|
+
if (Error.isError(error) && error.code === "MODULE_NOT_FOUND") {
|
|
10
|
+
error.message = `Package "${name}" is not installed. Please install proper db driver to use this database connection.`;
|
|
11
|
+
}
|
|
12
|
+
throw error;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
__name(loadPackage, "loadPackage");
|
|
16
|
+
export {
|
|
17
|
+
loadPackage
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=helper.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/helper.mts"],"sourcesContent":["import { createRequire } from 'module';\n\n// When bundled to CJS, tsup will handle import.meta.url appropriately\nconst req = createRequire(import.meta.url);\n\nexport function loadPackage(name: string) {\n try {\n return req(name);\n } catch (error: any) {\n // @ts-ignore\n if (Error.isError(error) && error.code === 'MODULE_NOT_FOUND') {\n error.message = `Package \"${name}\" is not installed. Please install proper db driver to use this database connection.`;\n }\n\n throw error;\n }\n}\n"],"mappings":";;AAAA,SAAS,qBAAqB;AAG9B,MAAM,MAAM,cAAc,YAAY,GAAG;AAElC,SAAS,YAAY,MAAc;AACxC,MAAI;AACF,WAAO,IAAI,IAAI;AAAA,EACjB,SAAS,OAAY;AAEnB,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,oBAAoB;AAC7D,YAAM,UAAU,YAAY,IAAI;AAAA,IAClC;AAEA,UAAM;AAAA,EACR;AACF;AAXgB;","names":[]}
|
|
@@ -10,6 +10,7 @@ export { MysqlSchemaGrammar } from './databases/mysql/MysqlSchemaGrammar.mjs';
|
|
|
10
10
|
export { B as Blueprint, a as Column, C as ColumnPropertiesType, m as CompiledSql, b as Connection, F as ForeignKeyConstraint, I as IndexConstraint, J as JoinCondition, P as Parameter, d as Query, e as QueryGrammar, Q as QueryParts, S as Schema, f as SchemaGrammar, c as connection_events, n as havingType, o as joinType, s as selectType, w as whereBasic, i as whereNested, k as whereNull, g as whereOp, h as whereOpColumn, j as whereRaw, l as whereType } from './Blueprint-DjP_Sfrr.mjs';
|
|
11
11
|
export { Migration } from './Migration.mjs';
|
|
12
12
|
import 'pg';
|
|
13
|
+
import 'pg-cursor';
|
|
13
14
|
import 'better-sqlite3';
|
|
14
15
|
import 'mysql2/promise';
|
|
15
16
|
import '@devbro/neko-helper';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export * from './databases/index.mjs';\nexport * from './Blueprint.mjs';\nexport * from './Connection.mjs';\nexport * from './Query.mjs';\nexport * from './QueryGrammar.mjs';\nexport * from './Schema.mjs';\nexport * from './SchemaGrammar.mjs';\nexport * from './types.mjs';\nexport * from './Migration.mjs';\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devbro/neko-sql",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.39",
|
|
4
4
|
"description": "generic sql generator",
|
|
5
|
-
"main": "./dist/index.
|
|
6
|
-
"module": "./dist/index.
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
5
|
+
"main": "./dist/cjs/index.js",
|
|
6
|
+
"module": "./dist/esm/index.mjs",
|
|
7
|
+
"types": "./dist/cjs/index.d.ts",
|
|
8
8
|
"files": [
|
|
9
9
|
"dist"
|
|
10
10
|
],
|
|
11
11
|
"exports": {
|
|
12
12
|
".": {
|
|
13
|
-
"types": "./dist/index.d.
|
|
14
|
-
"import": "./dist/index.
|
|
15
|
-
"require": "./dist/index.
|
|
13
|
+
"types": "./dist/esm/index.d.ts",
|
|
14
|
+
"import": "./dist/esm/index.mjs",
|
|
15
|
+
"require": "./dist/cjs/index.js"
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|