@devbro/neko-sql 0.1.32 → 0.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +23 -3
  2. package/dist/{Blueprint-D3WHeqRS.d.mts → Blueprint-g4SmS1bH.d.mts} +6 -0
  3. package/dist/Blueprint.d.mts +1 -1
  4. package/dist/Connection.d.mts +1 -1
  5. package/dist/Expression.d.mts +1 -1
  6. package/dist/Migration.d.mts +1 -1
  7. package/dist/Query.d.mts +1 -1
  8. package/dist/Query.mjs +3 -1
  9. package/dist/Query.mjs.map +1 -1
  10. package/dist/QueryGrammar.d.mts +1 -1
  11. package/dist/QueryGrammar.mjs +8 -0
  12. package/dist/QueryGrammar.mjs.map +1 -1
  13. package/dist/Schema.d.mts +1 -1
  14. package/dist/SchemaGrammar.d.mts +1 -1
  15. package/dist/databases/index.d.mts +5 -1
  16. package/dist/databases/index.mjs +1 -0
  17. package/dist/databases/index.mjs.map +1 -1
  18. package/dist/databases/mysql/MysqlConnection.d.mts +41 -0
  19. package/dist/databases/mysql/MysqlConnection.mjs +208 -0
  20. package/dist/databases/mysql/MysqlConnection.mjs.map +1 -0
  21. package/dist/databases/mysql/MysqlQueryGrammar.d.mts +13 -0
  22. package/dist/databases/mysql/MysqlQueryGrammar.mjs +18 -0
  23. package/dist/databases/mysql/MysqlQueryGrammar.mjs.map +1 -0
  24. package/dist/databases/mysql/MysqlSchemaGrammar.d.mts +8 -0
  25. package/dist/databases/mysql/MysqlSchemaGrammar.mjs +58 -0
  26. package/dist/databases/mysql/MysqlSchemaGrammar.mjs.map +1 -0
  27. package/dist/databases/mysql/index.d.mts +6 -0
  28. package/dist/databases/mysql/index.mjs +4 -0
  29. package/dist/databases/mysql/index.mjs.map +1 -0
  30. package/dist/databases/postgresql/PostgresqlConnection.d.mts +1 -1
  31. package/dist/databases/postgresql/PostgresqlConnection.mjs +17 -3
  32. package/dist/databases/postgresql/PostgresqlConnection.mjs.map +1 -1
  33. package/dist/databases/postgresql/PostgresqlQueryGrammar.d.mts +1 -1
  34. package/dist/databases/postgresql/PostgresqlSchemaGrammar.d.mts +1 -1
  35. package/dist/databases/postgresql/index.d.mts +1 -1
  36. package/dist/databases/sqlite/SqliteConnection.d.mts +1 -1
  37. package/dist/databases/sqlite/SqliteQueryGrammar.d.mts +1 -1
  38. package/dist/databases/sqlite/SqliteSchemaGrammar.d.mts +2 -1
  39. package/dist/databases/sqlite/SqliteSchemaGrammar.mjs +46 -0
  40. package/dist/databases/sqlite/SqliteSchemaGrammar.mjs.map +1 -1
  41. package/dist/databases/sqlite/index.d.mts +1 -1
  42. package/dist/index.d.mts +5 -1
  43. package/dist/index.js +347 -4
  44. package/dist/index.js.map +1 -1
  45. package/dist/types.d.mts +1 -1
  46. package/package.json +2 -1
@@ -0,0 +1,58 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { SchemaGrammar } from "../../SchemaGrammar.mjs";
4
+ class MysqlSchemaGrammar extends SchemaGrammar {
5
+ static {
6
+ __name(this, "MysqlSchemaGrammar");
7
+ }
8
+ compileColumn(column) {
9
+ const rc = [`${column.columnName}`];
10
+ if (column.properties.type === "string") {
11
+ rc.push("varchar(" + column.properties.length + ")");
12
+ } else if (column.properties.type === "char") {
13
+ rc.push("char");
14
+ } else if (column.properties.type === "boolean") {
15
+ rc.push("boolean");
16
+ } else if (column.properties.type === "integer") {
17
+ rc.push("integer");
18
+ } else if (column.properties.type === "text") {
19
+ rc.push("text");
20
+ } else if (column.properties.type === "timestamp") {
21
+ rc.push("TIMESTAMP");
22
+ } else if (column.properties.type === "timestampz") {
23
+ rc.push("TIMESTAMP");
24
+ } else if (column.properties.type === "serial") {
25
+ rc.push("INT AUTO_INCREMENT");
26
+ } else if (column.properties.type === "float") {
27
+ rc.push("float");
28
+ } else if (column.properties.type === "double") {
29
+ rc.push("double precision");
30
+ } else if (column.properties.type === "date") {
31
+ rc.push("date");
32
+ } else if (column.properties.type === "json") {
33
+ rc.push("json");
34
+ } else if (column.properties.type === "jsonb") {
35
+ rc.push("jsonb");
36
+ } else if (column.properties.type === "raw") {
37
+ return column.columnName;
38
+ } else {
39
+ throw new Error("Unknown column type: " + column.properties.type);
40
+ }
41
+ if (column.properties.nullable) {
42
+ rc.push("null");
43
+ } else {
44
+ rc.push("NOT NULL");
45
+ }
46
+ if (column.properties.unique) {
47
+ rc.push("unique");
48
+ }
49
+ if (column.properties.default !== null) {
50
+ rc.push("default " + this.escape(column.properties.default));
51
+ }
52
+ return rc.join(" ");
53
+ }
54
+ }
55
+ export {
56
+ MysqlSchemaGrammar
57
+ };
58
+ //# sourceMappingURL=MysqlSchemaGrammar.mjs.map
@@ -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,6 @@
1
+ export { MysqlConnection } from './MysqlConnection.mjs';
2
+ export { MysqlQueryGrammar } from './MysqlQueryGrammar.mjs';
3
+ export { MysqlSchemaGrammar } from './MysqlSchemaGrammar.mjs';
4
+ import '../../Blueprint-g4SmS1bH.mjs';
5
+ import '@devbro/neko-helper';
6
+ import 'mysql2/promise';
@@ -0,0 +1,4 @@
1
+ export * from "./MysqlConnection.mjs";
2
+ export * from "./MysqlQueryGrammar.mjs";
3
+ export * from "./MysqlSchemaGrammar.mjs";
4
+ //# sourceMappingURL=index.mjs.map
@@ -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,4 +1,4 @@
1
- import { b as Connection, c as connection_events, m as CompiledSql, d as Query, S as Schema } from '../../Blueprint-D3WHeqRS.mjs';
1
+ import { b as Connection, c as connection_events, m as CompiledSql, d as Query, S as Schema } from '../../Blueprint-g4SmS1bH.mjs';
2
2
  import { PoolClient, Pool, PoolConfig } from 'pg';
3
3
  import { PostgresqlQueryGrammar } from './PostgresqlQueryGrammar.mjs';
4
4
  import { PostgresqlSchemaGrammar } from './PostgresqlSchemaGrammar.mjs';
@@ -136,7 +136,9 @@ class PostgresqlConnection extends ConnectionAbs {
136
136
  }
137
137
  async createDatabase(name) {
138
138
  if (this.isConnected()) {
139
- throw new Error("Cannot create database while connected.");
139
+ const safeName2 = this.validateAndEscapeIdentifier(name);
140
+ await this.runQuery(`CREATE DATABASE ${safeName2}`);
141
+ return;
140
142
  }
141
143
  const conn = new Client({
142
144
  ...PostgresqlConnection.pool.options,
@@ -149,7 +151,9 @@ class PostgresqlConnection extends ConnectionAbs {
149
151
  }
150
152
  async dropDatabase(name) {
151
153
  if (this.isConnected()) {
152
- throw new Error("Cannot drop database while connected.");
154
+ const safeName2 = this.validateAndEscapeIdentifier(name);
155
+ await this.runQuery(`DROP DATABASE ${safeName2}`);
156
+ return;
153
157
  }
154
158
  const conn = new Client({
155
159
  ...PostgresqlConnection.pool.options,
@@ -172,7 +176,17 @@ class PostgresqlConnection extends ConnectionAbs {
172
176
  }
173
177
  async existsDatabase(name) {
174
178
  if (!this.isConnected()) {
175
- await this.connect();
179
+ const conn = new Client({
180
+ ...PostgresqlConnection.pool.options,
181
+ database: "postgres"
182
+ });
183
+ await conn.connect();
184
+ const safeName = this.validateAndEscapeIdentifier(name);
185
+ const result2 = await conn.query("SELECT 1 FROM pg_database WHERE datname = $1", [
186
+ safeName
187
+ ]);
188
+ await conn.end();
189
+ return result2.rows.length > 0;
176
190
  }
177
191
  const result = await this.connection.query("SELECT 1 FROM pg_database WHERE datname = $1", [
178
192
  name
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/databases/postgresql/PostgresqlConnection.mts"],"sourcesContent":["import { connection_events, Connection as ConnectionAbs } from '../../Connection.mjs';\nimport { Client, PoolClient, PoolConfig } from 'pg';\nimport { Pool } from 'pg';\nimport { CompiledSql } from '../../types.mjs';\nimport { Query } from '../../Query.mjs';\nimport { PostgresqlQueryGrammar } from './PostgresqlQueryGrammar.mjs';\nimport { Schema } from '../../Schema.mjs';\nimport { PostgresqlSchemaGrammar } from './PostgresqlSchemaGrammar.mjs';\nimport Cursor from 'pg-cursor';\nimport { EventManager } from '@devbro/neko-helper';\n\nexport class PostgresqlConnection extends ConnectionAbs {\n private eventManager = new EventManager();\n\n on(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.on(event, listener);\n return this;\n }\n off(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.off(event, listener);\n return this;\n }\n emit(event: connection_events, ...args: any[]): Promise<boolean> {\n return this.eventManager.emit(event, ...args);\n }\n\n connection: PoolClient | undefined;\n static pool: Pool;\n\n static defaults: PoolConfig = {\n port: 5432,\n ssl: false,\n max: 20,\n idleTimeoutMillis: 1, // wait X milli seconds before closing an idle/released connection\n connectionTimeoutMillis: 30000, // wait up to 30 seconds to obtain a new connection\n maxUses: 7500,\n };\n\n constructor(params: PoolConfig) {\n super();\n if (!PostgresqlConnection.pool) {\n PostgresqlConnection.pool = new Pool({ ...PostgresqlConnection.defaults, ...params });\n }\n }\n async connect(): Promise<boolean> {\n this.eventManager.emit('connect').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 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 throw new Error('Cannot create database while connected.');\n }\n\n const conn = new Client({\n ...PostgresqlConnection.pool.options,\n database: 'postgres',\n });\n await conn.connect();\n const safeName = this.validateAndEscapeIdentifier(name);\n await conn.query(`CREATE DATABASE ${safeName}`);\n await conn.end();\n }\n\n async dropDatabase(name: string): Promise<void> {\n if (this.isConnected()) {\n throw new Error('Cannot drop database while connected.');\n }\n\n const conn = new Client({\n ...PostgresqlConnection.pool.options,\n database: 'postgres', // connect to default 'postgres' database to drop others\n });\n await conn.connect();\n const safeName = this.validateAndEscapeIdentifier(name);\n await conn.query(`DROP DATABASE ${safeName}`);\n await conn.end();\n }\n\n async listDatabases(): Promise<string[]> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query(\n 'SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY datname'\n );\n return result.rows.map((row: any) => row.datname);\n }\n\n async existsDatabase(name: string): Promise<boolean> {\n if (!this.isConnected()) {\n await this.connect();\n }\n const result = await this.connection!.query('SELECT 1 FROM pg_database WHERE datname = $1', [\n name,\n ]);\n return result.rows.length > 0;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/databases/postgresql/PostgresqlConnection.mts"],"sourcesContent":["import { connection_events, Connection as ConnectionAbs } from '../../Connection.mjs';\nimport { Client, PoolClient, PoolConfig } from 'pg';\nimport { Pool } from 'pg';\nimport { CompiledSql } from '../../types.mjs';\nimport { Query } from '../../Query.mjs';\nimport { PostgresqlQueryGrammar } from './PostgresqlQueryGrammar.mjs';\nimport { Schema } from '../../Schema.mjs';\nimport { PostgresqlSchemaGrammar } from './PostgresqlSchemaGrammar.mjs';\nimport Cursor from 'pg-cursor';\nimport { EventManager } from '@devbro/neko-helper';\n\nexport class PostgresqlConnection extends ConnectionAbs {\n private eventManager = new EventManager();\n\n on(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.on(event, listener);\n return this;\n }\n off(event: connection_events, listener: (...args: any[]) => void): this {\n this.eventManager.off(event, listener);\n return this;\n }\n emit(event: connection_events, ...args: any[]): Promise<boolean> {\n return this.eventManager.emit(event, ...args);\n }\n\n connection: PoolClient | undefined;\n static pool: Pool;\n\n static defaults: PoolConfig = {\n port: 5432,\n ssl: false,\n max: 20,\n idleTimeoutMillis: 1, // wait X milli seconds before closing an idle/released connection\n connectionTimeoutMillis: 30000, // wait up to 30 seconds to obtain a new connection\n maxUses: 7500,\n };\n\n constructor(params: PoolConfig) {\n super();\n if (!PostgresqlConnection.pool) {\n PostgresqlConnection.pool = new Pool({ ...PostgresqlConnection.defaults, ...params });\n }\n }\n async connect(): Promise<boolean> {\n this.eventManager.emit('connect').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 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 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 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 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', [\n safeName,\n ]);\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"]}
@@ -1,4 +1,4 @@
1
- import { e as QueryGrammar, d as Query, m as CompiledSql, P as Parameter } from '../../Blueprint-D3WHeqRS.mjs';
1
+ import { e as QueryGrammar, d as Query, m as CompiledSql, P as Parameter } from '../../Blueprint-g4SmS1bH.mjs';
2
2
  import '@devbro/neko-helper';
3
3
 
4
4
  declare class PostgresqlQueryGrammar extends QueryGrammar {
@@ -1,4 +1,4 @@
1
- import { f as SchemaGrammar } from '../../Blueprint-D3WHeqRS.mjs';
1
+ import { f as SchemaGrammar } from '../../Blueprint-g4SmS1bH.mjs';
2
2
  import '@devbro/neko-helper';
3
3
 
4
4
  declare class PostgresqlSchemaGrammar extends SchemaGrammar {
@@ -1,6 +1,6 @@
1
1
  export { PostgresqlConnection } from './PostgresqlConnection.mjs';
2
2
  export { PostgresqlQueryGrammar } from './PostgresqlQueryGrammar.mjs';
3
3
  export { PostgresqlSchemaGrammar } from './PostgresqlSchemaGrammar.mjs';
4
- import '../../Blueprint-D3WHeqRS.mjs';
4
+ import '../../Blueprint-g4SmS1bH.mjs';
5
5
  import '@devbro/neko-helper';
6
6
  import 'pg';
@@ -1,4 +1,4 @@
1
- import { b as Connection, c as connection_events, m as CompiledSql, d as Query, S as Schema } from '../../Blueprint-D3WHeqRS.mjs';
1
+ import { b as Connection, c as connection_events, m as CompiledSql, d as Query, S as Schema } from '../../Blueprint-g4SmS1bH.mjs';
2
2
  import Database from 'better-sqlite3';
3
3
  import { SqliteQueryGrammar } from './SqliteQueryGrammar.mjs';
4
4
  import { SqliteSchemaGrammar } from './SqliteSchemaGrammar.mjs';
@@ -1,4 +1,4 @@
1
- import { e as QueryGrammar, d as Query, m as CompiledSql, P as Parameter } from '../../Blueprint-D3WHeqRS.mjs';
1
+ import { e as QueryGrammar, d as Query, m as CompiledSql, P as Parameter } from '../../Blueprint-g4SmS1bH.mjs';
2
2
  import '@devbro/neko-helper';
3
3
 
4
4
  declare class SqliteQueryGrammar extends QueryGrammar {
@@ -1,7 +1,8 @@
1
- import { f as SchemaGrammar } from '../../Blueprint-D3WHeqRS.mjs';
1
+ import { f as SchemaGrammar, a as Column } from '../../Blueprint-g4SmS1bH.mjs';
2
2
  import '@devbro/neko-helper';
3
3
 
4
4
  declare class SqliteSchemaGrammar extends SchemaGrammar {
5
+ compileColumn(column: Column): string;
5
6
  }
6
7
 
7
8
  export { SqliteSchemaGrammar };
@@ -5,6 +5,52 @@ class SqliteSchemaGrammar extends SchemaGrammar {
5
5
  static {
6
6
  __name(this, "SqliteSchemaGrammar");
7
7
  }
8
+ compileColumn(column) {
9
+ const rc = [`${column.columnName}`];
10
+ if (column.properties.type === "string") {
11
+ rc.push("varchar(" + column.properties.length + ")");
12
+ } else if (column.properties.type === "char") {
13
+ rc.push("char");
14
+ } else if (column.properties.type === "boolean") {
15
+ rc.push("boolean");
16
+ } else if (column.properties.type === "integer") {
17
+ rc.push("integer");
18
+ } else if (column.properties.type === "text") {
19
+ rc.push("text");
20
+ } else if (column.properties.type === "timestamp") {
21
+ rc.push("timestamp");
22
+ } else if (column.properties.type === "timestampz") {
23
+ rc.push("timestamp with time zone");
24
+ } else if (column.properties.type === "serial") {
25
+ rc.push("INTEGER");
26
+ } else if (column.properties.type === "float") {
27
+ rc.push("float");
28
+ } else if (column.properties.type === "double") {
29
+ rc.push("double precision");
30
+ } else if (column.properties.type === "date") {
31
+ rc.push("date");
32
+ } else if (column.properties.type === "json") {
33
+ rc.push("json");
34
+ } else if (column.properties.type === "jsonb") {
35
+ rc.push("jsonb");
36
+ } else if (column.properties.type === "raw") {
37
+ return column.columnName;
38
+ } else {
39
+ throw new Error("Unknown column type: " + column.properties.type);
40
+ }
41
+ if (column.properties.nullable) {
42
+ rc.push("null");
43
+ } else {
44
+ rc.push("not null");
45
+ }
46
+ if (column.properties.unique) {
47
+ rc.push("unique");
48
+ }
49
+ if (column.properties.default !== null) {
50
+ rc.push("default " + this.escape(column.properties.default));
51
+ }
52
+ return rc.join(" ");
53
+ }
8
54
  }
9
55
  export {
10
56
  SqliteSchemaGrammar
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/databases/sqlite/SqliteSchemaGrammar.mts"],"sourcesContent":["import { SchemaGrammar } from '../../SchemaGrammar.mjs';\n\nexport class SqliteSchemaGrammar extends SchemaGrammar {}\n"],"mappings":";;AAAA,SAAS,qBAAqB;AAEvB,MAAM,4BAA4B,cAAc;AAAA,EAFvD,OAEuD;AAAA;AAAA;AAAC;","names":[]}
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":[]}
@@ -1,6 +1,6 @@
1
1
  export { SqliteConfig, SqliteConnection } from './SqliteConnection.mjs';
2
2
  export { SqliteQueryGrammar } from './SqliteQueryGrammar.mjs';
3
3
  export { SqliteSchemaGrammar } from './SqliteSchemaGrammar.mjs';
4
- import '../../Blueprint-D3WHeqRS.mjs';
4
+ import '../../Blueprint-g4SmS1bH.mjs';
5
5
  import '@devbro/neko-helper';
6
6
  import 'better-sqlite3';
package/dist/index.d.mts CHANGED
@@ -4,8 +4,12 @@ export { PostgresqlSchemaGrammar } from './databases/postgresql/PostgresqlSchema
4
4
  export { SqliteConfig, SqliteConnection } from './databases/sqlite/SqliteConnection.mjs';
5
5
  export { SqliteQueryGrammar } from './databases/sqlite/SqliteQueryGrammar.mjs';
6
6
  export { SqliteSchemaGrammar } from './databases/sqlite/SqliteSchemaGrammar.mjs';
7
- export { B as Blueprint, a as Column, C as ColumnPropertiesType, m as CompiledSql, b as Connection, F as ForeignKeyConstraint, I as IndexConstraint, J as JoinCondition, P as Parameter, d as Query, e as QueryGrammar, Q as QueryParts, S as Schema, f as SchemaGrammar, c as connection_events, n as havingType, o as joinType, s as selectType, w as whereBasic, i as whereNested, k as whereNull, g as whereOp, h as whereOpColumn, j as whereRaw, l as whereType } from './Blueprint-D3WHeqRS.mjs';
7
+ export { MysqlConnection } from './databases/mysql/MysqlConnection.mjs';
8
+ export { MysqlQueryGrammar } from './databases/mysql/MysqlQueryGrammar.mjs';
9
+ export { MysqlSchemaGrammar } from './databases/mysql/MysqlSchemaGrammar.mjs';
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-g4SmS1bH.mjs';
8
11
  export { Migration } from './Migration.mjs';
9
12
  import 'pg';
10
13
  import 'better-sqlite3';
14
+ import 'mysql2/promise';
11
15
  import '@devbro/neko-helper';