@rwillians/qx 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/cjs/bun-sqlite.js +3 -3
- package/dist/cjs/experimental-migration.js +34 -0
- package/dist/cjs/index.js +10 -1
- package/dist/cjs/pretty-logger.js +3 -1
- package/dist/esm/bun-sqlite.js +3 -3
- package/dist/esm/experimental-migration.js +30 -0
- package/dist/esm/index.js +10 -1
- package/dist/esm/pretty-logger.js +3 -1
- package/dist/types/experimental-migration.d.ts +14 -0
- package/dist/types/index.d.ts +16 -2
- package/package.json +8 -1
package/dist/cjs/bun-sqlite.js
CHANGED
|
@@ -442,7 +442,7 @@ class BunSQLite {
|
|
|
442
442
|
*/
|
|
443
443
|
async createTable(op) {
|
|
444
444
|
const { sql } = ddl.createTable(op);
|
|
445
|
-
this.loggers.forEach(logger => logger.debug(sql, []));
|
|
445
|
+
this.loggers.forEach(logger => logger.query.debug(sql, []));
|
|
446
446
|
this.conn.run(sql);
|
|
447
447
|
}
|
|
448
448
|
/**
|
|
@@ -456,7 +456,7 @@ class BunSQLite {
|
|
|
456
456
|
records: op.records.map(createEncoder(op.insertShape)),
|
|
457
457
|
insertShape: u.mapKeys(op.insertShape, u.snakeCase),
|
|
458
458
|
});
|
|
459
|
-
this.loggers.forEach(logger => logger.debug(sql, params));
|
|
459
|
+
this.loggers.forEach(logger => logger.query.debug(sql, params));
|
|
460
460
|
const stmt = this.conn.prepare(sql);
|
|
461
461
|
const rows = stmt.all(...params);
|
|
462
462
|
return rows.map(createDecoder(op.returnShape));
|
|
@@ -468,7 +468,7 @@ class BunSQLite {
|
|
|
468
468
|
*/
|
|
469
469
|
async query(op) {
|
|
470
470
|
const { sql, params } = ddl.select(op);
|
|
471
|
-
this.loggers.forEach(logger => logger.debug(sql, params));
|
|
471
|
+
this.loggers.forEach(logger => logger.query.debug(sql, params));
|
|
472
472
|
const stmt = this.conn.prepare(sql);
|
|
473
473
|
const rows = stmt.all(...params);
|
|
474
474
|
return rows.map(createDecoder(op.select));
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defineMigrations = void 0;
|
|
4
|
+
const ora_1 = require("ora");
|
|
5
|
+
const index_1 = require("./index");
|
|
6
|
+
const migrations = (0, index_1.table)('migrations', t => ({
|
|
7
|
+
id: t.string({ size: 36 }).primaryKey(),
|
|
8
|
+
migratedAt: t.datetime(),
|
|
9
|
+
}));
|
|
10
|
+
/**
|
|
11
|
+
* @public Defines and runs migrations against the given database.
|
|
12
|
+
* @since 0.1.6
|
|
13
|
+
* @version 1
|
|
14
|
+
*/
|
|
15
|
+
const defineMigrations = (migs) => async (db) => {
|
|
16
|
+
let spinner;
|
|
17
|
+
await index_1.create.table(migrations, { ifNotExists: true }).onto(db);
|
|
18
|
+
for (const [id, migration] of Object.entries(migs)) {
|
|
19
|
+
const alreadyMigrated = await (0, index_1.from)(migrations.as('m'))
|
|
20
|
+
.where(({ m }) => index_1.expr.eq(m.id, id))
|
|
21
|
+
.exists(db);
|
|
22
|
+
if (alreadyMigrated)
|
|
23
|
+
continue;
|
|
24
|
+
spinner ??= (0, ora_1.default)('running migrations...').start();
|
|
25
|
+
spinner.text = `running migration ${id}...`;
|
|
26
|
+
// @TODO run in a transaction
|
|
27
|
+
await migration(db);
|
|
28
|
+
await (0, index_1.into)(migrations)
|
|
29
|
+
.insert({ id, migratedAt: new Date() })
|
|
30
|
+
.run(db);
|
|
31
|
+
}
|
|
32
|
+
spinner?.stop();
|
|
33
|
+
};
|
|
34
|
+
exports.defineMigrations = defineMigrations;
|
package/dist/cjs/index.js
CHANGED
|
@@ -440,7 +440,6 @@ const is = {
|
|
|
440
440
|
};
|
|
441
441
|
exports.is = is;
|
|
442
442
|
;
|
|
443
|
-
;
|
|
444
443
|
// // // // // // // // // // // // // // // // // // // // // // // //
|
|
445
444
|
// CREATE STATEMENTS //
|
|
446
445
|
// // // // // // // // // // // // // // // // // // // // // // // //
|
|
@@ -600,6 +599,16 @@ class QueryBuilder {
|
|
|
600
599
|
// @TODO calls query engine with the query object
|
|
601
600
|
return db.query(toSelectStatement(this.query));
|
|
602
601
|
}
|
|
602
|
+
/**
|
|
603
|
+
* @public Checks whether any rows exist matching the query.
|
|
604
|
+
* @since 0.1.6
|
|
605
|
+
* @version 1
|
|
606
|
+
*/
|
|
607
|
+
async exists(db) {
|
|
608
|
+
// @TODO optimize this, maybe do a SELECT 1 or something
|
|
609
|
+
const results = await db.query(toSelectStatement({ ...this.query, limit: 1, offset: 0 }));
|
|
610
|
+
return results.length > 0;
|
|
611
|
+
}
|
|
603
612
|
/**
|
|
604
613
|
* @public Sets a limit on the number of rows to be returned.
|
|
605
614
|
* @since 0.1.0
|
|
@@ -9,6 +9,8 @@ const sql_highlight_1 = require("sql-highlight");
|
|
|
9
9
|
* @version 1
|
|
10
10
|
*/
|
|
11
11
|
const createPrettyLogger = () => ({
|
|
12
|
-
|
|
12
|
+
query: {
|
|
13
|
+
debug: (sql, params) => { process.stdout.write((0, sql_highlight_1.highlight)(sql) + ' ' + (0, node_util_1.inspect)(params, false, null, true) + '\n'); },
|
|
14
|
+
},
|
|
13
15
|
});
|
|
14
16
|
exports.createPrettyLogger = createPrettyLogger;
|
package/dist/esm/bun-sqlite.js
CHANGED
|
@@ -439,7 +439,7 @@ class BunSQLite {
|
|
|
439
439
|
*/
|
|
440
440
|
async createTable(op) {
|
|
441
441
|
const { sql } = ddl.createTable(op);
|
|
442
|
-
this.loggers.forEach(logger => logger.debug(sql, []));
|
|
442
|
+
this.loggers.forEach(logger => logger.query.debug(sql, []));
|
|
443
443
|
this.conn.run(sql);
|
|
444
444
|
}
|
|
445
445
|
/**
|
|
@@ -453,7 +453,7 @@ class BunSQLite {
|
|
|
453
453
|
records: op.records.map(createEncoder(op.insertShape)),
|
|
454
454
|
insertShape: u.mapKeys(op.insertShape, u.snakeCase),
|
|
455
455
|
});
|
|
456
|
-
this.loggers.forEach(logger => logger.debug(sql, params));
|
|
456
|
+
this.loggers.forEach(logger => logger.query.debug(sql, params));
|
|
457
457
|
const stmt = this.conn.prepare(sql);
|
|
458
458
|
const rows = stmt.all(...params);
|
|
459
459
|
return rows.map(createDecoder(op.returnShape));
|
|
@@ -465,7 +465,7 @@ class BunSQLite {
|
|
|
465
465
|
*/
|
|
466
466
|
async query(op) {
|
|
467
467
|
const { sql, params } = ddl.select(op);
|
|
468
|
-
this.loggers.forEach(logger => logger.debug(sql, params));
|
|
468
|
+
this.loggers.forEach(logger => logger.query.debug(sql, params));
|
|
469
469
|
const stmt = this.conn.prepare(sql);
|
|
470
470
|
const rows = stmt.all(...params);
|
|
471
471
|
return rows.map(createDecoder(op.select));
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import ora from 'ora';
|
|
2
|
+
import { create, expr, from, into, table } from './index';
|
|
3
|
+
const migrations = table('migrations', t => ({
|
|
4
|
+
id: t.string({ size: 36 }).primaryKey(),
|
|
5
|
+
migratedAt: t.datetime(),
|
|
6
|
+
}));
|
|
7
|
+
/**
|
|
8
|
+
* @public Defines and runs migrations against the given database.
|
|
9
|
+
* @since 0.1.6
|
|
10
|
+
* @version 1
|
|
11
|
+
*/
|
|
12
|
+
export const defineMigrations = (migs) => async (db) => {
|
|
13
|
+
let spinner;
|
|
14
|
+
await create.table(migrations, { ifNotExists: true }).onto(db);
|
|
15
|
+
for (const [id, migration] of Object.entries(migs)) {
|
|
16
|
+
const alreadyMigrated = await from(migrations.as('m'))
|
|
17
|
+
.where(({ m }) => expr.eq(m.id, id))
|
|
18
|
+
.exists(db);
|
|
19
|
+
if (alreadyMigrated)
|
|
20
|
+
continue;
|
|
21
|
+
spinner ??= ora('running migrations...').start();
|
|
22
|
+
spinner.text = `running migration ${id}...`;
|
|
23
|
+
// @TODO run in a transaction
|
|
24
|
+
await migration(db);
|
|
25
|
+
await into(migrations)
|
|
26
|
+
.insert({ id, migratedAt: new Date() })
|
|
27
|
+
.run(db);
|
|
28
|
+
}
|
|
29
|
+
spinner?.stop();
|
|
30
|
+
};
|
package/dist/esm/index.js
CHANGED
|
@@ -433,7 +433,6 @@ const is = {
|
|
|
433
433
|
column: (expr) => u.isPlainObject(expr) && 'type' in expr && 'schema' in expr,
|
|
434
434
|
};
|
|
435
435
|
;
|
|
436
|
-
;
|
|
437
436
|
// // // // // // // // // // // // // // // // // // // // // // // //
|
|
438
437
|
// CREATE STATEMENTS //
|
|
439
438
|
// // // // // // // // // // // // // // // // // // // // // // // //
|
|
@@ -591,6 +590,16 @@ class QueryBuilder {
|
|
|
591
590
|
// @TODO calls query engine with the query object
|
|
592
591
|
return db.query(toSelectStatement(this.query));
|
|
593
592
|
}
|
|
593
|
+
/**
|
|
594
|
+
* @public Checks whether any rows exist matching the query.
|
|
595
|
+
* @since 0.1.6
|
|
596
|
+
* @version 1
|
|
597
|
+
*/
|
|
598
|
+
async exists(db) {
|
|
599
|
+
// @TODO optimize this, maybe do a SELECT 1 or something
|
|
600
|
+
const results = await db.query(toSelectStatement({ ...this.query, limit: 1, offset: 0 }));
|
|
601
|
+
return results.length > 0;
|
|
602
|
+
}
|
|
594
603
|
/**
|
|
595
604
|
* @public Sets a limit on the number of rows to be returned.
|
|
596
605
|
* @since 0.1.0
|
|
@@ -7,5 +7,7 @@ import {} from './index';
|
|
|
7
7
|
* @version 1
|
|
8
8
|
*/
|
|
9
9
|
export const createPrettyLogger = () => ({
|
|
10
|
-
|
|
10
|
+
query: {
|
|
11
|
+
debug: (sql, params) => { process.stdout.write(highlight(sql) + ' ' + inspect(params, false, null, true) + '\n'); },
|
|
12
|
+
},
|
|
11
13
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type IDatabase } from './index';
|
|
2
|
+
/**
|
|
3
|
+
* @private Defines the type for a migration function.
|
|
4
|
+
* @since 0.1.6
|
|
5
|
+
* @version 1
|
|
6
|
+
*/
|
|
7
|
+
type Migration = (db: IDatabase) => Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* @public Defines and runs migrations against the given database.
|
|
10
|
+
* @since 0.1.6
|
|
11
|
+
* @version 1
|
|
12
|
+
*/
|
|
13
|
+
export declare const defineMigrations: (migs: Record<string, Migration>) => (db: IDatabase) => Promise<void>;
|
|
14
|
+
export {};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -964,11 +964,19 @@ type DDL = {
|
|
|
964
964
|
*/
|
|
965
965
|
interface ILogger {
|
|
966
966
|
/**
|
|
967
|
-
* @public
|
|
967
|
+
* @public Query specific logging methods, so this interface plays
|
|
968
|
+
* nice with existing logging libraries (by extending them).
|
|
968
969
|
* @since 0.1.0
|
|
969
970
|
* @version 1
|
|
970
971
|
*/
|
|
971
|
-
|
|
972
|
+
query: {
|
|
973
|
+
/**
|
|
974
|
+
* @public Logs a query that has executed successfully.
|
|
975
|
+
* @since 0.1.0
|
|
976
|
+
* @version 1
|
|
977
|
+
*/
|
|
978
|
+
debug(sql: string, params: any[]): void;
|
|
979
|
+
};
|
|
972
980
|
}
|
|
973
981
|
/**
|
|
974
982
|
* @public The interface that all database adapters must implement.
|
|
@@ -1133,6 +1141,12 @@ declare class QueryBuilder<T extends Record<string, Aliased<string, Table>>, S e
|
|
|
1133
1141
|
* @version 1
|
|
1134
1142
|
*/
|
|
1135
1143
|
all(db: IDatabase): Promise<Expand<InferSelection<Query<T, S>>>[]>;
|
|
1144
|
+
/**
|
|
1145
|
+
* @public Checks whether any rows exist matching the query.
|
|
1146
|
+
* @since 0.1.6
|
|
1147
|
+
* @version 1
|
|
1148
|
+
*/
|
|
1149
|
+
exists(db: IDatabase): Promise<boolean>;
|
|
1136
1150
|
/**
|
|
1137
1151
|
* @public Sets a limit on the number of rows to be returned.
|
|
1138
1152
|
* @since 0.1.0
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rwillians/qx",
|
|
3
3
|
"description": "A teeny tiny ORM for SQLite.",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.7",
|
|
5
5
|
"author": "Rafael Willians <me@rwillians.com>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -41,6 +41,12 @@
|
|
|
41
41
|
"import": "./dist/esm/pretty-logger.js",
|
|
42
42
|
"require": "./dist/cjs/pretty-logger.js",
|
|
43
43
|
"default": "./dist/cjs/pretty-logger.js"
|
|
44
|
+
},
|
|
45
|
+
"./experimental-migration": {
|
|
46
|
+
"types": "./dist/types/experimental-migration.d.ts",
|
|
47
|
+
"import": "./dist/esm/experimental-migration.js",
|
|
48
|
+
"require": "./dist/cjs/experimental-migration.js",
|
|
49
|
+
"default": "./dist/cjs/experimental-migration.js"
|
|
44
50
|
}
|
|
45
51
|
},
|
|
46
52
|
"scripts": {
|
|
@@ -50,6 +56,7 @@
|
|
|
50
56
|
},
|
|
51
57
|
"dependencies": {
|
|
52
58
|
"@standard-schema/spec": "^1.0.0",
|
|
59
|
+
"ora": "^9.0.0",
|
|
53
60
|
"sql-highlight": "^6.1.0"
|
|
54
61
|
},
|
|
55
62
|
"devDependencies": {
|