@holo-js/db-mysql 0.1.5 → 0.1.7

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/index.d.ts CHANGED
@@ -44,6 +44,7 @@ declare class MySQLAdapter implements DriverAdapter {
44
44
  rollbackToSavepoint(name: string): Promise<void>;
45
45
  releaseSavepoint(name: string): Promise<void>;
46
46
  private getQueryable;
47
+ private ensureDatabaseExists;
47
48
  private leaseTransactionClient;
48
49
  private requireTransactionClient;
49
50
  private releaseTransactionClient;
package/dist/index.mjs CHANGED
@@ -6,6 +6,41 @@ var TransactionError = class extends Error {
6
6
  function toMutableBindings(bindings = []) {
7
7
  return [...bindings];
8
8
  }
9
+ function quoteDatabaseIdentifier(database) {
10
+ return `\`${database.replaceAll("`", "``")}\``;
11
+ }
12
+ function stripDatabaseFromUri(uri) {
13
+ const parsed = new URL(uri);
14
+ const database = parsed.pathname.replace(/^\/+/, "");
15
+ parsed.pathname = "";
16
+ return {
17
+ database: database ? decodeURIComponent(database) : void 0,
18
+ uri: parsed.toString()
19
+ };
20
+ }
21
+ function resolveBootstrapTarget(config) {
22
+ if (typeof config.database === "string" && config.database.trim().length > 0) {
23
+ const { database, ...bootstrapConfig } = config;
24
+ return {
25
+ database,
26
+ config: bootstrapConfig
27
+ };
28
+ }
29
+ if (typeof config.uri === "string" && config.uri.trim().length > 0) {
30
+ const stripped = stripDatabaseFromUri(config.uri);
31
+ if (!stripped.database) {
32
+ return void 0;
33
+ }
34
+ return {
35
+ database: stripped.database,
36
+ config: {
37
+ ...config,
38
+ uri: stripped.uri
39
+ }
40
+ };
41
+ }
42
+ return void 0;
43
+ }
9
44
  function wrapMySQLClient(client) {
10
45
  const rawClient = client;
11
46
  return {
@@ -49,6 +84,7 @@ var MySQLAdapter = class {
49
84
  return;
50
85
  }
51
86
  if (this.createPoolInstance) {
87
+ await this.ensureDatabaseExists();
52
88
  this.pool = this.createPoolInstance(this.config);
53
89
  }
54
90
  this.connected = true;
@@ -161,6 +197,30 @@ var MySQLAdapter = class {
161
197
  }
162
198
  return this.pool;
163
199
  }
200
+ async ensureDatabaseExists() {
201
+ if (!this.createPoolInstance) {
202
+ return;
203
+ }
204
+ const target = resolveBootstrapTarget(this.config);
205
+ if (!target) {
206
+ return;
207
+ }
208
+ const bootstrapPool = this.createPoolInstance(target.config);
209
+ try {
210
+ const [existing] = await bootstrapPool.query(
211
+ "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?",
212
+ [target.database]
213
+ );
214
+ if (Array.isArray(existing) && existing.length === 0) {
215
+ await bootstrapPool.query(`CREATE DATABASE ${quoteDatabaseIdentifier(target.database)}`, []);
216
+ }
217
+ } catch (error) {
218
+ const message = error instanceof Error ? error.message : String(error);
219
+ throw new Error(`Unable to ensure MySQL database "${target.database}" exists: ${message}`, { cause: error });
220
+ } finally {
221
+ await bootstrapPool.end();
222
+ }
223
+ }
164
224
  async leaseTransactionClient() {
165
225
  const scoped = this.transactionScope.getStore();
166
226
  if (scoped) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@holo-js/db-mysql",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Holo-JS Framework - MySQL database adapter",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -24,13 +24,13 @@
24
24
  "test:integration": "HOLO_MYSQL_INTEGRATION=1 vitest --run tests/mysql.test.ts"
25
25
  },
26
26
  "peerDependencies": {
27
- "@holo-js/db": "^0.1.5"
27
+ "@holo-js/db": "^0.1.7"
28
28
  },
29
29
  "dependencies": {
30
30
  "mysql2": "^3.17.1"
31
31
  },
32
32
  "devDependencies": {
33
- "@holo-js/db": "^0.1.5",
33
+ "@holo-js/db": "^0.1.7",
34
34
  "tsup": "^8.3.5",
35
35
  "typescript": "^5.7.2",
36
36
  "vitest": "^4.1.5"