@mikro-orm/libsql 7.0.4 → 7.0.5-dev.0

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.
@@ -3,10 +3,12 @@ import { type Options } from 'libsql';
3
3
  import { LibSqlDialect } from './LibSqlDialect.js';
4
4
  /** libSQL database connection supporting both local and remote databases. */
5
5
  export declare class LibSqlConnection extends BaseSqliteConnection {
6
- private database;
7
- connect(options?: { skipOnConnect?: boolean }): Promise<void>;
8
- createKyselyDialect(options: Dictionary & Options): LibSqlDialect;
9
- /** @inheritDoc */
10
- executeDump(source: string): Promise<void>;
11
- private validateAttachSupport;
6
+ private database;
7
+ connect(options?: {
8
+ skipOnConnect?: boolean;
9
+ }): Promise<void>;
10
+ createKyselyDialect(options: Dictionary & Options): LibSqlDialect;
11
+ /** @inheritDoc */
12
+ executeDump(source: string): Promise<void>;
13
+ private validateAttachSupport;
12
14
  }
@@ -3,36 +3,34 @@ import Database from 'libsql';
3
3
  import { LibSqlDialect } from './LibSqlDialect.js';
4
4
  /** libSQL database connection supporting both local and remote databases. */
5
5
  export class LibSqlConnection extends BaseSqliteConnection {
6
- database;
7
- async connect(options) {
8
- this.validateAttachSupport();
9
- await super.connect(options);
10
- }
11
- createKyselyDialect(options) {
12
- const dbName = options.url ?? this.config.get('dbName');
13
- options.authToken ??= this.config.get('password');
14
- return new LibSqlDialect({
15
- database: async () => {
16
- return (this.database = new Database(dbName, options));
17
- },
18
- onCreateConnection: this.options.onCreateConnection ?? this.config.get('onCreateConnection'),
19
- });
20
- }
21
- /** @inheritDoc */
22
- async executeDump(source) {
23
- await this.ensureConnection();
24
- this.database.exec(source);
25
- }
26
- validateAttachSupport() {
27
- const attachDatabases = this.config.get('attachDatabases');
28
- if (!attachDatabases?.length) {
29
- return;
6
+ database;
7
+ async connect(options) {
8
+ this.validateAttachSupport();
9
+ await super.connect(options);
30
10
  }
31
- const dbName = this.config.get('dbName');
32
- if (/^(https?|libsql):\/\//.exec(dbName)) {
33
- throw new Error(
34
- 'ATTACH DATABASE is not supported for remote libSQL connections. ' + 'Use local file-based databases only.',
35
- );
11
+ createKyselyDialect(options) {
12
+ const dbName = options.url ?? this.config.get('dbName');
13
+ options.authToken ??= this.config.get('password');
14
+ return new LibSqlDialect({
15
+ database: async () => {
16
+ return (this.database = new Database(dbName, options));
17
+ },
18
+ onCreateConnection: this.options.onCreateConnection ?? this.config.get('onCreateConnection'),
19
+ });
20
+ }
21
+ /** @inheritDoc */
22
+ async executeDump(source) {
23
+ await this.ensureConnection();
24
+ this.database.exec(source);
25
+ }
26
+ validateAttachSupport() {
27
+ const attachDatabases = this.config.get('attachDatabases');
28
+ if (!attachDatabases?.length) {
29
+ return;
30
+ }
31
+ const dbName = this.config.get('dbName');
32
+ if (/^(https?|libsql):\/\//.exec(dbName)) {
33
+ throw new Error('ATTACH DATABASE is not supported for remote libSQL connections. ' + 'Use local file-based databases only.');
34
+ }
36
35
  }
37
- }
38
36
  }
@@ -1,7 +1,7 @@
1
1
  import { SqliteDialect, type SqliteDialectConfig, SqliteDriver } from 'kysely';
2
2
  /** Kysely dialect adapter for libSQL. */
3
3
  export declare class LibSqlDialect extends SqliteDialect {
4
- #private;
5
- constructor(config: SqliteDialectConfig);
6
- createDriver(): SqliteDriver;
4
+ #private;
5
+ constructor(config: SqliteDialectConfig);
6
+ createDriver(): SqliteDriver;
7
7
  }
package/LibSqlDialect.js CHANGED
@@ -1,112 +1,110 @@
1
- import { SqliteDialect, SqliteDriver } from 'kysely';
1
+ import { SqliteDialect, SqliteDriver, } from 'kysely';
2
2
  const CONNECTION_TIMEOUT = 10_000;
3
3
  class ConnectionMutex {
4
- #promise;
5
- #resolve;
6
- async lock() {
7
- while (this.#promise) {
8
- await this.#promise;
4
+ #promise;
5
+ #resolve;
6
+ async lock() {
7
+ while (this.#promise) {
8
+ await this.#promise;
9
+ }
10
+ this.#promise = new Promise(resolve => {
11
+ this.#resolve = resolve;
12
+ });
13
+ }
14
+ unlock() {
15
+ const resolve = this.#resolve;
16
+ this.#promise = undefined;
17
+ this.#resolve = undefined;
18
+ resolve?.();
9
19
  }
10
- this.#promise = new Promise(resolve => {
11
- this.#resolve = resolve;
12
- });
13
- }
14
- unlock() {
15
- const resolve = this.#resolve;
16
- this.#promise = undefined;
17
- this.#resolve = undefined;
18
- resolve?.();
19
- }
20
20
  }
21
21
  class LibSqlConnection {
22
- #created = Date.now();
23
- #db;
24
- constructor(db) {
25
- this.#db = db;
26
- }
27
- isValid() {
28
- return this.memory || this.#created > Date.now() - CONNECTION_TIMEOUT;
29
- }
30
- async executeQuery(compiledQuery) {
31
- const { sql, parameters } = compiledQuery;
32
- const stmt = this.#db.prepare(sql);
33
- if (stmt.reader) {
34
- return {
35
- rows: stmt.all(parameters),
36
- };
22
+ #created = Date.now();
23
+ #db;
24
+ constructor(db) {
25
+ this.#db = db;
37
26
  }
38
- const query = sql.trim().toLowerCase();
39
- /* v8 ignore next */
40
- if (
41
- query.startsWith('select') ||
42
- ((query.startsWith('insert into') || query.startsWith('update ')) && query.includes(' returning '))
43
- ) {
44
- return {
45
- rows: stmt.all(parameters),
46
- };
27
+ isValid() {
28
+ return this.memory || this.#created > Date.now() - CONNECTION_TIMEOUT;
47
29
  }
48
- const { changes, lastInsertRowid } = stmt.run(parameters);
49
- return {
50
- numAffectedRows: changes,
51
- insertId: lastInsertRowid,
52
- rows: [],
53
- };
54
- }
55
- async *streamQuery(compiledQuery) {
56
- const { sql, parameters } = compiledQuery;
57
- const stmt = this.#db.prepare(sql);
58
- /* v8 ignore next */
59
- if (!sql.toLowerCase().startsWith('select')) {
60
- throw new Error('Sqlite driver only supports streaming of select queries');
30
+ async executeQuery(compiledQuery) {
31
+ const { sql, parameters } = compiledQuery;
32
+ const stmt = this.#db.prepare(sql);
33
+ if (stmt.reader) {
34
+ return {
35
+ rows: stmt.all(parameters),
36
+ };
37
+ }
38
+ const query = sql.trim().toLowerCase();
39
+ /* v8 ignore next */
40
+ if (query.startsWith('select') ||
41
+ ((query.startsWith('insert into') || query.startsWith('update ')) && query.includes(' returning '))) {
42
+ return {
43
+ rows: stmt.all(parameters),
44
+ };
45
+ }
46
+ const { changes, lastInsertRowid } = stmt.run(parameters);
47
+ return {
48
+ numAffectedRows: changes,
49
+ insertId: lastInsertRowid,
50
+ rows: [],
51
+ };
61
52
  }
62
- for (const row of stmt.iterate(parameters)) {
63
- yield {
64
- rows: [row],
65
- };
53
+ async *streamQuery(compiledQuery) {
54
+ const { sql, parameters } = compiledQuery;
55
+ const stmt = this.#db.prepare(sql);
56
+ /* v8 ignore next */
57
+ if (!sql.toLowerCase().startsWith('select')) {
58
+ throw new Error('Sqlite driver only supports streaming of select queries');
59
+ }
60
+ for (const row of stmt.iterate(parameters)) {
61
+ yield {
62
+ rows: [row],
63
+ };
64
+ }
66
65
  }
67
- }
68
66
  }
69
67
  class LibSqlKyselyDriver extends SqliteDriver {
70
- #db;
71
- #connection;
72
- #connectionMutex = new ConnectionMutex();
73
- #config;
74
- constructor(config) {
75
- super(config);
76
- this.#config = config;
77
- }
78
- async init() {
79
- this.#db = await this.#config.database();
80
- this.#connection = new LibSqlConnection(this.#db);
81
- /* v8 ignore next */
82
- if (this.#config.onCreateConnection) {
83
- await this.#config.onCreateConnection(this.#connection);
68
+ #db;
69
+ #connection;
70
+ #connectionMutex = new ConnectionMutex();
71
+ #config;
72
+ constructor(config) {
73
+ super(config);
74
+ this.#config = config;
75
+ }
76
+ async init() {
77
+ this.#db = await this.#config.database();
78
+ this.#connection = new LibSqlConnection(this.#db);
79
+ /* v8 ignore next */
80
+ if (this.#config.onCreateConnection) {
81
+ await this.#config.onCreateConnection(this.#connection);
82
+ }
83
+ }
84
+ async acquireConnection() {
85
+ await this.#connectionMutex.lock();
86
+ /* v8 ignore next */
87
+ if (!this.#connection.isValid()) {
88
+ await this.destroy();
89
+ await this.init();
90
+ }
91
+ return this.#connection;
84
92
  }
85
- }
86
- async acquireConnection() {
87
- await this.#connectionMutex.lock();
88
- /* v8 ignore next */
89
- if (!this.#connection.isValid()) {
90
- await this.destroy();
91
- await this.init();
93
+ async releaseConnection() {
94
+ this.#connectionMutex.unlock();
95
+ }
96
+ async destroy() {
97
+ this.#db.close();
92
98
  }
93
- return this.#connection;
94
- }
95
- async releaseConnection() {
96
- this.#connectionMutex.unlock();
97
- }
98
- async destroy() {
99
- this.#db.close();
100
- }
101
99
  }
102
100
  /** Kysely dialect adapter for libSQL. */
103
101
  export class LibSqlDialect extends SqliteDialect {
104
- #config;
105
- constructor(config) {
106
- super(config);
107
- this.#config = config;
108
- }
109
- createDriver() {
110
- return new LibSqlKyselyDriver(this.#config);
111
- }
102
+ #config;
103
+ constructor(config) {
104
+ super(config);
105
+ this.#config = config;
106
+ }
107
+ createDriver() {
108
+ return new LibSqlKyselyDriver(this.#config);
109
+ }
112
110
  }
package/LibSqlDriver.d.ts CHANGED
@@ -4,7 +4,7 @@ import { LibSqlConnection } from './LibSqlConnection.js';
4
4
  import { LibSqlMikroORM } from './LibSqlMikroORM.js';
5
5
  /** Database driver for libSQL (Turso). */
6
6
  export declare class LibSqlDriver extends AbstractSqlDriver<LibSqlConnection> {
7
- constructor(config: Configuration);
8
- /** @inheritDoc */
9
- getORMClass(): Constructor<LibSqlMikroORM>;
7
+ constructor(config: Configuration);
8
+ /** @inheritDoc */
9
+ getORMClass(): Constructor<LibSqlMikroORM>;
10
10
  }
package/LibSqlDriver.js CHANGED
@@ -3,11 +3,11 @@ import { LibSqlConnection } from './LibSqlConnection.js';
3
3
  import { LibSqlMikroORM } from './LibSqlMikroORM.js';
4
4
  /** Database driver for libSQL (Turso). */
5
5
  export class LibSqlDriver extends AbstractSqlDriver {
6
- constructor(config) {
7
- super(config, new SqlitePlatform(), LibSqlConnection, ['kysely', 'libsql']);
8
- }
9
- /** @inheritDoc */
10
- getORMClass() {
11
- return LibSqlMikroORM;
12
- }
6
+ constructor(config) {
7
+ super(config, new SqlitePlatform(), LibSqlConnection, ['kysely', 'libsql']);
8
+ }
9
+ /** @inheritDoc */
10
+ getORMClass() {
11
+ return LibSqlMikroORM;
12
+ }
13
13
  }
@@ -1,58 +1,20 @@
1
- import {
2
- type AnyEntity,
3
- type EntityClass,
4
- type EntitySchema,
5
- MikroORM,
6
- type Options,
7
- type IDatabaseDriver,
8
- type EntityManager,
9
- type EntityManagerType,
10
- } from '@mikro-orm/core';
1
+ import { type AnyEntity, type EntityClass, type EntitySchema, MikroORM, type Options, type IDatabaseDriver, type EntityManager, type EntityManagerType } from '@mikro-orm/core';
11
2
  import type { SqlEntityManager } from '@mikro-orm/sql';
12
3
  import { LibSqlDriver } from './LibSqlDriver.js';
13
4
  /** Configuration options for the libSQL driver. */
14
- export type LibSqlOptions<
15
- EM extends SqlEntityManager<LibSqlDriver> = SqlEntityManager<LibSqlDriver>,
16
- Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (
17
- | string
18
- | EntityClass<AnyEntity>
19
- | EntitySchema
20
- )[],
21
- > = Partial<Options<LibSqlDriver, EM, Entities>>;
5
+ export type LibSqlOptions<EM extends SqlEntityManager<LibSqlDriver> = SqlEntityManager<LibSqlDriver>, Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]> = Partial<Options<LibSqlDriver, EM, Entities>>;
22
6
  /** Creates a type-safe configuration object for the libSQL driver. */
23
- export declare function defineLibSqlConfig<
24
- EM extends SqlEntityManager<LibSqlDriver> = SqlEntityManager<LibSqlDriver>,
25
- Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (
26
- | string
27
- | EntityClass<AnyEntity>
28
- | EntitySchema
29
- )[],
30
- >(options: LibSqlOptions<EM, Entities>): LibSqlOptions<EM, Entities>;
7
+ export declare function defineLibSqlConfig<EM extends SqlEntityManager<LibSqlDriver> = SqlEntityManager<LibSqlDriver>, Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]>(options: LibSqlOptions<EM, Entities>): LibSqlOptions<EM, Entities>;
31
8
  /**
32
9
  * @inheritDoc
33
10
  */
34
- export declare class LibSqlMikroORM<
35
- EM extends SqlEntityManager<LibSqlDriver> = SqlEntityManager<LibSqlDriver>,
36
- Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (
37
- | string
38
- | EntityClass<AnyEntity>
39
- | EntitySchema
40
- )[],
41
- > extends MikroORM<LibSqlDriver, EM, Entities> {
42
- /**
43
- * @inheritDoc
44
- */
45
- static init<
46
- D extends IDatabaseDriver = LibSqlDriver,
47
- EM extends EntityManager<D> = D[typeof EntityManagerType] & EntityManager<D>,
48
- Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (
49
- | string
50
- | EntityClass<AnyEntity>
51
- | EntitySchema
52
- )[],
53
- >(options: Partial<Options<D, EM, Entities>>): Promise<MikroORM<D, EM, Entities>>;
54
- /**
55
- * @inheritDoc
56
- */
57
- constructor(options: Partial<Options<LibSqlDriver, EM, Entities>>);
11
+ export declare class LibSqlMikroORM<EM extends SqlEntityManager<LibSqlDriver> = SqlEntityManager<LibSqlDriver>, Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]> extends MikroORM<LibSqlDriver, EM, Entities> {
12
+ /**
13
+ * @inheritDoc
14
+ */
15
+ static init<D extends IDatabaseDriver = LibSqlDriver, EM extends EntityManager<D> = D[typeof EntityManagerType] & EntityManager<D>, Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]>(options: Partial<Options<D, EM, Entities>>): Promise<MikroORM<D, EM, Entities>>;
16
+ /**
17
+ * @inheritDoc
18
+ */
19
+ constructor(options: Partial<Options<LibSqlDriver, EM, Entities>>);
58
20
  }
package/LibSqlMikroORM.js CHANGED
@@ -1,23 +1,23 @@
1
- import { defineConfig, MikroORM } from '@mikro-orm/core';
1
+ import { defineConfig, MikroORM, } from '@mikro-orm/core';
2
2
  import { LibSqlDriver } from './LibSqlDriver.js';
3
3
  /** Creates a type-safe configuration object for the libSQL driver. */
4
4
  export function defineLibSqlConfig(options) {
5
- return defineConfig({ driver: LibSqlDriver, ...options });
5
+ return defineConfig({ driver: LibSqlDriver, ...options });
6
6
  }
7
7
  /**
8
8
  * @inheritDoc
9
9
  */
10
10
  export class LibSqlMikroORM extends MikroORM {
11
- /**
12
- * @inheritDoc
13
- */
14
- static async init(options) {
15
- return super.init(defineLibSqlConfig(options));
16
- }
17
- /**
18
- * @inheritDoc
19
- */
20
- constructor(options) {
21
- super(defineLibSqlConfig(options));
22
- }
11
+ /**
12
+ * @inheritDoc
13
+ */
14
+ static async init(options) {
15
+ return super.init(defineLibSqlConfig(options));
16
+ }
17
+ /**
18
+ * @inheritDoc
19
+ */
20
+ constructor(options) {
21
+ super(defineLibSqlConfig(options));
22
+ }
23
23
  }
package/README.md CHANGED
@@ -133,7 +133,7 @@ const author = await em.findOneOrFail(Author, 1, {
133
133
  populate: ['books'],
134
134
  });
135
135
  author.name = 'Jon Snow II';
136
- author.books.getItems().forEach(book => (book.title += ' (2nd ed.)'));
136
+ author.books.getItems().forEach(book => book.title += ' (2nd ed.)');
137
137
  author.books.add(orm.em.create(Book, { title: 'New Book', author }));
138
138
 
139
139
  // Flush computes change sets and executes them in a single transaction
package/index.d.ts CHANGED
@@ -1,8 +1,4 @@
1
1
  export * from '@mikro-orm/sql';
2
2
  export * from './LibSqlConnection.js';
3
3
  export * from './LibSqlDriver.js';
4
- export {
5
- LibSqlMikroORM as MikroORM,
6
- type LibSqlOptions as Options,
7
- defineLibSqlConfig as defineConfig,
8
- } from './LibSqlMikroORM.js';
4
+ export { LibSqlMikroORM as MikroORM, type LibSqlOptions as Options, defineLibSqlConfig as defineConfig, } from './LibSqlMikroORM.js';
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from '@mikro-orm/sql';
2
2
  export * from './LibSqlConnection.js';
3
3
  export * from './LibSqlDriver.js';
4
- export { LibSqlMikroORM as MikroORM, defineLibSqlConfig as defineConfig } from './LibSqlMikroORM.js';
4
+ export { LibSqlMikroORM as MikroORM, defineLibSqlConfig as defineConfig, } from './LibSqlMikroORM.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikro-orm/libsql",
3
- "version": "7.0.4",
3
+ "version": "7.0.5-dev.0",
4
4
  "description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
5
5
  "keywords": [
6
6
  "data-mapper",
@@ -47,7 +47,7 @@
47
47
  "copy": "node ../../scripts/copy.mjs"
48
48
  },
49
49
  "dependencies": {
50
- "@mikro-orm/sql": "7.0.4",
50
+ "@mikro-orm/sql": "7.0.5-dev.0",
51
51
  "kysely": "0.28.13",
52
52
  "libsql": "0.5.28"
53
53
  },
@@ -55,7 +55,7 @@
55
55
  "@mikro-orm/core": "^7.0.4"
56
56
  },
57
57
  "peerDependencies": {
58
- "@mikro-orm/core": "7.0.4"
58
+ "@mikro-orm/core": "7.0.5-dev.0"
59
59
  },
60
60
  "engines": {
61
61
  "node": ">= 22.17.0"