@uns-kit/database 2.0.46
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/LICENSE +21 -0
- package/README.md +91 -0
- package/dist/client.d.ts +19 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +120 -0
- package/dist/client.js.map +1 -0
- package/dist/drivers/oracle.d.ts +4 -0
- package/dist/drivers/oracle.d.ts.map +1 -0
- package/dist/drivers/oracle.js +96 -0
- package/dist/drivers/oracle.js.map +1 -0
- package/dist/drivers/pg.d.ts +4 -0
- package/dist/drivers/pg.d.ts.map +1 -0
- package/dist/drivers/pg.js +84 -0
- package/dist/drivers/pg.js.map +1 -0
- package/dist/drivers/sqlite.d.ts +4 -0
- package/dist/drivers/sqlite.d.ts.map +1 -0
- package/dist/drivers/sqlite.js +38 -0
- package/dist/drivers/sqlite.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/params.d.ts +4 -0
- package/dist/params.d.ts.map +1 -0
- package/dist/params.js +193 -0
- package/dist/params.js.map +1 -0
- package/dist/placeholders.d.ts +168 -0
- package/dist/placeholders.d.ts.map +1 -0
- package/dist/placeholders.js +51 -0
- package/dist/placeholders.js.map +1 -0
- package/dist/schema.d.ts +2208 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +81 -0
- package/dist/schema.js.map +1 -0
- package/dist/sql-modes.d.ts +3 -0
- package/dist/sql-modes.d.ts.map +1 -0
- package/dist/sql-modes.js +10 -0
- package/dist/sql-modes.js.map +1 -0
- package/dist/sql.d.ts +6 -0
- package/dist/sql.d.ts.map +1 -0
- package/dist/sql.js +14 -0
- package/dist/sql.js.map +1 -0
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Aljoša Vister
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# @uns-kit/database
|
|
2
|
+
|
|
3
|
+
Database helpers for UNS services. The package keeps database access outside `@uns-kit/core` while still fitting the same config/secret-resolution flow used by the rest of `uns-kit`.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Install the package plus only the driver(s) you need:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add @uns-kit/database pg
|
|
11
|
+
# or
|
|
12
|
+
pnpm add @uns-kit/database better-sqlite3
|
|
13
|
+
# or
|
|
14
|
+
pnpm add @uns-kit/database oracledb
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`pnpm add @uns-kit/database pg` is the intended one-command install pattern for Postgres support. Replace `pg` with `oracledb` or `better-sqlite3` for the other drivers.
|
|
18
|
+
|
|
19
|
+
## What it provides
|
|
20
|
+
|
|
21
|
+
- Driver-aware client factory for `pg`, `sqlite`, and `oracle`
|
|
22
|
+
- One portable SQL parameter style for all drivers: write SQL with `:namedParams`
|
|
23
|
+
- Shared database manager for multiple named connections
|
|
24
|
+
- SQL file loading from a configured `sqlDir`
|
|
25
|
+
- Zod schemas for app-level `databases` config extensions
|
|
26
|
+
|
|
27
|
+
## Config schema integration
|
|
28
|
+
|
|
29
|
+
Inside your app's `src/config/project.config.extension.ts`:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { z } from "zod";
|
|
33
|
+
import { databasesConfigSchema } from "@uns-kit/database";
|
|
34
|
+
|
|
35
|
+
export const projectExtrasSchema = z.object({
|
|
36
|
+
databases: databasesConfigSchema,
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The schema uses the same placeholder object shapes as `@uns-kit/core`, so `ConfigFile.loadConfig()` resolves database secrets automatically.
|
|
41
|
+
|
|
42
|
+
## Example config
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"databases": {
|
|
47
|
+
"main": {
|
|
48
|
+
"dialect": "pg",
|
|
49
|
+
"host": { "provider": "external", "key": "PG_HOST" },
|
|
50
|
+
"port": 5432,
|
|
51
|
+
"database": "factory",
|
|
52
|
+
"user": "app_user",
|
|
53
|
+
"password": { "provider": "env", "key": "PG_PASSWORD" },
|
|
54
|
+
"usePool": true,
|
|
55
|
+
"sqlDir": "./sql"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Set `"usePool": false` for Postgres or Oracle when you want a direct non-pooled connection, matching the old local proxy behavior.
|
|
62
|
+
|
|
63
|
+
## Usage
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import { ConfigFile } from "@uns-kit/core";
|
|
67
|
+
import { registerDatabase } from "@uns-kit/database";
|
|
68
|
+
|
|
69
|
+
const config = await ConfigFile.loadConfig();
|
|
70
|
+
registerDatabase("main", config.databases.main);
|
|
71
|
+
registerDatabase("reporting", config.databases.reporting);
|
|
72
|
+
registerDatabase("mesOracle", config.databases.mesOracle);
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Then in another file:
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
import { getDatabase } from "@uns-kit/database";
|
|
79
|
+
|
|
80
|
+
const db = await getDatabase("main");
|
|
81
|
+
const rows = await db.queryFile("queries/get-orders.sql", {
|
|
82
|
+
lineId: "L1",
|
|
83
|
+
fromTs: "2026-05-20T08:00:00Z",
|
|
84
|
+
});
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Use `:lineId`, `:fromTs`, etc. in SQL files. The package compiles them to `$1`, `?`, or Oracle bind syntax depending on the selected driver. The authoring style stays the same for all supported databases: plain SQL plus `:namedParam` bindings.
|
|
88
|
+
|
|
89
|
+
See also:
|
|
90
|
+
- [`examples/app-startup.ts`](D:/projects/uns-kit/packages/uns-database/examples/app-startup.ts)
|
|
91
|
+
- [`examples/orders-service.ts`](D:/projects/uns-kit/packages/uns-database/examples/orders-service.ts)
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DatabaseConnectionConfig } from "./schema.js";
|
|
2
|
+
import type { DatabaseClient } from "./types.js";
|
|
3
|
+
export declare function createDatabaseClient(config: DatabaseConnectionConfig, options?: {
|
|
4
|
+
name?: string;
|
|
5
|
+
}): Promise<DatabaseClient>;
|
|
6
|
+
export declare class DatabaseManager {
|
|
7
|
+
private readonly configs;
|
|
8
|
+
private readonly clients;
|
|
9
|
+
register(name: string, config: DatabaseConnectionConfig): this;
|
|
10
|
+
has(name: string): boolean;
|
|
11
|
+
getNames(): string[];
|
|
12
|
+
get(name: string): Promise<DatabaseClient>;
|
|
13
|
+
close(name: string): Promise<void>;
|
|
14
|
+
closeAll(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare function registerDatabase(name: string, config: DatabaseConnectionConfig): DatabaseManager;
|
|
17
|
+
export declare function getDatabaseManager(): DatabaseManager;
|
|
18
|
+
export declare function getDatabase(name: string): Promise<DatabaseClient>;
|
|
19
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,KAAK,EAEV,cAAc,EAIf,MAAM,YAAY,CAAC;AAyDpB,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,wBAAwB,EAChC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9B,OAAO,CAAC,cAAc,CAAC,CAmBzB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IACvE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8C;IAEtE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,GAAG,IAAI;IAgB9D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,QAAQ,IAAI,MAAM,EAAE;IAId,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsB1C,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAOhC;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,GAAG,eAAe,CAEhG;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAEpD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAEjE"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import logger from "@uns-kit/core/logger.js";
|
|
3
|
+
import { compileNamedParams } from "./params.js";
|
|
4
|
+
import { loadSqlFile } from "./sql.js";
|
|
5
|
+
import { createPgAdapter } from "./drivers/pg.js";
|
|
6
|
+
import { createSqliteAdapter } from "./drivers/sqlite.js";
|
|
7
|
+
import { createOracleAdapter } from "./drivers/oracle.js";
|
|
8
|
+
class DatabaseClientImpl {
|
|
9
|
+
adapter;
|
|
10
|
+
dialect;
|
|
11
|
+
name;
|
|
12
|
+
sqlDir;
|
|
13
|
+
constructor(adapter, name, sqlDir) {
|
|
14
|
+
this.adapter = adapter;
|
|
15
|
+
this.dialect = adapter.dialect;
|
|
16
|
+
this.name = name;
|
|
17
|
+
this.sqlDir = sqlDir;
|
|
18
|
+
}
|
|
19
|
+
async query(sqlText, params = {}) {
|
|
20
|
+
const statement = compileNamedParams(this.dialect, sqlText, params);
|
|
21
|
+
return this.adapter.query(statement);
|
|
22
|
+
}
|
|
23
|
+
async execute(sqlText, params = {}) {
|
|
24
|
+
const statement = compileNamedParams(this.dialect, sqlText, params);
|
|
25
|
+
return this.adapter.execute(statement);
|
|
26
|
+
}
|
|
27
|
+
async queryFile(filePath, params = {}) {
|
|
28
|
+
const sqlText = await loadSqlFile(filePath, { baseDir: this.sqlDir });
|
|
29
|
+
return this.query(sqlText, params);
|
|
30
|
+
}
|
|
31
|
+
async executeFile(filePath, params = {}) {
|
|
32
|
+
const sqlText = await loadSqlFile(filePath, { baseDir: this.sqlDir });
|
|
33
|
+
return this.execute(sqlText, params);
|
|
34
|
+
}
|
|
35
|
+
async close() {
|
|
36
|
+
await this.adapter.close();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function createDatabaseClient(config, options = {}) {
|
|
40
|
+
const sqlDir = config.sqlDir
|
|
41
|
+
? path.resolve(process.cwd(), config.sqlDir)
|
|
42
|
+
: undefined;
|
|
43
|
+
logger.info(`uns-database - Creating database client: ${options.name ?? "unnamed"} (${config.dialect}, pool=${config.dialect === "sqlite" ? "n/a" : config.usePool !== false})`);
|
|
44
|
+
switch (config.dialect) {
|
|
45
|
+
case "pg":
|
|
46
|
+
return new DatabaseClientImpl(await createPgAdapter(config), options.name, sqlDir);
|
|
47
|
+
case "sqlite":
|
|
48
|
+
return new DatabaseClientImpl(await createSqliteAdapter(config), options.name, sqlDir);
|
|
49
|
+
case "oracle":
|
|
50
|
+
return new DatabaseClientImpl(await createOracleAdapter(config), options.name, sqlDir);
|
|
51
|
+
}
|
|
52
|
+
throw new Error(`Unsupported database dialect: ${String(config.dialect)}`);
|
|
53
|
+
}
|
|
54
|
+
export class DatabaseManager {
|
|
55
|
+
configs = new Map();
|
|
56
|
+
clients = new Map();
|
|
57
|
+
register(name, config) {
|
|
58
|
+
const hadExistingConfig = this.configs.has(name);
|
|
59
|
+
const hadExistingClient = this.clients.has(name);
|
|
60
|
+
this.configs.set(name, config);
|
|
61
|
+
this.clients.delete(name);
|
|
62
|
+
logger.info(hadExistingConfig
|
|
63
|
+
? `uns-database - Re-registered database: ${name} (${config.dialect}, pool=${config.dialect === "sqlite" ? "n/a" : config.usePool !== false}, replacedClient=${hadExistingClient})`
|
|
64
|
+
: `uns-database - Registered database: ${name} (${config.dialect}, pool=${config.dialect === "sqlite" ? "n/a" : config.usePool !== false})`);
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
has(name) {
|
|
68
|
+
return this.configs.has(name);
|
|
69
|
+
}
|
|
70
|
+
getNames() {
|
|
71
|
+
return Array.from(this.configs.keys());
|
|
72
|
+
}
|
|
73
|
+
async get(name) {
|
|
74
|
+
const existing = this.clients.get(name);
|
|
75
|
+
if (existing) {
|
|
76
|
+
logger.info(`uns-database - Reusing cached database client: ${name}`);
|
|
77
|
+
return existing;
|
|
78
|
+
}
|
|
79
|
+
const config = this.configs.get(name);
|
|
80
|
+
if (!config) {
|
|
81
|
+
throw new Error(`Database connection '${name}' is not configured.`);
|
|
82
|
+
}
|
|
83
|
+
const clientPromise = createDatabaseClient(config, { name }).catch((error) => {
|
|
84
|
+
this.clients.delete(name);
|
|
85
|
+
logger.error(`uns-database - Database client initialization failed: ${name}`, error);
|
|
86
|
+
throw error;
|
|
87
|
+
});
|
|
88
|
+
this.clients.set(name, clientPromise);
|
|
89
|
+
logger.info(`uns-database - Initialized database client cache entry: ${name} (${config.dialect})`);
|
|
90
|
+
return clientPromise;
|
|
91
|
+
}
|
|
92
|
+
async close(name) {
|
|
93
|
+
const client = this.clients.get(name);
|
|
94
|
+
if (!client) {
|
|
95
|
+
logger.info(`uns-database - Close requested for database without active client: ${name}`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.clients.delete(name);
|
|
99
|
+
await (await client).close();
|
|
100
|
+
logger.info(`uns-database - Closed database client: ${name}`);
|
|
101
|
+
}
|
|
102
|
+
async closeAll() {
|
|
103
|
+
const pendingClients = Array.from(this.clients.values());
|
|
104
|
+
const count = pendingClients.length;
|
|
105
|
+
this.clients.clear();
|
|
106
|
+
await Promise.all(pendingClients.map(async (client) => (await client).close()));
|
|
107
|
+
logger.info(`uns-database - Closed all database clients (${count})`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const defaultDatabaseManager = new DatabaseManager();
|
|
111
|
+
export function registerDatabase(name, config) {
|
|
112
|
+
return defaultDatabaseManager.register(name, config);
|
|
113
|
+
}
|
|
114
|
+
export function getDatabaseManager() {
|
|
115
|
+
return defaultDatabaseManager;
|
|
116
|
+
}
|
|
117
|
+
export function getDatabase(name) {
|
|
118
|
+
return defaultDatabaseManager.get(name);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"node:path\";\nimport logger from \"@uns-kit/core/logger.js\";\nimport type { DatabaseConnectionConfig } from \"./schema.js\";\nimport { compileNamedParams } from \"./params.js\";\nimport { loadSqlFile } from \"./sql.js\";\nimport type {\n DatabaseAdapter,\n DatabaseClient,\n DatabaseExecuteResult,\n DatabaseQueryResult,\n SqlParams,\n} from \"./types.js\";\nimport { createPgAdapter } from \"./drivers/pg.js\";\nimport { createSqliteAdapter } from \"./drivers/sqlite.js\";\nimport { createOracleAdapter } from \"./drivers/oracle.js\";\n\nclass DatabaseClientImpl implements DatabaseClient {\n readonly dialect;\n readonly name?;\n readonly sqlDir?;\n\n constructor(\n private readonly adapter: DatabaseAdapter,\n name?: string,\n sqlDir?: string\n ) {\n this.dialect = adapter.dialect;\n this.name = name;\n this.sqlDir = sqlDir;\n }\n\n async query<T = Record<string, unknown>>(\n sqlText: string,\n params: SqlParams = {}\n ): Promise<DatabaseQueryResult<T>> {\n const statement = compileNamedParams(this.dialect, sqlText, params);\n return this.adapter.query<T>(statement);\n }\n\n async execute(\n sqlText: string,\n params: SqlParams = {}\n ): Promise<DatabaseExecuteResult> {\n const statement = compileNamedParams(this.dialect, sqlText, params);\n return this.adapter.execute(statement);\n }\n\n async queryFile<T = Record<string, unknown>>(\n filePath: string,\n params: SqlParams = {}\n ): Promise<DatabaseQueryResult<T>> {\n const sqlText = await loadSqlFile(filePath, { baseDir: this.sqlDir });\n return this.query<T>(sqlText, params);\n }\n\n async executeFile(\n filePath: string,\n params: SqlParams = {}\n ): Promise<DatabaseExecuteResult> {\n const sqlText = await loadSqlFile(filePath, { baseDir: this.sqlDir });\n return this.execute(sqlText, params);\n }\n\n async close(): Promise<void> {\n await this.adapter.close();\n }\n}\n\nexport async function createDatabaseClient(\n config: DatabaseConnectionConfig,\n options: { name?: string } = {}\n): Promise<DatabaseClient> {\n const sqlDir = config.sqlDir\n ? path.resolve(process.cwd(), config.sqlDir)\n : undefined;\n\n logger.info(\n `uns-database - Creating database client: ${options.name ?? \"unnamed\"} (${config.dialect}, pool=${config.dialect === \"sqlite\" ? \"n/a\" : config.usePool !== false})`\n );\n\n switch (config.dialect) {\n case \"pg\":\n return new DatabaseClientImpl(await createPgAdapter(config), options.name, sqlDir);\n case \"sqlite\":\n return new DatabaseClientImpl(await createSqliteAdapter(config), options.name, sqlDir);\n case \"oracle\":\n return new DatabaseClientImpl(await createOracleAdapter(config), options.name, sqlDir);\n }\n\n throw new Error(`Unsupported database dialect: ${String((config as { dialect?: string }).dialect)}`);\n}\n\nexport class DatabaseManager {\n private readonly configs = new Map<string, DatabaseConnectionConfig>();\n private readonly clients = new Map<string, Promise<DatabaseClient>>();\n\n register(name: string, config: DatabaseConnectionConfig): this {\n const hadExistingConfig = this.configs.has(name);\n const hadExistingClient = this.clients.has(name);\n\n this.configs.set(name, config);\n this.clients.delete(name);\n\n logger.info(\n hadExistingConfig\n ? `uns-database - Re-registered database: ${name} (${config.dialect}, pool=${config.dialect === \"sqlite\" ? \"n/a\" : config.usePool !== false}, replacedClient=${hadExistingClient})`\n : `uns-database - Registered database: ${name} (${config.dialect}, pool=${config.dialect === \"sqlite\" ? \"n/a\" : config.usePool !== false})`\n );\n\n return this;\n }\n\n has(name: string): boolean {\n return this.configs.has(name);\n }\n\n getNames(): string[] {\n return Array.from(this.configs.keys());\n }\n\n async get(name: string): Promise<DatabaseClient> {\n const existing = this.clients.get(name);\n if (existing) {\n logger.info(`uns-database - Reusing cached database client: ${name}`);\n return existing;\n }\n\n const config = this.configs.get(name);\n if (!config) {\n throw new Error(`Database connection '${name}' is not configured.`);\n }\n\n const clientPromise = createDatabaseClient(config, { name }).catch((error) => {\n this.clients.delete(name);\n logger.error(`uns-database - Database client initialization failed: ${name}`, error);\n throw error;\n });\n this.clients.set(name, clientPromise);\n logger.info(`uns-database - Initialized database client cache entry: ${name} (${config.dialect})`);\n return clientPromise;\n }\n\n async close(name: string): Promise<void> {\n const client = this.clients.get(name);\n if (!client) {\n logger.info(`uns-database - Close requested for database without active client: ${name}`);\n return;\n }\n\n this.clients.delete(name);\n await (await client).close();\n logger.info(`uns-database - Closed database client: ${name}`);\n }\n\n async closeAll(): Promise<void> {\n const pendingClients = Array.from(this.clients.values());\n const count = pendingClients.length;\n this.clients.clear();\n await Promise.all(pendingClients.map(async client => (await client).close()));\n logger.info(`uns-database - Closed all database clients (${count})`);\n }\n}\n\nconst defaultDatabaseManager = new DatabaseManager();\n\nexport function registerDatabase(name: string, config: DatabaseConnectionConfig): DatabaseManager {\n return defaultDatabaseManager.register(name, config);\n}\n\nexport function getDatabaseManager(): DatabaseManager {\n return defaultDatabaseManager;\n}\n\nexport function getDatabase(name: string): Promise<DatabaseClient> {\n return defaultDatabaseManager.get(name);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../src/drivers/oracle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AAExE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAmCzD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAyGhG"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
function buildOracleConnectString(config) {
|
|
2
|
+
if (config.connectString) {
|
|
3
|
+
return config.connectString;
|
|
4
|
+
}
|
|
5
|
+
return config.serviceName
|
|
6
|
+
? `${config.host}:${config.port}/${config.serviceName}`
|
|
7
|
+
: `${config.host}:${config.port}/${config.sid}`;
|
|
8
|
+
}
|
|
9
|
+
export async function createOracleAdapter(config) {
|
|
10
|
+
let oracleModule;
|
|
11
|
+
try {
|
|
12
|
+
const importedModule = await import("oracledb");
|
|
13
|
+
oracleModule = (importedModule.default ??
|
|
14
|
+
importedModule);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
throw new Error("The 'oracledb' package is required for dialect 'oracle'. Install it with `pnpm add oracledb`.", { cause: error });
|
|
18
|
+
}
|
|
19
|
+
const connectionOptions = {
|
|
20
|
+
user: config.user,
|
|
21
|
+
password: config.password,
|
|
22
|
+
connectString: buildOracleConnectString(config),
|
|
23
|
+
poolMin: config.poolMin,
|
|
24
|
+
poolMax: config.poolMax,
|
|
25
|
+
poolIncrement: config.poolIncrement,
|
|
26
|
+
stmtCacheSize: config.stmtCacheSize,
|
|
27
|
+
};
|
|
28
|
+
if (config.usePool !== false) {
|
|
29
|
+
const pool = await oracleModule.createPool(connectionOptions);
|
|
30
|
+
return {
|
|
31
|
+
dialect: "oracle",
|
|
32
|
+
async query(statement) {
|
|
33
|
+
const connection = await pool.getConnection();
|
|
34
|
+
try {
|
|
35
|
+
const result = await connection.execute(statement.text, statement.values, { outFormat: oracleModule.OUT_FORMAT_OBJECT });
|
|
36
|
+
const rows = result.rows ?? [];
|
|
37
|
+
return {
|
|
38
|
+
rows,
|
|
39
|
+
rowCount: rows.length,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
await connection.close();
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
async execute(statement) {
|
|
47
|
+
const connection = await pool.getConnection();
|
|
48
|
+
try {
|
|
49
|
+
const result = await connection.execute(statement.text, statement.values, { autoCommit: true });
|
|
50
|
+
return {
|
|
51
|
+
rowCount: result.rowsAffected ?? 0,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await connection.close();
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
close() {
|
|
59
|
+
return pool.close(0);
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
dialect: "oracle",
|
|
65
|
+
async query(statement) {
|
|
66
|
+
const connection = await oracleModule.getConnection(connectionOptions);
|
|
67
|
+
try {
|
|
68
|
+
const result = await connection.execute(statement.text, statement.values, { outFormat: oracleModule.OUT_FORMAT_OBJECT });
|
|
69
|
+
const rows = result.rows ?? [];
|
|
70
|
+
return {
|
|
71
|
+
rows,
|
|
72
|
+
rowCount: rows.length,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
await connection.close();
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
async execute(statement) {
|
|
80
|
+
const connection = await oracleModule.getConnection(connectionOptions);
|
|
81
|
+
try {
|
|
82
|
+
const result = await connection.execute(statement.text, statement.values, { autoCommit: true });
|
|
83
|
+
return {
|
|
84
|
+
rowCount: result.rowsAffected ?? 0,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
await connection.close();
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
async close() {
|
|
92
|
+
// Non-pooled Oracle mode opens/closes per operation, so there is nothing to tear down.
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=oracle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/drivers/oracle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DatabaseAdapter, DatabaseQueryResult } from \"../types.js\";\nimport type { CompiledSqlStatement } from \"../types.js\";\nimport type { OracleDatabaseConfig } from \"../schema.js\";\n\ntype OraclePool = {\n getConnection(): Promise<OracleConnection>;\n close(closeMode?: number): Promise<void>;\n};\n\ntype OracleConnection = {\n execute<T = Record<string, unknown>>(\n sqlText: string,\n bindParams?: Record<string, unknown>,\n options?: Record<string, unknown>\n ): Promise<{\n rows?: T[];\n rowsAffected?: number;\n }>;\n close(): Promise<void>;\n};\n\ntype OracleModule = {\n OUT_FORMAT_OBJECT: number;\n createPool(options: Record<string, unknown>): Promise<OraclePool>;\n getConnection(options: Record<string, unknown>): Promise<OracleConnection>;\n};\n\nfunction buildOracleConnectString(config: OracleDatabaseConfig): string {\n if (config.connectString) {\n return config.connectString;\n }\n\n return config.serviceName\n ? `${config.host}:${config.port}/${config.serviceName}`\n : `${config.host}:${config.port}/${config.sid}`;\n}\n\nexport async function createOracleAdapter(config: OracleDatabaseConfig): Promise<DatabaseAdapter> {\n let oracleModule: OracleModule;\n\n try {\n const importedModule = await import(\"oracledb\");\n oracleModule = ((importedModule as { default?: OracleModule }).default ??\n importedModule) as OracleModule;\n } catch (error) {\n throw new Error(\n \"The 'oracledb' package is required for dialect 'oracle'. Install it with `pnpm add oracledb`.\",\n { cause: error as Error }\n );\n }\n\n const connectionOptions = {\n user: config.user,\n password: config.password,\n connectString: buildOracleConnectString(config),\n poolMin: config.poolMin,\n poolMax: config.poolMax,\n poolIncrement: config.poolIncrement,\n stmtCacheSize: config.stmtCacheSize,\n };\n\n if (config.usePool !== false) {\n const pool = await oracleModule.createPool(connectionOptions);\n\n return {\n dialect: \"oracle\",\n async query<T = Record<string, unknown>>(statement: CompiledSqlStatement): Promise<DatabaseQueryResult<T>> {\n const connection = await pool.getConnection();\n try {\n const result = await connection.execute<T>(\n statement.text,\n statement.values as Record<string, unknown>,\n { outFormat: oracleModule.OUT_FORMAT_OBJECT }\n );\n const rows = result.rows ?? [];\n return {\n rows,\n rowCount: rows.length,\n };\n } finally {\n await connection.close();\n }\n },\n async execute(statement: CompiledSqlStatement) {\n const connection = await pool.getConnection();\n try {\n const result = await connection.execute(\n statement.text,\n statement.values as Record<string, unknown>,\n { autoCommit: true }\n );\n return {\n rowCount: result.rowsAffected ?? 0,\n };\n } finally {\n await connection.close();\n }\n },\n close() {\n return pool.close(0);\n },\n };\n }\n\n return {\n dialect: \"oracle\",\n async query<T = Record<string, unknown>>(statement: CompiledSqlStatement): Promise<DatabaseQueryResult<T>> {\n const connection = await oracleModule.getConnection(connectionOptions);\n try {\n const result = await connection.execute<T>(\n statement.text,\n statement.values as Record<string, unknown>,\n { outFormat: oracleModule.OUT_FORMAT_OBJECT }\n );\n const rows = result.rows ?? [];\n return {\n rows,\n rowCount: rows.length,\n };\n } finally {\n await connection.close();\n }\n },\n async execute(statement: CompiledSqlStatement) {\n const connection = await oracleModule.getConnection(connectionOptions);\n try {\n const result = await connection.execute(\n statement.text,\n statement.values as Record<string, unknown>,\n { autoCommit: true }\n );\n return {\n rowCount: result.rowsAffected ?? 0,\n };\n } finally {\n await connection.close();\n }\n },\n async close() {\n // Non-pooled Oracle mode opens/closes per operation, so there is nothing to tear down.\n },\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../../src/drivers/pg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AAExE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAqC3D,wBAAsB,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CA8E9F"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
function buildPgSsl(config) {
|
|
2
|
+
if (config.ssl === undefined) {
|
|
3
|
+
return undefined;
|
|
4
|
+
}
|
|
5
|
+
if (typeof config.ssl === "boolean") {
|
|
6
|
+
return config.ssl;
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
rejectUnauthorized: config.ssl.rejectUnauthorized,
|
|
10
|
+
ca: config.ssl.ca,
|
|
11
|
+
cert: config.ssl.cert,
|
|
12
|
+
key: config.ssl.key,
|
|
13
|
+
servername: config.ssl.servername,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export async function createPgAdapter(config) {
|
|
17
|
+
let pgModule;
|
|
18
|
+
try {
|
|
19
|
+
const importedModule = await import("pg");
|
|
20
|
+
pgModule = (importedModule.default ??
|
|
21
|
+
importedModule);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
throw new Error("The 'pg' package is required for dialect 'pg'. Install it with `pnpm add pg`.", { cause: error });
|
|
25
|
+
}
|
|
26
|
+
const connectionOptions = {
|
|
27
|
+
host: config.host,
|
|
28
|
+
port: config.port,
|
|
29
|
+
database: config.database,
|
|
30
|
+
user: config.user,
|
|
31
|
+
password: config.password,
|
|
32
|
+
ssl: buildPgSsl(config),
|
|
33
|
+
application_name: config.applicationName,
|
|
34
|
+
statement_timeout: config.statementTimeoutMs,
|
|
35
|
+
connectionTimeoutMillis: config.connectionTimeoutMs,
|
|
36
|
+
idleTimeoutMillis: config.idleTimeoutMs,
|
|
37
|
+
max: config.maxPoolSize,
|
|
38
|
+
min: config.minPoolSize,
|
|
39
|
+
};
|
|
40
|
+
if (config.usePool !== false) {
|
|
41
|
+
const pool = new pgModule.Pool(connectionOptions);
|
|
42
|
+
return {
|
|
43
|
+
dialect: "pg",
|
|
44
|
+
async query(statement) {
|
|
45
|
+
const result = await pool.query(statement.text, statement.values);
|
|
46
|
+
return {
|
|
47
|
+
rows: result.rows,
|
|
48
|
+
rowCount: result.rowCount ?? result.rows.length,
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
async execute(statement) {
|
|
52
|
+
const result = await pool.query(statement.text, statement.values);
|
|
53
|
+
return {
|
|
54
|
+
rowCount: result.rowCount ?? 0,
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
close() {
|
|
58
|
+
return pool.end();
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const client = new pgModule.Client(connectionOptions);
|
|
63
|
+
await client.connect();
|
|
64
|
+
return {
|
|
65
|
+
dialect: "pg",
|
|
66
|
+
async query(statement) {
|
|
67
|
+
const result = await client.query(statement.text, statement.values);
|
|
68
|
+
return {
|
|
69
|
+
rows: result.rows,
|
|
70
|
+
rowCount: result.rowCount ?? result.rows.length,
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
async execute(statement) {
|
|
74
|
+
const result = await client.query(statement.text, statement.values);
|
|
75
|
+
return {
|
|
76
|
+
rowCount: result.rowCount ?? 0,
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
close() {
|
|
80
|
+
return client.end();
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=pg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg.js","sourceRoot":"","sources":["../../src/drivers/pg.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DatabaseAdapter, DatabaseQueryResult } from \"../types.js\";\nimport type { CompiledSqlStatement } from \"../types.js\";\nimport type { PostgresDatabaseConfig } from \"../schema.js\";\n\ntype PgPool = {\n query<T = Record<string, unknown>>(text: string, values?: unknown[]): Promise<{\n rows: T[];\n rowCount?: number | null;\n }>;\n end(): Promise<void>;\n};\n\ntype PgClient = {\n connect(): Promise<void>;\n query<T = Record<string, unknown>>(text: string, values?: unknown[]): Promise<{\n rows: T[];\n rowCount?: number | null;\n }>;\n end(): Promise<void>;\n};\n\nfunction buildPgSsl(config: PostgresDatabaseConfig): unknown {\n if (config.ssl === undefined) {\n return undefined;\n }\n\n if (typeof config.ssl === \"boolean\") {\n return config.ssl;\n }\n\n return {\n rejectUnauthorized: config.ssl.rejectUnauthorized,\n ca: config.ssl.ca,\n cert: config.ssl.cert,\n key: config.ssl.key,\n servername: config.ssl.servername,\n };\n}\n\nexport async function createPgAdapter(config: PostgresDatabaseConfig): Promise<DatabaseAdapter> {\n let pgModule: {\n Pool: new (options: Record<string, unknown>) => PgPool;\n Client: new (options: Record<string, unknown>) => PgClient;\n };\n\n try {\n const importedModule = await import(\"pg\");\n pgModule = ((importedModule as { default?: typeof importedModule }).default ??\n importedModule) as typeof pgModule;\n } catch (error) {\n throw new Error(\n \"The 'pg' package is required for dialect 'pg'. Install it with `pnpm add pg`.\",\n { cause: error as Error }\n );\n }\n\n const connectionOptions = {\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n ssl: buildPgSsl(config),\n application_name: config.applicationName,\n statement_timeout: config.statementTimeoutMs,\n connectionTimeoutMillis: config.connectionTimeoutMs,\n idleTimeoutMillis: config.idleTimeoutMs,\n max: config.maxPoolSize,\n min: config.minPoolSize,\n };\n\n if (config.usePool !== false) {\n const pool = new pgModule.Pool(connectionOptions);\n\n return {\n dialect: \"pg\",\n async query<T = Record<string, unknown>>(statement: CompiledSqlStatement): Promise<DatabaseQueryResult<T>> {\n const result = await pool.query<T>(statement.text, statement.values as unknown[]);\n return {\n rows: result.rows,\n rowCount: result.rowCount ?? result.rows.length,\n };\n },\n async execute(statement: CompiledSqlStatement) {\n const result = await pool.query(statement.text, statement.values as unknown[]);\n return {\n rowCount: result.rowCount ?? 0,\n };\n },\n close() {\n return pool.end();\n },\n };\n }\n\n const client = new pgModule.Client(connectionOptions);\n await client.connect();\n\n return {\n dialect: \"pg\",\n async query<T = Record<string, unknown>>(statement: CompiledSqlStatement): Promise<DatabaseQueryResult<T>> {\n const result = await client.query<T>(statement.text, statement.values as unknown[]);\n return {\n rows: result.rows,\n rowCount: result.rowCount ?? result.rows.length,\n };\n },\n async execute(statement: CompiledSqlStatement) {\n const result = await client.query(statement.text, statement.values as unknown[]);\n return {\n rowCount: result.rowCount ?? 0,\n };\n },\n close() {\n return client.end();\n },\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/drivers/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AAExE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAsBzD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CA0ChG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export async function createSqliteAdapter(config) {
|
|
2
|
+
let sqliteModule;
|
|
3
|
+
try {
|
|
4
|
+
sqliteModule = await import("better-sqlite3");
|
|
5
|
+
}
|
|
6
|
+
catch (error) {
|
|
7
|
+
throw new Error("The 'better-sqlite3' package is required for dialect 'sqlite'. Install it with `pnpm add better-sqlite3`.", { cause: error });
|
|
8
|
+
}
|
|
9
|
+
const Database = sqliteModule.default;
|
|
10
|
+
const db = new Database(config.filename, {
|
|
11
|
+
readonly: config.readonly,
|
|
12
|
+
fileMustExist: config.fileMustExist,
|
|
13
|
+
timeout: config.timeoutMs,
|
|
14
|
+
});
|
|
15
|
+
db.pragma("journal_mode = WAL");
|
|
16
|
+
return {
|
|
17
|
+
dialect: "sqlite",
|
|
18
|
+
async query(statement) {
|
|
19
|
+
const prepared = db.prepare(statement.text);
|
|
20
|
+
const rows = prepared.all(...statement.values);
|
|
21
|
+
return {
|
|
22
|
+
rows,
|
|
23
|
+
rowCount: rows.length,
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
async execute(statement) {
|
|
27
|
+
const prepared = db.prepare(statement.text);
|
|
28
|
+
const result = prepared.run(...statement.values);
|
|
29
|
+
return {
|
|
30
|
+
rowCount: result.changes ?? 0,
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
async close() {
|
|
34
|
+
db.close();
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/drivers/sqlite.ts"],"names":[],"mappings":"AAwBA,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAA4B;IACpE,IAAI,YAAkD,CAAC;IAEvD,IAAI,CAAC;QACH,YAAY,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,2GAA2G,EAC3G,EAAE,KAAK,EAAE,KAAc,EAAE,CAC1B,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC;IACtC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE;QACvC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,OAAO,EAAE,MAAM,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEhC,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,KAAK,CAAC,KAAK,CAA8B,SAA+B;YACtE,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAI,SAAS,CAAC,MAAoB,CAAQ,CAAC;YACrE,OAAO;gBACL,IAAI;gBACJ,QAAQ,EAAE,IAAI,CAAC,MAAM;aACtB,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,SAA+B;YAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAI,SAAS,CAAC,MAAoB,CAAC,CAAC;YAChE,OAAO;gBACL,QAAQ,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC;aAC9B,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,KAAK;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { DatabaseAdapter, DatabaseQueryResult } from \"../types.js\";\nimport type { CompiledSqlStatement } from \"../types.js\";\nimport type { SqliteDatabaseConfig } from \"../schema.js\";\n\ntype BetterSqliteStatement = {\n all(...params: unknown[]): Record<string, unknown>[];\n run(...params: unknown[]): { changes: number };\n};\n\ntype BetterSqliteDatabase = {\n pragma(value: string): void;\n prepare(sqlText: string): BetterSqliteStatement;\n close(): void;\n};\n\ntype BetterSqliteConstructor = new (\n filename: string,\n options?: {\n readonly?: boolean;\n fileMustExist?: boolean;\n timeout?: number;\n }\n) => BetterSqliteDatabase;\n\nexport async function createSqliteAdapter(config: SqliteDatabaseConfig): Promise<DatabaseAdapter> {\n let sqliteModule: { default: BetterSqliteConstructor };\n\n try {\n sqliteModule = await import(\"better-sqlite3\");\n } catch (error) {\n throw new Error(\n \"The 'better-sqlite3' package is required for dialect 'sqlite'. Install it with `pnpm add better-sqlite3`.\",\n { cause: error as Error }\n );\n }\n\n const Database = sqliteModule.default;\n const db = new Database(config.filename, {\n readonly: config.readonly,\n fileMustExist: config.fileMustExist,\n timeout: config.timeoutMs,\n });\n\n db.pragma(\"journal_mode = WAL\");\n\n return {\n dialect: \"sqlite\",\n async query<T = Record<string, unknown>>(statement: CompiledSqlStatement): Promise<DatabaseQueryResult<T>> {\n const prepared = db.prepare(statement.text);\n const rows = prepared.all(...(statement.values as unknown[])) as T[];\n return {\n rows,\n rowCount: rows.length,\n };\n },\n async execute(statement: CompiledSqlStatement) {\n const prepared = db.prepare(statement.text);\n const result = prepared.run(...(statement.values as unknown[]));\n return {\n rowCount: result.changes ?? 0,\n };\n },\n async close() {\n db.close();\n },\n };\n}\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC","sourcesContent":["export * from \"./types.js\";\nexport * from \"./placeholders.js\";\nexport * from \"./schema.js\";\nexport * from \"./sql.js\";\nexport * from \"./params.js\";\nexport * from \"./client.js\";\n"]}
|
package/dist/params.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CompiledSqlStatement, DatabaseDialect, SqlParams } from "./types.js";
|
|
2
|
+
export declare const ORACLE_IN_LIST_LIMIT = 1000;
|
|
3
|
+
export declare function compileNamedParams(dialect: DatabaseDialect, sqlText: string, params?: SqlParams): CompiledSqlStatement;
|
|
4
|
+
//# sourceMappingURL=params.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../src/params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EACf,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAoBzC,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,SAAc,GACrB,oBAAoB,CAiJtB"}
|