pqb 0.73.2 → 0.73.4
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/bun.js +3 -3
- package/dist/bun.js.map +1 -1
- package/dist/bun.mjs +3 -3
- package/dist/bun.mjs.map +1 -1
- package/dist/index.d.ts +7715 -7716
- package/dist/index.js +123 -112
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +123 -113
- package/dist/index.mjs.map +1 -1
- package/dist/internal.d.ts +35 -33
- package/dist/internal.js +33 -9
- package/dist/internal.js.map +1 -1
- package/dist/internal.mjs +29 -11
- package/dist/internal.mjs.map +1 -1
- package/dist/node-postgres.js +20 -3
- package/dist/node-postgres.js.map +1 -1
- package/dist/node-postgres.mjs +20 -3
- package/dist/node-postgres.mjs.map +1 -1
- package/dist/postgres-js.js +4 -4
- package/dist/postgres-js.js.map +1 -1
- package/dist/postgres-js.mjs +4 -4
- package/dist/postgres-js.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -349,6 +349,17 @@ const templateLiteralSQLToCode = (sql) => {
|
|
|
349
349
|
code += parts[i];
|
|
350
350
|
return code + "`";
|
|
351
351
|
};
|
|
352
|
+
var ValExpression = class extends Expression {
|
|
353
|
+
constructor(value) {
|
|
354
|
+
super();
|
|
355
|
+
this.value = value;
|
|
356
|
+
this.result = { value: emptyObject };
|
|
357
|
+
this.q = { expr: this };
|
|
358
|
+
}
|
|
359
|
+
makeSQL(ctx) {
|
|
360
|
+
return addValue(ctx.values, this.value);
|
|
361
|
+
}
|
|
362
|
+
};
|
|
352
363
|
var SqlJoinExpression = class extends Expression {
|
|
353
364
|
constructor(items, separator) {
|
|
354
365
|
super();
|
|
@@ -499,6 +510,7 @@ const sqlFn = ((...args) => {
|
|
|
499
510
|
sqlFn.ref = (name) => new SqlRefExpression(name);
|
|
500
511
|
sqlFn.join = (items, separator) => new SqlJoinExpression(items, separator);
|
|
501
512
|
sqlFn.unsafe = (sql) => new UnsafeSqlExpression(sql);
|
|
513
|
+
sqlFn.val = (value) => new ValExpression(value);
|
|
502
514
|
var UnsafeSqlExpression = class extends Expression {
|
|
503
515
|
constructor(sql) {
|
|
504
516
|
super();
|
|
@@ -4124,6 +4136,81 @@ const getResetSetConfigSql = (parentSetConfig, options) => {
|
|
|
4124
4136
|
const setConfigSql = (key, value) => {
|
|
4125
4137
|
return `set_config('${key.replace(/'/g, "''")}', '${typeof value === "string" ? value.replace(/'/g, "''") : value === void 0 ? "" : value}', true)`;
|
|
4126
4138
|
};
|
|
4139
|
+
var Rollback = class extends Error {};
|
|
4140
|
+
const trxForTest = Symbol("trxForTest");
|
|
4141
|
+
const argToDb = (arg) => "$qb" in arg ? arg.$qb : arg;
|
|
4142
|
+
const testTransaction = {
|
|
4143
|
+
/**
|
|
4144
|
+
* Start a test transaction.
|
|
4145
|
+
* The returned promise is resolved immediately when transaction starts, not waiting for it to end.
|
|
4146
|
+
*
|
|
4147
|
+
* @param arg - ORM instance or a queryable instance (such as db.someTable).
|
|
4148
|
+
*/
|
|
4149
|
+
start(arg) {
|
|
4150
|
+
const db = argToDb(arg);
|
|
4151
|
+
const { asyncStorage } = db.internal;
|
|
4152
|
+
const { getStore } = asyncStorage;
|
|
4153
|
+
const { adapter } = db.baseQuery.q;
|
|
4154
|
+
const data = { adapter: {
|
|
4155
|
+
query: adapter.query,
|
|
4156
|
+
arrays: adapter.arrays,
|
|
4157
|
+
transaction: adapter.transaction
|
|
4158
|
+
} };
|
|
4159
|
+
(db.internal[trxForTest] ??= []).push(data);
|
|
4160
|
+
return new Promise((resolve) => {
|
|
4161
|
+
data.promise = db.transaction(() => {
|
|
4162
|
+
resolve();
|
|
4163
|
+
return new Promise((_, rej) => {
|
|
4164
|
+
const state = asyncStorage.getStore();
|
|
4165
|
+
db.internal.asyncStorage.getStore = () => state;
|
|
4166
|
+
const t = state?.transactionAdapter;
|
|
4167
|
+
if (t) {
|
|
4168
|
+
adapter.query = t.query.bind(t);
|
|
4169
|
+
adapter.arrays = t.arrays.bind(t);
|
|
4170
|
+
adapter.transaction = t.transaction.bind(t);
|
|
4171
|
+
state.testTransactionCount = state.testTransactionCount ? state.testTransactionCount + 1 : 1;
|
|
4172
|
+
}
|
|
4173
|
+
data.reject = rej;
|
|
4174
|
+
});
|
|
4175
|
+
}).catch((err) => {
|
|
4176
|
+
if (!(err instanceof Rollback)) throw err;
|
|
4177
|
+
}).finally(() => {
|
|
4178
|
+
const state = db.internal.asyncStorage.getStore();
|
|
4179
|
+
if (state?.testTransactionCount) state.testTransactionCount--;
|
|
4180
|
+
db.internal.asyncStorage.getStore = getStore;
|
|
4181
|
+
});
|
|
4182
|
+
});
|
|
4183
|
+
},
|
|
4184
|
+
/**
|
|
4185
|
+
* Rollback a test transaction.
|
|
4186
|
+
*
|
|
4187
|
+
* @param arg - the same ORM or query argument passed into the `testTransaction.start`.
|
|
4188
|
+
*/
|
|
4189
|
+
rollback(arg) {
|
|
4190
|
+
const db = argToDb(arg);
|
|
4191
|
+
const data = db.internal[trxForTest];
|
|
4192
|
+
const last = data?.pop();
|
|
4193
|
+
if (!last) return;
|
|
4194
|
+
if (!data?.length) Object.assign(db.baseQuery.q.adapter, last.adapter);
|
|
4195
|
+
last.reject?.(new Rollback());
|
|
4196
|
+
return last.promise;
|
|
4197
|
+
},
|
|
4198
|
+
/**
|
|
4199
|
+
* Will roll back the current `testTransaction` (won't have any effect if it was rolled back already),
|
|
4200
|
+
* and if there's no nested test transactions left, it will close the db connection.
|
|
4201
|
+
*
|
|
4202
|
+
* @param arg - the same ORM or query argument passed into the `testTransaction.start`.
|
|
4203
|
+
*/
|
|
4204
|
+
async close(arg) {
|
|
4205
|
+
const db = argToDb(arg);
|
|
4206
|
+
await this.rollback(db);
|
|
4207
|
+
if (db.internal[trxForTest]?.length === 0) return db.q.adapter.close();
|
|
4208
|
+
}
|
|
4209
|
+
};
|
|
4210
|
+
const logSavepointRollback = (log, error, rollbackSql, rollbackLogData) => {
|
|
4211
|
+
if (error instanceof Rollback) log.afterQuery(rollbackSql, rollbackLogData);
|
|
4212
|
+
else if (error) log.onError(error, rollbackSql, rollbackLogData);
|
|
4213
|
+
};
|
|
4127
4214
|
/**
|
|
4128
4215
|
* Shared runtime adapter orchestrator over a driver-specific adapter implementation.
|
|
4129
4216
|
*/
|
|
@@ -4149,11 +4236,11 @@ var AdapterClass = class AdapterClass {
|
|
|
4149
4236
|
this.pool = this.driverAdapter.configure(this.config);
|
|
4150
4237
|
this.errorClass = this.driverAdapter.errorClass;
|
|
4151
4238
|
}
|
|
4152
|
-
query(text, values, sqlSessionState) {
|
|
4153
|
-
return runQueryHandlePool(this.pool, this.driverAdapter, text, values, sqlSessionState);
|
|
4239
|
+
query(text, values, sqlSessionState, prepare) {
|
|
4240
|
+
return runQueryHandlePool(this.pool, this.driverAdapter, text, values, sqlSessionState, void 0, prepare);
|
|
4154
4241
|
}
|
|
4155
|
-
arrays(text, values, sqlSessionState) {
|
|
4156
|
-
return runQueryHandlePool(this.pool, this.driverAdapter, text, values, sqlSessionState, true);
|
|
4242
|
+
arrays(text, values, sqlSessionState, prepare) {
|
|
4243
|
+
return runQueryHandlePool(this.pool, this.driverAdapter, text, values, sqlSessionState, true, prepare);
|
|
4157
4244
|
}
|
|
4158
4245
|
clone(params) {
|
|
4159
4246
|
return new AdapterClass({
|
|
@@ -4197,13 +4284,13 @@ var TransactionAdapterClass = class {
|
|
|
4197
4284
|
this.driverAdapter = adapter.driverAdapter;
|
|
4198
4285
|
this.errorClass = this.adapter.errorClass;
|
|
4199
4286
|
}
|
|
4200
|
-
query(text, values, sqlSessionState) {
|
|
4287
|
+
query(text, values, sqlSessionState, prepare) {
|
|
4201
4288
|
const setup = sqlSessionContextComputeSetup(sqlSessionState);
|
|
4202
|
-
return runQueryHandleSetupAndCleanup(this.driverAdapter, this.client, text, values, setup);
|
|
4289
|
+
return runQueryHandleSetupAndCleanup(this.driverAdapter, this.client, text, values, setup, void 0, prepare);
|
|
4203
4290
|
}
|
|
4204
|
-
arrays(text, values, sqlSessionState) {
|
|
4291
|
+
arrays(text, values, sqlSessionState, prepare) {
|
|
4205
4292
|
const setup = sqlSessionContextComputeSetup(sqlSessionState);
|
|
4206
|
-
return runQueryHandleSetupAndCleanup(this.driverAdapter, this.client, text, values, setup, true);
|
|
4293
|
+
return runQueryHandleSetupAndCleanup(this.driverAdapter, this.client, text, values, setup, true, prepare);
|
|
4207
4294
|
}
|
|
4208
4295
|
clone(params) {
|
|
4209
4296
|
return this.adapter.clone(params);
|
|
@@ -4256,13 +4343,13 @@ var TransactionAdapterClass = class {
|
|
|
4256
4343
|
rollbackSql = { text: `ROLLBACK TO SAVEPOINT "${name}"` };
|
|
4257
4344
|
rollbackLogData = log.beforeQuery(rollbackSql);
|
|
4258
4345
|
}, () => {
|
|
4259
|
-
|
|
4346
|
+
logSavepointRollback(log, error, rollbackSql, rollbackLogData);
|
|
4260
4347
|
});
|
|
4261
4348
|
}
|
|
4262
|
-
hackySavepoint(state, text, values, arraysMode, log) {
|
|
4349
|
+
hackySavepoint(state, text, values, arraysMode, prepare, log) {
|
|
4263
4350
|
if (!log) return this.driverAdapter.hackySavepoint(this.client, (client) => {
|
|
4264
4351
|
this.client = client;
|
|
4265
|
-
}, state, text, values, arraysMode);
|
|
4352
|
+
}, state, text, values, arraysMode, prepare);
|
|
4266
4353
|
const savepointSql = { text: `SAVEPOINT "${state.name}"` };
|
|
4267
4354
|
const savepointLogData = log.beforeQuery(savepointSql);
|
|
4268
4355
|
let releaseSql;
|
|
@@ -4272,14 +4359,14 @@ var TransactionAdapterClass = class {
|
|
|
4272
4359
|
let error;
|
|
4273
4360
|
const result = this.driverAdapter.hackySavepoint(this.client, (client) => {
|
|
4274
4361
|
this.client = client;
|
|
4275
|
-
}, state, text, values, arraysMode, () => log.afterQuery(savepointSql, savepointLogData), () => {
|
|
4362
|
+
}, state, text, values, arraysMode, prepare, () => log.afterQuery(savepointSql, savepointLogData), () => {
|
|
4276
4363
|
releaseSql = { text: `RELEASE SAVEPOINT "${state.name}"` };
|
|
4277
4364
|
releaseLogData = log.beforeQuery(releaseSql);
|
|
4278
4365
|
}, () => log.afterQuery(releaseSql, releaseLogData), () => {
|
|
4279
4366
|
rollbackSql = { text: `ROLLBACK TO SAVEPOINT "${state.name}"` };
|
|
4280
4367
|
rollbackLogData = log.beforeQuery(rollbackSql);
|
|
4281
4368
|
}, () => {
|
|
4282
|
-
|
|
4369
|
+
logSavepointRollback(log, error, rollbackSql, rollbackLogData);
|
|
4283
4370
|
});
|
|
4284
4371
|
const activeSavepoint = state.activeSavepoint;
|
|
4285
4372
|
if (activeSavepoint) {
|
|
@@ -4447,18 +4534,18 @@ const runAfterCommit = (afterCommit, result) => {
|
|
|
4447
4534
|
}
|
|
4448
4535
|
});
|
|
4449
4536
|
};
|
|
4450
|
-
const runQueryHandlePool = async (pool, driverAdapter, text, values, sqlSessionState, arraysMode, client) => {
|
|
4537
|
+
const runQueryHandlePool = async (pool, driverAdapter, text, values, sqlSessionState, arraysMode, prepare, client) => {
|
|
4451
4538
|
const setup = sqlSessionContextComputeSetup(sqlSessionState);
|
|
4452
|
-
if (client || !driverAdapter.manualPool && !setup) return runQueryHandleSetupAndCleanup(driverAdapter, client || pool, text, values, setup, arraysMode);
|
|
4539
|
+
if (client || !driverAdapter.manualPool && !setup) return runQueryHandleSetupAndCleanup(driverAdapter, client || pool, text, values, setup, arraysMode, prepare);
|
|
4453
4540
|
client = await driverAdapter.borrow(pool);
|
|
4454
4541
|
try {
|
|
4455
|
-
return await runQueryHandleSetupAndCleanup(driverAdapter, client, text, values, setup, arraysMode);
|
|
4542
|
+
return await runQueryHandleSetupAndCleanup(driverAdapter, client, text, values, setup, arraysMode, prepare);
|
|
4456
4543
|
} finally {
|
|
4457
4544
|
driverAdapter.release(client);
|
|
4458
4545
|
}
|
|
4459
4546
|
};
|
|
4460
|
-
const runQueryHandleSetupAndCleanup = (driverAdapter, client, text, values, setup, arraysMode) => {
|
|
4461
|
-
const mainQuery = () => driverAdapter.queryClient(client, text, values, arraysMode);
|
|
4547
|
+
const runQueryHandleSetupAndCleanup = (driverAdapter, client, text, values, setup, arraysMode, prepare) => {
|
|
4548
|
+
const mainQuery = () => driverAdapter.queryClient(client, text, values, arraysMode, prepare);
|
|
4462
4549
|
if (setup) return sqlSessionContextExecute((text, values) => driverAdapter.queryClient(client, text, values, true), setup, mainQuery);
|
|
4463
4550
|
return mainQuery();
|
|
4464
4551
|
};
|
|
@@ -4773,8 +4860,6 @@ function maybeWrappedThen(resolve, reject, parentSavepoint) {
|
|
|
4773
4860
|
})).then(resolve, reject);
|
|
4774
4861
|
else return then(this, state?.transactionAdapter || this.q.adapter, state, beforeHooks, afterHooks, afterSaveHooks, afterCommitHooks, afterSaveCommitHooks, resolve, reject, shouldCatch, parentSavepoint);
|
|
4775
4862
|
}
|
|
4776
|
-
const queriesNames = {};
|
|
4777
|
-
let nameI = 0;
|
|
4778
4863
|
const callAfterHook = function(cb) {
|
|
4779
4864
|
return cb(this[0], this[1]);
|
|
4780
4865
|
};
|
|
@@ -4806,7 +4891,7 @@ const then = async (q, adapter, state, beforeHooks, afterHooks, afterSaveHooks,
|
|
|
4806
4891
|
const startingSavepoint = setCatchingSavepoint(!parentSavepoint && shouldCatch && state);
|
|
4807
4892
|
const releasingSavepoint = checkIfShouldReleaseSavepointForMutativeQueriesSelectRelations(sql) || parentSavepoint ? void 0 : parentSavepoint || startingSavepoint;
|
|
4808
4893
|
if ("text" in sql) {
|
|
4809
|
-
if (query.autoPreparedStatements) sql.
|
|
4894
|
+
if (query.autoPreparedStatements) sql.prepare = true;
|
|
4810
4895
|
if (log) logData = log.beforeQuery(sql);
|
|
4811
4896
|
const method = queryMethodByReturnType[tempReturnType];
|
|
4812
4897
|
queryResult = await execQuery(adapter, method, sql, log, startingSavepoint, releasingSavepoint, sqlSessionContextGetStateFromAsyncState(state));
|
|
@@ -5040,12 +5125,13 @@ const setCatchingSavepoint = (catchTrx) => {
|
|
|
5040
5125
|
* because user might expect empty objects to be returned for an empty select.
|
|
5041
5126
|
*/
|
|
5042
5127
|
const execQuery = (adapter, method, sql, log, startingSavepoint, releasingSavepoint, sqlSessionState) => {
|
|
5128
|
+
const prepare = sql.prepare;
|
|
5043
5129
|
let promise;
|
|
5044
5130
|
if (startingSavepoint) if (releasingSavepoint) promise = startingSavepoint.transactionAdapter.savepoint(startingSavepoint.name, log, () => {
|
|
5045
|
-
return promise = adapter[method](sql.text, sql.values, sqlSessionState);
|
|
5131
|
+
return prepare ? promise = adapter[method](sql.text, sql.values, sqlSessionState, prepare) : promise = adapter[method](sql.text, sql.values, sqlSessionState);
|
|
5046
5132
|
});
|
|
5047
|
-
else promise = startingSavepoint.transactionAdapter.hackySavepoint(startingSavepoint, sql.text, sql.values, method === "arrays", log);
|
|
5048
|
-
else promise = adapter[method](sql.text, sql.values, sqlSessionState);
|
|
5133
|
+
else promise = prepare ? startingSavepoint.transactionAdapter.hackySavepoint(startingSavepoint, sql.text, sql.values, method === "arrays", prepare, log) : startingSavepoint.transactionAdapter.hackySavepoint(startingSavepoint, sql.text, sql.values, method === "arrays", void 0, log);
|
|
5134
|
+
else promise = prepare ? adapter[method](sql.text, sql.values, sqlSessionState, prepare) : adapter[method](sql.text, sql.values, sqlSessionState);
|
|
5049
5135
|
if (!startingSavepoint && releasingSavepoint) promise = promise.then(async (res) => {
|
|
5050
5136
|
await releasingSavepoint.activeSavepoint?.release();
|
|
5051
5137
|
return res;
|
|
@@ -6861,6 +6947,7 @@ const _get = (query, returnType, arg) => {
|
|
|
6861
6947
|
const q = query.q;
|
|
6862
6948
|
if (q.returning) q.returning = void 0;
|
|
6863
6949
|
q.returnType = returnType;
|
|
6950
|
+
q.batchParsers = void 0;
|
|
6864
6951
|
let value = arg;
|
|
6865
6952
|
const selectAs = {};
|
|
6866
6953
|
let column;
|
|
@@ -11051,8 +11138,7 @@ const addParserForSelectItem = (query, as, key, arg, columnAlias, joinQuery) =>
|
|
|
11051
11138
|
}
|
|
11052
11139
|
return arg;
|
|
11053
11140
|
}
|
|
11054
|
-
|
|
11055
|
-
return setParserForSelectedString(query, joinedAs ? joinedAs + "." + arg : arg, as, key, columnAlias);
|
|
11141
|
+
return setParserForSelectedString(query, arg, as, key, columnAlias);
|
|
11056
11142
|
};
|
|
11057
11143
|
const collectNestedSelectBatches = (batches, rows, path) => {
|
|
11058
11144
|
const last = path.length - 1;
|
|
@@ -11099,7 +11185,8 @@ const processSelectAsArg = (q, selectAs, as, key, arg, columnAlias, outerReturnT
|
|
|
11099
11185
|
if (isExpression(value)) column = value.result.value;
|
|
11100
11186
|
else {
|
|
11101
11187
|
const isSelfReferencingQuery = value.q.subQuery === 1;
|
|
11102
|
-
|
|
11188
|
+
const isSelectingRelation = value.q.subQuery && value.q.subQuery > 1;
|
|
11189
|
+
if (isRelationQuery(value) && isSelectingRelation) {
|
|
11103
11190
|
joinQuery = true;
|
|
11104
11191
|
setSelectRelation(query.q);
|
|
11105
11192
|
value = value.joinQuery(value, q);
|
|
@@ -11144,6 +11231,12 @@ const processSelectAsArg = (q, selectAs, as, key, arg, columnAlias, outerReturnT
|
|
|
11144
11231
|
};
|
|
11145
11232
|
const setParserForSelectedString = (query, arg, as, columnAs, columnAlias) => {
|
|
11146
11233
|
const { q } = query;
|
|
11234
|
+
const joinedAs = q.valuesJoinedAs?.[arg];
|
|
11235
|
+
if (joinedAs) {
|
|
11236
|
+
const parser = q.joinedParsers?.[joinedAs]?.v;
|
|
11237
|
+
if (parser) setParserToQuery(q, columnAs || arg, parser);
|
|
11238
|
+
return joinedAs + "." + arg;
|
|
11239
|
+
}
|
|
11147
11240
|
const index = arg.indexOf(".");
|
|
11148
11241
|
if (index === -1) return selectColumn(query, q, arg, columnAs, columnAlias);
|
|
11149
11242
|
const table = getFullColumnTable(query, arg, index, as);
|
|
@@ -12433,17 +12526,6 @@ var OrExpression = class extends Expression {
|
|
|
12433
12526
|
}
|
|
12434
12527
|
};
|
|
12435
12528
|
Object.assign(OrExpression.prototype, Operators.boolean);
|
|
12436
|
-
var ValExpression = class extends Expression {
|
|
12437
|
-
constructor(value) {
|
|
12438
|
-
super();
|
|
12439
|
-
this.value = value;
|
|
12440
|
-
this.result = { value: emptyObject };
|
|
12441
|
-
this.q = { expr: this };
|
|
12442
|
-
}
|
|
12443
|
-
makeSQL(ctx) {
|
|
12444
|
-
return addValue(ctx.values, this.value);
|
|
12445
|
-
}
|
|
12446
|
-
};
|
|
12447
12529
|
var QueryExpressions = class {
|
|
12448
12530
|
/**
|
|
12449
12531
|
* `column` references a table column, this can be used in raw SQL or when building a column expression.
|
|
@@ -12513,9 +12595,6 @@ var QueryExpressions = class {
|
|
|
12513
12595
|
q.q.returnType = void 0;
|
|
12514
12596
|
return new RefExpression(column || UnknownColumn.instance, q, arg);
|
|
12515
12597
|
}
|
|
12516
|
-
val(value) {
|
|
12517
|
-
return new ValExpression(value);
|
|
12518
|
-
}
|
|
12519
12598
|
/**
|
|
12520
12599
|
* `fn` allows to call an arbitrary SQL function.
|
|
12521
12600
|
*
|
|
@@ -13104,6 +13183,7 @@ var QueryPluck = class {
|
|
|
13104
13183
|
pluck(select) {
|
|
13105
13184
|
const q = _clone(this);
|
|
13106
13185
|
q.q.returnType = "pluck";
|
|
13186
|
+
q.q.batchParsers = void 0;
|
|
13107
13187
|
let selected;
|
|
13108
13188
|
const selectAs = {};
|
|
13109
13189
|
const item = processSelectAsArg(q, selectAs, q.q.as || q.table, "pluck", select, void 0, "value");
|
|
@@ -14418,6 +14498,7 @@ function _createDbSqlMethod(columnTypes) {
|
|
|
14418
14498
|
fn.ref = sqlFn.ref;
|
|
14419
14499
|
fn.join = sqlFn.join;
|
|
14420
14500
|
fn.unsafe = sqlFn.unsafe;
|
|
14501
|
+
fn.val = sqlFn.val;
|
|
14421
14502
|
return fn;
|
|
14422
14503
|
}
|
|
14423
14504
|
const _initQueryBuilder = (adapter, columnTypes, asyncStorage, commonOptions, options) => {
|
|
@@ -14585,77 +14666,6 @@ function copyTableData(query, arg) {
|
|
|
14585
14666
|
q.toSQL = () => makeCopySql(q, arg);
|
|
14586
14667
|
return q;
|
|
14587
14668
|
}
|
|
14588
|
-
var Rollback = class extends Error {};
|
|
14589
|
-
const trxForTest = Symbol("trxForTest");
|
|
14590
|
-
const argToDb = (arg) => "$qb" in arg ? arg.$qb : arg;
|
|
14591
|
-
const testTransaction = {
|
|
14592
|
-
/**
|
|
14593
|
-
* Start a test transaction.
|
|
14594
|
-
* The returned promise is resolved immediately when transaction starts, not waiting for it to end.
|
|
14595
|
-
*
|
|
14596
|
-
* @param arg - ORM instance or a queryable instance (such as db.someTable).
|
|
14597
|
-
*/
|
|
14598
|
-
start(arg) {
|
|
14599
|
-
const db = argToDb(arg);
|
|
14600
|
-
const { asyncStorage } = db.internal;
|
|
14601
|
-
const { getStore } = asyncStorage;
|
|
14602
|
-
const { adapter } = db.baseQuery.q;
|
|
14603
|
-
const data = { adapter: {
|
|
14604
|
-
query: adapter.query,
|
|
14605
|
-
arrays: adapter.arrays,
|
|
14606
|
-
transaction: adapter.transaction
|
|
14607
|
-
} };
|
|
14608
|
-
(db.internal[trxForTest] ??= []).push(data);
|
|
14609
|
-
return new Promise((resolve) => {
|
|
14610
|
-
data.promise = db.transaction(() => {
|
|
14611
|
-
resolve();
|
|
14612
|
-
return new Promise((_, rej) => {
|
|
14613
|
-
const state = asyncStorage.getStore();
|
|
14614
|
-
db.internal.asyncStorage.getStore = () => state;
|
|
14615
|
-
const t = state?.transactionAdapter;
|
|
14616
|
-
if (t) {
|
|
14617
|
-
adapter.query = t.query.bind(t);
|
|
14618
|
-
adapter.arrays = t.arrays.bind(t);
|
|
14619
|
-
adapter.transaction = t.transaction.bind(t);
|
|
14620
|
-
state.testTransactionCount = state.testTransactionCount ? state.testTransactionCount + 1 : 1;
|
|
14621
|
-
}
|
|
14622
|
-
data.reject = rej;
|
|
14623
|
-
});
|
|
14624
|
-
}).catch((err) => {
|
|
14625
|
-
if (!(err instanceof Rollback)) throw err;
|
|
14626
|
-
}).finally(() => {
|
|
14627
|
-
const state = db.internal.asyncStorage.getStore();
|
|
14628
|
-
if (state?.testTransactionCount) state.testTransactionCount--;
|
|
14629
|
-
db.internal.asyncStorage.getStore = getStore;
|
|
14630
|
-
});
|
|
14631
|
-
});
|
|
14632
|
-
},
|
|
14633
|
-
/**
|
|
14634
|
-
* Rollback a test transaction.
|
|
14635
|
-
*
|
|
14636
|
-
* @param arg - the same ORM or query argument passed into the `testTransaction.start`.
|
|
14637
|
-
*/
|
|
14638
|
-
rollback(arg) {
|
|
14639
|
-
const db = argToDb(arg);
|
|
14640
|
-
const data = db.internal[trxForTest];
|
|
14641
|
-
const last = data?.pop();
|
|
14642
|
-
if (!last) return;
|
|
14643
|
-
if (!data?.length) Object.assign(db.baseQuery.q.adapter, last.adapter);
|
|
14644
|
-
last.reject?.(new Rollback());
|
|
14645
|
-
return last.promise;
|
|
14646
|
-
},
|
|
14647
|
-
/**
|
|
14648
|
-
* Will roll back the current `testTransaction` (won't have any effect if it was rolled back already),
|
|
14649
|
-
* and if there's no nested test transactions left, it will close the db connection.
|
|
14650
|
-
*
|
|
14651
|
-
* @param arg - the same ORM or query argument passed into the `testTransaction.start`.
|
|
14652
|
-
*/
|
|
14653
|
-
async close(arg) {
|
|
14654
|
-
const db = argToDb(arg);
|
|
14655
|
-
await this.rollback(db);
|
|
14656
|
-
if (db.internal[trxForTest]?.length === 0) return db.q.adapter.close();
|
|
14657
|
-
}
|
|
14658
|
-
};
|
|
14659
14669
|
exports.AdapterClass = AdapterClass;
|
|
14660
14670
|
exports.ArrayColumn = ArrayColumn;
|
|
14661
14671
|
exports.BigIntColumn = BigIntColumn;
|
|
@@ -14721,6 +14731,7 @@ exports.TsQueryColumn = TsQueryColumn;
|
|
|
14721
14731
|
exports.TsVectorColumn = TsVectorColumn;
|
|
14722
14732
|
exports.UUIDColumn = UUIDColumn;
|
|
14723
14733
|
exports.UnknownColumn = UnknownColumn;
|
|
14734
|
+
exports.ValExpression = ValExpression;
|
|
14724
14735
|
exports.VarCharColumn = VarCharColumn;
|
|
14725
14736
|
exports.VirtualColumn = VirtualColumn;
|
|
14726
14737
|
exports.XMLColumn = XMLColumn;
|